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();
});