...

Informações de Hospedagem


IDE da planilha: 1b7v0IKeSUHxs5vgJF-aQs57_c6mkCN5OgIOTib5yBO4
Link do google app Script: https://script.google.com/macros/s/AKfycbx_ZJzkRx4gr8jSr-8hEW9zGrmcfDhoqJ1mOPYElAvYVdLtf_NAsQachQsm8B1J3SAB/exec

 

 

Código de estudo.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gerenciamento de Projetos</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f0f0f0;
            margin: 0;
            padding: 20px;
        }

        #project-container {
            max-width: 1200px;
            margin: auto;
            background: #fff;
            padding: 20px;
            box-shadow: 0 0 10px rgba(0,0,0,0.1);
        }

        #new-project-form {
            display: flex;
            margin-bottom: 20px;
        }

        #project-name {
            flex: 1;
            padding: 10px;
            margin-right: 10px;
        }

        button {
            padding: 10px;
        }

        .project {
            margin-bottom: 20px;
            padding: 10px;
            border: 1px solid #ccc;
        }

        .project h2 {
            background: #007BFF;
            color: white;
            padding: 10px;
            margin: 0;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }

        .project h2 input {
            font-size: 1em;
            margin-left: 10px;
        }

        .project h2 .edit-project-name {
            background: none;
            border: none;
            color: white;
            cursor: pointer;
        }

        .week {
            display: flex;
            flex-wrap: wrap;
            gap: 10px;
        }

        .day {
            padding: 10px;
            background: #f9f9f9;
            border: 1px solid #ccc;
            min-height: 100px;
            display: flex;
            flex-direction: column;
            resize: both;
            overflow: auto;
        }

        .day h3 {
            background: #17a2b8;
            color: white;
            padding: 10px;
            margin: 0 0 10px 0;
            text-align: center;
            position: relative;
            cursor: move; /* Muda o cursor ao mover a caixa */
        }

        .day h3 input {
            font-size: 1em;
            text-align: center;
            width: 100%;
            border: none;
            background: transparent;
            color: white;
        }

        .remove-day-button {
            position: absolute;
            top: 10px;
            right: 10px;
            background: #dc3545;
            color: white;
            border: none;
            padding: 2px 5px;
            cursor: pointer;
        }

        .task-list {
            list-style: none;
            padding: 0;
            margin: 0;
            border: 1px solid #ccc;
            border-top: none;
            min-height: 50px;
            flex-grow: 1;
        }

        .task-list li {
            display: flex;
            align-items: center;
            padding: 10px;
            background: #fff;
            border-top: 1px solid #ccc;
            cursor: grab;
            flex-wrap: wrap; /* Permite que os itens dentro da tarefa possam se ajustar */
        }

        .task-list li input[type="checkbox"] {
            margin-right: 10px;
        }

        .task-list li .task-details {
            flex: 1 1 100%;
        }

        .task-list li input[type="text"], .task-list li input[type="time"], .task-list li input[type="date"], .task-list li input[type="number"], .task-list li textarea {
            margin-left: 10px;
            flex: 1 1 calc(50% - 20px); /* Ajusta a largura para metade do espaço disponível */
        }

        .task-list li .edit-button, .task-list li .delete-button, .task-list li .duplicate-button {
            margin-left: 10px;
            background-color: #f0f0f0;
            border: none;
            cursor: pointer;
        }

        .task-list li .blocking-checkbox {
            margin-left: 10px;
        }

        .new-task-form {
            display: flex;
            margin: 10px 0;
        }

        .task-activity {
            flex: 1;
            padding: 10px;
            margin-right: 10px;
        }

        .completed {
            text-decoration: line-through;
            color: gray;
        }

        .filter-container {
            margin-bottom: 20px;
        }

        .add-day-button {
            padding: 10px;
            background-color: #17a2b8;
            color: white;
            border: none;
            cursor: pointer;
            margin-top: 10px;
        }

        #consolidated-tasks {
            margin-top: 20px;
        }

        #consolidated-tasks h2 {
            background: #007BFF;
            color: white;
            padding: 10px;
            margin: 0 0 10px 0;
        }

        #consolidated-tasks .project-title {
            background: #007BFF;
            color: white;
            padding: 5px 10px;
            margin: 10px 0 0;
            font-size: 1.2em;
        }

        #consolidated-tasks .day-title {
            background: #17a2b8;
            color: white;
            padding: 5px 10px;
            margin: 10px 0 0;
        }

        #consolidated-tasks ul {
            list-style: none;
            padding: 0;
        }

        #consolidated-tasks li {
            padding: 5px 0;
            border-bottom: 1px solid #ccc;
        }

        #independent-days {
            margin-top: 20px;
        }

        #independent-days h2 {
            background: #17a2b8;
            color: white;
            padding: 10px;
            margin: 0 0 10px 0;
            text-align: center;
        }

        #independent-days .day-container {
            display: flex;
            flex-wrap: wrap;
            gap: 10px;
        }

        .calendar-month {
            margin: 20px 0;
        }

        .calendar-title {
            background: #007BFF;
            color: white;
            padding: 10px;
            text-align: center;
        }

        .calendar-grid {
            display: flex;
            flex-wrap: wrap;
            gap: 5px;
        }

        .calendar-day {
            width: calc(14.28% - 10px);
            padding: 10px;
            background: #f9f9f9;
            border: 1px solid #ccc;
            position: relative;
        }

        .calendar-day .events {
            margin-top: 10px;
        }

        .calendar-day.highlight {
            background: orange;
        }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
