Routine Builder

Routine Builder

My Weekly Routine

Add New Task Preset

min

Task Preset Library

Add Task

×

No tasks in your routine. Click "Add Task" to get started!

`; } } /** * Renders the Task Preset list in Config tab. */ function renderConfigList() { if (!configListContainer) return; configListContainer.innerHTML = ""; if (rbConfig.taskLibrary.length === 0) { configListContainer.innerHTML = "

No task presets defined.

"; } rbConfig.taskLibrary.forEach((preset) => { const item = document.createElement("div"); item.className = "rb-list-item"; item.innerHTML = ` ${preset.name} ${preset.duration} min
`; configListContainer.appendChild(item); }); // Also update the modal dropdown renderPresetDropdown(); } /** * Populates the Task Preset dropdown in the modal. */ function renderPresetDropdown() { if (!taskPresetSelect) return; taskPresetSelect.innerHTML = ''; rbConfig.taskLibrary.forEach((preset) => { const option = document.createElement("option"); option.value = preset.id; option.textContent = `${preset.name} (${preset.duration} min)`; taskPresetSelect.appendChild(option); }); } /** * Update navigation button states. */ function updateNavButtons() { if (!nextBtn || !prevBtn) return; if (currentTabId === "rb-tab-dashboard") { prevBtn.disabled = true; nextBtn.disabled = false; } else if (currentTabId === "rb-tab-config") { prevBtn.disabled = false; nextBtn.disabled = true; } } /** * Re-renders all UI components. */ function fullRefreshUI() { renderDashboard(); renderConfigList(); updateNavButtons(); } // === EVENT HANDLERS (Must be global for onclick) === window.rbShowTab = (tabId, element) => { // Hide all content container .querySelectorAll(".rb-tab-content") .forEach((tab) => (tab.style.display = "none")); // Deactivate all links container .querySelectorAll(".rb-tab-link") .forEach((link) => link.classList.remove("rb-active")); // Show selected content const tabToShow = container.querySelector("#" + tabId); if (tabToShow) { tabToShow.style.display = "block"; } // Activate selected link if (element) { element.classList.add("rb-active"); } currentTabId = tabId; updateNavButtons(); }; window.rbNavigateTabs = (isNext) => { const tabs = Array.from( container.querySelectorAll(".rb-tab-link") ); const currentIdx = tabs.findIndex((tab) => tab.classList.contains("rb-active") ); let newIdx = isNext ? currentIdx + 1 : currentIdx - 1; if (newIdx >= 0 && newIdx < tabs.length) { tabs[newIdx].click(); } }; // --- Config Tab Handlers --- window.rbAddTaskPreset = () => { if (!newPresetName || !newPresetDuration) return; const name = newPresetName.value.trim(); const duration = parseInt(newPresetDuration.value); if (!name) { alert("Please enter a task name."); return; } if (isNaN(duration) || duration <= 0) { alert("Please enter a valid duration in minutes."); return; } const newPreset = { id: "t" + Date.now(), name, duration, }; rbConfig.taskLibrary.push(newPreset); newPresetName.value = ""; newPresetDuration.value = ""; renderConfigList(); }; window.rbDeleteTaskPreset = (id) => { if ( !confirm("Are you sure you want to delete this task preset?") ) { return; } rbConfig.taskLibrary = rbConfig.taskLibrary.filter( (p) => p.id !== id ); renderConfigList(); }; // --- Modal Handlers --- window.rbOpenTaskModal = (instanceId) => { if ( !taskModal || !modalTitle || !taskIdInput || !taskNameInput || !taskDaySelect || !taskStartInput || !taskEndInput || !taskNotesInput || !taskPresetSelect ) return; // Reset form taskPresetSelect.value = ""; taskIdInput.value = ""; taskNameInput.value = ""; taskDaySelect.value = "monday"; taskStartInput.value = ""; taskEndInput.value = ""; taskNotesInput.value = ""; if (instanceId) { // Edit mode const task = rbState.routine.find( (t) => t.instanceId === instanceId ); if (task) { modalTitle.textContent = "Edit Task"; taskIdInput.value = task.instanceId; taskNameInput.value = task.name; taskDaySelect.value = task.day; taskStartInput.value = task.startTime; taskEndInput.value = task.endTime; taskNotesInput.value = task.notes; } } else { // Add mode modalTitle.textContent = "Add Task"; } taskModal.style.display = "block"; }; window.rbCloseTaskModal = () => { if (!taskModal) return; taskModal.style.display = "none"; }; window.rbApplyPreset = () => { if (!taskPresetSelect || !taskNameInput) return; const presetId = taskPresetSelect.value; if (!presetId) { taskNameInput.value = ""; return; } const preset = rbConfig.taskLibrary.find( (p) => p.id === presetId ); if (preset) { taskNameInput.value = preset.name; rbApplyPresetDuration(); } }; window.rbApplyPresetDuration = () => { if ( !taskPresetSelect || !taskStartInput || !taskEndInput ) return; const presetId = taskPresetSelect.value; const startTime = taskStartInput.value; if (!presetId || !startTime) { return; // Only auto-fill if preset and start time are set } const preset = rbConfig.taskLibrary.find( (p) => p.id === presetId ); if (preset) { taskEndInput.value = addMinutes( startTime, preset.duration ); } }; window.rbSaveTask = () => { if ( !taskIdInput || !taskNameInput || !taskDaySelect || !taskStartInput || !taskEndInput || !taskNotesInput ) return; const task = { instanceId: taskIdInput.value || "i" + Date.now(), name: taskNameInput.value.trim(), day: taskDaySelect.value, startTime: taskStartInput.value, endTime: taskEndInput.value, notes: taskNotesInput.value.trim(), }; if (!task.name) { alert("Please enter a task name."); return; } if (!task.startTime || !task.endTime) { alert("Please enter a start and end time."); return; } if (task.startTime >= task.endTime) { alert("End time must be after start time."); return; } if (taskIdInput.value) { // Edit mode: find and replace const index = rbState.routine.findIndex( (t) => t.instanceId === task.instanceId ); if (index > -1) { rbState.routine[index] = task; } } else { // Add mode rbState.routine.push(task); } renderDashboard(); rbCloseTaskModal(); }; window.rbDeleteTask = (instanceId) => { if (!confirm("Are you sure you want to delete this task?")) { return; } rbState.routine = rbState.routine.filter( (t) => t.instanceId !== instanceId ); renderDashboard(); }; // --- PDF Download --- window.rbDownloadPDF = () => { if (!jsPDF) { alert("PDF library is not loaded. Please try again."); return; } try { const doc = new jsPDF(); const pageMargin = 15; const pageWidth = doc.internal.pageSize.getWidth(); let y = 20; // 1. Title doc.setFontSize(20); doc.text( "My Weekly Routine", pageWidth / 2, y, { align: "center" } ); y += 20; // Sort tasks for PDF rbState.routine.sort((a, b) => { if (a.startTime && b.startTime) { return a.startTime.localeCompare(b.startTime); } return 0; }); const tableHead = [ "Time", "Task", "Notes", ]; DAYS_OF_WEEK.forEach((day) => { const tasksForDay = rbState.routine.filter( (task) => task.day === day ); if (tasksForDay.length > 0) { const tableBody = tasksForDay.map((task) => [ `${formatTime(task.startTime)} - ${formatTime( task.endTime )}`, task.name, task.notes || "", ]); doc.autoTable({ startY: y, head: [ [{ content: formatCap(day), colSpan: 3, styles: { fillColor: [0, 95, 204], textColor: 255 }, }, ], tableHead, ], body: tableBody, theme: "striped", headStyles: { fillColor: [74, 85, 104] }, }); y = doc.autoTable.previous.finalY + 10; } }); if (y === 40) { // No tasks were added doc.setFontSize(12); doc.text( "No tasks in your routine.", pageWidth / 2, y, { align: "center" } ); } doc.save("My_Weekly_Routine.pdf"); } catch (e) { console.error("Error generating PDF:", e); alert( "An error occurred while generating the PDF." ); } }; // === INITIALIZATION === fullRefreshUI(); });