@focus8/settings-registry 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -152,6 +152,10 @@ export type SettingDef<T = unknown> = {
152
152
  options?: readonly SettingOption<T>[];
153
153
  /** Slider configuration for SLIDER-type settings */
154
154
  sliderConfig?: SliderConfig;
155
+ /** Only show this setting for enrolled/kiosk devices (undefined = always) */
156
+ appMode?: 'ENROLLED';
157
+ /** Only show this setting for a specific calendar type (undefined = always) */
158
+ calendarType?: CalendarType;
155
159
  };
156
160
  export type RegistryConfig = {
157
161
  /** Whether the device is in enrolled/kiosk mode */
@@ -180,10 +184,10 @@ declare function buildEntries(config: RegistryConfig): {
180
184
  readonly 'calendarView.showWeatherOnTimeline': SettingDef<boolean>;
181
185
  readonly 'calendarView.weatherLocation': SettingDef<WeatherLocation | null>;
182
186
  readonly 'eventForm.recurrence': SettingDef<boolean>;
183
- readonly 'eventForm.reminders': SettingDef<boolean>;
184
- readonly 'eventForm.emailReminders': SettingDef<boolean>;
185
187
  readonly 'eventForm.location': SettingDef<boolean>;
186
188
  readonly 'eventForm.travelTime': SettingDef<boolean>;
189
+ readonly 'eventForm.reminders': SettingDef<boolean>;
190
+ readonly 'eventForm.emailReminders': SettingDef<boolean>;
187
191
  readonly 'eventForm.description': SettingDef<boolean>;
188
192
  readonly 'eventForm.checklist': SettingDef<boolean>;
189
193
  readonly 'eventForm.images': SettingDef<boolean>;
@@ -205,16 +209,16 @@ declare function buildEntries(config: RegistryConfig): {
205
209
  readonly 'timer.showEndTime': SettingDef<boolean>;
206
210
  readonly 'timer.showRestartButton': SettingDef<boolean>;
207
211
  readonly 'timer.showPauseButton': SettingDef<boolean>;
208
- readonly 'lockScreen.pin': SettingDef<string>;
209
212
  readonly 'lockScreen.inactivityLockEnabled': SettingDef<boolean>;
210
213
  readonly 'lockScreen.inactivityTimeoutMinutes': SettingDef<InactivityTimeoutMinutes>;
214
+ readonly 'lockScreen.pin': SettingDef<string>;
211
215
  readonly 'lockScreen.clockDisplay': SettingDef<LockScreenClockDisplay>;
212
- readonly 'lockScreen.showDate': SettingDef<boolean>;
213
216
  readonly 'lockScreen.showHourNumbers': SettingDef<boolean>;
217
+ readonly 'lockScreen.showDate': SettingDef<boolean>;
214
218
  readonly 'lockScreen.imageMode': SettingDef<LockScreenImageMode>;
215
219
  readonly 'lockScreen.backgroundImage': SettingDef<string | null>;
216
- readonly 'lockScreen.photoFrameImages': SettingDef<LockScreenImage[]>;
217
220
  readonly 'lockScreen.photoFrameIntervalSeconds': SettingDef<PhotoFrameIntervalSeconds>;
221
+ readonly 'lockScreen.photoFrameImages': SettingDef<LockScreenImage[]>;
218
222
  readonly 'touch.enableTapToCreate': SettingDef<boolean>;
219
223
  readonly 'touch.enableDragDrop': SettingDef<boolean>;
220
224
  readonly 'device.id': SettingDef<string>;
@@ -227,8 +231,8 @@ declare function buildEntries(config: RegistryConfig): {
227
231
  readonly 'notification.enabledCalendarIds': SettingDef<string[]>;
228
232
  readonly 'notification.hasBeenPrompted': SettingDef<boolean>;
229
233
  readonly 'chronological.header.showNavigationArrows': SettingDef<boolean>;
230
- readonly 'chronological.header.showClock': SettingDef<boolean>;
231
234
  readonly 'chronological.header.showCurrentYearInDate': SettingDef<boolean>;
235
+ readonly 'chronological.header.showClock': SettingDef<boolean>;
232
236
  readonly 'chronological.header.showTimeOfDay': SettingDef<boolean>;
233
237
  readonly 'chronological.footer.showMenuButton': SettingDef<boolean>;
234
238
  readonly 'chronological.footer.showViewSwitcherDay': SettingDef<boolean>;
@@ -239,9 +243,9 @@ declare function buildEntries(config: RegistryConfig): {
239
243
  readonly 'chronological.footer.showSettingsButton': SettingDef<boolean>;
240
244
  readonly 'chronological.timer.showNewCountdown': SettingDef<boolean>;
241
245
  readonly 'chronological.timer.showFromTemplate': SettingDef<boolean>;
246
+ readonly 'chronological.timer.showAddTemplate': SettingDef<boolean>;
242
247
  readonly 'chronological.timer.showEditTemplate': SettingDef<boolean>;
243
248
  readonly 'chronological.timer.showDeleteTemplate': SettingDef<boolean>;
244
- readonly 'chronological.timer.showAddTemplate': SettingDef<boolean>;
245
249
  readonly 'chronological.menu.showSettingsButton': SettingDef<boolean>;
246
250
  readonly 'chronological.quickSettings.showTimerVolume': SettingDef<boolean>;
247
251
  readonly 'chronological.quickSettings.showReminderVolume': SettingDef<boolean>;
@@ -253,16 +257,16 @@ declare function buildEntries(config: RegistryConfig): {
253
257
  readonly 'chronological.timeOfDay.afternoonStart': SettingDef<number>;
254
258
  readonly 'chronological.timeOfDay.eveningStart': SettingDef<number>;
255
259
  readonly 'chronological.timeOfDay.nightStart': SettingDef<number>;
260
+ readonly 'chronologicalEventForm.fixedField.allDay': SettingDef<boolean>;
261
+ readonly 'chronologicalEventForm.fixedField.endTime': SettingDef<boolean>;
262
+ readonly 'chronologicalEventForm.fixedField.visibility': SettingDef<boolean>;
263
+ readonly 'chronologicalEventForm.field.acknowledge': SettingDef<boolean>;
256
264
  readonly 'chronologicalEventForm.field.description': SettingDef<boolean>;
257
265
  readonly 'chronologicalEventForm.field.recurrence': SettingDef<boolean>;
258
- readonly 'chronologicalEventForm.field.acknowledge': SettingDef<boolean>;
259
266
  readonly 'chronologicalEventForm.field.checklist': SettingDef<boolean>;
260
267
  readonly 'chronologicalEventForm.field.extraImages': SettingDef<boolean>;
261
268
  readonly 'chronologicalEventForm.field.reminders': SettingDef<boolean>;
262
269
  readonly 'chronologicalEventForm.field.audioClips': SettingDef<boolean>;
263
- readonly 'chronologicalEventForm.fixedField.allDay': SettingDef<boolean>;
264
- readonly 'chronologicalEventForm.fixedField.endTime': SettingDef<boolean>;
265
- readonly 'chronologicalEventForm.fixedField.visibility': SettingDef<boolean>;
266
270
  readonly 'chronologicalEventForm.suggestEndTime.enabled': SettingDef<boolean>;
267
271
  readonly 'chronologicalEventForm.suggestEndTime.value': SettingDef<number>;
268
272
  readonly 'chronologicalEventForm.suggestEndTime.unit': SettingDef<SuggestEndTimeUnit>;
@@ -330,6 +334,10 @@ export type ParsedSettingEntry = {
330
334
  options?: readonly SettingOption[];
331
335
  /** Slider configuration for SLIDER-type settings */
332
336
  sliderConfig?: SliderConfig;
337
+ /** Only show this setting for enrolled/kiosk devices (undefined = always) */
338
+ appMode?: 'ENROLLED';
339
+ /** Only show this setting for a specific calendar type (undefined = always) */
340
+ calendarType?: CalendarType;
333
341
  };
334
342
  export type ParsedSettingsGroup = {
335
343
  /** The category key */
@@ -354,6 +362,23 @@ export declare function parseSettingsSnapshot(json: string | Record<string, unkn
354
362
  * Handles booleans, numbers, strings, arrays, objects, and null/undefined.
355
363
  */
356
364
  export declare function formatSettingValue(value: unknown): string;
365
+ /**
366
+ * Serialize a settings object (with mixed native types) into a
367
+ * string-values-only snapshot suitable for pushing to a mobile device.
368
+ *
369
+ * Uses the registry's `serialize()` method for known keys so that
370
+ * booleans become "true"/"false", numbers become digit strings, etc.
371
+ * Unknown keys are converted with `String(value)`.
372
+ */
373
+ export declare function serializeSettingsSnapshot(settings: Record<string, unknown>, registry: SettingsRegistry): Record<string, string>;
374
+ /**
375
+ * Deserialize a settings snapshot (string values from the server/DB) into
376
+ * native-typed values using the registry.
377
+ *
378
+ * This ensures local state always contains native types (boolean, number, etc.)
379
+ * so that subsequent `serializeSettingsSnapshot` calls produce correct results.
380
+ */
381
+ export declare function deserializeSettingsSnapshot(snapshot: Record<string, unknown>, registry?: SettingsRegistry): Record<string, unknown>;
357
382
  export declare const defaultRegistry: SettingsRegistry;
358
383
  export declare function createSettingsRegistry(config?: Partial<RegistryConfig>): {
359
384
  readonly 'appearance.theme': SettingDef<ThemeSetting>;
@@ -372,10 +397,10 @@ export declare function createSettingsRegistry(config?: Partial<RegistryConfig>)
372
397
  readonly 'calendarView.showWeatherOnTimeline': SettingDef<boolean>;
373
398
  readonly 'calendarView.weatherLocation': SettingDef<WeatherLocation | null>;
374
399
  readonly 'eventForm.recurrence': SettingDef<boolean>;
375
- readonly 'eventForm.reminders': SettingDef<boolean>;
376
- readonly 'eventForm.emailReminders': SettingDef<boolean>;
377
400
  readonly 'eventForm.location': SettingDef<boolean>;
378
401
  readonly 'eventForm.travelTime': SettingDef<boolean>;
402
+ readonly 'eventForm.reminders': SettingDef<boolean>;
403
+ readonly 'eventForm.emailReminders': SettingDef<boolean>;
379
404
  readonly 'eventForm.description': SettingDef<boolean>;
380
405
  readonly 'eventForm.checklist': SettingDef<boolean>;
381
406
  readonly 'eventForm.images': SettingDef<boolean>;
@@ -397,16 +422,16 @@ export declare function createSettingsRegistry(config?: Partial<RegistryConfig>)
397
422
  readonly 'timer.showEndTime': SettingDef<boolean>;
398
423
  readonly 'timer.showRestartButton': SettingDef<boolean>;
399
424
  readonly 'timer.showPauseButton': SettingDef<boolean>;
400
- readonly 'lockScreen.pin': SettingDef<string>;
401
425
  readonly 'lockScreen.inactivityLockEnabled': SettingDef<boolean>;
402
426
  readonly 'lockScreen.inactivityTimeoutMinutes': SettingDef<InactivityTimeoutMinutes>;
427
+ readonly 'lockScreen.pin': SettingDef<string>;
403
428
  readonly 'lockScreen.clockDisplay': SettingDef<LockScreenClockDisplay>;
404
- readonly 'lockScreen.showDate': SettingDef<boolean>;
405
429
  readonly 'lockScreen.showHourNumbers': SettingDef<boolean>;
430
+ readonly 'lockScreen.showDate': SettingDef<boolean>;
406
431
  readonly 'lockScreen.imageMode': SettingDef<LockScreenImageMode>;
407
432
  readonly 'lockScreen.backgroundImage': SettingDef<string | null>;
408
- readonly 'lockScreen.photoFrameImages': SettingDef<LockScreenImage[]>;
409
433
  readonly 'lockScreen.photoFrameIntervalSeconds': SettingDef<PhotoFrameIntervalSeconds>;
434
+ readonly 'lockScreen.photoFrameImages': SettingDef<LockScreenImage[]>;
410
435
  readonly 'touch.enableTapToCreate': SettingDef<boolean>;
411
436
  readonly 'touch.enableDragDrop': SettingDef<boolean>;
412
437
  readonly 'device.id': SettingDef<string>;
@@ -419,8 +444,8 @@ export declare function createSettingsRegistry(config?: Partial<RegistryConfig>)
419
444
  readonly 'notification.enabledCalendarIds': SettingDef<string[]>;
420
445
  readonly 'notification.hasBeenPrompted': SettingDef<boolean>;
421
446
  readonly 'chronological.header.showNavigationArrows': SettingDef<boolean>;
422
- readonly 'chronological.header.showClock': SettingDef<boolean>;
423
447
  readonly 'chronological.header.showCurrentYearInDate': SettingDef<boolean>;
448
+ readonly 'chronological.header.showClock': SettingDef<boolean>;
424
449
  readonly 'chronological.header.showTimeOfDay': SettingDef<boolean>;
425
450
  readonly 'chronological.footer.showMenuButton': SettingDef<boolean>;
426
451
  readonly 'chronological.footer.showViewSwitcherDay': SettingDef<boolean>;
@@ -431,9 +456,9 @@ export declare function createSettingsRegistry(config?: Partial<RegistryConfig>)
431
456
  readonly 'chronological.footer.showSettingsButton': SettingDef<boolean>;
432
457
  readonly 'chronological.timer.showNewCountdown': SettingDef<boolean>;
433
458
  readonly 'chronological.timer.showFromTemplate': SettingDef<boolean>;
459
+ readonly 'chronological.timer.showAddTemplate': SettingDef<boolean>;
434
460
  readonly 'chronological.timer.showEditTemplate': SettingDef<boolean>;
435
461
  readonly 'chronological.timer.showDeleteTemplate': SettingDef<boolean>;
436
- readonly 'chronological.timer.showAddTemplate': SettingDef<boolean>;
437
462
  readonly 'chronological.menu.showSettingsButton': SettingDef<boolean>;
438
463
  readonly 'chronological.quickSettings.showTimerVolume': SettingDef<boolean>;
439
464
  readonly 'chronological.quickSettings.showReminderVolume': SettingDef<boolean>;
@@ -445,16 +470,16 @@ export declare function createSettingsRegistry(config?: Partial<RegistryConfig>)
445
470
  readonly 'chronological.timeOfDay.afternoonStart': SettingDef<number>;
446
471
  readonly 'chronological.timeOfDay.eveningStart': SettingDef<number>;
447
472
  readonly 'chronological.timeOfDay.nightStart': SettingDef<number>;
473
+ readonly 'chronologicalEventForm.fixedField.allDay': SettingDef<boolean>;
474
+ readonly 'chronologicalEventForm.fixedField.endTime': SettingDef<boolean>;
475
+ readonly 'chronologicalEventForm.fixedField.visibility': SettingDef<boolean>;
476
+ readonly 'chronologicalEventForm.field.acknowledge': SettingDef<boolean>;
448
477
  readonly 'chronologicalEventForm.field.description': SettingDef<boolean>;
449
478
  readonly 'chronologicalEventForm.field.recurrence': SettingDef<boolean>;
450
- readonly 'chronologicalEventForm.field.acknowledge': SettingDef<boolean>;
451
479
  readonly 'chronologicalEventForm.field.checklist': SettingDef<boolean>;
452
480
  readonly 'chronologicalEventForm.field.extraImages': SettingDef<boolean>;
453
481
  readonly 'chronologicalEventForm.field.reminders': SettingDef<boolean>;
454
482
  readonly 'chronologicalEventForm.field.audioClips': SettingDef<boolean>;
455
- readonly 'chronologicalEventForm.fixedField.allDay': SettingDef<boolean>;
456
- readonly 'chronologicalEventForm.fixedField.endTime': SettingDef<boolean>;
457
- readonly 'chronologicalEventForm.fixedField.visibility': SettingDef<boolean>;
458
483
  readonly 'chronologicalEventForm.suggestEndTime.enabled': SettingDef<boolean>;
459
484
  readonly 'chronologicalEventForm.suggestEndTime.value': SettingDef<number>;
460
485
  readonly 'chronologicalEventForm.suggestEndTime.unit': SettingDef<SuggestEndTimeUnit>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -138,7 +138,7 @@ export const SETTINGS_GROUPS = [
138
138
  id: 'calendarType',
139
139
  labelKey: 'Settings.CalendarType',
140
140
  icon: 'ArrowLeftRight',
141
- keys: ['calendarView.type', 'calendarView.view'],
141
+ keys: ['calendarView.type'],
142
142
  },
143
143
  {
144
144
  id: 'calendarView',
@@ -147,9 +147,9 @@ export const SETTINGS_GROUPS = [
147
147
  keys: [
148
148
  'calendarView.showCalendarNames',
149
149
  'calendarView.splitView',
150
- 'calendarView.calendarColumns',
151
150
  'calendarView.dayViewZoom',
152
151
  'calendarView.weekViewZoom',
152
+ 'calendarView.calendarColumns',
153
153
  ],
154
154
  },
155
155
  {
@@ -163,9 +163,9 @@ export const SETTINGS_GROUPS = [
163
163
  labelKey: 'Settings.DateWeather',
164
164
  icon: 'CloudSun',
165
165
  keys: [
166
- 'calendarView.showWeatherOnEvents',
167
166
  'calendarView.showWeatherOnTimeline',
168
167
  'calendarView.weatherLocation',
168
+ 'calendarView.showWeatherOnEvents',
169
169
  ],
170
170
  },
171
171
  {
@@ -175,13 +175,13 @@ export const SETTINGS_GROUPS = [
175
175
  keys: [
176
176
  'sound.reminderVolume',
177
177
  'sound.mediaVolume',
178
- 'sound.alarmSound',
179
178
  'sound.reminderAlarmSound',
180
179
  'sound.reminderAlarmTimeout',
181
180
  'sound.allowCustomReminderSounds',
181
+ 'notification.',
182
182
  'sound.ttsEnabled',
183
183
  'sound.ttsRate',
184
- 'notification.',
184
+ 'sound.alarmSound',
185
185
  ],
186
186
  },
187
187
  {
@@ -189,10 +189,11 @@ export const SETTINGS_GROUPS = [
189
189
  labelKey: 'Settings.TimerTitle',
190
190
  icon: 'Timer',
191
191
  keys: [
192
- 'sound.timerVolume',
192
+ 'chronological.timer.',
193
+ 'timer.',
193
194
  'sound.timerAlarmSound',
194
195
  'sound.timerAlarmTimeout',
195
- 'timer.',
196
+ 'sound.timerVolume',
196
197
  ],
197
198
  appMode: 'ENROLLED',
198
199
  },
@@ -241,6 +242,9 @@ export const EXCLUDED_DEVICE_SETTINGS = new Set([
241
242
  'device.id',
242
243
  'device.devMenuEnabled',
243
244
  'device.authWarningDismissTtlDays',
245
+ 'notification.enabled',
246
+ 'notification.notifyAllCalendars',
247
+ 'notification.enabledCalendarIds',
244
248
  'notification.hasBeenPrompted',
245
249
  ]);
246
250
  /**
@@ -466,6 +470,31 @@ export const SETTINGS_LABELS = {
466
470
  function matchesGroup(key, group) {
467
471
  return group.keys.some((matcher) => key === matcher || (matcher.endsWith('.') && key.startsWith(matcher)));
468
472
  }
473
+ /** Return the index of the first matching key pattern in the group, for sorting. */
474
+ function groupKeyIndex(key, keys) {
475
+ for (let i = 0; i < keys.length; i++) {
476
+ const matcher = keys[i];
477
+ if (key === matcher || (matcher.endsWith('.') && key.startsWith(matcher))) {
478
+ return i;
479
+ }
480
+ }
481
+ return keys.length;
482
+ }
483
+ /**
484
+ * Lazy-initialized map from setting key → declaration index in buildEntries.
485
+ * Used as a tiebreaker when multiple keys share the same prefix group index.
486
+ */
487
+ let _registryKeyOrder;
488
+ function registryKeyOrder() {
489
+ if (!_registryKeyOrder) {
490
+ _registryKeyOrder = new Map();
491
+ const keys = Object.keys(buildEntries(DEFAULT_REGISTRY_CONFIG));
492
+ for (let i = 0; i < keys.length; i++) {
493
+ _registryKeyOrder.set(keys[i], i);
494
+ }
495
+ }
496
+ return _registryKeyOrder;
497
+ }
469
498
  /**
470
499
  * Group parsed setting entries into user-facing groups matching the mobile
471
500
  * app's settings menu structure.
@@ -486,6 +515,14 @@ export function groupSettingsForDevice(allSettings, calendarType, appMode) {
486
515
  if (!isChronological && s.key.startsWith('chronologicalEventForm.')) {
487
516
  return false;
488
517
  }
518
+ // Per-setting calendar type restriction
519
+ if (s.calendarType && s.calendarType !== calendarType) {
520
+ return false;
521
+ }
522
+ // Per-setting app mode restriction
523
+ if (s.appMode && s.appMode !== appMode) {
524
+ return false;
525
+ }
489
526
  return true;
490
527
  });
491
528
  const claimed = new Set();
@@ -503,6 +540,17 @@ export function groupSettingsForDevice(allSettings, calendarType, appMode) {
503
540
  if (matched.length === 0) {
504
541
  continue;
505
542
  }
543
+ // Sort matched settings by the order defined in group.keys,
544
+ // with registry declaration order as tiebreaker for prefix matches
545
+ const order = registryKeyOrder();
546
+ matched.sort((a, b) => {
547
+ const aIdx = groupKeyIndex(a.key, group.keys);
548
+ const bIdx = groupKeyIndex(b.key, group.keys);
549
+ if (aIdx !== bIdx) {
550
+ return aIdx - bIdx;
551
+ }
552
+ return (order.get(a.key) ?? Infinity) - (order.get(b.key) ?? Infinity);
553
+ });
506
554
  for (const s of matched) {
507
555
  claimed.add(s.key);
508
556
  }
@@ -546,7 +594,7 @@ const ALARM_TIMEOUT_OPTIONS = [
546
594
  const DAY_VIEW_ZOOM_OPTIONS = [
547
595
  { value: 15, labelKey: 'Settings.Option.DayViewZoom.15min' },
548
596
  { value: 30, labelKey: 'Settings.Option.DayViewZoom.30min' },
549
- { value: 60, labelKey: 'Settings.Option.DayViewZoom.60min' },
597
+ { value: 60, labelKey: 'Settings.Option.DayViewZoom.1hour' },
550
598
  ];
551
599
  const TIME_OF_DAY_SLIDER = { min: 0, max: 23, step: 1 };
552
600
  // ---------------------------------------------------------------------------
@@ -566,6 +614,12 @@ function def(category, type, defaultValue, uiType, extra) {
566
614
  if (extra?.sliderConfig) {
567
615
  result.sliderConfig = extra.sliderConfig;
568
616
  }
617
+ if (extra?.appMode) {
618
+ result.appMode = extra.appMode;
619
+ }
620
+ if (extra?.calendarType) {
621
+ result.calendarType = extra.calendarType;
622
+ }
569
623
  return result;
570
624
  }
571
625
  // ---------------------------------------------------------------------------
@@ -588,8 +642,9 @@ function buildEntries(config) {
588
642
  { value: 'digital', labelKey: 'Settings.Option.ClockType.Digital' },
589
643
  { value: 'analog', labelKey: 'Settings.Option.ClockType.Analog' },
590
644
  ],
645
+ appMode: 'ENROLLED',
591
646
  }),
592
- 'appearance.enableDayColors': def('appearance', 'boolean', false, 'TOGGLE'),
647
+ 'appearance.enableDayColors': def('appearance', 'boolean', false, 'TOGGLE', { calendarType: 'chronological' }),
593
648
  // ═══════════════════════════════════════════════════════════════════════
594
649
  // Calendar view
595
650
  // ═══════════════════════════════════════════════════════════════════════
@@ -631,8 +686,8 @@ function buildEntries(config) {
631
686
  },
632
687
  ],
633
688
  }),
634
- 'calendarView.dayViewZoom': def('calendarView', 'number', 60, 'SELECT', { options: DAY_VIEW_ZOOM_OPTIONS }),
635
- 'calendarView.weekViewZoom': def('calendarView', 'number', 60, 'SELECT', { options: DAY_VIEW_ZOOM_OPTIONS }),
689
+ 'calendarView.dayViewZoom': def('calendarView', 'number', 60, 'SELECT', { options: DAY_VIEW_ZOOM_OPTIONS, calendarType: 'time-based' }),
690
+ 'calendarView.weekViewZoom': def('calendarView', 'number', 60, 'SELECT', { options: DAY_VIEW_ZOOM_OPTIONS, calendarType: 'time-based' }),
636
691
  'calendarView.splitView': def('calendarView', 'boolean', false, 'TOGGLE'),
637
692
  'calendarView.showCalendarNames': def('calendarView', 'boolean', true, 'TOGGLE'),
638
693
  'calendarView.calendarColumns': def('calendarView', 'json', [], 'CUSTOM_SPLIT_VIEW_CONFIG'),
@@ -645,10 +700,10 @@ function buildEntries(config) {
645
700
  // Event form field visibility (time-based)
646
701
  // ═══════════════════════════════════════════════════════════════════════
647
702
  'eventForm.recurrence': def('eventForm', 'boolean', true, 'TOGGLE'),
648
- 'eventForm.reminders': def('eventForm', 'boolean', true, 'TOGGLE'),
649
- 'eventForm.emailReminders': def('eventForm', 'boolean', false, 'TOGGLE'),
650
703
  'eventForm.location': def('eventForm', 'boolean', true, 'TOGGLE'),
651
704
  'eventForm.travelTime': def('eventForm', 'boolean', false, 'TOGGLE'),
705
+ 'eventForm.reminders': def('eventForm', 'boolean', true, 'TOGGLE'),
706
+ 'eventForm.emailReminders': def('eventForm', 'boolean', false, 'TOGGLE'),
652
707
  'eventForm.description': def('eventForm', 'boolean', true, 'TOGGLE'),
653
708
  'eventForm.checklist': def('eventForm', 'boolean', true, 'TOGGLE'),
654
709
  'eventForm.images': def('eventForm', 'boolean', false, 'TOGGLE'),
@@ -659,16 +714,16 @@ function buildEntries(config) {
659
714
  // Sound & alerts
660
715
  // ═══════════════════════════════════════════════════════════════════════
661
716
  'sound.timerVolume': def('sound', 'number', 0.5, 'VOLUME_SLIDER'),
662
- 'sound.reminderVolume': def('sound', 'number', 0.5, 'VOLUME_SLIDER'),
663
- 'sound.mediaVolume': def('sound', 'number', 0.5, 'VOLUME_SLIDER'),
717
+ 'sound.reminderVolume': def('sound', 'number', 0.5, 'VOLUME_SLIDER', { appMode: 'ENROLLED' }),
718
+ 'sound.mediaVolume': def('sound', 'number', 0.5, 'VOLUME_SLIDER', { appMode: 'ENROLLED' }),
664
719
  'sound.alarmSound': def('sound', 'string', 'alarm1', 'SELECT', { options: ALARM_SOUND_OPTIONS }),
665
720
  'sound.reminderAlarmSound': def('sound', 'string', 'alarm1', 'SELECT', { options: ALARM_SOUND_OPTIONS }),
666
721
  'sound.timerAlarmSound': def('sound', 'string', 'alarm1', 'SELECT', { options: ALARM_SOUND_OPTIONS }),
667
722
  'sound.timerAlarmTimeout': def('sound', 'number', 3, 'SELECT', { options: ALARM_TIMEOUT_OPTIONS }),
668
723
  'sound.reminderAlarmTimeout': def('sound', 'number', 3, 'SELECT', { options: ALARM_TIMEOUT_OPTIONS }),
669
724
  'sound.allowCustomReminderSounds': def('sound', 'boolean', false, 'TOGGLE'),
670
- 'sound.ttsEnabled': def('sound', 'boolean', config.isEnrolled, 'TOGGLE'),
671
- 'sound.ttsRate': def('sound', 'number', 1.0, 'SLIDER', { sliderConfig: { min: 0.5, max: 2, step: 0.1 } }),
725
+ 'sound.ttsEnabled': def('sound', 'boolean', config.isEnrolled, 'TOGGLE', { appMode: 'ENROLLED' }),
726
+ 'sound.ttsRate': def('sound', 'number', 1.0, 'SLIDER', { sliderConfig: { min: 0.5, max: 2, step: 0.1 }, appMode: 'ENROLLED' }),
672
727
  // ═══════════════════════════════════════════════════════════════════════
673
728
  // Timer
674
729
  // ═══════════════════════════════════════════════════════════════════════
@@ -679,7 +734,6 @@ function buildEntries(config) {
679
734
  // ═══════════════════════════════════════════════════════════════════════
680
735
  // Lock screen
681
736
  // ═══════════════════════════════════════════════════════════════════════
682
- 'lockScreen.pin': def('lockScreen', 'string', '', 'PIN_INPUT'),
683
737
  'lockScreen.inactivityLockEnabled': def('lockScreen', 'boolean', false, 'TOGGLE'),
684
738
  'lockScreen.inactivityTimeoutMinutes': def('lockScreen', 'number', 5, 'SELECT', {
685
739
  options: [
@@ -691,6 +745,7 @@ function buildEntries(config) {
691
745
  { value: 45, labelKey: 'Settings.Option.InactivityTimeout.45min' },
692
746
  ],
693
747
  }),
748
+ 'lockScreen.pin': def('lockScreen', 'string', '', 'PIN_INPUT'),
694
749
  'lockScreen.clockDisplay': def('lockScreen', 'string', 'digital', 'SELECT', {
695
750
  options: [
696
751
  { value: 'none', labelKey: 'Settings.Option.ClockDisplay.None' },
@@ -704,8 +759,8 @@ function buildEntries(config) {
704
759
  },
705
760
  ],
706
761
  }),
707
- 'lockScreen.showDate': def('lockScreen', 'boolean', true, 'TOGGLE'),
708
762
  'lockScreen.showHourNumbers': def('lockScreen', 'boolean', true, 'TOGGLE'),
763
+ 'lockScreen.showDate': def('lockScreen', 'boolean', true, 'TOGGLE'),
709
764
  'lockScreen.imageMode': def('lockScreen', 'string', 'none', 'SELECT', {
710
765
  options: [
711
766
  { value: 'none', labelKey: 'Settings.Option.ImageMode.None' },
@@ -720,7 +775,6 @@ function buildEntries(config) {
720
775
  ],
721
776
  }),
722
777
  'lockScreen.backgroundImage': def('lockScreen', 'json', null, 'CUSTOM_IMAGE'),
723
- 'lockScreen.photoFrameImages': def('lockScreen', 'json', [], 'CUSTOM_IMAGE_ARRAY'),
724
778
  'lockScreen.photoFrameIntervalSeconds': def('lockScreen', 'number', 60, 'SELECT', {
725
779
  options: [
726
780
  { value: 30, labelKey: 'Settings.Option.PhotoFrameInterval.30sec' },
@@ -729,6 +783,7 @@ function buildEntries(config) {
729
783
  { value: 300, labelKey: 'Settings.Option.PhotoFrameInterval.5min' },
730
784
  ],
731
785
  }),
786
+ 'lockScreen.photoFrameImages': def('lockScreen', 'json', [], 'CUSTOM_IMAGE_ARRAY'),
732
787
  // ═══════════════════════════════════════════════════════════════════════
733
788
  // Touch / gestures
734
789
  // ═══════════════════════════════════════════════════════════════════════
@@ -770,8 +825,8 @@ function buildEntries(config) {
770
825
  // ═══════════════════════════════════════════════════════════════════════
771
826
  // Header
772
827
  'chronological.header.showNavigationArrows': def('chronological', 'boolean', true, 'TOGGLE'),
773
- 'chronological.header.showClock': def('chronological', 'boolean', true, 'TOGGLE'),
774
828
  'chronological.header.showCurrentYearInDate': def('chronological', 'boolean', false, 'TOGGLE'),
829
+ 'chronological.header.showClock': def('chronological', 'boolean', true, 'TOGGLE'),
775
830
  'chronological.header.showTimeOfDay': def('chronological', 'boolean', false, 'TOGGLE'),
776
831
  // Footer
777
832
  'chronological.footer.showMenuButton': def('chronological', 'boolean', true, 'TOGGLE'),
@@ -784,9 +839,9 @@ function buildEntries(config) {
784
839
  // Timer features
785
840
  'chronological.timer.showNewCountdown': def('chronological', 'boolean', true, 'TOGGLE'),
786
841
  'chronological.timer.showFromTemplate': def('chronological', 'boolean', true, 'TOGGLE'),
842
+ 'chronological.timer.showAddTemplate': def('chronological', 'boolean', true, 'TOGGLE'),
787
843
  'chronological.timer.showEditTemplate': def('chronological', 'boolean', true, 'TOGGLE'),
788
844
  'chronological.timer.showDeleteTemplate': def('chronological', 'boolean', true, 'TOGGLE'),
789
- 'chronological.timer.showAddTemplate': def('chronological', 'boolean', true, 'TOGGLE'),
790
845
  // Menu
791
846
  'chronological.menu.showSettingsButton': def('chronological', 'boolean', true, 'TOGGLE'),
792
847
  // Quick settings
@@ -804,18 +859,18 @@ function buildEntries(config) {
804
859
  // ═══════════════════════════════════════════════════════════════════════
805
860
  // Chronological event form
806
861
  // ═══════════════════════════════════════════════════════════════════════
862
+ // Fixed fields
863
+ 'chronologicalEventForm.fixedField.allDay': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
864
+ 'chronologicalEventForm.fixedField.endTime': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
865
+ 'chronologicalEventForm.fixedField.visibility': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
807
866
  // Toggleable fields
867
+ 'chronologicalEventForm.field.acknowledge': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
808
868
  'chronologicalEventForm.field.description': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
809
869
  'chronologicalEventForm.field.recurrence': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
810
- 'chronologicalEventForm.field.acknowledge': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
811
870
  'chronologicalEventForm.field.checklist': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
812
871
  'chronologicalEventForm.field.extraImages': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
813
872
  'chronologicalEventForm.field.reminders': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
814
873
  'chronologicalEventForm.field.audioClips': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
815
- // Fixed fields
816
- 'chronologicalEventForm.fixedField.allDay': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
817
- 'chronologicalEventForm.fixedField.endTime': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
818
- 'chronologicalEventForm.fixedField.visibility': def('chronologicalEventForm', 'boolean', true, 'TOGGLE'),
819
874
  // Suggest end time
820
875
  'chronologicalEventForm.suggestEndTime.enabled': def('chronologicalEventForm', 'boolean', false, 'TOGGLE'),
821
876
  'chronologicalEventForm.suggestEndTime.value': def('chronologicalEventForm', 'number', 30, 'SLIDER', { sliderConfig: { min: 5, max: 480, step: 5 } }),
@@ -890,8 +945,22 @@ export class SettingsRegistry {
890
945
  case 'number':
891
946
  return String(value ?? 0);
892
947
  case 'boolean':
948
+ if (typeof value === 'string') {
949
+ return value === 'true' ? 'true' : 'false';
950
+ }
893
951
  return value ? 'true' : 'false';
894
952
  case 'json':
953
+ // If already a serialized JSON string, return as-is to avoid
954
+ // double-wrapping (e.g. JSON.stringify("[]") → "\"[]\"")
955
+ if (typeof value === 'string') {
956
+ try {
957
+ JSON.parse(value);
958
+ return value;
959
+ }
960
+ catch {
961
+ return JSON.stringify(value);
962
+ }
963
+ }
895
964
  return JSON.stringify(value);
896
965
  }
897
966
  }
@@ -910,7 +979,18 @@ export class SettingsRegistry {
910
979
  return (raw === 'true');
911
980
  case 'json':
912
981
  try {
913
- return JSON.parse(raw);
982
+ let result = JSON.parse(raw);
983
+ // Unwrap multiply-escaped JSON strings caused by repeated
984
+ // double-serialization (each push/pull cycle added a layer)
985
+ while (typeof result === 'string') {
986
+ try {
987
+ result = JSON.parse(result);
988
+ }
989
+ catch {
990
+ break;
991
+ }
992
+ }
993
+ return result;
914
994
  }
915
995
  catch {
916
996
  return this.getDefault(key);
@@ -1002,6 +1082,8 @@ export function parseSettingsSnapshot(json, calendarType, registry = defaultRegi
1002
1082
  uiType: entryDef?.uiType ?? 'TEXT_INPUT',
1003
1083
  ...(entryDef?.options && { options: entryDef.options }),
1004
1084
  ...(entryDef?.sliderConfig && { sliderConfig: entryDef.sliderConfig }),
1085
+ ...(entryDef?.appMode && { appMode: entryDef.appMode }),
1086
+ ...(entryDef?.calendarType && { calendarType: entryDef.calendarType }),
1005
1087
  });
1006
1088
  }
1007
1089
  // Determine which categories to show
@@ -1041,6 +1123,45 @@ export function formatSettingValue(value) {
1041
1123
  }
1042
1124
  return String(value);
1043
1125
  }
1126
+ /**
1127
+ * Serialize a settings object (with mixed native types) into a
1128
+ * string-values-only snapshot suitable for pushing to a mobile device.
1129
+ *
1130
+ * Uses the registry's `serialize()` method for known keys so that
1131
+ * booleans become "true"/"false", numbers become digit strings, etc.
1132
+ * Unknown keys are converted with `String(value)`.
1133
+ */
1134
+ export function serializeSettingsSnapshot(settings, registry) {
1135
+ const result = {};
1136
+ for (const [key, value] of Object.entries(settings)) {
1137
+ if (key in registry.entries) {
1138
+ result[key] = registry.serialize(key, value);
1139
+ }
1140
+ else {
1141
+ result[key] = String(value ?? '');
1142
+ }
1143
+ }
1144
+ return result;
1145
+ }
1146
+ /**
1147
+ * Deserialize a settings snapshot (string values from the server/DB) into
1148
+ * native-typed values using the registry.
1149
+ *
1150
+ * This ensures local state always contains native types (boolean, number, etc.)
1151
+ * so that subsequent `serializeSettingsSnapshot` calls produce correct results.
1152
+ */
1153
+ export function deserializeSettingsSnapshot(snapshot, registry = defaultRegistry) {
1154
+ const result = {};
1155
+ for (const [key, value] of Object.entries(snapshot)) {
1156
+ if (typeof value === 'string' && key in registry.entries) {
1157
+ result[key] = registry.deserialize(key, value);
1158
+ }
1159
+ else {
1160
+ result[key] = value;
1161
+ }
1162
+ }
1163
+ return result;
1164
+ }
1044
1165
  // ---------------------------------------------------------------------------
1045
1166
  // Default registry instance (non-enrolled, system theme, nb locale)
1046
1167
  // ---------------------------------------------------------------------------