@conduction/nextcloud-vue 2.135.0 → 2.136.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 (63) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +2 -1
  3. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +65 -50
  5. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  7. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +6 -0
  8. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js +9 -1
  10. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  11. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  12. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  13. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +4 -11
  14. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  15. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +12 -0
  16. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +1 -1
  18. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +11 -0
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +1 -1
  22. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  23. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +3 -1
  24. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -1
  26. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  28. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +18 -0
  29. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  30. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +38 -23
  31. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  32. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js +1 -1
  33. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js.map +1 -1
  34. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js.map +1 -1
  35. package/dist/esm/composables/indexSources.js +69 -3
  36. package/dist/esm/composables/indexSources.js.map +1 -1
  37. package/dist/esm/l10n/en.json.js +20 -20
  38. package/dist/esm/l10n/nl.json.js +21 -21
  39. package/dist/esm/library-style.js +1 -1
  40. package/dist/esm/nextcloud-vue.css +322 -164
  41. package/dist/esm/utils/widgetDispatch.js +3 -1
  42. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  43. package/dist/nextcloud-vue.cjs.js +739 -589
  44. package/dist/nextcloud-vue.cjs.js.map +2 -2
  45. package/dist/nextcloud-vue.css +322 -164
  46. package/l10n/en.json +20 -20
  47. package/l10n/nl.json +21 -21
  48. package/package.json +1 -1
  49. package/src/components/CnActionDialog/CnActionDialog.vue +45 -4
  50. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +15 -0
  51. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +2 -10
  52. package/src/components/CnDataTable/CnDataTable.md +1 -0
  53. package/src/components/CnDataTable/CnDataTable.vue +13 -1
  54. package/src/components/CnDetailPage/CnDetailPage.md +1 -0
  55. package/src/components/CnDetailPage/CnDetailPage.vue +12 -1
  56. package/src/components/CnIndexPage/CnIndexPage.vue +4 -1
  57. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +38 -2
  58. package/src/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue +7 -0
  59. package/src/composables/indexSources.js +69 -3
  60. package/src/css/look-board-detail.css +47 -1
  61. package/src/css/look-board-index.css +26 -1
  62. package/src/css/look-board.css +46 -3
  63. package/src/utils/widgetDispatch.js +3 -1