</head>
<body>
    <div id="project-container">
        <h1>Gerenciamento de Projetos</h1>
        <div id="new-project-form">
            <input type="text" id="project-name" placeholder="Nome do Projeto">
            <button id="add-project-btn">Adicionar Projeto</button>
        </div>
        <div id="filter-container" class="filter-container">
            <label for="filter">Filtrar atividades: </label>
            <select id="filter" onchange="filterTasks()">
                <option value="all">Todas</option>
                <option value="role">Por cargo</option>
                <option value="assignee">Por pessoa atribuída</option>
                <option value="time">Por horário</option>
                <option value="day">Por dia</option>
                <option value="cost">Por custo</option>
                <option value="priority">Por prioridade</option>
                <option value="blocking">Por bloqueante</option>
                <option value="agenda-name">Por Nome da Agenda</option>
                <option value="status">Por Status</option>
            </select>
            <input type="text" id="filter-role" placeholder="Digite o cargo" oninput="filterTasks()" style="display: none;">
            <input type="text" id="filter-assignee" placeholder="Digite o nome da pessoa" oninput="filterTasks()" style="display: none;">
            <input type="time" id="filter-time" placeholder="Digite o horário" oninput="filterTasks()" style="display: none;">
            <input type="date" id="filter-day" placeholder="Digite o dia" oninput="filterTasks()" style="display: none;">
            <input type="number" id="filter-cost" placeholder="Digite o custo" oninput="filterTasks()" style="display: none;">
            <input type="text" id="filter-priority" placeholder="Digite a prioridade" oninput="filterTasks()" style="display: none;">
            <select id="filter-blocking" onchange="filterTasks()" style="display: none;">
                <option value="">Todas</option>
                <option value="true">Bloqueantes</option>
                <option value="false">Não bloqueantes</option>
            </select>
            <input type="text" id="filter-agenda-name" placeholder="Digite o Nome da Agenda" oninput="filterTasks()" style="display: none;">
            <input type="text" id="filter-status" placeholder="Digite o Status" oninput="filterTasks()" style="display: none;">
        </div>
        <div id="projects">
            <!-- Projetos e subprojetos serão adicionados aqui -->
        </div>
        <div id="consolidated-tasks">
            <h2>Atividades Consolidadas</h2>
            <div id="consolidated-task-list">
                <!-- Lista consolidada de atividades será adicionada aqui -->
            </div>
        </div>
        <div id="independent-days">
            <h2>Dias Independentes</h2>
            <div class="day-container">
                <!-- Dias independentes serão adicionados aqui -->
            </div>
        </div>
        <div id="calendar-container">
            <!-- Calendário será adicionado aqui -->
        </div>
    </div>
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            document.getElementById('add-project-btn').addEventListener('click', addProject);

            function addProject() {
                const projectName = document.getElementById('project-name').value;
                if (projectName === '') return;

                const project = document.createElement('div');
                project.classList.add('project');

                const projectHeader = document.createElement('h2');
                const projectNameInput = document.createElement('input');
                projectNameInput.type = 'text';
                projectNameInput.value = projectName;
                projectNameInput.readOnly = true;

                const projectCost = document.createElement('span');
                projectCost.classList.add('project-cost');
                projectCost.textContent = 'Custo Total: R$0.00';

                const editProjectButton = document.createElement('button');
                editProjectButton.textContent = 'Editar';
                editProjectButton.classList.add('edit-project-name');
                editProjectButton.onclick = () => {
                    if (projectNameInput.readOnly) {
                        projectNameInput.readOnly = false;
                        projectNameInput.focus();
                        editProjectButton.textContent = 'Salvar';
                    } else {
                        projectNameInput.readOnly = true;
                        editProjectButton.textContent = 'Editar';
                        updateConsolidatedTasks();
                    }
                };

                const duplicateProjectButton = document.createElement('button');
                duplicateProjectButton.textContent = 'Duplicar Projeto';
                duplicateProjectButton.onclick = () => {
                    duplicateProject(project);
                };

                projectNameInput.oninput = updateConsolidatedTasks;

                projectHeader.appendChild(projectNameInput);
                projectHeader.appendChild(editProjectButton);
                projectHeader.appendChild(projectCost);
                projectHeader.appendChild(duplicateProjectButton);

                const week = document.createElement('div');
                week.classList.add('week');

                const days = ['Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado', 'Domingo'];

                days.forEach(day => {
                    addDay(week, day);
                });

                project.appendChild(projectHeader);
                project.appendChild(week);

                const newTaskForm = document.createElement('div');
                newTaskForm.classList.add('new-task-form');

                const taskActivityInput = document.createElement('input');
                taskActivityInput.type = 'text';
                taskActivityInput.classList.add('task-activity');
                taskActivityInput.placeholder = 'Atividade';

                const addButton = document.createElement('button');
                addButton.textContent = 'Adicionar Atividade';
                addButton.onclick = function () {
                    addTask(this);
                };

                newTaskForm.appendChild(taskActivityInput);
                newTaskForm.appendChild(addButton);

                project.appendChild(newTaskForm);

                const addDayButton = document.createElement('button');
                addDayButton.textContent = 'Adicionar Dia';
                addDayButton.classList.add('add-day-button');
                addDayButton.onclick = function () {
                    const newDayName = prompt('Nome do novo dia');
                    if (newDayName) {
                        addDay(week, newDayName);
                    }
                };

                project.appendChild(addDayButton);

                document.getElementById('projects').appendChild(project);
                document.getElementById('project-name').value = '';

                updateConsolidatedTasks();

                new Sortable(week, {
                    group: 'shared', // Permite arrastar entre todos os projetos
                    animation: 150,
                    ghostClass: 'sortable-ghost',
                    onEnd: function () {
                        updateConsolidatedTasks();
                    }
                });
            }

            function addDay(week, dayName) {
                const dayContainer = document.createElement('div');
                dayContainer.classList.add('day');

                const dayHeader = document.createElement('h3');
                const dayInput = document.createElement('input');
                dayInput.type = 'text';
                dayInput.value = dayName;
                dayInput.readOnly = true;
                dayInput.onblur = function () {
                    dayInput.readOnly = true;
                    updateConsolidatedTasks();
                };
                dayInput.onclick = function () {
                    dayInput.readOnly = false;
                    dayInput.focus();
                };

                const removeDayButton = document.createElement('button');
                removeDayButton.textContent = 'X';
                removeDayButton.classList.add('remove-day-button');
                removeDayButton.onclick = function () {
                    removeDay(dayContainer);
                };

                dayHeader.appendChild(dayInput);
                dayHeader.appendChild(removeDayButton);

                const taskList = document.createElement('ul');
                taskList.classList.add('task-list');

                dayContainer.appendChild(dayHeader);
                dayContainer.appendChild(taskList);

                new Sortable(taskList, {
                    group: 'shared', // Permite arrastar entre todos os projetos
                    animation: 150,
                    ghostClass: 'sortable-ghost',
                    onEnd: function () {
                        updateConsolidatedTasks();
                    }
                });

                week.appendChild(dayContainer);

                new Sortable(dayContainer, {
                    group: 'days', // Permite arrastar dias dentro de outros dias
                    animation: 150,
                    ghostClass: 'sortable-ghost',
                    onAdd: function (evt) {
                        if (evt.from !== evt.to) {
                            removeDay(evt.item);
                        }
                    },
                    onEnd: function () {
                        updateConsolidatedTasks();
                    }
                });

                updateConsolidatedTasks();
            }

            function addTask(button) {
                const taskActivityInput = button.previousElementSibling;
                const taskActivity = taskActivityInput.value;
                if (taskActivity === '') return;

                const taskItem = document.createElement('li');
                
                const checkbox = document.createElement('input');
                checkbox.type = 'checkbox';
                checkbox.onchange = (e) => {
                    if (e.target.checked) {
                        taskItem.classList.add('completed');
                    } else {
                        taskItem.classList.remove('completed');
                    }
                    updateConsolidatedTasks();
                };

                const taskDetails = document.createElement('span');
                taskDetails.classList.add('task-details');
                taskDetails.textContent = taskActivity;

                const roleInput = document.createElement('input');
                roleInput.type = 'text';
                roleInput.placeholder = 'Cargo';
                roleInput.oninput = updateConsolidatedTasks;

                const timeInput = document.createElement('input');
                timeInput.type = 'time';
                timeInput.oninput = updateConsolidatedTasks;

                const dateInput = document.createElement('input');
                dateInput.type = 'date';
                dateInput.oninput = updateConsolidatedTasks;

                const costInput = document.createElement('input');
                costInput.type = 'number';
                costInput.placeholder = 'Custo';
                costInput.oninput = () => {
                    updateConsolidatedTasks();
                    updateCostFilters();
                };

                const assigneeInput = document.createElement('input');
                assigneeInput.type = 'text';
                assigneeInput.placeholder = 'Atribuir a';
                assigneeInput.oninput = updateConsolidatedTasks;

                const priorityInput = document.createElement('input');
                priorityInput.type = 'text';
                priorityInput.placeholder = 'Prioridade';
                priorityInput.oninput = updateConsolidatedTasks;

                const agendaNameInput = document.createElement('input');
                agendaNameInput.type = 'text';
                agendaNameInput.placeholder = 'Nome da Agenda';
                agendaNameInput.oninput = updateConsolidatedTasks;

                const statusInput = document.createElement('input');
                statusInput.type = 'text';
                statusInput.placeholder = 'Status';
                statusInput.oninput = updateConsolidatedTasks;

                const descriptionTextarea = document.createElement('textarea');
                descriptionTextarea.placeholder = 'Descrição';
                descriptionTextarea.rows = 2;
                descriptionTextarea.oninput = updateConsolidatedTasks;

                const blockingCheckbox = document.createElement('input');
                blockingCheckbox.type = 'checkbox';
                blockingCheckbox.classList.add('blocking-checkbox');
                blockingCheckbox.onchange = updateConsolidatedTasks;

                const blockingLabel = document.createElement('label');
                blockingLabel.textContent = 'Bloqueante';
                blockingLabel.style.marginLeft = '10px';

                const editButton = document.createElement('button');
                editButton.textContent = 'Editar';
                editButton.classList.add('edit-button');
                editButton.onclick = () => {
                    const newTaskActivity = prompt('Editar atividade', taskActivity);
                    if (newTaskActivity) {
                        taskDetails.textContent = newTaskActivity;
                        updateConsolidatedTasks();
                    }
                };

                const deleteButton = document.createElement('button');
                deleteButton.textContent = 'Excluir';
                deleteButton.classList.add('delete-button');
                deleteButton.onclick = () => {
                    taskItem.remove();
                    updateConsolidatedTasks();
                };

                const duplicateButton = document.createElement('button');
                duplicateButton.textContent = 'Duplicar';
                duplicateButton.classList.add('duplicate-button');
                duplicateButton.onclick = () => {
                    duplicateTask(taskItem);
                };

                taskItem.appendChild(checkbox);
                taskItem.appendChild(taskDetails);
                taskItem.appendChild(roleInput);
                taskItem.appendChild(timeInput);
                taskItem.appendChild(dateInput);
                taskItem.appendChild(costInput);
                taskItem.appendChild(assigneeInput);
                taskItem.appendChild(priorityInput);
                taskItem.appendChild(agendaNameInput);
                taskItem.appendChild(statusInput);
                taskItem.appendChild(descriptionTextarea);
                taskItem.appendChild(blockingCheckbox);
                taskItem.appendChild(blockingLabel);
                taskItem.appendChild(editButton);
                taskItem.appendChild(deleteButton);
                taskItem.appendChild(duplicateButton);
                taskItem.setAttribute('draggable', true);

                const taskList = button.closest('.new-task-form').previousElementSibling.querySelector('.task-list');
                taskList.appendChild(taskItem);
                taskActivityInput.value = '';

                updateConsolidatedTasks();
            }

            function duplicateTask(taskItem) {
                const newTaskItem = taskItem.cloneNode(true);
                const taskList = taskItem.closest('.task-list');
                taskList.appendChild(newTaskItem);

                const inputs = newTaskItem.querySelectorAll('input, textarea');
                inputs.forEach(input => {
                    if (input.type === 'checkbox') {
                        input.onchange = () => {
                            if (input.checked) {
                                newTaskItem.classList.add('completed');
                            } else {
                                newTaskItem.classList.remove('completed');
                            }
                            updateConsolidatedTasks();
                        };
                    } else {
                        input.oninput = updateConsolidatedTasks;
                    }
                });

                newTaskItem.querySelector('.edit-button').onclick = () => {
                    const newTaskActivity = prompt('Editar atividade', newTaskItem.querySelector('.task-details').textContent);
                    if (newTaskActivity) {
                        newTaskItem.querySelector('.task-details').textContent = newTaskActivity;
                        updateConsolidatedTasks();
                    }
                };

                newTaskItem.querySelector('.delete-button').onclick = () => {
                    newTaskItem.remove();
                    updateConsolidatedTasks();
                };

                newTaskItem.querySelector('.duplicate-button').onclick = () => {
                    duplicateTask(newTaskItem);
                };

                updateConsolidatedTasks();
            }

            function duplicateProject(project) {
                const newProject = project.cloneNode(true);
                const projectsContainer = document.getElementById('projects');
                projectsContainer.appendChild(newProject);

                newProject.querySelectorAll('.edit-project-name').forEach(editButton => {
                    editButton.onclick = () => {
                        const projectNameInput = editButton.previousElementSibling;
                        if (projectNameInput.readOnly) {
                            projectNameInput.readOnly = false;
                            projectNameInput.focus();
                            editButton.textContent = 'Salvar';
                        } else {
                            projectNameInput.readOnly = true;
                            editButton.textContent = 'Editar';
                            updateConsolidatedTasks();
                        }
                    };
                });

                newProject.querySelectorAll('.duplicate-button').forEach(duplicateButton => {
                    duplicateButton.onclick = () => {
                        duplicateTask(duplicateButton.closest('li'));
                    };
                });

                newProject.querySelectorAll('.delete-button').forEach(deleteButton => {
                    deleteButton.onclick = () => {
                        deleteButton.closest('li').remove();
                        updateConsolidatedTasks();
                    };
                });

                newProject.querySelectorAll('input, textarea').forEach(input => {
                    if (input.type === 'checkbox') {
                        input.onchange = () => {
                            const taskItem = input.closest('li');
                            if (input.checked) {
                                taskItem.classList.add('completed');
                            } else {
                                taskItem.classList.remove('completed');
                            }
                            updateConsolidatedTasks();
                        };
                    } else {
                        input.oninput = updateConsolidatedTasks;
                    }
                });

                newProject.querySelectorAll('.add-day-button').forEach(button => {
                    button.onclick = function () {
                        const newDayName = prompt('Nome do novo dia');
                        if (newDayName) {
                            addDay(newProject.querySelector('.week'), newDayName);
                        }
                    };
                });

                newProject.querySelector('.new-task-form button').onclick = function () {
                    addTask(this);
                };

                new Sortable(newProject.querySelector('.week'), {
                    group: 'shared',
                    animation: 150,
                    ghostClass: 'sortable-ghost',
                    onEnd: function () {
                        updateConsolidatedTasks();
                    }
                });

                newProject.querySelectorAll('.task-list').forEach(taskList => {
                    new Sortable(taskList, {
                        group: 'shared',
                        animation: 150,
                        ghostClass: 'sortable-ghost',
                        onEnd: function () {
                            updateConsolidatedTasks();
                        }
                    });
                });

                updateConsolidatedTasks();
            }

            function removeDay(dayContainer) {
                const independentDaysContainer = document.querySelector('#independent-days .day-container');
                independentDaysContainer.appendChild(dayContainer);
                updateConsolidatedTasks();
            }

            function updateRoleFilters() {
                const filterRoleInput = document.getElementById('filter-role');
                const currentFilterValue = filterRoleInput.value.toLowerCase();
                const roles = Array.from(document.querySelectorAll('.task-list li input[type="text"][placeholder="Cargo"]')).map(input => input.value.toLowerCase()).filter(value => value !== '');
                const uniqueRoles = [...new Set(roles)];
                filterRoleInput.innerHTML = `<option value="">Por cargo</option>` + uniqueRoles.map(role => `<option value="${role}">${role.charAt(0).toUpperCase() + role.slice(1)}</option>`).join('');
                filterRoleInput.value = currentFilterValue;
            }

            function updateCostFilters() {
                const filterCostInput = document.getElementById('filter-cost');
                const costs = Array.from(document.querySelectorAll('.task-list li input[type="number"][placeholder="Custo"]')).map(input => parseFloat(input.value)).filter(value => !isNaN(value));
                const uniqueCosts = [...new Set(costs)];
                filterCostInput.innerHTML = `<option value="">Por custo</option>` + uniqueCosts.map(cost => `<option value="${cost}">${cost.toFixed(2)}</option>`).join('');
            }

            function updateAssigneeFilters() {
                const filterAssigneeInput = document.getElementById('filter-assignee');
                const currentFilterValue = filterAssigneeInput.value.toLowerCase();
                const assignees = Array.from(document.querySelectorAll('.task-list li input[placeholder="Atribuir a"]')).map(input => input.value.toLowerCase()).filter(value => value !== '');
                const uniqueAssignees = [...new Set(assignees)];
                filterAssigneeInput.innerHTML = `<option value="">Por pessoa atribuída</option>` + uniqueAssignees.map(assignee => `<option value="${assignee}">${assignee.charAt(0).toUpperCase() + assignee.slice(1)}</option>`).join('');
                filterAssigneeInput.value = currentFilterValue;
            }

            function updatePriorityFilters() {
                const filterPriorityInput = document.getElementById('filter-priority');
                const currentFilterValue = filterPriorityInput.value.toLowerCase();
                const priorities = Array.from(document.querySelectorAll('.task-list li input[placeholder="Prioridade"]')).map(input => input.value.toLowerCase()).filter(value => value !== '');
                const uniquePriorities = [...new Set(priorities)];
                filterPriorityInput.innerHTML = `<option value="">Por prioridade</option>` + uniquePriorities.map(priority => `<option value="${priority}">${priority.charAt(0).toUpperCase() + priority.slice(1)}</option>`).join('');
                filterPriorityInput.value = currentFilterValue;
            }

            function updateBlockingFilters() {
                const filterBlockingInput = document.getElementById('filter-blocking');
                const currentFilterValue = filterBlockingInput.value;
                filterBlockingInput.value = currentFilterValue;
            }

            function updateAgendaNameFilters() {
                const filterAgendaNameInput = document.getElementById('filter-agenda-name');
                const currentFilterValue = filterAgendaNameInput.value.toLowerCase();
                const agendaNames = Array.from(document.querySelectorAll('.task-list li input[placeholder="Nome da Agenda"]')).map(input => input.value.toLowerCase()).filter(value => value !== '');
                const uniqueAgendaNames = [...new Set(agendaNames)];
                filterAgendaNameInput.innerHTML = `<option value="">Por Nome da Agenda</option>` + uniqueAgendaNames.map(agendaName => `<option value="${agendaName}">${agendaName.charAt(0).toUpperCase() + agendaName.slice(1)}</option>`).join('');
                filterAgendaNameInput.value = currentFilterValue;
            }

            function updateStatusFilters() {
                const filterStatusInput = document.getElementById('filter-status');
                const currentFilterValue = filterStatusInput.value.toLowerCase();
                const statuses = Array.from(document.querySelectorAll('.task-list li input[placeholder="Status"]')).map(input => input.value.toLowerCase()).filter(value => value !== '');
                const uniqueStatuses = [...new Set(statuses)];
                filterStatusInput.innerHTML = `<option value="">Por Status</option>` + uniqueStatuses.map(status => `<option value="${status}">${status.charAt(0).toUpperCase() + status.slice(1)}</option>`).join('');
                filterStatusInput.value = currentFilterValue;
            }

            function updateConsolidatedTasks() {
                const consolidatedTaskList = document.getElementById('consolidated-task-list');
                consolidatedTaskList.innerHTML = '';

                const projects = document.querySelectorAll('.project');
                projects.forEach(project => {
                    const projectName = project.querySelector('h2 input').value;
                    const projectTitle = document.createElement('div');
                    projectTitle.classList.add('project-title');
                    projectTitle.textContent = projectName;
                    consolidatedTaskList.appendChild(projectTitle);

                    let totalCost = 0;

                    const days = project.querySelectorAll('.day');
                    days.forEach(day => {
                        const dayName = day.querySelector('h3 input').value;
                        const dayTitle = document.createElement('div');
                        dayTitle.classList.add('day-title');
                        dayTitle.textContent = dayName;
                        dayTitle.style.backgroundColor = '#17a2b8'; // Aplicar cor verde
                        consolidatedTaskList.appendChild(dayTitle);

                        const tasks = day.querySelectorAll('.task-list li');
                        tasks.forEach(task => {
                            const taskDetails = task.querySelector('.task-details').textContent;
                            const role = task.querySelector('input[type="text"]').value;
                            const time = task.querySelector('input[type="time"]').value;
                            const date = task.querySelector('input[type="date"]').value;
                            const cost = parseFloat(task.querySelector('input[type="number"]').value) || 0;
                            const assignee = task.querySelector('input[placeholder="Atribuir a"]').value;
                            const priority = task.querySelector('input[placeholder="Prioridade"]').value;
                            const agendaName = task.querySelector('input[placeholder="Nome da Agenda"]').value;
                            const status = task.querySelector('input[placeholder="Status"]').value;
                            const description = task.querySelector('textarea').value;
                            const isBlocking = task.querySelector('.blocking-checkbox').checked;
                            totalCost += cost;
                            const taskItem = document.createElement('li');
                            taskItem.textContent = `${taskDetails} - Data: ${date} - Hora: ${time} - Cargo: ${role} - Prioridade: ${priority.charAt(0).toUpperCase() + priority.slice(1)} - Custo: R$${cost.toFixed(2)} - Atribuído a: ${assignee} - Nome da Agenda: ${agendaName} - Status: ${status} - Descrição: ${description} - Bloqueante: ${isBlocking ? 'Sim' : 'Não'}`;
                            consolidatedTaskList.appendChild(taskItem);
                        });
                    });

                    project.querySelector('.project-cost').textContent = `Custo Total: R$${totalCost.toFixed(2)}`;
                });

                const independentDays = document.querySelectorAll('#independent-days .day');
                if (independentDays.length > 0) {
                    const independentDaysTitle = document.createElement('div');
                    independentDaysTitle.classList.add('project-title');
                    independentDaysTitle.textContent = 'Dias Independentes';
                    consolidatedTaskList.appendChild(independentDaysTitle);

                    independentDays.forEach(day => {
                        const dayName = day.querySelector('h3 input').value;
                        const dayTitle = document.createElement('div');
                        dayTitle.classList.add('day-title');
                        dayTitle.textContent = dayName;
                        dayTitle.style.backgroundColor = '#17a2b8'; // Aplicar cor verde
                        consolidatedTaskList.appendChild(dayTitle);

                        const tasks = day.querySelectorAll('.task-list li');
                        tasks.forEach(task => {
                            const taskDetails = task.querySelector('.task-details').textContent;
                            const role = task.querySelector('input[type="text"]').value;
                            const time = task.querySelector('input[type="time"]').value;
                            const date = task.querySelector('input[type="date"]').value;
                            const cost = parseFloat(task.querySelector('input[type="number"]').value) || 0;
                            const assignee = task.querySelector('input[placeholder="Atribuir a"]').value;
                            const priority = task.querySelector('input[placeholder="Prioridade"]').value;
                            const agendaName = task.querySelector('input[placeholder="Nome da Agenda"]').value;
                            const status = task.querySelector('input[placeholder="Status"]').value;
                            const description = task.querySelector('textarea').value;
                            const isBlocking = task.querySelector('.blocking-checkbox').checked;
                            totalCost += cost;
                            const taskItem = document.createElement('li');
                            taskItem.textContent = `${taskDetails} - Data: ${date} - Hora: ${time} - Cargo: ${role} - Prioridade: ${priority.charAt(0).toUpperCase() + priority.slice(1)} - Custo: R$${cost.toFixed(2)} - Atribuído a: ${assignee} - Nome da Agenda: ${agendaName} - Status: ${status} - Descrição: ${description} - Bloqueante: ${isBlocking ? 'Sim' : 'Não'}`;
                            consolidatedTaskList.appendChild(taskItem);
                        });
                    });
                }

                filterConsolidatedTasks();
                updateCalendar();
            }

            function filterConsolidatedTasks() {
                const filterValue = document.getElementById('filter').value;
                const filterRoleValue = document.getElementById('filter-role').value.toLowerCase();
                const filterAssigneeValue = document.getElementById('filter-assignee').value.toLowerCase();
                const filterTimeValue = document.getElementById('filter-time').value;
                const filterDayValue = document.getElementById('filter-day').value;
                const filterCostValue = parseFloat(document.getElementById('filter-cost').value) || 0;
                const filterPriorityValue = document.getElementById('filter-priority').value.toLowerCase();
                const filterBlockingValue = document.getElementById('filter-blocking').value;
                const filterAgendaNameValue = document.getElementById('filter-agenda-name').value.toLowerCase();
                const filterStatusValue = document.getElementById('filter-status').value.toLowerCase();
                const consolidatedTasks = document.querySelectorAll('#consolidated-task-list li');

                consolidatedTasks.forEach(task => {
                    let shouldShow = true;
                    const taskText = task.textContent.toLowerCase();
                    const isBlocking = taskText.includes('bloqueante: sim');

                    if (filterValue === 'role' && !taskText.includes(filterRoleValue)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'assignee' && !taskText.includes(filterAssigneeValue)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'time' && !taskText.includes(filterTimeValue)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'day' && !taskText.includes(filterDayValue)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'cost' && !taskText.includes(`custo: r$${filterCostValue.toFixed(2)}`)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'priority' && !taskText.includes(filterPriorityValue)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'blocking') {
                        if (filterBlockingValue === 'true' && !isBlocking) {
                            shouldShow = false;
                        } else if (filterBlockingValue === 'false' && isBlocking) {
                            shouldShow = false;
                        }
                    }

                    if (filterValue === 'agenda-name' && !taskText.includes(filterAgendaNameValue)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'status' && !taskText.includes(filterStatusValue)) {
                        shouldShow = false;
                    }

                    task.style.display = shouldShow ? 'list-item' : 'none';
                });
            }

            window.filterTasks = function() {
                const filterValue = document.getElementById('filter').value;
                const filterRoleInput = document.getElementById('filter-role');
                const filterAssigneeInput = document.getElementById('filter-assignee');
                const filterTimeInput = document.getElementById('filter-time');
                const filterDayInput = document.getElementById('filter-day');
                const filterCostInput = document.getElementById('filter-cost');
                const filterPriorityInput = document.getElementById('filter-priority');
                const filterBlockingInput = document.getElementById('filter-blocking');
                const filterAgendaNameInput = document.getElementById('filter-agenda-name');
                const filterStatusInput = document.getElementById('filter-status');
                const filterRoleValue = filterRoleInput.value.toLowerCase();
                const filterAssigneeValue = filterAssigneeInput.value.toLowerCase();
                const filterTimeValue = filterTimeInput.value;
                const filterDayValue = filterDayInput.value;
                const filterCostValue = filterCostInput.value;
                const filterPriorityValue = filterPriorityInput.value.toLowerCase();
                const filterBlockingValue = filterBlockingInput.value;
                const filterAgendaNameValue = filterAgendaNameInput.value.toLowerCase();
                const filterStatusValue = filterStatusInput.value.toLowerCase();

                filterRoleInput.style.display = filterValue === 'role' ? 'inline-block' : 'none';
                filterAssigneeInput.style.display = filterValue === 'assignee' ? 'inline-block' : 'none';
                filterTimeInput.style.display = filterValue === 'time' ? 'inline-block' : 'none';
                filterDayInput.style.display = filterValue === 'day' ? 'inline-block' : 'none';
                filterCostInput.style.display = filterValue === 'cost' ? 'inline-block' : 'none';
                filterPriorityInput.style.display = filterValue === 'priority' ? 'inline-block' : 'none';
                filterBlockingInput.style.display = filterValue === 'blocking' ? 'inline-block' : 'none';
                filterAgendaNameInput.style.display = filterValue === 'agenda-name' ? 'inline-block' : 'none';
                filterStatusInput.style.display = filterValue === 'status' ? 'inline-block' : 'none';

                const tasks = document.querySelectorAll('.task-list li');

                tasks.forEach(task => {
                    const role = task.querySelector('input[type="text"]').value.toLowerCase();
                    const assignee = task.querySelector('input[placeholder="Atribuir a"]').value.toLowerCase();
                    const time = task.querySelector('input[type="time"]').value;
                    const date = task.querySelector('input[type="date"]').value;
                    const cost = parseFloat(task.querySelector('input[type="number"]').value) || 0;
                    const priority = task.querySelector('input[placeholder="Prioridade"]').value.toLowerCase();
                    const agendaName = task.querySelector('input[placeholder="Nome da Agenda"]').value.toLowerCase();
                    const status = task.querySelector('input[placeholder="Status"]').value.toLowerCase();
                    const description = task.querySelector('textarea').value.toLowerCase();
                    const isBlocking = task.querySelector('.blocking-checkbox').checked;
                    let shouldShow = true;

                    if (filterValue === 'role' && role !== filterRoleValue) {
                        shouldShow = false;
                    }

                    if (filterValue === 'assignee' && assignee !== filterAssigneeValue) {
                        shouldShow = false;
                    }

                    if (filterValue === 'time' && time !== filterTimeValue) {
                        shouldShow = false;
                    }

                    if (filterValue === 'day' && date !== filterDayValue) {
                        shouldShow = false;
                    }

                    if (filterValue === 'cost' && cost !== parseFloat(filterCostValue)) {
                        shouldShow = false;
                    }

                    if (filterValue === 'priority' && priority !== filterPriorityValue) {
                        shouldShow = false;
                    }

                    if (filterValue === 'blocking') {
                        if (filterBlockingValue === 'true' && !isBlocking) {
                            shouldShow = false;
                        } else if (filterBlockingValue === 'false' && isBlocking) {
                            shouldShow = false;
                        }
                    }

                    if (filterValue === 'agenda-name' && agendaName !== filterAgendaNameValue) {
                        shouldShow = false;
                    }

                    if (filterValue === 'status' && status !== filterStatusValue) {
                        shouldShow = false;
                    }

                    task.style.display = shouldShow ? 'flex' : 'none';
                });

                filterConsolidatedTasks();
            }

            function updateCalendar() {
                const calendarContainer = document.getElementById('calendar-container');
                calendarContainer.innerHTML = '';

                const today = new Date();
                const startMonth = today.getMonth();
                const startYear = today.getFullYear();

                for (let i = 0; i < 12; i++) {
                    const month = (startMonth + i) % 12;
                    const year = startYear + Math.floor((startMonth + i) / 12);

                    const calendarMonth = document.createElement('div');
                    calendarMonth.classList.add('calendar-month');

                    const calendarTitle = document.createElement('div');
                    calendarTitle.classList.add('calendar-title');
                    calendarTitle.textContent = `${new Date(year, month).toLocaleString('default', { month: 'long' })} ${year}`;

                    const calendarGrid = document.createElement('div');
                    calendarGrid.classList.add('calendar-grid');

                    const daysInMonth = new Date(year, month + 1, 0).getDate();

                    for (let day = 1; day <= daysInMonth; day++) {
                        const calendarDay = document.createElement('div');
                        calendarDay.classList.add('calendar-day');
                        calendarDay.dataset.date = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
                        calendarDay.textContent = day;

                        const events = document.createElement('div');
                        events.classList.add('events');
                        calendarDay.appendChild(events);

                        calendarGrid.appendChild(calendarDay);
                    }

                    calendarMonth.appendChild(calendarTitle);
                    calendarMonth.appendChild(calendarGrid);
                    calendarContainer.appendChild(calendarMonth);
                }

                // Adiciona eventos ao calendário
                const tasks = document.querySelectorAll('.task-list li');
                tasks.forEach(task => {
                    const taskDetails = task.querySelector('.task-details').textContent;
                    const date = task.querySelector('input[type="date"]').value;
                    const time = task.querySelector('input[type="time"]').value;

                    const calendarDay = document.querySelector(`.calendar-day[data-date="${date}"]`);
                    if (calendarDay) {
                        calendarDay.classList.add('highlight');
                        const event = document.createElement('div');
                        event.textContent = `${taskDetails} às ${time}`;
                        calendarDay.querySelector('.events').appendChild(event);
                    }
                });
            }
        });
    </script>
