@conduction/nextcloud-vue 2.139.0 → 2.140.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 (101) hide show
  1. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +9 -2
  2. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  4. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  5. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +17 -1
  6. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  7. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +2 -2
  8. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  9. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  10. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +52 -1
  11. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  12. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js +23 -1
  13. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  14. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +1 -1
  15. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +106 -0
  16. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
  17. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +30 -7
  18. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
  19. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  20. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +59 -3
  21. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  22. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +44 -34
  23. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  24. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  25. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +28 -1
  26. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  27. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  28. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +7 -1
  29. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  30. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +5 -0
  31. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
  32. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -2
  33. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  34. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  35. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  36. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +28 -3
  37. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  38. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  39. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue.js +1 -1
  40. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js +10 -0
  41. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js.map +1 -1
  42. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue3.js.map +1 -1
  43. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +1 -1
  44. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +12 -1
  45. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -1
  46. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +1 -1
  47. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -1
  48. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue.js +1 -1
  49. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js +23 -1
  50. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js.map +1 -1
  51. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js +43 -13
  52. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js.map +1 -1
  53. package/dist/esm/composables/indexSources.js +5 -2
  54. package/dist/esm/composables/indexSources.js.map +1 -1
  55. package/dist/esm/composables/useTaskInboxStore.js +4 -3
  56. package/dist/esm/composables/useTaskInboxStore.js.map +1 -1
  57. package/dist/esm/l10n/en.json.js +2 -1
  58. package/dist/esm/l10n/en.json.js.map +1 -1
  59. package/dist/esm/l10n/nl.json.js +5 -1
  60. package/dist/esm/l10n/nl.json.js.map +1 -1
  61. package/dist/esm/library-style.js +1 -1
  62. package/dist/esm/nextcloud-vue.css +466 -371
  63. package/dist/esm/utils/builtInFormatters.js +23 -1
  64. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  65. package/dist/esm/utils/fillTemplate.js +7 -1
  66. package/dist/esm/utils/fillTemplate.js.map +1 -1
  67. package/dist/esm/utils/myTeam.js +24 -4
  68. package/dist/esm/utils/myTeam.js.map +1 -1
  69. package/dist/esm/utils/resolveFilterTokens.js +5 -4
  70. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  71. package/dist/esm/utils/transitionInputs.js +43 -2
  72. package/dist/esm/utils/transitionInputs.js.map +1 -1
  73. package/dist/nextcloud-vue.cjs.js +771 -222
  74. package/dist/nextcloud-vue.cjs.js.map +2 -2
  75. package/dist/nextcloud-vue.css +466 -371
  76. package/l10n/en.json +2 -1
  77. package/l10n/nl.json +5 -1
  78. package/package.json +1 -1
  79. package/src/components/CnAppRoot/CnAppRoot.vue +9 -2
  80. package/src/components/CnCellRenderer/CnCellRenderer.vue +19 -3
  81. package/src/components/CnChartWidget/CnChartWidget.md +1 -0
  82. package/src/components/CnChartWidget/CnChartWidget.vue +72 -1
  83. package/src/components/CnConversationThread/CnConversationWidget.vue +126 -1
  84. package/src/components/CnFactsWidget/CnFactsWidget.vue +72 -5
  85. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +28 -1
  86. package/src/components/CnFilesBrowser/filesBrowser.js +7 -1
  87. package/src/components/CnFilesBrowser/filesBrowserColumns.js +5 -0
  88. package/src/components/CnIndexPage/CnIndexPage.vue +30 -2
  89. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +28 -3
  90. package/src/components/CnRecordListWidget/CnRecordNoteRows.vue +10 -0
  91. package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +68 -2
  92. package/src/components/CnTransitionInputFields/CnTransitionInputFields.vue +43 -1
  93. package/src/composables/indexSources.js +5 -2
  94. package/src/composables/useTaskInboxStore.js +4 -3
  95. package/src/css/look-board.css +10 -2
  96. package/src/css/table.css +13 -0
  97. package/src/utils/builtInFormatters.js +22 -0
  98. package/src/utils/fillTemplate.js +7 -1
  99. package/src/utils/myTeam.js +24 -4
  100. package/src/utils/resolveFilterTokens.js +5 -4
  101. package/src/utils/transitionInputs.js +42 -1
@@ -42,7 +42,8 @@ const FLOW_TASKS_URL = '/apps/openregister/api/flow-tasks';
42
42
  // creating app named it, so it is the one filter that lets a Tasks page say
43
43
  // "the reminders" without the engine learning what a reminder is. It widens
44
44
  // nothing: it narrows within the inbox the session already decides.
45
- const ALLOWED_PARAMS = ['scope', 'state', 'isTerminal', 'priority', 'kind', 'overdue', 'dueAfter', 'dueBefore', 'objectUuid', 'sort', 'limit', 'offset'];
45
+ // `openFirst` asks open tasks before finished ones, a sort the engine applies.
46
+ const ALLOWED_PARAMS = ['scope', 'state', 'isTerminal', 'priority', 'kind', 'overdue', 'dueAfter', 'dueBefore', 'objectUuid', 'sort', 'openFirst', 'limit', 'offset'];
46
47
 