@@ -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 { 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 Cancel from 'vue-material-design-icons/Cancel.vue'\nimport Check from 'vue-material-design-icons/Check.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 Undo from 'vue-material-design-icons/Undo.vue'\nimport { formatRelativeDate } from '../utils/boardDate.js'\nimport { fetchReferenceObjects } from '../utils/boardReferenceColumns.js'\nimport { fillTemplate } from '../utils/fillTemplate.js'\nimport { FLOW_RUN_ERROR_STATUSES, flowRunStatuses } from '../utils/flowRunStatus.js'\nimport { fetchGroupMembers, fetchPresence, fetchStatuses, fetchUsers } 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 CMMN states in which a task is finished: no verb applies to it any more.\n *\n * @type {string[]}\n */\nconst TASK_TERMINAL_STATES = ['completed', 'terminated', 'disabled']\n\n/**\n * The columns the task inbox sorts by (`TaskController::index` `sort`), by\n * column key: the raw fields and the source's own label columns.\n *\n * @type {{[key: string]: string}}\n */\nconst TASK_SORT_FIELDS = { dueAt: 'dueAt', dueLabel: 'dueAt', priority: 'priority', priorityLabel: 'priority', created: 'created' }\n\n/**\n * The form the tasks source's Edit verb asks with: the task's own fields the\n * engine lets the people working it change, filled from the task.\n *\n * @param {object} task The task.\n * @return {{schema: object, item: object, fieldOverrides: object}} The form.\n * @spec openspec/changes/task-edit-action/specs/record-source-verbs/spec.md#requirement-a-record-source-verb-can-ask-for-values-first\n */\nfunction taskEditForm(task) {\n\tconst due = typeof task.dueAt === 'string' ? task.dueAt.slice(0, 10) : ''\n\treturn {\n\t\tschema: {\n\t\t\ttype: 'object',\n\t\t\trequired: ['title'],\n\t\t\tproperties: {\n\t\t\t\ttitle: { type: 'string', title: t('nextcloud-vue', 'Title') },\n\t\t\t\tdescription: { type: 'string', format: 'textarea', title: t('nextcloud-vue', 'Description') },\n\t\t\t\tdueAt: { type: 'string', format: 'date', title: t('nextcloud-vue', 'Due by') },\n\t\t\t\tpriority: { type: 'string', enum: ['low', 'normal', 'high', 'urgent'], title: t('nextcloud-vue', 'Priority') },\n\t\t\t},\n\t\t},\n\t\titem: { title: task.title || '', description: task.description || '', dueAt: due, priority: task.priority || 'normal' },\n\t\tfieldOverrides: {\n\t\t\tpriority: { enumLabels: { low: t('nextcloud-vue', 'Low'), normal: t('nextcloud-vue', 'Normal'), high: t('nextcloud-vue', 'High'), urgent: t('nextcloud-vue', 'Urgent') } },\n\t\t},\n\t}\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\t/**\n\t * A task with the display fields a list row and a detail page read. Keyed\n\t * on its uuid, the identity of the task contract.\n\t *\n\t * @param {object} task The task as the engine returned it.\n\t * @return {object} The task with `id`, `title` and the labels.\n\t */\n\tconst taskRow = (task) => ({\n\t\t...task,\n\t\tid: task.uuid,\n\t\ttitle: task.displayTitle || task.title || task.uuid,\n\t\tsubjectLabel: (task.subject && task.subject.title) || '',\n\t\tstateLabel: stateLabels[task.state] || String(task.state || ''),\n\t\tpriorityLabel: priorityLabels[task.priority] || String(task.priority || ''),\n\t\tdueLabel: taskDueLabel(task),\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(taskRow),\n\n\t\t/**\n\t\t * Read one task for a detail page (`type: \"detail\"` with\n\t\t * `entitySource: \"tasks\"`).\n\t\t *\n\t\t * @param {string} id The task uuid.\n\t\t * @return {Promise<object|null>} The task, or null when it could not be read.\n\t\t * @spec openspec/changes/tasks-record-source/specs/tasks-record-source/spec.md#requirement-the-tasks-source-reads-one-task\n\t\t */\n\t\tloadRecord: (id) => store.fetchRecord(id),\n\n\t\t/**\n\t\t * @param {string} id The task uuid.\n\t\t * @return {object|null} The task read for this id, with the row's display fields, or null.\n\t\t */\n\t\trecord: (id) => {\n\t\t\tconst task = store.records?.[String(id)]\n\t\t\treturn task ? taskRow(task) : null\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id The task 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\t/**\n\t\t * The lifecycle verbs a detail page offers on this task, read off the\n\t\t * row and never guessed at: claim while nobody holds it, hand back\n\t\t * while somebody does, complete and cancel while it is open. A finished\n\t\t * task offers none. Whether the viewer MAY run one is the engine's\n\t\t * call; it refuses with a message the page shows as-is.\n\t\t *\n\t\t * @param {object|null} task The task on the page.\n\t\t * @return {Array<{id: string, label: string, icon: object, menu: boolean, successMessage?: string}>} The verbs, buttons first.\n\t\t * @spec openspec/changes/record-source-verbs/specs/record-source-verbs/spec.md#requirement-a-record-source-offers-header-verbs\n\t\t */\n\t\tverbs: (task) => {\n\t\t\tif (!task || TASK_TERMINAL_STATES.includes(String(task.state || ''))) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst held = String(task.assignee || '').trim() !== ''\n\t\t\treturn [\n\t\t\t\t{ id: 'complete', label: t('nextcloud-vue', 'Finish'), icon: Check, menu: false, successMessage: t('nextcloud-vue', 'Task completed') },\n\t\t\t\theld\n\t\t\t\t\t? { id: 'unclaim', label: t('nextcloud-vue', 'Hand back'), icon: Undo, menu: false }\n\t\t\t\t\t: { id: 'claim', label: t('nextcloud-vue', 'Pick up'), icon: HandBackRight, menu: false },\n\t\t\t\t{ id: 'edit', label: t('nextcloud-vue', 'Edit'), icon: Pencil, menu: false, successMessage: t('nextcloud-vue', 'Task saved'), form: taskEditForm(task) },\n\t\t\t\t{ id: 'cancel', label: t('nextcloud-vue', 'Cancel task'), icon: Cancel, menu: true },\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * Run a verb on a task and keep the page's record in step.\n\t\t *\n\t\t * @param {string} id The task uuid.\n\t\t * @param {string} verb The verb id.\n\t\t * @param {{url?: string, body?: object}} [options] An app route to post the verb to instead of the engine's; for `edit`, the new values.\n\t\t * @return {Promise<{ok: boolean, record: (object|null), message: string}>} The outcome.\n\t\t */\n\t\trunVerb: (id, verb, options) => (verb === 'edit'\n\t\t\t? store.editRecord(id, options?.body)\n\t\t\t: store.runRecordVerb(id, verb, options || {})),\n\n\t\t/**\n\t\t * Whether this task's checklist can still be ticked: not once it is finished.\n\t\t *\n\t\t * @param {object|null} task The task on the page.\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCheckItems: (task) => Boolean(task) && !TASK_TERMINAL_STATES.includes(String(task.state || '')),\n\n\t\t/**\n\t\t * Tick or untick one checklist item through the engine.\n\t\t *\n\t\t * @param {string} id The task uuid.\n\t\t * @param {string} itemId The item id.\n\t\t * @param {boolean} checked The new state.\n\t\t * @return {Promise<{ok: boolean, record: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/record-checklist-widget/specs/record-checklist-widget/spec.md#requirement-a-checklist-widget-ticks-items-through-the-record-source\n\t\t */\n\t\tcheckItem: (id, itemId, checked) => store.checkRecordItem(id, itemId, checked),\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// The inbox pages: the page sends `limit` and `offset` and draws the\n\t\t// pager from the datastore total.\n\t\tpages: true,\n\n\t\t/**\n\t\t * @return {number} The datastore total, independent of the page size.\n\t\t */\n\t\ttotal: () => Number(store.total) || 0,\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 }, sortable: true },\n\t\t\t{ key: 'dueLabel', label: t('nextcloud-vue', 'Due'), sortable: true },\n\t\t\t{ key: 'assignee', label: t('nextcloud-vue', 'Assignee') },\n\t\t],\n\n\t\t/**\n\t\t * The inbox argument a column header's order becomes: the inbox\n\t\t * sorts by deadline, priority or creation, server side, so a sorted\n\t\t * page is the first page of the whole sorted inbox.\n\t\t *\n\t\t * @param {string} key The column key.\n\t\t * @param {string} order `asc` or `desc`.\n\t\t * @return {{sort: string}|null} The parameter, or null for a column the inbox cannot sort by.\n\t\t * @spec openspec/changes/tasks-source-sorts-on-server/specs/index-sources/spec.md#requirement-a-named-source-can-sort-on-the-server\n\t\t */\n\t\tsortParam: (key, order) => {\n\t\t\tconst field = TASK_SORT_FIELDS[key]\n\t\t\treturn field ? { sort: (order === 'desc' ? '-' : '') + field } : null\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// The column headers filter through these same search fields: a column\n\t\t// with a field behind it gets a funnel, the others none.\n\t\theaderFilters: 'searchFields',\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 `sourceConfig` keys the endpoint source reads itself; every other key\n * goes along as a query parameter.\n *\n * @type {Array<string>}\n */\nconst ENDPOINT_SOURCE_KEYS = ['url', 'rowsPath', 'totalPath', 'searchParam', 'searchFields', 'notePath', 'noteText', 'refusedText', 'facets']\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 * A quick filter with `showCount` is counted with `count(config)`: the same\n * request with that tab's filter, its total read at `sourceConfig.totalPath`\n * (`total` by default), else the number of rows the answer holds.\n *\n * Three more keys shape what the page says around the rows:\n * - `searchParam`: the page's search box sends its term as this parameter\n * (`sender`), so the endpoint does the searching.\n * - `notePath` and `noteText`: a value read off the answer (`filterOrder`) and\n * the sentence it is said in (\"Filters run in this order: {order}\", its one\n * placeholder taking the value); a list\n * is joined with commas. Shown above the rows.\n * - `refusedText`: what a refused load (403) says when the endpoint gave no\n * `message` of its own. A refusal is not an empty list, so the page shows it\n * instead of the rows, and a failed load is not one either.\n * - `searchFields`: the filters the endpoint takes, in the same shape a\n * registered source declares them (`{ status: { param: 'status', single:\n * true } }`), so a filter strip or sidebar on the page narrows the\n * endpoint's query.\n * - `facets`: the values the endpoint counts in its answer, offered as a\n * picker after the search (`[{ field, path, label?, allLabel?, labels? }]`,\n * the answer holding `[{ value, count }]` at `path`). A choice is a page\n * filter on `field`, so `searchFields` must declare it.\n *\n * @param {object} [declared] The page's `sourceConfig`, for `searchParam` and `searchFields`.\n * @param {object} [context] The page's helpers; `translate` is the app's catalogue.\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(declared = {}, context = {}) {\n\tconst state = reactive({ rows: [], loading: false, refusal: '', failed: false, note: '', facets: {} })\n\tconst translate = typeof context.translate === 'function' ? context.translate : (text) => text\n\tconst searchParam = typeof declared.searchParam === 'string' && declared.searchParam !== '' ? declared.searchParam : null\n\tconst searchFields = declared.searchFields && typeof declared.searchFields === 'object' && !Array.isArray(declared.searchFields) ? declared.searchFields : null\n\tconst facetDeclarations = Array.isArray(declared.facets)\n\t\t? declared.facets.filter((facet) => facet && typeof facet.field === 'string' && facet.field !== '' && typeof facet.path === 'string' && facet.path !== '')\n\t\t: []\n\tlet seq = 0\n\tlet warned = false\n\n\t/**\n\t * The declared facets read off an answer: `{ <field>: [{ value, count }] }`.\n\t *\n\t * @param {object} body The response body.\n\t * @return {object} The facets.\n\t */\n\tconst facetsOf = (body) => {\n\t\tconst facets = {}\n\t\tfor (const facet of facetDeclarations) {\n\t\t\tconst raw = body && typeof body === 'object' && !Array.isArray(body) ? readRowsPath(body, facet.path) : null\n\t\t\tfacets[facet.field] = Array.isArray(raw)\n\t\t\t\t? raw.filter((entry) => entry && entry.value !== undefined && entry.value !== null && entry.value !== '')\n\t\t\t\t\t\t.map((entry) => ({ value: String(entry.value), count: Number(entry.count) || 0 }))\n\t\t\t\t: []\n\t\t}\n\t\treturn facets\n\t}\n\n\t/**\n\t * The query parameters for a config: every key but the source's own\n\t * (`url`, the paths, the texts), empty values left out, a list joined by\n\t * commas.\n\t *\n\t * @param {object} config The config.\n\t * @return {object} The parameters.\n\t */\n\tconst paramsOf = (config) => {\n\t\tconst params = {}\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (ENDPOINT_SOURCE_KEYS.includes(key) || value === undefined || value === null || value === '') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tparams[key] = Array.isArray(value) ? value.join(',') : (typeof value === 'object' ? JSON.stringify(value) : value)\n\t\t}\n\t\treturn params\n\t}\n\n\t/**\n\t * Whether a config can be requested: it names a url and is not the page\n\t * config handed over in its place.\n\t *\n\t * @param {object} config The config.\n\t * @return {boolean}\n\t */\n\tconst requestable = (config) => {\n\t\tconst url = config && config.url\n\t\treturn typeof url === 'string' && url !== '' && !Object.hasOwn(config, 'entitySource')\n\t}\n\n\t/**\n\t * The note read off an answer, in the page's sentence.\n\t *\n\t * @param {object} body The response body.\n\t * @param {string} [path] Where the value sits.\n\t * @param {string} [text] The sentence, with one `{placeholder}` where the value goes.\n\t * @return {string} The note, or '' when there is nothing to say.\n\t */\n\tconst noteOf = (body, path, text) => {\n\t\tif (!path || !body || typeof body !== 'object' || Array.isArray(body)) {\n\t\t\treturn ''\n\t\t}\n\t\tconst raw = readRowsPath(body, path)\n\t\tconst value = Array.isArray(raw) ? raw.filter((v) => v !== null && v !== undefined && v !== '').join(', ') : (raw === null || raw === undefined ? '' : String(raw))\n\t\tif (value === '') {\n\t\t\treturn ''\n\t\t}\n\t\treturn text ? translate(text).replace(/\\{\\w+\\}/, value) : value\n\t}\n\n\t/**\n\t * The sentence a refused load is said in: the endpoint's own, else the\n\t * page's, else the library's.\n\t *\n\t * @param {object} body The refusal's body.\n\t * @param {string} [text] The page's `refusedText`.\n\t * @return {string} The sentence.\n\t */\n\tconst refusalOf = (body, text) => {\n\t\tif (body && typeof body.message === 'string' && body.message.trim() !== '') {\n\t\t\treturn body.message\n\t\t}\n\t\treturn text ? translate(text) : t('nextcloud-vue', 'You may not read this list.')\n\t}\n\n\treturn {\n\t\t/**\n\t\t * The parameter the page's search term is sent as, or null when this\n\t\t * endpoint takes no search.\n\t\t */\n\t\tsearchParam,\n\n\t\t/**\n\t\t * The page filters this endpoint takes, and the parameter each becomes.\n\t\t */\n\t\tsearchFields,\n\n\t\t/**\n\t\t * The facets the page offers as pickers, as declared.\n\t\t */\n\t\tfacetDeclarations,\n\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 or refused; a failed request leaves no rows and rethrows.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tconst { url, rowsPath, notePath, noteText, refusedText } = config || {}\n\t\t\tconst mine = ++seq\n\t\t\tif (!requestable(config)) {\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 = paramsOf(config)\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\tstate.refusal = ''\n\t\t\t\t\tstate.failed = false\n\t\t\t\t\tstate.note = noteOf(body, notePath, noteText)\n\t\t\t\t\tstate.facets = facetsOf(body)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (mine !== seq) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tstate.rows = []\n\t\t\t\tstate.note = ''\n\t\t\t\tconst refused = error && error.response && error.response.status === 403\n\t\t\t\tstate.refusal = refused ? refusalOf(error.response.data, refusedText) : ''\n\t\t\t\tstate.failed = !refused\n\t\t\t\tif (!refused) {\n\t\t\t\t\tthrow error\n\t\t\t\t}\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 * Count the rows for a config without touching the rows on screen, for\n\t\t * a quick-filter tab with `showCount`.\n\t\t *\n\t\t * @param {object} config The page's source config with the tab's filter merged in.\n\t\t * @return {Promise<number>} The total, or NaN when nothing can be requested.\n\t\t */\n\t\tcount: async (config) => {\n\t\t\tif (!requestable(config)) {\n\t\t\t\treturn Number.NaN\n\t\t\t}\n\t\t\tconst { url, rowsPath, totalPath } = config\n\t\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\t\tconst res = await axios.get(generateUrl(url), { params: paramsOf(config) })\n\t\t\tconst body = res ? res.data : null\n\t\t\tconst total = body && typeof body === 'object' && !Array.isArray(body) ? readRowsPath(body, totalPath || 'total') : undefined\n\t\t\tif (typeof total === 'number' && Number.isFinite(total)) {\n\t\t\t\treturn total\n\t\t\t}\n\t\t\tconst rows = Array.isArray(body) ? body : readRowsPath(body, rowsPath || 'results')\n\t\t\treturn Array.isArray(rows) ? rows.length : Number.NaN\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\n\t\t/**\n\t\t * @return {string} The sentence the last load was refused with, or ''.\n\t\t */\n\t\trefusal: () => state.refusal,\n\n\t\t/**\n\t\t * @return {boolean} Whether the last load failed for another reason than a refusal.\n\t\t */\n\t\tfailed: () => state.failed,\n\n\t\t/**\n\t\t * @return {string} The note read off the last answer, or ''.\n\t\t */\n\t\tnote: () => state.note,\n\n\t\t/**\n\t\t * @return {object} The declared facets of the last answer, `{ <field>: [{ value, count }] }`.\n\t\t */\n\t\tfacets: () => state.facets,\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?, statusResolve?, linkedField?, linkedTemplate?, 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 * The kind's `label` goes through the app's translate (the \"Soort\" cell and\n * the quick filters). `statusResolve: { register?, schema, labelField? }`\n * reads `statusField` as a reference and shows the referenced object's label\n * (`labelField`, else `title`, then `name`); the status column is a pill,\n * coloured by `sourceConfig.statusColorMap`. `linkedTemplate` (a field\n * template, \"{case.title}\") or `linkedField` (a path) fills the \"Linked\"\n * column, drawn when a kind declares one; `sourceConfig.linkedLabel` names it.\n * The page's title and count line can name the term as `{term}`, and the\n * count is the active kind's total. Kind, link and status are filterable.\n *\n * @param {object} [config] The page's source config.\n * @param {object} [context] The page's helpers.\n * @param {Function} [context.translate] The app's translate.\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 = {}, context = {}) {\n\tconst translate = typeof context.translate === 'function' ? context.translate : (text) => text\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\t\t.map((kind) => ({ ...kind, label: translate(String(kind.label || kind.id)) }))\n\tconst hasLinked = kinds.some((kind) => kind.linkedTemplate || kind.linkedField)\n\t// The All tab in the app's word when it has one (\"Alles\" in dossiq, as its\n\t// other lists say), else the library's.\n\tconst allLabel = () => {\n\t\tconst own = translate('All')\n\t\treturn own !== 'All' ? own : t('nextcloud-vue', 'All')\n\t}\n\tconst state = reactive({ rows: [], totals: {}, loading: false, kind: 'all', term: '', filters: {} })\n\tlet seq = 0\n\t// Once the page's search box has sent a term, an empty box means no term,\n\t// not the address's `?q=` again.\n\tlet boxUsed = false\n\tconst addressTerm = () => {\n\t\tconst query = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null\n\t\treturn String((query && query.get((config && config.termQuery) || 'q')) || '').trim()\n\t}\n\n\t/**\n\t * The labels of the objects a kind's status points at, by id: the\n\t * referenced schema read once per search.\n\t *\n\t * @param {object} kind The kind with `statusResolve`.\n\t * @return {Promise<Map<string, string>>} Labels by id; empty when it cannot be read.\n\t */\n\tconst statusLabels = async (kind) => {\n\t\tconst resolve = kind.statusResolve\n\t\tif (!resolve || !resolve.schema) {\n\t\t\treturn new Map()\n\t\t}\n\t\tconst objects = await fetchReferenceObjects({ register: resolve.register || kind.register, schema: resolve.schema }).catch(() => [])\n\t\tconst labels = new Map()\n\t\tfor (const object of objects) {\n\t\t\tconst id = object.id || object.uuid || (object['@self'] && object['@self'].id)\n\t\t\tconst label = readPath(object, resolve.labelField || 'title') ?? object.name\n\t\t\tif (id !== undefined && label !== undefined && label !== null) {\n\t\t\t\tlabels.set(String(id), String(label))\n\t\t\t}\n\t\t}\n\t\treturn labels\n\t}\n\n\t/**\n\t * What a row shows in the Linked column.\n\t *\n\t * @param {object} kind The row's kind.\n\t * @param {object} object The found object.\n\t * @return {string}\n\t */\n\t/**\n\t * What one row is, for the Kind column under `kindAsText`: the kind's\n\t * `rowLabel` (a template on the found object, \"{objectType}\"), else the\n\t * kind's label.\n\t *\n\t * @param {object} kind The row's kind.\n\t * @param {object} object The found object or file entry.\n\t * @return {string}\n\t */\n\tconst kindTextOf = (kind, object) => {\n\t\tif (typeof kind.rowLabel === 'string' && kind.rowLabel !== '') {\n\t\t\tconst label = translate(kind.rowLabel)\n\t\t\treturn kind.rowLabel.includes('{') ? (fillTemplate(label, object || {}) || kind.label) : label\n\t\t}\n\t\treturn kind.label\n\t}\n\n\t/**\n\t * What a row shows in the Linked column.\n\t *\n\t * @param {object} kind The row's kind.\n\t * @param {object} object The found object.\n\t * @return {string}\n\t */\n\tconst linkedOf = (kind, object) => {\n\t\tif (kind.linkedTemplate) {\n\t\t\treturn fillTemplate(translate(kind.linkedTemplate), object)\n\t\t}\n\t\tif (kind.linkedField) {\n\t\t\tconst value = readPath(object, kind.linkedField)\n\t\t\treturn value === undefined || value === null ? '' : String(value)\n\t\t}\n\t\treturn ''\n\t}\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\tconst labels = kind.statusResolve && kind.statusField ? await statusLabels(kind) : null\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\tconst rawStatus = kind.statusField ? readPath(object, kind.statusField) : undefined\n\t\t\t\tconst status = rawStatus === undefined || rawStatus === null\n\t\t\t\t\t? ''\n\t\t\t\t\t: (labels ? (labels.get(String(rawStatus)) || '') : String(rawStatus))\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\tkindText: kindTextOf(kind, object),\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,\n\t\t\t\t\tlinked: linkedOf(kind, object),\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\tkindText: kindTextOf(kind, entry),\n\t\t\t\ttitle: entry.title || '',\n\t\t\t\tsubtitle: entry.subline || '',\n\t\t\t\tstatus: '',\n\t\t\t\tlinked: '',\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\t// The header filters on Kind, Linked and Status narrow the answer\n\t\t\t// already fetched; they do not search again.\n\t\t\tconst filters = {}\n\t\t\tfor (const key of ['kindLabel', 'kindText', 'linked', 'status']) {\n\t\t\t\tconst value = cfg && cfg[key]\n\t\t\t\tconst values = (Array.isArray(value) ? value : (value === undefined || value === null || value === '' ? [] : [value])).map(String)\n\t\t\t\tif (values.length > 0) {\n\t\t\t\t\tfilters[key] = values\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.filters = filters\n\t\t\tconst typed = cfg && typeof cfg.searchTerm === 'string' ? cfg.searchTerm.trim() : ''\n\t\t\tboxUsed = boxUsed || typed !== ''\n\t\t\tconst term = typed || (boxUsed ? '' : String((cfg && cfg.term) || addressTerm()).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\t\t\t.filter((row) => Object.entries(state.filters).every(([key, values]) => values.includes(String(row[key])))),\n\n\t\t/**\n\t\t * @return {string} The term searched for, for a `{term}` in the title or count line.\n\t\t */\n\t\tterm: () => state.term,\n\n\t\t// The page's search box searches again, and starts out holding the\n\t\t// term from the address; the term shows as a removable chip.\n\t\tsearchParam: 'searchTerm',\n\t\tinitialSearch: () => String((config && config.term) || addressTerm()).trim(),\n\t\tsearchChip: true,\n\n\t\t/**\n\t\t * @return {number} The active kind's total, or every kind's together on All.\n\t\t */\n\t\ttotal: () => (state.kind === 'all'\n\t\t\t? Object.values(state.totals).reduce((sum, value) => sum + value, 0)\n\t\t\t: (state.totals[state.kind] || 0)),\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', sortable: true },\n\t\t\t// `kindAsText`: what one row is, as plain text (\"Zaak\", \"Lantaarnpaal\",\n\t\t\t// DqZoekresultaten), instead of the plural kind as a pill.\n\t\t\tconfig && config.kindAsText === true\n\t\t\t\t? { key: 'kindText', label: t('nextcloud-vue', 'Kind'), sortable: true }\n\t\t\t\t: { key: 'kindLabel', label: t('nextcloud-vue', 'Kind'), enum: kinds.map((kind) => kind.label), sortable: true },\n\t\t\t...(hasLinked ? [{ key: 'linked', label: config.linkedLabel ? translate(config.linkedLabel) : t('nextcloud-vue', 'Linked'), sortable: true }] : []),\n\t\t\t{\n\t\t\t\tkey: 'status',\n\t\t\t\tlabel: t('nextcloud-vue', 'Status'),\n\t\t\t\twidget: 'badge',\n\t\t\t\twidgetProps: { colorMap: (config && config.statusColorMap) || {} },\n\t\t\t\tsortable: true,\n\t\t\t},\n\t\t],\n\n\t\t/**\n\t\t * Every column header carries a filter button (DqZoekresultaten); the\n\t\t * filters narrow the answer already fetched (`load`).\n\t\t */\n\t\theaderFilters: true,\n\n\t\t/**\n\t\t * The page orders the rows a header asks for: the answer is one fetch,\n\t\t * so there is nothing to ask the servers again.\n\t\t */\n\t\tsortsRows: true,\n\n\t\tquickFilters: kinds.length > 0\n\t\t\t? [\n\t\t\t\t\t{ label: allLabel(), 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; without one, All lists every user the reader may\n * list (all users for an admin, their groups' users for a sub-admin).\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\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([\n\t\t\t\t\tgroup === '' ? fetchUsers(axios, { limit: (config && config.limit) || 500 }) : fetchGroupMembers(axios, group),\n\t\t\t\t\tfetchStatuses(axios),\n\t\t\t\t])\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 * @param {object} [context] The page's helpers a source may use, such as `translate` (the app's catalogue).\n *\n * @return {object|null} The adapter, or null when the name is not registered.\n */\nexport function resolveIndexSource(name, config, context) {\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 || {}, context || {})\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","translate"],"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 Cancel from 'vue-material-design-icons/Cancel.vue'\nimport Check from 'vue-material-design-icons/Check.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 Undo from 'vue-material-design-icons/Undo.vue'\nimport { formatRelativeDate } from '../utils/boardDate.js'\nimport { fetchReferenceObjects } from '../utils/boardReferenceColumns.js'\nimport { fillTemplate } from '../utils/fillTemplate.js'\nimport { FLOW_RUN_ERROR_STATUSES, flowRunStatuses } from '../utils/flowRunStatus.js'\nimport { fetchGroupMembers, fetchPresence, fetchStatuses, fetchUsers } 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 CMMN states in which a task is finished: no verb applies to it any more.\n *\n * @type {string[]}\n */\nconst TASK_TERMINAL_STATES = ['completed', 'terminated', 'disabled']\n\n/**\n * The columns the task inbox sorts by (`TaskController::index` `sort`), by\n * column key: the raw fields and the source's own label columns.\n *\n * @type {{[key: string]: string}}\n */\nconst TASK_SORT_FIELDS = { dueAt: 'dueAt', dueLabel: 'dueAt', priority: 'priority', priorityLabel: 'priority', created: 'created' }\n\n/**\n * The form the tasks source's Edit verb asks with: the task's own fields the\n * engine lets the people working it change, filled from the task.\n *\n * @param {object} task The task.\n * @return {{schema: object, item: object, fieldOverrides: object}} The form.\n * @spec openspec/changes/task-edit-action/specs/record-source-verbs/spec.md#requirement-a-record-source-verb-can-ask-for-values-first\n */\nfunction taskEditForm(task) {\n\tconst due = typeof task.dueAt === 'string' ? task.dueAt.slice(0, 10) : ''\n\treturn {\n\t\tschema: {\n\t\t\ttype: 'object',\n\t\t\trequired: ['title'],\n\t\t\tproperties: {\n\t\t\t\ttitle: { type: 'string', title: t('nextcloud-vue', 'Title') },\n\t\t\t\tdescription: { type: 'string', format: 'textarea', title: t('nextcloud-vue', 'Description') },\n\t\t\t\tdueAt: { type: 'string', format: 'date', title: t('nextcloud-vue', 'Due by') },\n\t\t\t\tpriority: { type: 'string', enum: ['low', 'normal', 'high', 'urgent'], title: t('nextcloud-vue', 'Priority') },\n\t\t\t},\n\t\t},\n\t\titem: { title: task.title || '', description: task.description || '', dueAt: due, priority: task.priority || 'normal' },\n\t\tfieldOverrides: {\n\t\t\tpriority: { enumLabels: { low: t('nextcloud-vue', 'Low'), normal: t('nextcloud-vue', 'Normal'), high: t('nextcloud-vue', 'High'), urgent: t('nextcloud-vue', 'Urgent') } },\n\t\t},\n\t}\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\t/**\n\t * A task with the display fields a list row and a detail page read. Keyed\n\t * on its uuid, the identity of the task contract.\n\t *\n\t * @param {object} task The task as the engine returned it.\n\t * @return {object} The task with `id`, `title` and the labels.\n\t */\n\tconst taskRow = (task) => ({\n\t\t...task,\n\t\tid: task.uuid,\n\t\ttitle: task.displayTitle || task.title || task.uuid,\n\t\tsubjectLabel: (task.subject && task.subject.title) || '',\n\t\tstateLabel: stateLabels[task.state] || String(task.state || ''),\n\t\tpriorityLabel: priorityLabels[task.priority] || String(task.priority || ''),\n\t\tdueLabel: taskDueLabel(task),\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(taskRow),\n\n\t\t/**\n\t\t * Read one task for a detail page (`type: \"detail\"` with\n\t\t * `entitySource: \"tasks\"`).\n\t\t *\n\t\t * @param {string} id The task uuid.\n\t\t * @return {Promise<object|null>} The task, or null when it could not be read.\n\t\t * @spec openspec/changes/tasks-record-source/specs/tasks-record-source/spec.md#requirement-the-tasks-source-reads-one-task\n\t\t */\n\t\tloadRecord: (id) => store.fetchRecord(id),\n\n\t\t/**\n\t\t * @param {string} id The task uuid.\n\t\t * @return {object|null} The task read for this id, with the row's display fields, or null.\n\t\t */\n\t\trecord: (id) => {\n\t\t\tconst task = store.records?.[String(id)]\n\t\t\treturn task ? taskRow(task) : null\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id The task 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\t/**\n\t\t * The lifecycle verbs a detail page offers on this task, read off the\n\t\t * row and never guessed at: claim while nobody holds it, hand back\n\t\t * while somebody does, complete and cancel while it is open. A finished\n\t\t * task offers none. Whether the viewer MAY run one is the engine's\n\t\t * call; it refuses with a message the page shows as-is.\n\t\t *\n\t\t * @param {object|null} task The task on the page.\n\t\t * @return {Array<{id: string, label: string, icon: object, menu: boolean, successMessage?: string}>} The verbs, buttons first.\n\t\t * @spec openspec/changes/record-source-verbs/specs/record-source-verbs/spec.md#requirement-a-record-source-offers-header-verbs\n\t\t */\n\t\tverbs: (task) => {\n\t\t\tif (!task || TASK_TERMINAL_STATES.includes(String(task.state || ''))) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst held = String(task.assignee || '').trim() !== ''\n\t\t\treturn [\n\t\t\t\t{ id: 'complete', label: t('nextcloud-vue', 'Finish'), icon: Check, menu: false, successMessage: t('nextcloud-vue', 'Task completed') },\n\t\t\t\theld\n\t\t\t\t\t? { id: 'unclaim', label: t('nextcloud-vue', 'Hand back'), icon: Undo, menu: false }\n\t\t\t\t\t: { id: 'claim', label: t('nextcloud-vue', 'Pick up'), icon: HandBackRight, menu: false },\n\t\t\t\t{ id: 'edit', label: t('nextcloud-vue', 'Edit'), icon: Pencil, menu: false, successMessage: t('nextcloud-vue', 'Task saved'), form: taskEditForm(task) },\n\t\t\t\t{ id: 'cancel', label: t('nextcloud-vue', 'Cancel task'), icon: Cancel, menu: true },\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * Run a verb on a task and keep the page's record in step.\n\t\t *\n\t\t * @param {string} id The task uuid.\n\t\t * @param {string} verb The verb id.\n\t\t * @param {{url?: string, body?: object}} [options] An app route to post the verb to instead of the engine's; for `edit`, the new values.\n\t\t * @return {Promise<{ok: boolean, record: (object|null), message: string}>} The outcome.\n\t\t */\n\t\trunVerb: (id, verb, options) => (verb === 'edit'\n\t\t\t? store.editRecord(id, options?.body)\n\t\t\t: store.runRecordVerb(id, verb, options || {})),\n\n\t\t/**\n\t\t * Whether this task's checklist can still be ticked: not once it is finished.\n\t\t *\n\t\t * @param {object|null} task The task on the page.\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCheckItems: (task) => Boolean(task) && !TASK_TERMINAL_STATES.includes(String(task.state || '')),\n\n\t\t/**\n\t\t * Tick or untick one checklist item through the engine.\n\t\t *\n\t\t * @param {string} id The task uuid.\n\t\t * @param {string} itemId The item id.\n\t\t * @param {boolean} checked The new state.\n\t\t * @return {Promise<{ok: boolean, record: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/record-checklist-widget/specs/record-checklist-widget/spec.md#requirement-a-checklist-widget-ticks-items-through-the-record-source\n\t\t */\n\t\tcheckItem: (id, itemId, checked) => store.checkRecordItem(id, itemId, checked),\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// The inbox pages: the page sends `limit` and `offset` and draws the\n\t\t// pager from the datastore total.\n\t\tpages: true,\n\n\t\t/**\n\t\t * @return {number} The datastore total, independent of the page size.\n\t\t */\n\t\ttotal: () => Number(store.total) || 0,\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 }, sortable: true },\n\t\t\t{ key: 'dueLabel', label: t('nextcloud-vue', 'Due'), sortable: true },\n\t\t\t{ key: 'assignee', label: t('nextcloud-vue', 'Assignee') },\n\t\t],\n\n\t\t/**\n\t\t * The inbox argument a column header's order becomes: the inbox\n\t\t * sorts by deadline, priority or creation, server side, so a sorted\n\t\t * page is the first page of the whole sorted inbox.\n\t\t *\n\t\t * @param {string} key The column key.\n\t\t * @param {string} order `asc` or `desc`.\n\t\t * @return {{sort: string}|null} The parameter, or null for a column the inbox cannot sort by.\n\t\t * @spec openspec/changes/tasks-source-sorts-on-server/specs/index-sources/spec.md#requirement-a-named-source-can-sort-on-the-server\n\t\t */\n\t\tsortParam: (key, order) => {\n\t\t\tconst field = TASK_SORT_FIELDS[key]\n\t\t\treturn field ? { sort: (order === 'desc' ? '-' : '') + field } : null\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// The column headers filter through these same search fields: a column\n\t\t// with a field behind it gets a funnel, the others none.\n\t\theaderFilters: 'searchFields',\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 `sourceConfig` keys the endpoint source reads itself; every other key\n * goes along as a query parameter.\n *\n * @type {Array<string>}\n */\nconst ENDPOINT_SOURCE_KEYS = ['url', 'rowsPath', 'totalPath', 'searchParam', 'searchFields', 'notePath', 'noteText', 'refusedText', 'facets']\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 * A quick filter with `showCount` is counted with `count(config)`: the same\n * request with that tab's filter, its total read at `sourceConfig.totalPath`\n * (`total` by default), else the number of rows the answer holds.\n *\n * Three more keys shape what the page says around the rows:\n * - `searchParam`: the page's search box sends its term as this parameter\n * (`sender`), so the endpoint does the searching.\n * - `notePath` and `noteText`: a value read off the answer (`filterOrder`) and\n * the sentence it is said in (\"Filters run in this order: {order}\", its one\n * placeholder taking the value); a list\n * is joined with commas. Shown above the rows.\n * - `refusedText`: what a refused load (403) says when the endpoint gave no\n * `message` of its own. A refusal is not an empty list, so the page shows it\n * instead of the rows, and a failed load is not one either.\n * - `searchFields`: the filters the endpoint takes, in the same shape a\n * registered source declares them (`{ status: { param: 'status', single:\n * true } }`), so a filter strip or sidebar on the page narrows the\n * endpoint's query.\n * - `facets`: the values the endpoint counts in its answer, offered as a\n * picker after the search (`[{ field, path, label?, allLabel?, labels? }]`,\n * the answer holding `[{ value, count }]` at `path`). A choice is a page\n * filter on `field`, so `searchFields` must declare it.\n *\n * @param {object} [declared] The page's `sourceConfig`, for `searchParam` and `searchFields`.\n * @param {object} [context] The page's helpers; `translate` is the app's catalogue.\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(declared = {}, context = {}) {\n\tconst state = reactive({ rows: [], loading: false, refusal: '', failed: false, note: '', facets: {} })\n\tconst translate = typeof context.translate === 'function' ? context.translate : (text) => text\n\tconst searchParam = typeof declared.searchParam === 'string' && declared.searchParam !== '' ? declared.searchParam : null\n\tconst searchFields = declared.searchFields && typeof declared.searchFields === 'object' && !Array.isArray(declared.searchFields) ? declared.searchFields : null\n\tconst facetDeclarations = Array.isArray(declared.facets)\n\t\t? declared.facets.filter((facet) => facet && typeof facet.field === 'string' && facet.field !== '' && typeof facet.path === 'string' && facet.path !== '')\n\t\t: []\n\tlet seq = 0\n\tlet warned = false\n\n\t/**\n\t * The declared facets read off an answer: `{ <field>: [{ value, count }] }`.\n\t *\n\t * @param {object} body The response body.\n\t * @return {object} The facets.\n\t */\n\tconst facetsOf = (body) => {\n\t\tconst facets = {}\n\t\tfor (const facet of facetDeclarations) {\n\t\t\tconst raw = body && typeof body === 'object' && !Array.isArray(body) ? readRowsPath(body, facet.path) : null\n\t\t\tfacets[facet.field] = Array.isArray(raw)\n\t\t\t\t? raw.filter((entry) => entry && entry.value !== undefined && entry.value !== null && entry.value !== '')\n\t\t\t\t\t\t.map((entry) => ({ value: String(entry.value), count: Number(entry.count) || 0 }))\n\t\t\t\t: []\n\t\t}\n\t\treturn facets\n\t}\n\n\t/**\n\t * The query parameters for a config: every key but the source's own\n\t * (`url`, the paths, the texts), empty values left out, a list joined by\n\t * commas.\n\t *\n\t * @param {object} config The config.\n\t * @return {object} The parameters.\n\t */\n\tconst paramsOf = (config) => {\n\t\tconst params = {}\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (ENDPOINT_SOURCE_KEYS.includes(key) || value === undefined || value === null || value === '') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tparams[key] = Array.isArray(value) ? value.join(',') : (typeof value === 'object' ? JSON.stringify(value) : value)\n\t\t}\n\t\treturn params\n\t}\n\n\t/**\n\t * Whether a config can be requested: it names a url and is not the page\n\t * config handed over in its place.\n\t *\n\t * @param {object} config The config.\n\t * @return {boolean}\n\t */\n\tconst requestable = (config) => {\n\t\tconst url = config && config.url\n\t\treturn typeof url === 'string' && url !== '' && !Object.hasOwn(config, 'entitySource')\n\t}\n\n\t/**\n\t * The note read off an answer, in the page's sentence.\n\t *\n\t * @param {object} body The response body.\n\t * @param {string} [path] Where the value sits.\n\t * @param {string} [text] The sentence, with one `{placeholder}` where the value goes.\n\t * @return {string} The note, or '' when there is nothing to say.\n\t */\n\tconst noteOf = (body, path, text) => {\n\t\tif (!path || !body || typeof body !== 'object' || Array.isArray(body)) {\n\t\t\treturn ''\n\t\t}\n\t\tconst raw = readRowsPath(body, path)\n\t\tconst value = Array.isArray(raw) ? raw.filter((v) => v !== null && v !== undefined && v !== '').join(', ') : (raw === null || raw === undefined ? '' : String(raw))\n\t\tif (value === '') {\n\t\t\treturn ''\n\t\t}\n\t\treturn text ? translate(text).replace(/\\{\\w+\\}/, value) : value\n\t}\n\n\t/**\n\t * The sentence a refused load is said in: the endpoint's own, else the\n\t * page's, else the library's.\n\t *\n\t * @param {object} body The refusal's body.\n\t * @param {string} [text] The page's `refusedText`.\n\t * @return {string} The sentence.\n\t */\n\tconst refusalOf = (body, text) => {\n\t\tif (body && typeof body.message === 'string' && body.message.trim() !== '') {\n\t\t\treturn body.message\n\t\t}\n\t\treturn text ? translate(text) : t('nextcloud-vue', 'You may not read this list.')\n\t}\n\n\treturn {\n\t\t/**\n\t\t * The parameter the page's search term is sent as, or null when this\n\t\t * endpoint takes no search.\n\t\t */\n\t\tsearchParam,\n\n\t\t/**\n\t\t * The page filters this endpoint takes, and the parameter each becomes.\n\t\t */\n\t\tsearchFields,\n\n\t\t/**\n\t\t * The facets the page offers as pickers, as declared.\n\t\t */\n\t\tfacetDeclarations,\n\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 or refused; a failed request leaves no rows and rethrows.\n\t\t */\n\t\tload: async (config) => {\n\t\t\tconst { url, rowsPath, notePath, noteText, refusedText } = config || {}\n\t\t\tconst mine = ++seq\n\t\t\tif (!requestable(config)) {\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 = paramsOf(config)\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\tstate.refusal = ''\n\t\t\t\t\tstate.failed = false\n\t\t\t\t\tstate.note = noteOf(body, notePath, noteText)\n\t\t\t\t\tstate.facets = facetsOf(body)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (mine !== seq) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tstate.rows = []\n\t\t\t\tstate.note = ''\n\t\t\t\tconst refused = error && error.response && error.response.status === 403\n\t\t\t\tstate.refusal = refused ? refusalOf(error.response.data, refusedText) : ''\n\t\t\t\tstate.failed = !refused\n\t\t\t\tif (!refused) {\n\t\t\t\t\tthrow error\n\t\t\t\t}\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 * Count the rows for a config without touching the rows on screen, for\n\t\t * a quick-filter tab with `showCount`.\n\t\t *\n\t\t * @param {object} config The page's source config with the tab's filter merged in.\n\t\t * @return {Promise<number>} The total, or NaN when nothing can be requested.\n\t\t */\n\t\tcount: async (config) => {\n\t\t\tif (!requestable(config)) {\n\t\t\t\treturn Number.NaN\n\t\t\t}\n\t\t\tconst { url, rowsPath, totalPath } = config\n\t\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\t\tconst res = await axios.get(generateUrl(url), { params: paramsOf(config) })\n\t\t\tconst body = res ? res.data : null\n\t\t\tconst total = body && typeof body === 'object' && !Array.isArray(body) ? readRowsPath(body, totalPath || 'total') : undefined\n\t\t\tif (typeof total === 'number' && Number.isFinite(total)) {\n\t\t\t\treturn total\n\t\t\t}\n\t\t\tconst rows = Array.isArray(body) ? body : readRowsPath(body, rowsPath || 'results')\n\t\t\treturn Array.isArray(rows) ? rows.length : Number.NaN\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\n\t\t/**\n\t\t * @return {string} The sentence the last load was refused with, or ''.\n\t\t */\n\t\trefusal: () => state.refusal,\n\n\t\t/**\n\t\t * @return {boolean} Whether the last load failed for another reason than a refusal.\n\t\t */\n\t\tfailed: () => state.failed,\n\n\t\t/**\n\t\t * @return {string} The note read off the last answer, or ''.\n\t\t */\n\t\tnote: () => state.note,\n\n\t\t/**\n\t\t * @return {object} The declared facets of the last answer, `{ <field>: [{ value, count }] }`.\n\t\t */\n\t\tfacets: () => state.facets,\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?, statusResolve?, linkedField?, linkedTemplate?, 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 * The kind's `label` goes through the app's translate (the \"Soort\" cell and\n * the quick filters). `statusResolve: { register?, schema, labelField? }`\n * reads `statusField` as a reference and shows the referenced object's label\n * (`labelField`, else `title`, then `name`); the status column is a pill,\n * coloured by `sourceConfig.statusColorMap`. `linkedTemplate` (a field\n * template, \"{case.title}\") or `linkedField` (a path) fills the \"Linked\"\n * column, drawn when a kind declares one; `sourceConfig.linkedLabel` names it.\n * The page's title and count line can name the term as `{term}`, and the\n * count is the active kind's total. Kind, link and status are filterable.\n *\n * @param {object} [config] The page's source config.\n * @param {object} [context] The page's helpers.\n * @param {Function} [context.translate] The app's translate.\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 = {}, context = {}) {\n\tconst translate = typeof context.translate === 'function' ? context.translate : (text) => text\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\t\t.map((kind) => ({ ...kind, label: translate(String(kind.label || kind.id)) }))\n\tconst hasLinked = kinds.some((kind) => kind.linkedTemplate || kind.linkedField)\n\t// The All tab in the app's word when it has one (\"Alles\" in dossiq, as its\n\t// other lists say), else the library's.\n\tconst allLabel = () => {\n\t\tconst own = translate('All')\n\t\treturn own !== 'All' ? own : t('nextcloud-vue', 'All')\n\t}\n\tconst state = reactive({ rows: [], totals: {}, loading: false, kind: 'all', term: '', filters: {} })\n\tlet seq = 0\n\t// Once the page's search box has sent a term, an empty box means no term,\n\t// not the address's `?q=` again.\n\tlet boxUsed = false\n\tconst addressTerm = () => {\n\t\tconst query = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null\n\t\treturn String((query && query.get((config && config.termQuery) || 'q')) || '').trim()\n\t}\n\n\t/**\n\t * The labels of the objects a kind's status points at, by id: the\n\t * referenced schema read once per search.\n\t *\n\t * @param {object} kind The kind with `statusResolve`.\n\t * @return {Promise<Map<string, string>>} Labels by id; empty when it cannot be read.\n\t */\n\tconst statusLabels = async (kind) => {\n\t\tconst resolve = kind.statusResolve\n\t\tif (!resolve || !resolve.schema) {\n\t\t\treturn new Map()\n\t\t}\n\t\tconst objects = await fetchReferenceObjects({ register: resolve.register || kind.register, schema: resolve.schema }).catch(() => [])\n\t\tconst labels = new Map()\n\t\tfor (const object of objects) {\n\t\t\tconst id = object.id || object.uuid || (object['@self'] && object['@self'].id)\n\t\t\tconst label = readPath(object, resolve.labelField || 'title') ?? object.name\n\t\t\tif (id !== undefined && label !== undefined && label !== null) {\n\t\t\t\tlabels.set(String(id), String(label))\n\t\t\t}\n\t\t}\n\t\treturn labels\n\t}\n\n\t/**\n\t * What a row shows in the Linked column.\n\t *\n\t * @param {object} kind The row's kind.\n\t * @param {object} object The found object.\n\t * @return {string}\n\t */\n\t/**\n\t * What one row is, for the Kind column under `kindAsText`: the kind's\n\t * `rowLabel` (a template on the found object, \"{objectType}\"), else the\n\t * kind's label.\n\t *\n\t * @param {object} kind The row's kind.\n\t * @param {object} object The found object or file entry.\n\t * @return {string}\n\t */\n\tconst kindTextOf = (kind, object) => {\n\t\tif (typeof kind.rowLabel === 'string' && kind.rowLabel !== '') {\n\t\t\tconst label = translate(kind.rowLabel)\n\t\t\treturn kind.rowLabel.includes('{') ? (fillTemplate(label, object || {}) || kind.label) : label\n\t\t}\n\t\treturn kind.label\n\t}\n\n\t/**\n\t * What a row shows in the Linked column.\n\t *\n\t * @param {object} kind The row's kind.\n\t * @param {object} object The found object.\n\t * @return {string}\n\t */\n\tconst linkedOf = (kind, object) => {\n\t\tif (kind.linkedTemplate) {\n\t\t\treturn fillTemplate(translate(kind.linkedTemplate), object)\n\t\t}\n\t\tif (kind.linkedField) {\n\t\t\tconst value = readPath(object, kind.linkedField)\n\t\t\treturn value === undefined || value === null ? '' : String(value)\n\t\t}\n\t\treturn ''\n\t}\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\tconst labels = kind.statusResolve && kind.statusField ? await statusLabels(kind) : null\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\tconst rawStatus = kind.statusField ? readPath(object, kind.statusField) : undefined\n\t\t\t\tconst status = rawStatus === undefined || rawStatus === null\n\t\t\t\t\t? ''\n\t\t\t\t\t: (labels ? (labels.get(String(rawStatus)) || '') : String(rawStatus))\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\tkindText: kindTextOf(kind, object),\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,\n\t\t\t\t\tlinked: linkedOf(kind, object),\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\tkindText: kindTextOf(kind, entry),\n\t\t\t\ttitle: entry.title || '',\n\t\t\t\tsubtitle: entry.subline || '',\n\t\t\t\tstatus: '',\n\t\t\t\tlinked: '',\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\t// The header filters on Kind, Linked and Status narrow the answer\n\t\t\t// already fetched; they do not search again.\n\t\t\tconst filters = {}\n\t\t\tfor (const key of ['kindLabel', 'kindText', 'linked', 'status']) {\n\t\t\t\tconst value = cfg && cfg[key]\n\t\t\t\tconst values = (Array.isArray(value) ? value : (value === undefined || value === null || value === '' ? [] : [value])).map(String)\n\t\t\t\tif (values.length > 0) {\n\t\t\t\t\tfilters[key] = values\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.filters = filters\n\t\t\tconst typed = cfg && typeof cfg.searchTerm === 'string' ? cfg.searchTerm.trim() : ''\n\t\t\tboxUsed = boxUsed || typed !== ''\n\t\t\tconst term = typed || (boxUsed ? '' : String((cfg && cfg.term) || addressTerm()).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\t\t\t.filter((row) => Object.entries(state.filters).every(([key, values]) => values.includes(String(row[key])))),\n\n\t\t/**\n\t\t * @return {string} The term searched for, for a `{term}` in the title or count line.\n\t\t */\n\t\tterm: () => state.term,\n\n\t\t// The page's search box searches again, and starts out holding the\n\t\t// term from the address; the term shows as a removable chip.\n\t\tsearchParam: 'searchTerm',\n\t\tinitialSearch: () => String((config && config.term) || addressTerm()).trim(),\n\t\tsearchChip: true,\n\n\t\t/**\n\t\t * @return {number} The active kind's total, or every kind's together on All.\n\t\t */\n\t\ttotal: () => (state.kind === 'all'\n\t\t\t? Object.values(state.totals).reduce((sum, value) => sum + value, 0)\n\t\t\t: (state.totals[state.kind] || 0)),\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', sortable: true },\n\t\t\t// `kindAsText`: what one row is, as plain text (\"Zaak\", \"Lantaarnpaal\",\n\t\t\t// DqZoekresultaten), instead of the plural kind as a pill.\n\t\t\tconfig && config.kindAsText === true\n\t\t\t\t? { key: 'kindText', label: t('nextcloud-vue', 'Kind'), sortable: true }\n\t\t\t\t: { key: 'kindLabel', label: t('nextcloud-vue', 'Kind'), enum: kinds.map((kind) => kind.label), sortable: true },\n\t\t\t...(hasLinked ? [{ key: 'linked', label: config.linkedLabel ? translate(config.linkedLabel) : t('nextcloud-vue', 'Linked'), sortable: true }] : []),\n\t\t\t{\n\t\t\t\tkey: 'status',\n\t\t\t\tlabel: t('nextcloud-vue', 'Status'),\n\t\t\t\twidget: 'badge',\n\t\t\t\twidgetProps: { colorMap: (config && config.statusColorMap) || {} },\n\t\t\t\tsortable: true,\n\t\t\t},\n\t\t],\n\n\t\t/**\n\t\t * Every column header carries a filter button (DqZoekresultaten); the\n\t\t * filters narrow the answer already fetched (`load`).\n\t\t */\n\t\theaderFilters: true,\n\n\t\t/**\n\t\t * The page orders the rows a header asks for: the answer is one fetch,\n\t\t * so there is nothing to ask the servers again.\n\t\t */\n\t\tsortsRows: true,\n\n\t\tquickFilters: kinds.length > 0\n\t\t\t? [\n\t\t\t\t\t{ label: allLabel(), 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 members that match a search, in the asked order, and the page of them\n * the pager asks for.\n *\n * @param {Array<object>} members The members, by name.\n * @param {object} config `search`, `sortKey`, `sortOrder`, `limit`, `offset`.\n * @return {{rows: Array<object>, total: number}} The page and how many match.\n */\nfunction membersPage(members, config = {}) {\n\tconst term = String(config.search || '').trim().toLowerCase()\n\tlet rows = term === ''\n\t\t? members.slice()\n\t\t: members.filter((member) => ['displayname', 'function', 'roles', 'email'].some((field) => String(member[field] || '').toLowerCase().includes(term)))\n\tif (config.sortKey) {\n\t\tconst sign = config.sortOrder === 'desc' ? -1 : 1\n\t\trows = rows.sort((a, b) => sign * String(a[config.sortKey] ?? '').localeCompare(String(b[config.sortKey] ?? '')))\n\t}\n\tconst total = rows.length\n\tconst limit = Number(config.limit) || 0\n\tif (limit > 0) {\n\t\tconst offset = Number(config.offset) || 0\n\t\trows = rows.slice(offset, offset + limit)\n\t}\n\treturn { rows, total }\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; without one, All lists every user the reader may\n * list (all users for an admin, their groups' users for a sub-admin).\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 * The page gets a pager (`pages`), and the search term and the header's order\n * come as `search` and `sortKey` / `sortOrder`: the group's members are read\n * once and searched, sorted and paged here, so a new page, term or order does\n * not read every member's presence again.\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, total: 0 })\n\tlet seq = 0\n\t// The members last read, for the group and request they were read for.\n\tlet readMembers = []\n\tlet membersKey = null\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 { search, sortKey, sortOrder, limit, offset, ...request } = config || {}\n\t\t\tconst key = JSON.stringify({ ...request, group })\n\t\t\t// A new page, term or order of the members already read: no request.\n\t\t\tif (key === membersKey && (offset !== undefined || search !== undefined || sortKey !== undefined)) {\n\t\t\t\tconst page = membersPage(readMembers, config)\n\t\t\t\tstate.rows = page.rows\n\t\t\t\tstate.total = page.total\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst mine = ++seq\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([\n\t\t\t\t\tgroup === '' ? fetchUsers(axios, { limit: (config && config.limit) || 500 }) : fetchGroupMembers(axios, group),\n\t\t\t\t\tfetchStatuses(axios),\n\t\t\t\t])\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\treadMembers = rows.sort((a, b) => a.displayname.localeCompare(b.displayname))\n\t\t\t\t\tmembersKey = key\n\t\t\t\t\tconst page = membersPage(readMembers, config)\n\t\t\t\t\tstate.rows = page.rows\n\t\t\t\t\tstate.total = page.total\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (mine === seq) {\n\t\t\t\t\treadMembers = []\n\t\t\t\t\tmembersKey = null\n\t\t\t\t\tstate.rows = []\n\t\t\t\t\tstate.total = 0\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 on this page.\n\t\t */\n\t\trows: () => state.rows,\n\n\t\tpages: true,\n\n\t\t/**\n\t\t * @return {number} The members that match, on every page.\n\t\t */\n\t\ttotal: () => state.total,\n\n\t\tsearchParam: 'search',\n\n\t\t/**\n\t\t * @param {string} key The column.\n\t\t * @param {string} order `asc` or `desc`.\n\t\t * @return {object} The load arguments.\n\t\t */\n\t\tsortParam: (key, order) => ({ sortKey: key, sortOrder: order }),\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 * @param {object} [context] The page's helpers a source may use, such as `translate` (the app's catalogue).\n *\n * @return {object|null} The adapter, or null when the name is not registered.\n */\nexport function resolveIndexSource(name, config, context) {\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 || {}, context || {})\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","translate"],"mappings":"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"}