@conduction/nextcloud-vue 2.74.0 → 2.76.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.
Files changed (126) hide show
  1. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +19 -14
  2. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +2 -2
  4. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +77 -26
  6. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  7. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +22 -14
  8. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  9. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +23 -4
  10. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  11. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  12. package/dist/esm/components/CnBrandBar/CnBrandBar.vue.js +9 -0
  13. package/dist/esm/components/CnBrandBar/CnBrandBar.vue.js.map +1 -0
  14. package/dist/esm/components/CnBrandBar/CnBrandBar.vue2.js +107 -0
  15. package/dist/esm/components/CnBrandBar/CnBrandBar.vue2.js.map +1 -0
  16. package/dist/esm/components/CnBrandBar/CnBrandBar.vue3.js +79 -0
  17. package/dist/esm/components/CnBrandBar/CnBrandBar.vue3.js.map +1 -0
  18. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +6 -0
  19. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  20. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js +3 -2
  21. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  22. package/dist/esm/components/CnCredentials/CnCredentials.vue2.js +11 -10
  23. package/dist/esm/components/CnCredentials/CnCredentials.vue2.js.map +1 -1
  24. package/dist/esm/components/CnCredentials/CnCredentials.vue3.js.map +1 -1
  25. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +8 -5
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  27. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  28. package/dist/esm/components/CnEnvironmentBanner/CnEnvironmentBanner.vue2.js +4 -1
  29. package/dist/esm/components/CnEnvironmentBanner/CnEnvironmentBanner.vue2.js.map +1 -1
  30. package/dist/esm/components/CnEnvironmentBanner/CnEnvironmentBanner.vue3.js.map +1 -1
  31. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +7 -0
  32. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  33. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +14 -7
  34. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  35. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +32 -0
  36. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  37. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +6 -3
  38. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  39. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +144 -6
  40. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +14 -13
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  43. package/dist/esm/components/CnIndexPage/selfModeActions.js +90 -14
  44. package/dist/esm/components/CnIndexPage/selfModeActions.js.map +1 -1
  45. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +15 -3
  46. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  47. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +26 -0
  48. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  49. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +26 -9
  50. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  51. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +19 -3
  52. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  53. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  54. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +18 -2
  55. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  56. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +2 -2
  57. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  58. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +153 -38
  59. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  60. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js +74 -56
  61. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  62. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js +16 -0
  63. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js.map +1 -1
  64. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue3.js +2 -2
  65. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue3.js.map +1 -1
  66. package/dist/esm/composables/useObjectLock.js +41 -10
  67. package/dist/esm/composables/useObjectLock.js.map +1 -1
  68. package/dist/esm/directives/cnSelectAria.js +55 -0
  69. package/dist/esm/directives/cnSelectAria.js.map +1 -0
  70. package/dist/esm/index.js +1 -0
  71. package/dist/esm/index.js.map +1 -1
  72. package/dist/esm/l10n/en.json.js +7 -1
  73. package/dist/esm/l10n/en.json.js.map +1 -1
  74. package/dist/esm/l10n/nl.json.js +8 -2
  75. package/dist/esm/l10n/nl.json.js.map +1 -1
  76. package/dist/esm/nextcloud-vue.css +154 -2
  77. package/dist/esm/store/useObjectStore.js +37 -9
  78. package/dist/esm/store/useObjectStore.js.map +1 -1
  79. package/dist/esm/utils/cnFetch.js +17 -2
  80. package/dist/esm/utils/cnFetch.js.map +1 -1
  81. package/dist/esm/utils/objectSignals.js +44 -0
  82. package/dist/esm/utils/objectSignals.js.map +1 -0
  83. package/dist/esm/utils/resolveBrand.js +38 -0
  84. package/dist/esm/utils/resolveBrand.js.map +1 -0
  85. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  86. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  87. package/dist/nextcloud-vue.cjs.js +9640 -8649
  88. package/dist/nextcloud-vue.cjs.js.map +2 -2
  89. package/dist/nextcloud-vue.css +154 -2
  90. package/l10n/en.json +7 -1
  91. package/l10n/nl.json +8 -2
  92. package/package.json +1 -1
  93. package/src/components/CnAppNav/CnAppNav.vue +21 -16
  94. package/src/components/CnAppRoot/CnAppRoot.vue +53 -0
  95. package/src/components/CnBannerWidget/CnBannerWidget.vue +23 -4
  96. package/src/components/CnBrandBar/CnBrandBar.vue +230 -0
  97. package/src/components/CnCardGrid/CnCardGrid.md +1 -0
  98. package/src/components/CnCardGrid/CnCardGrid.vue +7 -0
  99. package/src/components/CnCredentials/CnCredentials.vue +17 -16
  100. package/src/components/CnDetailPage/CnDetailPage.vue +8 -5
  101. package/src/components/CnEnvironmentBanner/CnEnvironmentBanner.vue +4 -1
  102. package/src/components/CnFormDialog/CnFormDialog.vue +10 -0
  103. package/src/components/CnFormPage/CnFormPage.vue +33 -0
  104. package/src/components/CnIndexPage/CnIndexPage.md +15 -0
  105. package/src/components/CnIndexPage/CnIndexPage.vue +157 -18
  106. package/src/components/CnIndexPage/selfModeActions.js +89 -13
  107. package/src/components/CnIndexPage/useSelfFetchList.js +15 -3
  108. package/src/components/CnObjectCard/CnObjectCard.md +1 -0
  109. package/src/components/CnObjectCard/CnObjectCard.vue +89 -1
  110. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +19 -3
  111. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +20 -4
  112. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +181 -38
  113. package/src/components/CnStatsBlock/CnStatsBlock.vue +18 -2
  114. package/src/composables/__tests__/useObjectLock.endpoints.spec.js +83 -0
  115. package/src/composables/useObjectLock.js +41 -10
  116. package/src/css/form-field.css +1 -1
  117. package/src/css/look-board-index.css +35 -1
  118. package/src/directives/cnSelectAria.js +54 -0
  119. package/src/index.js +1 -0
  120. package/src/schemas/app-manifest-v2.schema.json +6 -1
  121. package/src/store/useObjectStore.js +37 -9
  122. package/src/utils/cnFetch.js +16 -1
  123. package/src/utils/index.js +1 -0
  124. package/src/utils/objectSignals.js +41 -0
  125. package/src/utils/resolveBrand.js +37 -0
  126. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -9,6 +9,58 @@ function resolveNameField(ctx) {
9
9
 
10
10
  function findSource(ctx, id) {
11
11
  return ctx.effectiveObjects().find((o) => o.id === id || o['@self']?.id === id)
12
+ || (typeof ctx.knownRow === 'function' ? ctx.knownRow(id) : undefined)
13
+ }
14
+
15
+ /**
16
+ * The register/schema of a row that belongs to another pair than the page's,
17
+ * in a list fetched from a `collectionUrl`. Registers a store type for that
18
+ * pair on first use. Returns null for rows of the page's own pair, and always
19
+ * without a `collectionUrl`.
20
+ *
21
+ * @param {object} opts Page context.
22
+ * @param {string} opts.collectionUrl The page's collection endpoint, or ''.
23
+ * @param {string} opts.register The page's register.
24
+ * @param {string} opts.schema The page's schema.
25
+ * @param {object|null} opts.primarySchema The page's resolved schema.
26
+ * @param {object|null} [opts.primaryRegister] The page's resolved register, which matches a slug `register` to `@self.register`.
27
+ * @param {object|null} opts.store The object store.
28
+ * @param {object} row The row.
29
+ * @return {{register: string, schema: string, type: string}|null} The row's own pair.
30
+ */
31
+ function resolveRowTarget({ collectionUrl, register, schema, primarySchema, primaryRegister, store }, row) {
32
+ if (!collectionUrl || !row || !store) {
33
+ return null
34
+ }
35
+ const self = row['@self'] || {};
36
+ const reg = self.register !== undefined && self.register !== null ? String(self.register) : '';
37
+ const sch = self.schema !== undefined && self.schema !== null ? String(self.schema) : '';
38
+ if (!reg || !sch) {
39
+ return null
40
+ }
41
+ const idsOf = (...values) => values.filter((v) => v !== undefined && v !== null && v !== '').map(String);
42
+ const schemaIds = idsOf(schema, primarySchema && primarySchema.id, primarySchema && primarySchema.slug);
43
+ const registerIds = idsOf(register, primaryRegister && primaryRegister.id, primaryRegister && primaryRegister.slug);
44
+ if (schemaIds.includes(sch) && registerIds.includes(reg)) {
45
+ return null
46
+ }
47
+ const type = `${reg}-${sch}`;
48
+ if (!store.objectTypeRegistry?.[type]) {
49
+ store.registerObjectType(type, sch, reg, { registerSlug: reg, schemaSlug: sch });
50
+ }
51
+ return { register: reg, schema: sch, type }
52
+ }
53
+
54
+ /**
55
+ * The store type a row is written through: its own pair's, or the page's.
56
+ *
57
+ * @param {object} ctx Accessor closures.
58
+ * @param {object} [row] The row.
59
+ * @return {string} The type slug.
60
+ */
61
+ function typeFor(ctx, row) {
62
+ const target = row && typeof ctx.rowTarget === 'function' ? ctx.rowTarget(row) : null;
63
+ return target ? target.type : ctx.selfObjectType()
12
64
  }
13
65
 
14
66
  /**
@@ -21,6 +73,10 @@ function findSource(ctx, id) {
21
73
  */
22
74
  function copyAddress(ctx, source) {
23
75
  const self = source['@self'] || {};
76
+ const target = typeof ctx.rowTarget === 'function' ? ctx.rowTarget(source) : null;
77
+ if (target) {
78
+ return { register: target.register, schema: target.schema, id: String(source.id || self.id) }
79
+ }
24
80
  const reg = ctx.register();
25
81
  const sch = ctx.schema();
26
82
  const register = (typeof reg === 'string' && reg) || self.register;
@@ -50,12 +106,12 @@ function refreshList(ctx) {
50
106
  }
51
107
  }
52
108
 
53
- function storeError(ctx) {
54
- return ctx.selfObjectStore()?.getError?.(ctx.selfObjectType())
109
+ function storeError(ctx, type = ctx.selfObjectType()) {
110
+ return ctx.selfObjectStore()?.getError?.(type)
55
111
  }
56
112
 
57
- function storeErrorMessage(ctx, fallback) {
58
- const err = storeError(ctx);
113
+ function storeErrorMessage(ctx, fallback, type) {
114
+ const err = storeError(ctx, type);
59
115
  return (err && err.message) || fallback
60
116
  }
61
117
 
@@ -72,13 +128,14 @@ function createSelfModeActions(ctx) {
72
128
  return false
73
129
  }
74
130
  try {
75
- const ok = await ctx.selfObjectStore().deleteObject(ctx.selfObjectType(), id);
131
+ const type = typeFor(ctx, findSource(ctx, id));
132
+ const ok = await ctx.selfObjectStore().deleteObject(type, id);
76
133
  if (ok) {
77
134
  ctx.setResults.singleDelete({ success: true });
78
135
  ctx.emit('delete', id);
79
136
  refreshList(ctx);
80
137
  } else {
81
- ctx.setResults.singleDelete({ error: storeErrorMessage(ctx, 'Delete failed') });
138
+ ctx.setResults.singleDelete({ error: storeErrorMessage(ctx, 'Delete failed', type) });
82
139
  }
83
140
  } catch (err) {
84
141
  ctx.setResults.singleDelete({ error: (err && err.message) || 'Delete failed' });
@@ -91,12 +148,28 @@ function createSelfModeActions(ctx) {
91
148
  return false
92
149
  }
93
150
  try {
94
- const { successfulIds, failedIds } = await ctx.selfObjectStore().deleteObjects(ctx.selfObjectType(), ids);
151
+ // One request per pair: a mixed list holds rows of several types.
152
+ const idsByType = new Map();
153
+ for (const id of ids) {
154
+ const type = typeFor(ctx, findSource(ctx, id));
155
+ idsByType.set(type, [...(idsByType.get(type) || []), id]);
156
+ }
157
+ const successfulIds = [];
158
+ const failedIds = [];
159
+ let failedType = null;
160
+ for (const [type, typeIds] of idsByType) {
161
+ const outcome = await ctx.selfObjectStore().deleteObjects(type, typeIds);
162
+ successfulIds.push(...outcome.successfulIds);
163
+ failedIds.push(...outcome.failedIds);
164
+ if (outcome.failedIds.length > 0 && failedType === null) {
165
+ failedType = type;
166
+ }
167
+ }
95
168
  if (failedIds.length === 0) {
96
169
  ctx.setResults.massDelete({ success: true, successfulIds });
97
170
  } else {
98
171
  ctx.setResults.massDelete({
99
- error: storeErrorMessage(ctx, `Failed to delete ${failedIds.length} item(s)`),
172
+ error: storeErrorMessage(ctx, `Failed to delete ${failedIds.length} item(s)`, failedType),
100
173
  successfulIds,
101
174
  failedIds,
102
175
  });
@@ -138,13 +211,14 @@ function createSelfModeActions(ctx) {
138
211
  }
139
212
  }
140
213
  const clone = cloneObjectForCopy(source, newName, resolveNameField(ctx));
141
- const saved = await ctx.selfObjectStore().saveObject(ctx.selfObjectType(), clone);
214
+ const type = typeFor(ctx, source);
215
+ const saved = await ctx.selfObjectStore().saveObject(type, clone);
142
216
  if (saved) {
143
217
  ctx.setResults.singleCopy({ success: true });
144
218
  ctx.emit('copy', payload);
145
219
  refreshList(ctx);
146
220
  } else {
147
- ctx.setResults.singleCopy({ error: storeErrorMessage(ctx, 'Copy failed') });
221
+ ctx.setResults.singleCopy({ error: storeErrorMessage(ctx, 'Copy failed', type) });
148
222
  }
149
223
  } catch (err) {
150
224
  ctx.setResults.singleCopy({ error: (err && err.message) || 'Copy failed' });
@@ -187,7 +261,7 @@ function createSelfModeActions(ctx) {
187
261
  }
188
262
  const clone = cloneObjectForCopy(source, getName(source), nameField);
189
263
  try {
190
- const saved = await ctx.selfObjectStore().saveObject(ctx.selfObjectType(), clone);
264
+ const saved = await ctx.selfObjectStore().saveObject(typeFor(ctx, source), clone);
191
265
  if (saved) {
192
266
  successfulIds.push(id);
193
267
  } else {
@@ -257,7 +331,9 @@ function createSelfModeActions(ctx) {
257
331
  return false
258
332
  }
259
333
  try {
260
- const saved = await ctx.selfObjectStore().saveObject(ctx.selfObjectType(), formData);
334
+ const item = ctx.editItem();
335
+ const type = item ? typeFor(ctx, item) : ctx.selfObjectType();
336
+ const saved = await ctx.selfObjectStore().saveObject(type, formData);
261
337
  if (saved) {
262
338
  ctx.setResults.form({ success: true });
263
339
  const isCreate = !ctx.editItem();
@@ -273,7 +349,7 @@ function createSelfModeActions(ctx) {
273
349
  ctx.afterCreateSuccess(saved);
274
350
  }
275
351
  } else {
276
- const err = storeError(ctx);
352
+ const err = storeError(ctx, type);
277
353
  if (err && err.isValidation) {
278
354
  // Keep the form visible so the user can fix the invalid data.
279
355
  ctx.setResults.formValidation(err.fields, err.message || 'Validation failed');
@@ -298,5 +374,5 @@ function createSelfModeActions(ctx) {
298
374
  }
299
375
  }
300
376
 
301
- export { createSelfModeActions };
377
+ export { createSelfModeActions, resolveRowTarget };
302
378
  //# sourceMappingURL=selfModeActions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"selfModeActions.js","sources":["../../../../src/components/CnIndexPage/selfModeActions.js"],"sourcesContent":["import { useObjectCopy } from '../../composables/useObjectCopy.js'\nimport { dispatchObjectCreated } from '../../utils/walkthroughSignals.js'\nimport {\n\tcloneObjectForCopy,\n\trunSelfExportRequest,\n\trunSelfImportRequest,\n} from './selfModeIO.js'\n\nfunction resolveNameField(ctx) {\n\treturn ctx.effectiveSchema()?.configuration?.objectNameField\n\t\t|| ctx.massActionNameField()\n}\n\nfunction findSource(ctx, id) {\n\treturn ctx.effectiveObjects().find((o) => o.id === id || o['@self']?.id === id)\n}\n\n/**\n * The source's address for the copy endpoint, or null when the register or\n * schema is not known as a slug.\n *\n * @param {object} ctx Accessor closures.\n * @param {object} source The object being copied.\n * @return {{register: string, schema: string, id: string}|null} The address.\n */\nfunction copyAddress(ctx, source) {\n\tconst self = source['@self'] || {}\n\tconst reg = ctx.register()\n\tconst sch = ctx.schema()\n\tconst register = (typeof reg === 'string' && reg) || self.register\n\tconst schema = (typeof sch === 'string' && sch) || (sch && (sch.slug || sch.id)) || self.schema || ctx.effectiveSchema()?.slug\n\treturn register && schema ? { register: String(register), schema: String(schema), id: String(source.id || self.id) } : null\n}\n\n/**\n * Whether an error says the server has no copy endpoint (404 or 405).\n *\n * @param {unknown} error The error.\n * @return {boolean} True when the endpoint is missing.\n */\nfunction copyEndpointMissing(error) {\n\tconst status = error && error.response && error.response.status\n\treturn status === 404 || status === 405\n}\n\nfunction selfModeReady(ctx) {\n\treturn ctx.isSelfFetchMode() && !!ctx.selfObjectStore() && !!ctx.selfObjectType()\n}\n\nfunction refreshList(ctx) {\n\tconst list = ctx.list()\n\tif (list && typeof list.refresh === 'function') {\n\t\tlist.refresh()\n\t}\n}\n\nfunction storeError(ctx) {\n\treturn ctx.selfObjectStore()?.getError?.(ctx.selfObjectType())\n}\n\nfunction storeErrorMessage(ctx, fallback) {\n\tconst err = storeError(ctx)\n\treturn (err && err.message) || fallback\n}\n\n/**\n * Self-mode action handlers for CnIndexPage. Each `handle*` returns `true`\n * when self-mode handled it (caller should NOT emit), `false` otherwise.\n *\n * @param {object} ctx Accessor closures + emit/setResults forwarders.\n * @return {object}\n */\nexport function createSelfModeActions(ctx) {\n\tasync function handleSingleDelete(id) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\tconst ok = await ctx.selfObjectStore().deleteObject(ctx.selfObjectType(), id)\n\t\t\tif (ok) {\n\t\t\t\tctx.setResults.singleDelete({ success: true })\n\t\t\t\tctx.emit('delete', id)\n\t\t\t\trefreshList(ctx)\n\t\t\t} else {\n\t\t\t\tctx.setResults.singleDelete({ error: storeErrorMessage(ctx, 'Delete failed') })\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tctx.setResults.singleDelete({ error: (err && err.message) || 'Delete failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleMassDelete(ids) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\tconst { successfulIds, failedIds } = await ctx.selfObjectStore().deleteObjects(ctx.selfObjectType(), ids)\n\t\t\tif (failedIds.length === 0) {\n\t\t\t\tctx.setResults.massDelete({ success: true, successfulIds })\n\t\t\t} else {\n\t\t\t\tctx.setResults.massDelete({\n\t\t\t\t\terror: storeErrorMessage(ctx, `Failed to delete ${failedIds.length} item(s)`),\n\t\t\t\t\tsuccessfulIds,\n\t\t\t\t\tfailedIds,\n\t\t\t\t})\n\t\t\t}\n\t\t\trefreshList(ctx)\n\t\t} catch (err) {\n\t\t\tctx.setResults.massDelete({ error: (err && err.message) || 'Delete failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleSingleCopy(payload) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\tconst { id, newName } = payload || {}\n\t\tconst source = findSource(ctx, id)\n\t\tif (!source) {\n\t\t\tctx.setResults.singleCopy({ error: 'Source object not found in current view' })\n\t\t\treturn true\n\t\t}\n\t\ttry {\n\t\t\t// Links the person left ticked: one request to the server's copy endpoint.\n\t\t\t// A server without it (404 or 405) falls through to the fields-only copy below.\n\t\t\tconst include = Array.isArray(payload && payload.include) ? payload.include : []\n\t\t\tconst address = include.length > 0 ? copyAddress(ctx, source) : null\n\t\t\tif (address) {\n\t\t\t\ttry {\n\t\t\t\t\tconst copied = await useObjectCopy().copy(address, newName, include, { [resolveNameField(ctx)]: newName })\n\t\t\t\t\tctx.setResults.singleCopy({ success: true, object: copied.object, links: copied.links })\n\t\t\t\t\tctx.emit('copy', payload)\n\t\t\t\t\trefreshList(ctx)\n\t\t\t\t\treturn true\n\t\t\t\t} catch (copyError) {\n\t\t\t\t\tif (!copyEndpointMissing(copyError)) {\n\t\t\t\t\t\tctx.setResults.singleCopy({ error: (copyError && copyError.message) || 'Copy failed' })\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst clone = cloneObjectForCopy(source, newName, resolveNameField(ctx))\n\t\t\tconst saved = await ctx.selfObjectStore().saveObject(ctx.selfObjectType(), clone)\n\t\t\tif (saved) {\n\t\t\t\tctx.setResults.singleCopy({ success: true })\n\t\t\t\tctx.emit('copy', payload)\n\t\t\t\trefreshList(ctx)\n\t\t\t} else {\n\t\t\t\tctx.setResults.singleCopy({ error: storeErrorMessage(ctx, 'Copy failed') })\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tctx.setResults.singleCopy({ error: (err && err.message) || 'Copy failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleMassCopy(payload) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\tconst ids = (payload && payload.ids) || []\n\t\tconst nameField = resolveNameField(ctx)\n\t\tconst getName = (payload && payload.getName) || ((item) => item[ctx.massActionNameField()])\n\t\tconst successfulIds = []\n\t\tconst failedIds = []\n\t\tconst links = []\n\t\tlet serverCopy = Array.isArray(payload && payload.include) && payload.include.length > 0\n\t\tfor (const id of ids) {\n\t\t\tconst source = findSource(ctx, id)\n\t\t\tif (!source) {\n\t\t\t\tfailedIds.push(id)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// One copy request per row with the ticked kinds; a server without the endpoint falls back to fields only.\n\t\t\tconst address = serverCopy ? copyAddress(ctx, source) : null\n\t\t\tif (address) {\n\t\t\t\ttry {\n\t\t\t\t\tconst copied = await useObjectCopy().copy(address, getName(source), payload.include, { [nameField]: getName(source) })\n\t\t\t\t\tlinks.push(...copied.links.map((l) => ({ ...l, source: id })))\n\t\t\t\t\tsuccessfulIds.push(id)\n\t\t\t\t\tcontinue\n\t\t\t\t} catch (copyError) {\n\t\t\t\t\tif (!copyEndpointMissing(copyError)) {\n\t\t\t\t\t\tfailedIds.push(id)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tserverCopy = false\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst clone = cloneObjectForCopy(source, getName(source), nameField)\n\t\t\ttry {\n\t\t\t\tconst saved = await ctx.selfObjectStore().saveObject(ctx.selfObjectType(), clone)\n\t\t\t\tif (saved) {\n\t\t\t\t\tsuccessfulIds.push(id)\n\t\t\t\t} else {\n\t\t\t\t\tfailedIds.push(id)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tfailedIds.push(id)\n\t\t\t}\n\t\t}\n\t\tif (failedIds.length === 0) {\n\t\t\tctx.setResults.massCopy({ success: true, successfulIds, ...(links.length > 0 ? { links } : {}) })\n\t\t} else {\n\t\t\tctx.setResults.massCopy({\n\t\t\t\terror: storeErrorMessage(ctx, `Failed to copy ${failedIds.length} item(s)`),\n\t\t\t\tsuccessfulIds,\n\t\t\t\tfailedIds,\n\t\t\t\t...(links.length > 0 ? { links } : {}),\n\t\t\t})\n\t\t}\n\t\trefreshList(ctx)\n\t\treturn true\n\t}\n\n\tasync function handleMassExport(payload) {\n\t\tif (!ctx.isSelfFetchMode() || !ctx.register() || !ctx.schema()) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\t// The selected rows when there are any, else the rows the list\n\t\t\t// matches: never the whole schema by surprise.\n\t\t\tconst ids = typeof ctx.selectedIds === 'function' ? ctx.selectedIds() : []\n\t\t\tconst list = ctx.list()\n\t\t\tawait runSelfExportRequest({\n\t\t\t\tregister: ctx.register(),\n\t\t\t\tschema: ctx.schema(),\n\t\t\t\tformat: payload && payload.format,\n\t\t\t\tids: ids.length > 0 ? ids : undefined,\n\t\t\t\tquery: list && typeof list.buildParams === 'function' ? list.buildParams(1) : undefined,\n\t\t\t})\n\t\t\tctx.setResults.massExport({ success: true })\n\t\t} catch (err) {\n\t\t\tctx.setResults.massExport({ error: (err && err.message) || 'Export failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleMassImport(payload) {\n\t\tif (!ctx.isSelfFetchMode() || !ctx.register()) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\tawait runSelfImportRequest({\n\t\t\t\tregister: ctx.register(),\n\t\t\t\tschema: ctx.schema(),\n\t\t\t\tfile: payload && payload.file,\n\t\t\t})\n\t\t\tctx.setResults.massImport({ success: true })\n\t\t\trefreshList(ctx)\n\t\t} catch (err) {\n\t\t\tctx.setResults.massImport({ error: (err && err.message) || 'Import failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleFormSave(formData) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\tconst saved = await ctx.selfObjectStore().saveObject(ctx.selfObjectType(), formData)\n\t\t\tif (saved) {\n\t\t\t\tctx.setResults.form({ success: true })\n\t\t\t\tconst isCreate = !ctx.editItem()\n\t\t\t\tctx.emit(isCreate ? 'create' : 'edit', saved)\n\t\t\t\t// @self.register/@self.schema are numeric DB ids, not slugs, so\n\t\t\t\t// override with this page's own slug props (self-fetch mode\n\t\t\t\t// guarantees ctx.schema() is already a string).\n\t\t\t\tif (isCreate) {\n\t\t\t\t\tdispatchObjectCreated({ register: ctx.register(), schema: ctx.schema(), object: saved })\n\t\t\t\t}\n\t\t\t\trefreshList(ctx)\n\t\t\t\tif (isCreate && typeof ctx.afterCreateSuccess === 'function') {\n\t\t\t\t\tctx.afterCreateSuccess(saved)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst err = storeError(ctx)\n\t\t\t\tif (err && err.isValidation) {\n\t\t\t\t\t// Keep the form visible so the user can fix the invalid data.\n\t\t\t\t\tctx.setResults.formValidation(err.fields, err.message || 'Validation failed')\n\t\t\t\t} else {\n\t\t\t\t\tctx.setResults.form({ error: (err && err.message) || 'Save failed' })\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tctx.setResults.form({ error: (err && err.message) || 'Save failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\treturn {\n\t\thandleSingleDelete,\n\t\thandleMassDelete,\n\t\thandleSingleCopy,\n\t\thandleMassCopy,\n\t\thandleMassExport,\n\t\thandleMassImport,\n\t\thandleFormSave,\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selfModeActions.js","sources":["../../../../src/components/CnIndexPage/selfModeActions.js"],"sourcesContent":["import { useObjectCopy } from '../../composables/useObjectCopy.js'\nimport { dispatchObjectCreated } from '../../utils/walkthroughSignals.js'\nimport {\n\tcloneObjectForCopy,\n\trunSelfExportRequest,\n\trunSelfImportRequest,\n} from './selfModeIO.js'\n\nfunction resolveNameField(ctx) {\n\treturn ctx.effectiveSchema()?.configuration?.objectNameField\n\t\t|| ctx.massActionNameField()\n}\n\nfunction findSource(ctx, id) {\n\treturn ctx.effectiveObjects().find((o) => o.id === id || o['@self']?.id === id)\n\t\t|| (typeof ctx.knownRow === 'function' ? ctx.knownRow(id) : undefined)\n}\n\n/**\n * The register/schema of a row that belongs to another pair than the page's,\n * in a list fetched from a `collectionUrl`. Registers a store type for that\n * pair on first use. Returns null for rows of the page's own pair, and always\n * without a `collectionUrl`.\n *\n * @param {object} opts Page context.\n * @param {string} opts.collectionUrl The page's collection endpoint, or ''.\n * @param {string} opts.register The page's register.\n * @param {string} opts.schema The page's schema.\n * @param {object|null} opts.primarySchema The page's resolved schema.\n * @param {object|null} [opts.primaryRegister] The page's resolved register, which matches a slug `register` to `@self.register`.\n * @param {object|null} opts.store The object store.\n * @param {object} row The row.\n * @return {{register: string, schema: string, type: string}|null} The row's own pair.\n */\nexport function resolveRowTarget({ collectionUrl, register, schema, primarySchema, primaryRegister, store }, row) {\n\tif (!collectionUrl || !row || !store) {\n\t\treturn null\n\t}\n\tconst self = row['@self'] || {}\n\tconst reg = self.register !== undefined && self.register !== null ? String(self.register) : ''\n\tconst sch = self.schema !== undefined && self.schema !== null ? String(self.schema) : ''\n\tif (!reg || !sch) {\n\t\treturn null\n\t}\n\tconst idsOf = (...values) => values.filter((v) => v !== undefined && v !== null && v !== '').map(String)\n\tconst schemaIds = idsOf(schema, primarySchema && primarySchema.id, primarySchema && primarySchema.slug)\n\tconst registerIds = idsOf(register, primaryRegister && primaryRegister.id, primaryRegister && primaryRegister.slug)\n\tif (schemaIds.includes(sch) && registerIds.includes(reg)) {\n\t\treturn null\n\t}\n\tconst type = `${reg}-${sch}`\n\tif (!store.objectTypeRegistry?.[type]) {\n\t\tstore.registerObjectType(type, sch, reg, { registerSlug: reg, schemaSlug: sch })\n\t}\n\treturn { register: reg, schema: sch, type }\n}\n\n/**\n * The store type a row is written through: its own pair's, or the page's.\n *\n * @param {object} ctx Accessor closures.\n * @param {object} [row] The row.\n * @return {string} The type slug.\n */\nfunction typeFor(ctx, row) {\n\tconst target = row && typeof ctx.rowTarget === 'function' ? ctx.rowTarget(row) : null\n\treturn target ? target.type : ctx.selfObjectType()\n}\n\n/**\n * The source's address for the copy endpoint, or null when the register or\n * schema is not known as a slug.\n *\n * @param {object} ctx Accessor closures.\n * @param {object} source The object being copied.\n * @return {{register: string, schema: string, id: string}|null} The address.\n */\nfunction copyAddress(ctx, source) {\n\tconst self = source['@self'] || {}\n\tconst target = typeof ctx.rowTarget === 'function' ? ctx.rowTarget(source) : null\n\tif (target) {\n\t\treturn { register: target.register, schema: target.schema, id: String(source.id || self.id) }\n\t}\n\tconst reg = ctx.register()\n\tconst sch = ctx.schema()\n\tconst register = (typeof reg === 'string' && reg) || self.register\n\tconst schema = (typeof sch === 'string' && sch) || (sch && (sch.slug || sch.id)) || self.schema || ctx.effectiveSchema()?.slug\n\treturn register && schema ? { register: String(register), schema: String(schema), id: String(source.id || self.id) } : null\n}\n\n/**\n * Whether an error says the server has no copy endpoint (404 or 405).\n *\n * @param {unknown} error The error.\n * @return {boolean} True when the endpoint is missing.\n */\nfunction copyEndpointMissing(error) {\n\tconst status = error && error.response && error.response.status\n\treturn status === 404 || status === 405\n}\n\nfunction selfModeReady(ctx) {\n\treturn ctx.isSelfFetchMode() && !!ctx.selfObjectStore() && !!ctx.selfObjectType()\n}\n\nfunction refreshList(ctx) {\n\tconst list = ctx.list()\n\tif (list && typeof list.refresh === 'function') {\n\t\tlist.refresh()\n\t}\n}\n\nfunction storeError(ctx, type = ctx.selfObjectType()) {\n\treturn ctx.selfObjectStore()?.getError?.(type)\n}\n\nfunction storeErrorMessage(ctx, fallback, type) {\n\tconst err = storeError(ctx, type)\n\treturn (err && err.message) || fallback\n}\n\n/**\n * Self-mode action handlers for CnIndexPage. Each `handle*` returns `true`\n * when self-mode handled it (caller should NOT emit), `false` otherwise.\n *\n * @param {object} ctx Accessor closures + emit/setResults forwarders.\n * @return {object}\n */\nexport function createSelfModeActions(ctx) {\n\tasync function handleSingleDelete(id) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\tconst type = typeFor(ctx, findSource(ctx, id))\n\t\t\tconst ok = await ctx.selfObjectStore().deleteObject(type, id)\n\t\t\tif (ok) {\n\t\t\t\tctx.setResults.singleDelete({ success: true })\n\t\t\t\tctx.emit('delete', id)\n\t\t\t\trefreshList(ctx)\n\t\t\t} else {\n\t\t\t\tctx.setResults.singleDelete({ error: storeErrorMessage(ctx, 'Delete failed', type) })\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tctx.setResults.singleDelete({ error: (err && err.message) || 'Delete failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleMassDelete(ids) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\t// One request per pair: a mixed list holds rows of several types.\n\t\t\tconst idsByType = new Map()\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst type = typeFor(ctx, findSource(ctx, id))\n\t\t\t\tidsByType.set(type, [...(idsByType.get(type) || []), id])\n\t\t\t}\n\t\t\tconst successfulIds = []\n\t\t\tconst failedIds = []\n\t\t\tlet failedType = null\n\t\t\tfor (const [type, typeIds] of idsByType) {\n\t\t\t\tconst outcome = await ctx.selfObjectStore().deleteObjects(type, typeIds)\n\t\t\t\tsuccessfulIds.push(...outcome.successfulIds)\n\t\t\t\tfailedIds.push(...outcome.failedIds)\n\t\t\t\tif (outcome.failedIds.length > 0 && failedType === null) {\n\t\t\t\t\tfailedType = type\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (failedIds.length === 0) {\n\t\t\t\tctx.setResults.massDelete({ success: true, successfulIds })\n\t\t\t} else {\n\t\t\t\tctx.setResults.massDelete({\n\t\t\t\t\terror: storeErrorMessage(ctx, `Failed to delete ${failedIds.length} item(s)`, failedType),\n\t\t\t\t\tsuccessfulIds,\n\t\t\t\t\tfailedIds,\n\t\t\t\t})\n\t\t\t}\n\t\t\trefreshList(ctx)\n\t\t} catch (err) {\n\t\t\tctx.setResults.massDelete({ error: (err && err.message) || 'Delete failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleSingleCopy(payload) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\tconst { id, newName } = payload || {}\n\t\tconst source = findSource(ctx, id)\n\t\tif (!source) {\n\t\t\tctx.setResults.singleCopy({ error: 'Source object not found in current view' })\n\t\t\treturn true\n\t\t}\n\t\ttry {\n\t\t\t// Links the person left ticked: one request to the server's copy endpoint.\n\t\t\t// A server without it (404 or 405) falls through to the fields-only copy below.\n\t\t\tconst include = Array.isArray(payload && payload.include) ? payload.include : []\n\t\t\tconst address = include.length > 0 ? copyAddress(ctx, source) : null\n\t\t\tif (address) {\n\t\t\t\ttry {\n\t\t\t\t\tconst copied = await useObjectCopy().copy(address, newName, include, { [resolveNameField(ctx)]: newName })\n\t\t\t\t\tctx.setResults.singleCopy({ success: true, object: copied.object, links: copied.links })\n\t\t\t\t\tctx.emit('copy', payload)\n\t\t\t\t\trefreshList(ctx)\n\t\t\t\t\treturn true\n\t\t\t\t} catch (copyError) {\n\t\t\t\t\tif (!copyEndpointMissing(copyError)) {\n\t\t\t\t\t\tctx.setResults.singleCopy({ error: (copyError && copyError.message) || 'Copy failed' })\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst clone = cloneObjectForCopy(source, newName, resolveNameField(ctx))\n\t\t\tconst type = typeFor(ctx, source)\n\t\t\tconst saved = await ctx.selfObjectStore().saveObject(type, clone)\n\t\t\tif (saved) {\n\t\t\t\tctx.setResults.singleCopy({ success: true })\n\t\t\t\tctx.emit('copy', payload)\n\t\t\t\trefreshList(ctx)\n\t\t\t} else {\n\t\t\t\tctx.setResults.singleCopy({ error: storeErrorMessage(ctx, 'Copy failed', type) })\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tctx.setResults.singleCopy({ error: (err && err.message) || 'Copy failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleMassCopy(payload) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\tconst ids = (payload && payload.ids) || []\n\t\tconst nameField = resolveNameField(ctx)\n\t\tconst getName = (payload && payload.getName) || ((item) => item[ctx.massActionNameField()])\n\t\tconst successfulIds = []\n\t\tconst failedIds = []\n\t\tconst links = []\n\t\tlet serverCopy = Array.isArray(payload && payload.include) && payload.include.length > 0\n\t\tfor (const id of ids) {\n\t\t\tconst source = findSource(ctx, id)\n\t\t\tif (!source) {\n\t\t\t\tfailedIds.push(id)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// One copy request per row with the ticked kinds; a server without the endpoint falls back to fields only.\n\t\t\tconst address = serverCopy ? copyAddress(ctx, source) : null\n\t\t\tif (address) {\n\t\t\t\ttry {\n\t\t\t\t\tconst copied = await useObjectCopy().copy(address, getName(source), payload.include, { [nameField]: getName(source) })\n\t\t\t\t\tlinks.push(...copied.links.map((l) => ({ ...l, source: id })))\n\t\t\t\t\tsuccessfulIds.push(id)\n\t\t\t\t\tcontinue\n\t\t\t\t} catch (copyError) {\n\t\t\t\t\tif (!copyEndpointMissing(copyError)) {\n\t\t\t\t\t\tfailedIds.push(id)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tserverCopy = false\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst clone = cloneObjectForCopy(source, getName(source), nameField)\n\t\t\ttry {\n\t\t\t\tconst saved = await ctx.selfObjectStore().saveObject(typeFor(ctx, source), clone)\n\t\t\t\tif (saved) {\n\t\t\t\t\tsuccessfulIds.push(id)\n\t\t\t\t} else {\n\t\t\t\t\tfailedIds.push(id)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tfailedIds.push(id)\n\t\t\t}\n\t\t}\n\t\tif (failedIds.length === 0) {\n\t\t\tctx.setResults.massCopy({ success: true, successfulIds, ...(links.length > 0 ? { links } : {}) })\n\t\t} else {\n\t\t\tctx.setResults.massCopy({\n\t\t\t\terror: storeErrorMessage(ctx, `Failed to copy ${failedIds.length} item(s)`),\n\t\t\t\tsuccessfulIds,\n\t\t\t\tfailedIds,\n\t\t\t\t...(links.length > 0 ? { links } : {}),\n\t\t\t})\n\t\t}\n\t\trefreshList(ctx)\n\t\treturn true\n\t}\n\n\tasync function handleMassExport(payload) {\n\t\tif (!ctx.isSelfFetchMode() || !ctx.register() || !ctx.schema()) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\t// The selected rows when there are any, else the rows the list\n\t\t\t// matches: never the whole schema by surprise.\n\t\t\tconst ids = typeof ctx.selectedIds === 'function' ? ctx.selectedIds() : []\n\t\t\tconst list = ctx.list()\n\t\t\tawait runSelfExportRequest({\n\t\t\t\tregister: ctx.register(),\n\t\t\t\tschema: ctx.schema(),\n\t\t\t\tformat: payload && payload.format,\n\t\t\t\tids: ids.length > 0 ? ids : undefined,\n\t\t\t\tquery: list && typeof list.buildParams === 'function' ? list.buildParams(1) : undefined,\n\t\t\t})\n\t\t\tctx.setResults.massExport({ success: true })\n\t\t} catch (err) {\n\t\t\tctx.setResults.massExport({ error: (err && err.message) || 'Export failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleMassImport(payload) {\n\t\tif (!ctx.isSelfFetchMode() || !ctx.register()) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\tawait runSelfImportRequest({\n\t\t\t\tregister: ctx.register(),\n\t\t\t\tschema: ctx.schema(),\n\t\t\t\tfile: payload && payload.file,\n\t\t\t})\n\t\t\tctx.setResults.massImport({ success: true })\n\t\t\trefreshList(ctx)\n\t\t} catch (err) {\n\t\t\tctx.setResults.massImport({ error: (err && err.message) || 'Import failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\tasync function handleFormSave(formData) {\n\t\tif (!selfModeReady(ctx)) {\n\t\t\treturn false\n\t\t}\n\t\ttry {\n\t\t\tconst item = ctx.editItem()\n\t\t\tconst type = item ? typeFor(ctx, item) : ctx.selfObjectType()\n\t\t\tconst saved = await ctx.selfObjectStore().saveObject(type, formData)\n\t\t\tif (saved) {\n\t\t\t\tctx.setResults.form({ success: true })\n\t\t\t\tconst isCreate = !ctx.editItem()\n\t\t\t\tctx.emit(isCreate ? 'create' : 'edit', saved)\n\t\t\t\t// @self.register/@self.schema are numeric DB ids, not slugs, so\n\t\t\t\t// override with this page's own slug props (self-fetch mode\n\t\t\t\t// guarantees ctx.schema() is already a string).\n\t\t\t\tif (isCreate) {\n\t\t\t\t\tdispatchObjectCreated({ register: ctx.register(), schema: ctx.schema(), object: saved })\n\t\t\t\t}\n\t\t\t\trefreshList(ctx)\n\t\t\t\tif (isCreate && typeof ctx.afterCreateSuccess === 'function') {\n\t\t\t\t\tctx.afterCreateSuccess(saved)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst err = storeError(ctx, type)\n\t\t\t\tif (err && err.isValidation) {\n\t\t\t\t\t// Keep the form visible so the user can fix the invalid data.\n\t\t\t\t\tctx.setResults.formValidation(err.fields, err.message || 'Validation failed')\n\t\t\t\t} else {\n\t\t\t\t\tctx.setResults.form({ error: (err && err.message) || 'Save failed' })\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tctx.setResults.form({ error: (err && err.message) || 'Save failed' })\n\t\t}\n\t\treturn true\n\t}\n\n\treturn {\n\t\thandleSingleDelete,\n\t\thandleMassDelete,\n\t\thandleSingleCopy,\n\t\thandleMassCopy,\n\t\thandleMassExport,\n\t\thandleMassImport,\n\t\thandleFormSave,\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -103,7 +103,11 @@ function useSelfFetchList(props, instance, inject, extras = {}) {
103
103
  const register = folder.register || props.register;
104
104
  return { register, schema: folder.schema, type: `${register}-${folder.schema}` }
105
105
  }
106
- return { register: props.register, schema: props.schema, type: `${props.register}-${props.schema}` }
106
+ // A collection endpoint gets its own type key, so a plain registration of
107
+ // the same pair elsewhere never resets it.
108
+ const collectionUrl = props.collectionUrl || '';
109
+ const type = `${props.register}-${props.schema}` + (collectionUrl ? `@${collectionUrl}` : '');
110
+ return { register: props.register, schema: props.schema, type, collectionUrl }
107
111
  });
108
112
  const objectType = computed(() => resolvedTarget.value.type);
109
113
  const sidebarState = inject('sidebarState', null) ?? inject('objectSidebarState', null);
@@ -152,9 +156,17 @@ function useSelfFetchList(props, instance, inject, extras = {}) {
152
156
  // second arg) — that previously made fetch URLs go to `/api/objects/undefined/[object Object]`.
153
157
  // Runs (sync, ahead of the list's own watcher) again whenever the type switches.
154
158
  function registerTarget() {
155
- const { register, schema, type } = resolvedTarget.value;
159
+ const { register, schema, type, collectionUrl } = resolvedTarget.value;
156
160
  if (typeof objectStore.registerObjectType === 'function') {
157
- objectStore.registerObjectType(type, schema, register, { registerSlug: register, schemaSlug: schema });
161
+ objectStore.registerObjectType(type, schema, register, {
162
+ registerSlug: register,
163
+ schemaSlug: schema,
164
+ ...(collectionUrl ? { collectionUrl } : {}),
165
+ });
166
+ }
167
+ // A mixed list tells its own rows apart by `@self.register`, an id, so a slug register needs resolving.
168
+ if (collectionUrl && !/^\d+$/.test(String(register)) && typeof objectStore.fetchRegister === 'function') {
169
+ objectStore.fetchRegister(type);
158
170
  }
159
171
  }
160
172
  registerTarget();
@@ -1 +1 @@
1
- {"version":3,"file":"useSelfFetchList.js","sources":["../../../../src/components/CnIndexPage/useSelfFetchList.js"],"sourcesContent":["import { computed, ref, watch } from 'vue'\nimport { useListView } from '../../composables/index.js'\nimport { useObjectSubscription } from '../../composables/useObjectSubscription.js'\nimport { useObjectStore } from '../../store/index.js'\n// Both filter resolvers live in `utils/routeFilters.js` so CnLogsPage applies\n// the same two grammars (route-param interpolation + `?key=value` deep links)\n// without pulling in this composable's index-only sidebar/subscription wiring.\nimport { withPersonalLenses } from '../../utils/personalLenses.js'\nimport { parseSortKeysFromQuery, resolveFilterMap, resolveQueryFilters } from '../../utils/routeFilters.js'\n\nfunction resolveInitialQuickFilterIndex(quickFilters) {\n\tconst tabs = Array.isArray(quickFilters) ? quickFilters : null\n\tif (!tabs || tabs.length === 0) {\n\t\treturn null\n\t}\n\tconst di = tabs.findIndex((t) => t && t.default === true)\n\treturn di >= 0 ? di : 0\n}\n\n/**\n * OR-merge several quick-filter maps into one fetch filter. Values for the\n * same key collapse to an array (deduped) when more than one tab contributes\n * it — `buildQueryString` serialises an array as `key[]=a&key[]=b`, which the\n * OpenRegister API interprets as an IN / OR match.\n *\n * @param {Array<object>} filterMaps Already route-resolved filter maps.\n * @return {object} The merged filter (scalar when a key has one value, array when many).\n */\nfunction unionFilterMaps(filterMaps) {\n\tconst grouped = {}\n\tfor (const map of filterMaps) {\n\t\tif (!map || typeof map !== 'object') {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const [k, v] of Object.entries(map)) {\n\t\t\tif (v === undefined || v === null || v === '') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!grouped[k]) {\n\t\t\t\tgrouped[k] = []\n\t\t\t}\n\t\t\tfor (const item of (Array.isArray(v) ? v : [v])) {\n\t\t\t\tif (!grouped[k].includes(item)) {\n\t\t\t\t\tgrouped[k].push(item)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tconst out = {}\n\tfor (const [k, arr] of Object.entries(grouped)) {\n\t\tout[k] = arr.length === 1 ? arr[0] : arr\n\t}\n\treturn out\n}\n\n/**\n * Self-fetch mode for CnIndexPage: when register+schema are set but no\n * `objects` prop was passed (manifest-driven pages), drive the list ourselves.\n *\n * @param {object} props CnIndexPage props.\n * @param {import('vue').ComponentInternalInstance|null} instance Pass `getCurrentInstance()`.\n * @param {typeof import('vue').inject} inject Pass Vue's `inject`.\n * @param {{activeFolderSchema?: import('vue').Ref<?{schema: string, register?: string}>}} [extras] `activeFolderSchema`: a ref the page sets to the selected folder's `{ schema, register? }`, switching the loaded object type while it is non-null.\n * @return {object} { isSelfFetch, list, selfObjectStore, selfObjectType, activeQuickFilterIndex }\n */\nexport function useSelfFetchList(props, instance, inject, extras = {}) {\n\tconst objectsProvided = !!(\n\t\tinstance && instance.proxy && instance.proxy.$options && instance.proxy.$options.propsData\n\t\t&& Object.hasOwn(instance.proxy.$options.propsData, 'objects')\n\t)\n\t// A named source wins over register/schema. Without this the page would\n\t// fire an OpenRegister request whose rows it then discards in favour of the\n\t// source's — wasted, but worse than wasted if the manifest names both by\n\t// mistake, because the request succeeds and nothing says the two disagree.\n\tconst isSelfFetch = !!(props.register && props.schema) && !objectsProvided && !props.entitySource\n\n\t// \"Also search inside files\" switch, seeded from `?contentSearch=1` so a\n\t// shared link reproduces the list. Only meaningful when `searchInFiles` is on.\n\tconst routeAtSetup = instance && instance.proxy && instance.proxy.$route\n\tconst contentSearch = ref(props.searchInFiles === true && String(routeAtSetup?.query?.contentSearch) === '1')\n\n\tconst activeQuickFilterIndex = ref(resolveInitialQuickFilterIndex(withPersonalLenses(props.quickFilters, props.personalLenses)))\n\tconst selectedQuickFilterIndices = ref([])\n\tconst isMultiQuickFilter = props.quickFilterMultiple === true\n\n\tif (!isSelfFetch) {\n\t\treturn {\n\t\t\tisSelfFetch: false,\n\t\t\tlist: null,\n\t\t\tselfObjectStore: null,\n\t\t\tselfObjectType: '',\n\t\t\tactiveQuickFilterIndex,\n\t\t\tselectedQuickFilterIndices,\n\t\t\tcontentSearch,\n\t\t\tselfFetchTokenCtx: null,\n\t\t\tinitialQueryFilterKeys: [],\n\t\t}\n\t}\n\n\t// The object type follows the selected folder's own schema when it declares\n\t// one; otherwise the page's register and schema.\n\tconst activeFolderSchema = extras.activeFolderSchema || null\n\tconst resolvedTarget = computed(() => {\n\t\tconst folder = activeFolderSchema && activeFolderSchema.value\n\t\tif (folder && folder.schema) {\n\t\t\tconst register = folder.register || props.register\n\t\t\treturn { register, schema: folder.schema, type: `${register}-${folder.schema}` }\n\t\t}\n\t\treturn { register: props.register, schema: props.schema, type: `${props.register}-${props.schema}` }\n\t})\n\tconst objectType = computed(() => resolvedTarget.value.type)\n\tconst sidebarState = inject('sidebarState', null) ?? inject('objectSidebarState', null)\n\tconst objectStore = useObjectStore()\n\n\t// Token-resolution context for `@workspace.<key>` / `@config.<key>` /\n\t// `@objectId` / `@object.<field>` inside `props.filter` / quick-filter\n\t// tab filters. Same injects + unwrap shape as CnObjectListWidget's\n\t// `objectCtx`/`workspaceCtx`/`tokenCtx` computeds (and CnDeltaWidget) —\n\t// `cnWorkspaceContext` is the reactive bag a dashboard/workspace-root\n\t// (e.g. hrmq's App.vue for multi-administratie) provides; `cnObjectContext`\n\t// is a detail-page's object context (rare on an index page, but harmless\n\t// to support); `cnAppConfig` is the page-level app config bag. All three\n\t// default to null/absent so an app that never provides them is unaffected.\n\tconst objectCtxRaw = inject('cnObjectContext', null)\n\tconst workspaceCtxRaw = inject('cnWorkspaceContext', null)\n\tconst appConfigRaw = inject('cnAppConfig', null)\n\tconst unwrapCtx = (v) => ((v && typeof v === 'object' && 'value' in v) ? v.value : v)\n\n\t/**\n\t * Build the current token-resolution ctx `{ objectId?, object?, workspace, config }`\n\t * from the injected bags, unwrapping Vue refs. Called fresh on every fetch\n\t * so it always reflects the latest workspace/config state.\n\t *\n\t * @return {object} The token ctx.\n\t */\n\tfunction tokenCtx() {\n\t\tconst objCtx = unwrapCtx(objectCtxRaw)\n\t\tconst base = (objCtx && typeof objCtx === 'object') ? { ...objCtx } : {}\n\t\tbase.workspace = unwrapCtx(workspaceCtxRaw) || {}\n\t\tbase.config = unwrapCtx(appConfigRaw) || {}\n\t\treturn base\n\t}\n\n\t// Reactive signature of the workspace/config bags so a change (e.g. the\n\t// administration switcher writing `activeAdministrationId`) triggers a\n\t// re-fetch below — `fixedFilters` is a plain getter called at fetch time\n\t// (see useListView.resolveFixedFilters), it is NOT auto-tracked by Vue,\n\t// so without this the list would resolve the token once on mount and\n\t// never again. Stringified (like CnDeltaWidget's `sourceKey`) so the\n\t// watcher fires on real content changes only, not object identity.\n\tconst workspaceSignature = computed(() => JSON.stringify(unwrapCtx(workspaceCtxRaw) || {}))\n\tconst appConfigSignature = computed(() => JSON.stringify(unwrapCtx(appConfigRaw) || {}))\n\n\t// Pass register/schema in their positional id slots (not as a {register, schema} object as\n\t// second arg) — that previously made fetch URLs go to `/api/objects/undefined/[object Object]`.\n\t// Runs (sync, ahead of the list's own watcher) again whenever the type switches.\n\tfunction registerTarget() {\n\t\tconst { register, schema, type } = resolvedTarget.value\n\t\tif (typeof objectStore.registerObjectType === 'function') {\n\t\t\tobjectStore.registerObjectType(type, schema, register, { registerSlug: register, schemaSlug: schema })\n\t\t}\n\t}\n\tregisterTarget()\n\twatch(objectType, registerTarget, { flush: 'sync' })\n\n\t// Seed the visible-column set from the configured columns so the sidebar's\n\t// Columns tab reflects the curated default; null when none are configured\n\t// (schema-driven table — every column starts visible).\n\tconst configuredColumnKeys = (props.columns || [])\n\t\t.map((c) => (typeof c === 'string' ? c : c && c.key))\n\t\t.filter(Boolean)\n\n\t// Restore a persisted multi-column sort from the route query first (deep\n\t// link / reload); fall back to a host-passed `sortKeys` prop, then the\n\t// legacy single-key `sortKey`/`sortOrder` props.\n\tconst initialRoute = instance && instance.proxy && instance.proxy.$route\n\tconst initialSortKeys = parseSortKeysFromQuery(initialRoute)\n\t\t|| (Array.isArray(props.sortKeys) && props.sortKeys.length > 0 ? props.sortKeys : undefined)\n\t// Same deep-link restore for facet filters and search, so opening a\n\t// shared/bookmarked URL reproduces the same view (CnIndexPage persists\n\t// both back to the route on change).\n\tconst initialActiveFilters = resolveQueryFilters(initialRoute && initialRoute.query, tokenCtx())\n\tconst initialSearchTerm = (initialRoute && typeof initialRoute.query?._search === 'string') ? initialRoute.query._search : ''\n\n\t// Set right after useListView returns; the fixed-filters getter reads it lazily.\n\tlet listHandle = null\n\tconst list = useListView(() => objectType.value, {\n\t\tobjectStore,\n\t\tsidebarState,\n\t\tdefaultSort: props.sortKey ? { key: props.sortKey, order: props.sortOrder || 'asc' } : undefined,\n\t\tdefaultSortKeys: initialSortKeys,\n\t\tdefaultActiveFilters: initialActiveFilters,\n\t\tdefaultSearchTerm: initialSearchTerm,\n\t\tdefaultPageSize: (props.pagination && props.pagination.limit) || undefined,\n\t\tdefaultVisibleColumns: configuredColumnKeys.length ? configuredColumnKeys : null,\n\t\t// `pages[].config.extend` → OpenRegister's repeated `_extend[]`. A\n\t\t// getter so a reactive change re-scopes the next fetch, matching how\n\t\t// `fixedFilters` is read.\n\t\textend: () => (Array.isArray(props.extend) ? props.extend : []),\n\t\tfixedFilters: () => {\n\t\t\tconst route = instance && instance.proxy && instance.proxy.$route\n\t\t\tconst params = (route && route.params) || {}\n\t\t\tconst ctx = tokenCtx()\n\t\t\tconst queryFilters = resolveQueryFilters(route && route.query, ctx)\n\t\t\tconst base = resolveFilterMap(props.filter, params, ctx)\n\t\t\t// A folder-sidebar scope declaring `searchFields` narrows what the\n\t\t\t// search box searches over while that scope is active. Read off the\n\t\t\t// instance, like `$route` above, because the active scope is the\n\t\t\t// component's own state rather than a prop — and read through the\n\t\t\t// one fixed-filter getter rather than a second search path.\n\t\t\tconst scopeSearchFields = (instance && instance.proxy && instance.proxy.activeScopeSearchFields) || []\n\t\t\tconst scopeBase = scopeSearchFields.length > 0 ? { _searchFields: scopeSearchFields } : {}\n\t\t\t// File-content search widens a text search, so it rides only with a term.\n\t\t\tconst widen = props.searchInFiles === true && contentSearch.value && !!(listHandle && listHandle.searchTerm.value)\n\t\t\t// The visible calendar month, only while the page is in calendar mode.\n\t\t\tconst month = (instance && instance.proxy && instance.proxy.calendarRangeFilter) || {}\n\t\t\tconst scope = { ...(widen ? { ...scopeBase, _content_search: 'true' } : scopeBase), ...month }\n\t\t\tconst lensed = withPersonalLenses(props.quickFilters, props.personalLenses)\n\t\t\tconst tabs = Array.isArray(lensed) ? lensed : null\n\t\t\tif (!tabs) {\n\t\t\t\treturn { ...queryFilters, ...scope, ...base }\n\t\t\t}\n\n\t\t\t// Multiple mode: OR the selected tabs' filters together (union).\n\t\t\tif (isMultiQuickFilter) {\n\t\t\t\tconst maps = selectedQuickFilterIndices.value\n\t\t\t\t\t.map((i) => resolveFilterMap(tabs[i]?.filter, params, ctx))\n\t\t\t\treturn { ...queryFilters, ...scope, ...base, ...unionFilterMaps(maps) }\n\t\t\t}\n\n\t\t\t// Single mode: the active tab's filter spread last so it wins\n\t\t\t// over a colliding props.filter entry.\n\t\t\tconst activeIdx = activeQuickFilterIndex.value\n\t\t\tconst tabFilter = (activeIdx !== null && activeIdx !== undefined) ? tabs[activeIdx]?.filter : null\n\t\t\treturn { ...queryFilters, ...scope, ...base, ...resolveFilterMap(tabFilter, params, ctx) }\n\t\t},\n\t})\n\n\tlistHandle = list\n\n\t// Re-fetch when the quick-filter selection changes (pre-existing), OR\n\t// when the workspace/app-config bag content changes (e.g. the\n\t// administration switcher writes a new `activeAdministrationId`) — a\n\t// `@workspace.<key>`/`@config.<key>` token in `props.filter` must re-scope\n\t// the list without a manual reload. A change to `props.filter` itself (a\n\t// host toggling a filter checkbox) re-fetches the same way.\n\tconst filterSignature = computed(() => JSON.stringify(props.filter ?? null))\n\twatch([activeQuickFilterIndex, selectedQuickFilterIndices, contentSearch, workspaceSignature, appConfigSignature, filterSignature], () => {\n\t\tif (list && typeof list.refresh === 'function') {\n\t\t\tlist.refresh(1)\n\t\t}\n\t})\n\n\t// Live collection updates (manifest-live-updates): subscribe to the\n\t// page's `or-collection-{register}-{schema}` scope so another user's\n\t// create/update/delete refreshes this list without a manual reload.\n\t// The subscription lifecycle (mount/unmount, in-flight dedupe, epoch\n\t// guard against stale async resolution) lives in useObjectSubscription;\n\t// the refetch-on-event (with the last fetch params, burst-coalesced)\n\t// lives in liveUpdatesPlugin. The `subscribe` prop (default true; from\n\t// a manifest: `config.subscribe: false`) is the opt-out, read through\n\t// a reactive getter so a runtime flip attaches/detaches accordingly.\n\t// Stores without live-updates support (no `subscribe` action) are a\n\t// silent no-op inside the composable, keeping this fully inert.\n\tuseObjectSubscription(objectStore, () => objectType.value, null, {\n\t\tenabled: () => props.subscribe !== false,\n\t})\n\n\treturn {\n\t\tisSelfFetch: true,\n\t\tlist,\n\t\tselfObjectStore: objectStore,\n\t\tselfObjectType: objectType,\n\t\tactiveQuickFilterIndex,\n\t\tselectedQuickFilterIndices,\n\t\tcontentSearch,\n\t\t// The page persists the view state back into the query, and needs both\n\t\t// to do it without trampling the rest of it: the keys it adopted from\n\t\t// the query on load (the only non-`_` ones it may clear), and the ctx\n\t\t// those keys' `@`-tokens resolve against.\n\t\tselfFetchTokenCtx: tokenCtx,\n\t\tinitialQueryFilterKeys: Object.keys(initialActiveFilters),\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSelfFetchList.js","sources":["../../../../src/components/CnIndexPage/useSelfFetchList.js"],"sourcesContent":["import { computed, ref, watch } from 'vue'\nimport { useListView } from '../../composables/index.js'\nimport { useObjectSubscription } from '../../composables/useObjectSubscription.js'\nimport { useObjectStore } from '../../store/index.js'\n// Both filter resolvers live in `utils/routeFilters.js` so CnLogsPage applies\n// the same two grammars (route-param interpolation + `?key=value` deep links)\n// without pulling in this composable's index-only sidebar/subscription wiring.\nimport { withPersonalLenses } from '../../utils/personalLenses.js'\nimport { parseSortKeysFromQuery, resolveFilterMap, resolveQueryFilters } from '../../utils/routeFilters.js'\n\nfunction resolveInitialQuickFilterIndex(quickFilters) {\n\tconst tabs = Array.isArray(quickFilters) ? quickFilters : null\n\tif (!tabs || tabs.length === 0) {\n\t\treturn null\n\t}\n\tconst di = tabs.findIndex((t) => t && t.default === true)\n\treturn di >= 0 ? di : 0\n}\n\n/**\n * OR-merge several quick-filter maps into one fetch filter. Values for the\n * same key collapse to an array (deduped) when more than one tab contributes\n * it — `buildQueryString` serialises an array as `key[]=a&key[]=b`, which the\n * OpenRegister API interprets as an IN / OR match.\n *\n * @param {Array<object>} filterMaps Already route-resolved filter maps.\n * @return {object} The merged filter (scalar when a key has one value, array when many).\n */\nfunction unionFilterMaps(filterMaps) {\n\tconst grouped = {}\n\tfor (const map of filterMaps) {\n\t\tif (!map || typeof map !== 'object') {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const [k, v] of Object.entries(map)) {\n\t\t\tif (v === undefined || v === null || v === '') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!grouped[k]) {\n\t\t\t\tgrouped[k] = []\n\t\t\t}\n\t\t\tfor (const item of (Array.isArray(v) ? v : [v])) {\n\t\t\t\tif (!grouped[k].includes(item)) {\n\t\t\t\t\tgrouped[k].push(item)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tconst out = {}\n\tfor (const [k, arr] of Object.entries(grouped)) {\n\t\tout[k] = arr.length === 1 ? arr[0] : arr\n\t}\n\treturn out\n}\n\n/**\n * Self-fetch mode for CnIndexPage: when register+schema are set but no\n * `objects` prop was passed (manifest-driven pages), drive the list ourselves.\n *\n * @param {object} props CnIndexPage props.\n * @param {import('vue').ComponentInternalInstance|null} instance Pass `getCurrentInstance()`.\n * @param {typeof import('vue').inject} inject Pass Vue's `inject`.\n * @param {{activeFolderSchema?: import('vue').Ref<?{schema: string, register?: string}>}} [extras] `activeFolderSchema`: a ref the page sets to the selected folder's `{ schema, register? }`, switching the loaded object type while it is non-null.\n * @return {object} { isSelfFetch, list, selfObjectStore, selfObjectType, activeQuickFilterIndex }\n */\nexport function useSelfFetchList(props, instance, inject, extras = {}) {\n\tconst objectsProvided = !!(\n\t\tinstance && instance.proxy && instance.proxy.$options && instance.proxy.$options.propsData\n\t\t&& Object.hasOwn(instance.proxy.$options.propsData, 'objects')\n\t)\n\t// A named source wins over register/schema. Without this the page would\n\t// fire an OpenRegister request whose rows it then discards in favour of the\n\t// source's — wasted, but worse than wasted if the manifest names both by\n\t// mistake, because the request succeeds and nothing says the two disagree.\n\tconst isSelfFetch = !!(props.register && props.schema) && !objectsProvided && !props.entitySource\n\n\t// \"Also search inside files\" switch, seeded from `?contentSearch=1` so a\n\t// shared link reproduces the list. Only meaningful when `searchInFiles` is on.\n\tconst routeAtSetup = instance && instance.proxy && instance.proxy.$route\n\tconst contentSearch = ref(props.searchInFiles === true && String(routeAtSetup?.query?.contentSearch) === '1')\n\n\tconst activeQuickFilterIndex = ref(resolveInitialQuickFilterIndex(withPersonalLenses(props.quickFilters, props.personalLenses)))\n\tconst selectedQuickFilterIndices = ref([])\n\tconst isMultiQuickFilter = props.quickFilterMultiple === true\n\n\tif (!isSelfFetch) {\n\t\treturn {\n\t\t\tisSelfFetch: false,\n\t\t\tlist: null,\n\t\t\tselfObjectStore: null,\n\t\t\tselfObjectType: '',\n\t\t\tactiveQuickFilterIndex,\n\t\t\tselectedQuickFilterIndices,\n\t\t\tcontentSearch,\n\t\t\tselfFetchTokenCtx: null,\n\t\t\tinitialQueryFilterKeys: [],\n\t\t}\n\t}\n\n\t// The object type follows the selected folder's own schema when it declares\n\t// one; otherwise the page's register and schema.\n\tconst activeFolderSchema = extras.activeFolderSchema || null\n\tconst resolvedTarget = computed(() => {\n\t\tconst folder = activeFolderSchema && activeFolderSchema.value\n\t\tif (folder && folder.schema) {\n\t\t\tconst register = folder.register || props.register\n\t\t\treturn { register, schema: folder.schema, type: `${register}-${folder.schema}` }\n\t\t}\n\t\t// A collection endpoint gets its own type key, so a plain registration of\n\t\t// the same pair elsewhere never resets it.\n\t\tconst collectionUrl = props.collectionUrl || ''\n\t\tconst type = `${props.register}-${props.schema}` + (collectionUrl ? `@${collectionUrl}` : '')\n\t\treturn { register: props.register, schema: props.schema, type, collectionUrl }\n\t})\n\tconst objectType = computed(() => resolvedTarget.value.type)\n\tconst sidebarState = inject('sidebarState', null) ?? inject('objectSidebarState', null)\n\tconst objectStore = useObjectStore()\n\n\t// Token-resolution context for `@workspace.<key>` / `@config.<key>` /\n\t// `@objectId` / `@object.<field>` inside `props.filter` / quick-filter\n\t// tab filters. Same injects + unwrap shape as CnObjectListWidget's\n\t// `objectCtx`/`workspaceCtx`/`tokenCtx` computeds (and CnDeltaWidget) —\n\t// `cnWorkspaceContext` is the reactive bag a dashboard/workspace-root\n\t// (e.g. hrmq's App.vue for multi-administratie) provides; `cnObjectContext`\n\t// is a detail-page's object context (rare on an index page, but harmless\n\t// to support); `cnAppConfig` is the page-level app config bag. All three\n\t// default to null/absent so an app that never provides them is unaffected.\n\tconst objectCtxRaw = inject('cnObjectContext', null)\n\tconst workspaceCtxRaw = inject('cnWorkspaceContext', null)\n\tconst appConfigRaw = inject('cnAppConfig', null)\n\tconst unwrapCtx = (v) => ((v && typeof v === 'object' && 'value' in v) ? v.value : v)\n\n\t/**\n\t * Build the current token-resolution ctx `{ objectId?, object?, workspace, config }`\n\t * from the injected bags, unwrapping Vue refs. Called fresh on every fetch\n\t * so it always reflects the latest workspace/config state.\n\t *\n\t * @return {object} The token ctx.\n\t */\n\tfunction tokenCtx() {\n\t\tconst objCtx = unwrapCtx(objectCtxRaw)\n\t\tconst base = (objCtx && typeof objCtx === 'object') ? { ...objCtx } : {}\n\t\tbase.workspace = unwrapCtx(workspaceCtxRaw) || {}\n\t\tbase.config = unwrapCtx(appConfigRaw) || {}\n\t\treturn base\n\t}\n\n\t// Reactive signature of the workspace/config bags so a change (e.g. the\n\t// administration switcher writing `activeAdministrationId`) triggers a\n\t// re-fetch below — `fixedFilters` is a plain getter called at fetch time\n\t// (see useListView.resolveFixedFilters), it is NOT auto-tracked by Vue,\n\t// so without this the list would resolve the token once on mount and\n\t// never again. Stringified (like CnDeltaWidget's `sourceKey`) so the\n\t// watcher fires on real content changes only, not object identity.\n\tconst workspaceSignature = computed(() => JSON.stringify(unwrapCtx(workspaceCtxRaw) || {}))\n\tconst appConfigSignature = computed(() => JSON.stringify(unwrapCtx(appConfigRaw) || {}))\n\n\t// Pass register/schema in their positional id slots (not as a {register, schema} object as\n\t// second arg) — that previously made fetch URLs go to `/api/objects/undefined/[object Object]`.\n\t// Runs (sync, ahead of the list's own watcher) again whenever the type switches.\n\tfunction registerTarget() {\n\t\tconst { register, schema, type, collectionUrl } = resolvedTarget.value\n\t\tif (typeof objectStore.registerObjectType === 'function') {\n\t\t\tobjectStore.registerObjectType(type, schema, register, {\n\t\t\t\tregisterSlug: register,\n\t\t\t\tschemaSlug: schema,\n\t\t\t\t...(collectionUrl ? { collectionUrl } : {}),\n\t\t\t})\n\t\t}\n\t\t// A mixed list tells its own rows apart by `@self.register`, an id, so a slug register needs resolving.\n\t\tif (collectionUrl && !/^\\d+$/.test(String(register)) && typeof objectStore.fetchRegister === 'function') {\n\t\t\tobjectStore.fetchRegister(type)\n\t\t}\n\t}\n\tregisterTarget()\n\twatch(objectType, registerTarget, { flush: 'sync' })\n\n\t// Seed the visible-column set from the configured columns so the sidebar's\n\t// Columns tab reflects the curated default; null when none are configured\n\t// (schema-driven table — every column starts visible).\n\tconst configuredColumnKeys = (props.columns || [])\n\t\t.map((c) => (typeof c === 'string' ? c : c && c.key))\n\t\t.filter(Boolean)\n\n\t// Restore a persisted multi-column sort from the route query first (deep\n\t// link / reload); fall back to a host-passed `sortKeys` prop, then the\n\t// legacy single-key `sortKey`/`sortOrder` props.\n\tconst initialRoute = instance && instance.proxy && instance.proxy.$route\n\tconst initialSortKeys = parseSortKeysFromQuery(initialRoute)\n\t\t|| (Array.isArray(props.sortKeys) && props.sortKeys.length > 0 ? props.sortKeys : undefined)\n\t// Same deep-link restore for facet filters and search, so opening a\n\t// shared/bookmarked URL reproduces the same view (CnIndexPage persists\n\t// both back to the route on change).\n\tconst initialActiveFilters = resolveQueryFilters(initialRoute && initialRoute.query, tokenCtx())\n\tconst initialSearchTerm = (initialRoute && typeof initialRoute.query?._search === 'string') ? initialRoute.query._search : ''\n\n\t// Set right after useListView returns; the fixed-filters getter reads it lazily.\n\tlet listHandle = null\n\tconst list = useListView(() => objectType.value, {\n\t\tobjectStore,\n\t\tsidebarState,\n\t\tdefaultSort: props.sortKey ? { key: props.sortKey, order: props.sortOrder || 'asc' } : undefined,\n\t\tdefaultSortKeys: initialSortKeys,\n\t\tdefaultActiveFilters: initialActiveFilters,\n\t\tdefaultSearchTerm: initialSearchTerm,\n\t\tdefaultPageSize: (props.pagination && props.pagination.limit) || undefined,\n\t\tdefaultVisibleColumns: configuredColumnKeys.length ? configuredColumnKeys : null,\n\t\t// `pages[].config.extend` → OpenRegister's repeated `_extend[]`. A\n\t\t// getter so a reactive change re-scopes the next fetch, matching how\n\t\t// `fixedFilters` is read.\n\t\textend: () => (Array.isArray(props.extend) ? props.extend : []),\n\t\tfixedFilters: () => {\n\t\t\tconst route = instance && instance.proxy && instance.proxy.$route\n\t\t\tconst params = (route && route.params) || {}\n\t\t\tconst ctx = tokenCtx()\n\t\t\tconst queryFilters = resolveQueryFilters(route && route.query, ctx)\n\t\t\tconst base = resolveFilterMap(props.filter, params, ctx)\n\t\t\t// A folder-sidebar scope declaring `searchFields` narrows what the\n\t\t\t// search box searches over while that scope is active. Read off the\n\t\t\t// instance, like `$route` above, because the active scope is the\n\t\t\t// component's own state rather than a prop — and read through the\n\t\t\t// one fixed-filter getter rather than a second search path.\n\t\t\tconst scopeSearchFields = (instance && instance.proxy && instance.proxy.activeScopeSearchFields) || []\n\t\t\tconst scopeBase = scopeSearchFields.length > 0 ? { _searchFields: scopeSearchFields } : {}\n\t\t\t// File-content search widens a text search, so it rides only with a term.\n\t\t\tconst widen = props.searchInFiles === true && contentSearch.value && !!(listHandle && listHandle.searchTerm.value)\n\t\t\t// The visible calendar month, only while the page is in calendar mode.\n\t\t\tconst month = (instance && instance.proxy && instance.proxy.calendarRangeFilter) || {}\n\t\t\tconst scope = { ...(widen ? { ...scopeBase, _content_search: 'true' } : scopeBase), ...month }\n\t\t\tconst lensed = withPersonalLenses(props.quickFilters, props.personalLenses)\n\t\t\tconst tabs = Array.isArray(lensed) ? lensed : null\n\t\t\tif (!tabs) {\n\t\t\t\treturn { ...queryFilters, ...scope, ...base }\n\t\t\t}\n\n\t\t\t// Multiple mode: OR the selected tabs' filters together (union).\n\t\t\tif (isMultiQuickFilter) {\n\t\t\t\tconst maps = selectedQuickFilterIndices.value\n\t\t\t\t\t.map((i) => resolveFilterMap(tabs[i]?.filter, params, ctx))\n\t\t\t\treturn { ...queryFilters, ...scope, ...base, ...unionFilterMaps(maps) }\n\t\t\t}\n\n\t\t\t// Single mode: the active tab's filter spread last so it wins\n\t\t\t// over a colliding props.filter entry.\n\t\t\tconst activeIdx = activeQuickFilterIndex.value\n\t\t\tconst tabFilter = (activeIdx !== null && activeIdx !== undefined) ? tabs[activeIdx]?.filter : null\n\t\t\treturn { ...queryFilters, ...scope, ...base, ...resolveFilterMap(tabFilter, params, ctx) }\n\t\t},\n\t})\n\n\tlistHandle = list\n\n\t// Re-fetch when the quick-filter selection changes (pre-existing), OR\n\t// when the workspace/app-config bag content changes (e.g. the\n\t// administration switcher writes a new `activeAdministrationId`) — a\n\t// `@workspace.<key>`/`@config.<key>` token in `props.filter` must re-scope\n\t// the list without a manual reload. A change to `props.filter` itself (a\n\t// host toggling a filter checkbox) re-fetches the same way.\n\tconst filterSignature = computed(() => JSON.stringify(props.filter ?? null))\n\twatch([activeQuickFilterIndex, selectedQuickFilterIndices, contentSearch, workspaceSignature, appConfigSignature, filterSignature], () => {\n\t\tif (list && typeof list.refresh === 'function') {\n\t\t\tlist.refresh(1)\n\t\t}\n\t})\n\n\t// Live collection updates (manifest-live-updates): subscribe to the\n\t// page's `or-collection-{register}-{schema}` scope so another user's\n\t// create/update/delete refreshes this list without a manual reload.\n\t// The subscription lifecycle (mount/unmount, in-flight dedupe, epoch\n\t// guard against stale async resolution) lives in useObjectSubscription;\n\t// the refetch-on-event (with the last fetch params, burst-coalesced)\n\t// lives in liveUpdatesPlugin. The `subscribe` prop (default true; from\n\t// a manifest: `config.subscribe: false`) is the opt-out, read through\n\t// a reactive getter so a runtime flip attaches/detaches accordingly.\n\t// Stores without live-updates support (no `subscribe` action) are a\n\t// silent no-op inside the composable, keeping this fully inert.\n\tuseObjectSubscription(objectStore, () => objectType.value, null, {\n\t\tenabled: () => props.subscribe !== false,\n\t})\n\n\treturn {\n\t\tisSelfFetch: true,\n\t\tlist,\n\t\tselfObjectStore: objectStore,\n\t\tselfObjectType: objectType,\n\t\tactiveQuickFilterIndex,\n\t\tselectedQuickFilterIndices,\n\t\tcontentSearch,\n\t\t// The page persists the view state back into the query, and needs both\n\t\t// to do it without trampling the rest of it: the keys it adopted from\n\t\t// the query on load (the only non-`_` ones it may clear), and the ctx\n\t\t// those keys' `@`-tokens resolve against.\n\t\tselfFetchTokenCtx: tokenCtx,\n\t\tinitialQueryFilterKeys: Object.keys(initialActiveFilters),\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@ import __sfc_main$1 from '../CnIcon/CnIcon.vue.js';
9
9
  import __sfc_main$2 from '../CnLockIndicator/CnLockIndicator.vue.js';
10
10
  import __sfc_main$3 from '../CnStatusBadge/CnStatusBadge.vue.js';
11
11
 
12
+ const ACCENT_VARIANTS = ['success', 'warning', 'error', 'info', 'primary'];
13
+
12
14
  /**
13
15
  * CnObjectCard — Schema-configuration-driven card for object display.
14
16
  *
@@ -125,6 +127,20 @@ var script = {
125
127
  default: null,
126
128
  },
127
129
 
130
+ /**
131
+ * A status accent: a colored border at the start of the card and,
132
+ * with `icon`, a colored icon before the title. `variant` is one of
133
+ * `success`, `warning`, `error`, `info` or `primary`; `icon` is a
134
+ * name registered with CnIcon; `label` names the status for screen
135
+ * readers and as the icon's tooltip.
136
+ *
137
+ * @type {{variant: string, icon?: string, label?: string}}
138
+ */
139
+ accent: {
140
+ type: Object,
141
+ default: null,
142
+ },
143
+
128
144
  /**
129
145
  * The property keys the facts list shows, in order (manifest key
130
146
  * `config.cardFields`). Without it the card shows the first
@@ -188,6 +204,16 @@ var script = {
188
204
  return null
189
205
  },
190
206
 
207
+ /**
208
+ * The accent variant when it is a known one, else ''.
209
+ *
210
+ * @return {string}
211
+ */
212
+ accentVariant() {
213
+ const variant = this.accent?.variant;
214
+ return ACCENT_VARIANTS.includes(variant) ? variant : ''
215
+ },
216
+
191
217
  config() {
192
218
  return this.schema?.configuration || {}
193
219
  },