@conduction/nextcloud-vue 2.62.0 → 2.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue.js +10 -0
- package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue.js.map +1 -0
- package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue2.js +189 -0
- package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue2.js.map +1 -0
- package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue3.js +72 -0
- package/dist/esm/components/CnAdminActionCard/CnAdminActionCard.vue3.js.map +1 -0
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +425 -39
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +119 -42
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +186 -9
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +65 -42
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +61 -16
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +20 -0
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -2
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +33 -2
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js +53 -37
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +29 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +152 -135
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue.js +10 -0
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue.js.map +1 -0
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js +293 -0
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js.map +1 -0
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js +189 -0
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js.map +1 -0
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +253 -9
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +126 -50
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +66 -14
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +23 -14
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +2 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue2.js +3 -1
- package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue2.js.map +1 -1
- package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue3.js +1 -1
- package/dist/esm/components/CnFieldHelper/CnFieldHelper.vue3.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +234 -9
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +96 -57
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +81 -4
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +22 -5
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +81 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +7 -3
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/selfModeActions.js +3 -3
- package/dist/esm/components/CnIndexPage/selfModeActions.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +41 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +8 -3
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue2.js +121 -12
- package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue2.js.map +1 -1
- package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue3.js +3 -1
- package/dist/esm/components/CnResourceSelect/CnResourceSelect.vue3.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +326 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +112 -26
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +63 -2
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +96 -37
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/stagesModel.js +5 -2
- package/dist/esm/components/CnStagesWidget/stagesModel.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +52 -2
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -6
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +14 -2
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +2 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +10 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js.map +1 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +337 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js +102 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js +34 -0
- package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js.map +1 -0
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js +131 -8
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js.map +1 -1
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js +40 -38
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +8 -6
- package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +73 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +14 -2
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js +19 -0
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js +1 -1
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js.map +1 -1
- package/dist/esm/composables/useDependencyCheck.js +65 -0
- package/dist/esm/composables/useDependencyCheck.js.map +1 -0
- package/dist/esm/composables/useWalkthrough.js +218 -6
- package/dist/esm/composables/useWalkthrough.js.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +45 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +45 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +780 -81
- package/dist/esm/store/useObjectStore.js +8 -0
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/columnFilters.js +311 -0
- package/dist/esm/utils/columnFilters.js.map +1 -0
- package/dist/esm/utils/groupAutocomplete.js +123 -0
- package/dist/esm/utils/groupAutocomplete.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +2 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/pickerOptions.js +198 -0
- package/dist/esm/utils/pickerOptions.js.map +1 -0
- package/dist/esm/utils/schema.js +83 -7
- package/dist/esm/utils/schema.js.map +1 -1
- package/dist/esm/utils/schemaRefSlug.js +19 -3
- package/dist/esm/utils/schemaRefSlug.js.map +1 -1
- package/dist/esm/utils/timelineEvents.js +174 -0
- package/dist/esm/utils/timelineEvents.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/walkthroughSignals.js +88 -0
- package/dist/esm/utils/walkthroughSignals.js.map +1 -0
- package/dist/nextcloud-vue.cjs.js +13088 -7937
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +780 -81
- package/l10n/en.json +45 -0
- package/l10n/nl.json +45 -0
- package/package.json +1 -1
- package/src/components/CnAdminActionCard/CnAdminActionCard.vue +234 -0
- package/src/components/CnAdminActionCard/index.js +4 -0
- package/src/components/CnAppNav/CnAppNav.vue +568 -43
- package/src/components/CnAppRoot/CnAppRoot.md +4 -0
- package/src/components/CnAppRoot/CnAppRoot.vue +223 -16
- package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +61 -16
- package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +22 -1
- package/src/components/CnCellRenderer/CnCellRenderer.vue +33 -2
- package/src/components/CnChoiceCards/CnChoiceCards.vue +56 -31
- package/src/components/CnDashboardPage/CnDashboardPage.vue +45 -4
- package/src/components/CnDataTable/CnColumnFilterPopover.vue +524 -0
- package/src/components/CnDataTable/CnDataTable.md +3 -0
- package/src/components/CnDataTable/CnDataTable.vue +305 -5
- package/src/components/CnDetailPage/CnDetailPage.md +4 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +60 -1
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +2 -2
- package/src/components/CnFieldHelper/CnFieldHelper.vue +4 -2
- package/src/components/CnFormDialog/CnFormDialog.vue +290 -31
- package/src/components/CnHeaderWidget/CnHeaderWidget.vue +116 -6
- package/src/components/CnIndexPage/CnIndexPage.vue +87 -4
- package/src/components/CnIndexPage/selfModeActions.js +3 -3
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +46 -2
- package/src/components/CnResourceSelect/CnResourceSelect.vue +123 -12
- package/src/components/CnSetupWizard/CnSetupWizard.vue +392 -3
- package/src/components/CnStagesWidget/CnStagesWidget.vue +180 -2
- package/src/components/CnStagesWidget/stagesModel.js +5 -2
- package/src/components/CnStatWidget/CnStatWidget.vue +57 -3
- package/src/components/CnTabsWidget/CnTabsWidget.vue +15 -2
- package/src/components/CnTimelineWidget/CnTimelineWidget.vue +477 -0
- package/src/components/CnTimelineWidget/dashboardRegistration.js +32 -0
- package/src/components/CnTimelineWidget/index.js +4 -0
- package/src/components/CnWalkthrough/CnWalkthrough.vue +143 -10
- package/src/components/CnWidgetGrid/builtInWidgets.js +2 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +4 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +107 -1
- package/src/components/CnWizardDialog/CnWizardDialog.vue +20 -1
- package/src/components/index.js +2 -0
- package/src/composables/useDependencyCheck.js +61 -0
- package/src/composables/useWalkthrough.js +217 -5
- package/src/css/dashboard.css +49 -0
- package/src/css/detail-page.css +29 -4
- package/src/css/kpi-card.css +24 -1
- package/src/css/table.css +99 -6
- package/src/index.js +2 -0
- package/src/schemas/app-manifest-v2.schema.json +135 -3
- package/src/store/useObjectStore.js +8 -0
- package/src/utils/columnFilters.js +324 -0
- package/src/utils/groupAutocomplete.js +119 -0
- package/src/utils/libraryWidgetKeys.js +2 -0
- package/src/utils/pickerOptions.js +194 -0
- package/src/utils/schema.js +83 -7
- package/src/utils/schemaRefSlug.js +19 -3
- package/src/utils/timelineEvents.js +171 -0
- package/src/utils/validateManifestV2.compiled.js +2 -2
- package/src/utils/walkthroughSignals.js +94 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWalkthrough.js","sources":["../../../src/composables/useWalkthrough.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { computed, ref } from 'vue'\n\n/**\n * Per-`appId` cache so all consumers of one app share a single walkthrough\n * machine + persisted progress for the page lifetime (mirrors useSetupStatus).\n */\nconst cache = new Map()\n\n/**\n * localStorage key prefix for the per-browser mirror of the last-seen version.\n * The AUTHORITATIVE store is the per-user server preference addressed by\n * `manifest.walkthrough.completionConfigKey`; this is the synchronous cache /\n * offline fallback so the tour never flashes before the GET resolves.\n */\nexport const WALKTHROUGH_SEEN_STORAGE_PREFIX = 'cn-walkthrough-seen:'\n\n/**\n * Build the per-user preferences endpoint for a walkthrough completion key.\n * Read (`GET`) and write (`PUT`) MUST address the same URL — a persist that\n * lands on a different key reads back as \"never seen\" forever.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey`.\n * @return {string} The generated `/apps/{appId}/api/preferences/{key}` URL.\n */\nexport function walkthroughPreferenceUrl(appId, configKey) {\n\treturn generateUrl('/apps/' + appId + '/api/preferences/' + configKey)\n}\n\n/**\n * Normalise a stored completion value into the string the version engine\n * compares against.\n *\n * Only `null` / `undefined` / `''` mean \"never seen\". Anything else counts as\n * seen — including the JS-falsy scalars `false`, `0` and `'0'`, which a plain\n * truthiness check would misread as a fresh user and re-open the tour on every\n * visit. This is the read-side counterpart of `persistWalkthroughSeenVersion`.\n *\n * @param {unknown} value The raw stored / API value.\n * @return {string} The last-seen version, or `''` when never seen.\n */\nexport function normaliseSeenVersion(value) {\n\tif (value === null || value === undefined) {\n\t\treturn ''\n\t}\n\tif (typeof value === 'string') {\n\t\treturn value\n\t}\n\treturn String(value)\n}\n\n/**\n * Resolve the injectable `localStorage` backend (null in SSR / locked-down\n * browsers, where persistence degrades to session-only).\n *\n * @param {Storage} [injected] Test-injected storage.\n * @return {Storage|null} The storage backend or null.\n */\nfunction resolveStorage(injected) {\n\tif (injected) {\n\t\treturn injected\n\t}\n\tif (typeof window === 'undefined') {\n\t\treturn null\n\t}\n\ttry {\n\t\treturn window.localStorage\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Read the per-browser mirror of the last-seen walkthrough version.\n * Synchronous, so callers can seed state before the server GET resolves.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {Storage} [storage] Injectable storage backend.\n * @return {string} The last-seen version, or `''`.\n */\nexport function readLocalWalkthroughSeenVersion(appId, storage) {\n\tconst s = resolveStorage(storage)\n\tif (!s) {\n\t\treturn ''\n\t}\n\ttry {\n\t\treturn normaliseSeenVersion(s.getItem(WALKTHROUGH_SEEN_STORAGE_PREFIX + appId))\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/**\n * Write the per-browser mirror of the last-seen walkthrough version.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} version The version to record.\n * @param {Storage} [storage] Injectable storage backend.\n * @return {void}\n */\nfunction writeLocalWalkthroughSeenVersion(appId, version, storage) {\n\tconst s = resolveStorage(storage)\n\tif (!s) {\n\t\treturn\n\t}\n\ttry {\n\t\ts.setItem(WALKTHROUGH_SEEN_STORAGE_PREFIX + appId, version)\n\t} catch {\n\t\t/* quota / private mode — persistence is best-effort */\n\t}\n}\n\n/**\n * Type guard — true for a plain (non-null, non-array) object. Used to reject\n * the SPA index HTML Nextcloud returns (with status 200) when an app does not\n * actually serve `/api/preferences/{key}`.\n *\n * @param {unknown} value Candidate.\n * @return {boolean} True when value is a plain object.\n */\nfunction isPlainObject(value) {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * Load the user's last-seen walkthrough version (ADR-043, REQ-WALK-NV-004).\n *\n * The per-USER server preference addressed by `completionConfigKey` is\n * authoritative (cross-device); the localStorage mirror is the fallback used\n * when no key is declared, the endpoint is absent, or the request fails. A\n * `{ value: null }` response is a definitive \"never seen\" and correctly yields\n * the local mirror (usually `''`).\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).\n * @param {object} [options] `{ http, storage }` injection points for tests.\n * @return {Promise<string>} The last-seen version, or `''` for a fresh user.\n */\nexport async function loadWalkthroughSeenVersion(appId, configKey, options = {}) {\n\tconst local = readLocalWalkthroughSeenVersion(appId, options.storage)\n\tif (!configKey) {\n\t\treturn local\n\t}\n\tconst http = options.http || axios\n\ttry {\n\t\tconst { data } = await http.get(walkthroughPreferenceUrl(appId, configKey))\n\t\t// Only a real preferences payload counts. An HTML string (SPA fallback\n\t\t// from an app that doesn't serve the route) is NOT a \"never seen\"\n\t\t// signal — fall back to the local mirror instead.\n\t\tif (!isPlainObject(data) || !('value' in data)) {\n\t\t\treturn local\n\t\t}\n\t\tconst seen = normaliseSeenVersion(data.value)\n\t\tif (seen) {\n\t\t\twriteLocalWalkthroughSeenVersion(appId, seen, options.storage)\n\t\t\treturn seen\n\t\t}\n\t\treturn local\n\t} catch {\n\t\t// Unauthenticated / endpoint missing / offline.\n\t\treturn local\n\t}\n}\n\n/**\n * Persist the user's last-seen walkthrough version (ADR-043, REQ-WALK-NV-006).\n *\n * Writes the localStorage mirror synchronously AND `PUT`s the same\n * `completionConfigKey` preference the load path reads, so a returning user —\n * on this browser or any other — is not shown the tour again. Never throws:\n * a failed write only means the tour may re-open elsewhere.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).\n * @param {string} version The app version to record as seen.\n * @param {object} [options] `{ http, storage }` injection points for tests.\n * @return {Promise<boolean>} True when the server preference was written.\n */\nexport function persistWalkthroughSeenVersion(appId, configKey, version, options = {}) {\n\tconst value = normaliseSeenVersion(version)\n\twriteLocalWalkthroughSeenVersion(appId, value, options.storage)\n\tif (!configKey) {\n\t\treturn Promise.resolve(false)\n\t}\n\tconst http = options.http || axios\n\ttry {\n\t\treturn Promise.resolve(http.put(walkthroughPreferenceUrl(appId, configKey), { value }))\n\t\t\t.then(() => true)\n\t\t\t.catch(() => false)\n\t} catch {\n\t\treturn Promise.resolve(false)\n\t}\n}\n\n/**\n * Compare two semver-ish strings. Missing / unparseable parts sort as 0.\n *\n * @param {string} a Left version.\n * @param {string} b Right version.\n * @return {number} -1 / 0 / 1.\n */\nexport function compareSemver(a, b) {\n\tconst pa = String(a || '0').split('.').map((n) => parseInt(n, 10) || 0)\n\tconst pb = String(b || '0').split('.').map((n) => parseInt(n, 10) || 0)\n\tfor (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n\t\tconst d = (pa[i] || 0) - (pb[i] || 0)\n\t\tif (d !== 0) {\n\t\t\treturn d < 0 ? -1 : 1\n\t\t}\n\t}\n\treturn 0\n}\n\n/**\n * Replace `{{var}}` tokens in a string from a context bag. Unknown keys are\n * left intact (and warned in dev) so a misauthored tour degrades visibly.\n *\n * @param {string} input The template string.\n * @param {object} context The context bag.\n * @return {string} The interpolated string.\n */\nexport function interpolateTokens(input, context) {\n\tif (typeof input !== 'string' || input.indexOf('{{') === -1) {\n\t\treturn input\n\t}\n\treturn input.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (m, key) => {\n\t\tif (context && Object.hasOwn(context, key) && context[key] !== null && context[key] !== undefined) {\n\t\t\treturn String(context[key])\n\t\t}\n\t\treturn m\n\t})\n}\n\n/**\n * Walkthrough engine (ADR-043). Loads `manifest.walkthrough`, composes the\n * active tour for the current user + app version, and runs a step machine whose\n * advancement is fed declarative *signals* (route change, object created,\n * element appeared, click, delay) by the rendering component — keeping this\n * composable pure and unit-testable. Captured route params / object ids land in\n * a context bag interpolated into later steps via `{{var}}`.\n *\n * Persistence is decoupled: pass `seenVersion` (the user's last-seen app version)\n * and an `onComplete(appVersion)` callback. CnAppRoot wires these to the per-user\n * `manifest.walkthrough.completionConfigKey` preference via\n * {@link loadWalkthroughSeenVersion} / {@link persistWalkthroughSeenVersion}.\n *\n * @param {string} appId The Nextcloud app id (cache key).\n * @param {object} manifest The app manifest (reads `manifest.walkthrough` + `manifest.version`).\n * @param {object} [options] `{ appVersion, seenVersion, resume, onComplete }`.\n * @return {object} The reactive machine + controls (see properties below).\n *\n * @example\n * const wt = useWalkthrough('pipelinq', manifest, { seenVersion: '1.0.0' })\n * wt.start('getting-started')\n * wt.notify({ kind: 'route', route: 'Products', params: { id: '42' } })\n */\nexport function useWalkthrough(appId, manifest, options = {}) {\n\tlet entry = cache.get(appId)\n\tif (!entry) {\n\t\tconst walkthrough = (manifest && manifest.walkthrough) || {}\n\t\tconst appVersion = options.appVersion || (manifest && manifest.version) || '0.0.0'\n\t\t// Normalised, NOT `|| ''`: a completed user whose recorded version is a\n\t\t// JS-falsy scalar (`0` / `false`) must still read as \"has seen it\".\n\t\tconst seenVersion = normaliseSeenVersion(options.seenVersion)\n\t\tconst enabled = walkthrough.enabled !== false && Array.isArray(walkthrough.tours) && walkthrough.tours.length > 0\n\n\t\tconst tours = walkthrough.tours || []\n\t\tconst activeTourId = ref(null)\n\t\tconst currentIndex = ref(0)\n\t\tconst context = ref({})\n\t\tconst running = ref(false)\n\t\t// True while a user-initiated replay is active (the \"Restart tutorial\"\n\t\t// entry). A replay shows the FULL tour regardless of the persisted\n\t\t// seen-version — otherwise a returning user, whose seenVersion already\n\t\t// covers every step's sinceVersion, would replay an empty tour.\n\t\tconst replaying = ref(false)\n\n\t\t/**\n\t\t * Compose the step set for a tour, filtered by version: a fresh user\n\t\t * (no seenVersion) gets all steps `<= appVersion`; an upgraded user gets\n\t\t * only steps newer than seenVersion and `<= appVersion`. A user-initiated\n\t\t * replay (`replaying`) ignores seenVersion and shows every step\n\t\t * `<= appVersion`.\n\t\t *\n\t\t * @param {object} tour The tour definition.\n\t\t * @return {Array} The visible steps for this user.\n\t\t */\n\t\tfunction composeSteps(tour) {\n\t\t\tconst all = Array.isArray(tour.steps) ? tour.steps : []\n\t\t\treturn all.filter((s) => {\n\t\t\t\tconst since = s.sinceVersion || '0.0.0'\n\t\t\t\tif (compareSemver(since, appVersion) > 0) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (!replaying.value && seenVersion && compareSemver(since, seenVersion) <= 0) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\n\t\tconst activeTour = computed(() => {\n\t\t\tif (!activeTourId.value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst tour = tours.find((t) => t.id === activeTourId.value)\n\t\t\tif (!tour) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { ...tour, steps: composeSteps(tour) }\n\t\t})\n\n\t\t/**\n\t\t * The tour that should auto-start for this user, or null. A\n\t\t * `version-bump` tour only qualifies when it has a non-empty step delta;\n\t\t * `first-visit` qualifies only when the user has never seen the tour.\n\t\t *\n\t\t * @return {object|null} The auto-start tour (raw definition) or null.\n\t\t */\n\t\tconst autoStartTour = computed(() => {\n\t\t\tif (!enabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tfor (const tour of tours) {\n\t\t\t\tif (tour.minAppVersion && compareSemver(appVersion, tour.minAppVersion) < 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst steps = composeSteps(tour)\n\t\t\t\tif (steps.length === 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (tour.trigger === 'first-visit' && !seenVersion) {\n\t\t\t\t\treturn tour\n\t\t\t\t}\n\t\t\t\tif (tour.trigger === 'version-bump' && seenVersion && compareSemver(appVersion, seenVersion) > 0) {\n\t\t\t\t\treturn tour\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t})\n\n\t\tconst currentStep = computed(() => {\n\t\t\tconst t = activeTour.value\n\t\t\tif (!t) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst raw = t.steps[currentIndex.value]\n\t\t\tif (!raw) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn interpolateStep(raw, context.value)\n\t\t})\n\t\tconst totalSteps = computed(() => (activeTour.value ? activeTour.value.steps.length : 0))\n\t\tconst isFirst = computed(() => currentIndex.value === 0)\n\t\tconst isLast = computed(() => totalSteps.value > 0 && currentIndex.value === totalSteps.value - 1)\n\n\t\t/**\n\t\t * Apply `{{var}}` interpolation to a step's user-facing + targeting fields.\n\t\t *\n\t\t * @param {object} step The raw step.\n\t\t * @param {object} ctx The context bag.\n\t\t * @return {object} A shallow copy with tokens resolved.\n\t\t */\n\t\tfunction interpolateStep(step, ctx) {\n\t\t\tconst out = { ...step }\n\t\t\tfor (const k of ['title', 'body', 'task']) {\n\t\t\t\tif (out[k]) {\n\t\t\t\t\tout[k] = interpolateTokens(out[k], ctx)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (out.target) {\n\t\t\t\tout.target = { ...out.target }\n\t\t\t\tif (out.target.ref) {\n\t\t\t\t\tout.target.ref = interpolateTokens(out.target.ref, ctx)\n\t\t\t\t}\n\t\t\t\tif (out.target.selector) {\n\t\t\t\t\tout.target.selector = interpolateTokens(out.target.selector, ctx)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (out.advanceOn) {\n\t\t\t\tout.advanceOn = { ...out.advanceOn }\n\t\t\t\tif (out.advanceOn.route) {\n\t\t\t\t\tout.advanceOn.route = interpolateTokens(out.advanceOn.route, ctx)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out\n\t\t}\n\n\t\t/**\n\t\t * Run a step's `advanceOn.capture` against captured values.\n\t\t *\n\t\t * @param {object} step The active (raw) step.\n\t\t * @param {object} source `{ params?, object? }` to read captured values from.\n\t\t * @return {void}\n\t\t */\n\t\tfunction runCapture(step, source) {\n\t\t\tconst cap = step && step.advanceOn && step.advanceOn.capture\n\t\t\tif (!cap) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst next = { ...context.value }\n\t\t\tfor (const [varName, token] of Object.entries(cap)) {\n\t\t\t\tconst key = String(token).replace(/^:/, '')\n\t\t\t\tlet value\n\t\t\t\tif (source.params && key in source.params) {\n\t\t\t\t\tvalue = source.params[key]\n\t\t\t\t} else if (source.object) {\n\t\t\t\t\tvalue = (key === 'id') ? (source.object.id ?? source.object['@self']?.id ?? source.object.uuid) : source.object[key]\n\t\t\t\t}\n\t\t\t\tif (value !== null && value !== undefined) {\n\t\t\t\t\tnext[varName] = value\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontext.value = next\n\t\t}\n\n\t\t/**\n\t\t * Advance to the next step, or complete on the last step. Skips\n\t\t * subsequent `optional` steps whose target ref is empty after interpolation.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction next() {\n\t\t\tif (!activeTour.value) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (currentIndex.value >= totalSteps.value - 1) {\n\t\t\t\tcomplete()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcurrentIndex.value += 1\n\t\t}\n\t\t/**\n\t\t * Step back (no-op on the first step).\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction back() {\n\t\t\tif (currentIndex.value > 0) {\n\t\t\t\tcurrentIndex.value -= 1\n\t\t\t}\n\t\t}\n\t\t/**\n\t\t * Skip the active step (advance without satisfying its condition).\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction skip() {\n\t\t\tnext()\n\t\t}\n\t\t/**\n\t\t * Jump to a step by id within the active tour.\n\t\t *\n\t\t * @param {string} stepId The target step id.\n\t\t * @return {void}\n\t\t */\n\t\tfunction jumpTo(stepId) {\n\t\t\tif (!activeTour.value) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst idx = activeTour.value.steps.findIndex((s) => s.id === stepId)\n\t\t\tif (idx >= 0) {\n\t\t\t\tcurrentIndex.value = idx\n\t\t\t}\n\t\t}\n\t\t/**\n\t\t * Start a tour by id at its first (resume) step.\n\t\t *\n\t\t * @param {string} tourId The tour id.\n\t\t * @param {number} [startIndex] Optional resume index.\n\t\t * @return {void}\n\t\t */\n\t\tfunction start(tourId, startIndex = 0) {\n\t\t\treplaying.value = false\n\t\t\tactiveTourId.value = tourId\n\t\t\tcurrentIndex.value = startIndex\n\t\t\tcontext.value = {}\n\t\t\trunning.value = true\n\t\t}\n\t\t/**\n\t\t * Restart a tour from the beginning (used by the \"Restart tutorial\" /\n\t\t * \"Replay\" entry). Runs in replay mode so the FULL tour shows even for a\n\t\t * returning user whose persisted seen-version already covers every step.\n\t\t *\n\t\t * @param {string} tourId The tour id.\n\t\t * @return {void}\n\t\t */\n\t\tfunction restart(tourId) {\n\t\t\tstart(tourId, 0)\n\t\t\treplaying.value = true\n\t\t}\n\t\t/**\n\t\t * Dismiss the active tour without marking it complete.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction dismiss() {\n\t\t\trunning.value = false\n\t\t\tactiveTourId.value = null\n\t\t\treplaying.value = false\n\t\t}\n\t\t/**\n\t\t * Mark the active tour complete: stop running and invoke the\n\t\t * `onComplete(appVersion)` persistence callback so the seen version is\n\t\t * recorded by the consumer (CnAppRoot).\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction complete() {\n\t\t\trunning.value = false\n\t\t\tactiveTourId.value = null\n\t\t\treplaying.value = false\n\t\t\tif (typeof options.onComplete === 'function') {\n\t\t\t\toptions.onComplete(appVersion)\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Feed a declarative advance signal to the active step. When the signal\n\t\t * satisfies the step's `advanceOn`, captures run and the tour advances.\n\t\t *\n\t\t * @param {object} signal `{ kind: 'route'|'object-created'|'element'|'click'|'delay', route?, params?, object? }`.\n\t\t * @return {boolean} Whether the signal advanced the tour.\n\t\t */\n\t\tfunction notify(signal) {\n\t\t\tconst step = activeTour.value && activeTour.value.steps[currentIndex.value]\n\t\t\tif (!step || !step.advanceOn) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst a = step.advanceOn\n\t\t\tlet match = false\n\t\t\tif (signal.kind === 'route' && a.type === 'route-match') {\n\t\t\t\tmatch = signal.route === a.route\n\t\t\t\tif (match) {\n\t\t\t\t\trunCapture(step, { params: signal.params || {} })\n\t\t\t\t}\n\t\t\t} else if (signal.kind === 'object-created' && a.type === 'object-created') {\n\t\t\t\tconst obj = signal.object || {}\n\t\t\t\tconst reg = obj.register ?? obj['@self']?.register\n\t\t\t\tconst sch = obj.schema ?? obj['@self']?.schema\n\t\t\t\tmatch = (!a.register || reg === a.register) && (!a.schema || sch === a.schema)\n\t\t\t\tif (match) {\n\t\t\t\t\trunCapture(step, { object: obj })\n\t\t\t\t}\n\t\t\t} else if (signal.kind === 'element' && a.type === 'element-appears') {\n\t\t\t\tmatch = true\n\t\t\t} else if (signal.kind === 'click' && a.type === 'click-target') {\n\t\t\t\tmatch = true\n\t\t\t} else if (signal.kind === 'delay' && a.type === 'delay') {\n\t\t\t\tmatch = true\n\t\t\t}\n\t\t\tif (match) {\n\t\t\t\tnext()\n\t\t\t}\n\t\t\treturn match\n\t\t}\n\n\t\tentry = {\n\t\t\tenabled,\n\t\t\tappVersion,\n\t\t\tseenVersion,\n\t\t\ttours,\n\t\t\tactiveTour,\n\t\t\tautoStartTour,\n\t\t\tcurrentStep,\n\t\t\ttotalSteps,\n\t\t\tisFirst,\n\t\t\tisLast,\n\t\t\tcontext,\n\t\t\trunning,\n\t\t\treplaying,\n\t\t\tstart,\n\t\t\trestart,\n\t\t\tnext,\n\t\t\tback,\n\t\t\tskip,\n\t\t\tjumpTo,\n\t\t\tdismiss,\n\t\t\tcomplete,\n\t\t\tnotify,\n\t\t\tinterpolate: (s) => interpolateTokens(s, context.value),\n\t\t}\n\t\tcache.set(appId, entry)\n\n\t\t// Resume token (cross-app hand-off / refresh) — start at the resume step.\n\t\tif (options.resume && options.resume.tourId) {\n\t\t\tconst tour = tours.find((t) => t.id === options.resume.tourId)\n\t\t\tif (tour) {\n\t\t\t\tconst steps = composeSteps(tour)\n\t\t\t\tconst idx = Math.max(0, steps.findIndex((s) => s.id === options.resume.stepId))\n\t\t\t\tstart(options.resume.tourId, idx)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn entry\n}\n\n/**\n * Test-only helper to reset the per-`appId` cache.\n *\n * @internal\n */\nexport function __resetWalkthroughCacheForTests() {\n\tcache.clear()\n}\n"],"names":["axios"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useWalkthrough.js","sources":["../../../src/composables/useWalkthrough.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { computed, ref } from 'vue'\n\n/**\n * Per-`appId` cache so all consumers of one app share a single walkthrough\n * machine + persisted progress for the page lifetime (mirrors useSetupStatus).\n */\nconst cache = new Map()\n\n/**\n * localStorage key prefix for the per-browser mirror of the last-seen version.\n * The AUTHORITATIVE store is the per-user server preference addressed by\n * `manifest.walkthrough.completionConfigKey`; this is the synchronous cache /\n * offline fallback so the tour never flashes before the GET resolves.\n */\nexport const WALKTHROUGH_SEEN_STORAGE_PREFIX = 'cn-walkthrough-seen:'\n\n/**\n * Build the per-user preferences endpoint for a walkthrough completion key.\n * Read (`GET`) and write (`PUT`) MUST address the same URL — a persist that\n * lands on a different key reads back as \"never seen\" forever.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey`.\n * @return {string} The generated `/apps/{appId}/api/preferences/{key}` URL.\n */\nexport function walkthroughPreferenceUrl(appId, configKey) {\n\treturn generateUrl('/apps/' + appId + '/api/preferences/' + configKey)\n}\n\n/**\n * Normalise a stored completion value into the string the version engine\n * compares against.\n *\n * Only `null` / `undefined` / `''` mean \"never seen\". Anything else counts as\n * seen — including the JS-falsy scalars `false`, `0` and `'0'`, which a plain\n * truthiness check would misread as a fresh user and re-open the tour on every\n * visit. This is the read-side counterpart of `persistWalkthroughSeenVersion`.\n *\n * @param {unknown} value The raw stored / API value.\n * @return {string} The last-seen version, or `''` when never seen.\n */\nexport function normaliseSeenVersion(value) {\n\tif (value === null || value === undefined) {\n\t\treturn ''\n\t}\n\tif (typeof value === 'string') {\n\t\treturn value\n\t}\n\treturn String(value)\n}\n\n/**\n * Resolve the injectable `localStorage` backend (null in SSR / locked-down\n * browsers, where persistence degrades to session-only).\n *\n * @param {Storage} [injected] Test-injected storage.\n * @return {Storage|null} The storage backend or null.\n */\nfunction resolveStorage(injected) {\n\tif (injected) {\n\t\treturn injected\n\t}\n\tif (typeof window === 'undefined') {\n\t\treturn null\n\t}\n\ttry {\n\t\treturn window.localStorage\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Read the per-browser mirror of the last-seen walkthrough version.\n * Synchronous, so callers can seed state before the server GET resolves.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {Storage} [storage] Injectable storage backend.\n * @return {string} The last-seen version, or `''`.\n */\nexport function readLocalWalkthroughSeenVersion(appId, storage) {\n\tconst s = resolveStorage(storage)\n\tif (!s) {\n\t\treturn ''\n\t}\n\ttry {\n\t\treturn normaliseSeenVersion(s.getItem(WALKTHROUGH_SEEN_STORAGE_PREFIX + appId))\n\t} catch {\n\t\treturn ''\n\t}\n}\n\n/**\n * Write the per-browser mirror of the last-seen walkthrough version.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} version The version to record.\n * @param {Storage} [storage] Injectable storage backend.\n * @return {void}\n */\nfunction writeLocalWalkthroughSeenVersion(appId, version, storage) {\n\tconst s = resolveStorage(storage)\n\tif (!s) {\n\t\treturn\n\t}\n\ttry {\n\t\ts.setItem(WALKTHROUGH_SEEN_STORAGE_PREFIX + appId, version)\n\t} catch {\n\t\t/* quota / private mode — persistence is best-effort */\n\t}\n}\n\n/**\n * Type guard — true for a plain (non-null, non-array) object. Used to reject\n * the SPA index HTML Nextcloud returns (with status 200) when an app does not\n * actually serve `/api/preferences/{key}`.\n *\n * @param {unknown} value Candidate.\n * @return {boolean} True when value is a plain object.\n */\nfunction isPlainObject(value) {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * Load the user's last-seen walkthrough version (ADR-043, REQ-WALK-NV-004).\n *\n * The per-USER server preference addressed by `completionConfigKey` is\n * authoritative (cross-device); the localStorage mirror is the fallback used\n * when no key is declared, the endpoint is absent, or the request fails. A\n * `{ value: null }` response is a definitive \"never seen\" and correctly yields\n * the local mirror (usually `''`).\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).\n * @param {object} [options] `{ http, storage }` injection points for tests.\n * @return {Promise<string>} The last-seen version, or `''` for a fresh user.\n */\nexport async function loadWalkthroughSeenVersion(appId, configKey, options = {}) {\n\tconst local = readLocalWalkthroughSeenVersion(appId, options.storage)\n\tif (!configKey) {\n\t\treturn local\n\t}\n\tconst http = options.http || axios\n\ttry {\n\t\tconst { data } = await http.get(walkthroughPreferenceUrl(appId, configKey))\n\t\t// Only a real preferences payload counts. An HTML string (SPA fallback\n\t\t// from an app that doesn't serve the route) is NOT a \"never seen\"\n\t\t// signal — fall back to the local mirror instead.\n\t\tif (!isPlainObject(data) || !('value' in data)) {\n\t\t\treturn local\n\t\t}\n\t\tconst seen = normaliseSeenVersion(data.value)\n\t\tif (seen) {\n\t\t\twriteLocalWalkthroughSeenVersion(appId, seen, options.storage)\n\t\t\treturn seen\n\t\t}\n\t\treturn local\n\t} catch {\n\t\t// Unauthenticated / endpoint missing / offline.\n\t\treturn local\n\t}\n}\n\n/**\n * Persist the user's last-seen walkthrough version (ADR-043, REQ-WALK-NV-006).\n *\n * Writes the localStorage mirror synchronously AND `PUT`s the same\n * `completionConfigKey` preference the load path reads, so a returning user —\n * on this browser or any other — is not shown the tour again. Never throws:\n * a failed write only means the tour may re-open elsewhere.\n *\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).\n * @param {string} version The app version to record as seen.\n * @param {object} [options] `{ http, storage }` injection points for tests.\n * @return {Promise<boolean>} True when the server preference was written.\n */\nexport function persistWalkthroughSeenVersion(appId, configKey, version, options = {}) {\n\tconst value = normaliseSeenVersion(version)\n\twriteLocalWalkthroughSeenVersion(appId, value, options.storage)\n\tif (!configKey) {\n\t\treturn Promise.resolve(false)\n\t}\n\tconst http = options.http || axios\n\ttry {\n\t\treturn Promise.resolve(http.put(walkthroughPreferenceUrl(appId, configKey), { value }))\n\t\t\t.then(() => true)\n\t\t\t.catch(() => false)\n\t} catch {\n\t\treturn Promise.resolve(false)\n\t}\n}\n\n/**\n * localStorage key prefix for the per-browser mirror of tour progress.\n */\nexport const WALKTHROUGH_PROGRESS_STORAGE_PREFIX = 'cn-walkthrough-progress:'\n\n/**\n * The preference key that holds tour progress, next to the completion key.\n *\n * @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).\n * @return {string} `<configKey>-progress`, or '' when no key is declared.\n */\nexport function walkthroughProgressKey(configKey) {\n\treturn configKey ? configKey + '-progress' : ''\n}\n\n/**\n * Normalise stored progress (an object, or the JSON string a preference\n * holds) into `{ tourId, stepId, index, version }`, or null.\n *\n * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md\n * @param {unknown} value The stored value.\n * @return {{tourId: string, stepId: string, index: number, version: string}|null} The progress.\n */\nexport function normaliseWalkthroughProgress(value) {\n\tlet data = value\n\tif (typeof data === 'string') {\n\t\tif (data === '') {\n\t\t\treturn null\n\t\t}\n\t\ttry {\n\t\t\tdata = JSON.parse(data)\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\tif (!isPlainObject(data) || typeof data.tourId !== 'string' || data.tourId === '') {\n\t\treturn null\n\t}\n\treturn {\n\t\ttourId: data.tourId,\n\t\tstepId: typeof data.stepId === 'string' ? data.stepId : '',\n\t\tindex: Number.isInteger(data.index) && data.index >= 0 ? data.index : 0,\n\t\tversion: typeof data.version === 'string' ? data.version : '',\n\t}\n}\n\n/**\n * Read the per-browser mirror of the tour progress. Synchronous.\n *\n * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md\n * @param {string} appId The Nextcloud app id.\n * @param {Storage} [storage] Injectable storage backend.\n * @return {object|null} The progress, or null.\n */\nexport function readLocalWalkthroughProgress(appId, storage) {\n\tconst s = resolveStorage(storage)\n\tif (!s) {\n\t\treturn null\n\t}\n\ttry {\n\t\treturn normaliseWalkthroughProgress(s.getItem(WALKTHROUGH_PROGRESS_STORAGE_PREFIX + appId))\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Load the user's tour progress: the per-user preference\n * `<completionConfigKey>-progress` when declared, else the local mirror.\n *\n * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).\n * @param {object} [options] `{ http, storage }` injection points for tests.\n * @return {Promise<object|null>} The progress, or null.\n */\nexport async function loadWalkthroughProgress(appId, configKey, options = {}) {\n\tconst local = readLocalWalkthroughProgress(appId, options.storage)\n\tconst key = walkthroughProgressKey(configKey)\n\tif (!key) {\n\t\treturn local\n\t}\n\tconst http = options.http || axios\n\ttry {\n\t\tconst { data } = await http.get(walkthroughPreferenceUrl(appId, key))\n\t\tif (!isPlainObject(data) || !('value' in data)) {\n\t\t\treturn local\n\t\t}\n\t\treturn normaliseWalkthroughProgress(data.value) || local\n\t} catch {\n\t\treturn local\n\t}\n}\n\n/**\n * Persist the user's tour progress, or clear it with `null`. Writes the\n * local mirror and, with a completion key, the per-user preference. Never\n * throws.\n *\n * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md\n * @param {string} appId The Nextcloud app id.\n * @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).\n * @param {object|null} progress `{ tourId, stepId, index, version }`, or null to clear.\n * @param {object} [options] `{ http, storage }` injection points for tests.\n * @return {Promise<boolean>} True when the server preference was written.\n */\nexport function persistWalkthroughProgress(appId, configKey, progress, options = {}) {\n\tconst value = progress ? normaliseWalkthroughProgress(progress) : null\n\tconst raw = value ? JSON.stringify(value) : ''\n\tconst s = resolveStorage(options.storage)\n\tif (s) {\n\t\ttry {\n\t\t\tif (raw) {\n\t\t\t\ts.setItem(WALKTHROUGH_PROGRESS_STORAGE_PREFIX + appId, raw)\n\t\t\t} else {\n\t\t\t\ts.removeItem(WALKTHROUGH_PROGRESS_STORAGE_PREFIX + appId)\n\t\t\t}\n\t\t} catch {\n\t\t\t/* quota / private mode: best-effort */\n\t\t}\n\t}\n\tconst key = walkthroughProgressKey(configKey)\n\tif (!key) {\n\t\treturn Promise.resolve(false)\n\t}\n\tconst http = options.http || axios\n\ttry {\n\t\treturn Promise.resolve(http.put(walkthroughPreferenceUrl(appId, key), { value: raw }))\n\t\t\t.then(() => true)\n\t\t\t.catch(() => false)\n\t} catch {\n\t\treturn Promise.resolve(false)\n\t}\n}\n\n/**\n * Whether an `object-created` signal satisfies a step's `advanceOn`.\n *\n * The signal's own `register` / `schema` (the slugs the creating surface\n * knows) are compared first; an object's `@self` values are numeric ids on\n * OpenRegister and only match a step that also uses ids.\n *\n * @param {object} advanceOn The step's `advanceOn`.\n * @param {object} signal `{ register?, schema?, object? }`.\n * @return {boolean} True when it matches.\n */\nfunction objectCreatedMatches(advanceOn, signal) {\n\tconst obj = signal.object || {}\n\tconst self = obj['@self'] || {}\n\tconst same = (want, candidates) => !want || candidates\n\t\t.filter((c) => c !== null && c !== undefined && c !== '')\n\t\t.some((c) => String(c).toLowerCase() === String(want).toLowerCase())\n\treturn same(advanceOn.register, [signal.register, obj.register, self.register])\n\t\t&& same(advanceOn.schema, [signal.schema, obj.schema, self.schema])\n}\n\n/**\n * Compare two semver-ish strings. Missing / unparseable parts sort as 0.\n *\n * @param {string} a Left version.\n * @param {string} b Right version.\n * @return {number} -1 / 0 / 1.\n */\nexport function compareSemver(a, b) {\n\tconst pa = String(a || '0').split('.').map((n) => parseInt(n, 10) || 0)\n\tconst pb = String(b || '0').split('.').map((n) => parseInt(n, 10) || 0)\n\tfor (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n\t\tconst d = (pa[i] || 0) - (pb[i] || 0)\n\t\tif (d !== 0) {\n\t\t\treturn d < 0 ? -1 : 1\n\t\t}\n\t}\n\treturn 0\n}\n\n/**\n * Replace `{{var}}` tokens in a string from a context bag. Unknown keys are\n * left intact (and warned in dev) so a misauthored tour degrades visibly.\n *\n * @param {string} input The template string.\n * @param {object} context The context bag.\n * @return {string} The interpolated string.\n */\nexport function interpolateTokens(input, context) {\n\tif (typeof input !== 'string' || input.indexOf('{{') === -1) {\n\t\treturn input\n\t}\n\treturn input.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (m, key) => {\n\t\tif (context && Object.hasOwn(context, key) && context[key] !== null && context[key] !== undefined) {\n\t\t\treturn String(context[key])\n\t\t}\n\t\treturn m\n\t})\n}\n\n/**\n * Walkthrough engine (ADR-043). Loads `manifest.walkthrough`, composes the\n * active tour for the current user + app version, and runs a step machine whose\n * advancement is fed declarative *signals* (route change, object created,\n * element appeared, click, delay) by the rendering component — keeping this\n * composable pure and unit-testable. Captured route params / object ids land in\n * a context bag interpolated into later steps via `{{var}}`.\n *\n * Persistence is decoupled: pass `seenVersion` (the user's last-seen app version)\n * and an `onComplete(appVersion)` callback. CnAppRoot wires these to the per-user\n * `manifest.walkthrough.completionConfigKey` preference via\n * {@link loadWalkthroughSeenVersion} / {@link persistWalkthroughSeenVersion}.\n *\n * @param {string} appId The Nextcloud app id (cache key).\n * @param {object} manifest The app manifest (reads `manifest.walkthrough` + `manifest.version`).\n * @param {object} [options] `{ appVersion, seenVersion, resume, onComplete }`.\n * @return {object} The reactive machine + controls (see properties below).\n *\n * @example\n * const wt = useWalkthrough('pipelinq', manifest, { seenVersion: '1.0.0' })\n * wt.start('getting-started')\n * wt.notify({ kind: 'route', route: 'Products', params: { id: '42' } })\n */\nexport function useWalkthrough(appId, manifest, options = {}) {\n\tlet entry = cache.get(appId)\n\tif (!entry) {\n\t\tconst walkthrough = (manifest && manifest.walkthrough) || {}\n\t\tconst appVersion = options.appVersion || (manifest && manifest.version) || '0.0.0'\n\t\t// Normalised, NOT `|| ''`: a completed user whose recorded version is a\n\t\t// JS-falsy scalar (`0` / `false`) must still read as \"has seen it\".\n\t\tconst seenVersion = normaliseSeenVersion(options.seenVersion)\n\t\tconst enabled = walkthrough.enabled !== false && Array.isArray(walkthrough.tours) && walkthrough.tours.length > 0\n\n\t\tconst tours = walkthrough.tours || []\n\t\tconst activeTourId = ref(null)\n\t\tconst currentIndex = ref(0)\n\t\tconst context = ref({})\n\t\tconst running = ref(false)\n\t\t// True while the tour is hidden by ESC or a backdrop click. The tour\n\t\t// and its step stay, so it continues where it was.\n\t\tconst paused = ref(false)\n\t\t// True while a user-initiated replay is active (the \"Restart tutorial\"\n\t\t// entry). A replay shows the FULL tour regardless of the persisted\n\t\t// seen-version — otherwise a returning user, whose seenVersion already\n\t\t// covers every step's sinceVersion, would replay an empty tour.\n\t\tconst replaying = ref(false)\n\n\t\t/**\n\t\t * Compose the step set for a tour, filtered by version: a fresh user\n\t\t * (no seenVersion) gets all steps `<= appVersion`; an upgraded user gets\n\t\t * only steps newer than seenVersion and `<= appVersion`. A user-initiated\n\t\t * replay (`replaying`) ignores seenVersion and shows every step\n\t\t * `<= appVersion`.\n\t\t *\n\t\t * @param {object} tour The tour definition.\n\t\t * @return {Array} The visible steps for this user.\n\t\t */\n\t\tfunction composeSteps(tour) {\n\t\t\tconst all = Array.isArray(tour.steps) ? tour.steps : []\n\t\t\treturn all.filter((s) => {\n\t\t\t\tconst since = s.sinceVersion || '0.0.0'\n\t\t\t\tif (compareSemver(since, appVersion) > 0) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (!replaying.value && seenVersion && compareSemver(since, seenVersion) <= 0) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\n\t\tconst activeTour = computed(() => {\n\t\t\tif (!activeTourId.value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst tour = tours.find((t) => t.id === activeTourId.value)\n\t\t\tif (!tour) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { ...tour, steps: composeSteps(tour) }\n\t\t})\n\n\t\t/**\n\t\t * The tour that should auto-start for this user, or null. A\n\t\t * `version-bump` tour only qualifies when it has a non-empty step delta;\n\t\t * `first-visit` qualifies only when the user has never seen the tour.\n\t\t *\n\t\t * @return {object|null} The auto-start tour (raw definition) or null.\n\t\t */\n\t\tconst autoStartTour = computed(() => {\n\t\t\tif (!enabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tfor (const tour of tours) {\n\t\t\t\tif (tour.minAppVersion && compareSemver(appVersion, tour.minAppVersion) < 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst steps = composeSteps(tour)\n\t\t\t\tif (steps.length === 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (tour.trigger === 'first-visit' && !seenVersion) {\n\t\t\t\t\treturn tour\n\t\t\t\t}\n\t\t\t\tif (tour.trigger === 'version-bump' && seenVersion && compareSemver(appVersion, seenVersion) > 0) {\n\t\t\t\t\treturn tour\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t})\n\n\t\tconst currentStep = computed(() => {\n\t\t\tconst t = activeTour.value\n\t\t\tif (!t) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst raw = t.steps[currentIndex.value]\n\t\t\tif (!raw) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn interpolateStep(raw, context.value)\n\t\t})\n\t\tconst totalSteps = computed(() => (activeTour.value ? activeTour.value.steps.length : 0))\n\t\tconst isFirst = computed(() => currentIndex.value === 0)\n\t\tconst isLast = computed(() => totalSteps.value > 0 && currentIndex.value === totalSteps.value - 1)\n\n\t\t/**\n\t\t * Apply `{{var}}` interpolation to a step's user-facing + targeting fields.\n\t\t *\n\t\t * @param {object} step The raw step.\n\t\t * @param {object} ctx The context bag.\n\t\t * @return {object} A shallow copy with tokens resolved.\n\t\t */\n\t\tfunction interpolateStep(step, ctx) {\n\t\t\tconst out = { ...step }\n\t\t\tfor (const k of ['title', 'body', 'task']) {\n\t\t\t\tif (out[k]) {\n\t\t\t\t\tout[k] = interpolateTokens(out[k], ctx)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (out.target) {\n\t\t\t\tout.target = { ...out.target }\n\t\t\t\tif (out.target.ref) {\n\t\t\t\t\tout.target.ref = interpolateTokens(out.target.ref, ctx)\n\t\t\t\t}\n\t\t\t\tif (out.target.selector) {\n\t\t\t\t\tout.target.selector = interpolateTokens(out.target.selector, ctx)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (out.advanceOn) {\n\t\t\t\tout.advanceOn = { ...out.advanceOn }\n\t\t\t\tif (out.advanceOn.route) {\n\t\t\t\t\tout.advanceOn.route = interpolateTokens(out.advanceOn.route, ctx)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out\n\t\t}\n\n\t\t/**\n\t\t * Run a step's `advanceOn.capture` against captured values.\n\t\t *\n\t\t * @param {object} step The active (raw) step.\n\t\t * @param {object} source `{ params?, object? }` to read captured values from.\n\t\t * @return {void}\n\t\t */\n\t\tfunction runCapture(step, source) {\n\t\t\tconst cap = step && step.advanceOn && step.advanceOn.capture\n\t\t\tif (!cap) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst next = { ...context.value }\n\t\t\tfor (const [varName, token] of Object.entries(cap)) {\n\t\t\t\tconst key = String(token).replace(/^:/, '')\n\t\t\t\tlet value\n\t\t\t\tif (source.params && key in source.params) {\n\t\t\t\t\tvalue = source.params[key]\n\t\t\t\t} else if (source.object) {\n\t\t\t\t\tvalue = (key === 'id') ? (source.object.id ?? source.object['@self']?.id ?? source.object.uuid) : source.object[key]\n\t\t\t\t}\n\t\t\t\tif (value !== null && value !== undefined) {\n\t\t\t\t\tnext[varName] = value\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontext.value = next\n\t\t}\n\n\t\t/**\n\t\t * Advance to the next step, or complete on the last step. Skips\n\t\t * subsequent `optional` steps whose target ref is empty after interpolation.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction next() {\n\t\t\tif (!activeTour.value) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (currentIndex.value >= totalSteps.value - 1) {\n\t\t\t\tcomplete()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcurrentIndex.value += 1\n\t\t}\n\t\t/**\n\t\t * Step back (no-op on the first step).\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction back() {\n\t\t\tif (currentIndex.value > 0) {\n\t\t\t\tcurrentIndex.value -= 1\n\t\t\t}\n\t\t}\n\t\t/**\n\t\t * Skip the active step (advance without satisfying its condition).\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction skip() {\n\t\t\tnext()\n\t\t}\n\t\t/**\n\t\t * Jump to a step by id within the active tour.\n\t\t *\n\t\t * @param {string} stepId The target step id.\n\t\t * @return {void}\n\t\t */\n\t\tfunction jumpTo(stepId) {\n\t\t\tif (!activeTour.value) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst idx = activeTour.value.steps.findIndex((s) => s.id === stepId)\n\t\t\tif (idx >= 0) {\n\t\t\t\tcurrentIndex.value = idx\n\t\t\t}\n\t\t}\n\t\t/**\n\t\t * Start a tour by id at its first (resume) step.\n\t\t *\n\t\t * @param {string} tourId The tour id.\n\t\t * @param {number} [startIndex] Optional resume index.\n\t\t * @return {void}\n\t\t */\n\t\tfunction start(tourId, startIndex = 0) {\n\t\t\treplaying.value = false\n\t\t\tpaused.value = false\n\t\t\tactiveTourId.value = tourId\n\t\t\tcurrentIndex.value = startIndex\n\t\t\tcontext.value = {}\n\t\t\trunning.value = true\n\t\t}\n\t\t/**\n\t\t * Restart a tour from the beginning (used by the \"Restart tutorial\" /\n\t\t * \"Replay\" entry). Runs in replay mode so the FULL tour shows even for a\n\t\t * returning user whose persisted seen-version already covers every step.\n\t\t *\n\t\t * @param {string} tourId The tour id.\n\t\t * @return {void}\n\t\t */\n\t\tfunction restart(tourId) {\n\t\t\tstart(tourId, 0)\n\t\t\treplaying.value = true\n\t\t}\n\t\t/**\n\t\t * Dismiss the active tour without marking it complete.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction dismiss() {\n\t\t\trunning.value = false\n\t\t\tpaused.value = false\n\t\t\tactiveTourId.value = null\n\t\t\treplaying.value = false\n\t\t}\n\t\t/**\n\t\t * Hide the active tour without ending it (ESC, a click on the dim).\n\t\t * The tour and step are kept, so `resumePaused()` continues there.\n\t\t *\n\t\t * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md\n\t\t * @return {void}\n\t\t */\n\t\tfunction pause() {\n\t\t\tif (!activeTourId.value) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\trunning.value = false\n\t\t\tpaused.value = true\n\t\t}\n\t\t/**\n\t\t * Show a paused tour again at the step it was on.\n\t\t *\n\t\t * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md\n\t\t * @return {boolean} True when there was a paused tour to show.\n\t\t */\n\t\tfunction resumePaused() {\n\t\t\tif (!paused.value || !activeTourId.value) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tpaused.value = false\n\t\t\trunning.value = true\n\t\t\treturn true\n\t\t}\n\t\t/**\n\t\t * Start a tour at a remembered step (\"continue where you left off\").\n\t\t * Runs in replay mode so a returning user sees the full tour, and\n\t\t * falls back to the first step when the step no longer exists.\n\t\t *\n\t\t * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md\n\t\t * @param {string} tourId The tour id.\n\t\t * @param {string} [stepId] The step to continue at.\n\t\t * @return {boolean} True when the tour exists and started.\n\t\t */\n\t\tfunction resumeAt(tourId, stepId) {\n\t\t\tconst tour = tours.find((t) => t.id === tourId)\n\t\t\tif (!tour) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treplaying.value = true\n\t\t\tconst idx = composeSteps(tour).findIndex((s) => s.id === stepId)\n\t\t\tstart(tourId, Math.max(0, idx))\n\t\t\treplaying.value = true\n\t\t\treturn true\n\t\t}\n\t\t/**\n\t\t * Mark the active tour complete: stop running and invoke the\n\t\t * `onComplete(appVersion)` persistence callback so the seen version is\n\t\t * recorded by the consumer (CnAppRoot).\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tfunction complete() {\n\t\t\trunning.value = false\n\t\t\tpaused.value = false\n\t\t\tactiveTourId.value = null\n\t\t\treplaying.value = false\n\t\t\tif (typeof options.onComplete === 'function') {\n\t\t\t\toptions.onComplete(appVersion)\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Feed a declarative advance signal to the active step. When the signal\n\t\t * satisfies the step's `advanceOn`, captures run and the tour advances.\n\t\t *\n\t\t * @param {object} signal `{ kind: 'route'|'object-created'|'element'|'click'|'delay', route?, params?, object? }`.\n\t\t * @return {boolean} Whether the signal advanced the tour.\n\t\t */\n\t\tfunction notify(signal) {\n\t\t\tconst step = activeTour.value && activeTour.value.steps[currentIndex.value]\n\t\t\tif (!step || !step.advanceOn) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst a = step.advanceOn\n\t\t\tlet match = false\n\t\t\tif (signal.kind === 'route' && a.type === 'route-match') {\n\t\t\t\tmatch = signal.route === a.route\n\t\t\t\tif (match) {\n\t\t\t\t\trunCapture(step, { params: signal.params || {} })\n\t\t\t\t}\n\t\t\t} else if (signal.kind === 'object-created' && a.type === 'object-created') {\n\t\t\t\tmatch = objectCreatedMatches(a, signal)\n\t\t\t\tif (match) {\n\t\t\t\t\trunCapture(step, { object: signal.object || {} })\n\t\t\t\t}\n\t\t\t} else if (signal.kind === 'element' && a.type === 'element-appears') {\n\t\t\t\tmatch = true\n\t\t\t} else if (signal.kind === 'click' && a.type === 'click-target') {\n\t\t\t\tmatch = true\n\t\t\t} else if (signal.kind === 'delay' && a.type === 'delay') {\n\t\t\t\tmatch = true\n\t\t\t}\n\t\t\tif (match) {\n\t\t\t\tnext()\n\t\t\t}\n\t\t\treturn match\n\t\t}\n\n\t\tentry = {\n\t\t\tenabled,\n\t\t\tappVersion,\n\t\t\tseenVersion,\n\t\t\ttours,\n\t\t\tactiveTour,\n\t\t\tautoStartTour,\n\t\t\tcurrentStep,\n\t\t\ttotalSteps,\n\t\t\tisFirst,\n\t\t\tisLast,\n\t\t\tcontext,\n\t\t\trunning,\n\t\t\tpaused,\n\t\t\treplaying,\n\t\t\tstart,\n\t\t\trestart,\n\t\t\tpause,\n\t\t\tresumePaused,\n\t\t\tresumeAt,\n\t\t\tnext,\n\t\t\tback,\n\t\t\tskip,\n\t\t\tjumpTo,\n\t\t\tdismiss,\n\t\t\tcomplete,\n\t\t\tnotify,\n\t\t\tinterpolate: (s) => interpolateTokens(s, context.value),\n\t\t}\n\t\tcache.set(appId, entry)\n\n\t\t// Resume token (cross-app hand-off / refresh) — start at the resume step.\n\t\tif (options.resume && options.resume.tourId) {\n\t\t\tconst tour = tours.find((t) => t.id === options.resume.tourId)\n\t\t\tif (tour) {\n\t\t\t\tconst steps = composeSteps(tour)\n\t\t\t\tconst idx = Math.max(0, steps.findIndex((s) => s.id === options.resume.stepId))\n\t\t\t\tstart(options.resume.tourId, idx)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn entry\n}\n\n/**\n * Test-only helper to reset the per-`appId` cache.\n *\n * @internal\n */\nexport function __resetWalkthroughCacheForTests() {\n\tcache.clear()\n}\n"],"names":["axios"],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -48,6 +48,7 @@ export { default as CnActionButtons } from './components/CnActionButtons/CnActio
|
|
|
48
48
|
export { default as CnActionsBar } from './components/CnActionsBar/CnActionsBar.vue.js';
|
|
49
49
|
export { default as CnActionsMenu } from './components/CnActionsMenu/CnActionsMenu.vue.js';
|
|
50
50
|
export { default as CnAddWidgetModal } from './dialogs/CnAddWidgetModal.vue.js';
|
|
51
|
+
export { default as CnAdminActionCard } from './components/CnAdminActionCard/CnAdminActionCard.vue.js';
|
|
51
52
|
export { default as CnAdminSettingsShell } from './components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js';
|
|
52
53
|
export { default as CnAdvancedFormDialog } from './components/CnAdvancedFormDialog/CnAdvancedFormDialog.vue.js';
|
|
53
54
|
export { default as CnAppLoading } from './components/CnAppLoading/CnAppLoading.vue.js';
|
|
@@ -281,6 +282,7 @@ export { default as CnThemePreview } from './components/CnThemePreview/CnThemePr
|
|
|
281
282
|
export { default as CnTileWidget } from './components/CnTileWidget/CnTileWidget.vue.js';
|
|
282
283
|
export { default as CnTimelineStages } from './components/CnTimelineStages/CnTimelineStages.vue.js';
|
|
283
284
|
export { default as CnTimelineView } from './components/CnTimelineView/CnTimelineView.vue.js';
|
|
285
|
+
export { default as CnTimelineWidget } from './components/CnTimelineWidget/CnTimelineWidget.vue.js';
|
|
284
286
|
export { default as CnTranslatedBadge } from './components/CnTranslatedBadge/CnTranslatedBadge.vue.js';
|
|
285
287
|
export { default as CnTreeView } from './components/CnTreeView/CnTreeView.vue.js';
|
|
286
288
|
export { default as CnUserActionMenu } from './components/CnUserActionMenu/CnUserActionMenu.vue.js';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/l10n/en.json.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
var translations = {
|
|
2
|
+
"The item could not be created.": "The item could not be created.",
|
|
3
|
+
"Start over": "Start over",
|
|
4
|
+
"Continue where you left off": "Continue where you left off",
|
|
2
5
|
Active: "Active",
|
|
3
6
|
Appraisal: "Appraisal",
|
|
4
7
|
Archiving: "Archiving",
|
|
@@ -44,6 +47,8 @@ var translations = {
|
|
|
44
47
|
"No integrations available yet.": "No integrations available yet.",
|
|
45
48
|
"This integration is not available.": "This integration is not available.",
|
|
46
49
|
Integrations: "Integrations",
|
|
50
|
+
View: "View",
|
|
51
|
+
"current step": "current step",
|
|
47
52
|
"{app} not available": "{app} not available",
|
|
48
53
|
"{app} not configured": "{app} not configured",
|
|
49
54
|
"This integration is not available or not configured yet.": "This integration is not available or not configured yet.",
|
|
@@ -216,7 +221,6 @@ var translations = {
|
|
|
216
221
|
"Drop files here or click to browse": "Drop files here or click to browse",
|
|
217
222
|
Duration: "Duration",
|
|
218
223
|
Edit: "Edit",
|
|
219
|
-
View: "View",
|
|
220
224
|
"Edit {title}": "Edit {title}",
|
|
221
225
|
"Enter a custom value": "Enter a custom value",
|
|
222
226
|
"Enumeration ({count})": "Enumeration ({count})",
|
|
@@ -376,6 +380,46 @@ var translations = {
|
|
|
376
380
|
"Not configured": "Not configured",
|
|
377
381
|
"Not set": "Not set",
|
|
378
382
|
"Not run": "Not run",
|
|
383
|
+
Load: "Load",
|
|
384
|
+
"Load again": "Load again",
|
|
385
|
+
"Load {name}": "Load {name}",
|
|
386
|
+
"Loaded.": "Loaded.",
|
|
387
|
+
"Apps this app needs": "Apps this app needs",
|
|
388
|
+
"Required apps": "Required apps",
|
|
389
|
+
"Setup can start once these apps are installed and enabled: {apps}.": "Setup can start once these apps are installed and enabled: {apps}.",
|
|
390
|
+
"Optional, not installed: {apps}. You can add them later.": "Optional, not installed: {apps}. You can add them later.",
|
|
391
|
+
"Skipped, needs {apps}": "Skipped, needs {apps}",
|
|
392
|
+
"Running…": "Running…",
|
|
393
|
+
"This action is not configured.": "This action is not configured.",
|
|
394
|
+
"Done.": "Done.",
|
|
395
|
+
"Something went wrong.": "Something went wrong.",
|
|
396
|
+
"Filter {column}": "Filter {column}",
|
|
397
|
+
"Filter {column}, active": "Filter {column}, active",
|
|
398
|
+
"{column}: {value}": "{column}: {value}",
|
|
399
|
+
"Remove filter {column}": "Remove filter {column}",
|
|
400
|
+
"Active filters": "Active filters",
|
|
401
|
+
"{from} to {to}": "{from} to {to}",
|
|
402
|
+
"from {value}": "from {value}",
|
|
403
|
+
"up to {value}": "up to {value}",
|
|
404
|
+
Any: "Any",
|
|
405
|
+
To: "To",
|
|
406
|
+
Equals: "Equals",
|
|
407
|
+
Clear: "Clear",
|
|
408
|
+
Apply: "Apply",
|
|
409
|
+
"This column cannot list its objects.": "This column cannot list its objects.",
|
|
410
|
+
"The list could not load.": "The list could not load.",
|
|
411
|
+
"Nothing to choose from here.": "Nothing to choose from here.",
|
|
412
|
+
"Part of the timeline could not load: {parts}.": "Part of the timeline could not load: {parts}.",
|
|
413
|
+
"Nothing has happened yet.": "Nothing has happened yet.",
|
|
414
|
+
Upcoming: "Upcoming",
|
|
415
|
+
changes: "changes",
|
|
416
|
+
"notes and messages": "notes and messages",
|
|
417
|
+
dates: "dates",
|
|
418
|
+
"related items": "related items",
|
|
419
|
+
Deleted: "Deleted",
|
|
420
|
+
Changed: "Changed",
|
|
421
|
+
"{action} by {actor}": "{action} by {actor}",
|
|
422
|
+
Note: "Note",
|
|
379
423
|
Notes: "Notes",
|
|
380
424
|
"Number": "Number",
|
|
381
425
|
"Number configuration": "Number configuration",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/l10n/nl.json.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
var translations = {
|
|
2
|
+
"The item could not be created.": "Het item kon niet worden aangemaakt.",
|
|
3
|
+
"Start over": "Opnieuw beginnen",
|
|
4
|
+
"Continue where you left off": "Ga verder waar je was",
|
|
2
5
|
Active: "Actief",
|
|
3
6
|
Appraisal: "Waardering",
|
|
4
7
|
Archiving: "Archivering",
|
|
@@ -44,6 +47,8 @@ var translations = {
|
|
|
44
47
|
"No integrations available yet.": "Nog geen integraties beschikbaar.",
|
|
45
48
|
"This integration is not available.": "Deze integratie is niet beschikbaar.",
|
|
46
49
|
Integrations: "Integraties",
|
|
50
|
+
View: "Bekijken",
|
|
51
|
+
"current step": "huidige stap",
|
|
47
52
|
"{app} not available": "{app} niet beschikbaar",
|
|
48
53
|
"{app} not configured": "{app} niet geconfigureerd",
|
|
49
54
|
"This integration is not available or not configured yet.": "Deze integratie is nog niet beschikbaar of niet geconfigureerd.",
|
|
@@ -216,7 +221,6 @@ var translations = {
|
|
|
216
221
|
"Drop files here or click to browse": "Sleep bestanden hier of klik om te bladeren",
|
|
217
222
|
Duration: "Duur",
|
|
218
223
|
Edit: "Bewerken",
|
|
219
|
-
View: "Bekijken",
|
|
220
224
|
"Edit {title}": "{title} bewerken",
|
|
221
225
|
"Enter a custom value": "Voer een aangepaste waarde in",
|
|
222
226
|
"Enumeration ({count})": "Opsomming ({count})",
|
|
@@ -376,6 +380,46 @@ var translations = {
|
|
|
376
380
|
"Not configured": "Niet geconfigureerd",
|
|
377
381
|
"Not set": "Niet ingesteld",
|
|
378
382
|
"Not run": "Niet uitgevoerd",
|
|
383
|
+
Load: "Laden",
|
|
384
|
+
"Load again": "Opnieuw laden",
|
|
385
|
+
"Load {name}": "{name} laden",
|
|
386
|
+
"Loaded.": "Geladen.",
|
|
387
|
+
"Apps this app needs": "Apps die deze app nodig heeft",
|
|
388
|
+
"Required apps": "Vereiste apps",
|
|
389
|
+
"Setup can start once these apps are installed and enabled: {apps}.": "De installatie kan beginnen zodra deze apps geïnstalleerd en ingeschakeld zijn: {apps}.",
|
|
390
|
+
"Optional, not installed: {apps}. You can add them later.": "Optioneel, niet geïnstalleerd: {apps}. Je kunt ze later toevoegen.",
|
|
391
|
+
"Skipped, needs {apps}": "Overgeslagen, vereist {apps}",
|
|
392
|
+
"Running…": "Bezig…",
|
|
393
|
+
"This action is not configured.": "Deze actie is niet ingesteld.",
|
|
394
|
+
"Done.": "Klaar.",
|
|
395
|
+
"Something went wrong.": "Er ging iets mis.",
|
|
396
|
+
"Filter {column}": "{column} filteren",
|
|
397
|
+
"Filter {column}, active": "{column} filteren, actief",
|
|
398
|
+
"{column}: {value}": "{column}: {value}",
|
|
399
|
+
"Remove filter {column}": "Filter {column} verwijderen",
|
|
400
|
+
"Active filters": "Actieve filters",
|
|
401
|
+
"{from} to {to}": "{from} tot {to}",
|
|
402
|
+
"from {value}": "vanaf {value}",
|
|
403
|
+
"up to {value}": "tot en met {value}",
|
|
404
|
+
Any: "Alle",
|
|
405
|
+
To: "Tot",
|
|
406
|
+
Equals: "Is gelijk aan",
|
|
407
|
+
Clear: "Wissen",
|
|
408
|
+
Apply: "Toepassen",
|
|
409
|
+
"This column cannot list its objects.": "Deze kolom kan zijn objecten niet tonen.",
|
|
410
|
+
"The list could not load.": "De lijst kon niet laden.",
|
|
411
|
+
"Nothing to choose from here.": "Er valt hier niets te kiezen.",
|
|
412
|
+
"Part of the timeline could not load: {parts}.": "Een deel van de tijdlijn kon niet laden: {parts}.",
|
|
413
|
+
"Nothing has happened yet.": "Er is nog niets gebeurd.",
|
|
414
|
+
Upcoming: "Gepland",
|
|
415
|
+
changes: "wijzigingen",
|
|
416
|
+
"notes and messages": "notities en berichten",
|
|
417
|
+
dates: "datums",
|
|
418
|
+
"related items": "gekoppelde items",
|
|
419
|
+
Deleted: "Verwijderd",
|
|
420
|
+
Changed: "Gewijzigd",
|
|
421
|
+
"{action} by {actor}": "{action} door {actor}",
|
|
422
|
+
Note: "Notitie",
|
|
379
423
|
Notes: "Notities",
|
|
380
424
|
"Number": "Getal",
|
|
381
425
|
"Number configuration": "Nummerconfiguratie",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|