@conduction/nextcloud-vue 2.143.0 → 2.144.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +7 -2
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -1
- package/dist/esm/components/CnEventsCard/CnEventsCard.vue.js +1 -1
- package/dist/esm/components/CnEventsCard/CnEventsCard.vue2.js +9 -0
- package/dist/esm/components/CnEventsCard/CnEventsCard.vue2.js.map +1 -1
- package/dist/esm/components/CnEventsCard/CnEventsCard.vue3.js +24 -13
- package/dist/esm/components/CnEventsCard/CnEventsCard.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +2 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +3 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js +3 -0
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js +19 -14
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js +30 -0
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue3.js +158 -102
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +1 -1
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js +12 -0
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue.js +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +110 -2
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +146 -80
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js +45 -0
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue3.js +67 -34
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue.js +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js +3 -22
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/eventStatus.js +67 -0
- package/dist/esm/integrations/builtin/calendar/eventStatus.js.map +1 -0
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +39 -0
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js +81 -32
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue.js +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +5 -6
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/deckCardParts.js +59 -0
- package/dist/esm/integrations/builtin/deck/deckCardParts.js.map +1 -0
- package/dist/esm/l10n/en.json.js +6 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +6 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +815 -363
- package/dist/esm/utils/fetchFilterCounts.js +5 -2
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
- package/dist/esm/utils/nextcloudDirectory.js +19 -6
- package/dist/esm/utils/nextcloudDirectory.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +1347 -758
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +815 -363
- package/l10n/en.json +6 -0
- package/l10n/nl.json +6 -0
- package/package.json +1 -1
- package/src/components/CnActionDialog/CnActionDialog.vue +28 -3
- package/src/components/CnConversationThread/CnConversationThread.vue +5 -2
- package/src/components/CnEventsCard/CnEventsCard.vue +27 -5
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +15 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +3 -1
- package/src/components/CnNotesCard/CnNotesCard.vue +8 -0
- package/src/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue +114 -46
- package/src/components/CnRetentionWidget/CnRetentionWidget.vue +26 -1
- package/src/components/CnTasksWidget/CnTasksWidget.vue +170 -13
- package/src/css/dialog.css +7 -1
- package/src/css/kpi-card.css +3 -0
- package/src/css/look-board-detail.css +317 -0
- package/src/css/look-board-index.css +14 -0
- package/src/css/look-board.css +25 -0
- package/src/integrations/builtin/calendar/CnCalendarCard.vue +76 -11
- package/src/integrations/builtin/calendar/CnCalendarTab.vue +3 -22
- package/src/integrations/builtin/calendar/__tests__/CnCalendarCardBoardRows.spec.js +52 -0
- package/src/integrations/builtin/calendar/eventStatus.js +63 -0
- package/src/integrations/builtin/deck/CnDeckCard.vue +66 -0
- package/src/integrations/builtin/deck/CnDeckTab.vue +5 -6
- package/src/integrations/builtin/deck/__tests__/CnDeckCardBoardRows.spec.js +49 -0
- package/src/integrations/builtin/deck/deckCardParts.js +56 -0
- package/src/utils/fetchFilterCounts.js +5 -2
- package/src/utils/nextcloudDirectory.js +19 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnTasksWidget.vue2.js","sources":["../../../../src/components/CnTasksWidget/CnTasksWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-tasks-widget\" :class=\"{ 'cn-tasks-widget--list': isList }\">\n\t\t<!-- One quiet line on failure, never a leaked axios status string\n\t\t (ADR-062). The real error goes to the console. -->\n\t\t<p v-if=\"error\" class=\"cn-tasks-widget__error\">\n\t\t\t{{ tr('Could not load the tasks') }}\n\t\t</p>\n\t\t<div v-else-if=\"loading && rows.length === 0\" class=\"cn-tasks-widget__loading\">\n\t\t\t<NcLoadingIcon :size=\"24\" />\n\t\t</div>\n\t\t<!-- An empty inbox is the GOOD state, not an error and not a void:\n\t\t one muted line, no illustration. -->\n\t\t<template v-else-if=\"isTable\">\n\t\t\t<!-- The create form the header's \"New task\" opens: a title and a\n\t\t\t deadline, posted as an open task on this record. -->\n\t\t\t<form\n\t\t\t\tv-if=\"createOpen\"\n\t\t\t\tclass=\"cn-tasks-widget__create\"\n\t\t\t\tdata-testid=\"cn-tasks-widget-create\"\n\t\t\t\t@submit.prevent=\"createTask\">\n\t\t\t\t<NcTextField\n\t\t\t\t\t:modelValue=\"newTitle\"\n\t\t\t\t\t:label=\"tr('Task')\"\n\t\t\t\t\tdata-testid=\"cn-tasks-widget-create-title\"\n\t\t\t\t\t@update:modelValue=\"(value) => (newTitle = String(value ?? ''))\" />\n\t\t\t\t<NcTextField\n\t\t\t\t\t:modelValue=\"newDue\"\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t:label=\"tr('Task deadline')\"\n\t\t\t\t\tdata-testid=\"cn-tasks-widget-create-due\"\n\t\t\t\t\t@update:modelValue=\"(value) => (newDue = String(value ?? ''))\" />\n\t\t\t\t<NcButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t:disabled=\"creating || newTitle.trim() === ''\"\n\t\t\t\t\tdata-testid=\"cn-tasks-widget-create-save\">\n\t\t\t\t\t{{ tr('Add task') }}\n\t\t\t\t</NcButton>\n\t\t\t</form>\n\t\t\t<p v-if=\"tableRows.length === 0\" class=\"cn-tasks-widget__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</p>\n\t\t\t<table v-else class=\"cn-tasks-widget__table\" data-testid=\"cn-tasks-widget-table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ tr('Task') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ tr('Handler') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ tr('Task deadline') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t{{ tr('Status') }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ tr('Task actions') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr\n\t\t\t\t\t\tv-for=\"task in tableRows\"\n\t\t\t\t\t\t:key=\"task.uuid\"\n\t\t\t\t\t\tclass=\"cn-tasks-widget__table-row\"\n\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__table-row--done': task.isTerminal === true }\"\n\t\t\t\t\t\t:data-state=\"task.state\"\n\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-row-${task.uuid}`\">\n\t\t\t\t\t\t<td class=\"cn-tasks-widget__cell-task\">\n\t\t\t\t\t\t\t<CheckCircle\n\t\t\t\t\t\t\t\tv-if=\"task.isTerminal === true\"\n\t\t\t\t\t\t\t\t:size=\"20\"\n\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__state-icon cn-tasks-widget__state-icon--done\" />\n\t\t\t\t\t\t\t<CircleOutline v-else :size=\"20\" class=\"cn-tasks-widget__state-icon\" />\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tv-if=\"expandRows\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__name\"\n\t\t\t\t\t\t\t\t\t:aria-expanded=\"task.uuid === expandedId ? 'true' : 'false'\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-expand-${task.uuid}`\"\n\t\t\t\t\t\t\t\t\t@click=\"toggleExpanded(task)\">\n\t\t\t\t\t\t\t\t\t{{ titleOf(task) }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__name\"\n\t\t\t\t\t\t\t\t\t@click=\"onRowClick(task, $event)\"\n\t\t\t\t\t\t\t\t\t@auxclick=\"onRowAuxClick(task, $event)\">\n\t\t\t\t\t\t\t\t\t{{ titleOf(task) }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<span v-if=\"tableMeta(task)\" class=\"cn-tasks-widget__meta\">{{ tableMeta(task) }}</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"cn-tasks-widget__cell-handler\">\n\t\t\t\t\t\t\t<span v-if=\"task.assignee\" class=\"cn-tasks-widget__handler\">\n\t\t\t\t\t\t\t\t<NcAvatar\n\t\t\t\t\t\t\t\t\t:user=\"String(task.assignee)\"\n\t\t\t\t\t\t\t\t\t:displayName=\"handlerName(task)\"\n\t\t\t\t\t\t\t\t\t:size=\"28\"\n\t\t\t\t\t\t\t\t\thideStatus />\n\t\t\t\t\t\t\t\t{{ handlerName(task) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span v-else class=\"cn-tasks-widget__meta\">{{ tr('Unassigned') }}</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td\n\t\t\t\t\t\t\tclass=\"cn-tasks-widget__cell-due\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__due--overdue': task.overdue === true && task.isTerminal !== true }\">\n\t\t\t\t\t\t\t<template v-if=\"content.dueFormat === 'date'\">\n\t\t\t\t\t\t\t\t{{ dueDate(task) }}\n\t\t\t\t\t\t\t\t<span v-if=\"task.overdue === true && task.isTerminal !== true\" class=\"hidden-visually\">{{ tr('Overdue') }}</span>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t{{ dueLabel(task) }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t\t:label=\"stateLabel(task)\"\n\t\t\t\t\t\t\t\t:variant=\"stateVariant(task)\"\n\t\t\t\t\t\t\t\t:colorMap=\"stateColors\"\n\t\t\t\t\t\t\t\t:colorKey=\"String(task.state || '')\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"cn-tasks-widget__cell-actions\">\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"canClaim(task)\"\n\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-claim-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"claim(task)\">\n\t\t\t\t\t\t\t\t{{ tr('Claim') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-else-if=\"canCompleteRow(task) && outcomesOf(task).length === 1\"\n\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-complete-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"complete(task, outcomeId(outcomesOf(task)[0]))\">\n\t\t\t\t\t\t\t\t{{ tr('Complete') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcActions\n\t\t\t\t\t\t\t\tv-if=\"(canCompleteRow(task) && outcomesOf(task).length > 1) || canCancelRow(task)\"\n\t\t\t\t\t\t\t\t:forceMenu=\"true\"\n\t\t\t\t\t\t\t\t:aria-label=\"tr('Task actions')\">\n\t\t\t\t\t\t\t\t<template v-if=\"canCompleteRow(task) && outcomesOf(task).length > 1\">\n\t\t\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\t\t\tv-for=\"outcome in outcomesOf(task)\"\n\t\t\t\t\t\t\t\t\t\t:key=\"outcomeId(outcome)\"\n\t\t\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t\t\t@click=\"complete(task, outcomeId(outcome))\">\n\t\t\t\t\t\t\t\t\t\t{{ completeLabel(outcome) }}\n\t\t\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\t\tv-if=\"canCancelRow(task)\"\n\t\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-cancel-${task.uuid}`\"\n\t\t\t\t\t\t\t\t\t@click=\"cancel(task)\">\n\t\t\t\t\t\t\t\t\t{{ tr('Cancel task') }}\n\t\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t<router-link\n\t\t\t\tv-if=\"footerViewAll && $router\"\n\t\t\t\tclass=\"cn-tasks-widget__view-all\"\n\t\t\t\t:to=\"footerViewAll.to\"\n\t\t\t\tdata-testid=\"cn-tasks-widget-footer-link\">\n\t\t\t\t{{ footerViewAll.label }}\n\t\t\t</router-link>\n\t\t\t<!-- The opened row's task to work on in place (`expandRows`). -->\n\t\t\t<CnTaskWorkCard\n\t\t\t\tv-if=\"expandedTask\"\n\t\t\t\t:task=\"expandedTask\"\n\t\t\t\t:values=\"answersFor(expandedTask)\"\n\t\t\t\t:claimable=\"canClaim(expandedTask)\"\n\t\t\t\t:claimAvailable=\"claimAvailable\"\n\t\t\t\t:cancelable=\"content.cancel === true\"\n\t\t\t\t:busy=\"busy\"\n\t\t\t\t:openRoute=\"openRouteFor(expandedTask)\"\n\t\t\t\t:tr=\"tr\"\n\t\t\t\t@answer=\"recordAnswer(expandedTask, $event)\"\n\t\t\t\t@claim=\"claim(expandedTask)\"\n\t\t\t\t@complete=\"completeInPlace(expandedTask)\"\n\t\t\t\t@cancel=\"cancel(expandedTask)\" />\n\t\t</template>\n\t\t<!-- `variant: \"focus\"`: the first open task to work on in place, the\n\t\t other open tasks listed under it. -->\n\t\t<template v-else-if=\"isFocus\">\n\t\t\t<CnTaskWorkCard\n\t\t\t\tv-if=\"focusTask\"\n\t\t\t\t:task=\"focusTask\"\n\t\t\t\t:values=\"answersFor(focusTask)\"\n\t\t\t\t:claimable=\"canClaim(focusTask)\"\n\t\t\t\t:claimAvailable=\"claimAvailable\"\n\t\t\t\t:cancelable=\"content.cancel === true\"\n\t\t\t\t:busy=\"busy\"\n\t\t\t\t:openRoute=\"openRouteFor(focusTask)\"\n\t\t\t\t:tr=\"tr\"\n\t\t\t\t@answer=\"recordAnswer(focusTask, $event)\"\n\t\t\t\t@claim=\"claim(focusTask)\"\n\t\t\t\t@complete=\"completeInPlace(focusTask)\"\n\t\t\t\t@cancel=\"cancel(focusTask)\" />\n\t\t\t<p v-else class=\"cn-tasks-widget__empty\" data-testid=\"cn-tasks-widget-empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</p>\n\t\t\t<div v-if=\"otherOpenTasks.length > 0\" class=\"cn-tasks-widget__others\" data-testid=\"cn-tasks-widget-others\">\n\t\t\t\t<h5 class=\"cn-tasks-widget__others-title\">\n\t\t\t\t\t{{ tr('Other open tasks') }}\n\t\t\t\t</h5>\n\t\t\t\t<ul class=\"cn-tasks-widget__others-list\">\n\t\t\t\t\t<li\n\t\t\t\t\t\tv-for=\"task in otherOpenTasks\"\n\t\t\t\t\t\t:key=\"task.uuid\"\n\t\t\t\t\t\tclass=\"cn-tasks-widget__others-row\"\n\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-other-${task.uuid}`\">\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t<router-link v-if=\"openRouteFor(task) && $router\" :to=\"openRouteFor(task)\" class=\"cn-tasks-widget__name\">\n\t\t\t\t\t\t\t\t{{ titleOf(task) }}\n\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t<span v-else class=\"cn-tasks-widget__name\">{{ titleOf(task) }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__meta\">{{ dueLabel(task) || tr('No due date') }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__others-actions\">\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"canClaim(task)\"\n\t\t\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-claim-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"claim(task)\">\n\t\t\t\t\t\t\t\t{{ tr('Claim') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-complete-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"complete(task, 'done')\">\n\t\t\t\t\t\t\t\t{{ tr('Complete') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"content.cancel === true\"\n\t\t\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-cancel-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"cancel(task)\">\n\t\t\t\t\t\t\t\t{{ tr('Cancel task') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<router-link\n\t\t\t\tv-if=\"focusViewAll && $router\"\n\t\t\t\tclass=\"cn-tasks-widget__view-all\"\n\t\t\t\t:to=\"focusViewAll.to\"\n\t\t\t\tdata-testid=\"cn-tasks-widget-view-all\">\n\t\t\t\t{{ focusViewAll.label }}\n\t\t\t</router-link>\n\t\t</template>\n\t\t<p v-else-if=\"rows.length === 0\" class=\"cn-tasks-widget__empty\">\n\t\t\t{{ emptyLabel }}\n\t\t</p>\n\t\t<template v-else>\n\t\t\t<!-- The count states the server TOTAL, never the rendered length\n\t\t\t (ADR-062): the number a person acts on is how much work\n\t\t\t exists, not how much fits the cell. -->\n\t\t\t<p v-if=\"!isList\" class=\"cn-tasks-widget__count\">\n\t\t\t\t{{ countLabel }}\n\t\t\t</p>\n\t\t\t<ul class=\"cn-tasks-widget__list\">\n\t\t\t\t<li\n\t\t\t\t\tv-for=\"task in rows\"\n\t\t\t\t\t:key=\"task.uuid\"\n\t\t\t\t\tclass=\"cn-tasks-widget__row\"\n\t\t\t\t\t:data-state=\"task.state\"\n\t\t\t\t\t@click=\"onRowClick(task, $event)\"\n\t\t\t\t\t@mousedown=\"preventMiddleClickAutoscroll\"\n\t\t\t\t\t@auxclick=\"onRowAuxClick(task, $event)\">\n\t\t\t\t\t<!-- List variant: a checkbox completes the viewer's own task\n\t\t\t\t\t (the task with a declared outcome list keeps the menu, as\n\t\t\t\t\t a checkbox cannot choose an outcome). Other rows get a\n\t\t\t\t\t spacer so the titles stay aligned. -->\n\t\t\t\t\t<template v-if=\"isList\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tv-if=\"canCheck(task)\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"cn-tasks-widget__check\"\n\t\t\t\t\t\t\t:checked=\"completing.includes(String(task.uuid))\"\n\t\t\t\t\t\t\t:disabled=\"completing.includes(String(task.uuid))\"\n\t\t\t\t\t\t\t:aria-label=\"tr('Mark {title} as done').replace('{title}', titleOf(task))\"\n\t\t\t\t\t\t\tdata-testid=\"cn-tasks-widget-check\"\n\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t@change=\"check(task)\">\n\t\t\t\t\t\t<span v-else class=\"cn-tasks-widget__check-spacer\" aria-hidden=\"true\" />\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__name\">{{ titleOf(task) }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__meta cn-tasks-widget__meta--split\">\n\t\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__subject\">{{ subjectOf(task) }}</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__due\"\n\t\t\t\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__due--overdue': task.overdue === true }\">\n\t\t\t\t\t\t\t\t\t{{ dueLabel(task) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__name\">{{ titleOf(task) }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__meta\">{{ metaLine(task) }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<!-- Overdue is carried by the WORDING (taskDueLabel) and by\n\t\t\t\t\t\t weight; the colour only reinforces it. -->\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"cn-tasks-widget__due\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__due--overdue': task.overdue === true }\">\n\t\t\t\t\t\t\t{{ dueLabel(task) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<!-- Only verbs the contract can accept are offered; the\n\t\t\t\t\t server still authorizes, and a refusal is toasted in\n\t\t\t\t\t its own words. Stopped clicks: the menu must not also\n\t\t\t\t\t open the row. -->\n\t\t\t\t\t<NcActions\n\t\t\t\t\t\tv-if=\"(canClaim(task) || canComplete(task)) && !(isList && canCheck(task))\"\n\t\t\t\t\t\tclass=\"cn-tasks-widget__actions\"\n\t\t\t\t\t\t:forceMenu=\"true\"\n\t\t\t\t\t\t:aria-label=\"tr('Task actions')\"\n\t\t\t\t\t\t@click.stop>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-if=\"canClaim(task)\"\n\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t@click=\"claim(task)\">\n\t\t\t\t\t\t\t{{ tr('Claim') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<template v-if=\"canComplete(task)\">\n\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\tv-for=\"outcome in outcomesOf(task)\"\n\t\t\t\t\t\t\t\t:key=\"outcomeId(outcome)\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t@click=\"complete(task, outcomeId(outcome))\">\n\t\t\t\t\t\t\t\t{{ completeLabel(outcome) }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcActions>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<!-- The remainder is a count, never a scrollbar (ADR-062). -->\n\t\t\t<p v-if=\"hiddenCount > 0\" class=\"cn-tasks-widget__more\">\n\t\t\t\t{{ moreLabel }}\n\t\t\t</p>\n\t\t</template>\n\t\t<!-- A task that asks for a form is completed through it. -->\n\t\t<CnTaskFormDialog\n\t\t\tv-if=\"formTask\"\n\t\t\t:task=\"formTask\"\n\t\t\t:outcome=\"formOutcome\"\n\t\t\t:completeUrl=\"content.completeUrl || ''\"\n\t\t\t@completed=\"onFormCompleted\"\n\t\t\t@close=\"formTask = null\" />\n\t</div>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcActionButton, NcActions, NcAvatar, NcButton, NcLoadingIcon, NcTextField } from '@nextcloud/vue'\nimport { inject, ref } from 'vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport CircleOutline from 'vue-material-design-icons/CircleOutline.vue'\nimport CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'\nimport CnTaskFormDialog from '../CnTaskFormDialog/CnTaskFormDialog.vue'\nimport CnTaskWorkCard from './CnTaskWorkCard.vue'\nimport { taskDeepLink, taskDueLabel } from '../../composables/indexSources.js'\nimport { useEndpointSource } from '../../composables/useEndpointSource.js'\nimport { isBadgeVariant } from '../../utils/badgeVariants.js'\nimport { contentHeaderLink } from '../../utils/contentHeaderLink.js'\nimport { missingRequiredTaskField, taskForm } from '../../utils/flowTask.js'\nimport { openRowTarget } from '../../utils/linkNavigation.js'\nimport { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'\nimport { userDisplayName } from '../../utils/userDisplayName.js'\nimport { userLocale } from '../../utils/userLocale.js'\n\n/**\n * The OpenRegister inbox read (openregister flow-task-entity). One endpoint\n * for the whole fleet: every app's human tasks live on OpenRegister's one\n * task store, so the widget is app-agnostic and ships no controller.\n *\n * @type {string}\n */\nconst FLOW_TASKS_URL = '/apps/openregister/api/flow-tasks'\n\n/**\n * The CMMN states, in the reading a dashboard needs. Labels double as the\n * meta-line words, so state never rests on styling.\n *\n * @type {Record<string, string>}\n */\nconst STATE_LABELS = {\n\tavailable: 'Available',\n\tenabled: 'Ready to claim',\n\tactive: 'In progress',\n\tcompleted: 'Completed',\n\tterminated: 'Terminated',\n\tdisabled: 'Disabled',\n}\n\n/**\n * The priority vocabulary (openregister Task::PRIORITIES).\n *\n * @type {Record<string, string>}\n */\nconst PRIORITY_LABELS = {\n\tlow: 'Low',\n\tnormal: 'Normal',\n\thigh: 'High',\n\turgent: 'Urgent',\n}\n\n/**\n * CnTasksWidget — the viewer's open tasks, from OpenRegister's task inbox.\n *\n * Reads `flow-tasks` with `isTerminal=false` (an inbox widget that showed\n * finished tasks would never drain), scoped by `content.scope` and sorted by\n * due date so the most urgent row sits on top. Placed by its registry type\n * key `tasks`:\n *\n * ```js\n * { id: 'my-tasks', type: 'tasks', title: 'My tasks',\n * content: { scope: 'assigned', limit: 6, pollSeconds: 30 } }\n * ```\n *\n * Why it polls: tasks are handed out, claimed and completed by OTHER people\n * and by flows, so a widget that only reflected its mount moment would be\n * wrong within minutes and look identical to being right. Polling pauses\n * while the tab is hidden.\n *\n * Quick actions offer only what the row's contract can accept: claim on a\n * pooled row, complete (per declared outcome) on the viewer's own open row.\n * The server still authorizes; a refusal surfaces its `error` message as a\n * toast and the widget refetches, so a lost claim race corrects the row.\n *\n * @spec openspec/changes/cn-tasks-entity-source/specs/cn-tasks-entity-source/spec.md\n */\nexport default {\n\tname: 'CnTasksWidget',\n\n\tcomponents: {\n\t\tCheckCircle,\n\t\tCircleOutline,\n\t\tCnStatusBadge,\n\t\tCnTaskFormDialog,\n\t\tCnTaskWorkCard,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcAvatar,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Host translate function, provided by CnAppRoot (identity by default)\n\t\t * so a library string localises through the consuming app's l10n.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget's persisted configuration blob.\n\t\t *\n\t\t * - `scope` — whose relationship to list: `assigned` (default),\n\t\t * `pooled`, `watched` or `all`. Whose INBOX it is stays the\n\t\t * endpoint's decision; scope never names another user.\n\t\t * - `limit` — rows to request AND show (1–50, default 6). The count\n\t\t * line always states the server total regardless of this cap.\n\t\t * - `pollSeconds` — refetch interval (default 30; `0` disables).\n\t\t * - `rowRoute` — vue-router route NAME to open on a row click,\n\t\t * receiving the task uuid as `:id`. Omitted = the click opens the\n\t\t * task's openregister deep link instead.\n\t\t * - `emptyText` — override for the empty-inbox line.\n\t\t * - `variant` — `list` draws a checkbox list: a checkbox that completes\n\t\t * the viewer's own task, the title, the subject on a second muted\n\t\t * line and the due date at its right. Default: the compact rows.\n\t\t * - `viewAllRoute` / `viewAllLabel` — a \"View all\" text link in the\n\t\t * card header: a route name or location `{ name, params?, query? }`,\n\t\t * and its label (default \"View all\"). `headerLink` works too.\n\t\t * - `objectUuid` — the tasks on one record (`\"@objectId\"` reads the\n\t\t * page's record), every assignee's, instead of the viewer's inbox.\n\t\t * - `includeDone` — also list finished tasks (after the open ones).\n\t\t * - `variant: 'table'` — the record's task table (board DqZaakTaken):\n\t\t * task, handler, deadline, status and the row's verbs, with the\n\t\t * summary (\"1 open, 3 done · sorted by deadline\") and a \"New task\"\n\t\t * action in the card header.\n\t\t * - `create` — offer \"New task\": `true`, or `{ appId?, label? }`; the\n\t\t * task is posted as an open task on `objectUuid`.\n\t\t * - `completeAny` — offer Complete on every open row, not only the\n\t\t * viewer's own (the server still decides); `cancel` — offer Cancel.\n\t\t * - `variant: 'focus'` — the first open task to work on in place: its\n\t\t * number, handler, deadline, lock, who it is offered to, its form\n\t\t * inline and its verbs, with the other open tasks listed under it.\n\t\t * - `expandRows` — in the table, a row's title opens that task to work\n\t\t * on in place under the table instead of following `rowRoute`; the\n\t\t * opened task's title links to `rowRoute`.\n\t\t * - `completeUrl` — the route Complete posts to instead of the engine's\n\t\t * own (`{id}` is the task uuid), for an app that checks something of\n\t\t * its own before the engine completes the task.\n\t\t * - `stateVariants` — the status pill's tone by engine state\n\t\t * (`{ active: 'purple', enabled: 'warning' }`); a state it does not\n\t\t * name keeps info while open and default once finished.\n\t\t * - `claimCapabilityUrl` — a URL answering `{ claim: true|false }`;\n\t\t * Claim is offered only when it answers true. Without it Claim is\n\t\t * offered on every pooled task.\n\t\t * - Table only: `dueFormat: \"date\"` shows the deadline as a short date\n\t\t * (an overdue one still says so to a screen reader and in its\n\t\t * weight); `stateLabels` (`{ <state>: label }`) and `stateColors`\n\t\t * (`{ <state>: tone }`, a badge variant or board hue) word and colour\n\t\t * the status; `viewAllPlacement: \"footer\"` draws the view-all link\n\t\t * under the table instead of in the card header.\n\t\t *\n\t\t * A task that carries a form is completed through CnTaskFormDialog, or\n\t\t * with its form inline in the focus and opened-row cards.\n\t\t *\n\t\t * @type {{scope?: string, limit?: number, pollSeconds?: number, rowRoute?: string, emptyText?: string, variant?: string, viewAllRoute?: (string|object), viewAllLabel?: string, objectUuid?: string, includeDone?: boolean, create?: (boolean|{appId?: string, label?: string}), completeAny?: boolean, cancel?: boolean, expandRows?: boolean, completeUrl?: string, claimCapabilityUrl?: string, dueFormat?: string, stateLabels?: object, stateColors?: object, viewAllPlacement?: string}}\n\t\t * @type {{scope?: string, limit?: number, pollSeconds?: number, rowRoute?: string, emptyText?: string, variant?: string, viewAllRoute?: (string|object), viewAllLabel?: string, objectUuid?: string, includeDone?: boolean, create?: (boolean|{appId?: string, label?: string}), completeAny?: boolean, cancel?: boolean, expandRows?: boolean, completeUrl?: string, claimCapabilityUrl?: string, stateVariants?: {[state: string]: string}}}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * Widget placement id, so the per-widget Refresh action\n\t\t * (`cn:widget:refresh`) reaches this instance's fetch.\n\t\t */\n\t\twidgetId: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The page's record id, for `objectUuid: \"@objectId\"`. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Translate function. Falls back to the injected `cnTranslate`.\n\t\t * Provide explicitly when mounting outside a CnAppRoot ancestor.\n\t\t *\n\t\t * @type {((key: string) => string)|null}\n\t\t */\n\t\ttranslate: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['header'],\n\n\tsetup(props) {\n\t\t// The shared endpoint engine owns request dedup, the short-TTL cache\n\t\t// and the cn:page:refresh / cn:widget:refresh subscriptions — the\n\t\t// same binding CnFlowRunsWidget uses, so a page-level Refresh updates\n\t\t// this widget with everything else on the page.\n\t\tconst widgetIdRef = ref(props.widgetId)\n\t\tconst source = () => {\n\t\t\tconst content = props.content || {}\n\t\t\tconst objectUuid = recordUuid(content.objectUuid, props.objectId)\n\t\t\tconst params = {\n\t\t\t\t// A record's tasks are everyone's: scoping them to the viewer\n\t\t\t\t// would make the record look finished while a colleague works.\n\t\t\t\tscope: objectUuid !== '' && !content.scope ? 'all' : normaliseScope(content.scope),\n\t\t\t\t// Ascending due date: the most urgent (overdue first) on top.\n\t\t\t\tsort: 'dueAt',\n\t\t\t\tlimit: normaliseLimit(content.limit),\n\t\t\t}\n\t\t\tif (objectUuid !== '') {\n\t\t\t\tparams.objectUuid = objectUuid\n\t\t\t}\n\t\t\t// An inbox drains: finished tasks leave the widget, unless the\n\t\t\t// widget lists a record's work, done included (`includeDone`).\n\t\t\tif (content.includeDone !== true) {\n\t\t\t\tparams.isTerminal = 'false'\n\t\t\t}\n\t\t\treturn { url: FLOW_TASKS_URL, method: 'GET', params }\n\t\t}\n\t\tconst { data, loading, error, refetch } = useEndpointSource(source, {\n\t\t\twidgetId: widgetIdRef,\n\t\t})\n\n\t\t// `inject` is re-read in setup so Vue 2.7 and Vue 3 resolve it\n\t\t// identically to the Options `inject` block (CnStatWidget precedent).\n\t\tconst injectedTranslate = inject('cnTranslate', null)\n\n\t\treturn {\n\t\t\tpayload: data,\n\t\t\tloading,\n\t\t\terror,\n\t\t\trefetch,\n\t\t\tinjectedTranslate,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tpollTimer: null,\n\t\t\t/** Uuids of the tasks a checkbox is completing, until the next read. */\n\t\t\tcompleting: [],\n\t\t\t/** Whether the table's create form is open. */\n\t\t\tcreateOpen: false,\n\t\t\t/** The new task's title and deadline. */\n\t\t\tnewTitle: '',\n\t\t\tnewDue: '',\n\t\t\t/** Whether the new task is being posted. */\n\t\t\tcreating: false,\n\t\t\t/** The engine's answer to `claimCapabilityUrl`: true, false, or null while unasked. */\n\t\t\tclaimCapable: null,\n\t\t\t/** The table row opened to work on in place, by uuid. */\n\t\t\texpandedId: '',\n\t\t\t/** One answer set per task, keyed by uuid, for the inline forms. */\n\t\t\tanswers: {},\n\t\t\t/** Whether a verb from a work card is in flight. */\n\t\t\tbusy: false,\n\t\t\t/** The task whose form dialog is open, and the outcome it completes with. */\n\t\t\tformTask: null,\n\t\t\tformOutcome: 'done',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the rows draw as the checkbox list (`content.variant: 'list'`).\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisList() {\n\t\t\treturn this.content.variant === 'list'\n\t\t},\n\n\t\t/**\n\t\t * Whether the rows draw as the record's task table (`variant: 'table'`).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tisTable() {\n\t\t\treturn this.content.variant === 'table'\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget shows the first open task to work on in place\n\t\t * (`variant: 'focus'`).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-the-first-open-task-can-be-worked-on-in-place\n\t\t */\n\t\tisFocus() {\n\t\t\treturn this.content.variant === 'focus'\n\t\t},\n\n\t\t/** @return {boolean} Whether a table row's title opens it in place. */\n\t\texpandRows() {\n\t\t\treturn this.content.expandRows === true\n\t\t},\n\n\t\t/** @return {Array<object>} The open tasks, in due order. */\n\t\topenTasks() {\n\t\t\treturn this.rows.filter((task) => task.isTerminal !== true)\n\t\t},\n\n\t\t/** @return {object|null} The task the focus card shows: the first open one. */\n\t\tfocusTask() {\n\t\t\treturn this.openTasks[0] ?? null\n\t\t},\n\n\t\t/** @return {Array<object>} The open tasks after the focus card's. */\n\t\totherOpenTasks() {\n\t\t\treturn this.openTasks.slice(1)\n\t\t},\n\n\t\t/**\n\t\t * Whether the table draws its \"View all\" link under the table rather\n\t\t * than in the card header (`viewAllPlacement: \"footer\"`, DqZaakTaken).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tlinkInFooter() {\n\t\t\treturn this.isTable && this.content.viewAllPlacement === 'footer'\n\t\t},\n\n\t\t/**\n\t\t * The table's footer link, with `viewAllPlacement: \"footer\"`.\n\t\t *\n\t\t * @return {{to: object, label: string}|null}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tfooterViewAll() {\n\t\t\treturn this.linkInFooter ? this.focusViewAll : null\n\t\t},\n\n\t\t/**\n\t\t * The colours `content.stateColors` gives a state, by its raw value\n\t\t * (`{ active: \"purple\" }`), or null.\n\t\t *\n\t\t * @return {object|null}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tstateColors() {\n\t\t\tconst map = this.content.stateColors\n\t\t\treturn map && typeof map === 'object' ? map : null\n\t\t},\n\n\t\t/**\n\t\t * The focus card's \"View all\" link: `viewAllRoute` with `@objectId`\n\t\t * in its query read from the page's record.\n\t\t *\n\t\t * @return {{to: object, label: string}|null}\n\t\t */\n\t\tfocusViewAll() {\n\t\t\tconst link = this.recordLink(this.headerLink)\n\t\t\tif (!link || typeof link.route !== 'string' || link.route === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst to = { name: link.route }\n\t\t\tif (link.params) {\n\t\t\t\tto.params = link.params\n\t\t\t}\n\t\t\tif (link.query) {\n\t\t\t\tto.query = link.query\n\t\t\t}\n\t\t\treturn { to, label: this.tr(link.label) }\n\t\t},\n\n\t\t/** @return {object|null} The opened table row, while it is still open. */\n\t\texpandedTask() {\n\t\t\tif (this.expandedId === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.openTasks.find((task) => String(task.uuid) === this.expandedId) ?? null\n\t\t},\n\n\t\t/**\n\t\t * Whether this instance can claim: true without a\n\t\t * `claimCapabilityUrl`, else what it answered (false until it did).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-claim-follows-a-capability\n\t\t */\n\t\tclaimAvailable() {\n\t\t\tconst url = this.content.claimCapabilityUrl\n\t\t\tif (typeof url !== 'string' || url === '') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn this.claimCapable === true\n\t\t},\n\n\t\t/**\n\t\t * The table's rows: the open tasks first, then the finished ones, each\n\t\t * in due order as the endpoint sorted them.\n\t\t *\n\t\t * @return {Array<object>} The rows.\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\ttableRows() {\n\t\t\treturn [...this.rows.filter((task) => task.isTerminal !== true), ...this.rows.filter((task) => task.isTerminal === true)]\n\t\t},\n\n\t\t/**\n\t\t * The table's summary for the card header: \"1 open, 3 done · sorted by deadline\".\n\t\t *\n\t\t * @return {string} The line.\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tsummaryLabel() {\n\t\t\tconst open = this.rows.filter((task) => task.isTerminal !== true).length\n\t\t\tconst done = this.rows.length - open\n\t\t\treturn this.tr('{open} open, {done} done · sorted by deadline')\n\t\t\t\t.replace('{open}', String(open))\n\t\t\t\t.replace('{done}', String(done))\n\t\t},\n\n\t\t/**\n\t\t * The card header's parts: the \"View all\" link, and for the table the\n\t\t * summary under the title and the \"New task\" action.\n\t\t *\n\t\t * @return {object} The header.\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\theader() {\n\t\t\t// The focus card draws its \"View all\" under the list itself, so it\n\t\t\t// shows inside a tab panel too, where no card header is drawn.\n\t\t\tconst header = { link: this.isFocus || this.linkInFooter ? null : this.recordLink(this.headerLink), note: '' }\n\t\t\tif (!this.isTable) {\n\t\t\t\treturn header\n\t\t\t}\n\t\t\theader.subtitle = this.loading && this.rows.length === 0 ? '' : this.summaryLabel\n\t\t\tif (this.content.create && this.recordUuid !== '') {\n\t\t\t\tconst label = typeof this.content.create === 'object' && this.content.create.label ? this.tr(this.content.create.label) : this.tr('New task')\n\t\t\t\theader.action = { label, icon: 'Plus', variant: 'primary', run: this.toggleCreate }\n\t\t\t}\n\t\t\treturn header\n\t\t},\n\n\t\t/**\n\t\t * The record the table lists tasks for, '' without one.\n\t\t *\n\t\t * @return {string} The uuid.\n\t\t */\n\t\trecordUuid() {\n\t\t\treturn recordUuid(this.content.objectUuid, this.objectId)\n\t\t},\n\n\t\t/**\n\t\t * The header \"View all\" link the content declares, or null.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\theaderLink() {\n\t\t\treturn contentHeaderLink(this.content)\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the explicit prop, then the injected\n\t\t * host one, then `@nextcloud/l10n` under the library's own app id.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\ttr() {\n\t\t\tconst fn = this.translate ?? this.injectedTranslate ?? this.cnTranslate\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\treturn (key) => fn(key)\n\t\t\t}\n\t\t\treturn (key) => t('nextcloud-vue', key)\n\t\t},\n\n\t\t/**\n\t\t * The signed-in viewer's uid, for the per-row action offer. Empty\n\t\t * outside a Nextcloud session (the offer then collapses to claim on\n\t\t * pooled rows only, which is the safe reading).\n\t\t *\n\t\t * @return {string} The uid, or ''.\n\t\t */\n\t\tviewerUid() {\n\t\t\treturn getCurrentUser()?.uid || ''\n\t\t},\n\n\t\t/**\n\t\t * The rows to render — the endpoint's bounded page, defensively\n\t\t * re-capped so a wider server default can never overflow the cell.\n\t\t *\n\t\t * @return {Array<object>} The task rows.\n\t\t */\n\t\trows() {\n\t\t\tconst results = (this.payload && this.payload.results) || []\n\t\t\tif (Array.isArray(results) === false) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn results.slice(0, normaliseLimit(this.content.limit))\n\t\t},\n\n\t\t/**\n\t\t * The server's honest total, independent of the rendered page.\n\t\t *\n\t\t * @return {number} The open-task total (never negative).\n\t\t */\n\t\ttotal() {\n\t\t\tconst total = Number((this.payload && this.payload.total) ?? this.rows.length)\n\t\t\tif (Number.isFinite(total) === false) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\treturn Math.max(0, total)\n\t\t},\n\n\t\t/** The count line above the rows. */\n\t\tcountLabel() {\n\t\t\tif (this.total === 1) {\n\t\t\t\treturn this.tr('1 open task')\n\t\t\t}\n\t\t\treturn this.tr('{count} open tasks').replace('{count}', String(this.total))\n\t\t},\n\n\t\t/**\n\t\t * How many open tasks exist beyond the rendered rows.\n\t\t *\n\t\t * @return {number} The hidden task count (never negative).\n\t\t */\n\t\thiddenCount() {\n\t\t\treturn Math.max(0, this.total - this.rows.length)\n\t\t},\n\n\t\t/** The \"+N more\" line. */\n\t\tmoreLabel() {\n\t\t\treturn this.tr('+{count} more').replace('{count}', String(this.hiddenCount))\n\t\t},\n\n\t\t/** The empty-inbox line. */\n\t\temptyLabel() {\n\t\t\tconst override = this.content.emptyText\n\t\t\tif (typeof override === 'string' && override !== '') {\n\t\t\t\treturn this.tr(override)\n\t\t\t}\n\t\t\treturn this.tr('No open tasks')\n\t\t},\n\n\t\t/**\n\t\t * Poll interval in ms, or 0 when polling is off. Floored at 5s so a\n\t\t * mis-authored `pollSeconds: 0.1` cannot turn a dashboard into a\n\t\t * request storm; `0` remains an explicit opt-out.\n\t\t *\n\t\t * @return {number} The interval in milliseconds.\n\t\t */\n\t\tpollMs() {\n\t\t\tconst raw = this.content.pollSeconds\n\t\t\tconst seconds = (raw === undefined || raw === null) ? 30 : Number(raw)\n\t\t\tif (Number.isFinite(seconds) === false || seconds <= 0) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\treturn Math.max(5, seconds) * 1000\n\t\t},\n\t},\n\n\twatch: {\n\t\theader: {\n\t\t\timmediate: true,\n\t\t\thandler(header) {\n\t\t\t\t/**\n\t\t\t\t * @event header Emitted with the card header's parts: the \"View all\" link, if any, and for the table its summary and \"New task\".\n\t\t\t\t * @type {{link: (object|null), note: string, subtitle?: string, action?: object}}\n\t\t\t\t */\n\t\t\t\tthis.$emit('header', header)\n\t\t\t},\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.loadClaimCapability()\n\t\tthis.startPolling()\n\t\tdocument.addEventListener('visibilitychange', this.onVisibilityChange)\n\t},\n\n\tbeforeUnmount() {\n\t\tthis.stopPolling()\n\t\tdocument.removeEventListener('visibilitychange', this.onVisibilityChange)\n\t},\n\n\tmethods: {\n\t\tpreventMiddleClickAutoscroll,\n\n\t\t/**\n\t\t * Start (or restart) the refetch interval, unless polling is off.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tstartPolling() {\n\t\t\tthis.stopPolling()\n\t\t\tif (this.pollMs === 0 || document.hidden === true) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.pollTimer = setInterval(() => {\n\t\t\t\tthis.refetch(true)\n\t\t\t}, this.pollMs)\n\t\t},\n\n\t\t/**\n\t\t * Clear the refetch interval.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tstopPolling() {\n\t\t\tif (this.pollTimer !== null) {\n\t\t\t\tclearInterval(this.pollTimer)\n\t\t\t\tthis.pollTimer = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pause polling while the tab is hidden; refetch once and resume on\n\t\t * return, so the dashboard shows current work rather than whatever\n\t\t * was true when the tab was backgrounded.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonVisibilityChange() {\n\t\t\tif (document.hidden === true) {\n\t\t\t\tthis.stopPolling()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.refetch(true)\n\t\t\tthis.startPolling()\n\t\t},\n\n\t\t/**\n\t\t * The row's display title (server-synthesized when untitled).\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The title.\n\t\t */\n\t\ttitleOf(task) {\n\t\t\treturn task.displayTitle || task.title || String(task.uuid || '')\n\t\t},\n\n\t\t/**\n\t\t * The subject (the case a task sits on), for the list variant's second line.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The subject's title, or ''.\n\t\t */\n\t\tsubjectOf(task) {\n\t\t\treturn task.subject && task.subject.title ? String(task.subject.title) : ''\n\t\t},\n\n\t\t/**\n\t\t * Whether the list variant draws a checkbox on the row: the viewer's own\n\t\t * open task, with no outcome list to choose from.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCheck(task) {\n\t\t\treturn this.canComplete(task) && !(Array.isArray(task.outcomes) && task.outcomes.length > 0)\n\t\t},\n\n\t\t/**\n\t\t * Complete a task from its checkbox, with the server's default outcome.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync check(task) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tif (uuid === '' || this.completing.includes(uuid)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.completing = [...this.completing, uuid]\n\t\t\tawait this.postVerb(task, 'complete', { outcome: 'done' })\n\t\t\tthis.completing = this.completing.filter((id) => id !== uuid)\n\t\t},\n\n\t\t/**\n\t\t * The secondary line: subject, state and priority — whichever of\n\t\t * those the row actually carries, in words.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The meta line.\n\t\t */\n\t\tmetaLine(task) {\n\t\t\tconst parts = []\n\t\t\tif (task.subject && task.subject.title) {\n\t\t\t\tparts.push(String(task.subject.title))\n\t\t\t}\n\t\t\tconst state = STATE_LABELS[task.state]\n\t\t\tparts.push(state ? this.tr(state) : String(task.state || ''))\n\t\t\tconst priority = PRIORITY_LABELS[task.priority]\n\t\t\tif (priority && task.priority !== 'normal') {\n\t\t\t\tparts.push(this.tr(priority))\n\t\t\t}\n\t\t\treturn parts.join(' · ')\n\t\t},\n\n\t\t/**\n\t\t * The due wording for a row, from the server's derived projection.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The due label, or '' without a due date.\n\t\t */\n\t\tdueLabel(task) {\n\t\t\treturn taskDueLabel(task)\n\t\t},\n\n\t\t/**\n\t\t * The due date as a short date (\"18 Oct\"), '' without one; for the\n\t\t * table with `dueFormat: \"date\"`.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tdueDate(task) {\n\t\t\tconst at = new Date(task?.dueAt ?? '')\n\t\t\treturn Number.isNaN(at.getTime()) ? '' : at.toLocaleDateString(userLocale(), { day: 'numeric', month: 'short' })\n\t\t},\n\n\t\t/**\n\t\t * Whether the row offers claim: pooled (no assignee) and still open.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean} True when claim is offered.\n\t\t */\n\t\tcanClaim(task) {\n\t\t\treturn !task.assignee && task.isTerminal !== true && this.claimAvailable\n\t\t},\n\n\t\t/**\n\t\t * Whether the row offers complete: the viewer's own open task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean} True when complete is offered.\n\t\t */\n\t\tcanComplete(task) {\n\t\t\treturn this.viewerUid !== ''\n\t\t\t\t&& task.assignee === this.viewerUid\n\t\t\t\t&& task.isTerminal !== true\n\t\t},\n\n\t\t/**\n\t\t * Whether a table row offers Complete: the viewer's own open task, or\n\t\t * any open task with `completeAny` (the server still decides).\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tcanCompleteRow(task) {\n\t\t\tif (task.isTerminal === true || this.canClaim(task)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.content.completeAny === true || this.canComplete(task)\n\t\t},\n\n\t\t/**\n\t\t * Whether a table row offers Cancel (`content.cancel`), for an open task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCancelRow(task) {\n\t\t\treturn this.content.cancel === true && task.isTerminal !== true\n\t\t},\n\n\t\t/**\n\t\t * Cancel a task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tcancel(task) {\n\t\t\treturn this.postVerb(task, 'cancel', {})\n\t\t},\n\n\t\t/**\n\t\t * The handler's display name, the uid until it resolves.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The name.\n\t\t */\n\t\thandlerName(task) {\n\t\t\treturn userDisplayName(task.assignee) || String(task.assignee || '')\n\t\t},\n\n\t\t/**\n\t\t * A table row's status in words: `content.stateLabels` first, through\n\t\t * the app's translate, then the library's.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The label.\n\t\t */\n\t\tstateLabel(task) {\n\t\t\tconst own = this.content.stateLabels && typeof this.content.stateLabels === 'object' ? this.content.stateLabels[task.state] : null\n\t\t\tif (typeof own === 'string' && own !== '') {\n\t\t\t\treturn this.tr(own)\n\t\t\t}\n\t\t\tconst state = STATE_LABELS[task.state]\n\t\t\treturn state ? this.tr(state) : String(task.state || '')\n\t\t},\n\n\t\t/**\n\t\t * The tone of a task's status pill: `stateVariants[state]` when that\n\t\t * names a badge variant, else info for an open task and default for a\n\t\t * finished one.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The badge variant.\n\t\t * @spec openspec/changes/tasks-state-variants/specs/tasks-state-variants/spec.md#requirement-a-task-status-pill-can-take-its-tone-from-its-state\n\t\t */\n\t\tstateVariant(task) {\n\t\t\tconst map = this.content && this.content.stateVariants\n\t\t\tconst named = map && typeof map === 'object' ? map[task.state] : undefined\n\t\t\tif (isBadgeVariant(named)) {\n\t\t\t\treturn named\n\t\t\t}\n\t\t\treturn task.isTerminal === true ? 'default' : 'info'\n\t\t},\n\n\t\t/**\n\t\t * A table row's second line: its description and a priority above normal.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The line, or ''.\n\t\t */\n\t\ttableMeta(task) {\n\t\t\tconst parts = []\n\t\t\tif (typeof task.description === 'string' && task.description.trim() !== '') {\n\t\t\t\tparts.push(task.description.trim().split('\\n')[0])\n\t\t\t}\n\t\t\tconst priority = PRIORITY_LABELS[task.priority]\n\t\t\tif (priority && task.priority !== 'normal') {\n\t\t\t\tparts.push(this.tr(priority))\n\t\t\t}\n\t\t\treturn parts.join(' · ')\n\t\t},\n\n\t\t/**\n\t\t * The header link with `@objectId` in its query read from the page's\n\t\t * record (\"all tasks of this case\" on the Tasks page).\n\t\t *\n\t\t * @param {object|null} link The declared link.\n\t\t * @return {object|null} The link.\n\t\t */\n\t\trecordLink(link) {\n\t\t\tif (!link || !link.query || typeof link.query !== 'object') {\n\t\t\t\treturn link\n\t\t\t}\n\t\t\tconst query = Object.fromEntries(Object.entries(link.query).map(([key, value]) => [key, value === '@objectId' ? String(this.objectId ?? '') : value]))\n\t\t\treturn { ...link, query }\n\t\t},\n\n\t\t/**\n\t\t * Open or close the create form (the header's \"New task\").\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\ttoggleCreate() {\n\t\t\tthis.createOpen = !this.createOpen\n\t\t},\n\n\t\t/**\n\t\t * Post the create form as an open task on the record, then refetch.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tasync createTask() {\n\t\t\tconst title = this.newTitle.trim()\n\t\t\tif (title === '' || this.recordUuid === '' || this.creating) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst create = typeof this.content.create === 'object' && this.content.create ? this.content.create : {}\n\t\t\tconst payload = { title, objectUuid: this.recordUuid, state: 'available' }\n\t\t\tif (typeof create.appId === 'string' && create.appId !== '') {\n\t\t\t\tpayload.appId = create.appId\n\t\t\t}\n\t\t\tif (this.newDue !== '') {\n\t\t\t\tpayload.dueAt = this.newDue\n\t\t\t}\n\t\t\tthis.creating = true\n\t\t\ttry {\n\t\t\t\tawait axios.post(generateUrl(FLOW_TASKS_URL), payload)\n\t\t\t\tthis.newTitle = ''\n\t\t\t\tthis.newDue = ''\n\t\t\t\tthis.createOpen = false\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error?.response?.data?.error\n\t\t\t\tshowError(typeof message === 'string' && message !== '' ? message : this.tr('The task could not be added'))\n\t\t\t}\n\t\t\tthis.creating = false\n\t\t\tthis.refetch(true)\n\t\t},\n\n\t\t/**\n\t\t * The outcomes to offer on complete: the row's declared list, else\n\t\t * one entry for the server's default outcome.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Array<object|string>} The outcome entries.\n\t\t */\n\t\toutcomesOf(task) {\n\t\t\tif (Array.isArray(task.outcomes) && task.outcomes.length > 0) {\n\t\t\t\treturn task.outcomes\n\t\t\t}\n\t\t\treturn ['done']\n\t\t},\n\n\t\t/**\n\t\t * The wire value of one outcome entry (a string, or `{id, label}`).\n\t\t *\n\t\t * @param {object|string} outcome The outcome entry.\n\t\t * @return {string} The outcome id.\n\t\t */\n\t\toutcomeId(outcome) {\n\t\t\tif (outcome && typeof outcome === 'object') {\n\t\t\t\treturn String(outcome.id ?? outcome.value ?? outcome.label ?? '')\n\t\t\t}\n\t\t\treturn String(outcome ?? '')\n\t\t},\n\n\t\t/**\n\t\t * The menu label for one complete entry.\n\t\t *\n\t\t * @param {object|string} outcome The outcome entry.\n\t\t * @return {string} The label.\n\t\t */\n\t\tcompleteLabel(outcome) {\n\t\t\tconst id = this.outcomeId(outcome)\n\t\t\tconst label = (outcome && typeof outcome === 'object' && outcome.label)\n\t\t\t\t? String(outcome.label)\n\t\t\t\t: id\n\t\t\tif (id === 'done') {\n\t\t\t\treturn this.tr('Complete')\n\t\t\t}\n\t\t\treturn this.tr('Complete: {outcome}').replace('{outcome}', label)\n\t\t},\n\n\t\t/**\n\t\t * Claim a pooled task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tclaim(task) {\n\t\t\treturn this.postVerb(task, 'claim', {})\n\t\t},\n\n\t\t/**\n\t\t * Complete the viewer's own task with an outcome.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {string} outcome The chosen outcome id.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tcomplete(task, outcome) {\n\t\t\tif (this.formOf(task)) {\n\t\t\t\tthis.formOutcome = outcome || 'done'\n\t\t\t\tthis.formTask = task\n\t\t\t\treturn Promise.resolve()\n\t\t\t}\n\t\t\treturn this.postVerb(task, 'complete', { outcome })\n\t\t},\n\n\t\t/**\n\t\t * POST one lifecycle verb and refetch either way: on success the row\n\t\t * moved, and on a refusal (a lost claim race, a revoked task) the\n\t\t * list is stale in exactly the way the refusal proves. The refusal\n\t\t * itself is toasted in the SERVER'S words (ADR-062 forbids leaking\n\t\t * the raw status line, and the endpoint's `error` string is written\n\t\t * for people).\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {string} verb The lifecycle verb.\n\t\t * @param {object} body The verb body.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tasync postVerb(task, verb, body) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tif (uuid === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst completeUrl = this.content.completeUrl\n\t\t\tconst route = verb === 'complete' && typeof completeUrl === 'string' && completeUrl !== ''\n\t\t\t\t? completeUrl.replace('{id}', encodeURIComponent(uuid))\n\t\t\t\t: `${FLOW_TASKS_URL}/${uuid}/${verb}`\n\t\t\ttry {\n\t\t\t\tawait axios.post(generateUrl(route), body)\n\t\t\t\tif (verb === 'complete') {\n\t\t\t\t\tshowSuccess(this.tr('Task {title} finished').replace('{title}', this.titleOf(task)))\n\t\t\t\t} else if (verb === 'claim') {\n\t\t\t\t\tshowSuccess(this.tr('Task {title} is yours').replace('{title}', this.titleOf(task)))\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst data = error?.response?.data\n\t\t\t\tconst message = data?.error || data?.message\n\t\t\t\tshowError(typeof message === 'string' && message !== ''\n\t\t\t\t\t? message\n\t\t\t\t\t: this.tr('The task action was refused'))\n\t\t\t}\n\t\t\tthis.refetch(true)\n\t\t},\n\n\t\t/**\n\t\t * Ask `claimCapabilityUrl` once whether this instance can claim. A\n\t\t * failure leaves Claim off: a button that silently assigns a task is\n\t\t * worse than none.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-claim-follows-a-capability\n\t\t */\n\t\tasync loadClaimCapability() {\n\t\t\tconst url = this.content.claimCapabilityUrl\n\t\t\tif (typeof url !== 'string' || url === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(url))\n\t\t\t\tthis.claimCapable = response?.data?.claim === true\n\t\t\t} catch {\n\t\t\t\tthis.claimCapable = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The form a task asks for, when it is one to fill in here.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {object|null}\n\t\t */\n\t\tformOf(task) {\n\t\t\tconst form = taskForm(task)\n\t\t\treturn form && form.kind === 'fields' ? form : null\n\t\t},\n\n\t\t/**\n\t\t * One task's answer set, empty until something was typed.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {object} The answers.\n\t\t */\n\t\tanswersFor(task) {\n\t\t\treturn this.answers[String(task.uuid || '')] || {}\n\t\t},\n\n\t\t/**\n\t\t * Keep one answer an inline form emitted.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {{field: string, value: string}} answer The answer.\n\t\t * @return {void}\n\t\t */\n\t\trecordAnswer(task, answer) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tthis.answers = { ...this.answers, [uuid]: { ...this.answersFor(task), [String(answer?.field ?? '')]: answer?.value } }\n\t\t},\n\n\t\t/**\n\t\t * Complete the task in a work card with its inline answers. A required\n\t\t * field left empty is named before the round trip; the server refuses\n\t\t * it again for every other client.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-the-first-open-task-can-be-worked-on-in-place\n\t\t */\n\t\tasync completeInPlace(task) {\n\t\t\tif (this.busy) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst answers = this.answersFor(task)\n\t\t\tconst missing = missingRequiredTaskField(taskForm(task), answers)\n\t\t\tif (missing !== '') {\n\t\t\t\tshowError(this.tr('Fill in {field} before completing this task').replace('{field}', missing))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\ttry {\n\t\t\t\tawait this.postVerb(task, 'complete', taskForm(task) ? { outcome: 'done', data: answers } : { outcome: 'done' })\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open or close a table row's task in place.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleExpanded(task) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tthis.expandedId = this.expandedId === uuid ? '' : uuid\n\t\t},\n\n\t\t/**\n\t\t * The route a task's title links to (`rowRoute`), or null.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {object|null}\n\t\t */\n\t\topenRouteFor(task) {\n\t\t\tconst rowRoute = this.content.rowRoute\n\t\t\tconst uuid = String(task?.uuid || '')\n\t\t\tif (typeof rowRoute !== 'string' || rowRoute === '' || uuid === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { name: rowRoute, params: { id: uuid } }\n\t\t},\n\n\t\t/**\n\t\t * The form dialog completed its task.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonFormCompleted() {\n\t\t\tconst title = this.formTask ? this.titleOf(this.formTask) : ''\n\t\t\tthis.formTask = null\n\t\t\tshowSuccess(this.tr('Task {title} finished').replace('{title}', title))\n\t\t\tthis.refetch(true)\n\t\t},\n\n\t\t/**\n\t\t * Open the clicked task: the configured route with the uuid as `id`,\n\t\t * else the task's openregister deep link. A ctrl/cmd/shift or middle\n\t\t * click opens it in a new tab.\n\t\t *\n\t\t * @param {object} task The clicked task row.\n\t\t * @param {MouseEvent} [event] The originating click/auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowClick(task, event) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tif (uuid === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst rowRoute = this.content.rowRoute\n\t\t\tif (typeof rowRoute === 'string' && rowRoute !== '' && this.$router) {\n\t\t\t\topenRowTarget(event, { name: rowRoute, params: { id: uuid } }, this.$router)\n\t\t\t\treturn\n\t\t\t}\n\t\t\topenRowTarget(event, taskDeepLink(uuid))\n\t\t},\n\n\t\t/**\n\t\t * Middle click on a task row: open it in a new tab.\n\t\t *\n\t\t * @param {object} task The clicked task row.\n\t\t * @param {MouseEvent} event The auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowAuxClick(task, event) {\n\t\t\tif (isRowMiddleClick(event)) {\n\t\t\t\tthis.onRowClick(task, event)\n\t\t\t}\n\t\t},\n\t},\n}\n\n/**\n * Clamp a configured row limit into the range the endpoint accepts.\n *\n * @param {unknown} raw The configured limit.\n * @return {number} A limit between 1 and 50 (default 6).\n */\nfunction normaliseLimit(raw) {\n\tconst n = Number(raw)\n\tif (Number.isFinite(n) === false || n <= 0) {\n\t\treturn 6\n\t}\n\treturn Math.min(50, Math.round(n))\n}\n\n/**\n * Clamp a configured scope onto the endpoint's vocabulary.\n *\n * @param {unknown} raw The configured scope.\n * @return {string} One of assigned, pooled, watched, all (default assigned).\n */\nfunction normaliseScope(raw) {\n\treturn ['assigned', 'pooled', 'watched', 'all'].includes(raw) ? raw : 'assigned'\n}\n\n/**\n * The record a widget lists tasks for: `objectUuid` as written, with\n * `@objectId` read from the page's record.\n *\n * @param {unknown} configured The `objectUuid` setting.\n * @param {unknown} objectId The page's record id.\n * @return {string} The uuid, or ''.\n */\nfunction recordUuid(configured, objectId) {\n\tif (typeof configured !== 'string' || configured === '') {\n\t\treturn ''\n\t}\n\treturn configured === '@objectId' ? String(objectId ?? '') : configured\n}\n</script>\n\n<style scoped>\n/* The record's task table (`variant: 'table'`, board DqZaakTaken): a head\n row of muted 14px labels on a near-white ground, rows divided by hairlines,\n the title at 600 over a muted line, a finished task struck through. */\n.cn-tasks-widget__create {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 12px;\n\tmargin-block-end: 12px;\n}\n\n.cn-tasks-widget__table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n\n.cn-tasks-widget__table th {\n\tpadding: 12px 16px;\n\tbackground: color-mix(in srgb, var(--color-background-hover) 40%, var(--color-main-background));\n\tcolor: var(--color-text-maxcontrast);\n\tfont-weight: 600;\n\ttext-align: start;\n\twhite-space: nowrap;\n}\n\n.cn-tasks-widget__table td {\n\tpadding: 12px 16px;\n\tborder-top: 1px solid var(--color-border);\n\tvertical-align: middle;\n}\n\n.cn-tasks-widget__cell-task {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 12px;\n}\n\n.cn-tasks-widget__state-icon {\n\tflex: none;\n\tcolor: var(--color-primary-element);\n}\n\n.cn-tasks-widget__state-icon--done {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-tasks-widget__table .cn-tasks-widget__name {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tcolor: var(--color-main-text);\n\tfont: inherit;\n\tfont-size: 15px;\n\tfont-weight: 600;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-tasks-widget__table .cn-tasks-widget__name:hover,\n.cn-tasks-widget__table .cn-tasks-widget__name:focus-visible {\n\ttext-decoration: underline;\n}\n\n.cn-tasks-widget__table-row--done .cn-tasks-widget__name {\n\ttext-decoration: line-through;\n}\n\n.cn-tasks-widget__handler {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-tasks-widget__cell-due {\n\twhite-space: nowrap;\n}\n\n.cn-tasks-widget__cell-due.cn-tasks-widget__due--overdue {\n\tcolor: var(--color-warning-text, var(--color-warning));\n\tfont-weight: 600;\n}\n\n.cn-tasks-widget__cell-actions {\n\ttext-align: end;\n\twhite-space: nowrap;\n}\n\n.cn-tasks-widget {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-tasks-widget__loading {\n\tdisplay: flex;\n\tjustify-content: center;\n\tpadding: 8px 0;\n}\n\n.cn-tasks-widget__view-all {\n\tdisplay: inline-block;\n\tmargin-top: 8px;\n\tcolor: var(--color-primary-element-text, var(--color-primary-element));\n\ttext-decoration: underline;\n}\n\n.cn-tasks-widget__others {\n\tmargin-top: 12px;\n}\n\n.cn-tasks-widget__others-title {\n\tmargin: 0 0 6px;\n\tfont-size: 14px;\n}\n\n.cn-tasks-widget__others-list {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-tasks-widget__others-row {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tpadding: 6px 0;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-tasks-widget__others-actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n}\n\n.cn-tasks-widget__empty,\n.cn-tasks-widget__error,\n.cn-tasks-widget__more {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-tasks-widget__more {\n\tpadding-top: 4px;\n}\n\n.cn-tasks-widget__count {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\tfont-weight: 600;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.04em;\n}\n\n.cn-tasks-widget__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tmin-width: 0;\n}\n\n.cn-tasks-widget__row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 6px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tmin-width: 0;\n\tcursor: pointer;\n}\n\n.cn-tasks-widget__row:last-child {\n\tborder-bottom: none;\n}\n\n.cn-tasks-widget__body {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n\n.cn-tasks-widget__name {\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-tasks-widget__row:hover .cn-tasks-widget__name {\n\ttext-decoration: underline;\n}\n\n.cn-tasks-widget__meta {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-tasks-widget__due {\n\tflex: 0 0 auto;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\tfont-variant-numeric: tabular-nums;\n}\n\n/* List variant, after the dashboard board's My tasks card: a checkbox, the\n title, the subject on a muted second line and the due date at its right. */\n.cn-tasks-widget--list .cn-tasks-widget__row {\n\talign-items: flex-start;\n\tgap: 12px;\n\tpadding: 12px 0;\n}\n\n.cn-tasks-widget--list .cn-tasks-widget__name {\n\tfont-weight: 400;\n\tfont-size: 15px;\n\tline-height: 1.35;\n\tcolor: var(--color-main-text);\n}\n\n.cn-tasks-widget__check,\n.cn-tasks-widget__check-spacer {\n\tflex: none;\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 1px 0 0;\n}\n\n.cn-tasks-widget__check {\n\taccent-color: var(--color-primary-element);\n\tcursor: pointer;\n}\n\n.cn-tasks-widget__meta--split {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tfont-size: 13px;\n\toverflow: visible;\n}\n\n.cn-tasks-widget__subject {\n\tmin-width: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-tasks-widget--list .cn-tasks-widget__due {\n\tfont-size: 13px;\n\tfont-weight: 500;\n}\n\n.cn-tasks-widget--list .cn-tasks-widget__due--overdue {\n\tfont-weight: 600;\n}\n\n/* Overdue: weight AND colour on top of the wording, which already says\n \"Overdue by N days\" — the signal survives monochrome. */\n.cn-tasks-widget__due--overdue {\n\tcolor: var(--color-error, #d91f2d);\n\tfont-weight: 600;\n}\n\n.cn-tasks-widget__actions {\n\tflex: 0 0 auto;\n}\n</style>\n"],"names":["CnStatusBadge","CnTaskFormDialog","CnTaskWorkCard","t","axios"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnTasksWidget.vue2.js","sources":["../../../../src/components/CnTasksWidget/CnTasksWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-tasks-widget\" :class=\"{ 'cn-tasks-widget--list': isList }\">\n\t\t<!-- One quiet line on failure, never a leaked axios status string\n\t\t (ADR-062). The real error goes to the console. -->\n\t\t<p v-if=\"error\" class=\"cn-tasks-widget__error\">\n\t\t\t{{ tr('Could not load the tasks') }}\n\t\t</p>\n\t\t<div v-else-if=\"loading && rows.length === 0\" class=\"cn-tasks-widget__loading\">\n\t\t\t<NcLoadingIcon :size=\"24\" />\n\t\t</div>\n\t\t<!-- An empty inbox is the GOOD state, not an error and not a void:\n\t\t one muted line, no illustration. -->\n\t\t<template v-else-if=\"isTable\">\n\t\t\t<!-- The create form the header's \"New task\" opens: a title and a\n\t\t\t deadline, posted as an open task on this record. -->\n\t\t\t<form\n\t\t\t\tv-if=\"createOpen\"\n\t\t\t\tclass=\"cn-tasks-widget__create\"\n\t\t\t\tdata-testid=\"cn-tasks-widget-create\"\n\t\t\t\t@submit.prevent=\"createTask\">\n\t\t\t\t<NcTextField\n\t\t\t\t\t:modelValue=\"newTitle\"\n\t\t\t\t\t:label=\"tr('Task')\"\n\t\t\t\t\tdata-testid=\"cn-tasks-widget-create-title\"\n\t\t\t\t\t@update:modelValue=\"(value) => (newTitle = String(value ?? ''))\" />\n\t\t\t\t<NcTextField\n\t\t\t\t\t:modelValue=\"newDue\"\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t:label=\"tr('Task deadline')\"\n\t\t\t\t\tdata-testid=\"cn-tasks-widget-create-due\"\n\t\t\t\t\t@update:modelValue=\"(value) => (newDue = String(value ?? ''))\" />\n\t\t\t\t<NcButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t:disabled=\"creating || newTitle.trim() === ''\"\n\t\t\t\t\tdata-testid=\"cn-tasks-widget-create-save\">\n\t\t\t\t\t{{ tr('Add task') }}\n\t\t\t\t</NcButton>\n\t\t\t</form>\n\t\t\t<p v-if=\"tableRows.length === 0\" class=\"cn-tasks-widget__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</p>\n\t\t\t<table v-else class=\"cn-tasks-widget__table\" data-testid=\"cn-tasks-widget-table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<!-- `content.sortable` / `content.filterable`: a head sorts by its\n\t\t\t\t\t\t column and filters on its values (DqZaakTaken). -->\n\t\t\t\t\t\t<th v-for=\"column in headColumns\"\n\t\t\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t:aria-sort=\"headSort.key === column.key ? (headSort.dir === 'asc' ? 'ascending' : 'descending') : null\"\n\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-head-${column.key}`\">\n\t\t\t\t\t\t\t<span v-if=\"content.sortable === true || content.filterable === true\" class=\"cn-tasks-widget__head\">\n\t\t\t\t\t\t\t\t<button v-if=\"content.sortable === true\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__head-sort\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-sort-${column.key}`\"\n\t\t\t\t\t\t\t\t\t@click=\"sortBy(column.key)\">\n\t\t\t\t\t\t\t\t\t{{ column.label }}\n\t\t\t\t\t\t\t\t\t<ChevronUp v-if=\"headSort.key === column.key && headSort.dir === 'asc'\" :size=\"14\" />\n\t\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"14\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<template v-else>{{ column.label }}</template>\n\t\t\t\t\t\t\t\t<NcActions v-if=\"content.filterable === true\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__head-filter\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"tr('Filter by {column}').replace('{column}', column.label)\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-filter-${column.key}`\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<FilterOutline :size=\"14\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<NcActionCheckbox v-for=\"option in headOptions(column.key)\"\n\t\t\t\t\t\t\t\t\t\t:key=\"option.value\"\n\t\t\t\t\t\t\t\t\t\t:modelValue=\"(headFilters[column.key] || []).includes(option.value)\"\n\t\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleHeadFilter(column.key, option.value)\">\n\t\t\t\t\t\t\t\t\t\t{{ option.label }}\n\t\t\t\t\t\t\t\t\t</NcActionCheckbox>\n\t\t\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t{{ column.label }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th scope=\"col\">\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ tr('Task actions') }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr\n\t\t\t\t\t\tv-for=\"task in tableRows\"\n\t\t\t\t\t\t:key=\"task.uuid\"\n\t\t\t\t\t\tclass=\"cn-tasks-widget__table-row\"\n\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__table-row--done': task.isTerminal === true }\"\n\t\t\t\t\t\t:data-state=\"task.state\"\n\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-row-${task.uuid}`\">\n\t\t\t\t\t\t<td class=\"cn-tasks-widget__cell-task\">\n\t\t\t\t\t\t\t<CheckCircle\n\t\t\t\t\t\t\t\tv-if=\"task.isTerminal === true\"\n\t\t\t\t\t\t\t\t:size=\"20\"\n\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__state-icon cn-tasks-widget__state-icon--done\" />\n\t\t\t\t\t\t\t<CircleOutline v-else :size=\"20\" class=\"cn-tasks-widget__state-icon\" />\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tv-if=\"expandRows\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__name\"\n\t\t\t\t\t\t\t\t\t:aria-expanded=\"task.uuid === expandedId ? 'true' : 'false'\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-expand-${task.uuid}`\"\n\t\t\t\t\t\t\t\t\t@click=\"toggleExpanded(task)\">\n\t\t\t\t\t\t\t\t\t{{ titleOf(task) }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__name\"\n\t\t\t\t\t\t\t\t\t@click=\"onRowClick(task, $event)\"\n\t\t\t\t\t\t\t\t\t@auxclick=\"onRowAuxClick(task, $event)\">\n\t\t\t\t\t\t\t\t\t{{ titleOf(task) }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<span v-if=\"tableMeta(task)\" class=\"cn-tasks-widget__meta\">{{ tableMeta(task) }}</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"cn-tasks-widget__cell-handler\">\n\t\t\t\t\t\t\t<span v-if=\"task.assignee\" class=\"cn-tasks-widget__handler\">\n\t\t\t\t\t\t\t\t<NcAvatar\n\t\t\t\t\t\t\t\t\t:user=\"String(task.assignee)\"\n\t\t\t\t\t\t\t\t\t:displayName=\"handlerName(task)\"\n\t\t\t\t\t\t\t\t\t:size=\"28\"\n\t\t\t\t\t\t\t\t\thideStatus />\n\t\t\t\t\t\t\t\t{{ handlerName(task) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span v-else class=\"cn-tasks-widget__meta\">{{ tr('Unassigned') }}</span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td\n\t\t\t\t\t\t\tclass=\"cn-tasks-widget__cell-due\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__due--overdue': task.overdue === true && task.isTerminal !== true }\">\n\t\t\t\t\t\t\t<template v-if=\"content.dueFormat === 'date'\">\n\t\t\t\t\t\t\t\t{{ dueDate(task) }}\n\t\t\t\t\t\t\t\t<span v-if=\"task.overdue === true && task.isTerminal !== true\" class=\"hidden-visually\">{{ tr('Overdue') }}</span>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t{{ dueLabel(task) }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t\t:label=\"stateLabel(task)\"\n\t\t\t\t\t\t\t\t:variant=\"stateVariant(task)\"\n\t\t\t\t\t\t\t\t:colorMap=\"stateColors\"\n\t\t\t\t\t\t\t\t:colorKey=\"String(task.state || '')\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"cn-tasks-widget__cell-actions\">\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"canClaim(task)\"\n\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-claim-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"claim(task)\">\n\t\t\t\t\t\t\t\t{{ tr('Claim') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-else-if=\"canCompleteRow(task) && outcomesOf(task).length === 1\"\n\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-complete-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"complete(task, outcomeId(outcomesOf(task)[0]))\">\n\t\t\t\t\t\t\t\t{{ tr('Complete') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcActions\n\t\t\t\t\t\t\t\tv-if=\"(canCompleteRow(task) && outcomesOf(task).length > 1) || canCancelRow(task)\"\n\t\t\t\t\t\t\t\t:forceMenu=\"true\"\n\t\t\t\t\t\t\t\t:aria-label=\"tr('Task actions')\">\n\t\t\t\t\t\t\t\t<template v-if=\"canCompleteRow(task) && outcomesOf(task).length > 1\">\n\t\t\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\t\t\tv-for=\"outcome in outcomesOf(task)\"\n\t\t\t\t\t\t\t\t\t\t:key=\"outcomeId(outcome)\"\n\t\t\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t\t\t@click=\"complete(task, outcomeId(outcome))\">\n\t\t\t\t\t\t\t\t\t\t{{ completeLabel(outcome) }}\n\t\t\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\t\tv-if=\"canCancelRow(task)\"\n\t\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-cancel-${task.uuid}`\"\n\t\t\t\t\t\t\t\t\t@click=\"cancel(task)\">\n\t\t\t\t\t\t\t\t\t{{ tr('Cancel task') }}\n\t\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t<router-link\n\t\t\t\tv-if=\"footerViewAll && $router\"\n\t\t\t\tclass=\"cn-tasks-widget__view-all\"\n\t\t\t\t:to=\"footerViewAll.to\"\n\t\t\t\tdata-testid=\"cn-tasks-widget-footer-link\">\n\t\t\t\t{{ footerViewAll.label }}\n\t\t\t</router-link>\n\t\t\t<!-- The opened row's task to work on in place (`expandRows`). -->\n\t\t\t<CnTaskWorkCard\n\t\t\t\tv-if=\"expandedTask\"\n\t\t\t\t:task=\"expandedTask\"\n\t\t\t\t:values=\"answersFor(expandedTask)\"\n\t\t\t\t:claimable=\"canClaim(expandedTask)\"\n\t\t\t\t:claimAvailable=\"claimAvailable\"\n\t\t\t\t:cancelable=\"content.cancel === true\"\n\t\t\t\t:busy=\"busy\"\n\t\t\t\t:openRoute=\"openRouteFor(expandedTask)\"\n\t\t\t\t:tr=\"tr\"\n\t\t\t\t@answer=\"recordAnswer(expandedTask, $event)\"\n\t\t\t\t@claim=\"claim(expandedTask)\"\n\t\t\t\t@complete=\"completeInPlace(expandedTask)\"\n\t\t\t\t@cancel=\"cancel(expandedTask)\" />\n\t\t</template>\n\t\t<!-- `variant: \"focus\"`: the first open task to work on in place, the\n\t\t other open tasks listed under it. -->\n\t\t<template v-else-if=\"isFocus\">\n\t\t\t<CnTaskWorkCard\n\t\t\t\tv-if=\"focusTask\"\n\t\t\t\t:task=\"focusTask\"\n\t\t\t\t:values=\"answersFor(focusTask)\"\n\t\t\t\t:claimable=\"canClaim(focusTask)\"\n\t\t\t\t:claimAvailable=\"claimAvailable\"\n\t\t\t\t:cancelable=\"content.cancel === true\"\n\t\t\t\t:busy=\"busy\"\n\t\t\t\t:openRoute=\"openRouteFor(focusTask)\"\n\t\t\t\t:tr=\"tr\"\n\t\t\t\t@answer=\"recordAnswer(focusTask, $event)\"\n\t\t\t\t@claim=\"claim(focusTask)\"\n\t\t\t\t@complete=\"completeInPlace(focusTask)\"\n\t\t\t\t@cancel=\"cancel(focusTask)\" />\n\t\t\t<p v-else class=\"cn-tasks-widget__empty\" data-testid=\"cn-tasks-widget-empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</p>\n\t\t\t<div v-if=\"otherOpenTasks.length > 0\" class=\"cn-tasks-widget__others\" data-testid=\"cn-tasks-widget-others\">\n\t\t\t\t<h5 class=\"cn-tasks-widget__others-title\">\n\t\t\t\t\t{{ tr('Other open tasks') }}\n\t\t\t\t</h5>\n\t\t\t\t<ul class=\"cn-tasks-widget__others-list\">\n\t\t\t\t\t<li\n\t\t\t\t\t\tv-for=\"task in otherOpenTasks\"\n\t\t\t\t\t\t:key=\"task.uuid\"\n\t\t\t\t\t\tclass=\"cn-tasks-widget__others-row\"\n\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-other-${task.uuid}`\">\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t<router-link v-if=\"openRouteFor(task) && $router\" :to=\"openRouteFor(task)\" class=\"cn-tasks-widget__name\">\n\t\t\t\t\t\t\t\t{{ titleOf(task) }}\n\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t<span v-else class=\"cn-tasks-widget__name\">{{ titleOf(task) }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__meta\">{{ dueLabel(task) || tr('No due date') }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__others-actions\">\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"canClaim(task)\"\n\t\t\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-claim-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"claim(task)\">\n\t\t\t\t\t\t\t\t{{ tr('Claim') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-complete-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"complete(task, 'done')\">\n\t\t\t\t\t\t\t\t{{ tr('Complete') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"content.cancel === true\"\n\t\t\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-tasks-widget-cancel-${task.uuid}`\"\n\t\t\t\t\t\t\t\t@click=\"cancel(task)\">\n\t\t\t\t\t\t\t\t{{ tr('Cancel task') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<router-link\n\t\t\t\tv-if=\"focusViewAll && $router\"\n\t\t\t\tclass=\"cn-tasks-widget__view-all\"\n\t\t\t\t:to=\"focusViewAll.to\"\n\t\t\t\tdata-testid=\"cn-tasks-widget-view-all\">\n\t\t\t\t{{ focusViewAll.label }}\n\t\t\t</router-link>\n\t\t</template>\n\t\t<p v-else-if=\"rows.length === 0\" class=\"cn-tasks-widget__empty\">\n\t\t\t{{ emptyLabel }}\n\t\t</p>\n\t\t<template v-else>\n\t\t\t<!-- The count states the server TOTAL, never the rendered length\n\t\t\t (ADR-062): the number a person acts on is how much work\n\t\t\t exists, not how much fits the cell. -->\n\t\t\t<p v-if=\"!isList\" class=\"cn-tasks-widget__count\">\n\t\t\t\t{{ countLabel }}\n\t\t\t</p>\n\t\t\t<ul class=\"cn-tasks-widget__list\">\n\t\t\t\t<li\n\t\t\t\t\tv-for=\"task in rows\"\n\t\t\t\t\t:key=\"task.uuid\"\n\t\t\t\t\tclass=\"cn-tasks-widget__row\"\n\t\t\t\t\t:data-state=\"task.state\"\n\t\t\t\t\t@click=\"onRowClick(task, $event)\"\n\t\t\t\t\t@mousedown=\"preventMiddleClickAutoscroll\"\n\t\t\t\t\t@auxclick=\"onRowAuxClick(task, $event)\">\n\t\t\t\t\t<!-- List variant: a checkbox completes the viewer's own task\n\t\t\t\t\t (the task with a declared outcome list keeps the menu, as\n\t\t\t\t\t a checkbox cannot choose an outcome). Other rows get a\n\t\t\t\t\t spacer so the titles stay aligned. -->\n\t\t\t\t\t<template v-if=\"isList\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tv-if=\"canCheck(task)\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tclass=\"cn-tasks-widget__check\"\n\t\t\t\t\t\t\t:checked=\"completing.includes(String(task.uuid))\"\n\t\t\t\t\t\t\t:disabled=\"completing.includes(String(task.uuid))\"\n\t\t\t\t\t\t\t:aria-label=\"tr('Mark {title} as done').replace('{title}', titleOf(task))\"\n\t\t\t\t\t\t\tdata-testid=\"cn-tasks-widget-check\"\n\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t@change=\"check(task)\">\n\t\t\t\t\t\t<span v-else class=\"cn-tasks-widget__check-spacer\" aria-hidden=\"true\" />\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__name\">{{ titleOf(task) }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__meta cn-tasks-widget__meta--split\">\n\t\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__subject\">{{ subjectOf(task) }}</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"cn-tasks-widget__due\"\n\t\t\t\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__due--overdue': task.overdue === true }\">\n\t\t\t\t\t\t\t\t\t{{ dueLabel(task) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<span class=\"cn-tasks-widget__body\">\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__name\">{{ titleOf(task) }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-tasks-widget__meta\">{{ metaLine(task) }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<!-- Overdue is carried by the WORDING (taskDueLabel) and by\n\t\t\t\t\t\t weight; the colour only reinforces it. -->\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"cn-tasks-widget__due\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-tasks-widget__due--overdue': task.overdue === true }\">\n\t\t\t\t\t\t\t{{ dueLabel(task) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<!-- Only verbs the contract can accept are offered; the\n\t\t\t\t\t server still authorizes, and a refusal is toasted in\n\t\t\t\t\t its own words. Stopped clicks: the menu must not also\n\t\t\t\t\t open the row. -->\n\t\t\t\t\t<NcActions\n\t\t\t\t\t\tv-if=\"(canClaim(task) || canComplete(task)) && !(isList && canCheck(task))\"\n\t\t\t\t\t\tclass=\"cn-tasks-widget__actions\"\n\t\t\t\t\t\t:forceMenu=\"true\"\n\t\t\t\t\t\t:aria-label=\"tr('Task actions')\"\n\t\t\t\t\t\t@click.stop>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-if=\"canClaim(task)\"\n\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t@click=\"claim(task)\">\n\t\t\t\t\t\t\t{{ tr('Claim') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<template v-if=\"canComplete(task)\">\n\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\tv-for=\"outcome in outcomesOf(task)\"\n\t\t\t\t\t\t\t\t:key=\"outcomeId(outcome)\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t@click=\"complete(task, outcomeId(outcome))\">\n\t\t\t\t\t\t\t\t{{ completeLabel(outcome) }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcActions>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<!-- The remainder is a count, never a scrollbar (ADR-062). -->\n\t\t\t<p v-if=\"hiddenCount > 0\" class=\"cn-tasks-widget__more\">\n\t\t\t\t{{ moreLabel }}\n\t\t\t</p>\n\t\t</template>\n\t\t<!-- A task that asks for a form is completed through it. -->\n\t\t<CnTaskFormDialog\n\t\t\tv-if=\"formTask\"\n\t\t\t:task=\"formTask\"\n\t\t\t:outcome=\"formOutcome\"\n\t\t\t:completeUrl=\"content.completeUrl || ''\"\n\t\t\t@completed=\"onFormCompleted\"\n\t\t\t@close=\"formTask = null\" />\n\t</div>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcActionButton, NcActionCheckbox, NcActions, NcAvatar, NcButton, NcLoadingIcon, NcTextField } from '@nextcloud/vue'\nimport { inject, ref } from 'vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport CircleOutline from 'vue-material-design-icons/CircleOutline.vue'\nimport FilterOutline from 'vue-material-design-icons/FilterOutline.vue'\nimport CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'\nimport CnTaskFormDialog from '../CnTaskFormDialog/CnTaskFormDialog.vue'\nimport CnTaskWorkCard from './CnTaskWorkCard.vue'\nimport { taskDeepLink, taskDueLabel } from '../../composables/indexSources.js'\nimport { useEndpointSource } from '../../composables/useEndpointSource.js'\nimport { isBadgeVariant } from '../../utils/badgeVariants.js'\nimport { contentHeaderLink } from '../../utils/contentHeaderLink.js'\nimport { missingRequiredTaskField, taskForm } from '../../utils/flowTask.js'\nimport { openRowTarget } from '../../utils/linkNavigation.js'\nimport { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'\nimport { userDisplayName } from '../../utils/userDisplayName.js'\nimport { userLocale } from '../../utils/userLocale.js'\n\n/**\n * The OpenRegister inbox read (openregister flow-task-entity). One endpoint\n * for the whole fleet: every app's human tasks live on OpenRegister's one\n * task store, so the widget is app-agnostic and ships no controller.\n *\n * @type {string}\n */\nconst FLOW_TASKS_URL = '/apps/openregister/api/flow-tasks'\n\n/**\n * The CMMN states, in the reading a dashboard needs. Labels double as the\n * meta-line words, so state never rests on styling.\n *\n * @type {Record<string, string>}\n */\nconst STATE_LABELS = {\n\tavailable: 'Available',\n\tenabled: 'Ready to claim',\n\tactive: 'In progress',\n\tcompleted: 'Completed',\n\tterminated: 'Terminated',\n\tdisabled: 'Disabled',\n}\n\n/**\n * The priority vocabulary (openregister Task::PRIORITIES).\n *\n * @type {Record<string, string>}\n */\nconst PRIORITY_LABELS = {\n\tlow: 'Low',\n\tnormal: 'Normal',\n\thigh: 'High',\n\turgent: 'Urgent',\n}\n\n/**\n * CnTasksWidget — the viewer's open tasks, from OpenRegister's task inbox.\n *\n * Reads `flow-tasks` with `isTerminal=false` (an inbox widget that showed\n * finished tasks would never drain), scoped by `content.scope` and sorted by\n * due date so the most urgent row sits on top. Placed by its registry type\n * key `tasks`:\n *\n * ```js\n * { id: 'my-tasks', type: 'tasks', title: 'My tasks',\n * content: { scope: 'assigned', limit: 6, pollSeconds: 30 } }\n * ```\n *\n * Why it polls: tasks are handed out, claimed and completed by OTHER people\n * and by flows, so a widget that only reflected its mount moment would be\n * wrong within minutes and look identical to being right. Polling pauses\n * while the tab is hidden.\n *\n * Quick actions offer only what the row's contract can accept: claim on a\n * pooled row, complete (per declared outcome) on the viewer's own open row.\n * The server still authorizes; a refusal surfaces its `error` message as a\n * toast and the widget refetches, so a lost claim race corrects the row.\n *\n * @spec openspec/changes/cn-tasks-entity-source/specs/cn-tasks-entity-source/spec.md\n */\nexport default {\n\tname: 'CnTasksWidget',\n\n\tcomponents: {\n\t\tCheckCircle,\n\t\tChevronDown,\n\t\tChevronUp,\n\t\tCircleOutline,\n\t\tCnStatusBadge,\n\t\tCnTaskFormDialog,\n\t\tCnTaskWorkCard,\n\t\tFilterOutline,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionCheckbox,\n\t\tNcAvatar,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Host translate function, provided by CnAppRoot (identity by default)\n\t\t * so a library string localises through the consuming app's l10n.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget's persisted configuration blob.\n\t\t *\n\t\t * - `scope` — whose relationship to list: `assigned` (default),\n\t\t * `pooled`, `watched` or `all`. Whose INBOX it is stays the\n\t\t * endpoint's decision; scope never names another user.\n\t\t * - `limit` — rows to request AND show (1–50, default 6). The count\n\t\t * line always states the server total regardless of this cap.\n\t\t * - `pollSeconds` — refetch interval (default 30; `0` disables).\n\t\t * - `rowRoute` — vue-router route NAME to open on a row click,\n\t\t * receiving the task uuid as `:id`. Omitted = the click opens the\n\t\t * task's openregister deep link instead.\n\t\t * - `emptyText` — override for the empty-inbox line.\n\t\t * - `variant` — `list` draws a checkbox list: a checkbox that completes\n\t\t * the viewer's own task, the title, the subject on a second muted\n\t\t * line and the due date at its right. Default: the compact rows.\n\t\t * - `viewAllRoute` / `viewAllLabel` — a \"View all\" text link in the\n\t\t * card header: a route name or location `{ name, params?, query? }`,\n\t\t * and its label (default \"View all\"). `headerLink` works too.\n\t\t * - `objectUuid` — the tasks on one record (`\"@objectId\"` reads the\n\t\t * page's record), every assignee's, instead of the viewer's inbox.\n\t\t * - `includeDone` — also list finished tasks (after the open ones).\n\t\t * - `variant: 'table'` — the record's task table (board DqZaakTaken):\n\t\t * task, handler, deadline, status and the row's verbs, with the\n\t\t * summary (\"1 open, 3 done · sorted by deadline\") and a \"New task\"\n\t\t * action in the card header.\n\t\t * - `create` — offer \"New task\": `true`, or `{ appId?, label? }`; the\n\t\t * task is posted as an open task on `objectUuid`.\n\t\t * - `completeAny` — offer Complete on every open row, not only the\n\t\t * viewer's own (the server still decides); `cancel` — offer Cancel.\n\t\t * - `variant: 'focus'` — the first open task to work on in place: its\n\t\t * number, handler, deadline, lock, who it is offered to, its form\n\t\t * inline and its verbs, with the other open tasks listed under it.\n\t\t * - `expandRows` — in the table, a row's title opens that task to work\n\t\t * on in place under the table instead of following `rowRoute`; the\n\t\t * opened task's title links to `rowRoute`.\n\t\t * - `completeUrl` — the route Complete posts to instead of the engine's\n\t\t * own (`{id}` is the task uuid), for an app that checks something of\n\t\t * its own before the engine completes the task.\n\t\t * - `stateVariants` — the status pill's tone by engine state\n\t\t * (`{ active: 'purple', enabled: 'warning' }`); a state it does not\n\t\t * name keeps info while open and default once finished.\n\t\t * - `claimCapabilityUrl` — a URL answering `{ claim: true|false }`;\n\t\t * Claim is offered only when it answers true. Without it Claim is\n\t\t * offered on every pooled task.\n\t\t * - Table only: `dueFormat: \"date\"` shows the deadline as a short date\n\t\t * (an overdue one still says so to a screen reader and in its\n\t\t * weight); `stateLabels` (`{ <state>: label }`) and `stateColors`\n\t\t * (`{ <state>: tone }`, a badge variant or board hue) word and colour\n\t\t * the status; `viewAllPlacement: \"footer\"` draws the view-all link\n\t\t * under the table instead of in the card header.\n\t\t *\n\t\t * A task that carries a form is completed through CnTaskFormDialog, or\n\t\t * with its form inline in the focus and opened-row cards.\n\t\t *\n\t\t * @type {{scope?: string, limit?: number, pollSeconds?: number, rowRoute?: string, emptyText?: string, variant?: string, viewAllRoute?: (string|object), viewAllLabel?: string, objectUuid?: string, includeDone?: boolean, create?: (boolean|{appId?: string, label?: string}), completeAny?: boolean, cancel?: boolean, expandRows?: boolean, completeUrl?: string, claimCapabilityUrl?: string, dueFormat?: string, stateLabels?: object, stateColors?: object, viewAllPlacement?: string}}\n\t\t * @type {{scope?: string, limit?: number, pollSeconds?: number, rowRoute?: string, emptyText?: string, variant?: string, viewAllRoute?: (string|object), viewAllLabel?: string, objectUuid?: string, includeDone?: boolean, create?: (boolean|{appId?: string, label?: string}), completeAny?: boolean, cancel?: boolean, expandRows?: boolean, completeUrl?: string, claimCapabilityUrl?: string, stateVariants?: {[state: string]: string}}}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * Widget placement id, so the per-widget Refresh action\n\t\t * (`cn:widget:refresh`) reaches this instance's fetch.\n\t\t */\n\t\twidgetId: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The page's record id, for `objectUuid: \"@objectId\"`. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Translate function. Falls back to the injected `cnTranslate`.\n\t\t * Provide explicitly when mounting outside a CnAppRoot ancestor.\n\t\t *\n\t\t * @type {((key: string) => string)|null}\n\t\t */\n\t\ttranslate: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['header'],\n\n\tsetup(props) {\n\t\t// The shared endpoint engine owns request dedup, the short-TTL cache\n\t\t// and the cn:page:refresh / cn:widget:refresh subscriptions — the\n\t\t// same binding CnFlowRunsWidget uses, so a page-level Refresh updates\n\t\t// this widget with everything else on the page.\n\t\tconst widgetIdRef = ref(props.widgetId)\n\t\tconst source = () => {\n\t\t\tconst content = props.content || {}\n\t\t\tconst objectUuid = recordUuid(content.objectUuid, props.objectId)\n\t\t\tconst params = {\n\t\t\t\t// A record's tasks are everyone's: scoping them to the viewer\n\t\t\t\t// would make the record look finished while a colleague works.\n\t\t\t\tscope: objectUuid !== '' && !content.scope ? 'all' : normaliseScope(content.scope),\n\t\t\t\t// Ascending due date: the most urgent (overdue first) on top.\n\t\t\t\tsort: 'dueAt',\n\t\t\t\tlimit: normaliseLimit(content.limit),\n\t\t\t}\n\t\t\tif (objectUuid !== '') {\n\t\t\t\tparams.objectUuid = objectUuid\n\t\t\t}\n\t\t\t// An inbox drains: finished tasks leave the widget, unless the\n\t\t\t// widget lists a record's work, done included (`includeDone`).\n\t\t\tif (content.includeDone !== true) {\n\t\t\t\tparams.isTerminal = 'false'\n\t\t\t}\n\t\t\treturn { url: FLOW_TASKS_URL, method: 'GET', params }\n\t\t}\n\t\tconst { data, loading, error, refetch } = useEndpointSource(source, {\n\t\t\twidgetId: widgetIdRef,\n\t\t})\n\n\t\t// `inject` is re-read in setup so Vue 2.7 and Vue 3 resolve it\n\t\t// identically to the Options `inject` block (CnStatWidget precedent).\n\t\tconst injectedTranslate = inject('cnTranslate', null)\n\n\t\treturn {\n\t\t\tpayload: data,\n\t\t\tloading,\n\t\t\terror,\n\t\t\trefetch,\n\t\t\tinjectedTranslate,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tpollTimer: null,\n\t\t\t/** The table's head sort, `{ key, dir }`; no key keeps open tasks first. */\n\t\t\theadSort: { key: '', dir: 'asc' },\n\t\t\t/** The table's head filters, `{ column: values[] }`. */\n\t\t\theadFilters: {},\n\t\t\t/** Uuids of the tasks a checkbox is completing, until the next read. */\n\t\t\tcompleting: [],\n\t\t\t/** Whether the table's create form is open. */\n\t\t\tcreateOpen: false,\n\t\t\t/** The new task's title and deadline. */\n\t\t\tnewTitle: '',\n\t\t\tnewDue: '',\n\t\t\t/** Whether the new task is being posted. */\n\t\t\tcreating: false,\n\t\t\t/** The engine's answer to `claimCapabilityUrl`: true, false, or null while unasked. */\n\t\t\tclaimCapable: null,\n\t\t\t/** The table row opened to work on in place, by uuid. */\n\t\t\texpandedId: '',\n\t\t\t/** One answer set per task, keyed by uuid, for the inline forms. */\n\t\t\tanswers: {},\n\t\t\t/** Whether a verb from a work card is in flight. */\n\t\t\tbusy: false,\n\t\t\t/** The task whose form dialog is open, and the outcome it completes with. */\n\t\t\tformTask: null,\n\t\t\tformOutcome: 'done',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the rows draw as the checkbox list (`content.variant: 'list'`).\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisList() {\n\t\t\treturn this.content.variant === 'list'\n\t\t},\n\n\t\t/**\n\t\t * Whether the rows draw as the record's task table (`variant: 'table'`).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tisTable() {\n\t\t\treturn this.content.variant === 'table'\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget shows the first open task to work on in place\n\t\t * (`variant: 'focus'`).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-the-first-open-task-can-be-worked-on-in-place\n\t\t */\n\t\tisFocus() {\n\t\t\treturn this.content.variant === 'focus'\n\t\t},\n\n\t\t/** @return {boolean} Whether a table row's title opens it in place. */\n\t\texpandRows() {\n\t\t\treturn this.content.expandRows === true\n\t\t},\n\n\t\t/** @return {Array<object>} The open tasks, in due order. */\n\t\topenTasks() {\n\t\t\treturn this.rows.filter((task) => task.isTerminal !== true)\n\t\t},\n\n\t\t/** @return {object|null} The task the focus card shows: the first open one. */\n\t\tfocusTask() {\n\t\t\treturn this.openTasks[0] ?? null\n\t\t},\n\n\t\t/** @return {Array<object>} The open tasks after the focus card's. */\n\t\totherOpenTasks() {\n\t\t\treturn this.openTasks.slice(1)\n\t\t},\n\n\t\t/**\n\t\t * Whether the table draws its \"View all\" link under the table rather\n\t\t * than in the card header (`viewAllPlacement: \"footer\"`, DqZaakTaken).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tlinkInFooter() {\n\t\t\treturn this.isTable && this.content.viewAllPlacement === 'footer'\n\t\t},\n\n\t\t/**\n\t\t * The table's footer link, with `viewAllPlacement: \"footer\"`.\n\t\t *\n\t\t * @return {{to: object, label: string}|null}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tfooterViewAll() {\n\t\t\treturn this.linkInFooter ? this.focusViewAll : null\n\t\t},\n\n\t\t/**\n\t\t * The colours `content.stateColors` gives a state, by its raw value\n\t\t * (`{ active: \"purple\" }`), or null.\n\t\t *\n\t\t * @return {object|null}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tstateColors() {\n\t\t\tconst map = this.content.stateColors\n\t\t\treturn map && typeof map === 'object' ? map : null\n\t\t},\n\n\t\t/**\n\t\t * The focus card's \"View all\" link: `viewAllRoute` with `@objectId`\n\t\t * in its query read from the page's record.\n\t\t *\n\t\t * @return {{to: object, label: string}|null}\n\t\t */\n\t\tfocusViewAll() {\n\t\t\tconst link = this.recordLink(this.headerLink)\n\t\t\tif (!link || typeof link.route !== 'string' || link.route === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst to = { name: link.route }\n\t\t\tif (link.params) {\n\t\t\t\tto.params = link.params\n\t\t\t}\n\t\t\tif (link.query) {\n\t\t\t\tto.query = link.query\n\t\t\t}\n\t\t\treturn { to, label: this.tr(link.label) }\n\t\t},\n\n\t\t/** @return {object|null} The opened table row, while it is still open. */\n\t\texpandedTask() {\n\t\t\tif (this.expandedId === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.openTasks.find((task) => String(task.uuid) === this.expandedId) ?? null\n\t\t},\n\n\t\t/**\n\t\t * Whether this instance can claim: true without a\n\t\t * `claimCapabilityUrl`, else what it answered (false until it did).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-claim-follows-a-capability\n\t\t */\n\t\tclaimAvailable() {\n\t\t\tconst url = this.content.claimCapabilityUrl\n\t\t\tif (typeof url !== 'string' || url === '') {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn this.claimCapable === true\n\t\t},\n\n\t\t/**\n\t\t * The table's rows: the open tasks first, then the finished ones, each\n\t\t * in due order as the endpoint sorted them.\n\t\t *\n\t\t * @return {Array<object>} The rows.\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\ttableRows() {\n\t\t\tconst kept = this.rows.filter((task) => Object.entries(this.headFilters).every(([key, values]) => values.length === 0 || values.includes(this.headValue(task, key))))\n\t\t\tif (this.headSort.key) {\n\t\t\t\tconst dir = this.headSort.dir === 'desc' ? -1 : 1\n\t\t\t\treturn [...kept].sort((a, b) => {\n\t\t\t\t\tconst x = this.headSortValue(a, this.headSort.key)\n\t\t\t\t\tconst y = this.headSortValue(b, this.headSort.key)\n\t\t\t\t\treturn (x < y ? -1 : (x > y ? 1 : 0)) * dir\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn [...kept.filter((task) => task.isTerminal !== true), ...kept.filter((task) => task.isTerminal === true)]\n\t\t},\n\n\t\t/** @return {Array<{key: string, label: string}>} The table's data columns. */\n\t\theadColumns() {\n\t\t\treturn [\n\t\t\t\t{ key: 'title', label: this.tr('Task') },\n\t\t\t\t{ key: 'handler', label: this.tr('Handler') },\n\t\t\t\t{ key: 'due', label: this.tr('Task deadline') },\n\t\t\t\t{ key: 'state', label: this.tr('Status') },\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * The table's summary for the card header: \"1 open, 3 done · sorted by deadline\".\n\t\t *\n\t\t * @return {string} The line.\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tsummaryLabel() {\n\t\t\tconst open = this.rows.filter((task) => task.isTerminal !== true).length\n\t\t\tconst done = this.rows.length - open\n\t\t\treturn this.tr('{open} open, {done} done · sorted by deadline')\n\t\t\t\t.replace('{open}', String(open))\n\t\t\t\t.replace('{done}', String(done))\n\t\t},\n\n\t\t/**\n\t\t * The card header's parts: the \"View all\" link, and for the table the\n\t\t * summary under the title and the \"New task\" action.\n\t\t *\n\t\t * @return {object} The header.\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\theader() {\n\t\t\t// The focus card draws its \"View all\" under the list itself, so it\n\t\t\t// shows inside a tab panel too, where no card header is drawn.\n\t\t\tconst header = { link: this.isFocus || this.linkInFooter ? null : this.recordLink(this.headerLink), note: '' }\n\t\t\tif (!this.isTable) {\n\t\t\t\treturn header\n\t\t\t}\n\t\t\theader.subtitle = this.loading && this.rows.length === 0 ? '' : this.summaryLabel\n\t\t\tif (this.content.create && this.recordUuid !== '') {\n\t\t\t\tconst label = typeof this.content.create === 'object' && this.content.create.label ? this.tr(this.content.create.label) : this.tr('New task')\n\t\t\t\theader.action = { label, icon: 'Plus', variant: 'primary', run: this.toggleCreate }\n\t\t\t}\n\t\t\treturn header\n\t\t},\n\n\t\t/**\n\t\t * The record the table lists tasks for, '' without one.\n\t\t *\n\t\t * @return {string} The uuid.\n\t\t */\n\t\trecordUuid() {\n\t\t\treturn recordUuid(this.content.objectUuid, this.objectId)\n\t\t},\n\n\t\t/**\n\t\t * The header \"View all\" link the content declares, or null.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\theaderLink() {\n\t\t\treturn contentHeaderLink(this.content)\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the explicit prop, then the injected\n\t\t * host one, then `@nextcloud/l10n` under the library's own app id.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\ttr() {\n\t\t\tconst fn = this.translate ?? this.injectedTranslate ?? this.cnTranslate\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\treturn (key) => fn(key)\n\t\t\t}\n\t\t\treturn (key) => t('nextcloud-vue', key)\n\t\t},\n\n\t\t/**\n\t\t * The signed-in viewer's uid, for the per-row action offer. Empty\n\t\t * outside a Nextcloud session (the offer then collapses to claim on\n\t\t * pooled rows only, which is the safe reading).\n\t\t *\n\t\t * @return {string} The uid, or ''.\n\t\t */\n\t\tviewerUid() {\n\t\t\treturn getCurrentUser()?.uid || ''\n\t\t},\n\n\t\t/**\n\t\t * The rows to render — the endpoint's bounded page, defensively\n\t\t * re-capped so a wider server default can never overflow the cell.\n\t\t *\n\t\t * @return {Array<object>} The task rows.\n\t\t */\n\t\trows() {\n\t\t\tconst results = (this.payload && this.payload.results) || []\n\t\t\tif (Array.isArray(results) === false) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn results.slice(0, normaliseLimit(this.content.limit))\n\t\t},\n\n\t\t/**\n\t\t * The server's honest total, independent of the rendered page.\n\t\t *\n\t\t * @return {number} The open-task total (never negative).\n\t\t */\n\t\ttotal() {\n\t\t\tconst total = Number((this.payload && this.payload.total) ?? this.rows.length)\n\t\t\tif (Number.isFinite(total) === false) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\treturn Math.max(0, total)\n\t\t},\n\n\t\t/** The count line above the rows. */\n\t\tcountLabel() {\n\t\t\tif (this.total === 1) {\n\t\t\t\treturn this.tr('1 open task')\n\t\t\t}\n\t\t\treturn this.tr('{count} open tasks').replace('{count}', String(this.total))\n\t\t},\n\n\t\t/**\n\t\t * How many open tasks exist beyond the rendered rows.\n\t\t *\n\t\t * @return {number} The hidden task count (never negative).\n\t\t */\n\t\thiddenCount() {\n\t\t\treturn Math.max(0, this.total - this.rows.length)\n\t\t},\n\n\t\t/** The \"+N more\" line. */\n\t\tmoreLabel() {\n\t\t\treturn this.tr('+{count} more').replace('{count}', String(this.hiddenCount))\n\t\t},\n\n\t\t/** The empty-inbox line. */\n\t\temptyLabel() {\n\t\t\tconst override = this.content.emptyText\n\t\t\tif (typeof override === 'string' && override !== '') {\n\t\t\t\treturn this.tr(override)\n\t\t\t}\n\t\t\treturn this.tr('No open tasks')\n\t\t},\n\n\t\t/**\n\t\t * Poll interval in ms, or 0 when polling is off. Floored at 5s so a\n\t\t * mis-authored `pollSeconds: 0.1` cannot turn a dashboard into a\n\t\t * request storm; `0` remains an explicit opt-out.\n\t\t *\n\t\t * @return {number} The interval in milliseconds.\n\t\t */\n\t\tpollMs() {\n\t\t\tconst raw = this.content.pollSeconds\n\t\t\tconst seconds = (raw === undefined || raw === null) ? 30 : Number(raw)\n\t\t\tif (Number.isFinite(seconds) === false || seconds <= 0) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\treturn Math.max(5, seconds) * 1000\n\t\t},\n\t},\n\n\twatch: {\n\t\theader: {\n\t\t\timmediate: true,\n\t\t\thandler(header) {\n\t\t\t\t/**\n\t\t\t\t * @event header Emitted with the card header's parts: the \"View all\" link, if any, and for the table its summary and \"New task\".\n\t\t\t\t * @type {{link: (object|null), note: string, subtitle?: string, action?: object}}\n\t\t\t\t */\n\t\t\t\tthis.$emit('header', header)\n\t\t\t},\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.loadClaimCapability()\n\t\tthis.startPolling()\n\t\tdocument.addEventListener('visibilitychange', this.onVisibilityChange)\n\t},\n\n\tbeforeUnmount() {\n\t\tthis.stopPolling()\n\t\tdocument.removeEventListener('visibilitychange', this.onVisibilityChange)\n\t},\n\n\tmethods: {\n\t\tpreventMiddleClickAutoscroll,\n\n\t\t/**\n\t\t * Start (or restart) the refetch interval, unless polling is off.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tstartPolling() {\n\t\t\tthis.stopPolling()\n\t\t\tif (this.pollMs === 0 || document.hidden === true) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.pollTimer = setInterval(() => {\n\t\t\t\tthis.refetch(true)\n\t\t\t}, this.pollMs)\n\t\t},\n\n\t\t/**\n\t\t * Clear the refetch interval.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tstopPolling() {\n\t\t\tif (this.pollTimer !== null) {\n\t\t\t\tclearInterval(this.pollTimer)\n\t\t\t\tthis.pollTimer = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pause polling while the tab is hidden; refetch once and resume on\n\t\t * return, so the dashboard shows current work rather than whatever\n\t\t * was true when the tab was backgrounded.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonVisibilityChange() {\n\t\t\tif (document.hidden === true) {\n\t\t\t\tthis.stopPolling()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.refetch(true)\n\t\t\tthis.startPolling()\n\t\t},\n\n\t\t/**\n\t\t * The row's display title (server-synthesized when untitled).\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The title.\n\t\t */\n\t\ttitleOf(task) {\n\t\t\treturn task.displayTitle || task.title || String(task.uuid || '')\n\t\t},\n\n\t\t/**\n\t\t * The subject (the case a task sits on), for the list variant's second line.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The subject's title, or ''.\n\t\t */\n\t\tsubjectOf(task) {\n\t\t\treturn task.subject && task.subject.title ? String(task.subject.title) : ''\n\t\t},\n\n\t\t/**\n\t\t * Whether the list variant draws a checkbox on the row: the viewer's own\n\t\t * open task, with no outcome list to choose from.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCheck(task) {\n\t\t\treturn this.canComplete(task) && !(Array.isArray(task.outcomes) && task.outcomes.length > 0)\n\t\t},\n\n\t\t/**\n\t\t * Complete a task from its checkbox, with the server's default outcome.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync check(task) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tif (uuid === '' || this.completing.includes(uuid)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.completing = [...this.completing, uuid]\n\t\t\tawait this.postVerb(task, 'complete', { outcome: 'done' })\n\t\t\tthis.completing = this.completing.filter((id) => id !== uuid)\n\t\t},\n\n\t\t/**\n\t\t * The secondary line: subject, state and priority — whichever of\n\t\t * those the row actually carries, in words.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The meta line.\n\t\t */\n\t\tmetaLine(task) {\n\t\t\tconst parts = []\n\t\t\tif (task.subject && task.subject.title) {\n\t\t\t\tparts.push(String(task.subject.title))\n\t\t\t}\n\t\t\tconst state = STATE_LABELS[task.state]\n\t\t\tparts.push(state ? this.tr(state) : String(task.state || ''))\n\t\t\tconst priority = PRIORITY_LABELS[task.priority]\n\t\t\tif (priority && task.priority !== 'normal') {\n\t\t\t\tparts.push(this.tr(priority))\n\t\t\t}\n\t\t\treturn parts.join(' · ')\n\t\t},\n\n\t\t/**\n\t\t * The due wording for a row, from the server's derived projection.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The due label, or '' without a due date.\n\t\t */\n\t\tdueLabel(task) {\n\t\t\treturn taskDueLabel(task)\n\t\t},\n\n\t\t/**\n\t\t * The due date as a short date (\"18 Oct\"), '' without one; for the\n\t\t * table with `dueFormat: \"date\"`.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string}\n\t\t * @spec openspec/changes/tasks-table-board-options/specs/record-task-table/spec.md#requirement-the-task-table-can-show-dates-its-own-state-words-and-a-footer-link\n\t\t */\n\t\tdueDate(task) {\n\t\t\tconst at = new Date(task?.dueAt ?? '')\n\t\t\treturn Number.isNaN(at.getTime()) ? '' : at.toLocaleDateString(userLocale(), { day: 'numeric', month: 'short' })\n\t\t},\n\n\t\t/**\n\t\t * Whether the row offers claim: pooled (no assignee) and still open.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean} True when claim is offered.\n\t\t */\n\t\tcanClaim(task) {\n\t\t\treturn !task.assignee && task.isTerminal !== true && this.claimAvailable\n\t\t},\n\n\t\t/**\n\t\t * Whether the row offers complete: the viewer's own open task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean} True when complete is offered.\n\t\t */\n\t\tcanComplete(task) {\n\t\t\treturn this.viewerUid !== ''\n\t\t\t\t&& task.assignee === this.viewerUid\n\t\t\t\t&& task.isTerminal !== true\n\t\t},\n\n\t\t/**\n\t\t * Whether a table row offers Complete: the viewer's own open task, or\n\t\t * any open task with `completeAny` (the server still decides).\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tcanCompleteRow(task) {\n\t\t\tif (task.isTerminal === true || this.canClaim(task)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.content.completeAny === true || this.canComplete(task)\n\t\t},\n\n\t\t/**\n\t\t * Whether a table row offers Cancel (`content.cancel`), for an open task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCancelRow(task) {\n\t\t\treturn this.content.cancel === true && task.isTerminal !== true\n\t\t},\n\n\t\t/**\n\t\t * Cancel a task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tcancel(task) {\n\t\t\treturn this.postVerb(task, 'cancel', {})\n\t\t},\n\n\t\t/**\n\t\t * The handler's display name, the uid until it resolves.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The name.\n\t\t */\n\t\t/**\n\t\t * A row's value in a column, as a head filter keeps it.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {string} key The column.\n\t\t * @return {string}\n\t\t */\n\t\theadValue(task, key) {\n\t\t\tif (key === 'title') {\n\t\t\t\treturn this.titleOf(task)\n\t\t\t}\n\t\t\tif (key === 'handler') {\n\t\t\t\treturn String(task.assignee || '')\n\t\t\t}\n\t\t\tif (key === 'due') {\n\t\t\t\treturn this.content.dueFormat === 'date' ? this.dueDate(task) : this.dueLabel(task)\n\t\t\t}\n\t\t\treturn String(task.state || '')\n\t\t},\n\n\t\t/**\n\t\t * A row's value in a column, as its head sorts it: the deadline by date.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {string} key The column.\n\t\t * @return {string|number}\n\t\t */\n\t\theadSortValue(task, key) {\n\t\t\tif (key === 'due') {\n\t\t\t\tconst time = Date.parse(task.dueAt || task.dueDate || '')\n\t\t\t\treturn Number.isNaN(time) ? Number.POSITIVE_INFINITY : time\n\t\t\t}\n\t\t\tif (key === 'handler') {\n\t\t\t\treturn this.handlerName(task).toLowerCase()\n\t\t\t}\n\t\t\tif (key === 'state') {\n\t\t\t\treturn this.stateLabel(task).toLowerCase()\n\t\t\t}\n\t\t\treturn this.titleOf(task).toLowerCase()\n\t\t},\n\n\t\t/**\n\t\t * The values a column's head filter offers, one per value the rows hold.\n\t\t *\n\t\t * @param {string} key The column.\n\t\t * @return {Array<{value: string, label: string}>}\n\t\t */\n\t\theadOptions(key) {\n\t\t\tconst seen = new Map()\n\t\t\tfor (const task of this.rows) {\n\t\t\t\tconst value = this.headValue(task, key)\n\t\t\t\tif (value !== '' && !seen.has(value)) {\n\t\t\t\t\tseen.set(value, key === 'handler' ? this.handlerName(task) : (key === 'state' ? this.stateLabel(task) : value))\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [...seen].map(([value, label]) => ({ value, label }))\n\t\t},\n\n\t\t/**\n\t\t * Sort by a column: ascending first, then descending.\n\t\t *\n\t\t * @param {string} key The column.\n\t\t */\n\t\tsortBy(key) {\n\t\t\tthis.headSort = this.headSort.key === key && this.headSort.dir === 'asc' ? { key, dir: 'desc' } : { key, dir: 'asc' }\n\t\t},\n\n\t\t/**\n\t\t * Keep or drop one value of a column's head filter.\n\t\t *\n\t\t * @param {string} key The column.\n\t\t * @param {string} value The value.\n\t\t */\n\t\ttoggleHeadFilter(key, value) {\n\t\t\tconst current = this.headFilters[key] || []\n\t\t\tthis.headFilters = { ...this.headFilters, [key]: current.includes(value) ? current.filter((v) => v !== value) : [...current, value] }\n\t\t},\n\n\t\thandlerName(task) {\n\t\t\treturn userDisplayName(task.assignee) || String(task.assignee || '')\n\t\t},\n\n\t\t/**\n\t\t * A table row's status in words: `content.stateLabels` first, through\n\t\t * the app's translate, then the library's.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The label.\n\t\t */\n\t\tstateLabel(task) {\n\t\t\tconst own = this.content.stateLabels && typeof this.content.stateLabels === 'object' ? this.content.stateLabels[task.state] : null\n\t\t\tif (typeof own === 'string' && own !== '') {\n\t\t\t\treturn this.tr(own)\n\t\t\t}\n\t\t\tconst state = STATE_LABELS[task.state]\n\t\t\treturn state ? this.tr(state) : String(task.state || '')\n\t\t},\n\n\t\t/**\n\t\t * The tone of a task's status pill: `stateVariants[state]` when that\n\t\t * names a badge variant, else info for an open task and default for a\n\t\t * finished one.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The badge variant.\n\t\t * @spec openspec/changes/tasks-state-variants/specs/tasks-state-variants/spec.md#requirement-a-task-status-pill-can-take-its-tone-from-its-state\n\t\t */\n\t\tstateVariant(task) {\n\t\t\tconst map = this.content && this.content.stateVariants\n\t\t\tconst named = map && typeof map === 'object' ? map[task.state] : undefined\n\t\t\tif (isBadgeVariant(named)) {\n\t\t\t\treturn named\n\t\t\t}\n\t\t\treturn task.isTerminal === true ? 'default' : 'info'\n\t\t},\n\n\t\t/**\n\t\t * A table row's second line: its description and a priority above normal.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {string} The line, or ''.\n\t\t */\n\t\ttableMeta(task) {\n\t\t\tconst parts = []\n\t\t\tif (typeof task.description === 'string' && task.description.trim() !== '') {\n\t\t\t\tparts.push(task.description.trim().split('\\n')[0])\n\t\t\t}\n\t\t\tconst priority = PRIORITY_LABELS[task.priority]\n\t\t\tif (priority && task.priority !== 'normal') {\n\t\t\t\tparts.push(this.tr(priority))\n\t\t\t}\n\t\t\treturn parts.join(' · ')\n\t\t},\n\n\t\t/**\n\t\t * The header link with `@objectId` in its query read from the page's\n\t\t * record (\"all tasks of this case\" on the Tasks page).\n\t\t *\n\t\t * @param {object|null} link The declared link.\n\t\t * @return {object|null} The link.\n\t\t */\n\t\trecordLink(link) {\n\t\t\tif (!link || !link.query || typeof link.query !== 'object') {\n\t\t\t\treturn link\n\t\t\t}\n\t\t\tconst query = Object.fromEntries(Object.entries(link.query).map(([key, value]) => [key, value === '@objectId' ? String(this.objectId ?? '') : value]))\n\t\t\treturn { ...link, query }\n\t\t},\n\n\t\t/**\n\t\t * Open or close the create form (the header's \"New task\").\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\ttoggleCreate() {\n\t\t\tthis.createOpen = !this.createOpen\n\t\t},\n\n\t\t/**\n\t\t * Post the create form as an open task on the record, then refetch.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/record-task-table/specs/record-task-table/spec.md#requirement-a-records-tasks-show-as-a-table-with-their-summary-and-new-task-in-the-header\n\t\t */\n\t\tasync createTask() {\n\t\t\tconst title = this.newTitle.trim()\n\t\t\tif (title === '' || this.recordUuid === '' || this.creating) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst create = typeof this.content.create === 'object' && this.content.create ? this.content.create : {}\n\t\t\tconst payload = { title, objectUuid: this.recordUuid, state: 'available' }\n\t\t\tif (typeof create.appId === 'string' && create.appId !== '') {\n\t\t\t\tpayload.appId = create.appId\n\t\t\t}\n\t\t\tif (this.newDue !== '') {\n\t\t\t\tpayload.dueAt = this.newDue\n\t\t\t}\n\t\t\tthis.creating = true\n\t\t\ttry {\n\t\t\t\tawait axios.post(generateUrl(FLOW_TASKS_URL), payload)\n\t\t\t\tthis.newTitle = ''\n\t\t\t\tthis.newDue = ''\n\t\t\t\tthis.createOpen = false\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error?.response?.data?.error\n\t\t\t\tshowError(typeof message === 'string' && message !== '' ? message : this.tr('The task could not be added'))\n\t\t\t}\n\t\t\tthis.creating = false\n\t\t\tthis.refetch(true)\n\t\t},\n\n\t\t/**\n\t\t * The outcomes to offer on complete: the row's declared list, else\n\t\t * one entry for the server's default outcome.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Array<object|string>} The outcome entries.\n\t\t */\n\t\toutcomesOf(task) {\n\t\t\tif (Array.isArray(task.outcomes) && task.outcomes.length > 0) {\n\t\t\t\treturn task.outcomes\n\t\t\t}\n\t\t\treturn ['done']\n\t\t},\n\n\t\t/**\n\t\t * The wire value of one outcome entry (a string, or `{id, label}`).\n\t\t *\n\t\t * @param {object|string} outcome The outcome entry.\n\t\t * @return {string} The outcome id.\n\t\t */\n\t\toutcomeId(outcome) {\n\t\t\tif (outcome && typeof outcome === 'object') {\n\t\t\t\treturn String(outcome.id ?? outcome.value ?? outcome.label ?? '')\n\t\t\t}\n\t\t\treturn String(outcome ?? '')\n\t\t},\n\n\t\t/**\n\t\t * The menu label for one complete entry.\n\t\t *\n\t\t * @param {object|string} outcome The outcome entry.\n\t\t * @return {string} The label.\n\t\t */\n\t\tcompleteLabel(outcome) {\n\t\t\tconst id = this.outcomeId(outcome)\n\t\t\tconst label = (outcome && typeof outcome === 'object' && outcome.label)\n\t\t\t\t? String(outcome.label)\n\t\t\t\t: id\n\t\t\tif (id === 'done') {\n\t\t\t\treturn this.tr('Complete')\n\t\t\t}\n\t\t\treturn this.tr('Complete: {outcome}').replace('{outcome}', label)\n\t\t},\n\n\t\t/**\n\t\t * Claim a pooled task.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tclaim(task) {\n\t\t\treturn this.postVerb(task, 'claim', {})\n\t\t},\n\n\t\t/**\n\t\t * Complete the viewer's own task with an outcome.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {string} outcome The chosen outcome id.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tcomplete(task, outcome) {\n\t\t\tif (this.formOf(task)) {\n\t\t\t\tthis.formOutcome = outcome || 'done'\n\t\t\t\tthis.formTask = task\n\t\t\t\treturn Promise.resolve()\n\t\t\t}\n\t\t\treturn this.postVerb(task, 'complete', { outcome })\n\t\t},\n\n\t\t/**\n\t\t * POST one lifecycle verb and refetch either way: on success the row\n\t\t * moved, and on a refusal (a lost claim race, a revoked task) the\n\t\t * list is stale in exactly the way the refusal proves. The refusal\n\t\t * itself is toasted in the SERVER'S words (ADR-062 forbids leaking\n\t\t * the raw status line, and the endpoint's `error` string is written\n\t\t * for people).\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {string} verb The lifecycle verb.\n\t\t * @param {object} body The verb body.\n\t\t * @return {Promise<void>} Resolves when the verb settled.\n\t\t */\n\t\tasync postVerb(task, verb, body) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tif (uuid === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst completeUrl = this.content.completeUrl\n\t\t\tconst route = verb === 'complete' && typeof completeUrl === 'string' && completeUrl !== ''\n\t\t\t\t? completeUrl.replace('{id}', encodeURIComponent(uuid))\n\t\t\t\t: `${FLOW_TASKS_URL}/${uuid}/${verb}`\n\t\t\ttry {\n\t\t\t\tawait axios.post(generateUrl(route), body)\n\t\t\t\tif (verb === 'complete') {\n\t\t\t\t\tshowSuccess(this.tr('Task {title} finished').replace('{title}', this.titleOf(task)))\n\t\t\t\t} else if (verb === 'claim') {\n\t\t\t\t\tshowSuccess(this.tr('Task {title} is yours').replace('{title}', this.titleOf(task)))\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst data = error?.response?.data\n\t\t\t\tconst message = data?.error || data?.message\n\t\t\t\tshowError(typeof message === 'string' && message !== ''\n\t\t\t\t\t? message\n\t\t\t\t\t: this.tr('The task action was refused'))\n\t\t\t}\n\t\t\tthis.refetch(true)\n\t\t},\n\n\t\t/**\n\t\t * Ask `claimCapabilityUrl` once whether this instance can claim. A\n\t\t * failure leaves Claim off: a button that silently assigns a task is\n\t\t * worse than none.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-claim-follows-a-capability\n\t\t */\n\t\tasync loadClaimCapability() {\n\t\t\tconst url = this.content.claimCapabilityUrl\n\t\t\tif (typeof url !== 'string' || url === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(generateUrl(url))\n\t\t\t\tthis.claimCapable = response?.data?.claim === true\n\t\t\t} catch {\n\t\t\t\tthis.claimCapable = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The form a task asks for, when it is one to fill in here.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {object|null}\n\t\t */\n\t\tformOf(task) {\n\t\t\tconst form = taskForm(task)\n\t\t\treturn form && form.kind === 'fields' ? form : null\n\t\t},\n\n\t\t/**\n\t\t * One task's answer set, empty until something was typed.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {object} The answers.\n\t\t */\n\t\tanswersFor(task) {\n\t\t\treturn this.answers[String(task.uuid || '')] || {}\n\t\t},\n\n\t\t/**\n\t\t * Keep one answer an inline form emitted.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @param {{field: string, value: string}} answer The answer.\n\t\t * @return {void}\n\t\t */\n\t\trecordAnswer(task, answer) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tthis.answers = { ...this.answers, [uuid]: { ...this.answersFor(task), [String(answer?.field ?? '')]: answer?.value } }\n\t\t},\n\n\t\t/**\n\t\t * Complete the task in a work card with its inline answers. A required\n\t\t * field left empty is named before the round trip; the server refuses\n\t\t * it again for every other client.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/task-widget-on-the-record/specs/task-widget-on-the-record/spec.md#requirement-the-first-open-task-can-be-worked-on-in-place\n\t\t */\n\t\tasync completeInPlace(task) {\n\t\t\tif (this.busy) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst answers = this.answersFor(task)\n\t\t\tconst missing = missingRequiredTaskField(taskForm(task), answers)\n\t\t\tif (missing !== '') {\n\t\t\t\tshowError(this.tr('Fill in {field} before completing this task').replace('{field}', missing))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\ttry {\n\t\t\t\tawait this.postVerb(task, 'complete', taskForm(task) ? { outcome: 'done', data: answers } : { outcome: 'done' })\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open or close a table row's task in place.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleExpanded(task) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tthis.expandedId = this.expandedId === uuid ? '' : uuid\n\t\t},\n\n\t\t/**\n\t\t * The route a task's title links to (`rowRoute`), or null.\n\t\t *\n\t\t * @param {object} task The task row.\n\t\t * @return {object|null}\n\t\t */\n\t\topenRouteFor(task) {\n\t\t\tconst rowRoute = this.content.rowRoute\n\t\t\tconst uuid = String(task?.uuid || '')\n\t\t\tif (typeof rowRoute !== 'string' || rowRoute === '' || uuid === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { name: rowRoute, params: { id: uuid } }\n\t\t},\n\n\t\t/**\n\t\t * The form dialog completed its task.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonFormCompleted() {\n\t\t\tconst title = this.formTask ? this.titleOf(this.formTask) : ''\n\t\t\tthis.formTask = null\n\t\t\tshowSuccess(this.tr('Task {title} finished').replace('{title}', title))\n\t\t\tthis.refetch(true)\n\t\t},\n\n\t\t/**\n\t\t * Open the clicked task: the configured route with the uuid as `id`,\n\t\t * else the task's openregister deep link. A ctrl/cmd/shift or middle\n\t\t * click opens it in a new tab.\n\t\t *\n\t\t * @param {object} task The clicked task row.\n\t\t * @param {MouseEvent} [event] The originating click/auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowClick(task, event) {\n\t\t\tconst uuid = String(task.uuid || '')\n\t\t\tif (uuid === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst rowRoute = this.content.rowRoute\n\t\t\tif (typeof rowRoute === 'string' && rowRoute !== '' && this.$router) {\n\t\t\t\topenRowTarget(event, { name: rowRoute, params: { id: uuid } }, this.$router)\n\t\t\t\treturn\n\t\t\t}\n\t\t\topenRowTarget(event, taskDeepLink(uuid))\n\t\t},\n\n\t\t/**\n\t\t * Middle click on a task row: open it in a new tab.\n\t\t *\n\t\t * @param {object} task The clicked task row.\n\t\t * @param {MouseEvent} event The auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowAuxClick(task, event) {\n\t\t\tif (isRowMiddleClick(event)) {\n\t\t\t\tthis.onRowClick(task, event)\n\t\t\t}\n\t\t},\n\t},\n}\n\n/**\n * Clamp a configured row limit into the range the endpoint accepts.\n *\n * @param {unknown} raw The configured limit.\n * @return {number} A limit between 1 and 50 (default 6).\n */\nfunction normaliseLimit(raw) {\n\tconst n = Number(raw)\n\tif (Number.isFinite(n) === false || n <= 0) {\n\t\treturn 6\n\t}\n\treturn Math.min(50, Math.round(n))\n}\n\n/**\n * Clamp a configured scope onto the endpoint's vocabulary.\n *\n * @param {unknown} raw The configured scope.\n * @return {string} One of assigned, pooled, watched, all (default assigned).\n */\nfunction normaliseScope(raw) {\n\treturn ['assigned', 'pooled', 'watched', 'all'].includes(raw) ? raw : 'assigned'\n}\n\n/**\n * The record a widget lists tasks for: `objectUuid` as written, with\n * `@objectId` read from the page's record.\n *\n * @param {unknown} configured The `objectUuid` setting.\n * @param {unknown} objectId The page's record id.\n * @return {string} The uuid, or ''.\n */\nfunction recordUuid(configured, objectId) {\n\tif (typeof configured !== 'string' || configured === '') {\n\t\treturn ''\n\t}\n\treturn configured === '@objectId' ? String(objectId ?? '') : configured\n}\n</script>\n\n<style scoped>\n/* The record's task table (`variant: 'table'`, board DqZaakTaken): a head\n row of muted 14px labels on a near-white ground, rows divided by hairlines,\n the title at 600 over a muted line, a finished task struck through. */\n.cn-tasks-widget__create {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 12px;\n\tmargin-block-end: 12px;\n}\n\n.cn-tasks-widget__table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n\n.cn-tasks-widget__head {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n}\n\n.cn-tasks-widget__head-sort {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tmin-height: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\tcursor: pointer;\n}\n\n.cn-tasks-widget__head-filter {\n\t--button-size: 22px;\n}\n\n.cn-tasks-widget__table th {\n\tpadding: 12px 16px;\n\tbackground: color-mix(in srgb, var(--color-background-hover) 40%, var(--color-main-background));\n\tcolor: var(--color-text-maxcontrast);\n\tfont-weight: 600;\n\ttext-align: start;\n\twhite-space: nowrap;\n}\n\n.cn-tasks-widget__table td {\n\tpadding: 12px 16px;\n\tborder-top: 1px solid var(--color-border);\n\tvertical-align: middle;\n}\n\n.cn-tasks-widget__cell-task {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 12px;\n}\n\n.cn-tasks-widget__state-icon {\n\tflex: none;\n\tcolor: var(--color-primary-element);\n}\n\n.cn-tasks-widget__state-icon--done {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-tasks-widget__table .cn-tasks-widget__name {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tcolor: var(--color-main-text);\n\tfont: inherit;\n\tfont-size: 15px;\n\tfont-weight: 600;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-tasks-widget__table .cn-tasks-widget__name:hover,\n.cn-tasks-widget__table .cn-tasks-widget__name:focus-visible {\n\ttext-decoration: underline;\n}\n\n.cn-tasks-widget__table-row--done .cn-tasks-widget__name {\n\ttext-decoration: line-through;\n}\n\n.cn-tasks-widget__handler {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-tasks-widget__cell-due {\n\twhite-space: nowrap;\n}\n\n.cn-tasks-widget__cell-due.cn-tasks-widget__due--overdue {\n\tcolor: var(--color-warning-text, var(--color-warning));\n\tfont-weight: 600;\n}\n\n.cn-tasks-widget__cell-actions {\n\ttext-align: end;\n\twhite-space: nowrap;\n}\n\n.cn-tasks-widget {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-tasks-widget__loading {\n\tdisplay: flex;\n\tjustify-content: center;\n\tpadding: 8px 0;\n}\n\n.cn-tasks-widget__view-all {\n\tdisplay: inline-block;\n\tmargin-top: 8px;\n\tcolor: var(--color-primary-element-text, var(--color-primary-element));\n\ttext-decoration: underline;\n}\n\n.cn-tasks-widget__others {\n\tmargin-top: 12px;\n}\n\n.cn-tasks-widget__others-title {\n\tmargin: 0 0 6px;\n\tfont-size: 14px;\n}\n\n.cn-tasks-widget__others-list {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-tasks-widget__others-row {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tpadding: 6px 0;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-tasks-widget__others-actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n}\n\n.cn-tasks-widget__empty,\n.cn-tasks-widget__error,\n.cn-tasks-widget__more {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-tasks-widget__more {\n\tpadding-top: 4px;\n}\n\n.cn-tasks-widget__count {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\tfont-weight: 600;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.04em;\n}\n\n.cn-tasks-widget__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tmin-width: 0;\n}\n\n.cn-tasks-widget__row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 6px 0;\n\tborder-bottom: 1px solid var(--color-border);\n\tmin-width: 0;\n\tcursor: pointer;\n}\n\n.cn-tasks-widget__row:last-child {\n\tborder-bottom: none;\n}\n\n.cn-tasks-widget__body {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n\n.cn-tasks-widget__name {\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-tasks-widget__row:hover .cn-tasks-widget__name {\n\ttext-decoration: underline;\n}\n\n.cn-tasks-widget__meta {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-tasks-widget__due {\n\tflex: 0 0 auto;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\tfont-variant-numeric: tabular-nums;\n}\n\n/* List variant, after the dashboard board's My tasks card: a checkbox, the\n title, the subject on a muted second line and the due date at its right. */\n.cn-tasks-widget--list .cn-tasks-widget__row {\n\talign-items: flex-start;\n\tgap: 12px;\n\tpadding: 12px 0;\n}\n\n.cn-tasks-widget--list .cn-tasks-widget__name {\n\tfont-weight: 400;\n\tfont-size: 15px;\n\tline-height: 1.35;\n\tcolor: var(--color-main-text);\n}\n\n.cn-tasks-widget__check,\n.cn-tasks-widget__check-spacer {\n\tflex: none;\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 1px 0 0;\n}\n\n.cn-tasks-widget__check {\n\taccent-color: var(--color-primary-element);\n\tcursor: pointer;\n}\n\n.cn-tasks-widget__meta--split {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tfont-size: 13px;\n\toverflow: visible;\n}\n\n.cn-tasks-widget__subject {\n\tmin-width: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-tasks-widget--list .cn-tasks-widget__due {\n\tfont-size: 13px;\n\tfont-weight: 500;\n}\n\n.cn-tasks-widget--list .cn-tasks-widget__due--overdue {\n\tfont-weight: 600;\n}\n\n/* Overdue: weight AND colour on top of the wording, which already says\n \"Overdue by N days\" — the signal survives monochrome. */\n.cn-tasks-widget__due--overdue {\n\tcolor: var(--color-error, #d91f2d);\n\tfont-weight: 600;\n}\n\n.cn-tasks-widget__actions {\n\tflex: 0 0 auto;\n}\n</style>\n"],"names":["CnStatusBadge","CnTaskFormDialog","CnTaskWorkCard","t","axios"],"mappings":"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"}
|