iobroker.autism-support 0.2.11 → 0.2.12
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/README.md +4 -0
- package/build/main.js +33 -0
- package/build/main.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +6 -5
- package/widgets/autism-support/assets/DailyScheduleConfigWidget-1_YVYGTh.js +1 -0
- package/widgets/autism-support/assets/DailyScheduleLiveWidget-BPdTrLSm.js +1 -0
- package/widgets/autism-support/assets/DailyScheduleVisual-Cikb1l_S.js +1 -0
- package/widgets/autism-support/assets/VisFileImage-CI2phrqF.js +1 -0
- package/widgets/autism-support/assets/VisualCountdownConfigWidget-DJKvgz-v.js +1 -0
- package/widgets/autism-support/assets/VisualCountdownLiveWidget-QTTeERbz.js +1 -0
- package/widgets/autism-support/assets/VisualCountdownVisual-DsNNd0p5.js +1 -0
- package/widgets/autism-support/assets/WeeklyScheduleLiveWidget-B2O1z93T.js +1 -0
- package/widgets/autism-support/assets/_commonjsHelpers-CqkleIqs.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf-localSharedImportMap___mfe_internal__vis2AutismSupportWidgets__mf_owner__1-CFnUiwP5.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__loadShare__shared-DnWO7M69.js +2 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild___mf_0_emotion_mf_1_react__prebuild__-BAjRK4JE.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild___mf_0_mui_mf_1_material__prebuild__-5ZDN846W.js +221 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild___mf_0_mui_mf_1_private_mf_2_theming__prebuild__-CVkT6aiX.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild__react__prebuild__-CEfrWz49.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild__react_mf_1_jsx_mf_2_dev_mf_2_runtime__prebuild__-Chsqd7zA.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-Cv2HP-9y.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild__react_mf_2_dom__prebuild__-D-m7hbnm.js +1 -0
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__prebuild__react_mf_2_dom_mf_1_client__prebuild__-Cd8vDc61.js +1 -0
- package/widgets/autism-support/assets/createSvgIcon-_KtdxP_v.js +8 -0
- package/widgets/autism-support/assets/emotion-cache.browser.esm-BgJfNZJN.js +1 -0
- package/widgets/autism-support/assets/emotion-utils.browser.esm-gq80zcZX.js +1 -0
- package/widgets/autism-support/assets/helpers-BDGTs9le.js +1 -0
- package/widgets/autism-support/assets/hostInit-DINYqgLv.js +1 -0
- package/widgets/autism-support/assets/index-BtEY87AE.js +1 -0
- package/widgets/autism-support/assets/index-CSdqShjW.js +8 -0
- package/widgets/autism-support/assets/index-PqaR2QpX.js +1 -0
- package/widgets/autism-support/assets/index-hyAkrW6M.js +7 -0
- package/widgets/autism-support/assets/pendingShares-DtjzAsd4.js +2 -0
- package/widgets/autism-support/assets/{weekly-plan-Ctj5UfRj.js → weekly-plan-DsLUEeci.js} +1 -1
- package/widgets/autism-support/customWidgets.js +13 -1
- package/widgets/autism-support/assets/DailyScheduleConfigWidget-BJZr1OiR.js +0 -1
- package/widgets/autism-support/assets/DailyScheduleLiveWidget-B87RgNeC.js +0 -1
- package/widgets/autism-support/assets/DailyScheduleVisual-XyMfLMa5.js +0 -1
- package/widgets/autism-support/assets/VisFileImage-m-esqHa5.js +0 -1
- package/widgets/autism-support/assets/VisualCountdownConfigWidget-Baap_dBa.js +0 -1
- package/widgets/autism-support/assets/VisualCountdownLiveWidget-Dj8ZkeYt.js +0 -1
- package/widgets/autism-support/assets/VisualCountdownVisual-CS9f3y-I.js +0 -1
- package/widgets/autism-support/assets/WeeklyScheduleLiveWidget-Cr5l6X7V.js +0 -1
- package/widgets/autism-support/assets/__virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__1__loadShare__react__loadShare__.js_commonjs-proxy-CKl-C-M8.js +0 -1
- package/widgets/autism-support/assets/_virtual_mf-localSharedImportMap___mfe_internal__vis2AutismSupportWidgets__mf_owner__1-GNpOqpCF.js +0 -1
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__1__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__.js-CrkGlQnf.js +0 -1
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__1__loadShare___mf_0_mui_mf_1_material__loadShare__.js-DB9x_eMJ.js +0 -228
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__1__loadShare__react__loadShare__.js-N44SxUJn.js +0 -1
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__1__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ClXoR1ZQ.js +0 -1
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__1__loadShare__react_mf_2_dom__loadShare__.js-T5xrrjVP.js +0 -8
- package/widgets/autism-support/assets/_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__1__prebuild___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__prebuild__-CQlsFj2g.js +0 -994
- package/widgets/autism-support/assets/hostInit-Mx1Qav0Q.js +0 -1
- package/widgets/autism-support/assets/index-Cg-LdPdj.js +0 -7
- package/widgets/autism-support/assets/virtualExposes-wdVR-WnR.js +0 -1
package/README.md
CHANGED
|
@@ -92,6 +92,10 @@ npm run start
|
|
|
92
92
|
|
|
93
93
|
See [CHANGELOG_OLD.md](CHANGELOG_OLD.md) for older entries.
|
|
94
94
|
|
|
95
|
+
### 0.2.12
|
|
96
|
+
|
|
97
|
+
* Remove leftover Admin sidebar tab that could not be opened
|
|
98
|
+
|
|
95
99
|
### 0.2.11
|
|
96
100
|
|
|
97
101
|
* Latest repository review fixes: English package description, translations, remove unused custom config, responsive admin tabs
|
package/build/main.js
CHANGED
|
@@ -77,6 +77,10 @@ class AutismSupport extends utils.Adapter {
|
|
|
77
77
|
if (this.isStartupCancelled(runId)) {
|
|
78
78
|
return;
|
|
79
79
|
}
|
|
80
|
+
await this.removeLegacyAdminTab();
|
|
81
|
+
if (this.isStartupCancelled(runId)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
80
84
|
await this.createTimerStates();
|
|
81
85
|
if (this.isStartupCancelled(runId)) {
|
|
82
86
|
return;
|
|
@@ -287,6 +291,35 @@ class AutismSupport extends utils.Adapter {
|
|
|
287
291
|
}
|
|
288
292
|
await this.migrateTimerStateRoles();
|
|
289
293
|
}
|
|
294
|
+
/**
|
|
295
|
+
* Older releases registered a broken Admin sidebar tab (`adminTab` with empty link).
|
|
296
|
+
* io-package no longer defines it, but installed objects may still keep the leftover.
|
|
297
|
+
*/
|
|
298
|
+
async removeLegacyAdminTab() {
|
|
299
|
+
var _a;
|
|
300
|
+
const ids = [`system.adapter.${this.name}`, instanceConfigId(this.namespace)];
|
|
301
|
+
for (const id of ids) {
|
|
302
|
+
const obj = await this.getForeignObjectAsync(id);
|
|
303
|
+
if (!(obj == null ? void 0 : obj.common)) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const common = obj.common;
|
|
307
|
+
let changed = false;
|
|
308
|
+
if (common.adminTab !== void 0) {
|
|
309
|
+
delete common.adminTab;
|
|
310
|
+
changed = true;
|
|
311
|
+
}
|
|
312
|
+
if (((_a = common.adminUI) == null ? void 0 : _a.tab) !== void 0) {
|
|
313
|
+
delete common.adminUI.tab;
|
|
314
|
+
changed = true;
|
|
315
|
+
}
|
|
316
|
+
if (!changed) {
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
await this.setForeignObjectAsync(id, obj);
|
|
320
|
+
this.log.info(`Removed legacy Admin sidebar tab from ${id}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
290
323
|
/**
|
|
291
324
|
* Earlier versions used extendObject() for system.adapter.* which ioBroker resolves
|
|
292
325
|
* relative to the instance namespace (autism-support.0.system.adapter...).
|
package/build/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n * ioBroker.autism-support \u2013 Visual Countdown + Daily Schedule\n */\n\nimport * as utils from \"@iobroker/adapter-core\";\nimport { TimerManager } from \"./lib/timer-manager\";\nimport {\n\tdayPeriodsFromConfig,\n\tfindCurrentPeriod,\n\tparseTimeToMinutes,\n\ttype DayPeriodDefinition,\n} from \"./lib/day-periods\";\nimport { findCurrentItemIndex, isPlanFullyExpired, parseSchedulePlan, type SchedulePlan } from \"./lib/schedule-types\";\nimport {\n\tADAPTER_LIBRARY_FILE,\n\tPICTOGRAM_DIR,\n\tPICTOGRAM_FILE_ADAPTER,\n\tPICTOGRAM_PLACEHOLDER_FILE,\n\tLEGACY_VIS_LIBRARY_FILE,\n\temptyLibrary,\n\tisIgnoredPictogramFile,\n\tlibraryFromNativeRows,\n\tmatchesPictogramKey,\n\tmergePictogramSources,\n\tnormalizeTags,\n\tparseLibrary,\n\tpictogramPublicUrl,\n\tpictogramStoragePath,\n\tsyncCustomPictogramRows,\n\tuniquePictogramFilename,\n\ttype CustomPictogram,\n\ttype PictogramLibrary,\n} from \"./lib/pictogram-library\";\nimport {\n\tapplyWeeklyPlanRowsToLibrary,\n\tcreateEmptyWeeklyPlan,\n\tparseWeeklyPlan,\n\tparseWeeklyPlansLibrary,\n\tschedulePlansEqual,\n\tweekdayColorsFromConfig,\n\tweekdayKeyFromDate,\n\tweeklyPlanRowsFromLibrary,\n\ttype WeekdayColors,\n\ttype WeekdayKey,\n\ttype WeeklyPlanData,\n\ttype WeeklyPlansLibrary,\n} from \"./lib/weekly-plan\";\n\nconst TIMER_CHANNEL = \"timer\";\nconst SCHEDULE_CHANNEL = \"schedule\";\n\nfunction instanceConfigId(namespace: string): string {\n\treturn `system.adapter.${namespace}`;\n}\n\nfunction legacyMisplacedInstanceConfigId(namespace: string): string {\n\treturn `${namespace}.system.adapter.${namespace}`;\n}\n\nfunction nativeConfigEquals(left: unknown, right: unknown): boolean {\n\treturn JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n}\n\nfunction secondsToParts(totalSeconds: number): { hours: number; minutes: number } {\n\tconst safe = Math.max(0, Math.round(totalSeconds));\n\treturn {\n\t\thours: Math.floor(safe / 3600),\n\t\tminutes: Math.floor((safe % 3600) / 60),\n\t};\n}\n\nclass AutismSupport extends utils.Adapter {\n\tprivate timerManager: TimerManager | null = null;\n\tprivate scheduleTick: ioBroker.Interval | undefined | null = null;\n\tprivate dayPeriods: DayPeriodDefinition[] = [];\n\tprivate weekdayColors: WeekdayColors = weekdayColorsFromConfig({} as ioBroker.AdapterConfig);\n\tprivate lastAppliedWeekday: WeekdayKey | null = null;\n\tprivate readyRunId = 0;\n\n\tpublic constructor(options: Partial<utils.AdapterOptions> = {}) {\n\t\tsuper({\n\t\t\t...options,\n\t\t\tname: \"autism-support\",\n\t\t});\n\t\tthis.on(\"ready\", this.onReady.bind(this));\n\t\tthis.on(\"stateChange\", this.onStateChange.bind(this));\n\t\tthis.on(\"message\", this.onMessage.bind(this));\n\t\tthis.on(\"unload\", this.onUnload.bind(this));\n\t}\n\n\tprivate isStartupCancelled(runId: number): boolean {\n\t\treturn runId !== this.readyRunId;\n\t}\n\n\tprivate async onReady(): Promise<void> {\n\t\tconst runId = ++this.readyRunId;\n\t\ttry {\n\t\t\tconst maxHours = this.config.maxDurationHours ?? 24;\n\t\t\tconst defaultSeconds = this.getDefaultDurationSeconds(maxHours);\n\t\t\tthis.dayPeriods = dayPeriodsFromConfig(this.config);\n\t\t\tthis.weekdayColors = weekdayColorsFromConfig(this.config);\n\n\t\t\tawait this.migrateMisplacedInstanceConfig();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.createTimerStates();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.ensurePictogramStore();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Refresh in memory only \u2014 writing system.adapter native on boot triggers adapter restart.\n\t\t\tawait this.refreshCustomPictogramsFromFiles();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.createScheduleStates();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Only apply Admin name/delete edits when the table already lists plans (avoid wiping on first boot).\n\t\t\tif (Array.isArray(this.config.weeklyPlanRows) && this.config.weeklyPlanRows.length > 0) {\n\t\t\t\tawait this.applyWeeklyPlanRowsFromConfig();\n\t\t\t}\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst timerManager = new TimerManager(\n\t\t\t\tasync snapshot => {\n\t\t\t\t\tawait this.publishTimerSnapshot(snapshot);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsetInterval: (handler, ms) => this.setInterval(handler, ms),\n\t\t\t\t\tclearInterval: handle => this.clearInterval(handle as ioBroker.Interval),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tawait timerManager.setDuration(defaultSeconds, maxHours);\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\ttimerManager.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.timerManager = timerManager;\n\t\t\tawait this.publishTimerSnapshot(timerManager.getSnapshot());\n\t\t\tawait this.publishScheduleRuntime();\n\n\t\t\tthis.subscribeStates(`${this.namespace}.${TIMER_CHANNEL}.*`);\n\t\t\tthis.subscribeStates(`${this.namespace}.${SCHEDULE_CHANNEL}.*`);\n\n\t\t\tif (!this.isStartupCancelled(runId)) {\n\t\t\t\tthis.scheduleTick = this.setInterval(() => {\n\t\t\t\t\tvoid this.publishScheduleRuntime();\n\t\t\t\t}, 30_000);\n\t\t\t}\n\n\t\t\tthis.log.info(\"Autism Support adapter ready \u2013 Visual Countdown + Weekly Schedule\");\n\t\t} catch (error) {\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.log.error(`Startup failed: ${(error as Error).message}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Write instance native config only when changed \u2014 avoids restart loop on every boot.\n\t *\n\t * @param patch Native fields to compare and optionally write.\n\t */\n\tprivate async patchInstanceNativeIfChanged(\n\t\tpatch: Partial<Pick<ioBroker.AdapterConfig, \"customPictograms\" | \"weeklyPlanRows\">>,\n\t): Promise<boolean> {\n\t\tconst id = instanceConfigId(this.namespace);\n\t\tconst current = await this.getForeignObjectAsync(id);\n\t\tconst currentNative = (current?.native || {}) as Partial<ioBroker.AdapterConfig>;\n\t\tconst nextNative: Partial<ioBroker.AdapterConfig> = {};\n\t\tlet changed = false;\n\n\t\tfor (const key of Object.keys(patch) as Array<\"customPictograms\" | \"weeklyPlanRows\">) {\n\t\t\tconst value = patch[key];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!nativeConfigEquals(currentNative[key], value)) {\n\t\t\t\tnextNative[key] = value;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!changed) {\n\t\t\treturn false;\n\t\t}\n\n\t\tawait this.extendForeignObjectAsync(id, { native: nextNative });\n\t\treturn true;\n\t}\n\n\tprivate getDefaultDurationSeconds(maxHours: number): number {\n\t\tconst hours = Math.min(maxHours, Math.max(0, this.config.defaultDurationHours ?? 1));\n\t\tconst minutes = Math.min(59, Math.max(0, this.config.defaultDurationMinutes ?? 0));\n\t\tconst total = hours * 3600 + minutes * 60;\n\t\treturn Math.max(60, Math.min(maxHours * 3600, total));\n\t}\n\n\tprivate async createTimerStates(): Promise<void> {\n\t\tawait this.setObjectNotExistsAsync(TIMER_CHANNEL, {\n\t\t\ttype: \"channel\",\n\t\t\tcommon: { name: \"Visual Countdown\" },\n\t\t\tnative: {},\n\t\t});\n\n\t\tconst states: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\ttype: \"number\" | \"boolean\";\n\t\t\t\trole: string;\n\t\t\t\tname: string;\n\t\t\t\tread: boolean;\n\t\t\t\twrite: boolean;\n\t\t\t\tunit?: string;\n\t\t\t\tmin?: number;\n\t\t\t\tmax?: number;\n\t\t\t}\n\t\t> = {\n\t\t\tduration: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"level.timer\",\n\t\t\t\tname: \"Timer duration (seconds)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tunit: \"s\",\n\t\t\t\tmin: 60,\n\t\t\t\tmax: 86400,\n\t\t\t},\n\t\t\tremaining: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value.timer\",\n\t\t\t\tname: \"Timer remaining (seconds)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tunit: \"s\",\n\t\t\t},\n\t\t\telapsed: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value.timer\",\n\t\t\t\tname: \"Timer elapsed (seconds)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tunit: \"s\",\n\t\t\t},\n\t\t\trunning: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"indicator\",\n\t\t\t\tname: \"Timer running\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tpaused: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"indicator\",\n\t\t\t\tname: \"Timer paused\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tfinished: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"indicator\",\n\t\t\t\tname: \"Timer finished\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tstart: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.start\",\n\t\t\t\tname: \"Start timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tpause: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.pause\",\n\t\t\t\tname: \"Pause timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tresume: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.start\",\n\t\t\t\tname: \"Resume timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tstop: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.stop\",\n\t\t\t\tname: \"Stop timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tsetDurationHours: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"level\",\n\t\t\t\tname: \"Set timer duration (hours)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tunit: \"h\",\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 24,\n\t\t\t},\n\t\t\tsetDurationMinutes: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"level\",\n\t\t\t\tname: \"Set timer duration (minutes)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tunit: \"min\",\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 59,\n\t\t\t},\n\t\t};\n\n\t\tfor (const [id, def] of Object.entries(states)) {\n\t\t\tawait this.setObjectNotExistsAsync(`${TIMER_CHANNEL}.${id}`, {\n\t\t\t\ttype: \"state\",\n\t\t\t\tcommon: {\n\t\t\t\t\tname: def.name,\n\t\t\t\t\ttype: def.type,\n\t\t\t\t\trole: def.role,\n\t\t\t\t\tread: def.read,\n\t\t\t\t\twrite: def.write,\n\t\t\t\t\tunit: def.unit,\n\t\t\t\t\tmin: def.min,\n\t\t\t\t\tmax: def.max,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t}\n\n\t\tawait this.migrateTimerStateRoles();\n\t}\n\n\t/**\n\t * Earlier versions used extendObject() for system.adapter.* which ioBroker resolves\n\t * relative to the instance namespace (autism-support.0.system.adapter...).\n\t */\n\tprivate async migrateMisplacedInstanceConfig(): Promise<void> {\n\t\tconst legacyId = legacyMisplacedInstanceConfigId(this.namespace);\n\t\tconst legacy = await this.getObjectAsync(legacyId);\n\t\tif (!legacy?.native) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst native = legacy.native as {\n\t\t\tcustomPictograms?: ioBroker.AdapterConfig[\"customPictograms\"];\n\t\t\tweeklyPlanRows?: ioBroker.AdapterConfig[\"weeklyPlanRows\"];\n\t\t};\n\t\tconst patch: Partial<ioBroker.AdapterConfig> = {};\n\t\tif (Array.isArray(native.customPictograms)) {\n\t\t\tpatch.customPictograms = native.customPictograms;\n\t\t}\n\t\tif (Array.isArray(native.weeklyPlanRows)) {\n\t\t\tpatch.weeklyPlanRows = native.weeklyPlanRows;\n\t\t}\n\t\tif (Object.keys(patch).length) {\n\t\t\tawait this.patchInstanceNativeIfChanged(patch);\n\t\t\tif (patch.customPictograms) {\n\t\t\t\tthis.config.customPictograms = patch.customPictograms;\n\t\t\t}\n\t\t\tif (patch.weeklyPlanRows) {\n\t\t\t\tthis.config.weeklyPlanRows = patch.weeklyPlanRows;\n\t\t\t}\n\t\t\tthis.log.info(`Migrated instance native config from misplaced object ${legacyId}`);\n\t\t}\n\n\t\tawait this.delObjectAsync(legacyId);\n\t\tfor (const folderId of [`${this.namespace}.system.adapter`, `${this.namespace}.system`]) {\n\t\t\ttry {\n\t\t\t\tawait this.delObjectAsync(folderId);\n\t\t\t} catch {\n\t\t\t\t// folder may not exist or is not empty\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Update roles/read flags on existing timer states (object-structure compliance). */\n\tprivate async migrateTimerStateRoles(): Promise<void> {\n\t\tconst patches: Record<string, { role?: string; read?: boolean }> = {\n\t\t\tduration: { role: \"level.timer\" },\n\t\t\tremaining: { role: \"value.timer\" },\n\t\t\telapsed: { role: \"value.timer\" },\n\t\t\tstart: { read: false },\n\t\t\tpause: { read: false },\n\t\t\tresume: { read: false },\n\t\t\tstop: { read: false },\n\t\t};\n\t\tfor (const [id, patch] of Object.entries(patches)) {\n\t\t\tconst common: Partial<ioBroker.StateCommon> = {};\n\t\t\tif (patch.role) {\n\t\t\t\tcommon.role = patch.role;\n\t\t\t}\n\t\t\tif (patch.read !== undefined) {\n\t\t\t\tcommon.read = patch.read;\n\t\t\t}\n\t\t\tawait this.extendObjectAsync(`${TIMER_CHANNEL}.${id}`, { common });\n\t\t}\n\t}\n\n\tprivate async createScheduleStates(): Promise<void> {\n\t\tawait this.setObjectNotExistsAsync(SCHEDULE_CHANNEL, {\n\t\t\ttype: \"channel\",\n\t\t\tcommon: { name: \"Daily schedule\" },\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.plan`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Schedule plan (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: JSON.stringify({ version: 1, items: [] }),\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.periods`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Day periods from admin (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.periodOverrides`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Day period on/off overrides from schedule config (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: \"{}\",\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.nowMinutes`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Minutes since midnight (local)\",\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tunit: \"min\",\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 1439,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.currentPeriod`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Current day period id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"text\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.currentItemIndex`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Index of active schedule item (-1 = none)\",\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tmin: -1,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.clearAfterLast`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Clear plan automatically after last pictogram ends\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"switch\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.pictogramLibrary`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Custom pictogram library (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.weeklyPlan`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Active weekly plan (JSON, Mon\u2013Sun)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: JSON.stringify(createEmptyWeeklyPlan()),\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Saved weekly plans library (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: JSON.stringify({ version: 1, activeId: null, plans: [] }),\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Load daily plan from active weekly plan each day\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"switch\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.weekdayColors`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Weekday background colors from admin (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tconst planState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.plan`);\n\t\tif (planState?.val == null || planState.val === \"\") {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify({ version: 1, items: [] }), true);\n\t\t}\n\t\tconst overridesState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.periodOverrides`);\n\t\tif (overridesState?.val == null || overridesState.val === \"\") {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periodOverrides`, \"{}\", true);\n\t\t}\n\t\tconst clearAfterState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.clearAfterLast`);\n\t\tif (clearAfterState?.val == null) {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.clearAfterLast`, false, true);\n\t\t}\n\t\tconst loadDailyState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`);\n\t\tif (loadDailyState?.val == null) {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`, false, true);\n\t\t}\n\n\t\tconst weeklyState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlan`);\n\t\tif (weeklyState?.val == null || weeklyState.val === \"\") {\n\t\t\tconst seed = parseSchedulePlan(planState?.val);\n\t\t\tawait this.setState(\n\t\t\t\t`${SCHEDULE_CHANNEL}.weeklyPlan`,\n\t\t\t\tJSON.stringify(createEmptyWeeklyPlan(seed.items.length ? seed : undefined)),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\t\tconst libraryState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`);\n\t\tif (libraryState?.val == null || libraryState.val === \"\") {\n\t\t\tawait this.setState(\n\t\t\t\t`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`,\n\t\t\t\tJSON.stringify({ version: 1, activeId: null, plans: [] }),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\t// Publish admin period definitions once at start (times/colors); overrides stay separate.\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periods`, JSON.stringify(this.dayPeriods), true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weekdayColors`, JSON.stringify(this.weekdayColors), true);\n\t\tawait this.publishPictogramLibrary();\n\t}\n\n\tprivate async buildCustomPictogramRows(): Promise<Array<{ file: string; label: string; tags: string }>> {\n\t\tconst files = await this.listPictogramFiles();\n\t\treturn syncCustomPictogramRows(files || [], this.config.customPictograms);\n\t}\n\n\tprivate async refreshCustomPictogramsFromFiles(): Promise<void> {\n\t\tconst rows = await this.buildCustomPictogramRows();\n\t\tthis.config.customPictograms = rows;\n\t\tawait this.publishPictogramLibrary();\n\t}\n\n\tprivate async syncCustomPictogramsConfig(): Promise<void> {\n\t\tconst rows = await this.buildCustomPictogramRows();\n\t\tawait this.patchInstanceNativeIfChanged({ customPictograms: rows });\n\t\tthis.config.customPictograms = rows;\n\t\tawait this.publishPictogramLibrary();\n\t}\n\n\tprivate async ensurePictogramStore(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.readFileAsync(this.namespace, ADAPTER_LIBRARY_FILE);\n\t\t} catch {\n\t\t\ttry {\n\t\t\t\tawait this.writeFileAsync(\n\t\t\t\t\tthis.namespace,\n\t\t\t\t\tADAPTER_LIBRARY_FILE,\n\t\t\t\t\tJSON.stringify(emptyLibrary(), null, 2),\n\t\t\t\t);\n\t\t\t\tthis.log.info(`Created adapter pictogram library ${this.namespace}/${ADAPTER_LIBRARY_FILE}`);\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.error(`Could not create adapter pictogram library: ${(error as Error).message}`);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst legacy = await this.readFileAsync(PICTOGRAM_FILE_ADAPTER, LEGACY_VIS_LIBRARY_FILE);\n\t\t\tconst raw = typeof legacy.file === \"string\" ? legacy.file : Buffer.from(legacy.file).toString(\"utf8\");\n\t\t\tconst migrated = parseLibrary(raw);\n\t\t\tif (migrated.items.length) {\n\t\t\t\tawait this.writeFileAsync(this.namespace, ADAPTER_LIBRARY_FILE, JSON.stringify(migrated, null, 2));\n\t\t\t\tthis.log.info(`Migrated pictogram library from vis-2 to ${this.namespace}`);\n\t\t\t}\n\t\t} catch {\n\t\t\t// no legacy library in vis-2\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.unlinkAsync(PICTOGRAM_FILE_ADAPTER, LEGACY_VIS_LIBRARY_FILE);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\n\t\ttry {\n\t\t\tconst hint =\n\t\t\t\t\"Upload pictogram images (PNG, JPEG, GIF, WebP, SVG) here.\\n\" +\n\t\t\t\t'Do not create new folders (the file manager often then shows \"duplicate name\").\\n' +\n\t\t\t\t\"Instead click Upload above and place images in THIS folder.\\n\";\n\t\t\tconst placeholderPath = `${PICTOGRAM_DIR}/${PICTOGRAM_PLACEHOLDER_FILE}`;\n\t\t\tlet needsWrite = true;\n\t\t\ttry {\n\t\t\t\tconst existing = await this.readFileAsync(PICTOGRAM_FILE_ADAPTER, placeholderPath);\n\t\t\t\tconst current =\n\t\t\t\t\ttypeof existing.file === \"string\" ? existing.file : Buffer.from(existing.file).toString(\"utf8\");\n\t\t\t\tneedsWrite = current !== hint;\n\t\t\t} catch {\n\t\t\t\t// file missing\n\t\t\t}\n\t\t\tif (needsWrite) {\n\t\t\t\tawait this.writeFileAsync(PICTOGRAM_FILE_ADAPTER, placeholderPath, hint);\n\t\t\t\tthis.log.info(`Ensured vis-2 pictogram folder ${PICTOGRAM_FILE_ADAPTER}/${PICTOGRAM_DIR}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.error(\n\t\t\t\t`Could not write ${PICTOGRAM_FILE_ADAPTER}/${PICTOGRAM_DIR}/${PICTOGRAM_PLACEHOLDER_FILE}: ${(error as Error).message}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async getPublishedPictogramLibrary(): Promise<PictogramLibrary> {\n\t\treturn mergePictogramSources(\n\t\t\tawait this.getMergedPictogramLibrary(),\n\t\t\tlibraryFromNativeRows(this.config.customPictograms),\n\t\t);\n\t}\n\n\tprivate async publishPictogramLibrary(): Promise<void> {\n\t\tconst library = await this.getPublishedPictogramLibrary();\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.pictogramLibrary`, JSON.stringify(library), true);\n\t}\n\n\tprivate async publishTimerSnapshot(snapshot: {\n\t\tduration: number;\n\t\tremaining: number;\n\t\telapsed: number;\n\t\trunning: boolean;\n\t\tpaused: boolean;\n\t\tfinished: boolean;\n\t}): Promise<void> {\n\t\tawait this.setState(`${TIMER_CHANNEL}.duration`, snapshot.duration, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.remaining`, snapshot.remaining, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.elapsed`, snapshot.elapsed, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.running`, snapshot.running, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.paused`, snapshot.paused, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.finished`, snapshot.finished, true);\n\t}\n\n\tprivate async getPlan(): Promise<SchedulePlan> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.plan`);\n\t\treturn parseSchedulePlan(state?.val);\n\t}\n\n\tprivate async getPeriodOverrides(): Promise<Record<string, boolean>> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.periodOverrides`);\n\t\ttry {\n\t\t\tconst raw = typeof state?.val === \"string\" ? JSON.parse(state.val) : state?.val;\n\t\t\treturn raw && typeof raw === \"object\" ? (raw as Record<string, boolean>) : {};\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tprivate async getEffectivePeriods(): Promise<DayPeriodDefinition[]> {\n\t\tconst overrides = await this.getPeriodOverrides();\n\t\treturn this.dayPeriods.map(period => ({\n\t\t\t...period,\n\t\t\tenabled: overrides[period.id] === undefined ? period.enabled : Boolean(overrides[period.id]),\n\t\t}));\n\t}\n\n\tprivate async getWeeklyPlan(): Promise<WeeklyPlanData> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlan`);\n\t\treturn parseWeeklyPlan(state?.val);\n\t}\n\n\tprivate async getWeeklyPlansLibrary(): Promise<WeeklyPlansLibrary> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`);\n\t\treturn parseWeeklyPlansLibrary(state?.val);\n\t}\n\n\tprivate async syncWeeklyPlansTableToNative(): Promise<void> {\n\t\tconst library = await this.getWeeklyPlansLibrary();\n\t\tconst rows = weeklyPlanRowsFromLibrary(library);\n\t\tawait this.patchInstanceNativeIfChanged({ weeklyPlanRows: rows });\n\t\tthis.config.weeklyPlanRows = rows;\n\t}\n\n\tprivate async applyWeeklyPlanRowsFromConfig(): Promise<void> {\n\t\tconst library = await this.getWeeklyPlansLibrary();\n\t\tconst next = applyWeeklyPlanRowsToLibrary(library, this.config.weeklyPlanRows);\n\t\tif (JSON.stringify(next) !== JSON.stringify(library)) {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`, JSON.stringify(next), true);\n\t\t}\n\t}\n\n\tprivate async maybeApplyWeeklyToDaily(): Promise<void> {\n\t\tconst loadState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`);\n\t\tif (!loadState?.val) {\n\t\t\treturn;\n\t\t}\n\t\tconst weekday = weekdayKeyFromDate(new Date());\n\t\tconst weekly = await this.getWeeklyPlan();\n\t\tconst dayPlan = weekly.days[weekday];\n\t\tconst current = await this.getPlan();\n\t\tif (this.lastAppliedWeekday === weekday && schedulePlansEqual(current, dayPlan)) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify(dayPlan), true);\n\t\tthis.lastAppliedWeekday = weekday;\n\t\tthis.log.debug(`Daily plan loaded from weekly plan (${weekday})`);\n\t}\n\n\tprivate async publishScheduleRuntime(): Promise<void> {\n\t\tawait this.maybeApplyWeeklyToDaily();\n\n\t\tconst now = new Date();\n\t\tconst minutes = now.getHours() * 60 + now.getMinutes();\n\t\tconst periods = await this.getEffectivePeriods();\n\t\tconst period = findCurrentPeriod(minutes, periods);\n\t\tlet plan = await this.getPlan();\n\n\t\tconst clearAfterState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.clearAfterLast`);\n\t\tconst clearAfterLast = Boolean(clearAfterState?.val);\n\t\tif (clearAfterLast && isPlanFullyExpired(plan, minutes, parseTimeToMinutes)) {\n\t\t\tplan = { version: 1, items: [] };\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify(plan), true);\n\t\t\tthis.log.info(\"Schedule plan cleared automatically after last pictogram ended\");\n\t\t}\n\n\t\tconst itemIndex = findCurrentItemIndex(plan, minutes, parseTimeToMinutes);\n\n\t\t// Keep admin period metadata available; do not wipe Config overrides.\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periods`, JSON.stringify(this.dayPeriods), true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weekdayColors`, JSON.stringify(this.weekdayColors), true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.nowMinutes`, minutes, true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.currentPeriod`, period?.id ?? \"\", true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.currentItemIndex`, itemIndex, true);\n\t}\n\n\tprivate async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise<void> {\n\t\tif (!state || state.ack) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (id.startsWith(`${this.namespace}.${SCHEDULE_CHANNEL}.`)) {\n\t\t\tconst localId = id.replace(`${this.namespace}.${SCHEDULE_CHANNEL}.`, \"\");\n\t\t\tif (localId === \"plan\") {\n\t\t\t\tconst plan = parseSchedulePlan(state.val);\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify(plan), true);\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t} else if (localId === \"periodOverrides\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = typeof state.val === \"string\" ? JSON.parse(String(state.val)) : state.val;\n\t\t\t\t\tconst cleaned = raw && typeof raw === \"object\" ? (raw as Record<string, boolean>) : {};\n\t\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periodOverrides`, JSON.stringify(cleaned), true);\n\t\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.log.error(`Invalid periodOverrides: ${(error as Error).message}`);\n\t\t\t\t}\n\t\t\t} else if (localId === \"clearAfterLast\") {\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.clearAfterLast`, Boolean(state.val), true);\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t} else if (localId === \"weeklyPlan\") {\n\t\t\t\tconst weekly = parseWeeklyPlan(state.val);\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weeklyPlan`, JSON.stringify(weekly), true);\n\t\t\t\tthis.lastAppliedWeekday = null;\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t} else if (localId === \"weeklyPlansLibrary\") {\n\t\t\t\tconst library = parseWeeklyPlansLibrary(state.val);\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`, JSON.stringify(library), true);\n\t\t\t\tawait this.syncWeeklyPlansTableToNative();\n\t\t\t} else if (localId === \"loadDailyFromWeekly\") {\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`, Boolean(state.val), true);\n\t\t\t\tthis.lastAppliedWeekday = null;\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.timerManager || !id.startsWith(`${this.namespace}.${TIMER_CHANNEL}.`)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst localId = id.replace(`${this.namespace}.${TIMER_CHANNEL}.`, \"\");\n\t\tconst maxHours = this.config.maxDurationHours ?? 24;\n\n\t\ttry {\n\t\t\tswitch (localId) {\n\t\t\t\tcase \"start\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.start();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.start`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"pause\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.pause();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.pause`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"resume\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.resume();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.resume`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"stop\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.stop();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.stop`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"duration\":\n\t\t\t\t\tif (typeof state.val === \"number\") {\n\t\t\t\t\t\tawait this.timerManager.setDuration(state.val, maxHours);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setDurationHours\":\n\t\t\t\t\tif (typeof state.val === \"number\") {\n\t\t\t\t\t\tawait this.applyDurationParts(Math.round(state.val), undefined, maxHours);\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.setDurationHours`, 0, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setDurationMinutes\":\n\t\t\t\t\tif (typeof state.val === \"number\") {\n\t\t\t\t\t\tawait this.applyDurationParts(undefined, Math.round(state.val), maxHours);\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.setDurationMinutes`, 0, true);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.error(`Timer command failed (${localId}): ${(error as Error).message}`);\n\t\t}\n\t}\n\n\tprivate reply(obj: ioBroker.Message, payload: unknown): void {\n\t\tif (obj.callback) {\n\t\t\tthis.sendTo(obj.from, obj.command, payload, obj.callback);\n\t\t}\n\t}\n\n\tprivate async loadPictogramLibrary(): Promise<PictogramLibrary> {\n\t\ttry {\n\t\t\tconst file = await this.readFileAsync(this.namespace, ADAPTER_LIBRARY_FILE);\n\t\t\tconst raw = typeof file.file === \"string\" ? file.file : Buffer.from(file.file).toString(\"utf8\");\n\t\t\treturn parseLibrary(raw);\n\t\t} catch {\n\t\t\treturn emptyLibrary();\n\t\t}\n\t}\n\n\tprivate async savePictogramLibrary(library: PictogramLibrary): Promise<void> {\n\t\tawait this.writeFileAsync(this.namespace, ADAPTER_LIBRARY_FILE, JSON.stringify(library, null, 2));\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.pictogramLibrary`, JSON.stringify(library), true);\n\t}\n\n\tprivate async listPictogramFiles(): Promise<string[] | null> {\n\t\ttry {\n\t\t\tconst result = await this.readDirAsync(PICTOGRAM_FILE_ADAPTER, PICTOGRAM_DIR);\n\t\t\treturn (result || [])\n\t\t\t\t.filter(entry => !entry.isDir && !isIgnoredPictogramFile(entry.file))\n\t\t\t\t.map(entry => entry.file);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async getMergedPictogramLibrary(): Promise<PictogramLibrary> {\n\t\tconst library = await this.loadPictogramLibrary();\n\t\tconst files = await this.listPictogramFiles();\n\t\tif (!files) {\n\t\t\treturn library;\n\t\t}\n\t\tconst known = new Set(library.items.map(item => item.filename));\n\t\tfor (const filename of files) {\n\t\t\tif (known.has(filename)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlibrary.items.push({\n\t\t\t\tid: filename,\n\t\t\t\tfilename,\n\t\t\t\tpath: pictogramStoragePath(filename),\n\t\t\t\tlabel: filename.replace(/\\.[^.]+$/, \"\").replace(/-\\d+$/, \"\"),\n\t\t\t\ttags: [],\n\t\t\t\toriginalName: filename,\n\t\t\t\tmime: \"\",\n\t\t\t\tuploadedAt: 0,\n\t\t\t});\n\t\t}\n\t\tlibrary.items = library.items.filter(item => files.includes(item.filename));\n\t\tlibrary.items.sort((a, b) => (b.uploadedAt || 0) - (a.uploadedAt || 0));\n\t\treturn library;\n\t}\n\n\t/**\n\t * Custom pictogram library (user-owned images only).\n\t * ARASAAC images must never be uploaded here \u2013 use external IDs only.\n\t *\n\t * @param obj\n\t */\n\tprivate async onMessage(obj: ioBroker.Message): Promise<void> {\n\t\tif (!obj?.command) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tif (obj.command === \"syncPictogramTable\") {\n\t\t\t\tawait this.ensurePictogramStore();\n\t\t\t\tconst rows = await this.buildCustomPictogramRows();\n\t\t\t\tawait this.patchInstanceNativeIfChanged({ customPictograms: rows });\n\t\t\t\tthis.config.customPictograms = rows;\n\t\t\t\tawait this.publishPictogramLibrary();\n\t\t\t\tthis.reply(obj, { ok: true, native: { customPictograms: rows } });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"syncWeeklyPlansTable\") {\n\t\t\t\tconst nativeMsg = obj.message as {\n\t\t\t\t\tweeklyPlanRows?: Array<{ id?: string; name?: string; active?: string }>;\n\t\t\t\t};\n\t\t\t\tif (Array.isArray(nativeMsg?.weeklyPlanRows)) {\n\t\t\t\t\tthis.config.weeklyPlanRows = nativeMsg.weeklyPlanRows;\n\t\t\t\t\tawait this.applyWeeklyPlanRowsFromConfig();\n\t\t\t\t}\n\t\t\t\tawait this.syncWeeklyPlansTableToNative();\n\t\t\t\tconst library = await this.getWeeklyPlansLibrary();\n\t\t\t\tthis.reply(obj, {\n\t\t\t\t\tok: true,\n\t\t\t\t\tnative: { weeklyPlanRows: this.config.weeklyPlanRows || [] },\n\t\t\t\t\tactiveId: library.activeId,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"uploadPictogram\") {\n\t\t\t\tconst payload = obj.message as {\n\t\t\t\t\tfilename?: string;\n\t\t\t\t\tbase64?: string;\n\t\t\t\t\tmime?: string;\n\t\t\t\t\tlabel?: string;\n\t\t\t\t\ttags?: string[] | string;\n\t\t\t\t};\n\t\t\t\tconst originalName = String(payload?.filename || \"image.png\");\n\t\t\t\tconst filename = uniquePictogramFilename(originalName);\n\t\t\t\tconst base64 = String(payload?.base64 || \"\");\n\t\t\t\tif (!base64) {\n\t\t\t\t\tthrow new Error(\"filename and base64 required\");\n\t\t\t\t}\n\t\t\t\tif (!/\\.(png|jpe?g|gif|webp|svg)$/i.test(filename)) {\n\t\t\t\t\tthrow new Error(\"unsupported file type\");\n\t\t\t\t}\n\t\t\t\tconst buffer = Buffer.from(base64.replace(/^data:[^;]+;base64,/, \"\"), \"base64\");\n\t\t\t\tif (!buffer.length) {\n\t\t\t\t\tthrow new Error(\"empty file\");\n\t\t\t\t}\n\t\t\t\tif (buffer.length > 5 * 1024 * 1024) {\n\t\t\t\t\tthrow new Error(\"file too large (max 5 MB)\");\n\t\t\t\t}\n\t\t\t\tconst path = pictogramStoragePath(filename);\n\t\t\t\tawait this.writeFileAsync(PICTOGRAM_FILE_ADAPTER, path, buffer);\n\t\t\t\tconst library = await this.getMergedPictogramLibrary();\n\t\t\t\tconst entry: CustomPictogram = {\n\t\t\t\t\tid: filename,\n\t\t\t\t\tfilename,\n\t\t\t\t\tpath,\n\t\t\t\t\tlabel: String(payload?.label || originalName.replace(/\\.[^.]+$/, \"\")),\n\t\t\t\t\ttags: normalizeTags(payload?.tags),\n\t\t\t\t\toriginalName,\n\t\t\t\t\tmime: String(payload?.mime || \"\"),\n\t\t\t\t\tuploadedAt: Date.now(),\n\t\t\t\t};\n\t\t\t\tlibrary.items = [entry, ...library.items.filter(item => item.filename !== filename)];\n\t\t\t\tawait this.savePictogramLibrary(library);\n\t\t\t\tawait this.syncCustomPictogramsConfig();\n\t\t\t\tthis.log.info(`Custom pictogram stored: ${PICTOGRAM_FILE_ADAPTER}/${path} (${buffer.length} bytes)`);\n\t\t\t\tthis.reply(obj, {\n\t\t\t\t\tok: true,\n\t\t\t\t\tpath,\n\t\t\t\t\turl: pictogramPublicUrl(path),\n\t\t\t\t\titem: entry,\n\t\t\t\t\tlibrary,\n\t\t\t\t\tadapter: PICTOGRAM_FILE_ADAPTER,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"listPictograms\") {\n\t\t\t\tconst library = await this.getPublishedPictogramLibrary();\n\t\t\t\tthis.reply(obj, {\n\t\t\t\t\tok: true,\n\t\t\t\t\tfiles: library.items.map(item => item.filename),\n\t\t\t\t\tlibrary,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"updatePictogram\") {\n\t\t\t\tconst payload = obj.message as {\n\t\t\t\t\tpath?: string;\n\t\t\t\t\tfilename?: string;\n\t\t\t\t\tlabel?: string;\n\t\t\t\t\ttags?: string[] | string;\n\t\t\t\t};\n\t\t\t\tconst key = String(payload?.path || payload?.filename || \"\");\n\t\t\t\tif (!key) {\n\t\t\t\t\tthrow new Error(\"path required\");\n\t\t\t\t}\n\t\t\t\tconst library = await this.getMergedPictogramLibrary();\n\t\t\t\tconst item = library.items.find(entry => matchesPictogramKey(entry, key));\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow new Error(\"pictogram not found\");\n\t\t\t\t}\n\t\t\t\tif (payload.label !== undefined) {\n\t\t\t\t\titem.label = String(payload.label);\n\t\t\t\t}\n\t\t\t\tif (payload.tags !== undefined) {\n\t\t\t\t\titem.tags = normalizeTags(payload.tags);\n\t\t\t\t}\n\t\t\t\tawait this.savePictogramLibrary(library);\n\t\t\t\tthis.reply(obj, { ok: true, item, library });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"deletePictogram\") {\n\t\t\t\tconst payload = obj.message as { path?: string; filename?: string };\n\t\t\t\tconst key = String(payload?.path || payload?.filename || \"\");\n\t\t\t\tif (!key) {\n\t\t\t\t\tthrow new Error(\"path required\");\n\t\t\t\t}\n\t\t\t\tconst library = await this.getMergedPictogramLibrary();\n\t\t\t\tconst item = library.items.find(entry => matchesPictogramKey(entry, key));\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow new Error(\"pictogram not found\");\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait this.unlinkAsync(PICTOGRAM_FILE_ADAPTER, item.path);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.log.warn(`Could not delete pictogram file ${item.path}: ${(error as Error).message}`);\n\t\t\t\t}\n\t\t\t\tlibrary.items = library.items.filter(entry => entry.filename !== item.filename);\n\t\t\t\tawait this.savePictogramLibrary(library);\n\t\t\t\tthis.reply(obj, { ok: true, library });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.error(`Pictogram command ${obj.command} failed: ${(error as Error).message}`);\n\t\t\tthis.reply(obj, { ok: false, error: (error as Error).message });\n\t\t}\n\t}\n\n\tprivate async applyDurationParts(\n\t\thours: number | undefined,\n\t\tminutes: number | undefined,\n\t\tmaxHours: number,\n\t): Promise<void> {\n\t\tif (!this.timerManager) {\n\t\t\treturn;\n\t\t}\n\t\tconst snapshot = this.timerManager.getSnapshot();\n\t\tconst current = secondsToParts(snapshot.duration);\n\t\tconst nextHours = hours ?? current.hours;\n\t\tconst nextMinutes = minutes ?? current.minutes;\n\t\tconst totalSeconds = nextHours * 3600 + nextMinutes * 60;\n\t\tawait this.timerManager.setDuration(totalSeconds, maxHours);\n\t}\n\n\tprivate onUnload(callback: () => void): void {\n\t\tthis.readyRunId++;\n\t\tif (this.scheduleTick !== undefined && this.scheduleTick !== null) {\n\t\t\tthis.clearInterval(this.scheduleTick);\n\t\t\tthis.scheduleTick = null;\n\t\t}\n\t\tthis.timerManager?.destroy();\n\t\tthis.timerManager = null;\n\t\tcallback();\n\t}\n}\n\nif (require.main !== module) {\n\tmodule.exports = (options: Partial<utils.AdapterOptions> | undefined) => new AutismSupport(options);\n} else {\n\t(() => new AutismSupport())();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/*\n * ioBroker.autism-support \u2013 Visual Countdown + Daily Schedule\n */\n\nimport * as utils from \"@iobroker/adapter-core\";\nimport { TimerManager } from \"./lib/timer-manager\";\nimport {\n\tdayPeriodsFromConfig,\n\tfindCurrentPeriod,\n\tparseTimeToMinutes,\n\ttype DayPeriodDefinition,\n} from \"./lib/day-periods\";\nimport { findCurrentItemIndex, isPlanFullyExpired, parseSchedulePlan, type SchedulePlan } from \"./lib/schedule-types\";\nimport {\n\tADAPTER_LIBRARY_FILE,\n\tPICTOGRAM_DIR,\n\tPICTOGRAM_FILE_ADAPTER,\n\tPICTOGRAM_PLACEHOLDER_FILE,\n\tLEGACY_VIS_LIBRARY_FILE,\n\temptyLibrary,\n\tisIgnoredPictogramFile,\n\tlibraryFromNativeRows,\n\tmatchesPictogramKey,\n\tmergePictogramSources,\n\tnormalizeTags,\n\tparseLibrary,\n\tpictogramPublicUrl,\n\tpictogramStoragePath,\n\tsyncCustomPictogramRows,\n\tuniquePictogramFilename,\n\ttype CustomPictogram,\n\ttype PictogramLibrary,\n} from \"./lib/pictogram-library\";\nimport {\n\tapplyWeeklyPlanRowsToLibrary,\n\tcreateEmptyWeeklyPlan,\n\tparseWeeklyPlan,\n\tparseWeeklyPlansLibrary,\n\tschedulePlansEqual,\n\tweekdayColorsFromConfig,\n\tweekdayKeyFromDate,\n\tweeklyPlanRowsFromLibrary,\n\ttype WeekdayColors,\n\ttype WeekdayKey,\n\ttype WeeklyPlanData,\n\ttype WeeklyPlansLibrary,\n} from \"./lib/weekly-plan\";\n\nconst TIMER_CHANNEL = \"timer\";\nconst SCHEDULE_CHANNEL = \"schedule\";\n\nfunction instanceConfigId(namespace: string): string {\n\treturn `system.adapter.${namespace}`;\n}\n\nfunction legacyMisplacedInstanceConfigId(namespace: string): string {\n\treturn `${namespace}.system.adapter.${namespace}`;\n}\n\nfunction nativeConfigEquals(left: unknown, right: unknown): boolean {\n\treturn JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n}\n\nfunction secondsToParts(totalSeconds: number): { hours: number; minutes: number } {\n\tconst safe = Math.max(0, Math.round(totalSeconds));\n\treturn {\n\t\thours: Math.floor(safe / 3600),\n\t\tminutes: Math.floor((safe % 3600) / 60),\n\t};\n}\n\nclass AutismSupport extends utils.Adapter {\n\tprivate timerManager: TimerManager | null = null;\n\tprivate scheduleTick: ioBroker.Interval | undefined | null = null;\n\tprivate dayPeriods: DayPeriodDefinition[] = [];\n\tprivate weekdayColors: WeekdayColors = weekdayColorsFromConfig({} as ioBroker.AdapterConfig);\n\tprivate lastAppliedWeekday: WeekdayKey | null = null;\n\tprivate readyRunId = 0;\n\n\tpublic constructor(options: Partial<utils.AdapterOptions> = {}) {\n\t\tsuper({\n\t\t\t...options,\n\t\t\tname: \"autism-support\",\n\t\t});\n\t\tthis.on(\"ready\", this.onReady.bind(this));\n\t\tthis.on(\"stateChange\", this.onStateChange.bind(this));\n\t\tthis.on(\"message\", this.onMessage.bind(this));\n\t\tthis.on(\"unload\", this.onUnload.bind(this));\n\t}\n\n\tprivate isStartupCancelled(runId: number): boolean {\n\t\treturn runId !== this.readyRunId;\n\t}\n\n\tprivate async onReady(): Promise<void> {\n\t\tconst runId = ++this.readyRunId;\n\t\ttry {\n\t\t\tconst maxHours = this.config.maxDurationHours ?? 24;\n\t\t\tconst defaultSeconds = this.getDefaultDurationSeconds(maxHours);\n\t\t\tthis.dayPeriods = dayPeriodsFromConfig(this.config);\n\t\t\tthis.weekdayColors = weekdayColorsFromConfig(this.config);\n\n\t\t\tawait this.migrateMisplacedInstanceConfig();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.removeLegacyAdminTab();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.createTimerStates();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.ensurePictogramStore();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Refresh in memory only \u2014 writing system.adapter native on boot triggers adapter restart.\n\t\t\tawait this.refreshCustomPictogramsFromFiles();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.createScheduleStates();\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Only apply Admin name/delete edits when the table already lists plans (avoid wiping on first boot).\n\t\t\tif (Array.isArray(this.config.weeklyPlanRows) && this.config.weeklyPlanRows.length > 0) {\n\t\t\t\tawait this.applyWeeklyPlanRowsFromConfig();\n\t\t\t}\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst timerManager = new TimerManager(\n\t\t\t\tasync snapshot => {\n\t\t\t\t\tawait this.publishTimerSnapshot(snapshot);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsetInterval: (handler, ms) => this.setInterval(handler, ms),\n\t\t\t\t\tclearInterval: handle => this.clearInterval(handle as ioBroker.Interval),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tawait timerManager.setDuration(defaultSeconds, maxHours);\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\ttimerManager.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.timerManager = timerManager;\n\t\t\tawait this.publishTimerSnapshot(timerManager.getSnapshot());\n\t\t\tawait this.publishScheduleRuntime();\n\n\t\t\tthis.subscribeStates(`${this.namespace}.${TIMER_CHANNEL}.*`);\n\t\t\tthis.subscribeStates(`${this.namespace}.${SCHEDULE_CHANNEL}.*`);\n\n\t\t\tif (!this.isStartupCancelled(runId)) {\n\t\t\t\tthis.scheduleTick = this.setInterval(() => {\n\t\t\t\t\tvoid this.publishScheduleRuntime();\n\t\t\t\t}, 30_000);\n\t\t\t}\n\n\t\t\tthis.log.info(\"Autism Support adapter ready \u2013 Visual Countdown + Weekly Schedule\");\n\t\t} catch (error) {\n\t\t\tif (this.isStartupCancelled(runId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.log.error(`Startup failed: ${(error as Error).message}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Write instance native config only when changed \u2014 avoids restart loop on every boot.\n\t *\n\t * @param patch Native fields to compare and optionally write.\n\t */\n\tprivate async patchInstanceNativeIfChanged(\n\t\tpatch: Partial<Pick<ioBroker.AdapterConfig, \"customPictograms\" | \"weeklyPlanRows\">>,\n\t): Promise<boolean> {\n\t\tconst id = instanceConfigId(this.namespace);\n\t\tconst current = await this.getForeignObjectAsync(id);\n\t\tconst currentNative = (current?.native || {}) as Partial<ioBroker.AdapterConfig>;\n\t\tconst nextNative: Partial<ioBroker.AdapterConfig> = {};\n\t\tlet changed = false;\n\n\t\tfor (const key of Object.keys(patch) as Array<\"customPictograms\" | \"weeklyPlanRows\">) {\n\t\t\tconst value = patch[key];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!nativeConfigEquals(currentNative[key], value)) {\n\t\t\t\tnextNative[key] = value;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!changed) {\n\t\t\treturn false;\n\t\t}\n\n\t\tawait this.extendForeignObjectAsync(id, { native: nextNative });\n\t\treturn true;\n\t}\n\n\tprivate getDefaultDurationSeconds(maxHours: number): number {\n\t\tconst hours = Math.min(maxHours, Math.max(0, this.config.defaultDurationHours ?? 1));\n\t\tconst minutes = Math.min(59, Math.max(0, this.config.defaultDurationMinutes ?? 0));\n\t\tconst total = hours * 3600 + minutes * 60;\n\t\treturn Math.max(60, Math.min(maxHours * 3600, total));\n\t}\n\n\tprivate async createTimerStates(): Promise<void> {\n\t\tawait this.setObjectNotExistsAsync(TIMER_CHANNEL, {\n\t\t\ttype: \"channel\",\n\t\t\tcommon: { name: \"Visual Countdown\" },\n\t\t\tnative: {},\n\t\t});\n\n\t\tconst states: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\ttype: \"number\" | \"boolean\";\n\t\t\t\trole: string;\n\t\t\t\tname: string;\n\t\t\t\tread: boolean;\n\t\t\t\twrite: boolean;\n\t\t\t\tunit?: string;\n\t\t\t\tmin?: number;\n\t\t\t\tmax?: number;\n\t\t\t}\n\t\t> = {\n\t\t\tduration: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"level.timer\",\n\t\t\t\tname: \"Timer duration (seconds)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tunit: \"s\",\n\t\t\t\tmin: 60,\n\t\t\t\tmax: 86400,\n\t\t\t},\n\t\t\tremaining: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value.timer\",\n\t\t\t\tname: \"Timer remaining (seconds)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tunit: \"s\",\n\t\t\t},\n\t\t\telapsed: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value.timer\",\n\t\t\t\tname: \"Timer elapsed (seconds)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tunit: \"s\",\n\t\t\t},\n\t\t\trunning: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"indicator\",\n\t\t\t\tname: \"Timer running\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tpaused: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"indicator\",\n\t\t\t\tname: \"Timer paused\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tfinished: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"indicator\",\n\t\t\t\tname: \"Timer finished\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tstart: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.start\",\n\t\t\t\tname: \"Start timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tpause: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.pause\",\n\t\t\t\tname: \"Pause timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tresume: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.start\",\n\t\t\t\tname: \"Resume timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tstop: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button.stop\",\n\t\t\t\tname: \"Stop timer\",\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tsetDurationHours: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"level\",\n\t\t\t\tname: \"Set timer duration (hours)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tunit: \"h\",\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 24,\n\t\t\t},\n\t\t\tsetDurationMinutes: {\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"level\",\n\t\t\t\tname: \"Set timer duration (minutes)\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tunit: \"min\",\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 59,\n\t\t\t},\n\t\t};\n\n\t\tfor (const [id, def] of Object.entries(states)) {\n\t\t\tawait this.setObjectNotExistsAsync(`${TIMER_CHANNEL}.${id}`, {\n\t\t\t\ttype: \"state\",\n\t\t\t\tcommon: {\n\t\t\t\t\tname: def.name,\n\t\t\t\t\ttype: def.type,\n\t\t\t\t\trole: def.role,\n\t\t\t\t\tread: def.read,\n\t\t\t\t\twrite: def.write,\n\t\t\t\t\tunit: def.unit,\n\t\t\t\t\tmin: def.min,\n\t\t\t\t\tmax: def.max,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t}\n\n\t\tawait this.migrateTimerStateRoles();\n\t}\n\n\t/**\n\t * Older releases registered a broken Admin sidebar tab (`adminTab` with empty link).\n\t * io-package no longer defines it, but installed objects may still keep the leftover.\n\t */\n\tprivate async removeLegacyAdminTab(): Promise<void> {\n\t\tconst ids = [`system.adapter.${this.name}`, instanceConfigId(this.namespace)];\n\t\tfor (const id of ids) {\n\t\t\tconst obj = await this.getForeignObjectAsync(id);\n\t\t\tif (!obj?.common) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst common = obj.common as ioBroker.AdapterCommon & {\n\t\t\t\tadminTab?: unknown;\n\t\t\t\tadminUI?: { config?: string; tab?: string };\n\t\t\t};\n\t\t\tlet changed = false;\n\t\t\tif (common.adminTab !== undefined) {\n\t\t\t\tdelete common.adminTab;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\tif (common.adminUI?.tab !== undefined) {\n\t\t\t\tdelete common.adminUI.tab;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\tif (!changed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait this.setForeignObjectAsync(id, obj);\n\t\t\tthis.log.info(`Removed legacy Admin sidebar tab from ${id}`);\n\t\t}\n\t}\n\n\t/**\n\t * Earlier versions used extendObject() for system.adapter.* which ioBroker resolves\n\t * relative to the instance namespace (autism-support.0.system.adapter...).\n\t */\n\tprivate async migrateMisplacedInstanceConfig(): Promise<void> {\n\t\tconst legacyId = legacyMisplacedInstanceConfigId(this.namespace);\n\t\tconst legacy = await this.getObjectAsync(legacyId);\n\t\tif (!legacy?.native) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst native = legacy.native as {\n\t\t\tcustomPictograms?: ioBroker.AdapterConfig[\"customPictograms\"];\n\t\t\tweeklyPlanRows?: ioBroker.AdapterConfig[\"weeklyPlanRows\"];\n\t\t};\n\t\tconst patch: Partial<ioBroker.AdapterConfig> = {};\n\t\tif (Array.isArray(native.customPictograms)) {\n\t\t\tpatch.customPictograms = native.customPictograms;\n\t\t}\n\t\tif (Array.isArray(native.weeklyPlanRows)) {\n\t\t\tpatch.weeklyPlanRows = native.weeklyPlanRows;\n\t\t}\n\t\tif (Object.keys(patch).length) {\n\t\t\tawait this.patchInstanceNativeIfChanged(patch);\n\t\t\tif (patch.customPictograms) {\n\t\t\t\tthis.config.customPictograms = patch.customPictograms;\n\t\t\t}\n\t\t\tif (patch.weeklyPlanRows) {\n\t\t\t\tthis.config.weeklyPlanRows = patch.weeklyPlanRows;\n\t\t\t}\n\t\t\tthis.log.info(`Migrated instance native config from misplaced object ${legacyId}`);\n\t\t}\n\n\t\tawait this.delObjectAsync(legacyId);\n\t\tfor (const folderId of [`${this.namespace}.system.adapter`, `${this.namespace}.system`]) {\n\t\t\ttry {\n\t\t\t\tawait this.delObjectAsync(folderId);\n\t\t\t} catch {\n\t\t\t\t// folder may not exist or is not empty\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Update roles/read flags on existing timer states (object-structure compliance). */\n\tprivate async migrateTimerStateRoles(): Promise<void> {\n\t\tconst patches: Record<string, { role?: string; read?: boolean }> = {\n\t\t\tduration: { role: \"level.timer\" },\n\t\t\tremaining: { role: \"value.timer\" },\n\t\t\telapsed: { role: \"value.timer\" },\n\t\t\tstart: { read: false },\n\t\t\tpause: { read: false },\n\t\t\tresume: { read: false },\n\t\t\tstop: { read: false },\n\t\t};\n\t\tfor (const [id, patch] of Object.entries(patches)) {\n\t\t\tconst common: Partial<ioBroker.StateCommon> = {};\n\t\t\tif (patch.role) {\n\t\t\t\tcommon.role = patch.role;\n\t\t\t}\n\t\t\tif (patch.read !== undefined) {\n\t\t\t\tcommon.read = patch.read;\n\t\t\t}\n\t\t\tawait this.extendObjectAsync(`${TIMER_CHANNEL}.${id}`, { common });\n\t\t}\n\t}\n\n\tprivate async createScheduleStates(): Promise<void> {\n\t\tawait this.setObjectNotExistsAsync(SCHEDULE_CHANNEL, {\n\t\t\ttype: \"channel\",\n\t\t\tcommon: { name: \"Daily schedule\" },\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.plan`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Schedule plan (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: JSON.stringify({ version: 1, items: [] }),\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.periods`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Day periods from admin (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.periodOverrides`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Day period on/off overrides from schedule config (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: \"{}\",\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.nowMinutes`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Minutes since midnight (local)\",\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tunit: \"min\",\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 1439,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.currentPeriod`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Current day period id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"text\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.currentItemIndex`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Index of active schedule item (-1 = none)\",\n\t\t\t\ttype: \"number\",\n\t\t\t\trole: \"value\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\tmin: -1,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.clearAfterLast`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Clear plan automatically after last pictogram ends\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"switch\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.pictogramLibrary`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Custom pictogram library (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.weeklyPlan`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Active weekly plan (JSON, Mon\u2013Sun)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: JSON.stringify(createEmptyWeeklyPlan()),\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Saved weekly plans library (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: JSON.stringify({ version: 1, activeId: null, plans: [] }),\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Load daily plan from active weekly plan each day\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"switch\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait this.setObjectNotExistsAsync(`${SCHEDULE_CHANNEL}.weekdayColors`, {\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: \"Weekday background colors from admin (JSON)\",\n\t\t\t\ttype: \"string\",\n\t\t\t\trole: \"json\",\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tconst planState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.plan`);\n\t\tif (planState?.val == null || planState.val === \"\") {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify({ version: 1, items: [] }), true);\n\t\t}\n\t\tconst overridesState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.periodOverrides`);\n\t\tif (overridesState?.val == null || overridesState.val === \"\") {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periodOverrides`, \"{}\", true);\n\t\t}\n\t\tconst clearAfterState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.clearAfterLast`);\n\t\tif (clearAfterState?.val == null) {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.clearAfterLast`, false, true);\n\t\t}\n\t\tconst loadDailyState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`);\n\t\tif (loadDailyState?.val == null) {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`, false, true);\n\t\t}\n\n\t\tconst weeklyState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlan`);\n\t\tif (weeklyState?.val == null || weeklyState.val === \"\") {\n\t\t\tconst seed = parseSchedulePlan(planState?.val);\n\t\t\tawait this.setState(\n\t\t\t\t`${SCHEDULE_CHANNEL}.weeklyPlan`,\n\t\t\t\tJSON.stringify(createEmptyWeeklyPlan(seed.items.length ? seed : undefined)),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\t\tconst libraryState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`);\n\t\tif (libraryState?.val == null || libraryState.val === \"\") {\n\t\t\tawait this.setState(\n\t\t\t\t`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`,\n\t\t\t\tJSON.stringify({ version: 1, activeId: null, plans: [] }),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\n\t\t// Publish admin period definitions once at start (times/colors); overrides stay separate.\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periods`, JSON.stringify(this.dayPeriods), true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weekdayColors`, JSON.stringify(this.weekdayColors), true);\n\t\tawait this.publishPictogramLibrary();\n\t}\n\n\tprivate async buildCustomPictogramRows(): Promise<Array<{ file: string; label: string; tags: string }>> {\n\t\tconst files = await this.listPictogramFiles();\n\t\treturn syncCustomPictogramRows(files || [], this.config.customPictograms);\n\t}\n\n\tprivate async refreshCustomPictogramsFromFiles(): Promise<void> {\n\t\tconst rows = await this.buildCustomPictogramRows();\n\t\tthis.config.customPictograms = rows;\n\t\tawait this.publishPictogramLibrary();\n\t}\n\n\tprivate async syncCustomPictogramsConfig(): Promise<void> {\n\t\tconst rows = await this.buildCustomPictogramRows();\n\t\tawait this.patchInstanceNativeIfChanged({ customPictograms: rows });\n\t\tthis.config.customPictograms = rows;\n\t\tawait this.publishPictogramLibrary();\n\t}\n\n\tprivate async ensurePictogramStore(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.readFileAsync(this.namespace, ADAPTER_LIBRARY_FILE);\n\t\t} catch {\n\t\t\ttry {\n\t\t\t\tawait this.writeFileAsync(\n\t\t\t\t\tthis.namespace,\n\t\t\t\t\tADAPTER_LIBRARY_FILE,\n\t\t\t\t\tJSON.stringify(emptyLibrary(), null, 2),\n\t\t\t\t);\n\t\t\t\tthis.log.info(`Created adapter pictogram library ${this.namespace}/${ADAPTER_LIBRARY_FILE}`);\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.error(`Could not create adapter pictogram library: ${(error as Error).message}`);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst legacy = await this.readFileAsync(PICTOGRAM_FILE_ADAPTER, LEGACY_VIS_LIBRARY_FILE);\n\t\t\tconst raw = typeof legacy.file === \"string\" ? legacy.file : Buffer.from(legacy.file).toString(\"utf8\");\n\t\t\tconst migrated = parseLibrary(raw);\n\t\t\tif (migrated.items.length) {\n\t\t\t\tawait this.writeFileAsync(this.namespace, ADAPTER_LIBRARY_FILE, JSON.stringify(migrated, null, 2));\n\t\t\t\tthis.log.info(`Migrated pictogram library from vis-2 to ${this.namespace}`);\n\t\t\t}\n\t\t} catch {\n\t\t\t// no legacy library in vis-2\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.unlinkAsync(PICTOGRAM_FILE_ADAPTER, LEGACY_VIS_LIBRARY_FILE);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\n\t\ttry {\n\t\t\tconst hint =\n\t\t\t\t\"Upload pictogram images (PNG, JPEG, GIF, WebP, SVG) here.\\n\" +\n\t\t\t\t'Do not create new folders (the file manager often then shows \"duplicate name\").\\n' +\n\t\t\t\t\"Instead click Upload above and place images in THIS folder.\\n\";\n\t\t\tconst placeholderPath = `${PICTOGRAM_DIR}/${PICTOGRAM_PLACEHOLDER_FILE}`;\n\t\t\tlet needsWrite = true;\n\t\t\ttry {\n\t\t\t\tconst existing = await this.readFileAsync(PICTOGRAM_FILE_ADAPTER, placeholderPath);\n\t\t\t\tconst current =\n\t\t\t\t\ttypeof existing.file === \"string\" ? existing.file : Buffer.from(existing.file).toString(\"utf8\");\n\t\t\t\tneedsWrite = current !== hint;\n\t\t\t} catch {\n\t\t\t\t// file missing\n\t\t\t}\n\t\t\tif (needsWrite) {\n\t\t\t\tawait this.writeFileAsync(PICTOGRAM_FILE_ADAPTER, placeholderPath, hint);\n\t\t\t\tthis.log.info(`Ensured vis-2 pictogram folder ${PICTOGRAM_FILE_ADAPTER}/${PICTOGRAM_DIR}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.error(\n\t\t\t\t`Could not write ${PICTOGRAM_FILE_ADAPTER}/${PICTOGRAM_DIR}/${PICTOGRAM_PLACEHOLDER_FILE}: ${(error as Error).message}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async getPublishedPictogramLibrary(): Promise<PictogramLibrary> {\n\t\treturn mergePictogramSources(\n\t\t\tawait this.getMergedPictogramLibrary(),\n\t\t\tlibraryFromNativeRows(this.config.customPictograms),\n\t\t);\n\t}\n\n\tprivate async publishPictogramLibrary(): Promise<void> {\n\t\tconst library = await this.getPublishedPictogramLibrary();\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.pictogramLibrary`, JSON.stringify(library), true);\n\t}\n\n\tprivate async publishTimerSnapshot(snapshot: {\n\t\tduration: number;\n\t\tremaining: number;\n\t\telapsed: number;\n\t\trunning: boolean;\n\t\tpaused: boolean;\n\t\tfinished: boolean;\n\t}): Promise<void> {\n\t\tawait this.setState(`${TIMER_CHANNEL}.duration`, snapshot.duration, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.remaining`, snapshot.remaining, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.elapsed`, snapshot.elapsed, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.running`, snapshot.running, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.paused`, snapshot.paused, true);\n\t\tawait this.setState(`${TIMER_CHANNEL}.finished`, snapshot.finished, true);\n\t}\n\n\tprivate async getPlan(): Promise<SchedulePlan> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.plan`);\n\t\treturn parseSchedulePlan(state?.val);\n\t}\n\n\tprivate async getPeriodOverrides(): Promise<Record<string, boolean>> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.periodOverrides`);\n\t\ttry {\n\t\t\tconst raw = typeof state?.val === \"string\" ? JSON.parse(state.val) : state?.val;\n\t\t\treturn raw && typeof raw === \"object\" ? (raw as Record<string, boolean>) : {};\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tprivate async getEffectivePeriods(): Promise<DayPeriodDefinition[]> {\n\t\tconst overrides = await this.getPeriodOverrides();\n\t\treturn this.dayPeriods.map(period => ({\n\t\t\t...period,\n\t\t\tenabled: overrides[period.id] === undefined ? period.enabled : Boolean(overrides[period.id]),\n\t\t}));\n\t}\n\n\tprivate async getWeeklyPlan(): Promise<WeeklyPlanData> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlan`);\n\t\treturn parseWeeklyPlan(state?.val);\n\t}\n\n\tprivate async getWeeklyPlansLibrary(): Promise<WeeklyPlansLibrary> {\n\t\tconst state = await this.getStateAsync(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`);\n\t\treturn parseWeeklyPlansLibrary(state?.val);\n\t}\n\n\tprivate async syncWeeklyPlansTableToNative(): Promise<void> {\n\t\tconst library = await this.getWeeklyPlansLibrary();\n\t\tconst rows = weeklyPlanRowsFromLibrary(library);\n\t\tawait this.patchInstanceNativeIfChanged({ weeklyPlanRows: rows });\n\t\tthis.config.weeklyPlanRows = rows;\n\t}\n\n\tprivate async applyWeeklyPlanRowsFromConfig(): Promise<void> {\n\t\tconst library = await this.getWeeklyPlansLibrary();\n\t\tconst next = applyWeeklyPlanRowsToLibrary(library, this.config.weeklyPlanRows);\n\t\tif (JSON.stringify(next) !== JSON.stringify(library)) {\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`, JSON.stringify(next), true);\n\t\t}\n\t}\n\n\tprivate async maybeApplyWeeklyToDaily(): Promise<void> {\n\t\tconst loadState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`);\n\t\tif (!loadState?.val) {\n\t\t\treturn;\n\t\t}\n\t\tconst weekday = weekdayKeyFromDate(new Date());\n\t\tconst weekly = await this.getWeeklyPlan();\n\t\tconst dayPlan = weekly.days[weekday];\n\t\tconst current = await this.getPlan();\n\t\tif (this.lastAppliedWeekday === weekday && schedulePlansEqual(current, dayPlan)) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify(dayPlan), true);\n\t\tthis.lastAppliedWeekday = weekday;\n\t\tthis.log.debug(`Daily plan loaded from weekly plan (${weekday})`);\n\t}\n\n\tprivate async publishScheduleRuntime(): Promise<void> {\n\t\tawait this.maybeApplyWeeklyToDaily();\n\n\t\tconst now = new Date();\n\t\tconst minutes = now.getHours() * 60 + now.getMinutes();\n\t\tconst periods = await this.getEffectivePeriods();\n\t\tconst period = findCurrentPeriod(minutes, periods);\n\t\tlet plan = await this.getPlan();\n\n\t\tconst clearAfterState = await this.getStateAsync(`${SCHEDULE_CHANNEL}.clearAfterLast`);\n\t\tconst clearAfterLast = Boolean(clearAfterState?.val);\n\t\tif (clearAfterLast && isPlanFullyExpired(plan, minutes, parseTimeToMinutes)) {\n\t\t\tplan = { version: 1, items: [] };\n\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify(plan), true);\n\t\t\tthis.log.info(\"Schedule plan cleared automatically after last pictogram ended\");\n\t\t}\n\n\t\tconst itemIndex = findCurrentItemIndex(plan, minutes, parseTimeToMinutes);\n\n\t\t// Keep admin period metadata available; do not wipe Config overrides.\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periods`, JSON.stringify(this.dayPeriods), true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weekdayColors`, JSON.stringify(this.weekdayColors), true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.nowMinutes`, minutes, true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.currentPeriod`, period?.id ?? \"\", true);\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.currentItemIndex`, itemIndex, true);\n\t}\n\n\tprivate async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise<void> {\n\t\tif (!state || state.ack) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (id.startsWith(`${this.namespace}.${SCHEDULE_CHANNEL}.`)) {\n\t\t\tconst localId = id.replace(`${this.namespace}.${SCHEDULE_CHANNEL}.`, \"\");\n\t\t\tif (localId === \"plan\") {\n\t\t\t\tconst plan = parseSchedulePlan(state.val);\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.plan`, JSON.stringify(plan), true);\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t} else if (localId === \"periodOverrides\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst raw = typeof state.val === \"string\" ? JSON.parse(String(state.val)) : state.val;\n\t\t\t\t\tconst cleaned = raw && typeof raw === \"object\" ? (raw as Record<string, boolean>) : {};\n\t\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.periodOverrides`, JSON.stringify(cleaned), true);\n\t\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.log.error(`Invalid periodOverrides: ${(error as Error).message}`);\n\t\t\t\t}\n\t\t\t} else if (localId === \"clearAfterLast\") {\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.clearAfterLast`, Boolean(state.val), true);\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t} else if (localId === \"weeklyPlan\") {\n\t\t\t\tconst weekly = parseWeeklyPlan(state.val);\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weeklyPlan`, JSON.stringify(weekly), true);\n\t\t\t\tthis.lastAppliedWeekday = null;\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t} else if (localId === \"weeklyPlansLibrary\") {\n\t\t\t\tconst library = parseWeeklyPlansLibrary(state.val);\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.weeklyPlansLibrary`, JSON.stringify(library), true);\n\t\t\t\tawait this.syncWeeklyPlansTableToNative();\n\t\t\t} else if (localId === \"loadDailyFromWeekly\") {\n\t\t\t\tawait this.setState(`${SCHEDULE_CHANNEL}.loadDailyFromWeekly`, Boolean(state.val), true);\n\t\t\t\tthis.lastAppliedWeekday = null;\n\t\t\t\tawait this.publishScheduleRuntime();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.timerManager || !id.startsWith(`${this.namespace}.${TIMER_CHANNEL}.`)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst localId = id.replace(`${this.namespace}.${TIMER_CHANNEL}.`, \"\");\n\t\tconst maxHours = this.config.maxDurationHours ?? 24;\n\n\t\ttry {\n\t\t\tswitch (localId) {\n\t\t\t\tcase \"start\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.start();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.start`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"pause\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.pause();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.pause`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"resume\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.resume();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.resume`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"stop\":\n\t\t\t\t\tif (state.val === true) {\n\t\t\t\t\t\tawait this.timerManager.stop();\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.stop`, false, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"duration\":\n\t\t\t\t\tif (typeof state.val === \"number\") {\n\t\t\t\t\t\tawait this.timerManager.setDuration(state.val, maxHours);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setDurationHours\":\n\t\t\t\t\tif (typeof state.val === \"number\") {\n\t\t\t\t\t\tawait this.applyDurationParts(Math.round(state.val), undefined, maxHours);\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.setDurationHours`, 0, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setDurationMinutes\":\n\t\t\t\t\tif (typeof state.val === \"number\") {\n\t\t\t\t\t\tawait this.applyDurationParts(undefined, Math.round(state.val), maxHours);\n\t\t\t\t\t}\n\t\t\t\t\tawait this.setState(`${TIMER_CHANNEL}.setDurationMinutes`, 0, true);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.error(`Timer command failed (${localId}): ${(error as Error).message}`);\n\t\t}\n\t}\n\n\tprivate reply(obj: ioBroker.Message, payload: unknown): void {\n\t\tif (obj.callback) {\n\t\t\tthis.sendTo(obj.from, obj.command, payload, obj.callback);\n\t\t}\n\t}\n\n\tprivate async loadPictogramLibrary(): Promise<PictogramLibrary> {\n\t\ttry {\n\t\t\tconst file = await this.readFileAsync(this.namespace, ADAPTER_LIBRARY_FILE);\n\t\t\tconst raw = typeof file.file === \"string\" ? file.file : Buffer.from(file.file).toString(\"utf8\");\n\t\t\treturn parseLibrary(raw);\n\t\t} catch {\n\t\t\treturn emptyLibrary();\n\t\t}\n\t}\n\n\tprivate async savePictogramLibrary(library: PictogramLibrary): Promise<void> {\n\t\tawait this.writeFileAsync(this.namespace, ADAPTER_LIBRARY_FILE, JSON.stringify(library, null, 2));\n\t\tawait this.setState(`${SCHEDULE_CHANNEL}.pictogramLibrary`, JSON.stringify(library), true);\n\t}\n\n\tprivate async listPictogramFiles(): Promise<string[] | null> {\n\t\ttry {\n\t\t\tconst result = await this.readDirAsync(PICTOGRAM_FILE_ADAPTER, PICTOGRAM_DIR);\n\t\t\treturn (result || [])\n\t\t\t\t.filter(entry => !entry.isDir && !isIgnoredPictogramFile(entry.file))\n\t\t\t\t.map(entry => entry.file);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async getMergedPictogramLibrary(): Promise<PictogramLibrary> {\n\t\tconst library = await this.loadPictogramLibrary();\n\t\tconst files = await this.listPictogramFiles();\n\t\tif (!files) {\n\t\t\treturn library;\n\t\t}\n\t\tconst known = new Set(library.items.map(item => item.filename));\n\t\tfor (const filename of files) {\n\t\t\tif (known.has(filename)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlibrary.items.push({\n\t\t\t\tid: filename,\n\t\t\t\tfilename,\n\t\t\t\tpath: pictogramStoragePath(filename),\n\t\t\t\tlabel: filename.replace(/\\.[^.]+$/, \"\").replace(/-\\d+$/, \"\"),\n\t\t\t\ttags: [],\n\t\t\t\toriginalName: filename,\n\t\t\t\tmime: \"\",\n\t\t\t\tuploadedAt: 0,\n\t\t\t});\n\t\t}\n\t\tlibrary.items = library.items.filter(item => files.includes(item.filename));\n\t\tlibrary.items.sort((a, b) => (b.uploadedAt || 0) - (a.uploadedAt || 0));\n\t\treturn library;\n\t}\n\n\t/**\n\t * Custom pictogram library (user-owned images only).\n\t * ARASAAC images must never be uploaded here \u2013 use external IDs only.\n\t *\n\t * @param obj\n\t */\n\tprivate async onMessage(obj: ioBroker.Message): Promise<void> {\n\t\tif (!obj?.command) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tif (obj.command === \"syncPictogramTable\") {\n\t\t\t\tawait this.ensurePictogramStore();\n\t\t\t\tconst rows = await this.buildCustomPictogramRows();\n\t\t\t\tawait this.patchInstanceNativeIfChanged({ customPictograms: rows });\n\t\t\t\tthis.config.customPictograms = rows;\n\t\t\t\tawait this.publishPictogramLibrary();\n\t\t\t\tthis.reply(obj, { ok: true, native: { customPictograms: rows } });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"syncWeeklyPlansTable\") {\n\t\t\t\tconst nativeMsg = obj.message as {\n\t\t\t\t\tweeklyPlanRows?: Array<{ id?: string; name?: string; active?: string }>;\n\t\t\t\t};\n\t\t\t\tif (Array.isArray(nativeMsg?.weeklyPlanRows)) {\n\t\t\t\t\tthis.config.weeklyPlanRows = nativeMsg.weeklyPlanRows;\n\t\t\t\t\tawait this.applyWeeklyPlanRowsFromConfig();\n\t\t\t\t}\n\t\t\t\tawait this.syncWeeklyPlansTableToNative();\n\t\t\t\tconst library = await this.getWeeklyPlansLibrary();\n\t\t\t\tthis.reply(obj, {\n\t\t\t\t\tok: true,\n\t\t\t\t\tnative: { weeklyPlanRows: this.config.weeklyPlanRows || [] },\n\t\t\t\t\tactiveId: library.activeId,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"uploadPictogram\") {\n\t\t\t\tconst payload = obj.message as {\n\t\t\t\t\tfilename?: string;\n\t\t\t\t\tbase64?: string;\n\t\t\t\t\tmime?: string;\n\t\t\t\t\tlabel?: string;\n\t\t\t\t\ttags?: string[] | string;\n\t\t\t\t};\n\t\t\t\tconst originalName = String(payload?.filename || \"image.png\");\n\t\t\t\tconst filename = uniquePictogramFilename(originalName);\n\t\t\t\tconst base64 = String(payload?.base64 || \"\");\n\t\t\t\tif (!base64) {\n\t\t\t\t\tthrow new Error(\"filename and base64 required\");\n\t\t\t\t}\n\t\t\t\tif (!/\\.(png|jpe?g|gif|webp|svg)$/i.test(filename)) {\n\t\t\t\t\tthrow new Error(\"unsupported file type\");\n\t\t\t\t}\n\t\t\t\tconst buffer = Buffer.from(base64.replace(/^data:[^;]+;base64,/, \"\"), \"base64\");\n\t\t\t\tif (!buffer.length) {\n\t\t\t\t\tthrow new Error(\"empty file\");\n\t\t\t\t}\n\t\t\t\tif (buffer.length > 5 * 1024 * 1024) {\n\t\t\t\t\tthrow new Error(\"file too large (max 5 MB)\");\n\t\t\t\t}\n\t\t\t\tconst path = pictogramStoragePath(filename);\n\t\t\t\tawait this.writeFileAsync(PICTOGRAM_FILE_ADAPTER, path, buffer);\n\t\t\t\tconst library = await this.getMergedPictogramLibrary();\n\t\t\t\tconst entry: CustomPictogram = {\n\t\t\t\t\tid: filename,\n\t\t\t\t\tfilename,\n\t\t\t\t\tpath,\n\t\t\t\t\tlabel: String(payload?.label || originalName.replace(/\\.[^.]+$/, \"\")),\n\t\t\t\t\ttags: normalizeTags(payload?.tags),\n\t\t\t\t\toriginalName,\n\t\t\t\t\tmime: String(payload?.mime || \"\"),\n\t\t\t\t\tuploadedAt: Date.now(),\n\t\t\t\t};\n\t\t\t\tlibrary.items = [entry, ...library.items.filter(item => item.filename !== filename)];\n\t\t\t\tawait this.savePictogramLibrary(library);\n\t\t\t\tawait this.syncCustomPictogramsConfig();\n\t\t\t\tthis.log.info(`Custom pictogram stored: ${PICTOGRAM_FILE_ADAPTER}/${path} (${buffer.length} bytes)`);\n\t\t\t\tthis.reply(obj, {\n\t\t\t\t\tok: true,\n\t\t\t\t\tpath,\n\t\t\t\t\turl: pictogramPublicUrl(path),\n\t\t\t\t\titem: entry,\n\t\t\t\t\tlibrary,\n\t\t\t\t\tadapter: PICTOGRAM_FILE_ADAPTER,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"listPictograms\") {\n\t\t\t\tconst library = await this.getPublishedPictogramLibrary();\n\t\t\t\tthis.reply(obj, {\n\t\t\t\t\tok: true,\n\t\t\t\t\tfiles: library.items.map(item => item.filename),\n\t\t\t\t\tlibrary,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"updatePictogram\") {\n\t\t\t\tconst payload = obj.message as {\n\t\t\t\t\tpath?: string;\n\t\t\t\t\tfilename?: string;\n\t\t\t\t\tlabel?: string;\n\t\t\t\t\ttags?: string[] | string;\n\t\t\t\t};\n\t\t\t\tconst key = String(payload?.path || payload?.filename || \"\");\n\t\t\t\tif (!key) {\n\t\t\t\t\tthrow new Error(\"path required\");\n\t\t\t\t}\n\t\t\t\tconst library = await this.getMergedPictogramLibrary();\n\t\t\t\tconst item = library.items.find(entry => matchesPictogramKey(entry, key));\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow new Error(\"pictogram not found\");\n\t\t\t\t}\n\t\t\t\tif (payload.label !== undefined) {\n\t\t\t\t\titem.label = String(payload.label);\n\t\t\t\t}\n\t\t\t\tif (payload.tags !== undefined) {\n\t\t\t\t\titem.tags = normalizeTags(payload.tags);\n\t\t\t\t}\n\t\t\t\tawait this.savePictogramLibrary(library);\n\t\t\t\tthis.reply(obj, { ok: true, item, library });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (obj.command === \"deletePictogram\") {\n\t\t\t\tconst payload = obj.message as { path?: string; filename?: string };\n\t\t\t\tconst key = String(payload?.path || payload?.filename || \"\");\n\t\t\t\tif (!key) {\n\t\t\t\t\tthrow new Error(\"path required\");\n\t\t\t\t}\n\t\t\t\tconst library = await this.getMergedPictogramLibrary();\n\t\t\t\tconst item = library.items.find(entry => matchesPictogramKey(entry, key));\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow new Error(\"pictogram not found\");\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait this.unlinkAsync(PICTOGRAM_FILE_ADAPTER, item.path);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.log.warn(`Could not delete pictogram file ${item.path}: ${(error as Error).message}`);\n\t\t\t\t}\n\t\t\t\tlibrary.items = library.items.filter(entry => entry.filename !== item.filename);\n\t\t\t\tawait this.savePictogramLibrary(library);\n\t\t\t\tthis.reply(obj, { ok: true, library });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.error(`Pictogram command ${obj.command} failed: ${(error as Error).message}`);\n\t\t\tthis.reply(obj, { ok: false, error: (error as Error).message });\n\t\t}\n\t}\n\n\tprivate async applyDurationParts(\n\t\thours: number | undefined,\n\t\tminutes: number | undefined,\n\t\tmaxHours: number,\n\t): Promise<void> {\n\t\tif (!this.timerManager) {\n\t\t\treturn;\n\t\t}\n\t\tconst snapshot = this.timerManager.getSnapshot();\n\t\tconst current = secondsToParts(snapshot.duration);\n\t\tconst nextHours = hours ?? current.hours;\n\t\tconst nextMinutes = minutes ?? current.minutes;\n\t\tconst totalSeconds = nextHours * 3600 + nextMinutes * 60;\n\t\tawait this.timerManager.setDuration(totalSeconds, maxHours);\n\t}\n\n\tprivate onUnload(callback: () => void): void {\n\t\tthis.readyRunId++;\n\t\tif (this.scheduleTick !== undefined && this.scheduleTick !== null) {\n\t\t\tthis.clearInterval(this.scheduleTick);\n\t\t\tthis.scheduleTick = null;\n\t\t}\n\t\tthis.timerManager?.destroy();\n\t\tthis.timerManager = null;\n\t\tcallback();\n\t}\n}\n\nif (require.main !== module) {\n\tmodule.exports = (options: Partial<utils.AdapterOptions> | undefined) => new AutismSupport(options);\n} else {\n\t(() => new AutismSupport())();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["localId"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "autism-support",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.12",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.2.12": {
|
|
7
|
+
"en": "Remove leftover Admin sidebar tab that could not be opened",
|
|
8
|
+
"de": "Überbleibenden Admin-Seitenleisten-Eintrag entfernen, der nicht geöffnet werden konnte",
|
|
9
|
+
"ru": "Удаление устаревшей вкладки Admin в боковой панели, которую нельзя открыть",
|
|
10
|
+
"pt": "Remover separador legado da barra lateral do Admin que não podia ser aberto",
|
|
11
|
+
"nl": "Verouderde Admin-zijbalkinvoer verwijderen die niet geopend kon worden",
|
|
12
|
+
"fr": "Retirer l’onglet Admin latéral restant qui ne pouvait pas s’ouvrir",
|
|
13
|
+
"it": "Rimuovere la voce legacy nella barra laterale Admin non apribile",
|
|
14
|
+
"es": "Quitar la pestaña heredada de la barra lateral de Admin que no se podía abrir",
|
|
15
|
+
"pl": "Usuń pozostałą pozycję menu Admin, której nie dało się otworzyć",
|
|
16
|
+
"uk": "Видалити застарілий пункт бічної панелі Admin, який не відкривався",
|
|
17
|
+
"zh-cn": "移除无法打开的遗留 Admin 侧栏项"
|
|
18
|
+
},
|
|
6
19
|
"0.2.11": {
|
|
7
20
|
"en": "Latest-repo review: English description, i18n, remove unused customs, responsive admin tabs",
|
|
8
21
|
"de": "Latest-Repo-Review: englische Description, i18n, ungenutzte Customs entfernt, responsive Admin-Tabs",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Naprawiono strukturę obiektów: kanał timer, role value.interval, flagi read przycisków",
|
|
81
94
|
"uk": "Виправлено структуру об'єктів: канал timer, ролі value.interval, прапорці read кнопок",
|
|
82
95
|
"zh-cn": "修复对象结构:timer 通道、value.interval 角色、按钮 read 标志"
|
|
83
|
-
},
|
|
84
|
-
"0.2.1": {
|
|
85
|
-
"en": "Weekly plans: weekday tabs, templates, Admin colors, week live overview, daily sync",
|
|
86
|
-
"de": "Wochenpläne: Wochentags-Tabs, Vorlagen, Admin-Farben, Live-Wochenübersicht, Tages-Sync",
|
|
87
|
-
"ru": "Планы на неделю: вкладки по дням, шаблоны, цвета в Admin, обзор недели, синхронизация дня",
|
|
88
|
-
"pt": "Planos semanais: separadores por dia, modelos, cores no Admin, visão geral da semana, sync diário",
|
|
89
|
-
"nl": "Weekplannen: tabbladen per weekdag, sjablonen, Admin-kleuren, weekoverzicht, dag-sync",
|
|
90
|
-
"fr": "Plans hebdomadaires: onglets par jour, modèles, couleurs Admin, aperçu semaine, sync quotidien",
|
|
91
|
-
"it": "Piani settimanali: schede per giorno, modelli, colori Admin, panoramica settimana, sync giornaliero",
|
|
92
|
-
"es": "Planes semanales: pestañas por día, plantillas, colores Admin, vista semanal, sync diario",
|
|
93
|
-
"pl": "Plany tygodniowe: zakładki dni, szablony, kolory Admin, podgląd tygodnia, sync dzienny",
|
|
94
|
-
"uk": "Тижневі плани: вкладки днів, шаблони, кольори Admin, огляд тижня, щоденна синхронізація",
|
|
95
|
-
"zh-cn": "周计划:工作日标签、模板、Admin 颜色、周概览、每日同步"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.autism-support",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "Support for people with autism: Visual Countdown, pictogram-based schedules and pictogram library",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Matthias Ulrich",
|
|
@@ -35,15 +35,16 @@
|
|
|
35
35
|
"@alcalzone/release-script-plugin-license": "^5.2.2",
|
|
36
36
|
"@alcalzone/release-script-plugin-manual-review": "^5.2.0",
|
|
37
37
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
38
|
-
"@iobroker/build-tools": "^3.0.
|
|
38
|
+
"@iobroker/build-tools": "^3.0.3",
|
|
39
39
|
"@iobroker/dev-server": "^0.8.0",
|
|
40
40
|
"@iobroker/eslint-config": "^2.3.4",
|
|
41
41
|
"@iobroker/testing": "^6.3.1",
|
|
42
|
-
"@iobroker/types-vis-2": "^2.
|
|
42
|
+
"@iobroker/types-vis-2": "^2.20.1",
|
|
43
43
|
"@iobroker/vis-2-widgets-testing": "^1.0.6",
|
|
44
|
-
"@tsconfig/node22": "^22.0.
|
|
44
|
+
"@tsconfig/node22": "^22.0.6",
|
|
45
45
|
"@types/iobroker": "npm:@iobroker/types@^7.2.2",
|
|
46
|
-
"@types/
|
|
46
|
+
"@types/mocha": "^10.0.10",
|
|
47
|
+
"@types/node": "^22.20.5",
|
|
47
48
|
"nyc": "^18.0.0",
|
|
48
49
|
"rimraf": "^6.1.3",
|
|
49
50
|
"source-map-support": "^0.5.21",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as o,o as w,g as r,p as h,h as p,k as f,l as g,q as $,r as B,s as k,t as x,m as y,u as I,v as L,w as _,x as S,y as R}from"./_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__loadShare__shared-DnWO7M69.js";import{P as M,D as H}from"./DailyScheduleVisual-Cikb1l_S.js";import{r as T,b as C,d as J,e as A,f as j,s as K,V as P,a as U,c as Q,g as Y}from"./VisFileImage-CI2phrqF.js";import{w as O,c as V,p as F,W as D,a as q,b as G,d as Z,e as X}from"./weekly-plan-DsLUEeci.js";import"./vite-preload-helper-BDBacUwf.js";function N(){return{version:1,items:[]}}function z(m){try{const e=typeof m=="string"?JSON.parse(m):m;return!e||typeof e!="object"||!Array.isArray(e.items)?N():{version:1,items:e.items.filter(t=>t&&typeof t=="object"&&t.filename).map(t=>({id:String(t.id||t.filename),filename:String(t.filename),path:String(t.path||`pictograms/${t.filename}`),label:String(t.label||""),tags:Array.isArray(t.tags)?t.tags.map(s=>String(s)):[],originalName:String(t.originalName||t.filename),mime:String(t.mime||""),uploadedAt:Number(t.uploadedAt)||0}))}}catch{return N()}}function E(m,e){const t=e.trim().toLowerCase();if(!t)return!0;const s=[m.label,m.originalName,m.filename,...m.tags||[]].join(" ").toLowerCase();return t.split(/\s+/).every(i=>s.includes(i))}function ee(m,e){return T({id:m.id,label:m.label,source:"custom",customRef:m.path},e)||""}class W extends window.visRxWidget{static adapter;static getWidgetInfo(){return{id:"asDailyScheduleConfig",visSet:"autism-support",visSetIcon:"widgets/autism-support/img/autism-support.svg",visSetLabel:"autism_support_widgets",visSetColor:"#FF8A00",visName:"DailyScheduleConfig",visAttrs:[{name:"schedule",label:"schedule_states",fields:[{name:"oidWeeklyPlan",type:"id",label:"oid_weekly_plan",default:"autism-support.0.schedule.weeklyPlan"},{name:"oidWeeklyPlansLibrary",type:"id",label:"oid_weekly_plans_library",default:"autism-support.0.schedule.weeklyPlansLibrary"},{name:"oidLoadDailyFromWeekly",type:"id",label:"oid_load_daily_from_weekly",default:"autism-support.0.schedule.loadDailyFromWeekly"},{name:"oidPlan",type:"id",label:"oid_schedule_plan",default:"autism-support.0.schedule.plan"},{name:"oidPeriods",type:"id",label:"oid_schedule_periods",default:"autism-support.0.schedule.periods"},{name:"oidPeriodOverrides",type:"id",label:"oid_schedule_period_overrides",default:"autism-support.0.schedule.periodOverrides"},{name:"oidClearAfterLast",type:"id",label:"oid_schedule_clear_after_last",default:"autism-support.0.schedule.clearAfterLast"},{name:"oidNowMinutes",type:"id",label:"oid_schedule_now",default:"autism-support.0.schedule.nowMinutes"},{name:"oidCurrentItemIndex",type:"id",label:"oid_schedule_current_item",default:"autism-support.0.schedule.currentItemIndex"},{name:"oidLibrary",type:"id",label:"oid_schedule_library",default:"autism-support.0.schedule.pictogramLibrary"},{name:"adapterInstance",type:"text",label:"adapter_instance",default:"autism-support.0"},{name:"arasaacLanguage",type:"text",label:"arasaac_language",default:"de"},{name:"pictogramSize",type:"number",label:"pictogram_size",default:64,min:32,max:200,step:8}]}],visPrev:"widgets/autism-support/img/daily-schedule-config.png"}}constructor(e){super(e);const t=O(new Date),s=V();this.state={...this.state,draft:s.days[t],weeklyDraft:s,activeWeekday:t,copyTargets:{},templateName:"",loadTemplateId:"",selectedIndex:-1,searchQuery:"",searchHits:[],searchError:"",busy:!1,library:{version:1,items:[]},localPeriodOverrides:{}}}getWidgetInfo(){return W.getWidgetInfo()}static getI18nPrefix(){return`${W.adapter}_`}componentDidMount(){super.componentDidMount(),this.syncWeeklyFromState(),this.bootstrapClearAfterLast(),this.bootstrapLoadDailyFromWeekly(),this.syncLibraryFromState(),this.bootstrapLibrary()}onStateUpdated(e,t){if(e===this.getWeeklyPlanOid()){if(this.state.busy)return;this.syncWeeklyFromState(t==null?void 0:t.val)}e===this.libraryOid()&&this.syncLibraryFromState();const s=this.getPeriodOverridesOid();if(e===s){const n=C(this.state.values[`${s}.val`]);this.setState(c=>{const u={...c.localPeriodOverrides};for(const a of Object.keys(u))n[a]===u[a]&&delete u[a];return{localPeriodOverrides:u}})}const i=this.getClearAfterLastOid();if(e===i){const n=!!this.state.values[`${i}.val`];this.setState(c=>({localClearAfterLast:c.localClearAfterLast===n?void 0:c.localClearAfterLast}))}const l=this.getLoadDailyFromWeeklyOid();if(e===l){const n=!!this.state.values[`${l}.val`];this.setState(c=>({localLoadDailyFromWeekly:c.localLoadDailyFromWeekly===n?void 0:c.localLoadDailyFromWeekly}))}}getWeeklyPlanOid(){return this.state.rxData.oidWeeklyPlan||`${this.state.rxData.adapterInstance||"autism-support.0"}.schedule.weeklyPlan`}getWeeklyPlansLibraryOid(){return this.state.rxData.oidWeeklyPlansLibrary||`${this.state.rxData.adapterInstance||"autism-support.0"}.schedule.weeklyPlansLibrary`}getLoadDailyFromWeeklyOid(){return this.state.rxData.oidLoadDailyFromWeekly||`${this.state.rxData.adapterInstance||"autism-support.0"}.schedule.loadDailyFromWeekly`}getPeriodOverridesOid(){return this.state.rxData.oidPeriodOverrides||`${this.state.rxData.adapterInstance||"autism-support.0"}.schedule.periodOverrides`}getMergedPeriodOverrides(){const e=this.getPeriodOverridesOid();return{...C(this.state.values[`${e}.val`]),...this.state.localPeriodOverrides}}flushDraftIntoWeekly(e=this.state){return{version:1,days:{...e.weeklyDraft.days,[e.activeWeekday]:e.draft}}}syncWeeklyFromState(e){const t=F(e!==void 0?e:this.state.values[`${this.getWeeklyPlanOid()}.val`]);this.setState(s=>{const i=s.activeWeekday,l=t.days[i],n=l.items.length===0?-1:s.selectedIndex>=0&&s.selectedIndex<l.items.length?s.selectedIndex:0;return{weeklyDraft:t,draft:l,selectedIndex:n}})}setActiveWeekday(e){e!==this.state.activeWeekday&&this.setState(t=>{const s=this.flushDraftIntoWeekly(t),i=s.days[e];return{weeklyDraft:s,activeWeekday:e,draft:i,selectedIndex:i.items.length?0:-1,searchError:""}})}updateItem(e,t){this.setState(s=>({draft:{version:1,items:s.draft.items.map((l,n)=>n===e?{...l,...t}:l)}}))}addItemAfterSelected(){this.setState(e=>{const t=e.selectedIndex>=0?e.draft.items[e.selectedIndex]:void 0,s=J(t);return{draft:{version:1,items:[...e.draft.items,s]},selectedIndex:e.draft.items.length}})}duplicateSelectedItem(){this.setState(e=>{const t=e.selectedIndex>=0?e.draft.items[e.selectedIndex]:null;if(!t||!A(e.draft.items,t))return null;const s=j(t);return{draft:{version:1,items:[...e.draft.items,s]},selectedIndex:e.draft.items.length}})}canDuplicateSelected(){const e=this.state.selectedIndex>=0?this.state.draft.items[this.state.selectedIndex]:null;return e?A(this.state.draft.items,e):!1}async savePlan(){const e=this.getWeeklyPlanOid();if(!e)return;const t=this.flushDraftIntoWeekly();this.setState({busy:!0,weeklyDraft:t,draft:t.days[this.state.activeWeekday]});try{await this.props.context.socket.setState(e,JSON.stringify(t),!1);const s=O(new Date),i=this.state.rxData.oidPlan;i&&this.getLoadDailyFromWeeklyChecked()&&await this.props.context.socket.setState(i,JSON.stringify(t.days[s]),!1)}finally{this.setState({busy:!1})}}async applyCurrentDayToDailyPlan(){const e=this.state.rxData.oidPlan;if(!e)return;const t=this.flushDraftIntoWeekly();this.setState({busy:!0,weeklyDraft:t,draft:t.days[this.state.activeWeekday]});try{await this.props.context.socket.setState(e,JSON.stringify(t.days[this.state.activeWeekday]),!1),await this.props.context.socket.setState(this.getWeeklyPlanOid(),JSON.stringify(t),!1)}finally{this.setState({busy:!1})}}copyPlanToTargets(){this.setState(e=>{const t=this.flushDraftIntoWeekly(e),s=t.days[e.activeWeekday],i={...t.days};for(const l of D)e.copyTargets[l]&&l!==e.activeWeekday&&(i[l]=q(s,l));return{weeklyDraft:{version:1,days:i},draft:i[e.activeWeekday],copyTargets:{}}})}getLibraryFromState(){return G(this.state.values[`${this.getWeeklyPlansLibraryOid()}.val`])}async saveAsTemplate(){const e=this.state.templateName.trim();if(!e){this.setState({searchError:this.isDe()?"Bitte einen Namen für den Wochenplan eingeben.":"Enter a name for the weekly plan."});return}const t=this.flushDraftIntoWeekly(),s=this.getLibraryFromState(),i=`wp-${Date.now().toString(36)}`,l={version:1,activeId:i,plans:[...s.plans.filter(n=>n.id!==i),{id:i,name:e,data:t,updatedAt:new Date().toISOString()}]};this.setState({busy:!0,weeklyDraft:t,draft:t.days[this.state.activeWeekday],templateName:""});try{await this.props.context.socket.setState(this.getWeeklyPlanOid(),JSON.stringify(t),!1),await this.props.context.socket.setState(this.getWeeklyPlansLibraryOid(),JSON.stringify(l),!1)}finally{this.setState({busy:!1})}}async loadTemplate(){const e=this.state.loadTemplateId,t=this.getLibraryFromState(),s=t.plans.find(c=>c.id===e);if(!s){this.setState({searchError:this.isDe()?"Bitte einen gespeicherten Wochenplan wählen.":"Select a saved weekly plan."});return}const i=F(s.data),l=this.state.activeWeekday,n={...t,activeId:s.id};this.setState({busy:!0,weeklyDraft:i,draft:i.days[l],selectedIndex:i.days[l].items.length?0:-1});try{await this.props.context.socket.setState(this.getWeeklyPlanOid(),JSON.stringify(i),!1),await this.props.context.socket.setState(this.getWeeklyPlansLibraryOid(),JSON.stringify(n),!1)}finally{this.setState({busy:!1})}}getClearAfterLastOid(){return this.state.rxData.oidClearAfterLast||`${this.state.rxData.adapterInstance||"autism-support.0"}.schedule.clearAfterLast`}getClearAfterLastChecked(){if(this.state.localClearAfterLast!==void 0)return this.state.localClearAfterLast;const e=this.getClearAfterLastOid();return!!this.state.values[`${e}.val`]}getLoadDailyFromWeeklyChecked(){if(this.state.localLoadDailyFromWeekly!==void 0)return this.state.localLoadDailyFromWeekly;const e=this.getLoadDailyFromWeeklyOid();return!!this.state.values[`${e}.val`]}async bootstrapClearAfterLast(){var s;const e=this.getClearAfterLastOid(),t=(s=this.props.context)==null?void 0:s.socket;if(!(!e||!t||this.state.values[`${e}.val`]!==void 0))try{const i=await t.getState(e);(i==null?void 0:i.val)!==void 0&&(i==null?void 0:i.val)!==null&&this.setState({localClearAfterLast:!!i.val})}catch{}}async bootstrapLoadDailyFromWeekly(){var s;const e=this.getLoadDailyFromWeeklyOid(),t=(s=this.props.context)==null?void 0:s.socket;if(!(!e||!t||this.state.values[`${e}.val`]!==void 0))try{const i=await t.getState(e);(i==null?void 0:i.val)!==void 0&&(i==null?void 0:i.val)!==null&&this.setState({localLoadDailyFromWeekly:!!i.val})}catch{}}async resetPlan(){var l;const t=(((l=this.props.context)==null?void 0:l.lang)||"de").startsWith("de")?"Plan für diesen Wochentag wirklich löschen? Alle Piktogramme werden entfernt.":"Really clear this weekday plan? All pictograms will be removed.";if(!window.confirm(t))return;const s={version:1,items:[]},i=this.flushDraftIntoWeekly();i.days[this.state.activeWeekday]=s,this.setState({busy:!0,weeklyDraft:i,draft:s,selectedIndex:-1});try{await this.props.context.socket.setState(this.getWeeklyPlanOid(),JSON.stringify(i),!1)}finally{this.setState({busy:!1})}}async setClearAfterLast(e){const t=this.getClearAfterLastOid();this.setState({localClearAfterLast:e});try{await this.props.context.socket.setState(t,e,!1)}catch(s){this.setState({localClearAfterLast:void 0,searchError:s.message||"Option konnte nicht gespeichert werden"})}}async setLoadDailyFromWeekly(e){const t=this.getLoadDailyFromWeeklyOid();this.setState({localLoadDailyFromWeekly:e});try{await this.props.context.socket.setState(t,e,!1)}catch(s){this.setState({localLoadDailyFromWeekly:void 0,searchError:s.message||"Option konnte nicht gespeichert werden"})}}weekdayLabel(e){return this.isDe()?Z[e]:X[e]}activeTemplateLabel(){const e=this.getLibraryFromState();if(!e.activeId)return this.isDe()?"Kein gespeicherter Plan aktiv":"No saved plan active";const t=e.plans.find(s=>s.id===e.activeId);return t?this.isDe()?`Aktiv: ${t.name}`:`Active: ${t.name}`:this.isDe()?"Kein gespeicherter Plan aktiv":"No saved plan active"}async setPeriodEnabled(e,t){const s=this.getPeriodOverridesOid(),l={...this.getMergedPeriodOverrides(),[e]:t};this.setState(n=>({localPeriodOverrides:{...n.localPeriodOverrides,[e]:t}}));try{await this.props.context.socket.setState(s,JSON.stringify(l),!1)}catch(n){this.setState(c=>{const u={...c.localPeriodOverrides};return delete u[e],{localPeriodOverrides:u,searchError:n.message||"Tagesbereich konnte nicht gespeichert werden"}})}}periodLabel(e){return{morning:"Morgens",forenoon:"Vormittag",noon:"Mittag",afternoon:"Nachmittag",evening:"Abend",night:"Nacht"}[e]||e}isDe(){var e;return(((e=this.props.context)==null?void 0:e.lang)||"de").startsWith("de")}adapterInstance(){return this.state.rxData.adapterInstance||"autism-support.0"}libraryOid(){return this.state.rxData.oidLibrary||`${this.adapterInstance()}.schedule.pictogramLibrary`}syncLibraryFromState(){this.setState({library:z(this.state.values[`${this.libraryOid()}.val`])})}async bootstrapLibrary(){var s;const e=this.libraryOid(),t=(s=this.props.context)==null?void 0:s.socket;if(!(!e||!t||this.state.values[`${e}.val`]!==void 0))try{const i=await t.getState(e);this.setState({library:z(i==null?void 0:i.val)})}catch(i){this.setState({searchError:i.message})}}selectCustomPictogram(e){const t=this.state.selectedIndex;if(t<0){this.setState({searchError:this.isDe()?"Bitte zuerst einen Plan-Eintrag auswählen.":"Select a schedule item first."});return}const s=this.state.draft.items[t];this.updateItem(t,{source:"custom",customRef:e.path,arasaacId:void 0,label:(s==null?void 0:s.label)||e.label}),this.setState({searchError:""})}libraryItemFor(e){if(e)return this.state.library.items.find(t=>t.path===e||t.filename===e||`pictograms/${t.filename}`===e)}async runSearch(){this.setState({busy:!0,searchError:""});try{const e=await K(this.state.rxData.arasaacLanguage||"de",this.state.searchQuery);this.setState({searchHits:e})}catch(e){this.setState({searchError:e.message,searchHits:[]})}finally{this.setState({busy:!1})}}renderCustomHits(){const e=this.state.searchQuery.trim(),t=this.state.library.items.filter(l=>E(l,e));if(!e||t.length===0)return null;const s=Math.max(48,Math.min(96,Number(this.state.rxData.pictogramSize)||64)),i=this.adapterInstance();return o(w,{children:[r(h,{variant:"caption",sx:{fontWeight:700},children:this.isDe()?"Eigene Bilder":"Own images"}),r(p,{sx:{display:"flex",flexWrap:"wrap",gap:1,maxHeight:160,overflowY:"auto"},children:t.map(l=>this.renderLibraryThumb(l,s,i))})]})}renderLibraryThumb(e,t,s){const i=this.state.selectedIndex>=0?this.state.draft.items[this.state.selectedIndex]:null,l=(i==null?void 0:i.source)==="custom"&&i.customRef===e.path;return o(p,{component:"button",type:"button",title:(e.tags||[]).join(", ")||e.label,onClick:()=>this.selectCustomPictogram(e),sx:{width:t+16,p:.5,border:"2px solid",borderColor:l?"primary.main":"divider",borderRadius:1,background:"#fff",cursor:"pointer",display:"flex",flexDirection:"column",alignItems:"center",gap:.5},children:[r(P,{src:ee(e,s),alt:"",width:t,height:t,style:{objectFit:"contain",display:"block"}}),r(h,{variant:"caption",sx:{maxWidth:t+8,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",lineHeight:1.2},children:e.label||e.filename})]},e.id)}renderCustomEditor(e){var u;const t=Math.max(48,Math.min(96,Number(this.state.rxData.pictogramSize)||64)),s=this.adapterInstance(),i=T(e,s),l=this.state.searchQuery.trim(),n=this.state.library.items.filter(a=>E(a,l)),c=(((u=this.libraryItemFor(e.customRef))==null?void 0:u.tags)||[]).join(", ");return o(w,{children:[i?r(P,{src:i,alt:"",width:72,height:72,style:{objectFit:"contain",border:"1px solid #ddd",borderRadius:8}}):null,r(f,{size:"small",label:this.isDe()?"URL oder Dateipfad":"Custom URL or file path",value:e.customRef||"",onChange:a=>this.updateItem(this.state.selectedIndex,{customRef:a.target.value})}),c?o(h,{variant:"caption",children:["Tags: ",c]}):null,r(f,{size:"small",fullWidth:!0,label:this.isDe()?"Eigene Bilder suchen":"Search own images",value:this.state.searchQuery,onChange:a=>this.setState({searchQuery:a.target.value})}),this.state.searchError?r(h,{color:"error",variant:"caption",children:this.state.searchError}):null,r(h,{variant:"caption",sx:{fontWeight:700},children:this.isDe()?"Gespeicherte Bilder – antippen zum Auswählen":"Saved images – tap to select"}),r(p,{sx:{display:"flex",flexWrap:"wrap",gap:1,maxHeight:260,overflowY:"auto"},children:n.length?n.map(a=>this.renderLibraryThumb(a,t,s)):r(h,{variant:"caption",sx:{opacity:.75},children:this.isDe()?"Noch keine eigenen Bilder. Bitte in den Instanzeinstellungen (Admin) hochladen und mit Tags versehen.":"No own images yet. Upload and tag them in the Admin instance settings."})}),r(h,{variant:"caption",sx:{opacity:.75},children:this.isDe()?"Upload und Tags nur in den Instanzeinstellungen (Admin, Reiter Piktogramme). Die Suche hier findet eigene Bilder über Name und Tags.":"Upload and tags are only in Admin instance settings (Pictograms tab). Search here finds own images by name and tags."})]})}renderWidgetBody(e){var c,u;super.renderWidgetBody(e);const t=U(this.state.values[`${this.state.rxData.oidPeriods}.val`]),s=this.getMergedPeriodOverrides(),i=Q(t,s),l=Number(this.state.values[`${this.state.rxData.oidNowMinutes}.val`]??0),n=this.state.selectedIndex>=0?this.state.draft.items[this.state.selectedIndex]:null;return r(p,{sx:{width:"100%",height:"100%",overflow:"auto",p:1,boxSizing:"border-box"},children:o(g,{direction:{xs:"column",md:"row"},spacing:2,sx:{minHeight:"100%"},children:[o(p,{sx:{flex:1,minWidth:280},children:[r(h,{variant:"subtitle1",sx:{mb:1,fontWeight:700},children:this.isDe()?"Wochenplan":"Weekly schedule"}),r(h,{variant:"caption",sx:{display:"block",mb:1,opacity:.85},children:this.activeTemplateLabel()}),r($,{value:this.state.activeWeekday,onChange:(a,d)=>this.setActiveWeekday(d),variant:"scrollable",scrollButtons:"auto",sx:{mb:1,minHeight:36},children:D.map(a=>r(B,{value:a,label:this.weekdayLabel(a),sx:{minHeight:36,py:.5}},a))}),o(g,{direction:"row",spacing:1,sx:{mb:1,flexWrap:"wrap",alignItems:"center"},children:[r(h,{variant:"caption",sx:{fontWeight:700,mr:.5},children:this.isDe()?"Kopieren nach:":"Copy to:"}),D.filter(a=>a!==this.state.activeWeekday).map(a=>r(k,{sx:{mr:.5},control:r(x,{size:"small",checked:!!this.state.copyTargets[a],onChange:(d,b)=>this.setState(v=>({copyTargets:{...v.copyTargets,[a]:b}}))}),label:this.weekdayLabel(a)},a)),r(y,{size:"small",variant:"outlined",disabled:this.state.busy||!D.some(a=>this.state.copyTargets[a]),onClick:()=>this.copyPlanToTargets(),children:this.isDe()?"Übernehmen":"Apply"})]}),o(g,{direction:{xs:"column",sm:"row"},spacing:1,sx:{mb:1,flexWrap:"wrap"},children:[r(f,{size:"small",label:this.isDe()?"Name speichern":"Save as name",value:this.state.templateName,onChange:a=>this.setState({templateName:a.target.value}),sx:{minWidth:160}}),r(y,{size:"small",variant:"outlined",disabled:this.state.busy,onClick:()=>{this.saveAsTemplate()},children:this.isDe()?"Wochenplan speichern":"Save weekly plan"}),o(I,{size:"small",sx:{minWidth:180},children:[r(L,{children:this.isDe()?"Laden":"Load"}),o(_,{label:this.isDe()?"Laden":"Load",value:this.state.loadTemplateId,onChange:a=>this.setState({loadTemplateId:String(a.target.value)}),children:[r(S,{value:"",children:r("em",{children:this.isDe()?"— wählen —":"— select —"})}),this.getLibraryFromState().plans.map(a=>o(S,{value:a.id,children:[a.name,this.getLibraryFromState().activeId===a.id?this.isDe()?" ● aktiv":" ● active":""]},a.id))]})]}),r(y,{size:"small",variant:"outlined",disabled:this.state.busy||!this.state.loadTemplateId,onClick:()=>{this.loadTemplate()},children:this.isDe()?"Wochenplan laden":"Load weekly plan"})]}),o(g,{direction:"row",spacing:1,sx:{mb:1,flexWrap:"wrap"},children:[r(y,{size:"small",variant:"outlined",disabled:this.state.busy,onClick:()=>this.addItemAfterSelected(),children:this.isDe()?"+ Piktogramm":"+ Item"}),r(y,{size:"small",variant:"outlined",disabled:this.state.busy||!this.canDuplicateSelected(),title:this.isDe()?"Kopie des ausgewählten Piktogramms (gleicher Zeitraum). Max. 3 parallel.":"Copy the selected pictogram (same time range). Max. 3 in parallel.",onClick:()=>this.duplicateSelectedItem(),children:this.isDe()?"Duplizieren":"Duplicate"}),r(y,{size:"small",variant:"outlined",color:"error",disabled:this.state.busy||this.state.selectedIndex<0,onClick:()=>this.setState(a=>{const d=a.draft.items.filter((b,v)=>v!==a.selectedIndex);return{draft:{version:1,items:d},selectedIndex:d.length?Math.max(0,a.selectedIndex-1):-1}}),children:this.isDe()?"Löschen":"Delete"}),r(y,{size:"small",variant:"contained",disabled:this.state.busy,onClick:()=>{this.savePlan()},children:this.isDe()?"Speichern":"Save"}),r(y,{size:"small",variant:"outlined",disabled:this.state.busy,onClick:()=>{this.applyCurrentDayToDailyPlan()},children:this.isDe()?"Als Tagesplan":"To daily plan"}),r(y,{size:"small",variant:"outlined",color:"warning",disabled:this.state.busy||this.state.draft.items.length===0,onClick:()=>{this.resetPlan()},children:"Reset"})]}),r(k,{sx:{mb:.5},control:r(x,{size:"small",checked:this.getLoadDailyFromWeeklyChecked(),onChange:(a,d)=>{this.setLoadDailyFromWeekly(d)}}),label:this.isDe()?"Tagesplan täglich aus Wochenplan laden":"Load daily plan from weekly plan each day"}),r(k,{sx:{mb:1},control:r(x,{size:"small",checked:this.getClearAfterLastChecked(),onChange:(a,d)=>{this.setClearAfterLast(d)}}),label:(((c=this.props.context)==null?void 0:c.lang)||"de").startsWith("de")?"Plan nach Ablauf löschen":"Clear plan after last pictogram"}),r(h,{variant:"subtitle2",sx:{mt:1,mb:.5,fontWeight:700},children:"Tagesbereiche"}),r(R,{row:!0,sx:{mb:2},children:t.map(a=>{var d;return r(k,{control:r(x,{size:"small",checked:((d=i.find(b=>b.id===a.id))==null?void 0:d.enabled)!==!1,onChange:(b,v)=>{this.setPeriodEnabled(a.id,v)}}),label:o("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[r(M,{periodId:a.id,size:22,alt:""}),r("span",{style:{width:10,height:10,borderRadius:2,background:a.color,display:"inline-block"}}),this.periodLabel(a.id)]})},a.id)})}),r(g,{spacing:1,sx:{mb:2},children:this.state.draft.items.map((a,d)=>o(y,{size:"small",variant:d===this.state.selectedIndex?"contained":"outlined",onClick:()=>this.setState({selectedIndex:d,searchError:""}),sx:{justifyContent:"flex-start",textTransform:"none"},children:[a.label||a.id," (",a.start,"-",a.end,")"]},a.id))}),n&&o(g,{spacing:1.5,children:[r(f,{size:"small",label:"Label",value:n.label,onChange:a=>this.updateItem(this.state.selectedIndex,{label:a.target.value})}),o(g,{direction:"row",spacing:1,children:[r(f,{size:"small",label:"Start",value:n.start,onChange:a=>this.updateItem(this.state.selectedIndex,{start:a.target.value})}),r(f,{size:"small",label:"End",value:n.end,onChange:a=>this.updateItem(this.state.selectedIndex,{end:a.target.value})})]}),o(I,{size:"small",children:[r(L,{children:"Source"}),o(_,{label:"Source",value:n.source,onChange:a=>this.updateItem(this.state.selectedIndex,{source:a.target.value}),children:[r(S,{value:"arasaac",children:"ARASAAC (external)"}),r(S,{value:"custom",children:"Custom / URL"})]})]}),n.source==="arasaac"?o(w,{children:[r(f,{size:"small",label:"ARASAAC ID",type:"number",value:n.arasaacId??"",onChange:a=>this.updateItem(this.state.selectedIndex,{arasaacId:Number(a.target.value)||void 0})}),o(g,{direction:"row",spacing:1,children:[r(f,{size:"small",fullWidth:!0,label:this.isDe()?"Suche (ARASAAC + eigene Tags)":"Search (ARASAAC + own tags)",value:this.state.searchQuery,onChange:a=>this.setState({searchQuery:a.target.value}),onKeyDown:a=>{a.key==="Enter"&&this.runSearch()}}),r(y,{variant:"outlined",disabled:this.state.busy,onClick:()=>{this.runSearch()},children:this.isDe()?"Suchen":"Search"})]}),this.state.searchError?r(h,{color:"error",variant:"caption",children:this.state.searchError}):null,this.renderCustomHits(),r(p,{sx:{display:"flex",flexWrap:"wrap",gap:1,maxHeight:220,overflowY:"auto"},children:this.state.searchHits.map(a=>{const d=Math.max(48,Math.min(96,Number(this.state.rxData.pictogramSize)||64));return o(p,{component:"button",type:"button",title:a.keyword,onClick:()=>this.updateItem(this.state.selectedIndex,{source:"arasaac",arasaacId:a.id,label:n.label||a.keyword}),sx:{width:d+16,p:.5,border:"1px solid",borderColor:"divider",borderRadius:1,background:"#fff",cursor:"pointer",display:"flex",flexDirection:"column",alignItems:"center",gap:.5,"&:hover":{borderColor:"primary.main"}},children:[r("img",{src:Y(a.id,500),alt:"",width:d,height:d,style:{objectFit:"contain",display:"block"},referrerPolicy:"no-referrer",loading:"lazy"}),r(h,{variant:"caption",sx:{maxWidth:d+8,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",lineHeight:1.2},children:a.keyword})]},a.id)})}),r(h,{variant:"caption",sx:{opacity:.75},children:this.isDe()?"ARASAAC-Bilder kommen nur von static.arasaac.org (CC BY-NC-SA).":"ARASAAC images are loaded from static.arasaac.org only (CC BY-NC-SA)."})]}):this.renderCustomEditor(n)]})]}),r(p,{sx:{flex:1,minHeight:320,border:"1px solid #ddd",borderRadius:2},children:r(H,{plan:this.state.draft,periods:i,nowMinutes:l,adapterInstance:this.state.rxData.adapterInstance||"autism-support.0",pictogramSize:Number(this.state.rxData.pictogramSize)||64,locale:((u=this.props.context)==null?void 0:u.lang)||"de"})})]})})}}export{W as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as a,h as l}from"./_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__loadShare__shared-DnWO7M69.js";import{D as n}from"./DailyScheduleVisual-Cikb1l_S.js";import{p as c,a as m,b as h,c as v}from"./VisFileImage-CI2phrqF.js";import"./vite-preload-helper-BDBacUwf.js";class t extends window.visRxWidget{static adapter;static getWidgetInfo(){return{id:"asDailyScheduleLive",visSet:"autism-support",visSetIcon:"widgets/autism-support/img/autism-support.svg",visSetLabel:"autism_support_widgets",visSetColor:"#FF8A00",visName:"DailyScheduleLive",visAttrs:[{name:"schedule",label:"schedule_states",fields:[{name:"oidPlan",type:"id",label:"oid_schedule_plan",default:"autism-support.0.schedule.plan"},{name:"oidPeriods",type:"id",label:"oid_schedule_periods",default:"autism-support.0.schedule.periods"},{name:"oidPeriodOverrides",type:"id",label:"oid_schedule_period_overrides",default:"autism-support.0.schedule.periodOverrides"},{name:"oidNowMinutes",type:"id",label:"oid_schedule_now",default:"autism-support.0.schedule.nowMinutes"},{name:"oidCurrentItemIndex",type:"id",label:"oid_schedule_current_item",default:"autism-support.0.schedule.currentItemIndex"},{name:"adapterInstance",type:"text",label:"adapter_instance",default:"autism-support.0"},{name:"pictogramSize",type:"number",label:"pictogram_size",default:64,min:32,max:200,step:8}]}],visPrev:"widgets/autism-support/img/daily-schedule-live.png"}}constructor(e){super(e)}getWidgetInfo(){return t.getWidgetInfo()}static getI18nPrefix(){return`${t.adapter}_`}getPeriodOverridesOid(){return this.state.rxData.oidPeriodOverrides||`${this.state.rxData.adapterInstance||"autism-support.0"}.schedule.periodOverrides`}renderWidgetBody(e){var s;super.renderWidgetBody(e);const i=c(this.state.values[`${this.state.rxData.oidPlan}.val`]),r=m(this.state.values[`${this.state.rxData.oidPeriods}.val`]),d=this.getPeriodOverridesOid(),o=h(this.state.values[`${d}.val`]),u=v(r,o),p=Number(this.state.values[`${this.state.rxData.oidNowMinutes}.val`]??0);return a(l,{sx:{width:"100%",height:"100%",bgcolor:"transparent"},children:a(n,{plan:i,periods:u,nowMinutes:p,adapterInstance:this.state.rxData.adapterInstance||"autism-support.0",pictogramSize:Number(this.state.rxData.pictogramSize)||64,locale:((s=this.props.context)==null?void 0:s.lang)||"de"})})}}export{t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as c,i as M,z as q,o as G}from"./_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__loadShare__shared-DnWO7M69.js";import{A as K,h as J,i as $,M as Q,j as Z,r as tt,V as nt}from"./VisFileImage-CI2phrqF.js";const et=""+new URL("morning-C92WgcqR.png",import.meta.url).href,it=""+new URL("forenoon-hySvMp-m.png",import.meta.url).href,ot=""+new URL("noon-BXFO92GD.png",import.meta.url).href,rt=""+new URL("afternoon-NM0E-lhA.png",import.meta.url).href,at=""+new URL("evening-DP1jw1nC.png",import.meta.url).href,st=""+new URL("night-CguR9atX.png",import.meta.url).href,dt={morning:et,forenoon:it,noon:ot,afternoon:rt,evening:at,night:st};function lt(t){return dt[t]}function B({periodId:t,size:n,alt:e=""}){const o=lt(t);return!o||n<12?null:c("img",{src:o,alt:e,width:n,height:n,draggable:!1,style:{width:n,height:n,objectFit:"contain",display:"block",pointerEvents:"none",flexShrink:0,borderRadius:Math.max(2,Math.round(n*.12))}})}const ht="#ECEFF1",ct=16,gt=42;function H(t,n,e){return Math.max(n,Math.min(e,t))}function j(t,n,e){if(t<=0)return 0;const a=(n?10:16)*Math.log2(1+t/(n?15:25)),s=n?e*.55:e*.9;return Math.min(s,Math.max(n?6:8,a))}function L(t,n){const e={morning:"Morgens",forenoon:"Vormittag",noon:"Mittag",afternoon:"Nachmittag",evening:"Abend",night:"Nacht"},o={morning:"Morning",forenoon:"Forenoon",noon:"Noon",afternoon:"Afternoon",evening:"Evening",night:"Night"};return(n.startsWith("de")?e:o)[t]||t}function ft(t){const n=$(t.start),e=$(t.end);return e>n?Math.max(1,e-n):e<n?Math.max(1,1440-n+e):30}function R(t){return $(t.start)}function k(t){return R(t)+ft(t)}function z(t){const n=H(Math.round(t),0,1440),e=Math.floor(n/60)%24,o=n%60;return`${String(e).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function X(t,n,e){return t>=n&&t<e}function pt(t){const n=$(t.start),e=$(t.end);return n===e?[{startMin:0,endMin:1440}]:n<e?[{startMin:n,endMin:e}]:[{startMin:n,endMin:1440},{startMin:0,endMin:e}]}function Mt(t,n,e){const o=[];for(const i of t){const a=R(i),s=k(i),h=Math.max(a,n),d=Math.min(s,e);d>h&&o.push({startMin:h,endMin:d})}return o}function U(t,n){if(!n.length)return 0;if(t<=n[0].startMin)return n[0].topPx;for(const o of n)if(!(t<o.startMin||t>o.endMin)){if(!o.zones.length){const i=Math.max(1,o.endMin-o.startMin),a=H((t-o.startMin)/i,0,1);return o.topPx+a*o.heightPx}for(const i of o.zones)if(t<=i.endMin&&t>=i.startMin){const a=Math.max(1,i.endMin-i.startMin),s=H((t-i.startMin)/a,0,1);return i.topPx+s*i.heightPx}if(t===o.endMin){const i=o.zones[o.zones.length-1];return i.topPx+i.heightPx}}const e=n[n.length-1];return e.topPx+e.heightPx}function ut(t,n){for(const e of t)if(X(n,e.startMin,e.endMin))return U(n,t);return null}function mt(t,n=Q){const e=t.map((a,s)=>({index:s,startMin:a.startMin,endMin:a.endMin})).sort((a,s)=>a.startMin-s.startMin||s.endMin-a.endMin),o=[],i=new Array(t.length).fill(0);for(const a of e){let s=0;for(;s<n&&s<o.length&&o[s]>a.startMin;)s+=1;s>=n?(s=n-1,o[s]=Math.max(o[s]??0,a.endMin)):s===o.length?o.push(a.endMin):o[s]=a.endMin,i[a.index]=s}return i}function xt(t,n,e,o){const i=o+ct+gt,a=i,s=[];for(const g of n)for(const l of pt(g)){const p=Mt(t,l.startMin,l.endMin),y=X(e,l.startMin,l.endMin);!p.length&&!y||s.push({period:g,segStart:l.startMin,segEnd:l.endMin,clips:p,hasNow:y})}const h=[];let d=0;s.forEach((g,l)=>{const p=l===0,y=l===s.length-1,{period:r,segStart:x,segEnd:v,clips:S,hasNow:bt}=g;let P=[],E=a;if(!S.length)E=a,P=[{startMin:x,endMin:v,topPx:d,heightPx:E}];else{const C=Math.min(...S.map(w=>w.startMin)),D=Math.max(...S.map(w=>w.endMin)),V=Math.max(1,D-C),W=Math.max(0,C-x),O=Math.max(0,v-D);let A=S.length*i;for(const w of S){const Y=Math.max(1,w.endMin-w.startMin);A=Math.max(A,i*V/Y)}const F=j(W,p,i),T=j(O,y,i);E=Math.max(a,F+A+T);let _=d;F>0&&W>0&&(P.push({startMin:x,endMin:C,topPx:_,heightPx:F}),_+=F),P.push({startMin:C,endMin:D,topPx:_,heightPx:A}),_+=A,T>0&&O>0&&P.push({startMin:D,endMin:v,topPx:_,heightPx:T})}h.push({id:`${r.id}-${x}`,periodId:r.id,color:r.enabled?r.color:ht,enabled:r.enabled,startMin:x,endMin:v,topPx:d,heightPx:E,itemCount:S.length,zones:P}),d+=E});const b=d,u=t.map((g,l)=>({item:g,itemIndex:l,startMin:R(g),endMin:k(g)})).filter(g=>{if(!h.length)return!1;const l=h[0].startMin,p=h[h.length-1].endMin;return g.endMin>l&&g.startMin<p}),m=mt(u),I=m.length?Math.max(...m)+1:1,N=u.map((g,l)=>{const p=U(g.startMin,h),y=U(g.endMin,h);return{...g,topPx:p,heightPx:Math.max(i,y-p),lane:m[l]??0}});return{blocks:h,placements:N,laneCount:I,totalHeight:b}}function yt(t,n,e,o,i){const{item:a,topPx:s,heightPx:h,lane:d}=t,b=Z(a,e),f=tt(a,o),u=2,m=u+d*(i+12),I=(d+1)*4+(b?2:0);return M("div",{style:{position:"absolute",top:s,left:m,right:u,height:h,boxSizing:"border-box",borderRadius:10,border:b?"2px solid #FF8A00":"1.5px solid rgba(255,255,255,0.35)",background:b?"rgba(255,138,0,0.16)":"rgba(0,0,0,0.28)",display:"flex",flexDirection:"column",alignItems:"flex-start",gap:4,padding:"6px 8px 8px",overflow:"hidden",zIndex:I},title:`${a.label||"—"} · ${a.start} – ${a.end}`,children:[M("div",{style:{width:"100%",textAlign:"left",flexShrink:0},children:[c("div",{style:{fontWeight:700,fontSize:Math.max(12,Math.min(16,i*.2)),lineHeight:1.15,overflow:"hidden",display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical"},children:a.label||"—"}),M("div",{style:{fontSize:11,opacity:.8,lineHeight:1.2},children:[a.start," – ",a.end]})]}),c("div",{style:{width:i,height:i,flexShrink:0,borderRadius:8,background:"#fff",display:"flex",alignItems:"center",justifyContent:"center",overflow:"hidden"},children:f?c(nt,{src:f,alt:"",style:{width:"100%",height:"100%",objectFit:"contain"},referrerPolicy:"no-referrer"}):c("span",{style:{fontSize:12,opacity:.5},children:"?"})})]})}function wt({plan:t,periods:n,nowMinutes:e,adapterInstance:o="autism-support.0",locale:i="de",pictogramSize:a=64}){const s=Math.max(32,Math.min(200,Number(a)||64)),h=[...t.items].sort((r,x)=>R(r)-R(x)),{blocks:d,placements:b,laneCount:f,totalHeight:u}=xt(h,n,e,s),m=ut(d,e),I=t.items.some(r=>r.source==="arasaac"&&r.arasaacId),N=i.startsWith("de")?K:J,g=n.filter(r=>r.enabled),l=d.filter(r=>r.enabled),p=d.length?d[0].startMin:0,y=d.length?d[d.length-1].endMin:1440;return M("div",{style:{width:"100%",height:"100%",display:"flex",flexDirection:"column",gap:8,padding:8,boxSizing:"border-box",fontFamily:"Segoe UI, system-ui, sans-serif"},children:[c("div",{style:{flex:1,minHeight:0,overflowY:"auto",overflowX:"hidden"},children:d.length===0?c("div",{style:{opacity:.7,padding:12},children:"—"}):M("div",{style:{display:"flex",gap:4,height:u},children:[c("div",{style:{flex:1,position:"relative",height:u,minWidth:s*Math.max(1,f)+(Math.max(1,f)-1)*12+36},children:b.map(r=>c(q.Fragment,{children:yt(r,f,e,o,s)},r.item.id||r.itemIndex))}),M("div",{style:{flex:"0 0 96px",width:96,position:"relative",height:u,borderRadius:10,overflow:"hidden",border:"1px solid #CFD8DC",background:"#ECEFF1"},title:`${z(p)} – ${z(y)}`,children:[d.map((r,x)=>{const v=Math.min(64,Math.max(0,r.heightPx-8));return c("div",{style:{position:"absolute",left:0,right:0,top:r.topPx,height:r.heightPx,background:r.color,boxSizing:"border-box",borderBottom:x<d.length-1?"1px solid rgba(255,255,255,0.55)":"none",opacity:r.enabled?1:.35,display:"flex",alignItems:"center",justifyContent:"center"},title:r.enabled?`${L(r.periodId,i)} · ${z(r.startMin)} – ${z(r.endMin)}`:`${L(r.periodId,i)} (${i.startsWith("de")?"aus":"off"})`,children:c(B,{periodId:r.periodId,size:v,alt:L(r.periodId,i)})},r.id)}),m!=null&&M(G,{children:[c("div",{style:{position:"absolute",left:0,right:0,top:m,height:3,background:"#D32F2F",boxShadow:"0 0 0 1px rgba(255,255,255,0.85)",zIndex:2,pointerEvents:"none"}}),c("div",{style:{position:"absolute",left:"50%",marginLeft:-7,top:m-7,width:14,height:14,borderRadius:"50%",background:"#D32F2F",border:"2px solid #fff",zIndex:3,pointerEvents:"none"}})]})]})]})}),c("div",{style:{fontSize:11,opacity:.7},children:i.startsWith("de")?`${h.length} Piktogramm${h.length===1?"":"e"} · ${l.length} Tagesbereich${l.length===1?"":"e"}${f>1?` · ${f} Spalten`:""}`:`${h.length} pictogram${h.length===1?"":"s"} · ${l.length} day period${l.length===1?"":"s"}${f>1?` · ${f} columns`:""}`}),M("div",{style:{display:"flex",flexWrap:"wrap",gap:8,fontSize:12},children:[g.map(r=>M("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[c(B,{periodId:r.id,size:18,alt:""}),c("span",{style:{width:12,height:12,borderRadius:2,background:r.color,display:"inline-block"}}),L(r.id,i)]},r.id)),M("span",{style:{display:"inline-flex",alignItems:"center",gap:4,marginLeft:4},children:[c("span",{style:{width:12,height:3,background:"#D32F2F",display:"inline-block"}}),i.startsWith("de")?"jetzt":"now"]})]}),I&&c("div",{style:{fontSize:10,lineHeight:1.35,opacity:.75},children:N})]})}export{wt as D,B as P};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as i,g as p}from"./_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__loadShare__shared-DnWO7M69.js";const A="https://api.arasaac.org/v1",g="https://static.arasaac.org/pictograms",$="Piktogramme: Eigentum der Regierung von Aragón, erstellt von Sergio Palao für ARASAAC (https://arasaac.org), Lizenz CC BY-NC-SA.",M="Pictograms: property of the Government of Aragon, created by Sergio Palao for ARASAAC (https://arasaac.org), license CC BY-NC-SA.";function h(r,a=500){const t=Math.max(1,Math.floor(Number(r)||0));return`${g}/${t}/${t}_${a===300?300:500}.png`}function S(r,a){const t=encodeURIComponent(r),n=encodeURIComponent(a.trim());return`${A}/pictograms/${t}/search/${n}`}async function E(r,a){const t=a.trim();if(t.length<2)return[];const n=await fetch(S(r,t));if(!n.ok)throw new Error(`ARASAAC search failed (${n.status})`);return(await n.json()||[]).slice(0,24).map(e=>{var o,u;return{id:e._id,keyword:((u=(o=e.keywords)==null?void 0:o[0])==null?void 0:u.keyword)||String(e._id)}})}const d=[{id:"morning",enabled:!0,start:"06:00",end:"09:00",color:"#FFE082"},{id:"forenoon",enabled:!0,start:"09:00",end:"12:00",color:"#FFCC80"},{id:"noon",enabled:!0,start:"12:00",end:"14:00",color:"#FFAB91"},{id:"afternoon",enabled:!0,start:"14:00",end:"17:00",color:"#81C784"},{id:"evening",enabled:!0,start:"17:00",end:"21:00",color:"#7986CB"},{id:"night",enabled:!0,start:"21:00",end:"06:00",color:"#5C6BC0"}];function c(r){const a=/^(\d{1,2}):(\d{2})$/.exec(String(r||"").trim());if(!a)return 0;const t=Math.min(23,Math.max(0,Number(a[1]))),n=Math.min(59,Math.max(0,Number(a[2])));return t*60+n}function f(r){const a=(Math.round(r)%1440+1440)%1440,t=Math.floor(a/60),n=a%60;return`${String(t).padStart(2,"0")}:${String(n).padStart(2,"0")}`}function m(r){const a=c(r.start),t=c(r.end);return t>a?Math.max(1,t-a):t<a?Math.max(1,1440-a+t):60}const I=3;function R(r,a,t,n){const s=(e,o)=>e===o?[]:e<o?[{s:e,e:o}]:[{s:e,e:1440},{s:0,e:o}];for(const e of s(r,a))for(const o of s(t,n))if(e.s<o.e&&o.s<e.e)return!0;return!1}function C(r,a,t){const n=c(a),s=c(t);return r.filter(e=>R(n,s,c(e.start),c(e.end))).length}function U(r,a){return C(r,a.start,a.end)<I}function P(r){if(!r)return{id:`item-${Date.now()}`,label:"",start:"08:00",end:"09:00",source:"arasaac",arasaacId:void 0,customRef:""};const a=m(r),t=c(r.end);return{id:`item-${Date.now()}`,label:"",start:f(t),end:f(t+a),source:"arasaac",arasaacId:void 0,customRef:""}}function T(r){return{...r,id:`item-${Date.now()}`,label:r.label,start:r.start,end:r.end,source:r.source,arasaacId:r.arasaacId,customRef:r.customRef}}function B(r,a){const t=c(r.start),n=c(r.end),s=(a%1440+1440)%1440;return t===n?!1:t<n?s>=t&&s<n:s>=t||s<n}function N(r){try{const a=typeof r=="string"?JSON.parse(r):r;return!a||typeof a!="object"||!Array.isArray(a.items)?{version:1,items:[]}:{version:1,items:a.items.map((t,n)=>({id:String((t==null?void 0:t.id)||`item-${n}`),label:String((t==null?void 0:t.label)||""),start:String((t==null?void 0:t.start)||"08:00"),end:String((t==null?void 0:t.end)||"09:00"),source:(t==null?void 0:t.source)==="custom"?"custom":"arasaac",arasaacId:(t==null?void 0:t.arasaacId)!=null?Number(t.arasaacId):void 0,customRef:t!=null&&t.customRef?String(t.customRef):void 0}))}}catch{return{version:1,items:[]}}}function x(r){try{const a=typeof r=="string"?JSON.parse(r):r;return!Array.isArray(a)||a.length===0?d:a.map(t=>({...t,enabled:t.enabled!==!1}))}catch{return d}}function D(r){try{const a=typeof r=="string"?JSON.parse(r):r;return!a||typeof a!="object"||Array.isArray(a)?{}:a}catch{return{}}}function F(r,a){return r.map(t=>({...t,enabled:a[t.id]===void 0?t.enabled!==!1:!!a[t.id]}))}function b(r){return`/${r.replace(/^\/+/,"").split("/").filter(Boolean).map(a=>encodeURIComponent(a)).join("/")}`}function v(r){const a=r.replace(/^\/+/,"").replace(/^files\//,"").replace(/^vis-2\.0\//,"");return a.startsWith("Autismus Unterstützung/")||a.startsWith("main/autism-support/pictograms/")?a:`Autismus Unterstützung/pictograms/${a.split("/").pop()||a}`}function O(r,a="autism-support.0"){if(r.source==="arasaac"&&r.arasaacId)return h(r.arasaacId,500);if(r.source==="custom"&&r.customRef){const t=r.customRef.trim();return/^https?:\/\//i.test(t)||t.startsWith("data:")?t:b(`vis-2.0/${v(t)}`)}return null}function _(r){if(!r)return[];if(/^https?:\/\//i.test(r)||r.startsWith("data:"))return[r];const a=r.startsWith("/")?r:`/${r}`,t=a.startsWith("/files/")?a:`/files${a}`;return a===t?[a]:[a,t]}function k(r){const{src:a="",onError:t,...n}=r,s=_(a),[e,o]=i.useState(0);i.useEffect(()=>{o(0)},[a]);const u=s[Math.min(e,Math.max(0,s.length-1))]||"";return p("img",{...n,src:u,onError:l=>{if(e+1<s.length){o(e+1);return}t==null||t(l)}})}export{$ as A,I as M,k as V,x as a,D as b,F as c,P as d,U as e,T as f,h as g,M as h,c as i,B as j,N as p,O as r,E as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as a,i as p,h,j as f,k as S,l as x,m}from"./_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__loadShare__shared-DnWO7M69.js";import{c as v}from"./createSvgIcon-_KtdxP_v.js";import{V as M}from"./VisualCountdownVisual-DsNNd0p5.js";import"./vite-preload-helper-BDBacUwf.js";import"./emotion-utils.browser.esm-gq80zcZX.js";const E=v(a("path",{d:"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6z"}),"KeyboardArrowDown"),w=v(a("path",{d:"M7.41 15.41 12 10.83l4.59 4.58L18 14l-6-6-6 6z"}),"KeyboardArrowUp");function b(i,t,e){return Math.max(t,Math.min(e,i))}function D({label:i,value:t,min:e,max:r,onChange:s,colorText:o,colorBorder:l,colorArrows:d}){const c=u=>{s(b(t+u,e,r))};return p(h,{sx:{display:"flex",flexDirection:"column",alignItems:"center",gap:.25},children:[a(f,{size:"small","aria-label":`${i} increase`,onClick:()=>c(1),sx:{color:d},children:a(w,{fontSize:"small"})}),a(S,{size:"small",label:i,value:t,onChange:u=>{const g=Number.parseInt(u.target.value,10);s(Number.isFinite(g)?b(g,e,r):e)},inputProps:{min:e,max:r,inputMode:"numeric",style:{textAlign:"center",color:o}},InputLabelProps:{sx:{color:o,"&.Mui-focused":{color:o}}},sx:{width:88,"& .MuiOutlinedInput-root":{color:o,"& fieldset":{borderColor:l},"&:hover fieldset":{borderColor:l},"&.Mui-focused fieldset":{borderColor:l}},"& .MuiInputBase-input":{color:o}}}),a(f,{size:"small","aria-label":`${i} decrease`,onClick:()=>c(-1),sx:{color:d},children:a(E,{fontSize:"small"})})]})}function I({hours:i,minutes:t,maxHours:e,hoursLabel:r,minutesLabel:s,onChange:o,colorText:l="#000000",colorBorder:d="#9E9E9E",colorArrows:c="#000000"}){return p(h,{sx:{display:"flex",gap:1,alignItems:"center"},children:[a(D,{label:r,value:i,min:0,max:e,colorText:l,colorBorder:d,colorArrows:c,onChange:u=>o(u,t)}),a(h,{sx:{fontSize:24,fontWeight:700,pt:2,color:l},children:":"}),a(D,{label:s,value:t,min:0,max:59,colorText:l,colorBorder:d,colorArrows:c,onChange:u=>o(i,u)})]})}function y(i){return(i||"").replace(/[{}]/g,"").trim()}function _(i){const t=Math.max(0,Math.round(i));return{hours:Math.floor(t/3600),minutes:Math.floor(t%3600/60)}}class n extends window.visRxWidget{static adapter;constructor(t){super(t),this.state={...this.state,durationHours:1,durationMinutes:0}}static getWidgetInfo(){return{id:"asVisualCountdownConfig",visSet:"autism-support",visName:"VisualCountdownConfig",visAttrs:[{name:"timer",label:"timer_states",fields:[{name:"oidDuration",type:"id",label:"oid_duration",default:"autism-support.0.timer.duration"},{name:"oidRemaining",type:"id",label:"oid_remaining",default:"autism-support.0.timer.remaining"},{name:"oidStart",type:"id",label:"oid_start",default:"autism-support.0.timer.start"},{name:"oidPause",type:"id",label:"oid_pause",default:"autism-support.0.timer.pause"},{name:"oidResume",type:"id",label:"oid_resume",default:"autism-support.0.timer.resume"},{name:"oidStop",type:"id",label:"oid_stop",default:"autism-support.0.timer.stop"},{name:"maxDurationHours",type:"number",label:"max_duration_hours",default:24,min:1,max:24}]},{name:"appearance",label:"appearance",fields:[{name:"colorDigital",type:"color",label:"color_digital",default:"#000000"},{name:"colorRemaining",type:"color",label:"color_remaining",default:"#FF8A00"},{name:"colorElapsed",type:"color",label:"color_elapsed",default:"#E0E0E0"},{name:"colorControlsText",type:"color",label:"color_controls_text",default:"#000000"},{name:"colorControlsBorder",type:"color",label:"color_controls_border",default:"#9E9E9E"},{name:"colorControlsArrows",type:"color",label:"color_controls_arrows",default:"#000000"},{name:"geometry",type:"select",label:"geometry",default:"square",options:[{value:"square",label:"geometry_square"},{value:"ring",label:"geometry_ring"},{value:"triangle",label:"geometry_triangle"},{value:"diamond",label:"geometry_diamond"},{value:"pentagon",label:"geometry_pentagon"},{value:"hexagon",label:"geometry_hexagon"},{value:"octagon",label:"geometry_octagon"}]},{name:"ringWidthPercent",type:"number",label:"ring_width_percent",default:18,min:5,max:45,step:1},{name:"showBorder",type:"checkbox",label:"show_border",default:!1},{name:"colorBorder",type:"color",label:"color_border",default:"#424242",hidden:"!data.showBorder"}]}],visPrev:"widgets/autism-support/img/visual-countdown-config.png"}}getWidgetInfo(){return n.getWidgetInfo()}static getI18nPrefix(){return`${n.adapter}_`}componentDidMount(){super.componentDidMount(),this.syncDurationInputsFromState()}onStateUpdated(t,e){if(t===y(this.state.rxData.oidDuration)&&typeof(e==null?void 0:e.val)=="number"){const r=_(e.val);this.setState({durationHours:r.hours,durationMinutes:r.minutes})}}syncDurationInputsFromState(){const t=Number(this.state.values[`${this.state.rxData.oidDuration}.val`]);if(Number.isFinite(t)){const e=_(t);this.setState({durationHours:e.hours,durationMinutes:e.minutes})}}sendState(t,e){var s,o;const r=y(t);!r||!((o=(s=this.props.context)==null?void 0:s.socket)!=null&&o.setState)||this.props.context.socket.setState(r,{val:e,ack:!1})}applyDuration(){const t=Number(this.state.rxData.maxDurationHours)||24,e=Math.min(t,Math.max(0,this.state.durationHours)),r=Math.min(59,Math.max(0,this.state.durationMinutes)),s=e*3600+r*60;s<60||this.sendState(this.state.rxData.oidDuration,s)}renderWidgetBody(t){super.renderWidgetBody(t);const e=Number(this.state.values[`${this.state.rxData.oidDuration}.val`]??3600),r=Number(this.state.values[`${this.state.rxData.oidRemaining}.val`]??e),s=Number(this.state.rxData.maxDurationHours)||24;return a(h,{sx:{width:"100%",height:"100%",bgcolor:"transparent",p:1,boxSizing:"border-box"},children:p(x,{spacing:1,sx:{height:"100%"},children:[a(h,{sx:{flex:1,minHeight:180},children:a(M,{durationSeconds:e,remainingSeconds:r,size:220,colorDigital:this.state.rxData.colorDigital||"#000000",colorRemaining:this.state.rxData.colorRemaining||"#FF8A00",colorElapsed:this.state.rxData.colorElapsed||"#E0E0E0",ringWidthPercent:Number(this.state.rxData.ringWidthPercent)||18,geometry:this.state.rxData.geometry||"square",showBorder:!!this.state.rxData.showBorder,colorBorder:this.state.rxData.colorBorder||"#424242"})}),p(x,{direction:"row",spacing:1,alignItems:"center",flexWrap:"wrap",children:[a(I,{hours:this.state.durationHours,minutes:this.state.durationMinutes,maxHours:s,hoursLabel:n.t("hours"),minutesLabel:n.t("minutes"),colorText:this.state.rxData.colorControlsText||"#000000",colorBorder:this.state.rxData.colorControlsBorder||"#9E9E9E",colorArrows:this.state.rxData.colorControlsArrows||"#000000",onChange:(o,l)=>this.setState({durationHours:o,durationMinutes:l})}),a(m,{variant:"outlined",onClick:()=>this.applyDuration(),sx:{color:this.state.rxData.colorControlsText||"#000000",borderColor:this.state.rxData.colorControlsBorder||"#9E9E9E"},children:n.t("apply_duration")})]}),p(x,{direction:"row",spacing:1,flexWrap:"wrap",children:[a(m,{variant:"contained",color:"success",onClick:()=>this.sendState(this.state.rxData.oidStart,!0),children:n.t("start")}),a(m,{variant:"contained",color:"warning",onClick:()=>this.sendState(this.state.rxData.oidPause,!0),children:n.t("pause")}),a(m,{variant:"contained",color:"info",onClick:()=>this.sendState(this.state.rxData.oidResume,!0),children:n.t("resume")}),a(m,{variant:"contained",color:"error",onClick:()=>this.sendState(this.state.rxData.oidStop,!0),children:n.t("stop")})]})]})})}}export{n as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as r,h as i}from"./_virtual_mf___mfe_internal__vis2AutismSupportWidgets__mf_owner__186959098399227__loadShare__shared-DnWO7M69.js";import{V as l}from"./VisualCountdownVisual-DsNNd0p5.js";import"./vite-preload-helper-BDBacUwf.js";class t extends window.visRxWidget{static adapter;static getWidgetInfo(){return{id:"asVisualCountdownLive",visSet:"autism-support",visSetIcon:"widgets/autism-support/img/autism-support.svg",visSetLabel:"autism_support_widgets",visSetColor:"#FF8A00",visName:"VisualCountdownLive",visAttrs:[{name:"timer",label:"timer_states",fields:[{name:"oidDuration",type:"id",label:"oid_duration",default:"autism-support.0.timer.duration"},{name:"oidRemaining",type:"id",label:"oid_remaining",default:"autism-support.0.timer.remaining"}]},{name:"appearance",label:"appearance",fields:[{name:"colorDigital",type:"color",label:"color_digital",default:"#000000"},{name:"colorRemaining",type:"color",label:"color_remaining",default:"#FF8A00"},{name:"colorElapsed",type:"color",label:"color_elapsed",default:"#E0E0E0"},{name:"geometry",type:"select",label:"geometry",default:"square",options:[{value:"square",label:"geometry_square"},{value:"ring",label:"geometry_ring"},{value:"triangle",label:"geometry_triangle"},{value:"diamond",label:"geometry_diamond"},{value:"pentagon",label:"geometry_pentagon"},{value:"hexagon",label:"geometry_hexagon"},{value:"octagon",label:"geometry_octagon"}]},{name:"ringWidthPercent",type:"number",label:"ring_width_percent",default:18,min:5,max:45,step:1},{name:"showBorder",type:"checkbox",label:"show_border",default:!1},{name:"colorBorder",type:"color",label:"color_border",default:"#424242",hidden:"!data.showBorder"}]}],visPrev:"widgets/autism-support/img/visual-countdown-live.png"}}constructor(e){super(e)}getWidgetInfo(){return t.getWidgetInfo()}static getI18nPrefix(){return`${t.adapter}_`}renderWidgetBody(e){super.renderWidgetBody(e);const a=Number(this.state.values[`${this.state.rxData.oidDuration}.val`]??3600),o=Number(this.state.values[`${this.state.rxData.oidRemaining}.val`]??a);return r(i,{sx:{width:"100%",height:"100%",bgcolor:"transparent"},children:r(l,{durationSeconds:a,remainingSeconds:o,colorDigital:this.state.rxData.colorDigital||"#000000",colorRemaining:this.state.rxData.colorRemaining||"#FF8A00",colorElapsed:this.state.rxData.colorElapsed||"#E0E0E0",ringWidthPercent:Number(this.state.rxData.ringWidthPercent)||18,geometry:this.state.rxData.geometry||"square",showBorder:!!this.state.rxData.showBorder,colorBorder:this.state.rxData.colorBorder||"#424242"})})}}export{t as default};
|