</body>
</html>

Como chamar tudo nos comandos 

Projeto! (AZUL PRINCIPAL)


Dia! (TITULO VERDE)

Tarefa! (A atividade que insiro dentro do dia)

Agenda!

Funcionalidades atuais 

  •  
  •  
  • Poder colocar números nas caixinhas verdes e nos projetos para poder filtrar por odem
  • Poder colocar números nas atividades pra filtrar 
  • Poder organizar atividades em relatórios em ordem do número maior para o menor, para organizar a ordem do projeto.
  •  
  • Incluir novos campos nas atividades e automaticamente adicionar novos filtros.
  • Permitir remover um dia e colocá-lo de volta ao seu espaço original, 
  • Replicar a atividade na agenda e destacar o dia na agenda: A tarefa quando eu coloco o dia lá em cima é replicada na agenda lá em baixo e nem fica laranja a agenda la emabaixo.
  • A tarefa após ser inserira  tem a opção de Incluir  um novos campo,  que automaticamente inclue novos filtros lá em cima. 

 

 



Este código de gerenciamento de projetos possui diversas funcionalidades para facilitar a organização e acompanhamento de tarefas. Aqui está uma lista das funcionalidades presentes:

  1. Adicionar Novo Projeto:

    • Formulário para adicionar um novo projeto com nome.
  2. Editar Nome do Projeto:

    • Permite editar o nome do projeto clicando no botão "Editar".
  3. Duplicar Projeto:

    • Botão para duplicar todo o projeto, incluindo todos os dias e tarefas.
  4. Custo Total do Projeto:

    • Exibe o custo total do projeto.
  5. Adicionar Dias da Semana ao Projeto:

    • Automaticamente adiciona os dias da semana ao criar um novo projeto.
  6. Adicionar Novo Dia:

    • Botão para adicionar um novo dia personalizado ao projeto.
  7. Remover Dia:

    • Botão para remover um dia específico do projeto.
  8. Adicionar Nova Tarefa:

    • Formulário para adicionar novas tarefas dentro de um dia específico.
  9. Marcar Tarefa como Completa:

    • Checkbox para marcar a tarefa como completa, o que risca o texto da tarefa.
  10. Editar Tarefa:

    • Botão para editar o texto da tarefa.
  11.  

  12. Duplicar Tarefa:

    • Botão para duplicar uma tarefa dentro do mesmo dia.
  13. Detalhes da Tarefa:

    • Cada tarefa pode incluir detalhes como cargo, horário, data, custo, pessoa atribuída, prioridade, nome da agenda, status e descrição.
  14. Filtragem de Tarefas:

    • Filtros para visualizar tarefas por cargo, pessoa atribuída, horário, dia, custo, prioridade, bloqueante, nome da agenda e status.
  15. Consolidação de Tarefas:

    • Lista consolidada de todas as tarefas de todos os projetos.
  16. Dias Independentes:

    • Seção para dias que não estão associados a um projeto específico.
  17. Arrastar e Soltar:

    • Implementação de arrastar e soltar para reorganizar dias e tarefas dentro de um projeto.
  18. Calendário:

    • Exibição de um calendário com eventos destacados com base nas tarefas.

