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
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:
Adicionar Novo Projeto:
Editar Nome do Projeto:
Duplicar Projeto:
Custo Total do Projeto:
Adicionar Dias da Semana ao Projeto:
Adicionar Novo Dia:
Remover Dia:
Adicionar Nova Tarefa:
Marcar Tarefa como Completa:
Editar Tarefa:
Duplicar Tarefa:
Detalhes da Tarefa:
Filtragem de Tarefas:
Consolidação de Tarefas:
Dias Independentes:
Arrastar e Soltar:
Calendário:
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.