@conduction/nextcloud-vue 2.96.0 → 2.98.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 (163) hide show
  1. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +17 -0
  2. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  4. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  5. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +33 -1
  6. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  7. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +383 -359
  8. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  9. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  10. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +106 -2
  11. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  12. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  13. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +9 -0
  14. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js.map +1 -0
  15. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js +964 -0
  16. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -0
  17. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js +282 -0
  18. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -0
  19. package/dist/esm/components/CnChecklistRunWidget/index.js +28 -0
  20. package/dist/esm/components/CnChecklistRunWidget/index.js.map +1 -0
  21. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +1 -1
  22. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +17 -3
  23. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -1
  24. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +61 -43
  25. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -1
  26. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +1 -1
  27. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +159 -18
  28. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
  29. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +9 -7
  30. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  32. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +1 -0
  33. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  34. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  35. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +26 -8
  36. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  37. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  38. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +188 -5
  39. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  40. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  41. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  42. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +48 -3
  43. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  44. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +46 -12
  45. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  46. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue.js +1 -1
  47. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js +3 -3
  48. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  49. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  50. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js +1 -1
  51. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js +27 -0
  52. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js.map +1 -1
  53. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js +16 -2
  54. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js.map +1 -1
  55. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  56. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +144 -0
  57. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  58. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +488 -399
  59. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  60. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +8 -2
  61. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
  62. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +344 -21
  63. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  64. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +29 -7
  65. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  66. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +1 -1
  67. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +2 -2
  68. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -1
  69. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +2 -2
  70. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -1
  71. package/dist/esm/components/CnIndexPage/useNamedSource.js +1 -1
  72. package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
  73. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  74. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +13 -0
  75. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  76. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +5 -1
  77. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  78. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js +9 -0
  79. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js.map +1 -0
  80. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js +220 -0
  81. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js.map +1 -0
  82. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js +121 -0
  83. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js.map +1 -0
  84. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js +1 -1
  85. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js +83 -9
  86. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js.map +1 -1
  87. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js +80 -11
  88. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js.map +1 -1
  89. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  90. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  91. package/dist/esm/composables/indexSources.js +420 -5
  92. package/dist/esm/composables/indexSources.js.map +1 -1
  93. package/dist/esm/composables/useOrganisationStore.js +115 -0
  94. package/dist/esm/composables/useOrganisationStore.js.map +1 -0
  95. package/dist/esm/index.js +2 -0
  96. package/dist/esm/index.js.map +1 -1
  97. package/dist/esm/l10n/en.json.js +21 -1
  98. package/dist/esm/l10n/en.json.js.map +1 -1
  99. package/dist/esm/l10n/nl.json.js +36 -1
  100. package/dist/esm/l10n/nl.json.js.map +1 -1
  101. package/dist/esm/library-style.js +1 -1
  102. package/dist/esm/nextcloud-vue.css +725 -383
  103. package/dist/esm/utils/builtInFormatters.js +34 -1
  104. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  105. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  106. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  107. package/dist/esm/utils/matrixCells.js +158 -0
  108. package/dist/esm/utils/matrixCells.js.map +1 -0
  109. package/dist/esm/utils/nextcloudDirectory.js +121 -0
  110. package/dist/esm/utils/nextcloudDirectory.js.map +1 -0
  111. package/dist/esm/utils/queryPresets.js +13 -2
  112. package/dist/esm/utils/queryPresets.js.map +1 -1
  113. package/dist/esm/utils/scopeListLayout.js +37 -1
  114. package/dist/esm/utils/scopeListLayout.js.map +1 -1
  115. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  116. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  117. package/dist/nextcloud-vue.cjs.js +14443 -10519
  118. package/dist/nextcloud-vue.cjs.js.map +2 -2
  119. package/dist/nextcloud-vue.css +725 -383
  120. package/l10n/en.json +21 -1
  121. package/l10n/nl.json +36 -1
  122. package/package.json +2 -2
  123. package/scripts/merge-l10n.js +196 -0
  124. package/src/components/CnAppRoot/CnAppRoot.md +1 -0
  125. package/src/components/CnAppRoot/CnAppRoot.vue +17 -0
  126. package/src/components/CnCellRenderer/CnCellRenderer.vue +57 -1
  127. package/src/components/CnChartWidget/CnChartWidget.md +2 -1
  128. package/src/components/CnChartWidget/CnChartWidget.vue +106 -2
  129. package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +1269 -0
  130. package/src/components/CnChecklistRunWidget/index.js +27 -0
  131. package/src/components/CnConversationThread/CnConversationThread.md +12 -0
  132. package/src/components/CnConversationThread/CnConversationThread.vue +30 -4
  133. package/src/components/CnConversationThread/CnConversationWidget.vue +167 -24
  134. package/src/components/CnDashboardPage/CnDashboardPage.vue +1 -0
  135. package/src/components/CnDataTable/CnDataTable.vue +26 -8
  136. package/src/components/CnDetailPage/CnDetailPage.md +48 -0
  137. package/src/components/CnDetailPage/CnDetailPage.vue +188 -5
  138. package/src/components/CnFactsWidget/CnFactsWidget.vue +114 -3
  139. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +3 -3
  140. package/src/components/CnFeaturesBoard/CnFeaturesBoard.vue +38 -2
  141. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +508 -236
  142. package/src/components/CnFilesBrowser/filesBrowserColumns.js +8 -2
  143. package/src/components/CnIndexPage/CnIndexPage.md +28 -0
  144. package/src/components/CnIndexPage/CnIndexPage.vue +367 -27
  145. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +13 -4
  146. package/src/components/CnIndexPage/useNamedSource.js +1 -1
  147. package/src/components/CnObjectSidebar/CnFilesTab.vue +17 -0
  148. package/src/components/CnOrderedListField/CnOrderedListField.vue +386 -0
  149. package/src/components/CnOrderedListField/index.js +7 -0
  150. package/src/components/CnUserSettingsDialog/CnUserSettingsDialog.vue +139 -10
  151. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  152. package/src/components/index.js +2 -0
  153. package/src/composables/indexSources.js +419 -4
  154. package/src/composables/useOrganisationStore.js +111 -0
  155. package/src/index.js +2 -0
  156. package/src/schemas/app-manifest-v2.schema.json +42 -5
  157. package/src/utils/builtInFormatters.js +33 -0
  158. package/src/utils/libraryWidgetKeys.js +1 -0
  159. package/src/utils/matrixCells.js +154 -0
  160. package/src/utils/nextcloudDirectory.js +117 -0
  161. package/src/utils/queryPresets.js +13 -2
  162. package/src/utils/scopeListLayout.js +37 -1
  163. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"indexSources.js","sources":["../../../src/composables/indexSources.js"],"sourcesContent":["/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n */\n\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { reactive } from 'vue'\nimport CalendarClock from 'vue-material-design-icons/CalendarClock.vue'\nimport HandBackRight from 'vue-material-design-icons/HandBackRight.vue'\nimport LightningBolt from 'vue-material-design-icons/LightningBolt.vue'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport { formatRelativeDate } from '../utils/boardDate.js'\nimport { FLOW_RUN_ERROR_STATUSES, flowRunStatuses } from '../utils/flowRunStatus.js'\nimport { useFlowStore } from './useFlowStore.js'\nimport { useTaskInboxStore } from './useTaskInboxStore.js'\n\n/**\n * NAMED INDEX SOURCES.\n *\n * `CnIndexPage` has always had two modes: fetch OpenRegister objects itself\n * from `register` + `schema`, or render rows handed in as `:objects`. That\n * second mode is why bespoke list pages exist at all — anything that is not an\n * OpenRegister object needed its own page component whose only real job was to\n * load rows from somewhere else and pass them down.\n *\n * A flow is the clearest case: flow definitions are deliberately NOT stored as\n * OpenRegister objects, so `type: \"index\"` had nothing to point at, and every\n * app that wanted a flow list shipped a custom page instead.\n *\n * This registry is the third mode. A manifest names an entity source, and the index\n * page loads it — no component, no `type: \"custom\"`.\n *\n * { \"type\": \"index\", \"config\": { \"entitySource\": \"flows\", \"app\": \"dossiq\" } }\n *\n * Each entry supplies the parts an index cannot infer: how to load, where the\n * rows live, and sensible columns and row actions so a manifest does not have\n * to restate them. A manifest that DOES set `columns` still wins — the source\n * only fills in what was left out.\n *\n * WHY A REGISTRY RATHER THAN A BRANCH. `logs`, the AVG register and the other\n * non-object lists are the same shape, and each one added as an `if` in the\n * index page is another reason the page cannot be reasoned about. Adding a\n * source here is a data change; adding one to the page is a behaviour change.\n */\n\n/**\n * Monday 00:00 of the current week, local time, as ISO 8601.\n *\n * \"This week\" on a flow list is the calendar week a person plans in, not a\n * rolling seven days: on a Monday morning it reads as a fresh count.\n *\n * @param {Date} [now] The reference moment.\n * @return {string} The start of the week.\n */\nexport function startOfWeek(now = new Date()) {\n\tconst start = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n\tconst offset = (start.getDay() + 6) % 7\n\tstart.setDate(start.getDate() - offset)\n\treturn start.toISOString()\n}\n\n/**\n * How a flow starts, as a label, a muted second line and an icon.\n *\n * `trigger` is a catalogue event id, `schedule` (with `cron`) or `manual`.\n * An event id reads as its catalogue label when the catalogue knows it,\n * else as the id, so a trigger the catalogue has not loaded yet still says\n * something true.\n *\n * @param {object} flow The flow row.\n * @param {Array<object>} catalog The event catalogue (`{id, label}`).\n * @return {{label: string, detail: string, icon: object}} The trigger cell.\n */\nexport function flowTriggerCell(flow, catalog = []) {\n\tconst trigger = String(flow?.trigger || '')\n\tif (trigger === 'schedule') {\n\t\treturn { label: t('nextcloud-vue', 'On a schedule'), detail: String(flow?.cron || ''), icon: CalendarClock }\n\t}\n\tif (trigger === '' || trigger === 'manual') {\n\t\treturn { label: t('nextcloud-vue', 'Run by hand'), detail: '', icon: HandBackRight }\n\t}\n\tconst entry = (catalog || []).find((item) => item && item.id === trigger)\n\treturn {\n\t\tlabel: (entry && entry.label) || trigger,\n\t\tdetail: String(flow?.triggerSchema || ''),\n\t\ticon: LightningBolt,\n\t}\n}\n\n/**\n * The flow source: OpenRegister's one native flow store.\n *\n * Rows carry the run figures a flow list shows beside each flow (how its\n * last run ended, how often it ran this week), read in one request from\n * the run summary rather than derived from a page of runs.\n *\n * The quick filters (All, Active, Paused, With errors) narrow the loaded\n * list in place: every flow of the app is already loaded, so the counts on\n * the tabs and the rows they show can never disagree.\n *\n * @return {object} The source adapter.\n */\nfunction flowsSource() {\n\tconst store = useFlowStore()\n\tconst view = reactive({ state: 'all', runsRoute: '/flow-runs', flowsRoute: '/flows' })\n\tconst statuses = flowRunStatuses()\n\n\t/**\n\t * Every flow row with its display fields, before any tab narrows it.\n\t *\n\t * @return {Array<object>} The rows.\n\t */\n\tconst allRows = () => (store.flows || []).map((flow) => {\n\t\tconst id = flow.id || flow.uuid\n\t\tconst summary = (store.runSummary || {})[id] || {}\n\t\tconst lastRun = summary.lastRun || null\n\t\tconst lastStatus = lastRun ? statuses[lastRun.status] : null\n\t\tconst trigger = flowTriggerCell(flow, store.eventCatalog)\n\t\treturn {\n\t\t\t...flow,\n\t\t\ttriggerLabel: trigger.label,\n\t\t\ttriggerDetail: trigger.detail,\n\t\t\ttriggerIcon: trigger.icon,\n\t\t\tlastRunStatus: lastRun ? lastRun.status : '',\n\t\t\tlastRunLabel: lastRun\n\t\t\t\t? ((lastStatus && lastStatus.label) || String(lastRun.status || ''))\n\t\t\t\t: t('nextcloud-vue', 'Not run yet'),\n\t\t\tlastRunAt: lastRun ? formatRelativeDate(lastRun.created, { withTime: true }) : '',\n\t\t\tlastRunFailed: !!lastRun && FLOW_RUN_ERROR_STATUSES.includes(lastRun.status),\n\t\t\trunsThisWeek: Number(summary.runsSince) || 0,\n\t\t\t// The switch reads `enabled`; the label is what a screen reader and\n\t\t\t// an export see. A flow with no owner is enabled but cannot start,\n\t\t\t// because a trigger has no acting user to run as.\n\t\t\tstatusLabel: flow.enabled === false\n\t\t\t\t? t('nextcloud-vue', 'Paused')\n\t\t\t\t: (flow.owner ? t('nextcloud-vue', 'Active') : t('nextcloud-vue', 'No owner')),\n\t\t}\n\t})\n\n\tconst lastRunColors = {}\n\tObject.values(statuses).forEach((entry) => {\n\t\tlastRunColors[entry.label] = entry.variant\n\t})\n\n\tconst filters = {\n\t\tall: () => true,\n\t\tactive: (row) => row.enabled !== false,\n\t\tpaused: (row) => row.enabled === false,\n\t\terrors: (row) => row.lastRunFailed,\n\t}\n\n\treturn {\n\t\tstore,\n\n\t\t/**\n\t\t * Load the flows for the scoped app, then their run summary.\n\t\t *\n\t\t * @param {object} config The page config; `state` is the active tab\n\t\t * (`all`, `active`, `paused`, `errors`), `runsRoute`/`flowsRoute`\n\t\t * override where the page tabs lead.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tview.state = filters[config?.state] ? config.state : 'all'\n\t\t\tview.runsRoute = config?.runsRoute || '/flow-runs'\n\t\t\tview.flowsRoute = config?.flowsRoute || '/flows'\n\t\t\tawait store.load({ app: config?.app })\n\t\t\tawait store.loadRunSummary((store.flows || []).map((flow) => flow.id || flow.uuid), startOfWeek())\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The rows of the active tab.\n\t\t */\n\t\trows: () => allRows().filter(filters[view.state] || filters.all),\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => !!store.loading,\n\n\t\tcolumns: [\n\t\t\t{ key: 'name', label: t('nextcloud-vue', 'Flow'), secondary: 'description' },\n\t\t\t{\n\t\t\t\tkey: 'triggerLabel',\n\t\t\t\tlabel: t('nextcloud-vue', 'Trigger'),\n\t\t\t\tsecondary: 'triggerDetail',\n\t\t\t\twidget: 'iconLabel',\n\t\t\t\twidgetProps: { icon: (row) => row.triggerIcon },\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'lastRunLabel',\n\t\t\t\tlabel: t('nextcloud-vue', 'Last run'),\n\t\t\t\tsecondary: 'lastRunAt',\n\t\t\t\twidget: 'badge',\n\t\t\t\twidgetProps: { colorMap: lastRunColors },\n\t\t\t},\n\t\t\t{ key: 'runsThisWeek', label: t('nextcloud-vue', 'Runs this week'), class: 'cn-table-col--end' },\n\t\t\t{\n\t\t\t\tkey: 'statusLabel',\n\t\t\t\tlabel: t('nextcloud-vue', 'Status'),\n\t\t\t\twidget: 'switch',\n\t\t\t\twidgetProps: {\n\t\t\t\t\tchecked: (row) => row.enabled !== false,\n\t\t\t\t\tonToggle: (row, enabled) => store.setEnabled(row.id || row.uuid, enabled),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\n\t\tquickFilters: [\n\t\t\t{ label: t('nextcloud-vue', 'All'), filter: { state: 'all' }, default: true },\n\t\t\t{ label: t('nextcloud-vue', 'Active'), filter: { state: 'active' } },\n\t\t\t{ label: t('nextcloud-vue', 'Paused'), filter: { state: 'paused' } },\n\t\t\t{ label: t('nextcloud-vue', 'With errors'), filter: { state: 'errors' } },\n\t\t],\n\n\t\t/**\n\t\t * The number on each quick filter, by tab index, from the loaded list.\n\t\t *\n\t\t * @return {Record<number, number>} The counts.\n\t\t */\n\t\ttabCounts: () => {\n\t\t\tconst rows = allRows()\n\t\t\treturn {\n\t\t\t\t0: rows.length,\n\t\t\t\t1: rows.filter(filters.active).length,\n\t\t\t\t2: rows.filter(filters.paused).length,\n\t\t\t\t3: rows.filter(filters.errors).length,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The page tabs above the list: the flows and this week's runs.\n\t\t *\n\t\t * @return {Array<{label: string, to: string, count: number}>} The tabs.\n\t\t */\n\t\tpageTabs: () => [\n\t\t\t{ id: 'flows', label: t('nextcloud-vue', 'Flows'), to: view.flowsRoute, count: (store.flows || []).length },\n\t\t\t{\n\t\t\t\tid: 'runs',\n\t\t\t\tlabel: t('nextcloud-vue', 'Runs this week'),\n\t\t\t\tto: view.runsRoute,\n\t\t\t\tcount: Object.values(store.runSummary || {}).reduce((sum, entry) => sum + (Number(entry?.runsSince) || 0), 0),\n\t\t\t},\n\t\t],\n\n\t\tfooterNote: t('nextcloud-vue', 'A paused flow keeps its steps and history. It starts again when you switch it on.'),\n\n\t\t// ONE Edit, and it NAVIGATES. `action: 'open'` is the source-action\n\t\t// grammar CnIndexPage resolves to \"open this row where the source says\n\t\t// rows live\" — the page's configured row target (`config.rowRoute`, via\n\t\t// `edit-open`) wins, and `detailRoute` below is the fallback. The flow\n\t\t// detail page IS the edit surface AND the view surface, so the source\n\t\t// declares no View, and the page's schema-form Edit is suppressed for\n\t\t// named sources (a source has no schema, so that modal can only ever\n\t\t// render empty).\n\t\trowActions: [\n\t\t\t{ id: 'edit', label: t('nextcloud-vue', 'Edit'), icon: Pencil, action: 'open' },\n\t\t],\n\n\t\t/**\n\t\t * Delete one flow row, reloading in the page's scope.\n\t\t *\n\t\t * Read by CnIndexPage's built-in single-delete dialog: a named source\n\t\t * without this hook gets no Delete action at all, because the confirm\n\t\t * would otherwise emit into a manifest page with nobody listening — a\n\t\t * dialog that looks like it deleted and did not.\n\t\t *\n\t\t * @param {object} row The row to delete.\n\t\t * @param {object} config The page's source config (`app` scopes the reload).\n\t\t *\n\t\t * @return {Promise<void>} Resolves when deleted and reloaded.\n\t\t */\n\t\tdeleteRow: (row, config) => store.remove(row?.id || row?.uuid, { app: config?.app || null }),\n\n\t\t/**\n\t\t * Copy one flow row under a new name, reloading in the page's scope.\n\t\t *\n\t\t * Read by CnIndexPage's built-in single-copy dialog, same contract as\n\t\t * `deleteRow`. The copy is a fresh flow: the server stamps the copier\n\t\t * as owner and lifecycle starts over, so copying a published flow\n\t\t * yields an unpublished one with the same graph.\n\t\t *\n\t\t * @param {object} row The row to copy.\n\t\t * @param {string} newName The copy's name.\n\t\t * @param {object} config The page's source config (`app` scopes the reload).\n\t\t *\n\t\t * @return {Promise<object>} The created flow.\n\t\t */\n\t\tcopyRow: (row, newName, config) => store.duplicate(row?.id || row?.uuid, newName, { app: config?.app || null }),\n\n\t\t// The surfaces a flow list needs beyond its rows. These are DEFAULTS a\n\t\t// manifest can override, not a fixed shape: `detailRoute` is the fleet\n\t\t// convention (`/flows/:id`) and the two routes below derive from it.\n\t\t//\n\t\t// A flow is created by navigating to the editor, NOT by the index page's\n\t\t// built-in form dialog — that dialog builds an OpenRegister object, and a\n\t\t// flow is not one. CnFlowsPage set `:show-add=\"false\"` and rendered its\n\t\t// own button for exactly this reason; expressing it here is what lets the\n\t\t// custom page go.\n\t\tdetailRoute: '/flows',\n\t\taddRoute: '/flows/new',\n\t\taddLabel: t('nextcloud-vue', 'New flow'),\n\t\tdescription: t('nextcloud-vue', 'A flow runs a series of steps when something happens — an object changes, a schedule fires, or you run it yourself.'),\n\t\ttitle: t('nextcloud-vue', 'Flows'),\n\t}\n}\n\n/**\n * The flow runs source: this week's runs of the app's flows, newest first.\n *\n * The second tab of a flow list. Reads the same run history the flow\n * editor reads, narrowed on the server to the app's flows and the week, so\n * the rows are the runs the flows tab counted. A row opens the run on its\n * flow's canvas (`/flows/:flowId?run=:uuid`), where CnFlowDetail shows it.\n *\n * @return {object} The source adapter.\n */\nfunction flowRunsSource() {\n\tconst store = useFlowStore()\n\tconst view = reactive({ runsRoute: '/flow-runs', flowsRoute: '/flows' })\n\tconst statuses = flowRunStatuses()\n\tconst statusColors = {}\n\tObject.values(statuses).forEach((entry) => {\n\t\tstatusColors[entry.label] = entry.variant\n\t})\n\n\t/**\n\t * Where a run opens: its flow's canvas in run view.\n\t *\n\t * @param {object} row The run row.\n\t * @return {object|null} A router location, or null without ids.\n\t */\n\tconst runTarget = (row) => {\n\t\tconst flowId = row?.flowId\n\t\tconst uuid = row?.uuid\n\t\treturn flowId && uuid\n\t\t\t? { path: `${view.flowsRoute}/${encodeURIComponent(flowId)}`, query: { run: String(uuid) } }\n\t\t\t: null\n\t}\n\n\treturn {\n\t\tstore,\n\n\t\t/**\n\t\t * Load the app's flows, then their runs since the start of the week.\n\t\t *\n\t\t * @param {object} config The page config (`app`, `runsRoute`, `flowsRoute`).\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tview.runsRoute = config?.runsRoute || '/flow-runs'\n\t\t\tview.flowsRoute = config?.flowsRoute || '/flows'\n\t\t\tawait store.load({ app: config?.app })\n\t\t\tconst ids = (store.flows || []).map((flow) => flow.id || flow.uuid)\n\t\t\tconst since = startOfWeek()\n\t\t\tawait Promise.all([store.loadRecentRuns(ids, since), store.loadRunSummary(ids, since)])\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The runs, with flow name and status label.\n\t\t */\n\t\trows: () => {\n\t\t\tconst names = {}\n\t\t\t;(store.flows || []).forEach((flow) => {\n\t\t\t\tnames[flow.id || flow.uuid] = flow.name\n\t\t\t})\n\t\t\treturn (store.recentRuns || []).map((run) => ({\n\t\t\t\t...run,\n\t\t\t\tid: run.uuid,\n\t\t\t\tflowName: names[run.flowId] || run.flowId,\n\t\t\t\tstatusLabel: (statuses[run.status] && statuses[run.status].label) || String(run.status || ''),\n\t\t\t\tstartedAt: formatRelativeDate(run.created, { withTime: true }),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => !!store.loading || !!store.recentRunsLoading,\n\n\t\tcolumns: [\n\t\t\t{ key: 'flowName', label: t('nextcloud-vue', 'Flow'), secondary: 'error' },\n\t\t\t{ key: 'statusLabel', label: t('nextcloud-vue', 'Status'), widget: 'badge', widgetProps: { colorMap: statusColors } },\n\t\t\t{ key: 'startedAt', label: t('nextcloud-vue', 'Started') },\n\t\t\t{ key: 'trigger', label: t('nextcloud-vue', 'Trigger') },\n\t\t],\n\n\t\tpageTabs: () => [\n\t\t\t{ id: 'flows', label: t('nextcloud-vue', 'Flows'), to: view.flowsRoute, count: (store.flows || []).length },\n\t\t\t{ id: 'runs', label: t('nextcloud-vue', 'Runs this week'), to: view.runsRoute, count: (store.recentRuns || []).length },\n\t\t],\n\n\t\t// A location, not a URL: the canvas is the consuming app's own page,\n\t\t// so a plain click pushes on its router and a ctrl/cmd click resolves\n\t\t// the same location into a new tab.\n\t\trowTarget: runTarget,\n\t\tshowAdd: false,\n\t\ttitle: t('nextcloud-vue', 'Runs this week'),\n\t\tdescription: t('nextcloud-vue', 'Every run of this app\\'s flows since Monday, newest first.'),\n\t}\n}\n\n/**\n * The absolute deep link for one task.\n *\n * A task's detail page is OpenRegister's, not the consuming app's, so the\n * link is a full URL rather than a route name: the app that renders the\n * inbox is almost never the app that renders the task.\n *\n * @param {string} uuid The task uuid.\n *\n * @return {string} The `/apps/openregister/flow-tasks/{uuid}` URL.\n */\nexport function taskDeepLink(uuid) {\n\treturn generateUrl(`/apps/openregister/flow-tasks/${uuid}`)\n}\n\n/**\n * The human wording for a row's due state.\n *\n * Wording on purpose, never colour: the overdue signal must survive\n * monochrome, a screen reader and a CSV export. Reads the SERVER'S derived\n * projection (`overdue`, `daysOverdue`, `daysUntilDue`) so the cell and any\n * `overdue` filter can never disagree about what overdue means.\n *\n * @param {object} task The task row as the endpoint returned it.\n *\n * @return {string} The due label, or '' for a task without a due date.\n */\nexport function taskDueLabel(task) {\n\tif (task?.overdue === true) {\n\t\tconst days = Number(task.daysOverdue)\n\t\tif (Number.isFinite(days) && days > 0) {\n\t\t\treturn days === 1\n\t\t\t\t? t('nextcloud-vue', 'Overdue by 1 day')\n\t\t\t\t: t('nextcloud-vue', 'Overdue by {days} days', { days })\n\t\t}\n\t\treturn t('nextcloud-vue', 'Overdue')\n\t}\n\tconst until = Number(task?.daysUntilDue)\n\tif (Number.isFinite(until) === false || task?.dueAt === null || task?.dueAt === undefined) {\n\t\treturn ''\n\t}\n\tif (until <= 0) {\n\t\treturn t('nextcloud-vue', 'Due today')\n\t}\n\treturn until === 1\n\t\t? t('nextcloud-vue', 'Due tomorrow')\n\t\t: t('nextcloud-vue', 'Due in {days} days', { days: until })\n}\n\n/**\n * The tasks source: the caller's inbox on OpenRegister's one task store.\n *\n * The viewer's inbox and nothing else. The endpoint answers from the\n * session and does the authorization; this adapter forwards config through\n * the store's allowlist and never asks for another user.\n *\n * @return {object} The source adapter.\n */\nfunction tasksSource() {\n\tconst store = useTaskInboxStore()\n\n\t// Labels and colour maps are built with the SAME t() calls, so the badge\n\t// colour lookup (keyed on the shown label) holds in every locale. The six\n\t// states are CMMN's (openregister flow-task-entity): available, enabled,\n\t// active, completed, terminated, disabled.\n\tconst stateLabels = {\n\t\tavailable: t('nextcloud-vue', 'Available'),\n\t\tenabled: t('nextcloud-vue', 'Ready to claim'),\n\t\tactive: t('nextcloud-vue', 'In progress'),\n\t\tcompleted: t('nextcloud-vue', 'Completed'),\n\t\tterminated: t('nextcloud-vue', 'Terminated'),\n\t\tdisabled: t('nextcloud-vue', 'Disabled'),\n\t}\n\tconst stateColorMap = {\n\t\t[stateLabels.enabled]: 'info',\n\t\t[stateLabels.active]: 'primary',\n\t\t[stateLabels.completed]: 'success',\n\t\t[stateLabels.terminated]: 'error',\n\t}\n\tconst priorityLabels = {\n\t\tlow: t('nextcloud-vue', 'Low'),\n\t\tnormal: t('nextcloud-vue', 'Normal'),\n\t\thigh: t('nextcloud-vue', 'High'),\n\t\turgent: t('nextcloud-vue', 'Urgent'),\n\t}\n\tconst priorityColorMap = {\n\t\t[priorityLabels.high]: 'warning',\n\t\t[priorityLabels.urgent]: 'error',\n\t}\n\n\treturn {\n\t\tstore,\n\n\t\t/**\n\t\t * Load the caller's inbox.\n\t\t *\n\t\t * @param {object} config The merged page config (sourceConfig plus the\n\t\t * active quick-filter tab); only allowlisted keys reach the wire.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: (config) => store.load(config || {}),\n\n\t\t/**\n\t\t * @return {Array<object>} The rows, with the display fields resolved.\n\t\t */\n\t\trows: () => (store.tasks || []).map((task) => ({\n\t\t\t...task,\n\t\t\t// CnIndexPage keys rows on `id` by default; the row contract's\n\t\t\t// identity is the uuid.\n\t\t\tid: task.uuid,\n\t\t\ttitle: task.displayTitle || task.title || task.uuid,\n\t\t\tsubjectLabel: (task.subject && task.subject.title) || '',\n\t\t\tstateLabel: stateLabels[task.state] || String(task.state || ''),\n\t\t\tpriorityLabel: priorityLabels[task.priority] || String(task.priority || ''),\n\t\t\tdueLabel: taskDueLabel(task),\n\t\t})),\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => !!store.loading,\n\n\t\t/**\n\t\t * Count the inbox for a config without touching the rows on screen,\n\t\t * for a quick-filter tab with `showCount`.\n\t\t *\n\t\t * @param {object} config The merged config, as for `load`.\n\t\t * @return {Promise<number>} The datastore total.\n\t\t */\n\t\tcount: async (config) => (await store.fetchFor({ ...(config || {}), limit: 1 })).total,\n\n\t\tcolumns: [\n\t\t\t{ key: 'title', label: t('nextcloud-vue', 'Task') },\n\t\t\t{ key: 'subjectLabel', label: t('nextcloud-vue', 'Subject') },\n\t\t\t{ key: 'stateLabel', label: t('nextcloud-vue', 'State'), widget: 'badge', widgetProps: { colorMap: stateColorMap } },\n\t\t\t{ key: 'priorityLabel', label: t('nextcloud-vue', 'Priority'), widget: 'badge', widgetProps: { colorMap: priorityColorMap } },\n\t\t\t{ key: 'dueLabel', label: t('nextcloud-vue', 'Due') },\n\t\t\t{ key: 'assignee', label: t('nextcloud-vue', 'Assignee') },\n\t\t],\n\n\t\t// The scope tabs. Each tab's filter is merged over the page's\n\t\t// `sourceConfig` (tab wins on a colliding key) and the merged config\n\t\t// goes through the store's allowlist. \"Overdue\" deliberately carries\n\t\t// no scope, so it narrows the endpoint's default: my overdue work.\n\t\tquickFilters: [\n\t\t\t{ label: t('nextcloud-vue', 'Assigned to me'), filter: { scope: 'assigned' }, default: true },\n\t\t\t{ label: t('nextcloud-vue', 'Pool'), filter: { scope: 'pooled' } },\n\t\t\t{ label: t('nextcloud-vue', 'Watched'), filter: { scope: 'watched' } },\n\t\t\t{ label: t('nextcloud-vue', 'Everything'), filter: { scope: 'all' } },\n\t\t\t{ label: t('nextcloud-vue', 'Overdue'), filter: { overdue: true } },\n\t\t],\n\n\t\t/**\n\t\t * Open a clicked row: the task's deep link, as a full URL.\n\t\t *\n\t\t * `detailRoute` would push on the CONSUMING app's router, and the task\n\t\t * page is OpenRegister's. `row-click` still emits for hosts listening.\n\t\t *\n\t\t * @param {object} row The clicked row.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\topenRow: (row) => {\n\t\t\tconst uuid = row?.uuid || row?.id\n\t\t\tif (!uuid) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\twindow.location.assign(taskDeepLink(String(uuid)))\n\t\t},\n\n\t\t/**\n\t\t * The URL a clicked row opens, so a ctrl/cmd/shift or middle click can\n\t\t * open it in a new tab.\n\t\t *\n\t\t * @param {object} row The clicked row.\n\t\t *\n\t\t * @return {string|null} The task's deep link, or null without an id.\n\t\t */\n\t\trowTarget: (row) => {\n\t\t\tconst uuid = row?.uuid || row?.id\n\t\t\treturn uuid ? taskDeepLink(String(uuid)) : null\n\t\t},\n\n\t\t// The sidebar fields this inbox can answer, and the argument each one\n\t\t// becomes. Measured against `TaskController::index()` and\n\t\t// `TaskInboxCriteria`, which take the same predicates for the page and\n\t\t// for the total, so a filter that narrows the list narrows the count.\n\t\t//\n\t\t// 🔴 `assignee` IS DELIBERATELY ABSENT, AND IT IS THE ONE FIELD A TASK\n\t\t// SEARCH IS EXPECTED TO HAVE. The inbox has no assignee predicate at\n\t\t// all: `scope` is the only assignee-shaped narrowing and it resolves\n\t\t// to the CALLING user. Declaring it here would put a picker on screen\n\t\t// that quietly answers about everybody. It lands when openregister\n\t\t// grows the parameter, and not before.\n\t\tsearchFields: {\n\t\t\tobjectUuid: { param: 'objectUuid', single: true },\n\t\t\tstate: { param: 'state', join: ',' },\n\t\t\tpriority: { param: 'priority', single: true },\n\t\t\t// Single-valued, like `priority`: the endpoint compares one kind.\n\t\t\t// Joining two into a comma string would match a kind nobody wrote.\n\t\t\tkind: { param: 'kind', single: true },\n\t\t\tdueAt: { range: ['dueAfter', 'dueBefore'] },\n\t\t},\n\n\t\t// A task is created by a flow, never by a person clicking Add. Without\n\t\t// this the index falls back to its OpenRegister form dialog, which\n\t\t// would build an object the task store never reads.\n\t\tshowAdd: false,\n\t\tdescription: t('nextcloud-vue', 'Your tasks from every app, in one inbox. Claim from the pool, then complete with an outcome.'),\n\t\ttitle: t('nextcloud-vue', 'Tasks'),\n\t}\n}\n\n/**\n * Read a dotted path off a response body.\n *\n * @param {object} body The response body.\n * @param {string} path A dotted path such as `data.items`.\n * @return {unknown} The value, or undefined.\n */\nfunction readRowsPath(body, path) {\n\treturn String(path).split('.').reduce((value, key) => (value && typeof value === 'object' ? value[key] : undefined), body)\n}\n\n/**\n * The endpoint source: rows from an app's own endpoint\n * (`entitySource: \"endpoint\"`), for a list that is not OpenRegister objects,\n * such as dossiq's postvak.\n *\n * `sourceConfig.url` is an app path (`/apps/dossiq/api/postvak`), resolved\n * with `generateUrl` and fetched with the session, so the endpoint does its\n * own authorization. `sourceConfig.rowsPath` names where the rows sit in the\n * response (`results` by default; a bare array is taken as is). Every other\n * key, the active tab's filter and the sidebar choices included, goes along\n * as a query parameter. The manifest declares the columns.\n *\n * Without a `sourceConfig.url`, and when the page config itself arrived in\n * its place (CnPageRenderer's fallback for a page that sets no\n * `sourceConfig`, recognisable by its `entitySource` key), nothing is\n * requested: page-config keys must never become query parameters. The list\n * stays empty and one console error names the page.\n *\n * @return {object} The source adapter.\n * @spec openspec/changes/index-endpoint-source/specs/index-page/spec.md#requirement-an-index-page-can-list-rows-from-an-app-endpoint\n */\nfunction endpointSource() {\n\tconst state = reactive({ rows: [], loading: false })\n\tlet seq = 0\n\tlet warned = false\n\n\treturn {\n\t\t/**\n\t\t * Fetch the rows.\n\t\t *\n\t\t * @param {object} config The page's source config with the tab filter merged in.\n\t\t * @return {Promise<void>} Resolves when loaded; a failed request leaves no rows and rethrows.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tconst { url, rowsPath, ...rest } = config || {}\n\t\t\tconst mine = ++seq\n\t\t\tconst pageConfig = Boolean(config && Object.hasOwn(config, 'entitySource'))\n\t\t\tif (typeof url !== 'string' || url === '' || pageConfig) {\n\t\t\t\tstate.rows = []\n\t\t\t\tif (!warned) {\n\t\t\t\t\twarned = true\n\t\t\t\t\tconst page = (config && (config.title || config.id)) || 'an index page'\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(`[CnIndexPage] entitySource \"endpoint\" on \"${page}\" needs an explicit sourceConfig with a url (an app path such as /apps/<app>/api/<path>); nothing is loaded.`)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst params = {}\n\t\t\tfor (const [key, value] of Object.entries(rest)) {\n\t\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tparams[key] = Array.isArray(value) ? value.join(',') : (typeof value === 'object' ? JSON.stringify(value) : value)\n\t\t\t}\n\t\t\tstate.loading = true\n\t\t\ttry {\n\t\t\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\t\t\tconst res = await axios.get(generateUrl(url), { params })\n\t\t\t\tconst body = res ? res.data : null\n\t\t\t\tconst rows = Array.isArray(body) ? body : readRowsPath(body, rowsPath || 'results')\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.rows = Array.isArray(rows) ? rows : []\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.rows = []\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t} finally {\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.loading = false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The rows the endpoint returned.\n\t\t */\n\t\trows: () => state.rows,\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => state.loading,\n\t}\n}\n\n/**\n * The registered sources, by the name a manifest uses.\n *\n * @type {Record<string, () => object>}\n */\nexport { flowRunStatuses }\n\nexport const indexSources = {\n\tflows: flowsSource,\n\tflowRuns: flowRunsSource,\n\ttasks: tasksSource,\n\tendpoint: endpointSource,\n}\n\n/**\n * Resolve a named source.\n *\n * Returns null for an unknown name rather than throwing, and the caller warns:\n * a typo in a manifest should degrade to the ordinary empty index with a\n * console message naming the source, not white-screen the app. It must NOT\n * silently render an empty list with no explanation, because that is\n * indistinguishable from a source that genuinely has no rows.\n *\n * @param {string} name The source name from `config.source`.\n *\n * @return {object|null} The adapter, or null when the name is not registered.\n */\nexport function resolveIndexSource(name) {\n\tconst key = String(name || '')\n\tif (!key) {\n\t\treturn null\n\t}\n\n\tconst factory = indexSources[key]\n\tif (typeof factory !== 'function') {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(`[CnIndexPage] Unknown index source \"${key}\" — known sources: ${Object.keys(indexSources).join(', ')}. The list will be empty.`)\n\t\treturn null\n\t}\n\n\treturn factory()\n}\n"],"names":["t"],"mappings":"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"}