Estas funcionalidades permitem uma gestão abrangente e detalhada de projetos, facilitando a organização e acompanhamento das atividades diárias.

Bug`s a corrigir 

Se um step é arrastado para dentro de outro, e ajustado a caixinha todas as tarefas param de se mover

 

 

Quando eu exclu alguma coisa fica salvo um registro em dias independentes



O Filtro adicionado pelo campo novo nas tarefas não funciona


 

Funcionalidades futuras

Que eu possa incluir um código na frente de cada Projeto e também na frente de cada caixinha verde para filtrar 

Que eu possa incluir um código na frente de cada atividade para que eu possa filtrar por sinergia de atividades, exemplo todas que são gravações e vídeos..... Todas que são gestao... e Etc. 


Opção de transformar uma caixinha de steps em um projeto inteiro. 

 

 

Opção de clicar em atividade recorrente e ela aparece todos os dias na agenda lá em baixo

 

 

Opção de incluir caixinhas de marcação para colocar um filtro, no estilo da bloqueante, mas tipo Investimento


Opção de subir e descer projetos
Opção de Hiperlinkar projetos interelacionados por exemplo (Projeto financeiro) (Projeto de vendas)

Incluir uma opção de excluir o projeto 

Incluir um aviso antes de excluir qualquer coisa do sistema, tipo você tem certeza disso?

Incluir a opção de atividade recorrente, tipo gastos mensai, para filtrar
Incluir a opção de clicar na tarefa num campo chamado sonhos para poder filtrar
Incluir um campo de descrição acima de cada projeto. 
Incluir uma opção acima de tudo de filtras projetos. 

Inclua uma opção dentro das atividades de dinheiro a receber no futuro e que ele some lá em cima do projeto ao lado do custo total 
Inclua também a opção de total de contas a pagar dentro da atividade para eu lançar o valor e aparecer lá em cima contas a pagar  do lado do custo total 
Inclua um botao dentro da atividade pra eu clicar de contas a pagar para que eu tenha um filtro. 
Inclua um botão dentro da atividade de contas a receber para que eu tenha um filtro 
Some agora acima de tudo o custo total desse projeto somando todos o custo total de cada projeto criado.
Faça o mesmo agora para contas a pagar

Faça o mesmo agora para Valor futuro a receber. 
Inclua uma opção de marca leads para vender dentro da atividade e crie uma sequencia de caixinhas lá em baixo que eu possa arrastar para outra fase de vendas e que mude lá em cima também quando eu arrasto. 

Lembretes que aparecem como pop e com sons aos domingos uma semana e a um mês. 

Posso arrastar projetos para cima e o projeto de cima para baixo para que eu possa subir projetos mais importantes


Tenha uma opção de clicar custo numa caixinha dentro da tarefa e ao filtrar ele some lá em cima automaticamente.
Faça a mesma coisa que eu possa clicar custo mensal, custo semanal, custo diário para eu entender o valor. 
Faça o mesmo para Vendas diarias, uma opção que eu possa marcar venda! E quando eu clicar entrar o dinheiro no caixa}
Inclua uma opção de pagamento, para que eu clique em pagamento e ele subtraia do caixa. 
Inclua uma opção de caixa, para que apareça la em cima dinheiro no caixa. 


Incluir a opção de control z para desfazer movimentos. 
Incluir a opção de excluir projetos 

 

Incluir opção de relatórios 


Incluir a opção de subir todas as atividaes marcadas como prioridade e bloqueantes num relatório instatâneo no topo da página. 


Incluir pessoas no projeto para editarem junto comigo. 


Contratar um programador 
 

Funcionalidades solicitadas a corrigidar.

Bug`s pedidos para corrigir 

 


A tarefa após ser inserira  tem a opção de Incluir  um novos campo,  que automaticamente inclue novos filtros lá em cima., 
Mas ao clicar nO Botão adicionar novo campo dentro da tarefa ele não funciona, corrija isso e faça ele funcionar e quando ele funcionar, não se esqueça que cada campo novo, precisa ter um filtro novo adicionado e inclua na tarefa a opção de excluir ela, pois não tem esse botão e precisa ter. 

 

 

 

 

Nova correção de bugs

Funcionalidades corrigidar.