mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:41:09 +02:00
219 lines
9.5 KiB
Markdown
219 lines
9.5 KiB
Markdown
# Calendar Settings Audit & Simplification Proposal
|
|
|
|
## Current State: 41 Settings
|
|
|
|
The calendar app has 41 settings defined in `CalendarAppSettings`. Only **13** are exposed in the Settings UI. The remaining 28 are either used internally with hardcoded defaults or are dead code.
|
|
|
|
---
|
|
|
|
## All Settings by Category
|
|
|
|
### A. View Settings (9) — Core, keep all
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 1 | `defaultView` | `'week' \| 'month' \| 'agenda'` | `'week'` | Yes | ViewsBar, SettingsModal |
|
|
| 2 | `weekStartsOn` | `0 \| 1` | `1` (Mon) | No | WeekView, MonthView, DateStrip, viewStore |
|
|
| 3 | `showOnlyWeekdays` | `boolean` | `false` | Yes | WeekView, MonthView |
|
|
| 4 | `showWeekNumbers` | `boolean` | `false` | Yes | WeekView |
|
|
| 5 | `timeFormat` | `'24h' \| '12h'` | `'24h'` | Yes | WeekView, formatTime/formatHour |
|
|
| 6 | `filterHoursEnabled` | `boolean` | `false` | Yes | WeekView, useVisibleHours |
|
|
| 7 | `dayStartHour` | `number` | `6` | Yes | WeekView, useVisibleHours |
|
|
| 8 | `dayEndHour` | `number` | `20` | Yes | WeekView, useVisibleHours |
|
|
| 9 | `allDayDisplayMode` | `'header' \| 'block'` | `'header'` | Yes | WeekView |
|
|
|
|
### B. Header Settings (4) — Not in UI, used by CalendarHeader
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 10 | `headerCompact` | `boolean` | `false` | No | CalendarHeader |
|
|
| 11 | `headerWeekdayFormat` | `'full' \| 'short' \| 'hidden'` | `'full'` | No | CalendarHeader |
|
|
| 12 | `headerShowDate` | `boolean` | `true` | No | CalendarHeader |
|
|
| 13 | `headerAlwaysShowMonth` | `boolean` | `false` | No | CalendarHeader |
|
|
|
|
### C. DateStrip Settings (8) — Not in UI, used by DateStrip
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 14 | `dateStripShowMoonPhases` | `boolean` | `true` | No | DateStrip |
|
|
| 15 | `dateStripShowEventIndicators` | `boolean` | `true` | No | DateStrip |
|
|
| 16 | `dateStripShowWeekday` | `boolean` | `true` | No | DateStrip |
|
|
| 17 | `dateStripHighlightWeekends` | `boolean` | `true` | No | DateStrip |
|
|
| 18 | `dateStripShowMonthDividers` | `boolean` | `true` | No | DateStrip |
|
|
| 19 | `dateStripCompact` | `boolean` | `false` | No | DateStrip |
|
|
| 20 | `dateStripShowWeekNumbers` | `boolean` | `false` | No | DateStrip |
|
|
| 21 | `dateStripCollapsed` | `boolean` | `false` | No | DateStripFab, Layout |
|
|
|
|
### D. Tag/Filter Settings (2) — Runtime state, not user preference
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 22 | `tagStripCollapsed` | `boolean` | `true` | No | Layout |
|
|
| 23 | `selectedTagIds` | `string[]` | `[]` | No | MonthView, TagStrip, Layout |
|
|
|
|
### E. Mode Toggles (3) — Runtime state, not user preference
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 24 | `immersiveModeEnabled` | `boolean` | `false` | No | Layout |
|
|
| 25 | `showTasksInCalendar` | `boolean` | `false` | No | WeekView, Layout (reset on load) |
|
|
| 26 | `sidebarCollapsed` | `boolean` | `true` | No | Layout (reset on load) |
|
|
|
|
### F. Birthday Settings (2) — In UI
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 27 | `showBirthdays` | `boolean` | `true` | Yes | WeekView, MonthView, Layout |
|
|
| 28 | `showBirthdayAge` | `boolean` | `true` | Yes | WeekView, BirthdayPopover |
|
|
|
|
### G. Quick View Pill (2) — Not in UI
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 29 | `quickViewPillViews` | `CalendarViewType[]` | `['week','month','agenda']` | No | ViewModePill |
|
|
| 30 | `customDayCount` | `number` | `30` | No | viewStore (agenda range) |
|
|
|
|
### H. Event Defaults (2) — In UI
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 31 | `defaultEventDuration` | `number` | `60` | Yes | EventForm |
|
|
| 32 | `defaultReminder` | `number` | `15` | Yes | SettingsModal |
|
|
|
|
### I. Voice Input (1) — In UI
|
|
|
|
| # | Setting | Type | Default | In UI | Used By |
|
|
|---|---------|------|---------|-------|---------|
|
|
| 33 | `sttLanguage` | `'de' \| 'auto'` | `'de'` | Yes | voice-recording composable |
|
|
|
|
---
|
|
|
|
## Simplification Proposal: 41 → 18 Settings
|
|
|
|
### Principle: Settings should be **user-visible preferences** that persist. Runtime UI state (sidebar open, tag selection) and hardcoded component behavior belong elsewhere.
|
|
|
|
### Keep as Settings (18)
|
|
|
|
These are genuine user preferences that should persist across sessions:
|
|
|
|
| # | Setting | Rationale |
|
|
|---|---------|-----------|
|
|
| 1 | `defaultView` | User choice |
|
|
| 2 | `weekStartsOn` | Regional preference, add to UI |
|
|
| 3 | `showOnlyWeekdays` | User choice |
|
|
| 4 | `showWeekNumbers` | User choice |
|
|
| 5 | `timeFormat` | Regional preference |
|
|
| 6 | `filterHoursEnabled` | User choice |
|
|
| 7 | `dayStartHour` | User choice |
|
|
| 8 | `dayEndHour` | User choice |
|
|
| 9 | `allDayDisplayMode` | User choice |
|
|
| 10 | `showBirthdays` | User choice |
|
|
| 11 | `showBirthdayAge` | User choice |
|
|
| 12 | `defaultEventDuration` | User choice |
|
|
| 13 | `defaultReminder` | User choice |
|
|
| 14 | `sttLanguage` | User choice |
|
|
| 15 | `dateStripShowMoonPhases` | Unique feature, worth keeping as user choice |
|
|
| 16 | `dateStripShowEventIndicators` | Useful toggle |
|
|
| 17 | `dateStripHighlightWeekends` | Useful toggle |
|
|
| 18 | `dateStripCompact` | Layout preference |
|
|
|
|
### Remove — Convert to Hardcoded Defaults (12)
|
|
|
|
These are not exposed in any UI and their defaults are always used:
|
|
|
|
| Setting | Default | Reason to Remove |
|
|
|---------|---------|------------------|
|
|
| `headerCompact` | `false` | Never toggled, no UI |
|
|
| `headerWeekdayFormat` | `'full'` | Never toggled, no UI |
|
|
| `headerShowDate` | `true` | Never toggled, no UI |
|
|
| `headerAlwaysShowMonth` | `false` | Never toggled, no UI |
|
|
| `dateStripShowWeekday` | `true` | Always true, no reason to hide |
|
|
| `dateStripShowMonthDividers` | `true` | Always true, no reason to hide |
|
|
| `dateStripShowWeekNumbers` | `false` | Duplicate of `showWeekNumbers` |
|
|
| `quickViewPillViews` | `['week','month','agenda']` | Only 3 views exist, always all shown |
|
|
| `customDayCount` | `30` | Hardcode in agenda view |
|
|
|
|
### Remove — Move to Component-Local State (11)
|
|
|
|
These are runtime UI state, not persistent preferences. They should be `$state()` variables in the components that use them:
|
|
|
|
| Setting | Current Behavior | Where to Move |
|
|
|---------|-----------------|---------------|
|
|
| `dateStripCollapsed` | Persisted | `$state(false)` in DateStrip/Layout |
|
|
| `tagStripCollapsed` | Persisted | `$state(true)` in Layout |
|
|
| `selectedTagIds` | Persisted | `$state([])` in Layout or a tagFilterStore |
|
|
| `immersiveModeEnabled` | Persisted | `$state(false)` in Layout |
|
|
| `showTasksInCalendar` | Reset to `false` on load | `$state(false)` in Layout |
|
|
| `sidebarCollapsed` | Reset to `true` on load | `$state(true)` in Layout |
|
|
|
|
**Note:** `selectedTagIds` could arguably persist, but the current behavior (persisting filter state) can confuse users who forget they have filters active. Resetting on load is safer.
|
|
|
|
---
|
|
|
|
## Proposed New Interface
|
|
|
|
```typescript
|
|
export interface CalendarAppSettings extends Record<string, unknown> {
|
|
// View
|
|
defaultView: CalendarViewType;
|
|
weekStartsOn: 0 | 1;
|
|
showOnlyWeekdays: boolean;
|
|
showWeekNumbers: boolean;
|
|
timeFormat: '24h' | '12h';
|
|
filterHoursEnabled: boolean;
|
|
dayStartHour: number;
|
|
dayEndHour: number;
|
|
allDayDisplayMode: 'header' | 'block';
|
|
|
|
// Display
|
|
showBirthdays: boolean;
|
|
showBirthdayAge: boolean;
|
|
dateStripShowMoonPhases: boolean;
|
|
dateStripShowEventIndicators: boolean;
|
|
dateStripHighlightWeekends: boolean;
|
|
dateStripCompact: boolean;
|
|
|
|
// Event defaults
|
|
defaultEventDuration: number;
|
|
defaultReminder: number;
|
|
|
|
// Voice
|
|
sttLanguage: 'de' | 'auto';
|
|
}
|
|
```
|
|
|
|
### New Settings UI Sections
|
|
|
|
| Section | Settings | Currently in UI |
|
|
|---------|----------|-----------------|
|
|
| **Ansicht** | defaultView, weekStartsOn, timeFormat, showOnlyWeekdays, showWeekNumbers | Mostly yes, add weekStartsOn |
|
|
| **Stunden** | filterHoursEnabled, dayStartHour, dayEndHour | Yes |
|
|
| **Anzeige** | allDayDisplayMode, dateStripCompact, dateStripShowMoonPhases, dateStripShowEventIndicators, dateStripHighlightWeekends | Partially |
|
|
| **Termine** | defaultEventDuration, defaultReminder | Yes |
|
|
| **Geburtstage** | showBirthdays, showBirthdayAge | Yes |
|
|
| **Spracheingabe** | sttLanguage | Yes |
|
|
|
|
---
|
|
|
|
## Migration Steps
|
|
|
|
1. Move UI state to component-local `$state()` (sidebarCollapsed, tagStripCollapsed, etc.)
|
|
2. Replace header settings with hardcoded values in CalendarHeader
|
|
3. Replace removed dateStrip settings with hardcoded values in DateStrip
|
|
4. Remove `quickViewPillViews` and `customDayCount` (hardcode)
|
|
5. Update `CalendarAppSettings` interface
|
|
6. Update settings store (remove getters, toggles, cloud sync exclusions)
|
|
7. Update SettingsModal to expose `weekStartsOn` and dateStrip display settings
|
|
8. Add localStorage migration to handle existing users (read old keys, map to new)
|
|
|
|
---
|
|
|
|
## Impact Assessment
|
|
|
|
| Change | Risk | Files Affected |
|
|
|--------|------|----------------|
|
|
| Remove header settings | Low — defaults always used | CalendarHeader.svelte, settings store |
|
|
| Move UI state out | Medium — need to wire up component state | Layout, DateStripFab, TagStrip |
|
|
| Remove quickViewPillViews | Low — only 3 views exist | ViewModePill.svelte |
|
|
| Add weekStartsOn to UI | Low — just add dropdown | SettingsModal, settings page |
|
|
| localStorage migration | Low — one-time migration function | settings store |
|