Work Plan Optimizer
Work Plan Optimizer

Typical Work Schedule

Energy/Focus Levels by Time Block

Define your typical energy/focus for these general blocks within your workday. These will be used to match task types.

Define Tasks to be Planned

Generate Optimized Work Plan

'; } else { dayData.tasks.forEach(task => { dayDiv.innerHTML += `
${task.startTime} - ${task.endTime} ${task.taskName} (${task.taskType} / ${task.priority})
`; }); } planOutputDiv.appendChild(dayDiv); }); if (wpo_generatedPlanForPdf.unscheduled.length > 0) { wpo_generatedPlanForPdf.unscheduled.forEach(task => { unscheduledListUl.innerHTML += `
  • ${task.name} (${task.durationMinutes}m, ${task.priority}, ${task.taskType})
  • `; }); } else { unscheduledListUl.innerHTML = `
  • All tasks were scheduled!
  • `; } document.getElementById('wpo-generated-plan-area').style.display = 'block'; document.getElementById('wpo-download-pdf-button').disabled = false; } function wpo_clearAllData() { if (confirm("Clear all tasks and the generated plan? Work rhythm will remain.")) { document.getElementById('wpo-tasks-input-list').innerHTML = ''; wpo_taskInputRowCounter = 0; wpo_tasksToPlan = []; wpo_addTaskInputRow(); // Add one default document.getElementById('wpo-plan-output').innerHTML = ''; document.getElementById('wpo-unscheduled-tasks-list').innerHTML = ''; document.getElementById('wpo-generated-plan-area').style.display = 'none'; document.getElementById('wpo-download-pdf-button').disabled = true; wpo_generatedPlanForPdf = null; } } function wpo_downloadPDF() { if (!tpc_jsPDF_loaded_WPO || !tpc_autoTable_loaded_WPO) { alert("WPO Error: PDF libraries not loaded."); return; } if (!wpo_generatedPlanForPdf) { alert("Please generate a plan first."); return; } const doc = new TPC_jsPDF_WPO(); const primaryColor = getComputedStyle(document.documentElement).getPropertyValue('--primary-color').trim(); const darkColor = getComputedStyle(document.documentElement).getPropertyValue('--dark-color').trim(); let finalY = 15; const reportDateStr = new Date().toLocaleDateString(); doc.setFontSize(18); doc.setTextColor(primaryColor); doc.text("Optimized Work Plan Report", doc.internal.pageSize.getWidth() / 2, finalY, { align: 'center' }); finalY += 8; doc.setFontSize(10); doc.setTextColor(darkColor); doc.text(`Report Date: ${reportDateStr}`, doc.internal.pageSize.getWidth() / 2, finalY, { align: 'center'}); finalY += 10; doc.setFontSize(12); doc.setTextColor(primaryColor); doc.text("Work Rhythm Profile Used:", 14, finalY); finalY += 6; doc.setFontSize(9); doc.setTextColor(darkColor); let rhythmText = `Work Hours: ${wpo_workRhythm.workStartTime} - ${wpo_workRhythm.workEndTime}. `; rhythmText += `Lunch: ${wpo_workRhythm.lunchBreakStartTime} - ${wpo_workRhythm.lunchBreakEndTime}. `; rhythmText += `Work Days: ${wpo_workRhythm.workDays.map(d => ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][d]).join(', ')}. `; rhythmText += `Energy - Morning: ${wpo_workRhythm.energyLevels.morning}, Afternoon: ${wpo_workRhythm.energyLevels.afternoon}, Late Afternoon: ${wpo_workRhythm.energyLevels.lateAfternoon}.`; doc.text(rhythmText, 14, finalY, {maxWidth: doc.internal.pageSize.getWidth() - 28}); finalY += (Math.ceil(doc.getTextDimensions(rhythmText).h / (doc.internal.pageSize.getWidth() - 28)) * 4) + 8 ; wpo_generatedPlanForPdf.days.forEach(dayData => { if (finalY > 250) { doc.addPage(); finalY = 15; } doc.setFontSize(12); doc.setTextColor(primaryColor); doc.text(dayData.date.toLocaleDateString(undefined, {weekday:'long', year:'numeric', month:'long', day:'numeric'}), 14, finalY); finalY +=7; if (dayData.tasks.length > 0) { const tableBody = dayData.tasks.map(task => [ `${task.startTime} - ${task.endTime}`, task.taskName, task.taskType, task.priority ]); doc.autoTable({ startY: finalY, head: [['Time', 'Task', 'Type', 'Priority']], body: tableBody, theme: 'grid', headStyles: { fillColor: primaryColor, textColor: '#ffffff', fontSize: 9 }, styles: { fontSize: 8, cellPadding: 1.5 } }); finalY = doc.lastAutoTable.finalY + 7; } else { doc.setFontSize(9); doc.setTextColor(darkColor); doc.text("No tasks scheduled for this day.", 14, finalY); finalY += 7; } }); if (wpo_generatedPlanForPdf.unscheduled.length > 0) { if (finalY > 250) { doc.addPage(); finalY = 15; } doc.setFontSize(12); doc.setTextColor(primaryColor); doc.text("Unscheduled Tasks", 14, finalY); finalY += 7; const unscheduledBody = wpo_generatedPlanForPdf.unscheduled.map(task => [ task.name, `${task.durationMinutes}m`, task.priority, task.taskType, task.dueDate || 'N/A' ]); doc.autoTable({ startY: finalY, head: [['Task Name', 'Duration', 'Priority', 'Type', 'Due Date']], body: unscheduledBody, theme: 'grid', headStyles: {fillColor:getComputedStyle(document.documentElement).getPropertyValue('--warning-color').trim(), textColor: darkColor, fontSize:9}, styles: {fontSize:8, cellPadding:1.5} }); } doc.save(`Work_Plan_${new Date().toISOString().slice(0,10)}.pdf`); }
    Scroll to Top