1
+ {"version":3,"file":"indexSources.js","sources":["../../../src/composables/indexSources.js"],"sourcesContent":["/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n */\n\nimport { getCanonicalLocale, translate as t } from '@nextcloud/l10n'\nimport { generateOcsUrl, generateUrl } from '@nextcloud/router'\nimport { reactive } from 'vue'\nimport CalendarClock from 'vue-material-design-icons/CalendarClock.vue'\nimport HandBackRight from 'vue-material-design-icons/HandBackRight.vue'\nimport LightningBolt from 'vue-material-design-icons/LightningBolt.vue'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport { formatRelativeDate } from '../utils/boardDate.js'\nimport { FLOW_RUN_ERROR_STATUSES, flowRunStatuses } from '../utils/flowRunStatus.js'\nimport { fetchGroupMembers, fetchPresence, fetchStatuses } from '../utils/nextcloudDirectory.js'\nimport { readPath } from '../utils/readPath.js'\nimport { useFlowStore } from './useFlowStore.js'\nimport { organisationRecord, useOrganisationStore } from './useOrganisationStore.js'\nimport { useTaskInboxStore } from './useTaskInboxStore.js'\n\n/**\n * NAMED INDEX SOURCES.\n *\n * `CnIndexPage` has always had two modes: fetch OpenRegister objects itself\n * from `register` + `schema`, or render rows handed in as `:objects`. That\n * second mode is why bespoke list pages exist at all — anything that is not an\n * OpenRegister object needed its own page component whose only real job was to\n * load rows from somewhere else and pass them down.\n *\n * A flow is the clearest case: flow definitions are deliberately NOT stored as\n * OpenRegister objects, so `type: \"index\"` had nothing to point at, and every\n * app that wanted a flow list shipped a custom page instead.\n *\n * This registry is the third mode. A manifest names an entity source, and the index\n * page loads it — no component, no `type: \"custom\"`.\n *\n * { \"type\": \"index\", \"config\": { \"entitySource\": \"flows\", \"app\": \"dossiq\" } }\n *\n * Each entry supplies the parts an index cannot infer: how to load, where the\n * rows live, and sensible columns and row actions so a manifest does not have\n * to restate them. A manifest that DOES set `columns` still wins — the source\n * only fills in what was left out.\n *\n * WHY A REGISTRY RATHER THAN A BRANCH. `logs`, the AVG register and the other\n * non-object lists are the same shape, and each one added as an `if` in the\n * index page is another reason the page cannot be reasoned about. Adding a\n * source here is a data change; adding one to the page is a behaviour change.\n */\n\n/**\n * Monday 00:00 of the current week, local time, as ISO 8601.\n *\n * \"This week\" on a flow list is the calendar week a person plans in, not a\n * rolling seven days: on a Monday morning it reads as a fresh count.\n *\n * @param {Date} [now] The reference moment.\n * @return {string} The start of the week.\n */\nexport function startOfWeek(now = new Date()) {\n\tconst start = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n\tconst offset = (start.getDay() + 6) % 7\n\tstart.setDate(start.getDate() - offset)\n\treturn start.toISOString()\n}\n\n/**\n * How a flow starts, as a label, a muted second line and an icon.\n *\n * `trigger` is a catalogue event id, `schedule` (with `cron`) or `manual`.\n * An event id reads as its catalogue label when the catalogue knows it,\n * else as the id, so a trigger the catalogue has not loaded yet still says\n * something true.\n *\n * @param {object} flow The flow row.\n * @param {Array<object>} catalog The event catalogue (`{id, label}`).\n * @return {{label: string, detail: string, icon: object}} The trigger cell.\n */\nexport function flowTriggerCell(flow, catalog = []) {\n\tconst trigger = String(flow?.trigger || '')\n\tif (trigger === 'schedule') {\n\t\treturn { label: t('nextcloud-vue', 'On a schedule'), detail: String(flow?.cron || ''), icon: CalendarClock }\n\t}\n\tif (trigger === '' || trigger === 'manual') {\n\t\treturn { label: t('nextcloud-vue', 'Run by hand'), detail: '', icon: HandBackRight }\n\t}\n\tconst entry = (catalog || []).find((item) => item && item.id === trigger)\n\treturn {\n\t\tlabel: (entry && entry.label) || trigger,\n\t\tdetail: String(flow?.triggerSchema || ''),\n\t\ticon: LightningBolt,\n\t}\n}\n\n/**\n * The flow source: OpenRegister's one native flow store.\n *\n * Rows carry the run figures a flow list shows beside each flow (how its\n * last run ended, how often it ran this week), read in one request from\n * the run summary rather than derived from a page of runs.\n *\n * The quick filters (All, Active, Paused, With errors) narrow the loaded\n * list in place: every flow of the app is already loaded, so the counts on\n * the tabs and the rows they show can never disagree.\n *\n * @return {object} The source adapter.\n */\nfunction flowsSource() {\n\tconst store = useFlowStore()\n\tconst view = reactive({ state: 'all', runsRoute: '/flow-runs', flowsRoute: '/flows' })\n\tconst statuses = flowRunStatuses()\n\n\t/**\n\t * Every flow row with its display fields, before any tab narrows it.\n\t *\n\t * @return {Array<object>} The rows.\n\t */\n\tconst allRows = () => (store.flows || []).map((flow) => {\n\t\tconst id = flow.id || flow.uuid\n\t\tconst summary = (store.runSummary || {})[id] || {}\n\t\tconst lastRun = summary.lastRun || null\n\t\tconst lastStatus = lastRun ? statuses[lastRun.status] : null\n\t\tconst trigger = flowTriggerCell(flow, store.eventCatalog)\n\t\treturn {\n\t\t\t...flow,\n\t\t\ttriggerLabel: trigger.label,\n\t\t\ttriggerDetail: trigger.detail,\n\t\t\ttriggerIcon: trigger.icon,\n\t\t\tlastRunStatus: lastRun ? lastRun.status : '',\n\t\t\tlastRunLabel: lastRun\n\t\t\t\t? ((lastStatus && lastStatus.label) || String(lastRun.status || ''))\n\t\t\t\t: t('nextcloud-vue', 'Not run yet'),\n\t\t\tlastRunAt: lastRun ? formatRelativeDate(lastRun.created, { withTime: true }) : '',\n\t\t\tlastRunFailed: !!lastRun && FLOW_RUN_ERROR_STATUSES.includes(lastRun.status),\n\t\t\trunsThisWeek: Number(summary.runsSince) || 0,\n\t\t\t// The switch reads `enabled`; the label is what a screen reader and\n\t\t\t// an export see. A flow with no owner is enabled but cannot start,\n\t\t\t// because a trigger has no acting user to run as.\n\t\t\tstatusLabel: flow.enabled === false\n\t\t\t\t? t('nextcloud-vue', 'Paused')\n\t\t\t\t: (flow.owner ? t('nextcloud-vue', 'Active') : t('nextcloud-vue', 'No owner')),\n\t\t}\n\t})\n\n\tconst lastRunColors = {}\n\tObject.values(statuses).forEach((entry) => {\n\t\tlastRunColors[entry.label] = entry.variant\n\t})\n\n\tconst filters = {\n\t\tall: () => true,\n\t\tactive: (row) => row.enabled !== false,\n\t\tpaused: (row) => row.enabled === false,\n\t\terrors: (row) => row.lastRunFailed,\n\t}\n\n\treturn {\n\t\tstore,\n\n\t\t/**\n\t\t * Load the flows for the scoped app, then their run summary.\n\t\t *\n\t\t * @param {object} config The page config; `state` is the active tab\n\t\t * (`all`, `active`, `paused`, `errors`), `runsRoute`/`flowsRoute`\n\t\t * override where the page tabs lead.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tview.state = filters[config?.state] ? config.state : 'all'\n\t\t\tview.runsRoute = config?.runsRoute || '/flow-runs'\n\t\t\tview.flowsRoute = config?.flowsRoute || '/flows'\n\t\t\tawait store.load({ app: config?.app })\n\t\t\tawait store.loadRunSummary((store.flows || []).map((flow) => flow.id || flow.uuid), startOfWeek())\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The rows of the active tab.\n\t\t */\n\t\trows: () => allRows().filter(filters[view.state] || filters.all),\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => !!store.loading,\n\n\t\tcolumns: [\n\t\t\t{ key: 'name', label: t('nextcloud-vue', 'Flow'), secondary: 'description' },\n\t\t\t{\n\t\t\t\tkey: 'triggerLabel',\n\t\t\t\tlabel: t('nextcloud-vue', 'Trigger'),\n\t\t\t\tsecondary: 'triggerDetail',\n\t\t\t\twidget: 'iconLabel',\n\t\t\t\twidgetProps: { icon: (row) => row.triggerIcon },\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'lastRunLabel',\n\t\t\t\tlabel: t('nextcloud-vue', 'Last run'),\n\t\t\t\tsecondary: 'lastRunAt',\n\t\t\t\twidget: 'badge',\n\t\t\t\twidgetProps: { colorMap: lastRunColors },\n\t\t\t},\n\t\t\t{ key: 'runsThisWeek', label: t('nextcloud-vue', 'Runs this week'), class: 'cn-table-col--end' },\n\t\t\t{\n\t\t\t\tkey: 'statusLabel',\n\t\t\t\tlabel: t('nextcloud-vue', 'Status'),\n\t\t\t\twidget: 'switch',\n\t\t\t\twidgetProps: {\n\t\t\t\t\tchecked: (row) => row.enabled !== false,\n\t\t\t\t\tonToggle: (row, enabled) => store.setEnabled(row.id || row.uuid, enabled),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\n\t\tquickFilters: [\n\t\t\t{ label: t('nextcloud-vue', 'All'), filter: { state: 'all' }, default: true },\n\t\t\t{ label: t('nextcloud-vue', 'Active'), filter: { state: 'active' } },\n\t\t\t{ label: t('nextcloud-vue', 'Paused'), filter: { state: 'paused' } },\n\t\t\t{ label: t('nextcloud-vue', 'With errors'), filter: { state: 'errors' } },\n\t\t],\n\n\t\t/**\n\t\t * The number on each quick filter, by tab index, from the loaded list.\n\t\t *\n\t\t * @return {Record<number, number>} The counts.\n\t\t */\n\t\ttabCounts: () => {\n\t\t\tconst rows = allRows()\n\t\t\treturn {\n\t\t\t\t0: rows.length,\n\t\t\t\t1: rows.filter(filters.active).length,\n\t\t\t\t2: rows.filter(filters.paused).length,\n\t\t\t\t3: rows.filter(filters.errors).length,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The page tabs above the list: the flows and this week's runs.\n\t\t *\n\t\t * @return {Array<{label: string, to: string, count: number}>} The tabs.\n\t\t */\n\t\tpageTabs: () => [\n\t\t\t{ id: 'flows', label: t('nextcloud-vue', 'Flows'), to: view.flowsRoute, count: (store.flows || []).length },\n\t\t\t{\n\t\t\t\tid: 'runs',\n\t\t\t\tlabel: t('nextcloud-vue', 'Runs this week'),\n\t\t\t\tto: view.runsRoute,\n\t\t\t\tcount: Object.values(store.runSummary || {}).reduce((sum, entry) => sum + (Number(entry?.runsSince) || 0), 0),\n\t\t\t},\n\t\t],\n\n\t\tfooterNote: t('nextcloud-vue', 'A paused flow keeps its steps and history. It starts again when you switch it on.'),\n\n\t\t// ONE Edit, and it NAVIGATES. `action: 'open'` is the source-action\n\t\t// grammar CnIndexPage resolves to \"open this row where the source says\n\t\t// rows live\" — the page's configured row target (`config.rowRoute`, via\n\t\t// `edit-open`) wins, and `detailRoute` below is the fallback. The flow\n\t\t// detail page IS the edit surface AND the view surface, so the source\n\t\t// declares no View, and the page's schema-form Edit is suppressed for\n\t\t// named sources (a source has no schema, so that modal can only ever\n\t\t// render empty).\n\t\trowActions: [\n\t\t\t{ id: 'edit', label: t('nextcloud-vue', 'Edit'), icon: Pencil, action: 'open' },\n\t\t],\n\n\t\t/**\n\t\t * Delete one flow row, reloading in the page's scope.\n\t\t *\n\t\t * Read by CnIndexPage's built-in single-delete dialog: a named source\n\t\t * without this hook gets no Delete action at all, because the confirm\n\t\t * would otherwise emit into a manifest page with nobody listening — a\n\t\t * dialog that looks like it deleted and did not.\n\t\t *\n\t\t * @param {object} row The row to delete.\n\t\t * @param {object} config The page's source config (`app` scopes the reload).\n\t\t *\n\t\t * @return {Promise<void>} Resolves when deleted and reloaded.\n\t\t */\n\t\tdeleteRow: (row, config) => store.remove(row?.id || row?.uuid, { app: config?.app || null }),\n\n\t\t/**\n\t\t * Copy one flow row under a new name, reloading in the page's scope.\n\t\t *\n\t\t * Read by CnIndexPage's built-in single-copy dialog, same contract as\n\t\t * `deleteRow`. The copy is a fresh flow: the server stamps the copier\n\t\t * as owner and lifecycle starts over, so copying a published flow\n\t\t * yields an unpublished one with the same graph.\n\t\t *\n\t\t * @param {object} row The row to copy.\n\t\t * @param {string} newName The copy's name.\n\t\t * @param {object} config The page's source config (`app` scopes the reload).\n\t\t *\n\t\t * @return {Promise<object>} The created flow.\n\t\t */\n\t\tcopyRow: (row, newName, config) => store.duplicate(row?.id || row?.uuid, newName, { app: config?.app || null }),\n\n\t\t// The surfaces a flow list needs beyond its rows. These are DEFAULTS a\n\t\t// manifest can override, not a fixed shape: `detailRoute` is the fleet\n\t\t// convention (`/flows/:id`) and the two routes below derive from it.\n\t\t//\n\t\t// A flow is created by navigating to the editor, NOT by the index page's\n\t\t// built-in form dialog — that dialog builds an OpenRegister object, and a\n\t\t// flow is not one. CnFlowsPage set `:show-add=\"false\"` and rendered its\n\t\t// own button for exactly this reason; expressing it here is what lets the\n\t\t// custom page go.\n\t\tdetailRoute: '/flows',\n\t\taddRoute: '/flows/new',\n\t\taddLabel: t('nextcloud-vue', 'New flow'),\n\t\tdescription: t('nextcloud-vue', 'A flow runs a series of steps when something happens — an object changes, a schedule fires, or you run it yourself.'),\n\t\ttitle: t('nextcloud-vue', 'Flows'),\n\t}\n}\n\n/**\n * The flow runs source: this week's runs of the app's flows, newest first.\n *\n * The second tab of a flow list. Reads the same run history the flow\n * editor reads, narrowed on the server to the app's flows and the week, so\n * the rows are the runs the flows tab counted. A row opens the run on its\n * flow's canvas (`/flows/:flowId?run=:uuid`), where CnFlowDetail shows it.\n *\n * @return {object} The source adapter.\n */\nfunction flowRunsSource() {\n\tconst store = useFlowStore()\n\tconst view = reactive({ runsRoute: '/flow-runs', flowsRoute: '/flows' })\n\tconst statuses = flowRunStatuses()\n\tconst statusColors = {}\n\tObject.values(statuses).forEach((entry) => {\n\t\tstatusColors[entry.label] = entry.variant\n\t})\n\n\t/**\n\t * Where a run opens: its flow's canvas in run view.\n\t *\n\t * @param {object} row The run row.\n\t * @return {object|null} A router location, or null without ids.\n\t */\n\tconst runTarget = (row) => {\n\t\tconst flowId = row?.flowId\n\t\tconst uuid = row?.uuid\n\t\treturn flowId && uuid\n\t\t\t? { path: `${view.flowsRoute}/${encodeURIComponent(flowId)}`, query: { run: String(uuid) } }\n\t\t\t: null\n\t}\n\n\treturn {\n\t\tstore,\n\n\t\t/**\n\t\t * Load the app's flows, then their runs since the start of the week.\n\t\t *\n\t\t * @param {object} config The page config (`app`, `runsRoute`, `flowsRoute`).\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tview.runsRoute = config?.runsRoute || '/flow-runs'\n\t\t\tview.flowsRoute = config?.flowsRoute || '/flows'\n\t\t\tawait store.load({ app: config?.app })\n\t\t\tconst ids = (store.flows || []).map((flow) => flow.id || flow.uuid)\n\t\t\tconst since = startOfWeek()\n\t\t\tawait Promise.all([store.loadRecentRuns(ids, since), store.loadRunSummary(ids, since)])\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The runs, with flow name and status label.\n\t\t */\n\t\trows: () => {\n\t\t\tconst names = {}\n\t\t\t;(store.flows || []).forEach((flow) => {\n\t\t\t\tnames[flow.id || flow.uuid] = flow.name\n\t\t\t})\n\t\t\treturn (store.recentRuns || []).map((run) => ({\n\t\t\t\t...run,\n\t\t\t\tid: run.uuid,\n\t\t\t\tflowName: names[run.flowId] || run.flowId,\n\t\t\t\tstatusLabel: (statuses[run.status] && statuses[run.status].label) || String(run.status || ''),\n\t\t\t\tstartedAt: formatRelativeDate(run.created, { withTime: true }),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => !!store.loading || !!store.recentRunsLoading,\n\n\t\tcolumns: [\n\t\t\t{ key: 'flowName', label: t('nextcloud-vue', 'Flow'), secondary: 'error' },\n\t\t\t{ key: 'statusLabel', label: t('nextcloud-vue', 'Status'), widget: 'badge', widgetProps: { colorMap: statusColors } },\n\t\t\t{ key: 'startedAt', label: t('nextcloud-vue', 'Started') },\n\t\t\t{ key: 'trigger', label: t('nextcloud-vue', 'Trigger') },\n\t\t],\n\n\t\tpageTabs: () => [\n\t\t\t{ id: 'flows', label: t('nextcloud-vue', 'Flows'), to: view.flowsRoute, count: (store.flows || []).length },\n\t\t\t{ id: 'runs', label: t('nextcloud-vue', 'Runs this week'), to: view.runsRoute, count: (store.recentRuns || []).length },\n\t\t],\n\n\t\t// A location, not a URL: the canvas is the consuming app's own page,\n\t\t// so a plain click pushes on its router and a ctrl/cmd click resolves\n\t\t// the same location into a new tab.\n\t\trowTarget: runTarget,\n\t\tshowAdd: false,\n\t\ttitle: t('nextcloud-vue', 'Runs this week'),\n\t\tdescription: t('nextcloud-vue', 'Every run of this app\\'s flows since Monday, newest first.'),\n\t}\n}\n\n/**\n * The absolute deep link for one task.\n *\n * A task's detail page is OpenRegister's, not the consuming app's, so the\n * link is a full URL rather than a route name: the app that renders the\n * inbox is almost never the app that renders the task.\n *\n * @param {string} uuid The task uuid.\n *\n * @return {string} The `/apps/openregister/flow-tasks/{uuid}` URL.\n */\nexport function taskDeepLink(uuid) {\n\treturn generateUrl(`/apps/openregister/flow-tasks/${uuid}`)\n}\n\n/**\n * The human wording for a row's due state.\n *\n * Wording on purpose, never colour: the overdue signal must survive\n * monochrome, a screen reader and a CSV export. Reads the SERVER'S derived\n * projection (`overdue`, `daysOverdue`, `daysUntilDue`) so the cell and any\n * `overdue` filter can never disagree about what overdue means.\n *\n * @param {object} task The task row as the endpoint returned it.\n *\n * @return {string} The due label, or '' for a task without a due date.\n */\nexport function taskDueLabel(task) {\n\tif (task?.overdue === true) {\n\t\tconst days = Number(task.daysOverdue)\n\t\tif (Number.isFinite(days) && days > 0) {\n\t\t\treturn days === 1\n\t\t\t\t? t('nextcloud-vue', 'Overdue by 1 day')\n\t\t\t\t: t('nextcloud-vue', 'Overdue by {days} days', { days })\n\t\t}\n\t\treturn t('nextcloud-vue', 'Overdue')\n\t}\n\tconst until = Number(task?.daysUntilDue)\n\tif (Number.isFinite(until) === false || task?.dueAt === null || task?.dueAt === undefined) {\n\t\treturn ''\n\t}\n\tif (until <= 0) {\n\t\treturn t('nextcloud-vue', 'Due today')\n\t}\n\treturn until === 1\n\t\t? t('nextcloud-vue', 'Due tomorrow')\n\t\t: t('nextcloud-vue', 'Due in {days} days', { days: until })\n}\n\n/**\n * The tasks source: the caller's inbox on OpenRegister's one task store.\n *\n * The viewer's inbox and nothing else. The endpoint answers from the\n * session and does the authorization; this adapter forwards config through\n * the store's allowlist and never asks for another user.\n *\n * @return {object} The source adapter.\n */\nfunction tasksSource() {\n\tconst store = useTaskInboxStore()\n\n\t// Labels and colour maps are built with the SAME t() calls, so the badge\n\t// colour lookup (keyed on the shown label) holds in every locale. The six\n\t// states are CMMN's (openregister flow-task-entity): available, enabled,\n\t// active, completed, terminated, disabled.\n\tconst stateLabels = {\n\t\tavailable: t('nextcloud-vue', 'Available'),\n\t\tenabled: t('nextcloud-vue', 'Ready to claim'),\n\t\tactive: t('nextcloud-vue', 'In progress'),\n\t\tcompleted: t('nextcloud-vue', 'Completed'),\n\t\tterminated: t('nextcloud-vue', 'Terminated'),\n\t\tdisabled: t('nextcloud-vue', 'Disabled'),\n\t}\n\tconst stateColorMap = {\n\t\t[stateLabels.enabled]: 'info',\n\t\t[stateLabels.active]: 'primary',\n\t\t[stateLabels.completed]: 'success',\n\t\t[stateLabels.terminated]: 'error',\n\t}\n\tconst priorityLabels = {\n\t\tlow: t('nextcloud-vue', 'Low'),\n\t\tnormal: t('nextcloud-vue', 'Normal'),\n\t\thigh: t('nextcloud-vue', 'High'),\n\t\turgent: t('nextcloud-vue', 'Urgent'),\n\t}\n\tconst priorityColorMap = {\n\t\t[priorityLabels.high]: 'warning',\n\t\t[priorityLabels.urgent]: 'error',\n\t}\n\n\treturn {\n\t\tstore,\n\n\t\t/**\n\t\t * Load the caller's inbox.\n\t\t *\n\t\t * @param {object} config The merged page config (sourceConfig plus the\n\t\t * active quick-filter tab); only allowlisted keys reach the wire.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: (config) => store.load(config || {}),\n\n\t\t/**\n\t\t * @return {Array<object>} The rows, with the display fields resolved.\n\t\t */\n\t\trows: () => (store.tasks || []).map((task) => ({\n\t\t\t...task,\n\t\t\t// CnIndexPage keys rows on `id` by default; the row contract's\n\t\t\t// identity is the uuid.\n\t\t\tid: task.uuid,\n\t\t\ttitle: task.displayTitle || task.title || task.uuid,\n\t\t\tsubjectLabel: (task.subject && task.subject.title) || '',\n\t\t\tstateLabel: stateLabels[task.state] || String(task.state || ''),\n\t\t\tpriorityLabel: priorityLabels[task.priority] || String(task.priority || ''),\n\t\t\tdueLabel: taskDueLabel(task),\n\t\t})),\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => !!store.loading,\n\n\t\t/**\n\t\t * Count the inbox for a config without touching the rows on screen,\n\t\t * for a quick-filter tab with `showCount`.\n\t\t *\n\t\t * @param {object} config The merged config, as for `load`.\n\t\t * @return {Promise<number>} The datastore total.\n\t\t */\n\t\tcount: async (config) => (await store.fetchFor({ ...(config || {}), limit: 1 })).total,\n\n\t\tcolumns: [\n\t\t\t{ key: 'title', label: t('nextcloud-vue', 'Task') },\n\t\t\t{ key: 'subjectLabel', label: t('nextcloud-vue', 'Subject') },\n\t\t\t{ key: 'stateLabel', label: t('nextcloud-vue', 'State'), widget: 'badge', widgetProps: { colorMap: stateColorMap } },\n\t\t\t{ key: 'priorityLabel', label: t('nextcloud-vue', 'Priority'), widget: 'badge', widgetProps: { colorMap: priorityColorMap } },\n\t\t\t{ key: 'dueLabel', label: t('nextcloud-vue', 'Due') },\n\t\t\t{ key: 'assignee', label: t('nextcloud-vue', 'Assignee') },\n\t\t],\n\n\t\t// The scope tabs. Each tab's filter is merged over the page's\n\t\t// `sourceConfig` (tab wins on a colliding key) and the merged config\n\t\t// goes through the store's allowlist. \"Overdue\" deliberately carries\n\t\t// no scope, so it narrows the endpoint's default: my overdue work.\n\t\tquickFilters: [\n\t\t\t{ label: t('nextcloud-vue', 'Assigned to me'), filter: { scope: 'assigned' }, default: true },\n\t\t\t{ label: t('nextcloud-vue', 'Pool'), filter: { scope: 'pooled' } },\n\t\t\t{ label: t('nextcloud-vue', 'Watched'), filter: { scope: 'watched' } },\n\t\t\t{ label: t('nextcloud-vue', 'Everything'), filter: { scope: 'all' } },\n\t\t\t{ label: t('nextcloud-vue', 'Overdue'), filter: { overdue: true } },\n\t\t],\n\n\t\t/**\n\t\t * Open a clicked row: the task's deep link, as a full URL.\n\t\t *\n\t\t * `detailRoute` would push on the CONSUMING app's router, and the task\n\t\t * page is OpenRegister's. `row-click` still emits for hosts listening.\n\t\t *\n\t\t * @param {object} row The clicked row.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\topenRow: (row) => {\n\t\t\tconst uuid = row?.uuid || row?.id\n\t\t\tif (!uuid) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\twindow.location.assign(taskDeepLink(String(uuid)))\n\t\t},\n\n\t\t/**\n\t\t * The URL a clicked row opens, so a ctrl/cmd/shift or middle click can\n\t\t * open it in a new tab.\n\t\t *\n\t\t * @param {object} row The clicked row.\n\t\t *\n\t\t * @return {string|null} The task's deep link, or null without an id.\n\t\t */\n\t\trowTarget: (row) => {\n\t\t\tconst uuid = row?.uuid || row?.id\n\t\t\treturn uuid ? taskDeepLink(String(uuid)) : null\n\t\t},\n\n\t\t// The sidebar fields this inbox can answer, and the argument each one\n\t\t// becomes. Measured against `TaskController::index()` and\n\t\t// `TaskInboxCriteria`, which take the same predicates for the page and\n\t\t// for the total, so a filter that narrows the list narrows the count.\n\t\t//\n\t\t// 🔴 `assignee` IS DELIBERATELY ABSENT, AND IT IS THE ONE FIELD A TASK\n\t\t// SEARCH IS EXPECTED TO HAVE. The inbox has no assignee predicate at\n\t\t// all: `scope` is the only assignee-shaped narrowing and it resolves\n\t\t// to the CALLING user. Declaring it here would put a picker on screen\n\t\t// that quietly answers about everybody. It lands when openregister\n\t\t// grows the parameter, and not before.\n\t\tsearchFields: {\n\t\t\tobjectUuid: { param: 'objectUuid', single: true },\n\t\t\tstate: { param: 'state', join: ',' },\n\t\t\tpriority: { param: 'priority', single: true },\n\t\t\t// Single-valued, like `priority`: the endpoint compares one kind.\n\t\t\t// Joining two into a comma string would match a kind nobody wrote.\n\t\t\tkind: { param: 'kind', single: true },\n\t\t\tdueAt: { range: ['dueAfter', 'dueBefore'] },\n\t\t},\n\n\t\t// A task is created by a flow, never by a person clicking Add. Without\n\t\t// this the index falls back to its OpenRegister form dialog, which\n\t\t// would build an object the task store never reads.\n\t\tshowAdd: false,\n\t\tdescription: t('nextcloud-vue', 'Your tasks from every app, in one inbox. Claim from the pool, then complete with an outcome.'),\n\t\ttitle: t('nextcloud-vue', 'Tasks'),\n\t}\n}\n\n/**\n * Read a dotted path off a response body.\n *\n * @param {object} body The response body.\n * @param {string} path A dotted path such as `data.items`.\n * @return {unknown} The value, or undefined.\n */\nfunction readRowsPath(body, path) {\n\treturn String(path).split('.').reduce((value, key) => (value && typeof value === 'object' ? value[key] : undefined), body)\n}\n\n/**\n * The endpoint source: rows from an app's own endpoint\n * (`entitySource: \"endpoint\"`), for a list that is not OpenRegister objects,\n * such as dossiq's postvak.\n *\n * `sourceConfig.url` is an app path (`/apps/dossiq/api/postvak`), resolved\n * with `generateUrl` and fetched with the session, so the endpoint does its\n * own authorization. `sourceConfig.rowsPath` names where the rows sit in the\n * response (`results` by default; a bare array is taken as is). Every other\n * key, the active tab's filter and the sidebar choices included, goes along\n * as a query parameter. The manifest declares the columns.\n *\n * Without a `sourceConfig.url`, and when the page config itself arrived in\n * its place (CnPageRenderer's fallback for a page that sets no\n * `sourceConfig`, recognisable by its `entitySource` key), nothing is\n * requested: page-config keys must never become query parameters. The list\n * stays empty and one console error names the page.\n *\n * @return {object} The source adapter.\n * @spec openspec/changes/index-endpoint-source/specs/index-page/spec.md#requirement-an-index-page-can-list-rows-from-an-app-endpoint\n */\nfunction endpointSource() {\n\tconst state = reactive({ rows: [], loading: false })\n\tlet seq = 0\n\tlet warned = false\n\n\treturn {\n\t\t/**\n\t\t * Fetch the rows.\n\t\t *\n\t\t * @param {object} config The page's source config with the tab filter merged in.\n\t\t * @return {Promise<void>} Resolves when loaded; a failed request leaves no rows and rethrows.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tconst { url, rowsPath, ...rest } = config || {}\n\t\t\tconst mine = ++seq\n\t\t\tconst pageConfig = Boolean(config && Object.hasOwn(config, 'entitySource'))\n\t\t\tif (typeof url !== 'string' || url === '' || pageConfig) {\n\t\t\t\tstate.rows = []\n\t\t\t\tif (!warned) {\n\t\t\t\t\twarned = true\n\t\t\t\t\tconst page = (config && (config.title || config.id)) || 'an index page'\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(`[CnIndexPage] entitySource \"endpoint\" on \"${page}\" needs an explicit sourceConfig with a url (an app path such as /apps/<app>/api/<path>); nothing is loaded.`)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst params = {}\n\t\t\tfor (const [key, value] of Object.entries(rest)) {\n\t\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tparams[key] = Array.isArray(value) ? value.join(',') : (typeof value === 'object' ? JSON.stringify(value) : value)\n\t\t\t}\n\t\t\tstate.loading = true\n\t\t\ttry {\n\t\t\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\t\t\tconst res = await axios.get(generateUrl(url), { params })\n\t\t\t\tconst body = res ? res.data : null\n\t\t\t\tconst rows = Array.isArray(body) ? body : readRowsPath(body, rowsPath || 'results')\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.rows = Array.isArray(rows) ? rows : []\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.rows = []\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t} finally {\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.loading = false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The rows the endpoint returned.\n\t\t */\n\t\trows: () => state.rows,\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => state.loading,\n\t}\n}\n\n/**\n * Fill `{field}` placeholders in a link template from a row.\n *\n * @param {string} template A path such as `/apps/dossiq/cases/{id}`.\n * @param {object} row The row.\n * @return {string} The path.\n */\nfunction fillRowTemplate(template, row) {\n\treturn String(template).replace(/\\{([\\w.@]+)\\}/g, (match, path) => {\n\t\tconst value = readPath(row, path)\n\t\treturn value === undefined || value === null ? '' : encodeURIComponent(String(value))\n\t})\n}\n\n/**\n * The search source: one search term over several OpenRegister schemas and\n * the reader's files (`entitySource: \"search\"`), with a quick filter per kind\n * and its count (DqZoekresultaten).\n *\n * `sourceConfig.kinds` lists what is searched:\n * `{ id, label, register, schema, titleField?, subtitleField?, statusField?, href?, limit? }`\n * for objects (OpenRegister's `_search`, so the reader sees what they may\n * read), or `{ id, label, files: true, limit? }` for the reader's files\n * (Nextcloud's unified search). The term is `sourceConfig.term`, else the\n * address's `?q=` (or `sourceConfig.termQuery`). A kind that fails shows no\n * rows and no count; the others still answer.\n *\n * @param {object} [config] The page's source config.\n * @return {object} The source adapter.\n * @spec openspec/changes/index-search-source/specs/index-page/spec.md#requirement-an-index-page-can-search-several-schemas-and-files\n */\nfunction searchSource(config = {}) {\n\tconst kinds = (Array.isArray(config && config.kinds) ? config.kinds : [])\n\t\t.filter((kind) => kind && typeof kind.id === 'string' && kind.id !== '' && (kind.files === true || (kind.register && kind.schema)))\n\tconst state = reactive({ rows: [], totals: {}, loading: false, kind: 'all', term: '' })\n\tlet seq = 0\n\n\tconst searchObjects = async (axios, kind, term) => {\n\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: kind.register, schema: kind.schema })\n\t\tconst res = await axios.get(url, { params: { _search: term, _limit: kind.limit || 20 } })\n\t\tconst body = (res && res.data) || {}\n\t\tconst results = Array.isArray(body.results) ? body.results : (Array.isArray(body) ? body : [])\n\t\treturn {\n\t\t\ttotal: typeof body.total === 'number' ? body.total : results.length,\n\t\t\trows: results.map((object) => {\n\t\t\t\tconst id = object.id || object.uuid || (object['@self'] && object['@self'].id)\n\t\t\t\treturn {\n\t\t\t\t\tid: `${kind.id}:${id}`,\n\t\t\t\t\tkind: kind.id,\n\t\t\t\t\tkindLabel: kind.label,\n\t\t\t\t\ttitle: String(readPath(object, kind.titleField || 'title') ?? object.name ?? id ?? ''),\n\t\t\t\t\tsubtitle: kind.subtitleField ? String(readPath(object, kind.subtitleField) ?? '') : '',\n\t\t\t\t\tstatus: kind.statusField ? String(readPath(object, kind.statusField) ?? '') : '',\n\t\t\t\t\thref: kind.href ? generateUrl(fillRowTemplate(kind.href, { ...object, id })) : '',\n\t\t\t\t\tobject,\n\t\t\t\t}\n\t\t\t}),\n\t\t}\n\t}\n\n\tconst searchFiles = async (axios, kind, term) => {\n\t\tconst res = await axios.get(generateOcsUrl('search/providers/files/search'), {\n\t\t\tparams: { term, limit: kind.limit || 20, format: 'json' },\n\t\t\theaders: { 'OCS-APIRequest': 'true' },\n\t\t})\n\t\tconst entries = (res && res.data && res.data.ocs && res.data.ocs.data && res.data.ocs.data.entries) || []\n\t\treturn {\n\t\t\ttotal: entries.length,\n\t\t\trows: entries.map((entry, index) => ({\n\t\t\t\tid: `${kind.id}:${entry.resourceUrl || index}`,\n\t\t\t\tkind: kind.id,\n\t\t\t\tkindLabel: kind.label,\n\t\t\t\ttitle: entry.title || '',\n\t\t\t\tsubtitle: entry.subline || '',\n\t\t\t\tstatus: '',\n\t\t\t\thref: entry.resourceUrl || '',\n\t\t\t})),\n\t\t}\n\t}\n\n\treturn {\n\t\t/**\n\t\t * Run the search over every kind, in parallel.\n\t\t *\n\t\t * @param {object} cfg The page's source config with the active tab's `kind` merged in.\n\t\t * @return {Promise<void>} Resolves when every kind answered or failed.\n\t\t */\n\t\tload: async (cfg) => {\n\t\t\tstate.kind = cfg && typeof cfg.kind === 'string' ? cfg.kind : 'all'\n\t\t\tconst query = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null\n\t\t\tconst term = String((cfg && cfg.term) || (query && query.get((cfg && cfg.termQuery) || 'q')) || '').trim()\n\t\t\tconst mine = ++seq\n\t\t\tstate.term = term\n\t\t\tif (term === '' || kinds.length === 0) {\n\t\t\t\tstate.rows = []\n\t\t\t\tstate.totals = {}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstate.loading = true\n\t\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\t\tconst answers = await Promise.all(kinds.map((kind) => (kind.files === true ? searchFiles(axios, kind, term) : searchObjects(axios, kind, term)).catch(() => null)))\n\t\t\tif (mine !== seq) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst totals = {}\n\t\t\tconst rows = []\n\t\t\tanswers.forEach((answer, index) => {\n\t\t\t\tif (answer) {\n\t\t\t\t\ttotals[kinds[index].id] = answer.total\n\t\t\t\t\trows.push(...answer.rows)\n\t\t\t\t}\n\t\t\t})\n\t\t\tstate.totals = totals\n\t\t\tstate.rows = rows\n\t\t\tstate.loading = false\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The results of the active kind, or all of them.\n\t\t */\n\t\trows: () => (state.kind === 'all' ? state.rows : state.rows.filter((row) => row.kind === state.kind)),\n\n\t\t/**\n\t\t * @return {boolean} Whether a search is in flight.\n\t\t */\n\t\tloading: () => state.loading,\n\n\t\tcolumns: [\n\t\t\t{ key: 'title', label: t('nextcloud-vue', 'Result'), secondary: 'subtitle' },\n\t\t\t{ key: 'kindLabel', label: t('nextcloud-vue', 'Kind') },\n\t\t\t{ key: 'status', label: t('nextcloud-vue', 'Status') },\n\t\t],\n\n\t\tquickFilters: kinds.length > 0\n\t\t\t? [\n\t\t\t\t\t{ label: t('nextcloud-vue', 'All'), filter: { kind: 'all' }, default: true },\n\t\t\t\t\t...kinds.map((kind) => ({ label: kind.label || kind.id, filter: { kind: kind.id } })),\n\t\t\t\t]\n\t\t\t: null,\n\n\t\t/**\n\t\t * The number on each kind's quick filter: the total each search\n\t\t * reported, and their sum on All.\n\t\t *\n\t\t * @return {Record<number, number>} The counts by tab index.\n\t\t */\n\t\ttabCounts: () => {\n\t\t\tconst counts = { 0: Object.values(state.totals).reduce((sum, value) => sum + value, 0) }\n\t\t\tkinds.forEach((kind, index) => {\n\t\t\t\tif (typeof state.totals[kind.id] === 'number') {\n\t\t\t\t\tcounts[index + 1] = state.totals[kind.id]\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn counts\n\t\t},\n\n\t\t/**\n\t\t * Open a result where it lives.\n\t\t *\n\t\t * @param {object} row The clicked row.\n\t\t * @return {void}\n\t\t */\n\t\topenRow: (row) => {\n\t\t\tif (row && row.href) {\n\t\t\t\twindow.location.assign(row.href)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {object} row A row.\n\t\t * @return {string|null} The URL the row opens, for a new tab.\n\t\t */\n\t\trowTarget: (row) => (row && row.href) || null,\n\t}\n}\n\n/**\n * The users source: the members of a Nextcloud group, with their function,\n * roles, e-mail and whether they are in today (`entitySource: \"users\"`,\n * DqAfdelingen). Pair it with `folderSidebar: { source: 'groups',\n * filterField: 'group' }`, which lists the groups as the folder tree; the\n * selected group arrives as `group`. `sourceConfig.group` is the group shown\n * before one is picked.\n *\n * Today is the dav app's out-of-office period when one runs now (\"Absent\n * until 14 Oct\"), else the user status (present, away) and its message. The\n * function is the profile `headline`, the roles the profile `role`, unless\n * `sourceConfig.functionField` / `rolesField` name other user fields.\n * Listing a group needs an admin or the group's sub-admin; a refused request\n * leaves the list empty.\n *\n * @return {object} The source adapter.\n * @spec openspec/changes/index-groups-users-source/specs/index-page/spec.md#requirement-an-index-page-can-list-nextcloud-groups-and-their-members\n */\nfunction usersSource() {\n\tconst state = reactive({ rows: [], loading: false })\n\tlet seq = 0\n\tconst presenceLabels = {\n\t\tpresent: t('nextcloud-vue', 'Present'),\n\t\taway: t('nextcloud-vue', 'Away'),\n\t}\n\tconst presenceColors = {\n\t\t[presenceLabels.present]: 'success',\n\t\t[presenceLabels.away]: 'info',\n\t}\n\n\treturn {\n\t\t/**\n\t\t * Load the group's members and their presence.\n\t\t *\n\t\t * @param {object} config The page's source config with the picked `group`.\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tconst group = String((config && (config.group || config.defaultGroup)) || '')\n\t\t\tconst mine = ++seq\n\t\t\tif (group === '') {\n\t\t\t\tstate.rows = []\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstate.loading = true\n\t\t\ttry {\n\t\t\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\t\t\tconst [members, statuses] = await Promise.all([fetchGroupMembers(axios, group), fetchStatuses(axios)])\n\t\t\t\tconst functionField = (config && config.functionField) || 'headline'\n\t\t\t\tconst rolesField = (config && config.rolesField) || 'role'\n\t\t\t\tconst rows = await Promise.all(members.map(async (user) => {\n\t\t\t\t\tconst presence = await fetchPresence(axios, user.id, statuses[user.id] || null)\n\t\t\t\t\tlet today = ''\n\t\t\t\t\tif (presence.state === 'absent') {\n\t\t\t\t\t\tconst until = presence.until ? new Date(`${presence.until}T12:00:00`) : null\n\t\t\t\t\t\ttoday = until\n\t\t\t\t\t\t\t? t('nextcloud-vue', 'Absent until {date}', { date: until.toLocaleDateString(getCanonicalLocale() || undefined, { day: 'numeric', month: 'short' }) })\n\t\t\t\t\t\t\t: t('nextcloud-vue', 'Absent')\n\t\t\t\t\t} else if (presence.message) {\n\t\t\t\t\t\ttoday = presence.message\n\t\t\t\t\t} else if (presenceLabels[presence.state]) {\n\t\t\t\t\t\ttoday = presenceLabels[presence.state]\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: user.id,\n\t\t\t\t\t\tdisplayname: user.displayname || user['display-name'] || user.id,\n\t\t\t\t\t\tfunction: String(user[functionField] || ''),\n\t\t\t\t\t\troles: String(user[rolesField] || ''),\n\t\t\t\t\t\temail: user.email || '',\n\t\t\t\t\t\ttoday,\n\t\t\t\t\t\tpresence: presence.state,\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.rows = rows.sort((a, b) => a.displayname.localeCompare(b.displayname))\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.rows = []\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t} finally {\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\tstate.loading = false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The members.\n\t\t */\n\t\trows: () => state.rows,\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => state.loading,\n\n\t\tcolumns: [\n\t\t\t{ key: 'displayname', label: t('nextcloud-vue', 'Employee'), secondary: 'function' },\n\t\t\t{ key: 'roles', label: t('nextcloud-vue', 'Roles') },\n\t\t\t{ key: 'email', label: t('nextcloud-vue', 'E-mail') },\n\t\t\t{ key: 'today', label: t('nextcloud-vue', 'Today'), widget: 'badge', widgetProps: { colorMap: presenceColors, variant: 'warning' } },\n\t\t],\n\n\t\tsearchFields: {\n\t\t\tgroup: { param: 'group', single: true },\n\t\t},\n\n\t\tshowAdd: false,\n\t}\n}\n\n/**\n * The organisations source: OpenRegister organisations, which are not\n * register/schema objects.\n *\n * The list is the viewer's own organisations and the single read refuses an\n * organisation the viewer has no access to; both are decided by OpenRegister\n * from the session. The adapter forwards nothing that could widen that.\n *\n * It is a RECORD source as well (`loadRecord` + `record`), so a\n * `type: \"detail\"` page with the same `entitySource` shows one organisation\n * with the header, pills, facts and `@objectId` / `@object.*` tokens an object\n * page has.\n *\n * @return {object} The source adapter.\n * @spec openspec/changes/organisations-entity-source/specs/organisations-entity-source/spec.md\n */\nfunction organisationsSource() {\n\tconst store = useOrganisationStore()\n\n\tconst statusLabels = {\n\t\tprovisioning: t('nextcloud-vue', 'Provisioning'),\n\t\tactive: t('nextcloud-vue', 'Active'),\n\t\tsuspended: t('nextcloud-vue', 'Suspended'),\n\t\tdeprovisioning: t('nextcloud-vue', 'Deprovisioning'),\n\t\tarchived: t('nextcloud-vue', 'Archived'),\n\t\tretained: t('nextcloud-vue', 'Retained'),\n\t}\n\n\treturn {\n\t\tstore,\n\n\t\t/**\n\t\t * Load the viewer's organisations. The endpoint takes no parameters.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when loaded.\n\t\t */\n\t\tload: () => store.load(),\n\n\t\t/**\n\t\t * @return {Array<object>} The rows, keyed on the organisation uuid.\n\t\t */\n\t\trows: () => (store.organisations || []).map(organisationRecord),\n\n\t\t/**\n\t\t * @return {boolean} Whether a load is in flight.\n\t\t */\n\t\tloading: () => !!store.loading,\n\n\t\t/**\n\t\t * Read one organisation for a detail page.\n\t\t *\n\t\t * @param {string} id The organisation uuid.\n\t\t * @return {Promise<object|null>} The organisation, or null when it could not be read.\n\t\t */\n\t\tloadRecord: (id) => store.fetchRecord(id),\n\n\t\t/**\n\t\t * @param {string} id The organisation uuid.\n\t\t * @return {object|null} The organisation read for this id, keyed on its uuid, or null.\n\t\t */\n\t\trecord: (id) => {\n\t\t\tconst organisation = store.records?.[String(id)]\n\t\t\treturn organisation ? organisationRecord(organisation) : null\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id The organisation uuid.\n\t\t * @return {number|null} The HTTP status of a failed read of this id, or null.\n\t\t */\n\t\trecordError: (id) => store.recordErrors?.[String(id)] ?? null,\n\n\t\tcolumns: [\n\t\t\t{ key: 'name', label: t('nextcloud-vue', 'Name') },\n\t\t\t{\n\t\t\t\tkey: 'status',\n\t\t\t\tlabel: t('nextcloud-vue', 'Status'),\n\t\t\t\tenum: Object.keys(statusLabels),\n\t\t\t\tenumLabels: statusLabels,\n\t\t\t\tcolorMap: { active: 'success', provisioning: 'info', suspended: 'warning', deprovisioning: 'error', archived: 'default', retained: 'default' },\n\t\t\t},\n\t\t\t{ key: 'type', label: t('nextcloud-vue', 'Type') },\n\t\t\t{ key: 'created', label: t('nextcloud-vue', 'Created'), type: 'string', format: 'date-time' },\n\t\t],\n\n\t\t// Creating an organisation is not the index's object form, and\n\t\t// OpenRegister has no delete for one, so neither action is offered.\n\t\tshowAdd: false,\n\t\ttitle: t('nextcloud-vue', 'Organisations'),\n\t}\n}\n\n/**\n * The registered sources, by the name a manifest uses.\n *\n * @type {Record<string, () => object>}\n */\nexport { flowRunStatuses }\n\nexport const indexSources = {\n\tflows: flowsSource,\n\tflowRuns: flowRunsSource,\n\ttasks: tasksSource,\n\tendpoint: endpointSource,\n\tsearch: searchSource,\n\tusers: usersSource,\n\torganisations: organisationsSource,\n}\n\n/**\n * Resolve a named source.\n *\n * Returns null for an unknown name rather than throwing, and the caller warns:\n * a typo in a manifest should degrade to the ordinary empty index with a\n * console message naming the source, not white-screen the app. It must NOT\n * silently render an empty list with no explanation, because that is\n * indistinguishable from a source that genuinely has no rows.\n *\n * @param {string} name The source name from `config.source`.\n * @param {object} [config] The page's source config, for a source that builds its tabs from it.\n *\n * @return {object|null} The adapter, or null when the name is not registered.\n */\nexport function resolveIndexSource(name, config) {\n\tconst key = String(name || '')\n\tif (!key) {\n\t\treturn null\n\t}\n\n\tconst factory = indexSources[key]\n\tif (typeof factory !== 'function') {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(`[CnIndexPage] Unknown index source \"${key}\" — known sources: ${Object.keys(indexSources).join(', ')}. The list will be empty.`)\n\t\treturn null\n\t}\n\n\treturn factory(config || {})\n}\n\n/**\n * Resolve a named source for ONE record, for a `type: \"detail\"` page.\n *\n * The same registry as the index: a source that can also read a single record\n * supplies `loadRecord(id)` and `record(id)`, and the detail page names it with\n * the same `entitySource`. A name that is unknown, or a source that cannot read\n * one record, resolves to null with a console warning, and the page shows no\n * record rather than the wrong one.\n *\n * @param {string} name The source name from `config.entitySource`.\n * @return {object|null} The adapter, or null.\n * @spec openspec/changes/organisations-entity-source/specs/organisations-entity-source/spec.md\n */\nexport function resolveRecordSource(name) {\n\tconst key = String(name || '')\n\tif (!key) {\n\t\treturn null\n\t}\n\tconst factory = indexSources[key]\n\tconst source = typeof factory === 'function' ? factory() : null\n\tif (!source || typeof source.loadRecord !== 'function' || typeof source.record !== 'function') {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(`[CnDetailPage] entitySource \"${key}\" is not a source that reads one record. The page shows no record.`)\n\t\treturn null\n\t}\n\treturn source\n}\n"],"names":["t"],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import axios__default from '@nextcloud/axios';
2
+ import { generateUrl } from '@nextcloud/router';
3
+ import { defineStore } from 'pinia';
4
+
5
+ /**
6
+ * SPDX-License-Identifier: EUPL-1.2
7
+ * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>
8
+ */
9
+
10
+
11
+ /**
12
+ * OpenRegister's organisation endpoints, behind the `organisations` entity source.
13
+ *
14
+ * An organisation is not a register/schema object, so the object store cannot
15
+ * read it. Both reads answer from the session: the list holds only the
16
+ * organisations the viewer belongs to, and one organisation answers 403 when
17
+ * the viewer has no access to it. This store adds no check of its own and
18
+ * skips none.
19
+ *
20
+ * @type {string}
21
+ */
22
+ const ORGANISATIONS_URL = '/apps/openregister/api/organisations';
23
+
24
+ /**
25
+ * One organisation as a row or a record: the organisation as OpenRegister
26
+ * serialises it, with `id` set to its uuid. An OpenRegister object's `id` is
27
+ * its uuid as well, so `@object.id`, a row route and the page's `objectId`
28
+ * all name the same thing. The numeric database id stays out of sight.
29
+ *
30
+ * @param {object} organisation The organisation from the endpoint.
31
+ * @return {object} The organisation keyed on its uuid.
32
+ */
33
+ function organisationRecord(organisation) {
34
+ return { ...organisation, id: organisation?.uuid ?? organisation?.id ?? null }
35
+ }
36
+
37
+ /**
38
+ * The organisations store.
39
+ *
40
+ * @spec openspec/changes/organisations-entity-source/specs/organisations-entity-source/spec.md
41
+ */
42
+ const useOrganisationStore = defineStore('cnOrganisations', {
43
+ state: () => ({
44
+ /** @type {Array<object>} The viewer's organisations, as the list endpoint returned them. */
45
+ organisations: [],
46
+ /** @type {boolean} Whether the list load is in flight. */
47
+ loading: false,
48
+ /** @type {string|null} The last list failure, for the console trail. */
49
+ error: null,
50
+ /** @type {Record<string, object>} Single organisations read so far, by uuid. */
51
+ records: {},
52
+ /** @type {Record<string, number|null>} The HTTP status of a failed single read, by uuid. */
53
+ recordErrors: {},
54
+ }),
55
+
56
+ actions: {
57
+ /**
58
+ * Load the viewer's organisations. The endpoint takes no parameters and
59
+ * returns every organisation the viewer belongs to in one response.
60
+ *
61
+ * @return {Promise<void>} Resolves when the rows are in the store.
62
+ */
63
+ async load() {
64
+ this.loading = true;
65
+ this.error = null;
66
+ try {
67
+ const response = await axios__default.get(generateUrl(ORGANISATIONS_URL));
68
+ this.organisations = Array.isArray(response.data?.results) ? response.data.results : [];
69
+ } catch (error) {
70
+ this.error = error?.message || String(error);
71
+ this.organisations = [];
72
+ // eslint-disable-next-line no-console
73
+ console.error('[useOrganisationStore] Loading the organisations failed', error);
74
+ } finally {
75
+ this.loading = false;
76
+ }
77
+ },
78
+
79
+ /**
80
+ * Read one organisation into `records`. A refusal (403) or a missing
81
+ * organisation (404) leaves no record and keeps the status in
82
+ * `recordErrors`, so the page can tell "not found" from "still loading".
83
+ *
84
+ * @param {string} uuid The organisation uuid.
85
+ * @return {Promise<object|null>} The organisation, or null when it could not be read.
86
+ */
87
+ async fetchRecord(uuid) {
88
+ const key = String(uuid || '');
89
+ if (key === '') {
90
+ return null
91
+ }
92
+ try {
93
+ const response = await axios__default.get(generateUrl(`${ORGANISATIONS_URL}/${encodeURIComponent(key)}`));
94
+ const organisation = response.data?.organisation || null;
95
+ const { [key]: dropped, ...errors } = this.recordErrors;
96
+ this.recordErrors = errors;
97
+ if (!organisation) {
98
+ return null
99
+ }
100
+ this.records = { ...this.records, [key]: organisation };
101
+ return organisation
102
+ } catch (error) {
103
+ const { [key]: dropped, ...records } = this.records;
104
+ this.records = records;
105
+ this.recordErrors = { ...this.recordErrors, [key]: error?.response?.status ?? null };
106
+ // eslint-disable-next-line no-console
107
+ console.error(`[useOrganisationStore] Loading organisation "${key}" failed`, error);
108
+ return null
109
+ }
110
+ },
111
+ },
112
+ });
113
+
114
+ export { ORGANISATIONS_URL, organisationRecord, useOrganisationStore };
115
+ //# sourceMappingURL=useOrganisationStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrganisationStore.js","sources":["../../../src/composables/useOrganisationStore.js"],"sourcesContent":["/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { defineStore } from 'pinia'\n\n/**\n * OpenRegister's organisation endpoints, behind the `organisations` entity source.\n *\n * An organisation is not a register/schema object, so the object store cannot\n * read it. Both reads answer from the session: the list holds only the\n * organisations the viewer belongs to, and one organisation answers 403 when\n * the viewer has no access to it. This store adds no check of its own and\n * skips none.\n *\n * @type {string}\n */\nexport const ORGANISATIONS_URL = '/apps/openregister/api/organisations'\n\n/**\n * One organisation as a row or a record: the organisation as OpenRegister\n * serialises it, with `id` set to its uuid. An OpenRegister object's `id` is\n * its uuid as well, so `@object.id`, a row route and the page's `objectId`\n * all name the same thing. The numeric database id stays out of sight.\n *\n * @param {object} organisation The organisation from the endpoint.\n * @return {object} The organisation keyed on its uuid.\n */\nexport function organisationRecord(organisation) {\n\treturn { ...organisation, id: organisation?.uuid ?? organisation?.id ?? null }\n}\n\n/**\n * The organisations store.\n *\n * @spec openspec/changes/organisations-entity-source/specs/organisations-entity-source/spec.md\n */\nexport const useOrganisationStore = defineStore('cnOrganisations', {\n\tstate: () => ({\n\t\t/** @type {Array<object>} The viewer's organisations, as the list endpoint returned them. */\n\t\torganisations: [],\n\t\t/** @type {boolean} Whether the list load is in flight. */\n\t\tloading: false,\n\t\t/** @type {string|null} The last list failure, for the console trail. */\n\t\terror: null,\n\t\t/** @type {Record<string, object>} Single organisations read so far, by uuid. */\n\t\trecords: {},\n\t\t/** @type {Record<string, number|null>} The HTTP status of a failed single read, by uuid. */\n\t\trecordErrors: {},\n\t}),\n\n\tactions: {\n\t\t/**\n\t\t * Load the viewer's organisations. The endpoint takes no parameters and\n\t\t * returns every organisation the viewer belongs to in one response.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when the rows are in the store.\n\t\t */\n\t\tasync load() {\n\t\t\tthis.loading = true\n\t\t\tthis.error = null\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(ORGANISATIONS_URL))\n\t\t\t\tthis.organisations = Array.isArray(response.data?.results) ? response.data.results : []\n\t\t\t} catch (error) {\n\t\t\t\tthis.error = error?.message || String(error)\n\t\t\t\tthis.organisations = []\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[useOrganisationStore] Loading the organisations failed', error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read one organisation into `records`. A refusal (403) or a missing\n\t\t * organisation (404) leaves no record and keeps the status in\n\t\t * `recordErrors`, so the page can tell \"not found\" from \"still loading\".\n\t\t *\n\t\t * @param {string} uuid The organisation uuid.\n\t\t * @return {Promise<object|null>} The organisation, or null when it could not be read.\n\t\t */\n\t\tasync fetchRecord(uuid) {\n\t\t\tconst key = String(uuid || '')\n\t\t\tif (key === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(`${ORGANISATIONS_URL}/${encodeURIComponent(key)}`))\n\t\t\t\tconst organisation = response.data?.organisation || null\n\t\t\t\tconst { [key]: dropped, ...errors } = this.recordErrors\n\t\t\t\tthis.recordErrors = errors\n\t\t\t\tif (!organisation) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tthis.records = { ...this.records, [key]: organisation }\n\t\t\t\treturn organisation\n\t\t\t} catch (error) {\n\t\t\t\tconst { [key]: dropped, ...records } = this.records\n\t\t\t\tthis.records = records\n\t\t\t\tthis.recordErrors = { ...this.recordErrors, [key]: error?.response?.status ?? null }\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(`[useOrganisationStore] Loading organisation \"${key}\" failed`, error)\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\t},\n})\n"],"names":["axios"],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -77,6 +77,7 @@ export { default as CnCellRenderer } from './components/CnCellRenderer/CnCellRen
77
77
  export { default as CnChartWidget } from './components/CnChartWidget/CnChartWidget.vue.js';
78
78
  export { default as CnChartWidgetForm } from './components/CnChartWidgetForm/CnChartWidgetForm.vue.js';
79
79
  export { default as CnChatPage } from './components/CnChatPage/CnChatPage.vue.js';
80
+ export { default as CnChecklistRunWidget } from './components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js';
80
81
  export { default as CnChildRecordsField } from './components/CnChildRecordsField/CnChildRecordsField.vue.js';
81
82
  export { default as CnChipsFieldWidget } from './components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js';
82
83
  export { default as CnChoiceCards } from './components/CnChoiceCards/CnChoiceCards.vue.js';
@@ -254,6 +255,7 @@ export { default as CnObjectPresenceWidget } from './components/CnObjectPresence
254
255
  export { default as CnObjectRow } from './components/CnObjectRow/CnObjectRow.vue.js';
255
256
  export { default as CnObjectSidebar } from './components/CnObjectSidebar/CnObjectSidebar.vue.js';
256
257
  export { default as CnOfflineQueue } from './components/CnOfflineQueue/CnOfflineQueue.vue.js';
258
+ export { default as CnOrderedListField } from './components/CnOrderedListField/CnOrderedListField.vue.js';
257
259
  export { default as CnPageHeader } from './components/CnPageHeader/CnPageHeader.vue.js';
258
260
  export { default as CnPageRenderer } from './components/CnPageRenderer/CnPageRenderer.vue.js';
259
261
  export { default as CnPagination } from './components/CnPagination/CnPagination.vue.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1144,6 +1144,8 @@ var translations = {
1144
1144
  "Due tomorrow": "Due tomorrow",
1145
1145
  "Due in {days} days": "Due in {days} days",
1146
1146
  Available: "Available",
1147
+ "{value} of {limit}": "{value} of {limit}",
1148
+ "{value} of {limit}, over the limit": "{value} of {limit}, over the limit",
1147
1149
  "Ready to claim": "Ready to claim",
1148
1150
  "In progress": "In progress",
1149
1151
  Completed: "Completed",
@@ -1583,7 +1585,25 @@ var translations = {
1583
1585
  "{s} s": "{s} s",
1584
1586
  "About this {app} installation.": "About this {app} installation.",
1585
1587
  "{version}, up to date": "{version}, up to date",
1586
- "for an SLA": "for an SLA"
1588
+ "for an SLA": "for an SLA",
1589
+ "About {name}": "About {name}",
1590
+ "Sent message": "Sent message",
1591
+ "Received message": "Received message",
1592
+ "Loading messages…": "Loading messages…",
1593
+ "Move {item} up": "Move {item} up",
1594
+ "Move {item} down": "Move {item} down",
1595
+ "Remove {item}": "Remove {item}",
1596
+ "Nothing added yet.": "Nothing added yet.",
1597
+ "Ordered list": "Ordered list",
1598
+ "{item} moved to position {position} of {total}": "{item} moved to position {position} of {total}",
1599
+ "{item} removed": "{item} removed",
1600
+ "{item} added": "{item} added",
1601
+ Organisations: "Organisations",
1602
+ Provisioning: "Provisioning",
1603
+ Suspended: "Suspended",
1604
+ Deprovisioning: "Deprovisioning",
1605
+ Archived: "Archived",
1606
+ Retained: "Retained"
1587
1607
  };
1588
1608
  var plurals = {
1589
1609
  "{count} selected": [
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1170,6 +1170,8 @@ var translations = {
1170
1170
  "Due tomorrow": "Morgen",
1171
1171
  "Due in {days} days": "Over {days} dagen",
1172
1172
  Available: "Beschikbaar",
1173
+ "{value} of {limit}": "{value} van {limit}",
1174
+ "{value} of {limit}, over the limit": "{value} van {limit}, boven de limiet",
1173
1175
  "Ready to claim": "Klaar om op te pakken",
1174
1176
  "In progress": "In behandeling",
1175
1177
  Completed: "Afgerond",
@@ -1769,7 +1771,40 @@ var translations = {
1769
1771
  "{s} s": "{s} s",
1770
1772
  "About this {app} installation.": "Over deze {app}-installatie.",
1771
1773
  "{version}, up to date": "{version}, bijgewerkt",
1772
- "for an SLA": "voor een SLA"
1774
+ "for an SLA": "voor een SLA",
1775
+ "About {name}": "Over {name}",
1776
+ "Sent message": "Verstuurd bericht",
1777
+ "Received message": "Ontvangen bericht",
1778
+ "Loading messages…": "Berichten laden…",
1779
+ "Move {item} up": "{item} omhoog",
1780
+ "Move {item} down": "{item} omlaag",
1781
+ "Remove {item}": "{item} verwijderen",
1782
+ "Nothing added yet.": "Nog niets toegevoegd.",
1783
+ "Ordered list": "Lijst op volgorde",
1784
+ "{item} moved to position {position} of {total}": "{item} staat nu op plaats {position} van {total}",
1785
+ "{item} removed": "{item} verwijderd",
1786
+ "{item} added": "{item} toegevoegd",
1787
+ "Question {n} of {total}": "Vraag {n} van {total}",
1788
+ "Questions answered": "Beantwoorde vragen",
1789
+ "(required)": "(verplicht)",
1790
+ "Answer this question to go on.": "Beantwoord deze vraag om verder te gaan.",
1791
+ Finish: "Afronden",
1792
+ "Take or add a photo": "Foto maken of toevoegen",
1793
+ "Another photo": "Nog een foto",
1794
+ "Photo for question {n}": "Foto bij vraag {n}",
1795
+ "This checklist has no questions.": "Deze checklist heeft geen vragen.",
1796
+ "The checklist could not be loaded.": "De checklist kon niet worden geladen.",
1797
+ "The answer could not be saved. Try again.": "Het antwoord kon niet worden opgeslagen. Probeer het opnieuw.",
1798
+ "Checklist finished.": "Checklist afgerond.",
1799
+ "Not applicable": "Niet van toepassing",
1800
+ "Answer with a photo.": "Beantwoord met een foto.",
1801
+ "This answer needs a photo. Add one to go on.": "Bij dit antwoord hoort een foto. Voeg er een toe om verder te gaan.",
1802
+ Organisations: "Organisaties",
1803
+ Provisioning: "Wordt ingericht",
1804
+ Suspended: "Opgeschort",
1805
+ Deprovisioning: "Wordt opgeheven",
1806
+ Archived: "Gearchiveerd",
1807
+ Retained: "Bewaard"
1773
1808
  };
1774
1809
  var plurals = {
1775
1810
  "{count} selected": [
@@ -1 +1 @@
1
- {"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}