diff --git a/public/index.html b/public/index.html index 200f444..2220ac9 100644 --- a/public/index.html +++ b/public/index.html @@ -19,6 +19,7 @@ + @@ -35,6 +36,14 @@ + + + diff --git a/public/pages/calendar.js b/public/pages/calendar.js index 7ac1127..526fd55 100644 --- a/public/pages/calendar.js +++ b/public/pages/calendar.js @@ -5,6 +5,7 @@ */ import { api } from '/api.js'; +import { renderRRuleFields, bindRRuleEvents, getRRuleValues } from '/rrule-ui.js'; // -------------------------------------------------------- // Konstanten @@ -606,7 +607,7 @@ function renderAgendaEvent(ev) {
-
${escHtml(ev.title)}
+
${escHtml(ev.title)}${ev.recurrence_rule ? ' ' : ''}
${timeStr} ${ev.location ? `📍 ${escHtml(ev.location)}` : ''} @@ -701,6 +702,9 @@ function openEventModal({ mode, event = null, date = null }) { if (window.lucide) lucide.createIcons(); + // RRULE-Events binden + bindRRuleEvents(overlay, 'event'); + const isEdit = mode === 'edit'; const selectedColor = isEdit ? (event?.color || EVENT_COLORS[0]) : EVENT_COLORS[0]; @@ -845,6 +849,8 @@ function buildEventModalHTML({ mode, event, date }) {
+ + ${renderRRuleFields('event', isEdit ? event.recurrence_rule : null)}
+
+ +

Mein Konto

@@ -201,6 +223,19 @@ export async function render(container, { user }) { // -------------------------------------------------------- function bindEvents(container, user) { + // Theme-Toggle + const themeToggle = container.querySelector('#theme-toggle'); + if (themeToggle) { + themeToggle.addEventListener('click', (e) => { + const btn = e.target.closest('[data-theme-value]'); + if (!btn) return; + const value = btn.dataset.themeValue; + applyTheme(value); + themeToggle.querySelectorAll('.theme-toggle__btn').forEach(b => b.classList.remove('theme-toggle__btn--active')); + btn.classList.add('theme-toggle__btn--active'); + }); + } + // Passwort ändern const passwordForm = container.querySelector('#password-form'); if (passwordForm) { @@ -400,6 +435,19 @@ function formatDate(iso) { return new Date(iso).toLocaleString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); } +function currentTheme() { + return localStorage.getItem('oikos-theme') || 'system'; +} + +function applyTheme(value) { + localStorage.setItem('oikos-theme', value); + if (value === 'light' || value === 'dark') { + document.documentElement.setAttribute('data-theme', value); + } else { + document.documentElement.removeAttribute('data-theme'); + } +} + function showError(el, msg) { el.textContent = msg; el.hidden = false; diff --git a/public/pages/tasks.js b/public/pages/tasks.js index d9e4d56..9d9e87c 100644 --- a/public/pages/tasks.js +++ b/public/pages/tasks.js @@ -5,6 +5,7 @@ */ import { api } from '/api.js'; +import { renderRRuleFields, bindRRuleEvents, getRRuleValues } from '/rrule-ui.js'; // -------------------------------------------------------- // Konstanten @@ -153,6 +154,7 @@ function renderTaskCard(task, opts = {}) {
${renderPriorityBadge(task.priority)} ${renderDueDate(task.due_date)} + ${task.is_recurring ? '' : ''} ${task.category !== 'Sonstiges' ? `${task.category}` : ''}
@@ -302,6 +304,8 @@ function renderModal({ task = null, users = [] } = {}) { ` : ''} + ${renderRRuleFields('task', task?.recurrence_rule)} +