47
48
  /**
48
49
  * The flat body `POST /api/flow-tasks` takes for a task on a record.
@@ -179,7 +180,7 @@ const useTaskInboxStore = defineStore('cnTaskInbox', {
179
180
  if (value === undefined || value === null || value === '') {
180
181
  continue
181
182
  }
182
- params[key] = (key === 'overdue' || key === 'isTerminal') ? String(value) : value;
183
+ params[key] = (key === 'overdue' || key === 'isTerminal' || key === 'openFirst') ? String(value) : value;
183
184
  }
184
185
  const response = await axios__default.get(generateUrl(FLOW_TASKS_URL), { params });
185
186
  const results = response.data?.results || [];
@@ -359,7 +360,7 @@ const useTaskInboxStore = defineStore('cnTaskInbox', {
359
360
  }
360
361
  // The endpoint reads `overdue` as a boolean-ish string; a quick
361
362
  // filter authors it as `true` for legibility.
362
- params[key] = (key === 'overdue' || key === 'isTerminal') ? String(value) : value;
363
+ params[key] = (key === 'overdue' || key === 'isTerminal' || key === 'openFirst') ? String(value) : value;
363
364
  }
364
365
 
365
366
  this.loading = true;
@@ -1 +1 @@
1
- {"version":3,"file":"useTaskInboxStore.js","sources":["../../../src/composables/useTaskInboxStore.js"],"sourcesContent":["/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { defineStore } from 'pinia'\n\n/**\n * The OpenRegister inbox read behind the `tasks` entity source.\n *\n * One endpoint for the whole fleet (ADR-098): every Conduction app runs its\n * human tasks on OpenRegister's one task store, so \"what is waiting for me\"\n * has a single answer per viewer and this store can be app-agnostic.\n *\n * @type {string}\n */\nexport const FLOW_TASKS_URL = '/apps/openregister/api/flow-tasks'\n\n/**\n * The query parameters the inbox read accepts, and the ONLY ones this store\n * forwards. The list is an allowlist on purpose: the endpoint decides whose\n * inbox it answers from the session, and no config key may widen that. A\n * `uid` or `assignee` smuggled into the loader config is dropped here, so\n * \"the source resolves the CURRENT user's inbox\" is enforced structurally\n * rather than by convention.\n *\n * @type {string[]}\n */\n// `isTerminal` is in the list because the SERVER has always accepted it\n// (`TaskController`: \"'true'|'false' to restrict on terminality\") and only\n// this allowlist withheld it. Without it an app cannot express \"closed\" or\n// \"my open work\" as a scope tab: dossiq's task lenses are\n// All / Mine / Unclaimed / Closed / Overdue, and two of those are exactly\n// this filter. Boolean-ish, like `overdue`, so it is stringified on the way\n// out.\n// `kind` is in the list for the same reason `isTerminal` is: the server\n// accepts it (`TaskController`: \"Restrict to one kind of work\") and only this\n// allowlist would withhold it. A kind is what sort of work a task is, as the\n// creating app named it, so it is the one filter that lets a Tasks page say\n// \"the reminders\" without the engine learning what a reminder is. It widens\n// nothing: it narrows within the inbox the session already decides.\nconst ALLOWED_PARAMS = ['scope', 'state', 'isTerminal', 'priority', 'kind', 'overdue', 'dueAfter', 'dueBefore', 'objectUuid', 'sort', 'limit', 'offset']\n\n/**\n * The flat body `POST /api/flow-tasks` takes for a task on a record.\n *\n * Only the task entity's own keys are ever sent, and never `requester` or\n * `state`: OpenRegister pins the requester to the caller and refuses a\n * terminal state. A user task carries `assignee`; a group task carries\n * `performerType: \"group\"` with `candidateGroups` (a pool until someone claims\n * it), because the server defaults `performerType` to `user`.\n *\n * @param {object} data The task to create.\n * @param {string} data.title Required title.\n * @param {string} [data.description] Optional description.\n * @param {string} [data.dueAt] Optional due date, ISO 8601.\n * @param {{objectUuid: string, registerId: string, schemaId: string}} data.anchor The record the task hangs on.\n * @param {{kind: ('user'|'group'), id: string}|null} [data.assignee] A user, or a group as a pool.\n * @return {object} The request body.\n * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n */\nexport function buildFlowTaskBody(data) {\n\tconst body = { title: String(data.title || '').trim() }\n\tif (data.description) {\n\t\tbody.description = data.description\n\t}\n\tif (data.dueAt) {\n\t\tbody.dueAt = data.dueAt\n\t}\n\tconst anchor = data.anchor || {}\n\tbody.objectUuid = anchor.objectUuid\n\tbody.registerId = anchor.registerId\n\tbody.schemaId = anchor.schemaId\n\tif (data.assignee && data.assignee.id) {\n\t\tif (data.assignee.kind === 'group') {\n\t\t\tbody.performerType = 'group'\n\t\t\tbody.candidateGroups = [data.assignee.id]\n\t\t} else {\n\t\t\tbody.assignee = data.assignee.id\n\t\t}\n\t}\n\treturn body\n}\n\n/**\n * Read the server's message off a failed axios call.\n *\n * @param {object} error The axios error.\n * @return {string} The message, or ''.\n */\nfunction serverMessage(error) {\n\tconst data = error && error.response && error.response.data\n\tif (typeof data === 'string') {\n\t\treturn data\n\t}\n\treturn (data && (data.error || data.message)) || (error && error.message) || ''\n}\n\n/**\n * Internal Pinia store for the `tasks` index source (cn-tasks-entity-source).\n *\n * Deliberately NOT a public export: the public surface is the manifest line\n * (`entitySource: \"tasks\"`), and the adapter in `indexSources.js` is its only\n * consumer. Keeping the store internal leaves the HTTP contract in one file\n * should the endpoint move.\n *\n * @spec openspec/changes/cn-tasks-entity-source/specs/cn-tasks-entity-source/spec.md\n */\nexport const useTaskInboxStore = defineStore('cnTaskInbox', {\n\tstate: () => ({\n\t\t/** @type {Array<object>} The inbox rows as the endpoint returned them. */\n\t\ttasks: [],\n\t\t/** @type {number} The datastore total, independent of the page size. */\n\t\ttotal: 0,\n\t\t/** @type {boolean} Whether a load is in flight. */\n\t\tloading: false,\n\t\t/** @type {string|null} The last load failure, for the console trail. */\n\t\terror: null,\n\t\t/** @type {Object<string, object>} Single tasks read for a detail page, keyed on their uuid. */\n\t\trecords: {},\n\t\t/** @type {Object<string, number|null>} The HTTP status of a failed single read, keyed on the uuid. */\n\t\trecordErrors: {},\n\t}),\n\n\tactions: {\n\t\t/**\n\t\t * Read one task into `records`, for a `type: \"detail\"` page on the\n\t\t * `tasks` source. A refusal (403) or a missing task (404) leaves no\n\t\t * record and keeps the status in `recordErrors`, so the page can tell\n\t\t * \"not found\" from \"still loading\". The engine decides what the caller\n\t\t * may read; nothing here widens that.\n\t\t *\n\t\t * @param {string} uuid 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\tasync fetchRecord(uuid) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tif (key === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(key)}`))\n\t\t\t\tconst data = response.data\n\t\t\t\tconst task = data && typeof data === 'object' && data.results && !Array.isArray(data.results) ? data.results : data\n\t\t\t\tconst { [key]: dropped, ...errors } = this.recordErrors\n\t\t\t\tthis.recordErrors = errors\n\t\t\t\tif (!task || typeof task !== 'object' || Array.isArray(task)) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tthis.records = { ...this.records, [key]: task }\n\t\t\t\treturn task\n\t\t\t} catch (error) {\n\t\t\t\tconst { [key]: dropped, ...records } = this.records\n\t\t\t\tthis.records = records\n\t\t\t\tthis.recordErrors = { ...this.recordErrors, [key]: error?.response?.status ?? null }\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(`[useTaskInboxStore] Loading task \"${key}\" failed`, error)\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read one inbox page WITHOUT touching the store's state, so a surface\n\t\t * that lists a different slice (the Tasks tab of one record) cannot\n\t\t * overwrite what an inbox page on the same screen shows.\n\t\t *\n\t\t * @param {object} [config] Loader config, as for `load`.\n\t\t * @return {Promise<{results: Array<object>, total: number}>} The rows and the total.\n\t\t * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n\t\t */\n\t\tasync fetchFor(config = {}) {\n\t\t\tconst params = { scope: 'assigned', sort: '-dueAt' }\n\t\t\tfor (const key of ALLOWED_PARAMS) {\n\t\t\t\tconst value = config ? config[key] : undefined\n\t\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tparams[key] = (key === 'overdue' || key === 'isTerminal') ? String(value) : value\n\t\t\t}\n\t\t\tconst response = await axios.get(generateUrl(FLOW_TASKS_URL), { params })\n\t\t\tconst results = response.data?.results || []\n\t\t\treturn { results, total: Number(response.data?.total ?? results.length) || 0 }\n\t\t},\n\n\t\t/**\n\t\t * Create a flow task. A refusal is returned, not thrown, with the\n\t\t * server's message and the HTTP status (404: the creator may not read\n\t\t * the record).\n\t\t *\n\t\t * @param {object} data See `buildFlowTaskBody`.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), task: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n\t\t */\n\t\tasync createTask(data) {\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(generateUrl(FLOW_TASKS_URL), buildFlowTaskBody(data))\n\t\t\t\treturn { ok: true, status: response.status || 201, task: response.data?.task || response.data || null, message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, task: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run one lifecycle verb on a task (`claim`, `unclaim`, `reassign`,\n\t\t * `complete`, `cancel`). A refusal is returned, not thrown, with the\n\t\t * server's message, so the row can show it and stay as it was.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {string} verb The verb.\n\t\t * @param {object} [body] Optional body (for `reassign`: `{ assignee }`).\n\t\t * @return {Promise<{ok: boolean, status: (number|null), task: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n\t\t */\n\t\tasync runVerb(uuid, verb, body = {}) {\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(generateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(uuid)}/${encodeURIComponent(verb)}`), body || {})\n\t\t\t\treturn { ok: true, status: response.status || 200, task: response.data?.task || response.data || null, message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, task: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run one lifecycle verb on a task read for a detail page, and keep\n\t\t * that record in step with the engine's answer.\n\t\t *\n\t\t * `url` replaces the engine's own verb route for an app that puts a\n\t\t * step of its own in front of the engine (dossiq completes a task\n\t\t * through its own endpoint, which checks the case type's form first).\n\t\t * `{id}` in it is the task uuid. A refusal is returned with the\n\t\t * server's message as-is and leaves the record as it was.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {string} verb The verb.\n\t\t * @param {{url?: string}} [options] An app route to post the verb to instead.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), record: (object|null), message: string}>} The outcome.\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\tasync runRecordVerb(uuid, verb, options = {}) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tconst name = String(verb || '').trim()\n\t\t\tif (key === '' || name === '') {\n\t\t\t\treturn { ok: false, status: null, record: null, message: '' }\n\t\t\t}\n\t\t\tconst route = typeof options.url === 'string' && options.url !== ''\n\t\t\t\t? options.url.replace('{id}', encodeURIComponent(key))\n\t\t\t\t: `${FLOW_TASKS_URL}/${encodeURIComponent(key)}/${encodeURIComponent(name)}`\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(generateUrl(route), {})\n\t\t\t\treturn { ok: true, status: response.status || 200, record: await this.keepRecord(key, response.data), message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, record: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Tick or untick one checklist item on a task read for a detail page\n\t\t * (`PATCH /flow-tasks/{uuid}/checklist/{itemId}?checked=`). The engine\n\t\t * answers with the whole task, which replaces the record, so a refused\n\t\t * tick leaves the item as it was on screen.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {string} itemId The checklist item id.\n\t\t * @param {boolean} checked The new state.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), 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\tasync checkRecordItem(uuid, itemId, checked) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tconst item = String(itemId || '').trim()\n\t\t\tif (key === '' || item === '') {\n\t\t\t\treturn { ok: false, status: null, record: null, message: '' }\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.patch(\n\t\t\t\t\tgenerateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(key)}/checklist/${encodeURIComponent(item)}`),\n\t\t\t\t\tnull,\n\t\t\t\t\t{ params: { checked: checked === true ? 'true' : 'false' } },\n\t\t\t\t)\n\t\t\t\treturn { ok: true, status: response.status || 200, record: await this.keepRecord(key, response.data), message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, record: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Edit a task's own fields (`PATCH /flow-tasks/{uuid}` with the\n\t\t * changed `title`, `description`, `dueAt`, `priority`). The engine\n\t\t * decides who may; its answer replaces the record, so a refused edit\n\t\t * leaves the task as it was on screen.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {object} changes The new values by field.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), record: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/task-edit-action/specs/record-source-verbs/spec.md#requirement-a-record-source-verb-can-ask-for-values-first\n\t\t */\n\t\tasync editRecord(uuid, changes) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tif (key === '' || !changes || typeof changes !== 'object') {\n\t\t\t\treturn { ok: false, status: null, record: null, message: '' }\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.patch(generateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(key)}`), changes)\n\t\t\t\treturn { ok: true, status: response.status || 200, record: await this.keepRecord(key, response.data), message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, record: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Store the task a write answered with as the detail record. An answer\n\t\t * that carries no task (an app route that returns only a status) is\n\t\t * followed by a fresh read, so the page never shows the state from\n\t\t * before the write.\n\t\t *\n\t\t * @param {string} key The task uuid.\n\t\t * @param {unknown} data The response body.\n\t\t * @return {Promise<object|null>} The task now held.\n\t\t */\n\t\tasync keepRecord(key, data) {\n\t\t\tconst body = data && typeof data === 'object' ? data : null\n\t\t\tconst task = body && (body.results || body.task) && typeof (body.results || body.task) === 'object' && !Array.isArray(body.results || body.task)\n\t\t\t\t? (body.results || body.task)\n\t\t\t\t: body\n\t\t\tif (task && typeof task === 'object' && !Array.isArray(task) && String(task.uuid || '') === key) {\n\t\t\t\tthis.records = { ...this.records, [key]: task }\n\t\t\t\treturn task\n\t\t\t}\n\t\t\treturn this.fetchRecord(key)\n\t\t},\n\n\t\t/**\n\t\t * Load one inbox page.\n\t\t *\n\t\t * Defaults are the inbox's resting shape: the viewer's ASSIGNED tasks,\n\t\t * most urgent due date first (`-dueAt`). Every key is optional and\n\t\t * only allowlisted keys are forwarded; filtering, sorting and paging\n\t\t * are the server's, never applied over a returned page.\n\t\t *\n\t\t * @param {object} [config] Loader config from the page (`sourceConfig`\n\t\t * merged with the active quick-filter tab): `scope`, `state`,\n\t\t * `priority`, `kind`, `overdue`, `objectUuid`, `sort`, `limit`,\n\t\t * `offset`.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when the rows are in the store.\n\t\t *\n\t\t * @spec openspec/changes/cn-tasks-entity-source/specs/cn-tasks-entity-source/spec.md\n\t\t */\n\t\tasync load(config = {}) {\n\t\t\tconst params = { scope: 'assigned', sort: '-dueAt' }\n\t\t\tfor (const key of ALLOWED_PARAMS) {\n\t\t\t\tconst value = config ? config[key] : undefined\n\t\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// The endpoint reads `overdue` as a boolean-ish string; a quick\n\t\t\t\t// filter authors it as `true` for legibility.\n\t\t\t\tparams[key] = (key === 'overdue' || key === 'isTerminal') ? String(value) : value\n\t\t\t}\n\n\t\t\tthis.loading = true\n\t\t\tthis.error = null\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(FLOW_TASKS_URL), { params })\n\t\t\t\tthis.tasks = response.data?.results || []\n\t\t\t\tthis.total = Number(response.data?.total ?? this.tasks.length) || 0\n\t\t\t} catch (error) {\n\t\t\t\t// Surfaced, not swallowed: an empty inbox with no trace of why is\n\t\t\t\t// indistinguishable from a healthy quiet one.\n\t\t\t\tthis.error = error?.message || String(error)\n\t\t\t\tthis.tasks = []\n\t\t\t\tthis.total = 0\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[useTaskInboxStore] Loading the task inbox failed', error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n})\n"],"names":["axios"],"mappings":"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"}
1
+ {"version":3,"file":"useTaskInboxStore.js","sources":["../../../src/composables/useTaskInboxStore.js"],"sourcesContent":["/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { defineStore } from 'pinia'\n\n/**\n * The OpenRegister inbox read behind the `tasks` entity source.\n *\n * One endpoint for the whole fleet (ADR-098): every Conduction app runs its\n * human tasks on OpenRegister's one task store, so \"what is waiting for me\"\n * has a single answer per viewer and this store can be app-agnostic.\n *\n * @type {string}\n */\nexport const FLOW_TASKS_URL = '/apps/openregister/api/flow-tasks'\n\n/**\n * The query parameters the inbox read accepts, and the ONLY ones this store\n * forwards. The list is an allowlist on purpose: the endpoint decides whose\n * inbox it answers from the session, and no config key may widen that. A\n * `uid` or `assignee` smuggled into the loader config is dropped here, so\n * \"the source resolves the CURRENT user's inbox\" is enforced structurally\n * rather than by convention.\n *\n * @type {string[]}\n */\n// `isTerminal` is in the list because the SERVER has always accepted it\n// (`TaskController`: \"'true'|'false' to restrict on terminality\") and only\n// this allowlist withheld it. Without it an app cannot express \"closed\" or\n// \"my open work\" as a scope tab: dossiq's task lenses are\n// All / Mine / Unclaimed / Closed / Overdue, and two of those are exactly\n// this filter. Boolean-ish, like `overdue`, so it is stringified on the way\n// out.\n// `kind` is in the list for the same reason `isTerminal` is: the server\n// accepts it (`TaskController`: \"Restrict to one kind of work\") and only this\n// allowlist would withhold it. A kind is what sort of work a task is, as the\n// creating app named it, so it is the one filter that lets a Tasks page say\n// \"the reminders\" without the engine learning what a reminder is. It widens\n// nothing: it narrows within the inbox the session already decides.\n// `openFirst` asks open tasks before finished ones, a sort the engine applies.\nconst ALLOWED_PARAMS = ['scope', 'state', 'isTerminal', 'priority', 'kind', 'overdue', 'dueAfter', 'dueBefore', 'objectUuid', 'sort', 'openFirst', 'limit', 'offset']\n\n/**\n * The flat body `POST /api/flow-tasks` takes for a task on a record.\n *\n * Only the task entity's own keys are ever sent, and never `requester` or\n * `state`: OpenRegister pins the requester to the caller and refuses a\n * terminal state. A user task carries `assignee`; a group task carries\n * `performerType: \"group\"` with `candidateGroups` (a pool until someone claims\n * it), because the server defaults `performerType` to `user`.\n *\n * @param {object} data The task to create.\n * @param {string} data.title Required title.\n * @param {string} [data.description] Optional description.\n * @param {string} [data.dueAt] Optional due date, ISO 8601.\n * @param {{objectUuid: string, registerId: string, schemaId: string}} data.anchor The record the task hangs on.\n * @param {{kind: ('user'|'group'), id: string}|null} [data.assignee] A user, or a group as a pool.\n * @return {object} The request body.\n * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n */\nexport function buildFlowTaskBody(data) {\n\tconst body = { title: String(data.title || '').trim() }\n\tif (data.description) {\n\t\tbody.description = data.description\n\t}\n\tif (data.dueAt) {\n\t\tbody.dueAt = data.dueAt\n\t}\n\tconst anchor = data.anchor || {}\n\tbody.objectUuid = anchor.objectUuid\n\tbody.registerId = anchor.registerId\n\tbody.schemaId = anchor.schemaId\n\tif (data.assignee && data.assignee.id) {\n\t\tif (data.assignee.kind === 'group') {\n\t\t\tbody.performerType = 'group'\n\t\t\tbody.candidateGroups = [data.assignee.id]\n\t\t} else {\n\t\t\tbody.assignee = data.assignee.id\n\t\t}\n\t}\n\treturn body\n}\n\n/**\n * Read the server's message off a failed axios call.\n *\n * @param {object} error The axios error.\n * @return {string} The message, or ''.\n */\nfunction serverMessage(error) {\n\tconst data = error && error.response && error.response.data\n\tif (typeof data === 'string') {\n\t\treturn data\n\t}\n\treturn (data && (data.error || data.message)) || (error && error.message) || ''\n}\n\n/**\n * Internal Pinia store for the `tasks` index source (cn-tasks-entity-source).\n *\n * Deliberately NOT a public export: the public surface is the manifest line\n * (`entitySource: \"tasks\"`), and the adapter in `indexSources.js` is its only\n * consumer. Keeping the store internal leaves the HTTP contract in one file\n * should the endpoint move.\n *\n * @spec openspec/changes/cn-tasks-entity-source/specs/cn-tasks-entity-source/spec.md\n */\nexport const useTaskInboxStore = defineStore('cnTaskInbox', {\n\tstate: () => ({\n\t\t/** @type {Array<object>} The inbox rows as the endpoint returned them. */\n\t\ttasks: [],\n\t\t/** @type {number} The datastore total, independent of the page size. */\n\t\ttotal: 0,\n\t\t/** @type {boolean} Whether a load is in flight. */\n\t\tloading: false,\n\t\t/** @type {string|null} The last load failure, for the console trail. */\n\t\terror: null,\n\t\t/** @type {Object<string, object>} Single tasks read for a detail page, keyed on their uuid. */\n\t\trecords: {},\n\t\t/** @type {Object<string, number|null>} The HTTP status of a failed single read, keyed on the uuid. */\n\t\trecordErrors: {},\n\t}),\n\n\tactions: {\n\t\t/**\n\t\t * Read one task into `records`, for a `type: \"detail\"` page on the\n\t\t * `tasks` source. A refusal (403) or a missing task (404) leaves no\n\t\t * record and keeps the status in `recordErrors`, so the page can tell\n\t\t * \"not found\" from \"still loading\". The engine decides what the caller\n\t\t * may read; nothing here widens that.\n\t\t *\n\t\t * @param {string} uuid 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\tasync fetchRecord(uuid) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tif (key === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(key)}`))\n\t\t\t\tconst data = response.data\n\t\t\t\tconst task = data && typeof data === 'object' && data.results && !Array.isArray(data.results) ? data.results : data\n\t\t\t\tconst { [key]: dropped, ...errors } = this.recordErrors\n\t\t\t\tthis.recordErrors = errors\n\t\t\t\tif (!task || typeof task !== 'object' || Array.isArray(task)) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tthis.records = { ...this.records, [key]: task }\n\t\t\t\treturn task\n\t\t\t} catch (error) {\n\t\t\t\tconst { [key]: dropped, ...records } = this.records\n\t\t\t\tthis.records = records\n\t\t\t\tthis.recordErrors = { ...this.recordErrors, [key]: error?.response?.status ?? null }\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(`[useTaskInboxStore] Loading task \"${key}\" failed`, error)\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read one inbox page WITHOUT touching the store's state, so a surface\n\t\t * that lists a different slice (the Tasks tab of one record) cannot\n\t\t * overwrite what an inbox page on the same screen shows.\n\t\t *\n\t\t * @param {object} [config] Loader config, as for `load`.\n\t\t * @return {Promise<{results: Array<object>, total: number}>} The rows and the total.\n\t\t * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n\t\t */\n\t\tasync fetchFor(config = {}) {\n\t\t\tconst params = { scope: 'assigned', sort: '-dueAt' }\n\t\t\tfor (const key of ALLOWED_PARAMS) {\n\t\t\t\tconst value = config ? config[key] : undefined\n\t\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tparams[key] = (key === 'overdue' || key === 'isTerminal' || key === 'openFirst') ? String(value) : value\n\t\t\t}\n\t\t\tconst response = await axios.get(generateUrl(FLOW_TASKS_URL), { params })\n\t\t\tconst results = response.data?.results || []\n\t\t\treturn { results, total: Number(response.data?.total ?? results.length) || 0 }\n\t\t},\n\n\t\t/**\n\t\t * Create a flow task. A refusal is returned, not thrown, with the\n\t\t * server's message and the HTTP status (404: the creator may not read\n\t\t * the record).\n\t\t *\n\t\t * @param {object} data See `buildFlowTaskBody`.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), task: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n\t\t */\n\t\tasync createTask(data) {\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(generateUrl(FLOW_TASKS_URL), buildFlowTaskBody(data))\n\t\t\t\treturn { ok: true, status: response.status || 201, task: response.data?.task || response.data || null, message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, task: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run one lifecycle verb on a task (`claim`, `unclaim`, `reassign`,\n\t\t * `complete`, `cancel`). A refusal is returned, not thrown, with the\n\t\t * server's message, so the row can show it and stay as it was.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {string} verb The verb.\n\t\t * @param {object} [body] Optional body (for `reassign`: `{ assignee }`).\n\t\t * @return {Promise<{ok: boolean, status: (number|null), task: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/tasks-tab-flow-task-source/tasks.md#task-1\n\t\t */\n\t\tasync runVerb(uuid, verb, body = {}) {\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(generateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(uuid)}/${encodeURIComponent(verb)}`), body || {})\n\t\t\t\treturn { ok: true, status: response.status || 200, task: response.data?.task || response.data || null, message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, task: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run one lifecycle verb on a task read for a detail page, and keep\n\t\t * that record in step with the engine's answer.\n\t\t *\n\t\t * `url` replaces the engine's own verb route for an app that puts a\n\t\t * step of its own in front of the engine (dossiq completes a task\n\t\t * through its own endpoint, which checks the case type's form first).\n\t\t * `{id}` in it is the task uuid. A refusal is returned with the\n\t\t * server's message as-is and leaves the record as it was.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {string} verb The verb.\n\t\t * @param {{url?: string}} [options] An app route to post the verb to instead.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), record: (object|null), message: string}>} The outcome.\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\tasync runRecordVerb(uuid, verb, options = {}) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tconst name = String(verb || '').trim()\n\t\t\tif (key === '' || name === '') {\n\t\t\t\treturn { ok: false, status: null, record: null, message: '' }\n\t\t\t}\n\t\t\tconst route = typeof options.url === 'string' && options.url !== ''\n\t\t\t\t? options.url.replace('{id}', encodeURIComponent(key))\n\t\t\t\t: `${FLOW_TASKS_URL}/${encodeURIComponent(key)}/${encodeURIComponent(name)}`\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(generateUrl(route), {})\n\t\t\t\treturn { ok: true, status: response.status || 200, record: await this.keepRecord(key, response.data), message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, record: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Tick or untick one checklist item on a task read for a detail page\n\t\t * (`PATCH /flow-tasks/{uuid}/checklist/{itemId}?checked=`). The engine\n\t\t * answers with the whole task, which replaces the record, so a refused\n\t\t * tick leaves the item as it was on screen.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {string} itemId The checklist item id.\n\t\t * @param {boolean} checked The new state.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), 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\tasync checkRecordItem(uuid, itemId, checked) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tconst item = String(itemId || '').trim()\n\t\t\tif (key === '' || item === '') {\n\t\t\t\treturn { ok: false, status: null, record: null, message: '' }\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.patch(\n\t\t\t\t\tgenerateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(key)}/checklist/${encodeURIComponent(item)}`),\n\t\t\t\t\tnull,\n\t\t\t\t\t{ params: { checked: checked === true ? 'true' : 'false' } },\n\t\t\t\t)\n\t\t\t\treturn { ok: true, status: response.status || 200, record: await this.keepRecord(key, response.data), message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, record: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Edit a task's own fields (`PATCH /flow-tasks/{uuid}` with the\n\t\t * changed `title`, `description`, `dueAt`, `priority`). The engine\n\t\t * decides who may; its answer replaces the record, so a refused edit\n\t\t * leaves the task as it was on screen.\n\t\t *\n\t\t * @param {string} uuid The task uuid.\n\t\t * @param {object} changes The new values by field.\n\t\t * @return {Promise<{ok: boolean, status: (number|null), record: (object|null), message: string}>} The outcome.\n\t\t * @spec openspec/changes/task-edit-action/specs/record-source-verbs/spec.md#requirement-a-record-source-verb-can-ask-for-values-first\n\t\t */\n\t\tasync editRecord(uuid, changes) {\n\t\t\tconst key = String(uuid || '').trim()\n\t\t\tif (key === '' || !changes || typeof changes !== 'object') {\n\t\t\t\treturn { ok: false, status: null, record: null, message: '' }\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.patch(generateUrl(`${FLOW_TASKS_URL}/${encodeURIComponent(key)}`), changes)\n\t\t\t\treturn { ok: true, status: response.status || 200, record: await this.keepRecord(key, response.data), message: '' }\n\t\t\t} catch (error) {\n\t\t\t\treturn { ok: false, status: error?.response?.status ?? null, record: null, message: serverMessage(error) }\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Store the task a write answered with as the detail record. An answer\n\t\t * that carries no task (an app route that returns only a status) is\n\t\t * followed by a fresh read, so the page never shows the state from\n\t\t * before the write.\n\t\t *\n\t\t * @param {string} key The task uuid.\n\t\t * @param {unknown} data The response body.\n\t\t * @return {Promise<object|null>} The task now held.\n\t\t */\n\t\tasync keepRecord(key, data) {\n\t\t\tconst body = data && typeof data === 'object' ? data : null\n\t\t\tconst task = body && (body.results || body.task) && typeof (body.results || body.task) === 'object' && !Array.isArray(body.results || body.task)\n\t\t\t\t? (body.results || body.task)\n\t\t\t\t: body\n\t\t\tif (task && typeof task === 'object' && !Array.isArray(task) && String(task.uuid || '') === key) {\n\t\t\t\tthis.records = { ...this.records, [key]: task }\n\t\t\t\treturn task\n\t\t\t}\n\t\t\treturn this.fetchRecord(key)\n\t\t},\n\n\t\t/**\n\t\t * Load one inbox page.\n\t\t *\n\t\t * Defaults are the inbox's resting shape: the viewer's ASSIGNED tasks,\n\t\t * most urgent due date first (`-dueAt`). Every key is optional and\n\t\t * only allowlisted keys are forwarded; filtering, sorting and paging\n\t\t * are the server's, never applied over a returned page.\n\t\t *\n\t\t * @param {object} [config] Loader config from the page (`sourceConfig`\n\t\t * merged with the active quick-filter tab): `scope`, `state`,\n\t\t * `priority`, `kind`, `overdue`, `objectUuid`, `sort`, `limit`,\n\t\t * `offset`.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when the rows are in the store.\n\t\t *\n\t\t * @spec openspec/changes/cn-tasks-entity-source/specs/cn-tasks-entity-source/spec.md\n\t\t */\n\t\tasync load(config = {}) {\n\t\t\tconst params = { scope: 'assigned', sort: '-dueAt' }\n\t\t\tfor (const key of ALLOWED_PARAMS) {\n\t\t\t\tconst value = config ? config[key] : undefined\n\t\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// The endpoint reads `overdue` as a boolean-ish string; a quick\n\t\t\t\t// filter authors it as `true` for legibility.\n\t\t\t\tparams[key] = (key === 'overdue' || key === 'isTerminal' || key === 'openFirst') ? String(value) : value\n\t\t\t}\n\n\t\t\tthis.loading = true\n\t\t\tthis.error = null\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(FLOW_TASKS_URL), { params })\n\t\t\t\tthis.tasks = response.data?.results || []\n\t\t\t\tthis.total = Number(response.data?.total ?? this.tasks.length) || 0\n\t\t\t} catch (error) {\n\t\t\t\t// Surfaced, not swallowed: an empty inbox with no trace of why is\n\t\t\t\t// indistinguishable from a healthy quiet one.\n\t\t\t\tthis.error = error?.message || String(error)\n\t\t\t\tthis.tasks = []\n\t\t\t\tthis.total = 0\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[useTaskInboxStore] Loading the task inbox failed', error)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n})\n"],"names":["axios"],"mappings":"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"}
@@ -2379,7 +2379,8 @@ var translations = {
2379
2379
  "You save the order along with a view.": "You save the order along with a view.",
2380
2380
  me: "me",
2381
2381
  "Open profile": "Open profile",
2382
- "Link a contact from your address book.": "Link a contact from your address book."
2382
+ "Link a contact from your address book.": "Link a contact from your address book.",
2383
+ "The value could not be shown.": "The value could not be shown."
2383
2384
  };
2384
2385
  var plurals = {
2385
2386
  "{count} member": [
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2629,7 +2629,11 @@ var translations = {
2629
2629
  "You save the order along with a view.": "De sortering bewaart u mee in een weergave.",
2630
2630
  me: "ik",
2631
2631
  "Open profile": "Profiel openen",
2632
- "Link a contact from your address book.": "Koppel een contact uit je adresboek."
2632
+ "Link a contact from your address book.": "Koppel een contact uit je adresboek.",
2633
+ "The value could not be shown.": "De waarde kon niet worden getoond.",
2634
+ "Save as draft": "Opslaan als concept",
2635
+ "Draft saved at {time}": "Concept opgeslagen om {time}",
2636
+ "The draft could not be saved": "Het concept kon niet worden opgeslagen"
2633
2637
  };
2634
2638
  var plurals = {
2635
2639
  "{count} member": [
@@ -1 +1 @@
1
- {"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}