@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 +47 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +149 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +185 -44
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>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACvD,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,CAAC;AACb,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,YAAY,CAAC;AAC1D,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAC9C,eAAO,MAAM,cAAc,EAAE,YAAY,EAAqB,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GACxB,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,OAAO,GACP,UAAU,CAAC;AACf,MAAM,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACnD,MAAM,MAAM,wBAAwB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACjE,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AACnE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,CAAC;AACvE,MAAM,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;AAC5D,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAMF,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,QAAQ,GACR,eAAe,GACf,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,WAAW,GACX,qBAAqB,GACrB,wBAAwB,GACxB,sBAAsB,GACtB,mBAAmB,GACnB,yBAAyB,GACzB,cAAc,GACd,oBAAoB,GACpB,qBAAqB,GACrB,yBAAyB,GACzB,mBAAmB,GACnB,iCAAiC,GACjC,wBAAwB,GACxB,mBAAmB,GACnB,0BAA0B,GAC1B,QAAQ,CAAC;AAEb,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI;IACvC,uBAAuB;IACvB,KAAK,EAAE,CAAC,CAAC;IACT,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAMF,eAAO,MAAM,mBAAmB,sMAetB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAMpE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAe5D,CAAC;AAMF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAe3D,CAAC;AAMF,4DAA4D;AAC5D,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,gBAAgB,CACA,CAAC;AAEzE,yDAAyD;AACzD,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,gBAAgB,CAC3B,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,YAAY,GACzB,gBAAgB,EAAE,CAgBpB;AAMD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,4KAarB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,8BAA8B;IAC9B,EAAE,EAAE,eAAe,CAAC;IACpB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4DAA4D;IAC5D,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,uDAAuD;IACvD,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,gBAAgB,EA8G7C,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAQvD,CAAC;AAMH,MAAM,MAAM,eAAe,GAAG;IAC5B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAiOrE,CAAC;AAuCF;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,kBAAkB,EAAE,EACjC,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,UAAU,GACnB;IAAE,EAAE,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAA;CAAE,EAAE,CA6E3F;AAMD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAMxE,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC;IACX,yEAAyE;IACzE,IAAI,EAAE,OAAO,CAAC;IACd,mDAAmD;IACnD,MAAM,EAAE,aAAa,CAAC;IACtB,iDAAiD;IACjD,OAAO,CAAC,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,oDAAoD;IACpD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAMF,MAAM,MAAM,cAAc,GAAG;IAC3B,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,yBAAyB;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,0BAA0B;IAC1B,aAAa,EAAE,UAAU,CAAC;CAC3B,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,uBAAuB,EAAE,cAIrC,CAAC;AA8EF,iBAAS,YAAY,CAAC,MAAM,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAquB3C;AAMD,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAEvD,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC;AAE/C,mDAAmD;AACnD,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,UAAU,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAE/E,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG;KACvB,CAAC,IAAI,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;CACnC,CAAC;AAMF,qBAAa,gBAAgB;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAElC,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;gBAEhB,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAMhD,0CAA0C;IAC1C,UAAU,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAIzD,+CAA+C;IAC/C,cAAc,IAAI,WAAW;IAQ7B,0CAA0C;IAC1C,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB;IAI9C,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAIlC,0CAA0C;IAC1C,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,UAAU,EAAE;IAIvD,2DAA2D;IAC3D,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM;IA2BlD,4DAA4D;IAC5D,WAAW,CAAC,CAAC,SAAS,UAAU,EAC9B,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,MAAM,GAAG,IAAI,GACjB,YAAY,CAAC,CAAC,CAAC;IAgClB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAetD;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CASrC;AAMD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,aAAa,CAAC;IACtB,iDAAiD;IACjD,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,oDAAoD;IACpD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,uBAAuB;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,YAAY,CAAC,EAAE,YAAY,EAC3B,QAAQ,GAAE,gBAAkC,GAC3C,mBAAmB,EAAE,CAgEvB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAoBzD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,gBAAgB,GACzB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,GAAE,gBAAkC,GAC3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAMD,eAAO,MAAM,eAAe,kBAAyB,CAAC;AAQtD,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE1E"}
|
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'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
192
|
+
'chronological.timer.',
|
|
193
|
+
'timer.',
|
|
193
194
|
'sound.timerAlarmSound',
|
|
194
195
|
'sound.timerAlarmTimeout',
|
|
195
|
-
'
|
|
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.
|
|
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
|
-
|
|
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
|
// ---------------------------------------------------------------------------
|