@conduction/nextcloud-vue 2.138.0 → 2.140.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +9 -2
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +17 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +2 -2
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +52 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js +23 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +106 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +30 -7
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +59 -3
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +44 -34
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +28 -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/CnFilesBrowser/filesBrowser.js +7 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +5 -0
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +129 -6
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +2 -0
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +13 -2
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +28 -3
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js +10 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue3.js.map +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +12 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue.js +1 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js +23 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js.map +1 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js +43 -13
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js.map +1 -1
- package/dist/esm/composables/indexSources.js +48 -6
- package/dist/esm/composables/indexSources.js.map +1 -1
- package/dist/esm/composables/useTaskInboxStore.js +4 -3
- package/dist/esm/composables/useTaskInboxStore.js.map +1 -1
- package/dist/esm/l10n/en.json.js +4 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +7 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +604 -407
- package/dist/esm/utils/builtInFormatters.js +23 -1
- package/dist/esm/utils/builtInFormatters.js.map +1 -1
- package/dist/esm/utils/fillTemplate.js +7 -1
- package/dist/esm/utils/fillTemplate.js.map +1 -1
- package/dist/esm/utils/myTeam.js +24 -4
- package/dist/esm/utils/myTeam.js.map +1 -1
- package/dist/esm/utils/resolveFilterTokens.js +5 -4
- package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
- package/dist/esm/utils/transitionInputs.js +43 -2
- package/dist/esm/utils/transitionInputs.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +932 -236
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +604 -407
- package/l10n/en.json +4 -1
- package/l10n/nl.json +7 -1
- package/package.json +1 -1
- package/src/components/CnAppRoot/CnAppRoot.vue +9 -2
- package/src/components/CnCellRenderer/CnCellRenderer.vue +19 -3
- package/src/components/CnChartWidget/CnChartWidget.md +1 -0
- package/src/components/CnChartWidget/CnChartWidget.vue +76 -1
- package/src/components/CnConversationThread/CnConversationWidget.vue +126 -1
- package/src/components/CnFactsWidget/CnFactsWidget.vue +78 -9
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +39 -1
- package/src/components/CnFilesBrowser/filesBrowser.js +7 -1
- package/src/components/CnFilesBrowser/filesBrowserColumns.js +5 -0
- package/src/components/CnIndexPage/CnIndexPage.vue +131 -8
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +10 -2
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +28 -3
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +1 -1
- package/src/components/CnRecordListWidget/CnRecordNoteRows.vue +10 -0
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +68 -2
- package/src/components/CnTransitionInputFields/CnTransitionInputFields.vue +43 -1
- package/src/composables/indexSources.js +48 -6
- package/src/composables/useTaskInboxStore.js +4 -3
- package/src/css/dialog.css +18 -0
- package/src/css/look-board-detail.css +24 -0
- package/src/css/look-board-index.css +21 -0
- package/src/css/look-board.css +31 -2
- package/src/css/table.css +13 -0
- package/src/utils/builtInFormatters.js +22 -0
- package/src/utils/fillTemplate.js +7 -1
- package/src/utils/myTeam.js +24 -4
- package/src/utils/resolveFilterTokens.js +5 -4
- package/src/utils/transitionInputs.js +42 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnTransitionInputFields.vue3.js","sources":["../../../../src/components/CnTransitionInputFields/CnTransitionInputFields.vue?vue&type=template&id=3e4484aa&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div\n\t\tclass=\"cn-transition-input-fields\"\n\t\t:class=\"{ 'cn-transition-input-fields--columns': columns === 2 }\">\n\t\t<template v-if=\"summaryShown\">\n\t\t\t<div v-if=\"summary.card\"\n\t\t\t\tclass=\"cn-transition-input-fields__card cn-transition-input-fields__wide\"\n\t\t\t\t:data-testid=\"summaryTestid('card')\">\n\t\t\t\t<component :is=\"summary.card.icon\"\n\t\t\t\t\tv-if=\"summary.card.icon\"\n\t\t\t\t\t:size=\"20\"\n\t\t\t\t\tclass=\"cn-transition-input-fields__card-icon\" />\n\t\t\t\t<span class=\"cn-transition-input-fields__card-text\">\n\t\t\t\t\t<strong>{{ contextText(summary.card.title) }}</strong>\n\t\t\t\t\t<span class=\"cn-transition-input-fields__muted\">{{ cardMeta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<span v-if=\"contextText(summary.card.badge)\" class=\"cn-transition-input-fields__badge\">\n\t\t\t\t\t{{ contextText(summary.card.badge) }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<section v-if=\"Array.isArray(summary.facts) && summary.facts.length > 0\"\n\t\t\t\tclass=\"cn-transition-input-fields__wide\"\n\t\t\t\t:data-testid=\"summaryTestid('facts')\">\n\t\t\t\t<h3 v-if=\"summary.title\" class=\"cn-transition-input-fields__section-title\">\n\t\t\t\t\t{{ summary.title }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-transition-input-fields__facts\">\n\t\t\t\t\t<div v-for=\"fact in summary.facts\" :key=\"fact.path || fact.label\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ contextText(fact.path) || fact.fallback || '' }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t</section>\n\t\t</template>\n\n\t\t<template v-for=\"field in shownFields\" :key=\"field.key\">\n\t\t\t<div\n\t\t\t\tclass=\"cn-transition-input__field\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'cn-transition-input__field--refused': isRefused(field.key),\n\t\t\t\t\t'cn-transition-input-fields__wide': field.input.wide === true,\n\t\t\t\t}\"\n\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}`\">\n\t\t\t\t<!-- A template fills another input; it is never sent itself. -->\n\t\t\t\t<CnTemplateSelect v-if=\"field.widget === 'template'\"\n\t\t\t\t\t:url=\"field.input.url || ''\"\n\t\t\t\t\t:schema=\"field.input.schema || ''\"\n\t\t\t\t\t:params=\"field.input.params || {}\"\n\t\t\t\t\t:mapOption=\"field.input.mapOption\"\n\t\t\t\t\t:inputLabel=\"field.label\"\n\t\t\t\t\t:placeholder=\"field.input.placeholder || ''\"\n\t\t\t\t\t:data-testid=\"field.input.testid || `cn-transition-input-template-${field.key}`\"\n\t\t\t\t\t@apply=\"applyTemplate(field, $event)\" />\n\n\t\t\t\t<!-- An input that declares its choices is picked from them. -->\n\t\t\t\t<NcSelect v-else-if=\"field.widget === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"field.options\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t:inputLabel=\"labelOf(field)\"\n\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t:data-testid=\"field.input.testid || `cn-transition-input-select-${field.key}`\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event && $event.value !== undefined ? $event.value : '')\" />\n\n\t\t\t\t<!-- An input that points at another record is picked, never typed. -->\n\t\t\t\t<div v-else-if=\"field.widget === 'reference'\" class=\"cn-transition-input__reference\">\n\t\t\t\t\t<label class=\"cn-transition-input__label\">{{ labelOf(field) }}</label>\n\t\t\t\t\t<CnResourceSelect\n\t\t\t\t\t\t:register=\"field.referenceRegister\"\n\t\t\t\t\t\t:schema=\"String(field.reference.schema)\"\n\t\t\t\t\t\t:labelField=\"(field.picker && field.picker.labelField) || field.reference.labelField || 'name'\"\n\t\t\t\t\t\t:filter=\"(field.picker && field.picker.filter) || {}\"\n\t\t\t\t\t\t:exclude=\"excludedIds(field)\"\n\t\t\t\t\t\t:allowCreate=\"false\"\n\t\t\t\t\t\t:preload=\"true\"\n\t\t\t\t\t\t:inputLabel=\"labelOf(field)\"\n\t\t\t\t\t\t:modelValue=\"String(modelValue[field.key] ?? '')\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-picker-${field.key}`\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- An object input: its sub-properties, one field at a time. -->\n\t\t\t\t<fieldset v-else-if=\"field.widget === 'object'\" class=\"cn-transition-input__object\">\n\t\t\t\t\t<legend>{{ labelOf(field) }}</legend>\n\t\t\t\t\t<div v-for=\"sub in field.subFields\"\n\t\t\t\t\t\t:key=\"sub.key\"\n\t\t\t\t\t\tclass=\"cn-transition-input__subfield\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}-${sub.key}`\">\n\t\t\t\t\t\t<NcTextArea v-if=\"sub.widget === 'textarea'\"\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"sub.widget === 'checkbox'\"\n\t\t\t\t\t\t\t:modelValue=\"subValue(field.key, sub.key) === true\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event === true)\">\n\t\t\t\t\t\t\t{{ subLabel(sub) }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:type=\"sub.widget === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<p v-if=\"isSubRefused(field.key, sub.key)\"\n\t\t\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}.${sub.key}`\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'This value was not accepted.') }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\n\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t:modelValue=\"modelValue[field.key] === true\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event === true)\">\n\t\t\t\t\t{{ labelOf(field) }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t<template v-else>\n\t\t\t\t\t<!-- A label drawn above the field, as a form board draws it,\n\t\t\t\t\t is tied to the field by its id. -->\n\t\t\t\t\t<label v-if=\"field.input.labelOutside === true\"\n\t\t\t\t\t\tclass=\"cn-transition-input-fields__label\"\n\t\t\t\t\t\t:for=\"inputId(field)\">{{ labelOf(field) }}</label>\n\t\t\t\t\t<NcTextArea v-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t\t:id=\"inputId(field)\"\n\t\t\t\t\t\t:modelValue=\"String(modelValue[field.key] ?? '')\"\n\t\t\t\t\t\t:label=\"labelOf(field)\"\n\t\t\t\t\t\t:labelOutside=\"field.input.labelOutside === true\"\n\t\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t\t:rows=\"field.input.rows || 4\"\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\tresize=\"vertical\"\n\t\t\t\t\t\t:data-testid=\"field.input.testid || null\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t:id=\"inputId(field)\"\n\t\t\t\t\t\t:modelValue=\"String(modelValue[field.key] ?? '')\"\n\t\t\t\t\t\t:type=\"textType(field)\"\n\t\t\t\t\t\t:label=\"labelOf(field)\"\n\t\t\t\t\t\t:labelOutside=\"field.input.labelOutside === true\"\n\t\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t:data-testid=\"field.input.testid || null\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t\t<span v-if=\"field.input.note\" class=\"cn-transition-input-fields__muted\">\n\t\t\t\t\t\t{{ field.input.note }}\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\n\t\t\t\t<p v-if=\"isRefused(field.key)\"\n\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}`\">\n\t\t\t\t\t{{ refusalFor(field) }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- What the input means once filled in, such as the day a paused\n\t\t\t term comes back. Shown only once it can be worked out. -->\n\t\t\t<div v-if=\"field.previewText\"\n\t\t\t\t:key=\"`${field.key}-preview`\"\n\t\t\t\tclass=\"cn-transition-input-fields__preview cn-transition-input-fields__wide\"\n\t\t\t\t:data-testid=\"field.input.preview.testid || `cn-transition-input-preview-${field.key}`\">\n\t\t\t\t<span class=\"cn-transition-input-fields__label\">{{ field.input.preview.label }}</span>\n\t\t\t\t<span :data-testid=\"`${field.input.preview.testid || `cn-transition-input-preview-${field.key}`}-value`\">{{ field.previewText }}</span>\n\t\t\t\t<span v-if=\"field.input.preview.note\" class=\"cn-transition-input-fields__muted\">\n\t\t\t\t\t{{ field.input.preview.note }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- A tinted box with the act's own icon (DqArchiveren \"Daarna alleen\n\t\t lezen\", a lock), drawn here rather than as a note card: a note\n\t\t card on the tinted card of a chosen act disappears into it. -->\n\t\t<div v-if=\"notice && notice.text\"\n\t\t\tclass=\"cn-transition-input-fields__notice cn-transition-input-fields__wide\"\n\t\t\t:class=\"`cn-transition-input-fields__notice--${notice.type || 'info'}`\"\n\t\t\trole=\"note\"\n\t\t\tdata-testid=\"cn-transition-input-fields-notice\">\n\t\t\t<CnIcon :name=\"notice.icon || 'InformationOutline'\" :size=\"20\" class=\"cn-transition-input-fields__notice-icon\" />\n\t\t\t<span class=\"cn-transition-input-fields__notice-text\">\n\t\t\t\t<strong v-if=\"notice.heading\">{{ notice.heading }}</strong>\n\t\t\t\t<span>{{ notice.text }}</span>\n\t\t\t</span>\n\t\t</div>\n\n\t\t<!-- A key the refusal names that this form never offered is not a\n\t\t field anybody can correct here. Saying so beats saying nothing:\n\t\t the request sent something the action does not accept. -->\n\t\t<p v-for=\"key in unofferedRefusals\"\n\t\t\t:key=\"`unoffered-${key}`\"\n\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t:data-testid=\"`cn-transition-input-error-${key}`\">\n\t\t\t{{ t('nextcloud-vue', 'This action does not accept the field \"{field}\".', { field: key }) }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcCheckboxRadioSwitch, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CnResourceSelect from '../CnResourceSelect/CnResourceSelect.vue'\nimport CnTemplateSelect from '../CnTemplateSelect/CnTemplateSelect.vue'\nimport { readPath } from '../../utils/readPath.js'\nimport { applyTemplateText, isInputFilled, resolveInputFields } from '../../utils/transitionInputs.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\nlet uid = 0\n\n/**\n * CnTransitionInputFields — the declared inputs of a transition or an act,\n * drawn wherever the host puts them.\n *\n * CnTransitionInputDialog draws them in their own dialog. A host that lists\n * several acts and opens the chosen one's inputs in place (under its card)\n * draws them with this component, so both read the same declarations and\n * decide the same way. The values are a `v-model` object keyed by field;\n * whether they are complete is `inputFieldsComplete(resolveInputFields(...))`.\n *\n * Next to the schema-resolved widgets an input may declare `widget` (`text`,\n * `textarea`, `number`, `date`, `select`, `template`), `optionsSource` (a dot\n * path into `context`), `other`, `helperFrom`, `preview`, `default` and\n * presentation keys; see `resolveInputFields` in `utils/transitionInputs.js`.\n *\n * ```vue\n * <CnTransitionInputFields\n * v-model=\"values\"\n * :inputs=\"act.inputs\"\n * :context=\"{ pauseReasons }\"\n * :columns=\"2\" />\n * ```\n *\n * @spec openspec/changes/dq-abstract-forms/specs/transition-inputs/spec.md\n */\nexport default {\n\tname: 'CnTransitionInputFields',\n\n\tcomponents: {\n\t\tCnIcon,\n\t\tCnResourceSelect,\n\t\tCnTemplateSelect,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSelect,\n\t\tNcTextArea,\n\t\tNcTextField,\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The declared inputs: `[{ field, required, label, widget, options,\n\t\t * optionsSource, optionValue, optionLabel, other, helperFrom, preview,\n\t\t * default, description, note, labelOutside, id, wide, testid, rows,\n\t\t * placeholder }]`, plus for a `template` input `url`, `schema`,\n\t\t * `params`, `mapOption` and `applyTo`.\n\t\t *\n\t\t * @type {Array<object>}\n\t\t */\n\t\tinputs: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The values, keyed by field.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The object's JSON Schema, which labels and types the inputs that\n\t\t * declare no widget of their own.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The record the action runs on: `picker.excludeSelf` leaves its id\n\t\t * out, and an object input is merged over its present value.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tcurrentObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Register slug the reference pickers look in when the schema property\n\t\t * names none of its own.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tregister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * What `optionsSource` and the summary paths read, such as the case\n\t\t * type's choices and the record shown in the summary.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontext: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The input keys a refusal named. Each one this form offers is marked\n\t\t * on its own field; each one it does not is reported as a key the\n\t\t * action does not accept.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tfieldErrors: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether the inputs are locked, such as while the action posts.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * 1 stacks the inputs; 2 sets them side by side, with `wide` inputs,\n\t\t * previews, the summary and the notice across both columns.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\n\t\t/**\n\t\t * Whether a required input's label carries a ` *` marker.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tmarkRequired: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether an input that is not required says so, with ` (optional)`\n\t\t * after its label, as the boards mark them (DqVolgendeStap \"Dagen die\n\t\t * de aanvrager krijgt (niet verplicht)\").\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tmarkOptional: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * A read-only block above the inputs about what the action works on:\n\t\t * `{ when, card: { icon, title, meta: [], badge }, title, facts:\n\t\t * [{ label, path, fallback }], testid }`. `when`, `title`, `meta`,\n\t\t * `badge` and each fact's `path` are dot paths into `context`; the\n\t\t * block is shown only when `when` resolves.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tsummary: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * A note under the inputs: `{ type, heading, text, icon? }`. `type` is\n\t\t * info (the default), warning or error; `icon` names a CnIcon.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tnotice: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['update:modelValue'],\n\n\tdata() {\n\t\tuid += 1\n\t\treturn {\n\t\t\tuid,\n\t\t\t// The values with every change made since the host last passed\n\t\t\t// them in, so two changes in one tick both survive.\n\t\t\tlatest: { ...this.modelValue },\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Every declared input, resolved against the schema and the context. */\n\t\tfields() {\n\t\t\treturn resolveInputFields(this.inputs, {\n\t\t\t\tschema: this.schema,\n\t\t\t\tregister: this.register,\n\t\t\t\tcontext: this.context,\n\t\t\t\tvalues: this.modelValue,\n\t\t\t})\n\t\t},\n\n\t\t/** The inputs that are asked now. */\n\t\tshownFields() {\n\t\t\treturn this.fields.filter((field) => !field.hidden)\n\t\t},\n\n\t\t/** Whether the summary block shows. */\n\t\tsummaryShown() {\n\t\t\tif (!this.summary || typeof this.summary !== 'object') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn !this.summary.when || Boolean(readPath(this.context, this.summary.when))\n\t\t},\n\n\t\t/** The summary card's second line. */\n\t\tcardMeta() {\n\t\t\tconst meta = Array.isArray(this.summary?.card?.meta) ? this.summary.card.meta : []\n\t\t\treturn meta.map((path) => this.contextText(path)).filter(Boolean).join(' · ')\n\t\t},\n\n\t\t/** The refusal's field keys, normalised to strings. */\n\t\trefusedKeys() {\n\t\t\tif (!Array.isArray(this.fieldErrors)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.fieldErrors.filter((key) => typeof key === 'string' && key !== '')\n\t\t},\n\n\t\t/** The refused keys this form offers no field for. */\n\t\tunofferedRefusals() {\n\t\t\tconst offered = this.fields.map((field) => field.key)\n\t\t\treturn this.refusedKeys.filter((key) => !offered.includes(key))\n\t\t},\n\t},\n\n\twatch: {\n\t\tmodelValue(values) {\n\t\t\tthis.latest = { ...values }\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A context value as text, '' when absent.\n\t\t *\n\t\t * @param {string} path Dot path into the context.\n\t\t * @return {string}\n\t\t */\n\t\tcontextText(path) {\n\t\t\tif (!path) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst value = readPath(this.context, path)\n\t\t\treturn value === null || value === undefined ? '' : String(value)\n\t\t},\n\n\t\t/**\n\t\t * The test id of one part of the summary.\n\t\t *\n\t\t * @param {string} part `card` or `facts`.\n\t\t * @return {string}\n\t\t */\n\t\tsummaryTestid(part) {\n\t\t\treturn `${this.summary.testid || 'cn-transition-input-summary'}-${part}`\n\t\t},\n\n\t\t/**\n\t\t * The field's label, with the required or the optional marker when asked for.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tlabelOf(field) {\n\t\t\tif (this.markRequired && field.required) {\n\t\t\t\treturn `${field.label} *`\n\t\t\t}\n\t\t\treturn this.markOptional && !field.required ? `${field.label} (${t('nextcloud-vue', 'optional')})` : field.label\n\t\t},\n\n\t\t/**\n\t\t * Label of a sub-field, with the required marker.\n\t\t *\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tsubLabel(sub) {\n\t\t\treturn this.markRequired && sub.required ? `${sub.label} *` : sub.label\n\t\t},\n\n\t\t/**\n\t\t * The element id of a text input: the declared one, or one unique to\n\t\t * this form.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tinputId(field) {\n\t\t\treturn field.input.id || `cn-transition-input-${this.uid}-${field.key}`\n\t\t},\n\n\t\t/**\n\t\t * The native input type of a one-line input.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\ttextType(field) {\n\t\t\treturn field.widget === 'number' || field.widget === 'date' ? field.widget : 'text'\n\t\t},\n\n\t\t/**\n\t\t * The option a picker currently holds, or null.\n\t\t *\n\t\t * @param {object} field The select descriptor.\n\t\t * @return {{value: string, label: string}|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\tconst value = this.modelValue[field.key]\n\t\t\treturn field.options.find((option) => option.value === String(value ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Ids a reference picker must not offer: the current record, when the\n\t\t * input's `picker.excludeSelf` says so.\n\t\t *\n\t\t * @param {object} field The reference descriptor.\n\t\t * @return {string[]}\n\t\t */\n\t\texcludedIds(field) {\n\t\t\tif (!field.picker || field.picker.excludeSelf !== true || !this.currentObject) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst self = this.currentObject\n\t\t\treturn [self.id, self.uuid, self['@self'] && self['@self'].id].filter((id) => id !== undefined && id !== null).map(String)\n\t\t},\n\n\t\t/**\n\t\t * Whether the refusal named this field.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRefused(key) {\n\t\t\treturn this.refusedKeys.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * What to say beside a refused field. An empty one is a missing input;\n\t\t * a filled one was refused for what is in it. The kind is decided here\n\t\t * rather than read out of the refusal's sentence, which may be reworded.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\trefusalFor(field) {\n\t\t\treturn isInputFilled(field, this.modelValue)\n\t\t\t\t? t('nextcloud-vue', 'This value was not accepted.')\n\t\t\t\t: t('nextcloud-vue', 'This field is required.')\n\t\t},\n\n\t\t/**\n\t\t * Whether a refusal named `<input>.<sub>`.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubRefused(key, sub) {\n\t\t\treturn this.refusedKeys.includes(`${key}.${sub}`)\n\t\t},\n\n\t\t/**\n\t\t * A typed sub-value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {unknown}\n\t\t */\n\t\tsubValue(key, sub) {\n\t\t\tconst group = this.modelValue[key]\n\t\t\treturn group && typeof group === 'object' ? group[sub] : undefined\n\t\t},\n\n\t\t/**\n\t\t * Store one sub-value, keeping the rest of the object input's values.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetSubValue(key, sub, value) {\n\t\t\tconst group = this.latest[key] && typeof this.latest[key] === 'object' ? this.latest[key] : {}\n\t\t\tthis.setValue(key, { ...group, [sub]: value })\n\t\t},\n\n\t\t/**\n\t\t * Store one input's value.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetValue(key, value) {\n\t\t\tthis.latest = { ...this.latest, [key]: value }\n\t\t\t/**\n\t\t\t * @event update:modelValue The values with this one changed.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('update:modelValue', this.latest)\n\t\t},\n\n\t\t/**\n\t\t * Put a chosen template's text into the input it fills, unless that\n\t\t * input already holds text.\n\t\t *\n\t\t * @param {object} field The template descriptor.\n\t\t * @param {object|null} option The chosen template.\n\t\t */\n\t\tapplyTemplate(field, option) {\n\t\t\tconst next = applyTemplateText(this.latest, field.input.applyTo, option)\n\t\t\tif (next !== this.latest) {\n\t\t\t\tthis.latest = next\n\t\t\t\t/** @event update:modelValue The values with the template's text filled in. */\n\t\t\t\tthis.$emit('update:modelValue', next)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-transition-input-fields {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n}\n\n.cn-transition-input-fields--columns {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\talign-items: start;\n}\n\n.cn-transition-input-fields--columns .cn-transition-input-fields__wide {\n\tgrid-column: 1 / -1;\n}\n\n.cn-transition-input__field,\n.cn-transition-input-fields__preview {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-transition-input__label {\n\tdisplay: block;\n\tmargin-bottom: 4px;\n}\n\n.cn-transition-input-fields__label {\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__muted {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-transition-input__field-error {\n\tmargin: 4px 0 0;\n\tfont-size: 0.9em;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__field--refused {\n\tborder-inline-start: 2px solid var(--color-error);\n\tpadding-inline-start: 8px;\n}\n\n.cn-transition-input__object {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\tpadding: 8px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-transition-input-fields__card {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 14px;\n\tpadding: 14px 16px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-transition-input-fields__card-icon {\n\tcolor: var(--color-primary-element);\n}\n\n.cn-transition-input-fields__card-text {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-transition-input-fields__badge {\n\tpadding: 3px 10px;\n\tborder-radius: 12px;\n\tbackground: var(--color-success-light, var(--color-background-dark));\n\tcolor: var(--color-success-text);\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__section-title {\n\tmargin: 0 0 8px;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: 0 24px;\n\tmargin: 0;\n}\n\n.cn-transition-input-fields__facts > div {\n\tpadding: 10px 0;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-transition-input-fields__facts dt,\n.cn-transition-input-fields__facts dd {\n\tdisplay: block;\n\twidth: auto;\n\tpadding: 0;\n\ttext-align: start;\n\twhite-space: normal;\n}\n\n.cn-transition-input-fields__facts dt {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-transition-input-fields__facts dd {\n\tmargin: 2px 0 0;\n\tfont-size: 15px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__notice {\n\tdisplay: flex;\n\tgap: 12px;\n\talign-items: flex-start;\n\tpadding: 14px 16px;\n\tborder-radius: var(--border-radius-large, 8px);\n\tbackground: var(--color-primary-element-light);\n\tcolor: var(--color-main-text);\n}\n\n.cn-transition-input-fields__notice--warning {\n\tbackground: var(--color-warning-element-light, var(--color-background-dark));\n}\n\n.cn-transition-input-fields__notice--error {\n\tbackground: var(--color-error-element-light, var(--color-background-dark));\n}\n\n.cn-transition-input-fields__notice-icon {\n\tflex: none;\n\tcolor: var(--color-primary-element-light-text, var(--color-primary-element));\n}\n\n.cn-transition-input-fields__notice-text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n.cn-transition-input-fields__notice-text strong {\n\tcolor: var(--color-primary-element-light-text, var(--color-main-text));\n}\n</style>\n"],"names":["_normalizeClass","_createElementBlock","_Fragment","_openBlock","_createBlock","_resolveDynamicComponent","_createElementVNode","_toDisplayString","_renderList","_createTextVNode","_createVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnTransitionInputFields.vue3.js","sources":["../../../../src/components/CnTransitionInputFields/CnTransitionInputFields.vue?vue&type=template&id=731d1a6c&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div\n\t\tclass=\"cn-transition-input-fields\"\n\t\t:class=\"{ 'cn-transition-input-fields--columns': columns === 2 }\">\n\t\t<template v-if=\"summaryShown\">\n\t\t\t<div v-if=\"summary.card\"\n\t\t\t\tclass=\"cn-transition-input-fields__card cn-transition-input-fields__wide\"\n\t\t\t\t:data-testid=\"summaryTestid('card')\">\n\t\t\t\t<component :is=\"summary.card.icon\"\n\t\t\t\t\tv-if=\"summary.card.icon\"\n\t\t\t\t\t:size=\"20\"\n\t\t\t\t\tclass=\"cn-transition-input-fields__card-icon\" />\n\t\t\t\t<span class=\"cn-transition-input-fields__card-text\">\n\t\t\t\t\t<strong>{{ contextText(summary.card.title) }}</strong>\n\t\t\t\t\t<span class=\"cn-transition-input-fields__muted\">{{ cardMeta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<span v-if=\"contextText(summary.card.badge)\" class=\"cn-transition-input-fields__badge\">\n\t\t\t\t\t{{ contextText(summary.card.badge) }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<section v-if=\"Array.isArray(summary.facts) && summary.facts.length > 0\"\n\t\t\t\tclass=\"cn-transition-input-fields__wide\"\n\t\t\t\t:data-testid=\"summaryTestid('facts')\">\n\t\t\t\t<h3 v-if=\"summary.title\" class=\"cn-transition-input-fields__section-title\">\n\t\t\t\t\t{{ summary.title }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-transition-input-fields__facts\">\n\t\t\t\t\t<div v-for=\"fact in summary.facts\" :key=\"fact.path || fact.label\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ contextText(fact.path) || fact.fallback || '' }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t</section>\n\t\t</template>\n\n\t\t<template v-for=\"field in shownFields\" :key=\"field.key\">\n\t\t\t<div\n\t\t\t\tclass=\"cn-transition-input__field\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'cn-transition-input__field--refused': isRefused(field.key),\n\t\t\t\t\t'cn-transition-input-fields__wide': field.input.wide === true,\n\t\t\t\t}\"\n\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}`\">\n\t\t\t\t<!-- A template fills another input; it is never sent itself. -->\n\t\t\t\t<CnTemplateSelect v-if=\"field.widget === 'template'\"\n\t\t\t\t\t:url=\"field.input.url || ''\"\n\t\t\t\t\t:schema=\"field.input.schema || ''\"\n\t\t\t\t\t:params=\"field.input.params || {}\"\n\t\t\t\t\t:mapOption=\"field.input.mapOption\"\n\t\t\t\t\t:inputLabel=\"field.label\"\n\t\t\t\t\t:placeholder=\"field.input.placeholder || ''\"\n\t\t\t\t\t:data-testid=\"field.input.testid || `cn-transition-input-template-${field.key}`\"\n\t\t\t\t\t@apply=\"applyTemplate(field, $event)\" />\n\n\t\t\t\t<!-- An input that declares its choices is picked from them. -->\n\t\t\t\t<NcSelect v-else-if=\"field.widget === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"field.options\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t:inputLabel=\"labelOf(field)\"\n\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t:data-testid=\"field.input.testid || `cn-transition-input-select-${field.key}`\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event && $event.value !== undefined ? $event.value : '')\" />\n\n\t\t\t\t<!-- An input that points at another record is picked, never typed. -->\n\t\t\t\t<div v-else-if=\"field.widget === 'reference'\" class=\"cn-transition-input__reference\">\n\t\t\t\t\t<label class=\"cn-transition-input__label\">{{ labelOf(field) }}</label>\n\t\t\t\t\t<CnResourceSelect\n\t\t\t\t\t\t:register=\"field.referenceRegister\"\n\t\t\t\t\t\t:schema=\"String(field.reference.schema)\"\n\t\t\t\t\t\t:labelField=\"(field.picker && field.picker.labelField) || field.reference.labelField || 'name'\"\n\t\t\t\t\t\t:filter=\"(field.picker && field.picker.filter) || {}\"\n\t\t\t\t\t\t:exclude=\"excludedIds(field)\"\n\t\t\t\t\t\t:allowCreate=\"false\"\n\t\t\t\t\t\t:preload=\"true\"\n\t\t\t\t\t\t:inputLabel=\"labelOf(field)\"\n\t\t\t\t\t\t:modelValue=\"String(modelValue[field.key] ?? '')\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-picker-${field.key}`\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- An object input: its sub-properties, one field at a time. -->\n\t\t\t\t<fieldset v-else-if=\"field.widget === 'object'\" class=\"cn-transition-input__object\">\n\t\t\t\t\t<legend>{{ labelOf(field) }}</legend>\n\t\t\t\t\t<div v-for=\"sub in field.subFields\"\n\t\t\t\t\t\t:key=\"sub.key\"\n\t\t\t\t\t\tclass=\"cn-transition-input__subfield\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}-${sub.key}`\">\n\t\t\t\t\t\t<NcTextArea v-if=\"sub.widget === 'textarea'\"\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"sub.widget === 'checkbox'\"\n\t\t\t\t\t\t\t:modelValue=\"subValue(field.key, sub.key) === true\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event === true)\">\n\t\t\t\t\t\t\t{{ subLabel(sub) }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:type=\"sub.widget === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<p v-if=\"isSubRefused(field.key, sub.key)\"\n\t\t\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}.${sub.key}`\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'This value was not accepted.') }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\n\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t:modelValue=\"modelValue[field.key] === true\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event === true)\">\n\t\t\t\t\t{{ labelOf(field) }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t<template v-else>\n\t\t\t\t\t<!-- A label drawn above the field, as a form board draws it,\n\t\t\t\t\t is tied to the field by its id. -->\n\t\t\t\t\t<label v-if=\"field.input.labelOutside === true\"\n\t\t\t\t\t\tclass=\"cn-transition-input-fields__label\"\n\t\t\t\t\t\t:for=\"inputId(field)\">{{ labelOf(field) }}</label>\n\t\t\t\t\t<NcTextArea v-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t\t:id=\"inputId(field)\"\n\t\t\t\t\t\t:modelValue=\"String(modelValue[field.key] ?? '')\"\n\t\t\t\t\t\t:label=\"labelOf(field)\"\n\t\t\t\t\t\t:labelOutside=\"field.input.labelOutside === true\"\n\t\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t\t:rows=\"field.input.rows || 4\"\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\tresize=\"vertical\"\n\t\t\t\t\t\t:data-testid=\"field.input.testid || null\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t:id=\"inputId(field)\"\n\t\t\t\t\t\t:modelValue=\"String(modelValue[field.key] ?? '')\"\n\t\t\t\t\t\t:type=\"textType(field)\"\n\t\t\t\t\t\t:label=\"labelOf(field)\"\n\t\t\t\t\t\t:labelOutside=\"field.input.labelOutside === true\"\n\t\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t\t:data-testid=\"field.input.testid || null\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t\t<span v-if=\"field.input.note\" class=\"cn-transition-input-fields__muted\">\n\t\t\t\t\t\t{{ field.input.note }}\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\n\t\t\t\t<p v-if=\"isRefused(field.key)\"\n\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}`\">\n\t\t\t\t\t{{ refusalFor(field) }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- A days input set as a date (`dateField`): today plus the days,\n\t\t\t and a chosen date sets the days. -->\n\t\t\t<div v-if=\"field.input.dateField\"\n\t\t\t\t:key=\"`${field.key}-date`\"\n\t\t\t\tclass=\"cn-transition-input-fields__field cn-transition-input-fields__wide\"\n\t\t\t\t:data-testid=\"field.input.dateField.testid || `cn-transition-input-date-${field.key}`\">\n\t\t\t\t<label class=\"cn-transition-input-fields__label\"\n\t\t\t\t\t:for=\"`${inputId(field)}-date`\">{{ dateFieldLabel(field) }}</label>\n\t\t\t\t<NcTextField :id=\"`${inputId(field)}-date`\"\n\t\t\t\t\t:modelValue=\"field.dateValue\"\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t:label=\"dateFieldLabel(field)\"\n\t\t\t\t\t:labelOutside=\"true\"\n\t\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, daysUntilIso($event))\" />\n\t\t\t\t<span v-if=\"field.input.dateField.note\" class=\"cn-transition-input-fields__muted\">\n\t\t\t\t\t{{ field.input.dateField.note }}\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t<!-- What the input means once filled in, such as the day a paused\n\t\t\t term comes back. Shown only once it can be worked out. -->\n\t\t\t<div v-if=\"field.previewText\"\n\t\t\t\t:key=\"`${field.key}-preview`\"\n\t\t\t\tclass=\"cn-transition-input-fields__preview cn-transition-input-fields__wide\"\n\t\t\t\t:data-testid=\"field.input.preview.testid || `cn-transition-input-preview-${field.key}`\">\n\t\t\t\t<span class=\"cn-transition-input-fields__label\">{{ field.input.preview.label }}</span>\n\t\t\t\t<span :data-testid=\"`${field.input.preview.testid || `cn-transition-input-preview-${field.key}`}-value`\">{{ field.previewText }}</span>\n\t\t\t\t<span v-if=\"field.input.preview.note\" class=\"cn-transition-input-fields__muted\">\n\t\t\t\t\t{{ field.input.preview.note }}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- A tinted box with the act's own icon (DqArchiveren \"Daarna alleen\n\t\t lezen\", a lock), drawn here rather than as a note card: a note\n\t\t card on the tinted card of a chosen act disappears into it. -->\n\t\t<div v-if=\"notice && notice.text\"\n\t\t\tclass=\"cn-transition-input-fields__notice cn-transition-input-fields__wide\"\n\t\t\t:class=\"`cn-transition-input-fields__notice--${notice.type || 'info'}`\"\n\t\t\trole=\"note\"\n\t\t\tdata-testid=\"cn-transition-input-fields-notice\">\n\t\t\t<CnIcon :name=\"notice.icon || 'InformationOutline'\" :size=\"20\" class=\"cn-transition-input-fields__notice-icon\" />\n\t\t\t<span class=\"cn-transition-input-fields__notice-text\">\n\t\t\t\t<strong v-if=\"notice.heading\">{{ notice.heading }}</strong>\n\t\t\t\t<span>{{ notice.text }}</span>\n\t\t\t</span>\n\t\t</div>\n\n\t\t<!-- A key the refusal names that this form never offered is not a\n\t\t field anybody can correct here. Saying so beats saying nothing:\n\t\t the request sent something the action does not accept. -->\n\t\t<p v-for=\"key in unofferedRefusals\"\n\t\t\t:key=\"`unoffered-${key}`\"\n\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t:data-testid=\"`cn-transition-input-error-${key}`\">\n\t\t\t{{ t('nextcloud-vue', 'This action does not accept the field \"{field}\".', { field: key }) }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcCheckboxRadioSwitch, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CnResourceSelect from '../CnResourceSelect/CnResourceSelect.vue'\nimport CnTemplateSelect from '../CnTemplateSelect/CnTemplateSelect.vue'\nimport { readPath } from '../../utils/readPath.js'\nimport { applyTemplateText, daysUntilIso, isInputFilled, resolveInputFields } from '../../utils/transitionInputs.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\nlet uid = 0\n\n/**\n * CnTransitionInputFields — the declared inputs of a transition or an act,\n * drawn wherever the host puts them.\n *\n * CnTransitionInputDialog draws them in their own dialog. A host that lists\n * several acts and opens the chosen one's inputs in place (under its card)\n * draws them with this component, so both read the same declarations and\n * decide the same way. The values are a `v-model` object keyed by field;\n * whether they are complete is `inputFieldsComplete(resolveInputFields(...))`.\n *\n * Next to the schema-resolved widgets an input may declare `widget` (`text`,\n * `textarea`, `number`, `date`, `select`, `template`), `optionsSource` (a dot\n * path into `context`), `other`, `helperFrom`, `preview`, `default` and\n * presentation keys; see `resolveInputFields` in `utils/transitionInputs.js`.\n *\n * ```vue\n * <CnTransitionInputFields\n * v-model=\"values\"\n * :inputs=\"act.inputs\"\n * :context=\"{ pauseReasons }\"\n * :columns=\"2\" />\n * ```\n *\n * @spec openspec/changes/dq-abstract-forms/specs/transition-inputs/spec.md\n */\nexport default {\n\tname: 'CnTransitionInputFields',\n\n\tcomponents: {\n\t\tCnIcon,\n\t\tCnResourceSelect,\n\t\tCnTemplateSelect,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSelect,\n\t\tNcTextArea,\n\t\tNcTextField,\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The declared inputs: `[{ field, required, label, widget, options,\n\t\t * optionsSource, optionValue, optionLabel, other, helperFrom, preview,\n\t\t * default, description, note, labelOutside, id, wide, testid, rows,\n\t\t * placeholder }]`, plus for a `template` input `url`, `schema`,\n\t\t * `params`, `mapOption` and `applyTo`.\n\t\t *\n\t\t * @type {Array<object>}\n\t\t */\n\t\tinputs: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The values, keyed by field.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The object's JSON Schema, which labels and types the inputs that\n\t\t * declare no widget of their own.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The record the action runs on: `picker.excludeSelf` leaves its id\n\t\t * out, and an object input is merged over its present value.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tcurrentObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Register slug the reference pickers look in when the schema property\n\t\t * names none of its own.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tregister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * What `optionsSource` and the summary paths read, such as the case\n\t\t * type's choices and the record shown in the summary.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontext: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The input keys a refusal named. Each one this form offers is marked\n\t\t * on its own field; each one it does not is reported as a key the\n\t\t * action does not accept.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tfieldErrors: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether the inputs are locked, such as while the action posts.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * 1 stacks the inputs; 2 sets them side by side, with `wide` inputs,\n\t\t * previews, the summary and the notice across both columns.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1,\n\t\t},\n\n\t\t/**\n\t\t * Whether a required input's label carries a ` *` marker.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tmarkRequired: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether an input that is not required says so, with ` (optional)`\n\t\t * after its label, as the boards mark them (DqVolgendeStap \"Dagen die\n\t\t * de aanvrager krijgt (niet verplicht)\").\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tmarkOptional: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * A read-only block above the inputs about what the action works on:\n\t\t * `{ when, card: { icon, title, meta: [], badge }, title, facts:\n\t\t * [{ label, path, fallback }], testid }`. `when`, `title`, `meta`,\n\t\t * `badge` and each fact's `path` are dot paths into `context`; the\n\t\t * block is shown only when `when` resolves.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tsummary: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * A note under the inputs: `{ type, heading, text, icon? }`. `type` is\n\t\t * info (the default), warning or error; `icon` names a CnIcon.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tnotice: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['update:modelValue'],\n\n\tdata() {\n\t\tuid += 1\n\t\treturn {\n\t\t\tuid,\n\t\t\t// The values with every change made since the host last passed\n\t\t\t// them in, so two changes in one tick both survive.\n\t\t\tlatest: { ...this.modelValue },\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Every declared input, resolved against the schema and the context. */\n\t\tfields() {\n\t\t\treturn resolveInputFields(this.inputs, {\n\t\t\t\tschema: this.schema,\n\t\t\t\tregister: this.register,\n\t\t\t\tcontext: this.context,\n\t\t\t\tvalues: this.modelValue,\n\t\t\t})\n\t\t},\n\n\t\t/** The inputs that are asked now. */\n\t\tshownFields() {\n\t\t\treturn this.fields.filter((field) => !field.hidden)\n\t\t},\n\n\t\t/** Whether the summary block shows. */\n\t\tsummaryShown() {\n\t\t\tif (!this.summary || typeof this.summary !== 'object') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn !this.summary.when || Boolean(readPath(this.context, this.summary.when))\n\t\t},\n\n\t\t/** The summary card's second line. */\n\t\tcardMeta() {\n\t\t\tconst meta = Array.isArray(this.summary?.card?.meta) ? this.summary.card.meta : []\n\t\t\treturn meta.map((path) => this.contextText(path)).filter(Boolean).join(' · ')\n\t\t},\n\n\t\t/** The refusal's field keys, normalised to strings. */\n\t\trefusedKeys() {\n\t\t\tif (!Array.isArray(this.fieldErrors)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.fieldErrors.filter((key) => typeof key === 'string' && key !== '')\n\t\t},\n\n\t\t/** The refused keys this form offers no field for. */\n\t\tunofferedRefusals() {\n\t\t\tconst offered = this.fields.map((field) => field.key)\n\t\t\treturn this.refusedKeys.filter((key) => !offered.includes(key))\n\t\t},\n\t},\n\n\twatch: {\n\t\tmodelValue(values) {\n\t\t\tthis.latest = { ...values }\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A context value as text, '' when absent.\n\t\t *\n\t\t * @param {string} path Dot path into the context.\n\t\t * @return {string}\n\t\t */\n\t\tcontextText(path) {\n\t\t\tif (!path) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst value = readPath(this.context, path)\n\t\t\treturn value === null || value === undefined ? '' : String(value)\n\t\t},\n\n\t\t/**\n\t\t * The test id of one part of the summary.\n\t\t *\n\t\t * @param {string} part `card` or `facts`.\n\t\t * @return {string}\n\t\t */\n\t\tsummaryTestid(part) {\n\t\t\treturn `${this.summary.testid || 'cn-transition-input-summary'}-${part}`\n\t\t},\n\n\t\t/**\n\t\t * The field's label, with the required or the optional marker when asked for.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tlabelOf(field) {\n\t\t\tif (this.markRequired && field.required) {\n\t\t\t\treturn `${field.label} *`\n\t\t\t}\n\t\t\treturn this.markOptional && !field.required ? `${field.label} (${t('nextcloud-vue', 'optional')})` : field.label\n\t\t},\n\n\t\t/**\n\t\t * The label of a days input's date field (`dateField`), with the\n\t\t * optional marker when asked for: the date is never required.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tdateFieldLabel(field) {\n\t\t\tconst label = String(field.input.dateField.label || '')\n\t\t\treturn this.markOptional ? `${label} (${t('nextcloud-vue', 'optional')})` : label\n\t\t},\n\n\t\t/**\n\t\t * The days a chosen date stands for.\n\t\t *\n\t\t * @param {string} iso The date input's value.\n\t\t * @return {string} The days, '' without a date.\n\t\t */\n\t\tdaysUntilIso(iso) {\n\t\t\treturn daysUntilIso(iso)\n\t\t},\n\n\t\t/**\n\t\t * Label of a sub-field, with the required marker.\n\t\t *\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tsubLabel(sub) {\n\t\t\treturn this.markRequired && sub.required ? `${sub.label} *` : sub.label\n\t\t},\n\n\t\t/**\n\t\t * The element id of a text input: the declared one, or one unique to\n\t\t * this form.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tinputId(field) {\n\t\t\treturn field.input.id || `cn-transition-input-${this.uid}-${field.key}`\n\t\t},\n\n\t\t/**\n\t\t * The native input type of a one-line input.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\ttextType(field) {\n\t\t\treturn field.widget === 'number' || field.widget === 'date' ? field.widget : 'text'\n\t\t},\n\n\t\t/**\n\t\t * The option a picker currently holds, or null.\n\t\t *\n\t\t * @param {object} field The select descriptor.\n\t\t * @return {{value: string, label: string}|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\tconst value = this.modelValue[field.key]\n\t\t\treturn field.options.find((option) => option.value === String(value ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Ids a reference picker must not offer: the current record, when the\n\t\t * input's `picker.excludeSelf` says so.\n\t\t *\n\t\t * @param {object} field The reference descriptor.\n\t\t * @return {string[]}\n\t\t */\n\t\texcludedIds(field) {\n\t\t\tif (!field.picker || field.picker.excludeSelf !== true || !this.currentObject) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst self = this.currentObject\n\t\t\treturn [self.id, self.uuid, self['@self'] && self['@self'].id].filter((id) => id !== undefined && id !== null).map(String)\n\t\t},\n\n\t\t/**\n\t\t * Whether the refusal named this field.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRefused(key) {\n\t\t\treturn this.refusedKeys.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * What to say beside a refused field. An empty one is a missing input;\n\t\t * a filled one was refused for what is in it. The kind is decided here\n\t\t * rather than read out of the refusal's sentence, which may be reworded.\n\t\t *\n\t\t * @param {object} field The descriptor.\n\t\t * @return {string}\n\t\t */\n\t\trefusalFor(field) {\n\t\t\treturn isInputFilled(field, this.modelValue)\n\t\t\t\t? t('nextcloud-vue', 'This value was not accepted.')\n\t\t\t\t: t('nextcloud-vue', 'This field is required.')\n\t\t},\n\n\t\t/**\n\t\t * Whether a refusal named `<input>.<sub>`.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubRefused(key, sub) {\n\t\t\treturn this.refusedKeys.includes(`${key}.${sub}`)\n\t\t},\n\n\t\t/**\n\t\t * A typed sub-value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {unknown}\n\t\t */\n\t\tsubValue(key, sub) {\n\t\t\tconst group = this.modelValue[key]\n\t\t\treturn group && typeof group === 'object' ? group[sub] : undefined\n\t\t},\n\n\t\t/**\n\t\t * Store one sub-value, keeping the rest of the object input's values.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetSubValue(key, sub, value) {\n\t\t\tconst group = this.latest[key] && typeof this.latest[key] === 'object' ? this.latest[key] : {}\n\t\t\tthis.setValue(key, { ...group, [sub]: value })\n\t\t},\n\n\t\t/**\n\t\t * Store one input's value.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetValue(key, value) {\n\t\t\tthis.latest = { ...this.latest, [key]: value }\n\t\t\t/**\n\t\t\t * @event update:modelValue The values with this one changed.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('update:modelValue', this.latest)\n\t\t},\n\n\t\t/**\n\t\t * Put a chosen template's text into the input it fills, unless that\n\t\t * input already holds text.\n\t\t *\n\t\t * @param {object} field The template descriptor.\n\t\t * @param {object|null} option The chosen template.\n\t\t */\n\t\tapplyTemplate(field, option) {\n\t\t\tconst next = applyTemplateText(this.latest, field.input.applyTo, option)\n\t\t\tif (next !== this.latest) {\n\t\t\t\tthis.latest = next\n\t\t\t\t/** @event update:modelValue The values with the template's text filled in. */\n\t\t\t\tthis.$emit('update:modelValue', next)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-transition-input-fields {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n}\n\n.cn-transition-input-fields--columns {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\talign-items: start;\n}\n\n.cn-transition-input-fields--columns .cn-transition-input-fields__wide {\n\tgrid-column: 1 / -1;\n}\n\n.cn-transition-input__field,\n.cn-transition-input-fields__preview {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-transition-input__label {\n\tdisplay: block;\n\tmargin-bottom: 4px;\n}\n\n.cn-transition-input-fields__label {\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__muted {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-transition-input__field-error {\n\tmargin: 4px 0 0;\n\tfont-size: 0.9em;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__field--refused {\n\tborder-inline-start: 2px solid var(--color-error);\n\tpadding-inline-start: 8px;\n}\n\n.cn-transition-input__object {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\tpadding: 8px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-transition-input-fields__card {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 14px;\n\tpadding: 14px 16px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-transition-input-fields__card-icon {\n\tcolor: var(--color-primary-element);\n}\n\n.cn-transition-input-fields__card-text {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-transition-input-fields__badge {\n\tpadding: 3px 10px;\n\tborder-radius: 12px;\n\tbackground: var(--color-success-light, var(--color-background-dark));\n\tcolor: var(--color-success-text);\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__section-title {\n\tmargin: 0 0 8px;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: 0 24px;\n\tmargin: 0;\n}\n\n.cn-transition-input-fields__facts > div {\n\tpadding: 10px 0;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-transition-input-fields__facts dt,\n.cn-transition-input-fields__facts dd {\n\tdisplay: block;\n\twidth: auto;\n\tpadding: 0;\n\ttext-align: start;\n\twhite-space: normal;\n}\n\n.cn-transition-input-fields__facts dt {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-transition-input-fields__facts dd {\n\tmargin: 2px 0 0;\n\tfont-size: 15px;\n\tfont-weight: 600;\n}\n\n.cn-transition-input-fields__notice {\n\tdisplay: flex;\n\tgap: 12px;\n\talign-items: flex-start;\n\tpadding: 14px 16px;\n\tborder-radius: var(--border-radius-large, 8px);\n\tbackground: var(--color-primary-element-light);\n\tcolor: var(--color-main-text);\n}\n\n.cn-transition-input-fields__notice--warning {\n\tbackground: var(--color-warning-element-light, var(--color-background-dark));\n}\n\n.cn-transition-input-fields__notice--error {\n\tbackground: var(--color-error-element-light, var(--color-background-dark));\n}\n\n.cn-transition-input-fields__notice-icon {\n\tflex: none;\n\tcolor: var(--color-primary-element-light-text, var(--color-primary-element));\n}\n\n.cn-transition-input-fields__notice-text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n.cn-transition-input-fields__notice-text strong {\n\tcolor: var(--color-primary-element-light-text, var(--color-main-text));\n}\n</style>\n"],"names":["_normalizeClass","_createElementBlock","_Fragment","_openBlock","_createBlock","_resolveDynamicComponent","_createElementVNode","_toDisplayString","_renderList","_createTextVNode","_createVNode"],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { translate, getCanonicalLocale } from '@nextcloud/l10n';
|
|
2
2
|
import { generateUrl, generateOcsUrl } from '@nextcloud/router';
|
|
3
3
|
import { reactive } from 'vue';
|
|
4
|
+
import AccountOutline from 'vue-material-design-icons/AccountOutline.vue';
|
|
4
5
|
import CalendarClock from 'vue-material-design-icons/CalendarClock.vue';
|
|
5
6
|
import Cancel from 'vue-material-design-icons/Cancel.vue';
|
|
6
7
|
import Check from 'vue-material-design-icons/Check.vue';
|
|
8
|
+
import EmailOutline from 'vue-material-design-icons/EmailOutline.vue';
|
|
7
9
|
import HandBackRight from 'vue-material-design-icons/HandBackRight.vue';
|
|
8
10
|
import LightningBolt from 'vue-material-design-icons/LightningBolt.vue';
|
|
9
11
|
import Pencil from 'vue-material-design-icons/Pencil.vue';
|
|
@@ -14,6 +16,7 @@ import { fillTemplate } from '../utils/fillTemplate.js';
|
|
|
14
16
|
import { flowRunStatuses, FLOW_RUN_ERROR_STATUSES } from '../utils/flowRunStatus.js';
|
|
15
17
|
import { fetchUsers, fetchGroupMembers, fetchStatuses, fetchPresence } from '../utils/nextcloudDirectory.js';
|
|
16
18
|
import { readPath } from '../utils/readPath.js';
|
|
19
|
+
import { resolveNextcloudUser } from '../utils/userAutocomplete.js';
|
|
17
20
|
import { useFlowStore } from './useFlowStore.js';
|
|
18
21
|
import { useOrganisationStore, organisationRecord } from './useOrganisationStore.js';
|
|
19
22
|
import { useTaskInboxStore } from './useTaskInboxStore.js';
|
|
@@ -700,12 +703,15 @@ function tasksSource() {
|
|
|
700
703
|
*
|
|
701
704
|
* @param {string} key The column key.
|
|
702
705
|
* @param {string} order `asc` or `desc`.
|
|
703
|
-
*
|
|
706
|
+
* Open tasks come before finished ones (`openFirst`), each in that order.
|
|
707
|
+
*
|
|
708
|
+
* @return {{sort: string, openFirst: boolean}|null} The parameters, or null for a column the inbox cannot sort by.
|
|
704
709
|
* @spec openspec/changes/tasks-source-sorts-on-server/specs/index-sources/spec.md#requirement-a-named-source-can-sort-on-the-server
|
|
710
|
+
* @spec openspec/changes/tasks-source-open-first/specs/index-sources/spec.md#requirement-a-sorted-task-list-puts-open-tasks-first
|
|
705
711
|
*/
|
|
706
712
|
sortParam: (key, order) => {
|
|
707
713
|
const field = TASK_SORT_FIELDS[key];
|
|
708
|
-
return field ? { sort: (order === 'desc' ? '-' : '') + field } : null
|
|
714
|
+
return field ? { sort: (order === 'desc' ? '-' : '') + field, openFirst: true } : null
|
|
709
715
|
},
|
|
710
716
|
|
|
711
717
|
// The scope tabs. Each tab's filter is merged over the page's
|
|
@@ -1089,7 +1095,7 @@ function fillRowTemplate(template, row) {
|
|
|
1089
1095
|
* and its count (DqZoekresultaten).
|
|
1090
1096
|
*
|
|
1091
1097
|
* `sourceConfig.kinds` lists what is searched:
|
|
1092
|
-
* `{ id, label, register, schema, titleField?, subtitleField?, subtitleTemplate?, statusField?, statusResolve?, linkedField?, linkedTemplate?, href?, limit? }`
|
|
1098
|
+
* `{ id, label, register, schema, titleField?, subtitleField?, subtitleTemplate?, statusField?, statusResolve?, linkedField?, linkedTemplate?, linkedUser?, href?, limit? }`
|
|
1093
1099
|
* for objects (OpenRegister's `_search`, so the reader sees what they may
|
|
1094
1100
|
* read), or `{ id, label, files: true, limit? }` for the reader's files
|
|
1095
1101
|
* (Nextcloud's unified search). The term is `sourceConfig.term`, else the
|
|
@@ -1105,6 +1111,8 @@ function fillRowTemplate(template, row) {
|
|
|
1105
1111
|
* column, drawn when a kind declares one; `sourceConfig.linkedLabel` names it.
|
|
1106
1112
|
* `subtitleTemplate` ("Case {identifier}", translated) fills the line under a
|
|
1107
1113
|
* result, else `subtitleField`.
|
|
1114
|
+
* `linkedUser: true` reads that value as a user id and shows the user's
|
|
1115
|
+
* display name. `sourceConfig.columnWidths` sets a width per column key.
|
|
1108
1116
|
* The page's title and count line can name the term as `{term}`, and the
|
|
1109
1117
|
* count is the active kind's total. Kind, link and status are filterable.
|
|
1110
1118
|
*
|
|
@@ -1114,6 +1122,23 @@ function fillRowTemplate(template, row) {
|
|
|
1114
1122
|
* @return {object} The source adapter.
|
|
1115
1123
|
* @spec openspec/changes/index-search-source/specs/index-page/spec.md#requirement-an-index-page-can-search-several-schemas-and-files
|
|
1116
1124
|
*/
|
|
1125
|
+
/**
|
|
1126
|
+
* Columns with the widths a page names per column key
|
|
1127
|
+
* (`sourceConfig.columnWidths`, `{ title: '250px' }`); a column it does not
|
|
1128
|
+
* name keeps none.
|
|
1129
|
+
*
|
|
1130
|
+
* @param {Array<object>} columns The columns.
|
|
1131
|
+
* @param {object|undefined} widths The widths by key.
|
|
1132
|
+
* @return {Array<object>} The columns.
|
|
1133
|
+
* @spec openspec/changes/search-linked-user-and-widths/specs/search-linked-user-and-widths/spec.md
|
|
1134
|
+
*/
|
|
1135
|
+
function withColumnWidths(columns, widths) {
|
|
1136
|
+
if (!widths || typeof widths !== 'object') {
|
|
1137
|
+
return columns
|
|
1138
|
+
}
|
|
1139
|
+
return columns.map((col) => (typeof widths[col.key] === 'string' && widths[col.key] !== '' ? { ...col, width: widths[col.key] } : col))
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1117
1142
|
function searchSource(config = {}, context = {}) {
|
|
1118
1143
|
const translate$1 = typeof context.translate === 'function' ? context.translate : (text) => text;
|
|
1119
1144
|
const kinds = (Array.isArray(config && config.kinds) ? config.kinds : [])
|
|
@@ -1209,12 +1234,20 @@ function searchSource(config = {}, context = {}) {
|
|
|
1209
1234
|
return kind.subtitleField ? String(readPath(object, kind.subtitleField) ?? '') : ''
|
|
1210
1235
|
};
|
|
1211
1236
|
|
|
1237
|
+
// `linkedUser`: the Linked cell holds a user id; name the user instead.
|
|
1238
|
+
const linkedUserNames = async (kind, objects) => {
|
|
1239
|
+
const ids = [...new Set(objects.map((object) => linkedOf(kind, object)).filter((id) => id !== ''))];
|
|
1240
|
+
const options = await Promise.all(ids.map((id) => resolveNextcloudUser(id).catch(() => null)));
|
|
1241
|
+
return new Map(ids.map((id, index) => [id, (options[index] && options[index].label) || id]))
|
|
1242
|
+
};
|
|
1243
|
+
|
|
1212
1244
|
const searchObjects = async (axios, kind, term) => {
|
|
1213
1245
|
const url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: kind.register, schema: kind.schema });
|
|
1214
1246
|
const res = await axios.get(url, { params: { _search: term, _limit: kind.limit || 20 } });
|
|
1215
1247
|
const body = (res && res.data) || {};
|
|
1216
1248
|
const results = Array.isArray(body.results) ? body.results : (Array.isArray(body) ? body : []);
|
|
1217
1249
|
const labels = kind.statusResolve && kind.statusField ? await statusLabels(kind) : null;
|
|
1250
|
+
const userNames = kind.linkedUser === true ? await linkedUserNames(kind, results) : null;
|
|
1218
1251
|
return {
|
|
1219
1252
|
total: typeof body.total === 'number' ? body.total : results.length,
|
|
1220
1253
|
rows: results.map((object) => {
|
|
@@ -1231,7 +1264,7 @@ function searchSource(config = {}, context = {}) {
|
|
|
1231
1264
|
title: String(readPath(object, kind.titleField || 'title') ?? object.name ?? id ?? ''),
|
|
1232
1265
|
subtitle: subtitleOf(kind, object),
|
|
1233
1266
|
status,
|
|
1234
|
-
linked: linkedOf(kind, object),
|
|
1267
|
+
linked: userNames ? (userNames.get(linkedOf(kind, object)) || linkedOf(kind, object)) : linkedOf(kind, object),
|
|
1235
1268
|
href: kind.href ? generateUrl(fillRowTemplate(kind.href, { ...object, id })) : '',
|
|
1236
1269
|
object,
|
|
1237
1270
|
}
|
|
@@ -1339,7 +1372,7 @@ function searchSource(config = {}, context = {}) {
|
|
|
1339
1372
|
*/
|
|
1340
1373
|
loading: () => state.loading,
|
|
1341
1374
|
|
|
1342
|
-
columns: [
|
|
1375
|
+
columns: withColumnWidths([
|
|
1343
1376
|
{ key: 'title', label: translate('nextcloud-vue', 'Result'), secondary: 'subtitle', sortable: true },
|
|
1344
1377
|
// `kindAsText`: what one row is, as plain text ("Zaak", "Lantaarnpaal",
|
|
1345
1378
|
// DqZoekresultaten), instead of the plural kind as a pill.
|
|
@@ -1354,7 +1387,7 @@ function searchSource(config = {}, context = {}) {
|
|
|
1354
1387
|
widgetProps: { colorMap: (config && config.statusColorMap) || {} },
|
|
1355
1388
|
sortable: true,
|
|
1356
1389
|
},
|
|
1357
|
-
],
|
|
1390
|
+
], config && config.columnWidths),
|
|
1358
1391
|
|
|
1359
1392
|
/**
|
|
1360
1393
|
* Every column header carries a filter button (DqZoekresultaten); the
|
|
@@ -1604,6 +1637,15 @@ function usersSource() {
|
|
|
1604
1637
|
/** A filter button on every head (DqAfdelingen); the members read are narrowed here. */
|
|
1605
1638
|
headerFilters: true,
|
|
1606
1639
|
|
|
1640
|
+
/**
|
|
1641
|
+
* A member's row menu (DqAfdelingen): their Nextcloud profile, and an
|
|
1642
|
+
* e-mail when they have an address. Both are links.
|
|
1643
|
+
*/
|
|
1644
|
+
rowActions: [
|
|
1645
|
+
{ id: 'open-profile', label: translate('nextcloud-vue', 'Open profile'), icon: AccountOutline, href: (row) => generateUrl(`/u/${encodeURIComponent(row.id)}`) },
|
|
1646
|
+
{ id: 'send-email', label: translate('nextcloud-vue', 'Send email'), icon: EmailOutline, href: (row) => `mailto:${row.email}`, visible: (row) => Boolean(row && row.email) },
|
|
1647
|
+
],
|
|
1648
|
+
|
|
1607
1649
|
showAdd: false,
|
|
1608
1650
|
}
|
|
1609
1651
|
}
|