@conduction/nextcloud-vue 2.61.0 → 2.63.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 +394 -27
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +99 -9
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +39 -18
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +79 -2
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +38 -25
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +21 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +4 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.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 +30 -6
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -2
- 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 +256 -23
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +119 -51
- package/dist/esm/components/CnDataTable/CnDataTable.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/CnIndexPage/CnIndexPage.vue2.js +51 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +5 -1
- 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/CnLinkCardsPage/CnLinkCardsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +36 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +53 -0
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +22 -5
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnReportsPage/CnReportsPage.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/CnStorePage/CnStorePage.vue2.js.map +1 -1
- package/dist/esm/components/CnStorePage/CnStorePage.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/CnWikiPage/CnWikiPage.vue2.js.map +1 -1
- package/dist/esm/components/CnWikiPage/CnWikiPage.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 +48 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +48 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +557 -9
- 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/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 +9779 -5236
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +557 -9
- package/l10n/en.json +48 -0
- package/l10n/nl.json +48 -0
- package/package.json +3 -2
- package/scripts/manifest-schema-hash.js +41 -0
- package/scripts/record-manifest-schema-hash.js +52 -0
- package/src/components/CnAdminActionCard/CnAdminActionCard.vue +234 -0
- package/src/components/CnAdminActionCard/index.js +4 -0
- package/src/components/CnAppNav/CnAppNav.vue +394 -27
- package/src/components/CnAppRoot/CnAppRoot.vue +129 -15
- package/src/components/CnBannerWidget/CnBannerWidget.vue +113 -2
- package/src/components/CnBrandStripe/CnBrandStripe.md +16 -0
- package/src/components/CnBrandStripe/CnBrandStripe.vue +58 -5
- package/src/components/CnChoiceCards/CnChoiceCards.vue +56 -31
- package/src/components/CnDashboardPage/CnDashboardPage.vue +32 -8
- package/src/components/CnDataTable/CnColumnFilterPopover.vue +524 -0
- package/src/components/CnDataTable/CnDataTable.md +4 -1
- package/src/components/CnDataTable/CnDataTable.vue +302 -21
- 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/CnIndexPage/CnIndexPage.vue +55 -2
- package/src/components/CnIndexPage/selfModeActions.js +3 -3
- package/src/components/CnLinkCardsPage/CnLinkCardsPage.vue +35 -2
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +39 -1
- package/src/components/CnObjectSidebar/CnFilesTab.vue +65 -0
- package/src/components/CnReportsPage/CnReportsPage.vue +7 -0
- package/src/components/CnResourceSelect/CnResourceSelect.vue +123 -12
- package/src/components/CnSetupWizard/CnSetupWizard.vue +392 -3
- package/src/components/CnStorePage/CnStorePage.vue +7 -0
- 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/CnWikiPage/CnWikiPage.vue +7 -0
- 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 +19 -0
- package/src/css/table.css +82 -2
- package/src/index.js +2 -0
- package/src/public/index.js +5 -0
- package/src/schemas/app-manifest-v2.schema.json +23 -1
- 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/timelineEvents.js +171 -0
- package/src/utils/validateManifestV2.compiled.js +2 -2
- package/src/utils/walkthroughSignals.js +94 -0
|
@@ -200,6 +200,162 @@ function persistWalkthroughSeenVersion(appId, configKey, version, options = {})
|
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
+
/**
|
|
204
|
+
* localStorage key prefix for the per-browser mirror of tour progress.
|
|
205
|
+
*/
|
|
206
|
+
const WALKTHROUGH_PROGRESS_STORAGE_PREFIX = 'cn-walkthrough-progress:';
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* The preference key that holds tour progress, next to the completion key.
|
|
210
|
+
*
|
|
211
|
+
* @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).
|
|
212
|
+
* @return {string} `<configKey>-progress`, or '' when no key is declared.
|
|
213
|
+
*/
|
|
214
|
+
function walkthroughProgressKey(configKey) {
|
|
215
|
+
return configKey ? configKey + '-progress' : ''
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Normalise stored progress (an object, or the JSON string a preference
|
|
220
|
+
* holds) into `{ tourId, stepId, index, version }`, or null.
|
|
221
|
+
*
|
|
222
|
+
* @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
|
|
223
|
+
* @param {unknown} value The stored value.
|
|
224
|
+
* @return {{tourId: string, stepId: string, index: number, version: string}|null} The progress.
|
|
225
|
+
*/
|
|
226
|
+
function normaliseWalkthroughProgress(value) {
|
|
227
|
+
let data = value;
|
|
228
|
+
if (typeof data === 'string') {
|
|
229
|
+
if (data === '') {
|
|
230
|
+
return null
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
data = JSON.parse(data);
|
|
234
|
+
} catch {
|
|
235
|
+
return null
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (!isPlainObject(data) || typeof data.tourId !== 'string' || data.tourId === '') {
|
|
239
|
+
return null
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
tourId: data.tourId,
|
|
243
|
+
stepId: typeof data.stepId === 'string' ? data.stepId : '',
|
|
244
|
+
index: Number.isInteger(data.index) && data.index >= 0 ? data.index : 0,
|
|
245
|
+
version: typeof data.version === 'string' ? data.version : '',
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Read the per-browser mirror of the tour progress. Synchronous.
|
|
251
|
+
*
|
|
252
|
+
* @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
|
|
253
|
+
* @param {string} appId The Nextcloud app id.
|
|
254
|
+
* @param {Storage} [storage] Injectable storage backend.
|
|
255
|
+
* @return {object|null} The progress, or null.
|
|
256
|
+
*/
|
|
257
|
+
function readLocalWalkthroughProgress(appId, storage) {
|
|
258
|
+
const s = resolveStorage(storage);
|
|
259
|
+
if (!s) {
|
|
260
|
+
return null
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
return normaliseWalkthroughProgress(s.getItem(WALKTHROUGH_PROGRESS_STORAGE_PREFIX + appId))
|
|
264
|
+
} catch {
|
|
265
|
+
return null
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Load the user's tour progress: the per-user preference
|
|
271
|
+
* `<completionConfigKey>-progress` when declared, else the local mirror.
|
|
272
|
+
*
|
|
273
|
+
* @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
|
|
274
|
+
* @param {string} appId The Nextcloud app id.
|
|
275
|
+
* @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).
|
|
276
|
+
* @param {object} [options] `{ http, storage }` injection points for tests.
|
|
277
|
+
* @return {Promise<object|null>} The progress, or null.
|
|
278
|
+
*/
|
|
279
|
+
async function loadWalkthroughProgress(appId, configKey, options = {}) {
|
|
280
|
+
const local = readLocalWalkthroughProgress(appId, options.storage);
|
|
281
|
+
const key = walkthroughProgressKey(configKey);
|
|
282
|
+
if (!key) {
|
|
283
|
+
return local
|
|
284
|
+
}
|
|
285
|
+
const http = options.http || axios__default;
|
|
286
|
+
try {
|
|
287
|
+
const { data } = await http.get(walkthroughPreferenceUrl(appId, key));
|
|
288
|
+
if (!isPlainObject(data) || !('value' in data)) {
|
|
289
|
+
return local
|
|
290
|
+
}
|
|
291
|
+
return normaliseWalkthroughProgress(data.value) || local
|
|
292
|
+
} catch {
|
|
293
|
+
return local
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Persist the user's tour progress, or clear it with `null`. Writes the
|
|
299
|
+
* local mirror and, with a completion key, the per-user preference. Never
|
|
300
|
+
* throws.
|
|
301
|
+
*
|
|
302
|
+
* @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
|
|
303
|
+
* @param {string} appId The Nextcloud app id.
|
|
304
|
+
* @param {string} configKey `manifest.walkthrough.completionConfigKey` (may be empty).
|
|
305
|
+
* @param {object|null} progress `{ tourId, stepId, index, version }`, or null to clear.
|
|
306
|
+
* @param {object} [options] `{ http, storage }` injection points for tests.
|
|
307
|
+
* @return {Promise<boolean>} True when the server preference was written.
|
|
308
|
+
*/
|
|
309
|
+
function persistWalkthroughProgress(appId, configKey, progress, options = {}) {
|
|
310
|
+
const value = progress ? normaliseWalkthroughProgress(progress) : null;
|
|
311
|
+
const raw = value ? JSON.stringify(value) : '';
|
|
312
|
+
const s = resolveStorage(options.storage);
|
|
313
|
+
if (s) {
|
|
314
|
+
try {
|
|
315
|
+
if (raw) {
|
|
316
|
+
s.setItem(WALKTHROUGH_PROGRESS_STORAGE_PREFIX + appId, raw);
|
|
317
|
+
} else {
|
|
318
|
+
s.removeItem(WALKTHROUGH_PROGRESS_STORAGE_PREFIX + appId);
|
|
319
|
+
}
|
|
320
|
+
} catch {
|
|
321
|
+
/* quota / private mode: best-effort */
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
const key = walkthroughProgressKey(configKey);
|
|
325
|
+
if (!key) {
|
|
326
|
+
return Promise.resolve(false)
|
|
327
|
+
}
|
|
328
|
+
const http = options.http || axios__default;
|
|
329
|
+
try {
|
|
330
|
+
return Promise.resolve(http.put(walkthroughPreferenceUrl(appId, key), { value: raw }))
|
|
331
|
+
.then(() => true)
|
|
332
|
+
.catch(() => false)
|
|
333
|
+
} catch {
|
|
334
|
+
return Promise.resolve(false)
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Whether an `object-created` signal satisfies a step's `advanceOn`.
|
|
340
|
+
*
|
|
341
|
+
* The signal's own `register` / `schema` (the slugs the creating surface
|
|
342
|
+
* knows) are compared first; an object's `@self` values are numeric ids on
|
|
343
|
+
* OpenRegister and only match a step that also uses ids.
|
|
344
|
+
*
|
|
345
|
+
* @param {object} advanceOn The step's `advanceOn`.
|
|
346
|
+
* @param {object} signal `{ register?, schema?, object? }`.
|
|
347
|
+
* @return {boolean} True when it matches.
|
|
348
|
+
*/
|
|
349
|
+
function objectCreatedMatches(advanceOn, signal) {
|
|
350
|
+
const obj = signal.object || {};
|
|
351
|
+
const self = obj['@self'] || {};
|
|
352
|
+
const same = (want, candidates) => !want || candidates
|
|
353
|
+
.filter((c) => c !== null && c !== undefined && c !== '')
|
|
354
|
+
.some((c) => String(c).toLowerCase() === String(want).toLowerCase());
|
|
355
|
+
return same(advanceOn.register, [signal.register, obj.register, self.register])
|
|
356
|
+
&& same(advanceOn.schema, [signal.schema, obj.schema, self.schema])
|
|
357
|
+
}
|
|
358
|
+
|
|
203
359
|
/**
|
|
204
360
|
* Compare two semver-ish strings. Missing / unparseable parts sort as 0.
|
|
205
361
|
*
|
|
@@ -277,6 +433,9 @@ function useWalkthrough(appId, manifest, options = {}) {
|
|
|
277
433
|
const currentIndex = ref(0);
|
|
278
434
|
const context = ref({});
|
|
279
435
|
const running = ref(false);
|
|
436
|
+
// True while the tour is hidden by ESC or a backdrop click. The tour
|
|
437
|
+
// and its step stay, so it continues where it was.
|
|
438
|
+
const paused = ref(false);
|
|
280
439
|
// True while a user-initiated replay is active (the "Restart tutorial"
|
|
281
440
|
// entry). A replay shows the FULL tour regardless of the persisted
|
|
282
441
|
// seen-version — otherwise a returning user, whose seenVersion already
|
|
@@ -480,6 +639,7 @@ function useWalkthrough(appId, manifest, options = {}) {
|
|
|
480
639
|
*/
|
|
481
640
|
function start(tourId, startIndex = 0) {
|
|
482
641
|
replaying.value = false;
|
|
642
|
+
paused.value = false;
|
|
483
643
|
activeTourId.value = tourId;
|
|
484
644
|
currentIndex.value = startIndex;
|
|
485
645
|
context.value = {};
|
|
@@ -504,9 +664,59 @@ function useWalkthrough(appId, manifest, options = {}) {
|
|
|
504
664
|
*/
|
|
505
665
|
function dismiss() {
|
|
506
666
|
running.value = false;
|
|
667
|
+
paused.value = false;
|
|
507
668
|
activeTourId.value = null;
|
|
508
669
|
replaying.value = false;
|
|
509
670
|
}
|
|
671
|
+
/**
|
|
672
|
+
* Hide the active tour without ending it (ESC, a click on the dim).
|
|
673
|
+
* The tour and step are kept, so `resumePaused()` continues there.
|
|
674
|
+
*
|
|
675
|
+
* @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
|
|
676
|
+
* @return {void}
|
|
677
|
+
*/
|
|
678
|
+
function pause() {
|
|
679
|
+
if (!activeTourId.value) {
|
|
680
|
+
return
|
|
681
|
+
}
|
|
682
|
+
running.value = false;
|
|
683
|
+
paused.value = true;
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Show a paused tour again at the step it was on.
|
|
687
|
+
*
|
|
688
|
+
* @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
|
|
689
|
+
* @return {boolean} True when there was a paused tour to show.
|
|
690
|
+
*/
|
|
691
|
+
function resumePaused() {
|
|
692
|
+
if (!paused.value || !activeTourId.value) {
|
|
693
|
+
return false
|
|
694
|
+
}
|
|
695
|
+
paused.value = false;
|
|
696
|
+
running.value = true;
|
|
697
|
+
return true
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Start a tour at a remembered step ("continue where you left off").
|
|
701
|
+
* Runs in replay mode so a returning user sees the full tour, and
|
|
702
|
+
* falls back to the first step when the step no longer exists.
|
|
703
|
+
*
|
|
704
|
+
* @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
|
|
705
|
+
* @param {string} tourId The tour id.
|
|
706
|
+
* @param {string} [stepId] The step to continue at.
|
|
707
|
+
* @return {boolean} True when the tour exists and started.
|
|
708
|
+
*/
|
|
709
|
+
function resumeAt(tourId, stepId) {
|
|
710
|
+
const tour = tours.find((t) => t.id === tourId);
|
|
711
|
+
if (!tour) {
|
|
712
|
+
return false
|
|
713
|
+
}
|
|
714
|
+
replaying.value = true;
|
|
715
|
+
const idx = composeSteps(tour).findIndex((s) => s.id === stepId);
|
|
716
|
+
start(tourId, Math.max(0, idx));
|
|
717
|
+
replaying.value = true;
|
|
718
|
+
return true
|
|
719
|
+
}
|
|
510
720
|
/**
|
|
511
721
|
* Mark the active tour complete: stop running and invoke the
|
|
512
722
|
* `onComplete(appVersion)` persistence callback so the seen version is
|
|
@@ -516,6 +726,7 @@ function useWalkthrough(appId, manifest, options = {}) {
|
|
|
516
726
|
*/
|
|
517
727
|
function complete() {
|
|
518
728
|
running.value = false;
|
|
729
|
+
paused.value = false;
|
|
519
730
|
activeTourId.value = null;
|
|
520
731
|
replaying.value = false;
|
|
521
732
|
if (typeof options.onComplete === 'function') {
|
|
@@ -543,12 +754,9 @@ function useWalkthrough(appId, manifest, options = {}) {
|
|
|
543
754
|
runCapture(step, { params: signal.params || {} });
|
|
544
755
|
}
|
|
545
756
|
} else if (signal.kind === 'object-created' && a.type === 'object-created') {
|
|
546
|
-
|
|
547
|
-
const reg = obj.register ?? obj['@self']?.register;
|
|
548
|
-
const sch = obj.schema ?? obj['@self']?.schema;
|
|
549
|
-
match = (!a.register || reg === a.register) && (!a.schema || sch === a.schema);
|
|
757
|
+
match = objectCreatedMatches(a, signal);
|
|
550
758
|
if (match) {
|
|
551
|
-
runCapture(step, { object:
|
|
759
|
+
runCapture(step, { object: signal.object || {} });
|
|
552
760
|
}
|
|
553
761
|
} else if (signal.kind === 'element' && a.type === 'element-appears') {
|
|
554
762
|
match = true;
|
|
@@ -576,9 +784,13 @@ function useWalkthrough(appId, manifest, options = {}) {
|
|
|
576
784
|
isLast,
|
|
577
785
|
context,
|
|
578
786
|
running,
|
|
787
|
+
paused,
|
|
579
788
|
replaying,
|
|
580
789
|
start,
|
|
581
790
|
restart,
|
|
791
|
+
pause,
|
|
792
|
+
resumePaused,
|
|
793
|
+
resumeAt,
|
|
582
794
|
next,
|
|
583
795
|
back,
|
|
584
796
|
skip,
|
|
@@ -604,5 +816,5 @@ function useWalkthrough(appId, manifest, options = {}) {
|
|
|
604
816
|
return entry
|
|
605
817
|
}
|
|
606
818
|
|
|
607
|
-
export { WALKTHROUGH_SEEN_STORAGE_PREFIX, compareSemver, interpolateTokens, loadWalkthroughSeenVersion, normaliseSeenVersion, persistWalkthroughSeenVersion, readLocalWalkthroughSeenVersion, useWalkthrough, walkthroughPreferenceUrl };
|
|
819
|
+
export { WALKTHROUGH_PROGRESS_STORAGE_PREFIX, WALKTHROUGH_SEEN_STORAGE_PREFIX, compareSemver, interpolateTokens, loadWalkthroughProgress, loadWalkthroughSeenVersion, normaliseSeenVersion, normaliseWalkthroughProgress, persistWalkthroughProgress, persistWalkthroughSeenVersion, readLocalWalkthroughProgress, readLocalWalkthroughSeenVersion, useWalkthrough, walkthroughPreferenceUrl, walkthroughProgressKey };
|
|
608
820
|
//# sourceMappingURL=useWalkthrough.js.map
|
|
@@ -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",
|
|
@@ -292,6 +295,10 @@ var translations = {
|
|
|
292
295
|
Last: "Last",
|
|
293
296
|
"Load more": "Load more",
|
|
294
297
|
"Nothing to open here.": "Nothing to open here.",
|
|
298
|
+
"Could not check": "Could not check",
|
|
299
|
+
"Could not check: {subject}": "Could not check: {subject}",
|
|
300
|
+
"The check failed.": "The check failed.",
|
|
301
|
+
"The check failed: {reason}": "The check failed: {reason}",
|
|
295
302
|
"To do": "To do",
|
|
296
303
|
"Next step": "Next step",
|
|
297
304
|
Review: "Review",
|
|
@@ -372,6 +379,46 @@ var translations = {
|
|
|
372
379
|
"Not configured": "Not configured",
|
|
373
380
|
"Not set": "Not set",
|
|
374
381
|
"Not run": "Not run",
|
|
382
|
+
Load: "Load",
|
|
383
|
+
"Load again": "Load again",
|
|
384
|
+
"Load {name}": "Load {name}",
|
|
385
|
+
"Loaded.": "Loaded.",
|
|
386
|
+
"Apps this app needs": "Apps this app needs",
|
|
387
|
+
"Required apps": "Required apps",
|
|
388
|
+
"Setup can start once these apps are installed and enabled: {apps}.": "Setup can start once these apps are installed and enabled: {apps}.",
|
|
389
|
+
"Optional, not installed: {apps}. You can add them later.": "Optional, not installed: {apps}. You can add them later.",
|
|
390
|
+
"Skipped, needs {apps}": "Skipped, needs {apps}",
|
|
391
|
+
"Running…": "Running…",
|
|
392
|
+
"This action is not configured.": "This action is not configured.",
|
|
393
|
+
"Done.": "Done.",
|
|
394
|
+
"Something went wrong.": "Something went wrong.",
|
|
395
|
+
"Filter {column}": "Filter {column}",
|
|
396
|
+
"Filter {column}, active": "Filter {column}, active",
|
|
397
|
+
"{column}: {value}": "{column}: {value}",
|
|
398
|
+
"Remove filter {column}": "Remove filter {column}",
|
|
399
|
+
"Active filters": "Active filters",
|
|
400
|
+
"{from} to {to}": "{from} to {to}",
|
|
401
|
+
"from {value}": "from {value}",
|
|
402
|
+
"up to {value}": "up to {value}",
|
|
403
|
+
Any: "Any",
|
|
404
|
+
To: "To",
|
|
405
|
+
Equals: "Equals",
|
|
406
|
+
Clear: "Clear",
|
|
407
|
+
Apply: "Apply",
|
|
408
|
+
"This column cannot list its objects.": "This column cannot list its objects.",
|
|
409
|
+
"The list could not load.": "The list could not load.",
|
|
410
|
+
"Nothing to choose from here.": "Nothing to choose from here.",
|
|
411
|
+
"Part of the timeline could not load: {parts}.": "Part of the timeline could not load: {parts}.",
|
|
412
|
+
"Nothing has happened yet.": "Nothing has happened yet.",
|
|
413
|
+
Upcoming: "Upcoming",
|
|
414
|
+
changes: "changes",
|
|
415
|
+
"notes and messages": "notes and messages",
|
|
416
|
+
dates: "dates",
|
|
417
|
+
"related items": "related items",
|
|
418
|
+
Deleted: "Deleted",
|
|
419
|
+
Changed: "Changed",
|
|
420
|
+
"{action} by {actor}": "{action} by {actor}",
|
|
421
|
+
Note: "Note",
|
|
375
422
|
Notes: "Notes",
|
|
376
423
|
"Number": "Number",
|
|
377
424
|
"Number configuration": "Number configuration",
|
|
@@ -609,6 +656,7 @@ var translations = {
|
|
|
609
656
|
"No linked emails yet": "No linked emails yet",
|
|
610
657
|
"Could not load emails": "Could not load emails",
|
|
611
658
|
"Open in Mail": "Open in Mail",
|
|
659
|
+
"Open in Office": "Open in Office",
|
|
612
660
|
"(no subject)": "(no subject)",
|
|
613
661
|
"Unknown sender": "Unknown sender",
|
|
614
662
|
"No conversations linked yet": "No conversations linked yet",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|