@conduction/nextcloud-vue 2.124.0 → 2.125.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 +120 -11
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +78 -32
- package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +8 -7
- 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/CnAssignDialog/CnAssignDialog.vue.js +1 -1
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js +2 -1
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue3.js +2 -2
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnDialog/CnDialog.vue2.js +5 -0
- package/dist/esm/components/CnDialog/CnDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnDialog/CnDialog.vue3.js +1 -1
- package/dist/esm/components/CnDialog/CnDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +13 -0
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +7 -2
- 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/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +159 -10
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +151 -90
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +12 -0
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js +1 -1
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js +39 -68
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js +70 -116
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +19 -3
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +8 -8
- package/dist/esm/l10n/nl.json.js +8 -8
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +316 -185
- package/dist/nextcloud-vue.cjs.js +1149 -808
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +316 -185
- package/l10n/en.json +8 -8
- package/l10n/nl.json +8 -8
- package/package.json +1 -1
- package/src/components/CnActionDialog/CnActionDialog.vue +173 -14
- package/src/components/CnAppRoot/CnAppRoot.vue +8 -7
- package/src/components/CnAssignDialog/CnAssignDialog.vue +4 -3
- package/src/components/CnDialog/CnDialog.vue +6 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +14 -0
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +7 -2
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +237 -23
- package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +13 -1
- package/src/components/CnUserSettingsDialog/CnUserSettingsDialog.vue +147 -145
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +19 -3
- package/src/css/dialog.css +23 -0
- package/src/css/look-board-index.css +5 -1
- package/src/css/look-board.css +19 -0
|
@@ -2,7 +2,7 @@ import script from './CnActionDialog.vue2.js';
|
|
|
2
2
|
import { render } from './CnActionDialog.vue3.js';
|
|
3
3
|
|
|
4
4
|
script.render = render;
|
|
5
|
-
script.__scopeId = "data-v-
|
|
5
|
+
script.__scopeId = "data-v-feabd086";
|
|
6
6
|
const __sfc_main = script;
|
|
7
7
|
|
|
8
8
|
export { __sfc_main as default };
|
|
@@ -2,7 +2,7 @@ import axios__default from '@nextcloud/axios';
|
|
|
2
2
|
import { emit } from '@nextcloud/event-bus';
|
|
3
3
|
import { translate } from '@nextcloud/l10n';
|
|
4
4
|
import { generateUrl } from '@nextcloud/router';
|
|
5
|
-
import { NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue';
|
|
5
|
+
import { NcButton, NcCheckboxRadioSwitch, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue';
|
|
6
6
|
import CheckCircle from 'vue-material-design-icons/CheckCircle.vue';
|
|
7
7
|
import CircleOutline from 'vue-material-design-icons/CircleOutline.vue';
|
|
8
8
|
import HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue';
|
|
@@ -11,8 +11,12 @@ import { fillTemplate } from '../../utils/fillTemplate.js';
|
|
|
11
11
|
import { readPath } from '../../utils/readPath.js';
|
|
12
12
|
import __sfc_main from '../CnDialog/CnDialog.vue.js';
|
|
13
13
|
import __sfc_main$1 from '../CnIcon/CnIcon.vue.js';
|
|
14
|
+
import __sfc_main$2 from '../CnSearchSelect/CnSearchSelect.vue.js';
|
|
14
15
|
import { interpolateUrlTokens } from '../../utils/interpolateUrlTokens.js';
|
|
15
16
|
|
|
17
|
+
/** How long typing rests before a search field searches, in ms. */
|
|
18
|
+
const SEARCH_DELAY = 250;
|
|
19
|
+
|
|
16
20
|
/** The page refresh channel the built-in widgets listen on. */
|
|
17
21
|
const PAGE_REFRESH = 'cn:page:refresh';
|
|
18
22
|
|
|
@@ -41,10 +45,17 @@ let reasonSeq = 0;
|
|
|
41
45
|
* the action runs only while `allowedPath` reads true; `reasonPath` says
|
|
42
46
|
* why not. With `listPath` the paths read the entry of that list whose
|
|
43
47
|
* fields equal `match` (`{ act: "archive" }`).
|
|
44
|
-
* - `fields`: `[{ field, type?: "text"|"date"|"datetime"|"select", label?,
|
|
45
|
-
* required?, options?: [{ value, label, fills? }] }]`: inputs
|
|
46
|
-
* the reason, required by default; a select option's `fills`
|
|
47
|
-
* fields that are still empty.
|
|
48
|
+
* - `fields`: `[{ field, type?: "text"|"date"|"datetime"|"select"|"checkbox", label?,
|
|
49
|
+
* required?, options?: [{ value, label, fills? }], hint?, default? }]`: inputs
|
|
50
|
+
* sent beside the reason, required by default; a select option's `fills`
|
|
51
|
+
* sets other fields that are still empty. A `checkbox` is sent as a boolean,
|
|
52
|
+
* starts at `default` (false), fills its `label` and `hint` from the record,
|
|
53
|
+
* and is optional unless `required: true` (then it must be ticked). A
|
|
54
|
+
* `search` field finds records of `source: { register, schema }` as the
|
|
55
|
+
* reader types, shows each as `optionLabel` with `optionSecondary` under
|
|
56
|
+
* it (templates on the found record), leaves the record in hand out with
|
|
57
|
+
* `excludeSelf`, and sends the chosen record's id. Every field's `label`,
|
|
58
|
+
* `hint` and `placeholder` are templates filled from the record.
|
|
48
59
|
* - `reason`: `{ label?, hint?, required?, field?, rows? }`: a text area; required by
|
|
49
60
|
* default; sent as `field` (default `reason`). `rows` is its height in lines
|
|
50
61
|
* (default 2; board DqBesluit draws 4).
|
|
@@ -58,7 +69,7 @@ let reasonSeq = 0;
|
|
|
58
69
|
var script = {
|
|
59
70
|
name: 'CnActionDialog',
|
|
60
71
|
|
|
61
|
-
components: { CheckCircle, CircleOutline, CnDialog: __sfc_main, CnIcon: __sfc_main$1, HelpCircleOutline, NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField },
|
|
72
|
+
components: { CheckCircle, CircleOutline, CnDialog: __sfc_main, CnIcon: __sfc_main$1, CnSearchSelect: __sfc_main$2, HelpCircleOutline, NcButton, NcCheckboxRadioSwitch, NcNoteCard, NcSelect, NcTextArea, NcTextField },
|
|
62
73
|
|
|
63
74
|
inject: {
|
|
64
75
|
/** The host app's translate (CnAppRoot `cnTranslate`). */
|
|
@@ -105,6 +116,10 @@ var script = {
|
|
|
105
116
|
allowed: true,
|
|
106
117
|
reason: '',
|
|
107
118
|
values: {},
|
|
119
|
+
/** A search field's found options, by field name. */
|
|
120
|
+
searchOptions: {},
|
|
121
|
+
/** The search field whose search runs, or ''. */
|
|
122
|
+
searching: '',
|
|
108
123
|
busy: false,
|
|
109
124
|
refusal: '',
|
|
110
125
|
done: false,
|
|
@@ -223,6 +238,20 @@ var script = {
|
|
|
223
238
|
return this.record ? this.fill(this.config.eyebrow) || this.text(this.config.eyebrow) : this.text(this.config.eyebrow)
|
|
224
239
|
},
|
|
225
240
|
|
|
241
|
+
/**
|
|
242
|
+
* The value of every field as sent: a checkbox as a boolean, the
|
|
243
|
+
* others as entered ('' when empty).
|
|
244
|
+
*
|
|
245
|
+
* @return {object} Values by field name.
|
|
246
|
+
*/
|
|
247
|
+
fieldValues() {
|
|
248
|
+
const out = { ...this.values };
|
|
249
|
+
for (const field of this.fields) {
|
|
250
|
+
out[field.field] = field.type === 'checkbox' ? this.checkboxValue(field) : (this.values[field.field] ?? '');
|
|
251
|
+
}
|
|
252
|
+
return out
|
|
253
|
+
},
|
|
254
|
+
|
|
226
255
|
/** @return {Array<object>} The fields with a name. */
|
|
227
256
|
fields() {
|
|
228
257
|
return (Array.isArray(this.config.fields) ? this.config.fields : []).filter((f) => f && f.field)
|
|
@@ -235,7 +264,12 @@ var script = {
|
|
|
235
264
|
* @return {boolean}
|
|
236
265
|
*/
|
|
237
266
|
fieldsFilled() {
|
|
238
|
-
return this.fields.every((f) =>
|
|
267
|
+
return this.fields.every((f) => {
|
|
268
|
+
if (f.type === 'checkbox') {
|
|
269
|
+
return f.required !== true || this.checkboxValue(f)
|
|
270
|
+
}
|
|
271
|
+
return f.required === false || this.secretStored(f) || String(this.values[f.field] ?? '').trim() !== ''
|
|
272
|
+
})
|
|
239
273
|
},
|
|
240
274
|
},
|
|
241
275
|
|
|
@@ -253,6 +287,10 @@ var script = {
|
|
|
253
287
|
await Promise.all([this.loadRecord(), this.loadChecklist(), this.loadPermission()]);
|
|
254
288
|
},
|
|
255
289
|
|
|
290
|
+
beforeUnmount() {
|
|
291
|
+
clearTimeout(this.searchTimer);
|
|
292
|
+
},
|
|
293
|
+
|
|
256
294
|
methods: {
|
|
257
295
|
t: translate,
|
|
258
296
|
|
|
@@ -262,6 +300,76 @@ var script = {
|
|
|
262
300
|
* @param {unknown} value The text.
|
|
263
301
|
* @return {string}
|
|
264
302
|
*/
|
|
303
|
+
/**
|
|
304
|
+
* Search a search field's records once typing rests.
|
|
305
|
+
*
|
|
306
|
+
* @param {object} field The field.
|
|
307
|
+
* @param {string} typed What the reader typed.
|
|
308
|
+
* @return {void}
|
|
309
|
+
* @spec openspec/changes/action-dialog-search-field/specs/action-dialog-search-field/spec.md#requirement-an-action-dialog-field-can-search-records
|
|
310
|
+
*/
|
|
311
|
+
onSearch(field, typed) {
|
|
312
|
+
clearTimeout(this.searchTimer);
|
|
313
|
+
this.searchTimer = setTimeout(() => this.searchRecords(field, String(typed || '').trim()), SEARCH_DELAY);
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Read the records of a search field's `source` that match the term.
|
|
318
|
+
*
|
|
319
|
+
* @param {object} field The field.
|
|
320
|
+
* @param {string} term The term.
|
|
321
|
+
* @return {Promise<void>}
|
|
322
|
+
*/
|
|
323
|
+
async searchRecords(field, term) {
|
|
324
|
+
const source = field.source || {};
|
|
325
|
+
if (!term || !source.register || !source.schema) {
|
|
326
|
+
this.searchOptions = { ...this.searchOptions, [field.field]: [] };
|
|
327
|
+
return
|
|
328
|
+
}
|
|
329
|
+
this.searching = field.field;
|
|
330
|
+
try {
|
|
331
|
+
const url = generateUrl(`/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}`);
|
|
332
|
+
const { data } = await axios__default.get(url, { params: { _search: term, _limit: 10 } });
|
|
333
|
+
const rows = Array.isArray(data) ? data : (data && Array.isArray(data.results) ? data.results : []);
|
|
334
|
+
const self = String(this.recordId || '');
|
|
335
|
+
const options = rows
|
|
336
|
+
.map((row) => ({ row, id: String(row.id || (row['@self'] && row['@self'].id) || '') }))
|
|
337
|
+
.filter(({ id }) => id !== '' && !(field.excludeSelf && id === self))
|
|
338
|
+
.map(({ row, id }) => {
|
|
339
|
+
const option = { id, label: this.fill(field.optionLabel || '{title}', row) || id };
|
|
340
|
+
const secondary = this.fill(field.optionSecondary, row);
|
|
341
|
+
return secondary ? { ...option, secondary } : option
|
|
342
|
+
});
|
|
343
|
+
this.searchOptions = { ...this.searchOptions, [field.field]: options };
|
|
344
|
+
} catch {
|
|
345
|
+
this.searchOptions = { ...this.searchOptions, [field.field]: [] };
|
|
346
|
+
} finally {
|
|
347
|
+
this.searching = '';
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* A checkbox field's state: what was ticked, else its `default`.
|
|
353
|
+
*
|
|
354
|
+
* @param {object} field The field.
|
|
355
|
+
* @return {boolean}
|
|
356
|
+
* @spec openspec/changes/action-dialog-checkbox-field/specs/action-dialog-checkbox-field/spec.md#requirement-an-action-dialog-field-can-be-a-checkbox
|
|
357
|
+
*/
|
|
358
|
+
checkboxValue(field) {
|
|
359
|
+
return field.field in this.values ? this.values[field.field] === true : field.default === true
|
|
360
|
+
},
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Tick or untick a checkbox field.
|
|
364
|
+
*
|
|
365
|
+
* @param {string} name The field.
|
|
366
|
+
* @param {boolean} on Ticked.
|
|
367
|
+
* @return {void}
|
|
368
|
+
*/
|
|
369
|
+
setChecked(name, on) {
|
|
370
|
+
this.values = { ...this.values, [name]: on === true };
|
|
371
|
+
},
|
|
372
|
+
|
|
265
373
|
text(value) {
|
|
266
374
|
return typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''
|
|
267
375
|
},
|
|
@@ -418,21 +526,22 @@ var script = {
|
|
|
418
526
|
if (this.config.reason) {
|
|
419
527
|
body[this.config.reason.field || 'reason'] = reason;
|
|
420
528
|
}
|
|
529
|
+
const values = { ...this.fieldValues };
|
|
421
530
|
for (const field of this.fields) {
|
|
422
531
|
if (field.type === 'secret' && String(this.values[field.field] ?? '') === '') {
|
|
423
|
-
|
|
532
|
+
delete values[field.field];
|
|
424
533
|
}
|
|
425
|
-
body[field.field] = this.values[field.field] ?? '';
|
|
426
534
|
}
|
|
535
|
+
Object.assign(body, values);
|
|
427
536
|
const method = String(request.method || 'POST').toLowerCase();
|
|
428
537
|
await axios__default[['post', 'put', 'patch', 'delete'].includes(method) ? method : 'post'](/^https?:\/\//i.test(url) ? url : generateUrl(url), body);
|
|
429
538
|
} else if (this.confirmConfig.action && typeof this.cnDispatchAction === 'function') {
|
|
430
|
-
await this.cnDispatchAction({ ...this.confirmConfig.action, args: [...(this.confirmConfig.action.args || []), { ...this.
|
|
539
|
+
await this.cnDispatchAction({ ...this.confirmConfig.action, args: [...(this.confirmConfig.action.args || []), { ...this.fieldValues, reason }] });
|
|
431
540
|
}
|
|
432
541
|
this.done = true;
|
|
433
542
|
emit(PAGE_REFRESH, {});
|
|
434
543
|
/** @event done The action ran. Payload: the field values and `reason`. */
|
|
435
|
-
this.$emit('done', { ...this.
|
|
544
|
+
this.$emit('done', { ...this.fieldValues, reason });
|
|
436
545
|
} catch (failure) {
|
|
437
546
|
const data = failure && failure.response && failure.response.data;
|
|
438
547
|
this.refusal = String((data && (data.message || data.error)) || translate('nextcloud-vue', 'The action could not be completed.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnActionDialog.vue2.js","sources":["../../../../src/components/CnActionDialog/CnActionDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:name=\"text(config.title) || t('nextcloud-vue', 'Confirm')\"\n\t\t:eyebrow=\"eyebrowText\"\n\t\t:subtitle=\"text(config.subtitle)\"\n\t\twidth=\"form\"\n\t\t:noClose=\"busy\"\n\t\tdata-testid=\"cn-action-dialog\"\n\t\t@closing=\"close\">\n\t\t<div v-if=\"!done\" class=\"cn-action-dialog\">\n\t\t\t<!-- The record the action is about: its title, a meta line, a badge. -->\n\t\t\t<div v-if=\"summary\" class=\"cn-action-dialog__summary\" data-testid=\"cn-action-dialog-summary\">\n\t\t\t\t<CnIcon :name=\"config.summary.icon || 'FolderOutline'\" :size=\"20\" class=\"cn-action-dialog__summary-icon\" />\n\t\t\t\t<span class=\"cn-action-dialog__summary-text\">\n\t\t\t\t\t<strong>{{ summary.title }}</strong>\n\t\t\t\t\t<span v-if=\"summary.meta\" class=\"cn-action-dialog__muted\">{{ summary.meta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<span v-if=\"summary.badge\" class=\"cn-action-dialog__badge\">{{ summary.badge }}</span>\n\t\t\t</div>\n\n\t\t\t<!-- Facts about the record, in titled groups (\"Retention under the case type\"). -->\n\t\t\t<section v-for=\"(section, index) in factSections\"\n\t\t\t\t:key=\"`facts-${index}`\"\n\t\t\t\tclass=\"cn-action-dialog__section\"\n\t\t\t\tdata-testid=\"cn-action-dialog-facts\">\n\t\t\t\t<h3 v-if=\"section.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ section.title }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-action-dialog__facts\">\n\t\t\t\t\t<div v-for=\"fact in section.facts\" :key=\"fact.label\" class=\"cn-action-dialog__fact\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ fact.value }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t</section>\n\n\t\t\t<!-- The checklist, read from an endpoint: each item met, not met or\n\t\t\t unknown. Items named in `required` decide whether the action may\n\t\t\t run; the others inform. -->\n\t\t\t<section v-if=\"config.checklist\" class=\"cn-action-dialog__section\" data-testid=\"cn-action-dialog-checklist\">\n\t\t\t\t<h3 v-if=\"config.checklist.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ text(config.checklist.title) }}\n\t\t\t\t</h3>\n\t\t\t\t<p v-if=\"checklistError\" class=\"cn-action-dialog__muted\" role=\"status\">\n\t\t\t\t\t{{ checklistError }}\n\t\t\t\t</p>\n\t\t\t\t<ul class=\"cn-action-dialog__checks\">\n\t\t\t\t\t<li v-for=\"item in checklist\"\n\t\t\t\t\t\t:key=\"item.id\"\n\t\t\t\t\t\tclass=\"cn-action-dialog__check\"\n\t\t\t\t\t\t:data-testid=\"`cn-action-dialog-check-${item.id}`\"\n\t\t\t\t\t\t:data-met=\"String(item.met)\">\n\t\t\t\t\t\t<CheckCircle v-if=\"item.met === true\" :size=\"20\" class=\"cn-action-dialog__check-icon cn-action-dialog__check-icon--met\" />\n\t\t\t\t\t\t<HelpCircleOutline v-else-if=\"item.met === null\" :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<CircleOutline v-else :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<strong class=\"cn-action-dialog__check-label\">{{ item.label }}</strong>\n\t\t\t\t\t\t<span v-if=\"item.detail\" class=\"cn-action-dialog__muted\">{{ item.detail }}</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<!-- Fields the action asks for, sent beside the reason. -->\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.field\"\n\t\t\t\tclass=\"cn-action-dialog__field\"\n\t\t\t\t:data-testid=\"`cn-action-dialog-field-${field.field}`\">\n\t\t\t\t<NcSelect v-if=\"field.type === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"optionsOf(field)\"\n\t\t\t\t\t:inputLabel=\"text(field.label) || field.field\"\n\t\t\t\t\t:clearable=\"field.required === false\"\n\t\t\t\t\t@update:modelValue=\"(option) => pick(field, option)\" />\n\t\t\t\t<NcTextField v-else-if=\"field.type === 'secret'\"\n\t\t\t\t\t:modelValue=\"values[field.field] || ''\"\n\t\t\t\t\ttype=\"password\"\n\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t:label=\"text(field.label) || field.field\"\n\t\t\t\t\t:placeholder=\"secretStored(field) ? t('nextcloud-vue', 'Stored. Type a new value to replace it.') : ''\"\n\t\t\t\t\t@update:modelValue=\"(value) => setValue(field.field, value)\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"values[field.field] || ''\"\n\t\t\t\t\t:type=\"field.type === 'datetime' ? 'datetime-local' : (field.type === 'date' ? 'date' : 'text')\"\n\t\t\t\t\t:label=\"text(field.label) || field.field\"\n\t\t\t\t\t@update:modelValue=\"(value) => setValue(field.field, value)\" />\n\t\t\t</div>\n\n\t\t\t<div v-if=\"config.reason\" class=\"cn-action-dialog__field\">\n\t\t\t\t<NcTextArea\n\t\t\t\t\t:id=\"reasonId\"\n\t\t\t\t\tv-model=\"reason\"\n\t\t\t\t\t:label=\"reasonLabel\"\n\t\t\t\t\t:labelOutside=\"false\"\n\t\t\t\t\t:rows=\"config.reason.rows || 2\"\n\t\t\t\t\tresize=\"vertical\"\n\t\t\t\t\tdata-testid=\"cn-action-dialog-reason\" />\n\t\t\t\t<span v-if=\"config.reason.hint\" class=\"cn-action-dialog__muted\">{{ text(config.reason.hint) }}</span>\n\t\t\t</div>\n\n\t\t\t<NcNoteCard v-if=\"config.note\"\n\t\t\t\t:type=\"noteType\"\n\t\t\t\t:heading=\"text(config.note.title)\"\n\t\t\t\tdata-testid=\"cn-action-dialog-note\">\n\t\t\t\t{{ text(config.note.text) }}\n\t\t\t</NcNoteCard>\n\n\t\t\t<p v-if=\"refusal\"\n\t\t\t\tclass=\"cn-action-dialog__error\"\n\t\t\t\trole=\"alert\"\n\t\t\t\tdata-testid=\"cn-action-dialog-refusal\">\n\t\t\t\t{{ refusal }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<p v-else role=\"status\" data-testid=\"cn-action-dialog-done\">\n\t\t\t{{ text(config.doneText) || t('nextcloud-vue', 'Done') }}\n\t\t</p>\n\n\t\t<template #actions>\n\t\t\t<NcButton :disabled=\"busy\" data-testid=\"cn-action-dialog-cancel\" @click=\"close\">\n\t\t\t\t{{ done ? t('nextcloud-vue', 'Close') : t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"!done\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\tdata-testid=\"cn-action-dialog-confirm\"\n\t\t\t\t@click=\"confirm\">\n\t\t\t\t<template v-if=\"confirmConfig.icon\" #icon>\n\t\t\t\t\t<CnIcon :name=\"confirmConfig.icon\" :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ text(confirmConfig.label) || t('nextcloud-vue', 'Confirm') }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { emit } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport CircleOutline from 'vue-material-design-icons/CircleOutline.vue'\nimport HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue'\nimport { fetchEndpointSource, interpolateUrlTokens } from '../../composables/useEndpointSource.js'\nimport { fillTemplate } from '../../utils/fillTemplate.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { CnDialog } from '../CnDialog/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/** The page refresh channel the built-in widgets listen on. */\nconst PAGE_REFRESH = 'cn:page:refresh'\n\n/** Gives each dialog's reason field its own id. */\nlet reasonSeq = 0\n\n/**\n * CnActionDialog — the generic \"summary, checklist, reason, confirm\" dialog\n * for an act on a record, configured from the manifest (an `open-modal`\n * action's props), so an app does not hand-build each one. dossiq's archive\n * dialog (board DqArchiveren) is the first: the case, what its case type\n * keeps, a readiness checklist read from an endpoint, a reason, a read-only\n * note and Archive it.\n *\n * `config`:\n * - `title`, `subtitle`, `doneText`: texts, through the host translate;\n * `eyebrow` a template filled from the record (\"Close off · {identifier}\").\n * - `summary`: `{ source?, title, meta?, badge?, icon? }`: templates filled from\n * the record (`source` an endpointSource to read it from, else `object`).\n * - `facts`: `[{ title?, items: [{ label, value }] }]`, `value` a template.\n * - `checklist`: `{ title?, source, itemsPath?, labels?, required? }`: items\n * `{ id, met, label?, detail? }` read from `source`; `labels[id]` gives an\n * item's `{ label, detail?, unmetDetail? }`; the ids in `required` must be\n * met before the action can run. `met: null` reads as unknown.\n * - `permission`: `{ source, listPath?, match?, allowedPath, reasonPath? }`:\n * the action runs only while `allowedPath` reads true; `reasonPath` says\n * why not. With `listPath` the paths read the entry of that list whose\n * fields equal `match` (`{ act: \"archive\" }`).\n * - `fields`: `[{ field, type?: \"text\"|\"date\"|\"datetime\"|\"select\", label?,\n * required?, options?: [{ value, label, fills? }] }]`: inputs sent beside\n * the reason, required by default; a select option's `fills` sets other\n * fields that are still empty.\n * - `reason`: `{ label?, hint?, required?, field?, rows? }`: a text area; required by\n * default; sent as `field` (default `reason`). `rows` is its height in lines\n * (default 2; board DqBesluit draws 4).\n * - `note`: `{ variant?, title?, text }`: a read-only note.\n * - `confirm`: `{ label, icon?, request?: { method?, url, body? }, action? }`.\n * `request` posts itself (`body` templates filled with the record and\n * `{reason}`); `action` dispatches a manifest action through the page.\n *\n * Tokens (`@objectId`, `@object.<field>`) resolve in every url.\n */\nexport default {\n\tname: 'CnActionDialog',\n\n\tcomponents: { CheckCircle, CircleOutline, CnDialog, CnIcon, HelpCircleOutline, NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField },\n\n\tinject: {\n\t\t/** The host app's translate (CnAppRoot `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The page's pre-bound action dispatcher (CnPageRenderer), for `confirm.action`. */\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The dialog's configuration (see the component docs).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The record's id, for the `@objectId` token. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The record, when the host has it: the summary and facts read it.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tobject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['close', 'done'],\n\n\tdata() {\n\t\treturn {\n\t\t\trecord: this.object,\n\t\t\titems: [],\n\t\t\tchecklistError: '',\n\t\t\tallowed: true,\n\t\t\treason: '',\n\t\t\tvalues: {},\n\t\t\tbusy: false,\n\t\t\trefusal: '',\n\t\t\tdone: false,\n\t\t\treasonId: `cn-action-dialog-reason-${++reasonSeq}`,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {object} The token context. */\n\t\ttokenCtx() {\n\t\t\treturn { objectId: this.recordId, object: this.record || {} }\n\t\t},\n\n\t\t/**\n\t\t * The record's id: `objectId`, or the route's `id` when the prop is\n\t\t * empty or a token the opener could not resolve.\n\t\t *\n\t\t * @return {string|number}\n\t\t */\n\t\trecordId() {\n\t\t\tconst given = this.objectId\n\t\t\tif (given !== '' && given !== null && given !== undefined && !String(given).startsWith('@')) {\n\t\t\t\treturn given\n\t\t\t}\n\t\t\treturn (this.$route && this.$route.params && this.$route.params.id) || ''\n\t\t},\n\n\t\t/** @return {object} The confirm config. */\n\t\tconfirmConfig() {\n\t\t\treturn this.config.confirm && typeof this.config.confirm === 'object' ? this.config.confirm : {}\n\t\t},\n\n\t\t/**\n\t\t * The summary row, or null without one or before the record is known.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {{title: string, meta: string, badge: string}|null}\n\t\t */\n\t\tsummary() {\n\t\t\tconst def = this.config.summary\n\t\t\tif (!def || !this.record) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst title = this.fill(def.title)\n\t\t\treturn title ? { title, meta: this.fill(def.meta), badge: this.fill(def.badge) } : null\n\t\t},\n\n\t\t/** @return {Array<{title: string, facts: Array<{label: string, value: string}>}>} The fact groups. */\n\t\tfactSections() {\n\t\t\tif (!Array.isArray(this.config.facts) || !this.record) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst empty = t('nextcloud-vue', 'Not set')\n\t\t\treturn this.config.facts.map((section) => ({\n\t\t\t\ttitle: this.text(section.title),\n\t\t\t\tfacts: (Array.isArray(section.items) ? section.items : []).map((fact) => ({ label: this.text(fact.label), value: this.fill(fact.value) || empty })),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The checklist rows: label and detail from `labels` by id, else the item's own.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Array<{id: string, met: (boolean|null), label: string, detail: string}>}\n\t\t */\n\t\tchecklist() {\n\t\t\tconst labels = (this.config.checklist && this.config.checklist.labels) || {}\n\t\t\treturn this.items.map((item) => {\n\t\t\t\tconst met = item.met === null || item.met === undefined ? null : item.met === true\n\t\t\t\tconst own = labels[item.id] || {}\n\t\t\t\tconst detail = met === false && own.unmetDetail ? own.unmetDetail : (own.detail || item.detail || '')\n\t\t\t\treturn {\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tmet,\n\t\t\t\t\tlabel: this.fill(own.label || item.label || String(item.id), item),\n\t\t\t\t\tdetail: met === null && !item.detail ? t('nextcloud-vue', 'Could not be read') : this.fill(detail, item),\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/** @return {boolean} Whether every required item is met. */\n\t\trequiredMet() {\n\t\t\tconst required = (this.config.checklist && Array.isArray(this.config.checklist.required)) ? this.config.checklist.required.map(String) : []\n\t\t\treturn required.every((id) => this.items.some((item) => String(item.id) === id && item.met === true))\n\t\t},\n\n\t\t/** @return {boolean} Whether a reason is asked and needed. */\n\t\treasonNeeded() {\n\t\t\treturn Boolean(this.config.reason) && this.config.reason.required !== false\n\t\t},\n\n\t\t/** @return {string} The reason field's label. */\n\t\treasonLabel() {\n\t\t\treturn this.text(this.config.reason && this.config.reason.label) || t('nextcloud-vue', 'Reason')\n\t\t},\n\n\t\t/** @return {string} The note's NcNoteCard type. */\n\t\tnoteType() {\n\t\t\tconst variant = this.config.note && this.config.note.variant\n\t\t\treturn ['info', 'warning', 'error', 'success'].includes(variant) ? variant : 'info'\n\t\t},\n\n\t\t/**\n\t\t * Whether the action may run: allowed, required items met, a reason\n\t\t * when one is needed, and nothing in flight.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {boolean}\n\t\t */\n\t\tcanConfirm() {\n\t\t\treturn !this.busy && this.allowed && this.requiredMet && this.fieldsFilled && (!this.reasonNeeded || this.reason.trim() !== '')\n\t\t},\n\n\t\t/** @return {string} The eyebrow, filled from the record once it is known. */\n\t\teyebrowText() {\n\t\t\treturn this.record ? this.fill(this.config.eyebrow) || this.text(this.config.eyebrow) : this.text(this.config.eyebrow)\n\t\t},\n\n\t\t/** @return {Array<object>} The fields with a name. */\n\t\tfields() {\n\t\t\treturn (Array.isArray(this.config.fields) ? this.config.fields : []).filter((f) => f && f.field)\n\t\t},\n\n\t\t/**\n\t\t * Whether every required field has a value.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog-fields-and-acts/specs/action-dialog/spec.md#requirement-an-action-dialog-asks-for-fields-and-reads-a-permission-from-a-list\n\t\t * @return {boolean}\n\t\t */\n\t\tfieldsFilled() {\n\t\t\treturn this.fields.every((f) => f.required === false || this.secretStored(f) || String(this.values[f.field] ?? '').trim() !== '')\n\t\t},\n\t},\n\n\twatch: {\n\t\trecord: {\n\t\t\thandler() {\n\t\t\t\tthis.startValues()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait Promise.all([this.loadRecord(), this.loadChecklist(), this.loadPermission()])\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A config text through the host translate, '' for anything else.\n\t\t *\n\t\t * @param {unknown} value The text.\n\t\t * @return {string}\n\t\t */\n\t\ttext(value) {\n\t\t\treturn typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''\n\t\t},\n\n\t\t/**\n\t\t * A template filled from a row (the record by default), translated first.\n\t\t *\n\t\t * @param {unknown} template The template.\n\t\t * @param {object} [row] The row.\n\t\t * @return {string}\n\t\t */\n\t\tfill(template, row) {\n\t\t\tif (typeof template !== 'string' || template === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn fillTemplate(this.cnTranslate(template), row || this.record || {}).trim()\n\t\t},\n\n\t\t/**\n\t\t * Read an endpoint, fresh.\n\t\t *\n\t\t * @param {object} source An endpointSource block.\n\t\t * @return {Promise<unknown>}\n\t\t */\n\t\tread(source) {\n\t\t\treturn fetchEndpointSource(source, this.tokenCtx, { fresh: true })\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadRecord() {\n\t\t\tconst source = this.config.summary && this.config.summary.source\n\t\t\tif (!source || !source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(source)\n\t\t\t\tthis.record = data && typeof data === 'object' ? data : this.record\n\t\t\t} catch {\n\t\t\t\t// The summary stays empty; the checklist and the action still work.\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadChecklist() {\n\t\t\tconst def = this.config.checklist\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst list = def.itemsPath ? readPath(data, def.itemsPath) : data\n\t\t\t\tthis.items = Array.isArray(list) ? list.filter((item) => item && item.id !== undefined) : []\n\t\t\t} catch {\n\t\t\t\tthis.items = []\n\t\t\t\tthis.checklistError = t('nextcloud-vue', 'Whether this is ready could not be read.')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The entry of a list whose fields equal `match`, or null.\n\t\t *\n\t\t * @param {unknown} list The list.\n\t\t * @param {object} [match] The fields to match.\n\t\t * @return {object|null}\n\t\t */\n\t\tmatchIn(list, match) {\n\t\t\tconst wanted = Object.entries(match || {})\n\t\t\treturn (Array.isArray(list) ? list : []).find((entry) => entry && wanted.every(([key, value]) => String(entry[key]) === String(value))) || null\n\t\t},\n\n\t\t/**\n\t\t * A select field's options, labels translated.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {Array<{id: string, label: string, fills?: object}>}\n\t\t */\n\t\toptionsOf(field) {\n\t\t\treturn (Array.isArray(field.options) ? field.options : []).map((o) => ({ id: String(o.value), label: this.text(o.label) || String(o.value), fills: o.fills }))\n\t\t},\n\n\t\t/**\n\t\t * A select field's chosen option.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {object|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\treturn this.optionsOf(field).find((o) => o.id === String(this.values[field.field] ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Set a field's value.\n\t\t *\n\t\t * @param {string} name The field.\n\t\t * @param {unknown} value The value.\n\t\t */\n\t\tsetValue(name, value) {\n\t\t\tthis.values = { ...this.values, [name]: value === null || value === undefined ? '' : String(value) }\n\t\t},\n\n\t\t/**\n\t\t * Choose a select option; its `fills` set the fields still empty.\n\t\t *\n\t\t * @param {object} field The select field.\n\t\t * @param {{id: string, fills?: object}|null} option The option.\n\t\t */\n\t\tpick(field, option) {\n\t\t\tthis.setValue(field.field, option ? option.id : '')\n\t\t\tfor (const [name, value] of Object.entries((option && option.fills) || {})) {\n\t\t\t\tif (String(this.values[name] ?? '').trim() === '') {\n\t\t\t\t\tthis.setValue(name, this.text(value) || value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadPermission() {\n\t\t\tconst def = this.config.permission\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst entry = def.listPath ? this.matchIn(readPath(data, def.listPath), def.match) : data\n\t\t\t\tthis.allowed = readPath(entry, def.allowedPath || 'allowed') === true\n\t\t\t\tthis.refusal = this.allowed || !def.reasonPath ? '' : String(readPath(entry, def.reasonPath) || '')\n\t\t\t} catch {\n\t\t\t\tthis.allowed = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run the action once: post `confirm.request`, or dispatch\n\t\t * `confirm.action`, then show the done text and refresh the page.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync confirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\tthis.refusal = ''\n\t\t\tconst reason = this.reason.trim()\n\t\t\ttry {\n\t\t\t\tconst request = this.confirmConfig.request\n\t\t\t\tif (request && request.url) {\n\t\t\t\t\tconst url = interpolateUrlTokens(request.url, this.tokenCtx)\n\t\t\t\t\tconst body = {}\n\t\t\t\t\tfor (const [key, value] of Object.entries(request.body || {})) {\n\t\t\t\t\t\tbody[key] = typeof value === 'string' ? fillTemplate(value, { ...(this.record || {}), reason }) : value\n\t\t\t\t\t}\n\t\t\t\t\tif (this.config.reason) {\n\t\t\t\t\t\tbody[this.config.reason.field || 'reason'] = reason\n\t\t\t\t\t}\n\t\t\t\t\tfor (const field of this.fields) {\n\t\t\t\t\t\tif (field.type === 'secret' && String(this.values[field.field] ?? '') === '') {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbody[field.field] = this.values[field.field] ?? ''\n\t\t\t\t\t}\n\t\t\t\t\tconst method = String(request.method || 'POST').toLowerCase()\n\t\t\t\t\tawait axios[['post', 'put', 'patch', 'delete'].includes(method) ? method : 'post'](/^https?:\\/\\//i.test(url) ? url : generateUrl(url), body)\n\t\t\t\t} else if (this.confirmConfig.action && typeof this.cnDispatchAction === 'function') {\n\t\t\t\t\tawait this.cnDispatchAction({ ...this.confirmConfig.action, args: [...(this.confirmConfig.action.args || []), { ...this.values, reason }] })\n\t\t\t\t}\n\t\t\t\tthis.done = true\n\t\t\t\temit(PAGE_REFRESH, {})\n\t\t\t\t/** @event done The action ran. Payload: the field values and `reason`. */\n\t\t\t\tthis.$emit('done', { ...this.values, reason })\n\t\t\t} catch (failure) {\n\t\t\t\tconst data = failure && failure.response && failure.response.data\n\t\t\t\tthis.refusal = String((data && (data.message || data.error)) || t('nextcloud-vue', 'The action could not be completed.'))\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 * Start each field with `valuePath` from the record, unless it was\n\t\t * already edited.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog-secret-field/specs/action-dialog/spec.md#requirement-a-field-can-start-from-the-record-and-a-secret-is-write-only\n\t\t * @return {void}\n\t\t */\n\t\tstartValues() {\n\t\t\tif (!this.record) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst values = { ...this.values }\n\t\t\tfor (const field of this.fields) {\n\t\t\t\tif (field.valuePath && field.type !== 'secret' && !(field.field in values)) {\n\t\t\t\t\tconst value = readPath(this.record, field.valuePath)\n\t\t\t\t\tif (value !== null && value !== undefined) {\n\t\t\t\t\t\tvalues[field.field] = String(value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.values = values\n\t\t},\n\n\t\t/**\n\t\t * Whether a secret field has a value stored: `storedPath` reads true on the record.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {boolean}\n\t\t */\n\t\tsecretStored(field) {\n\t\t\treturn field.type === 'secret' && Boolean(field.storedPath && this.record && readPath(this.record, field.storedPath))\n\t\t},\n\n\t\t/** Close the dialog, unless the action is running. */\n\t\tclose() {\n\t\t\tif (this.busy) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/** @event close The dialog was closed. */\n\t\t\tthis.$emit('close')\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-action-dialog {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-action-dialog__summary {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 12px 14px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-action-dialog__summary-text {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tmin-width: 0;\n}\n\n.cn-action-dialog__badge {\n\tpadding: 3px 10px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 13px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n\n.cn-action-dialog__title {\n\tmargin: 0 0 8px;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n/* Facts in columns of at least 200px, each a label over its value above a\n hairline (DqArchiveren \"Bewaring volgens het zaaktype\"). */\n.cn-action-dialog__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n\tgap: 12px 24px;\n\tmargin: 0;\n}\n\n.cn-action-dialog__fact {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 3px;\n\tpadding-bottom: 10px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-action-dialog__facts dt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-action-dialog__facts dd {\n\tmargin: 0;\n\tfont-size: 15px;\n\tfont-weight: 500;\n}\n\n/* Checklist rows divided by hairlines, the detail at the row's end\n (DqArchiveren \"Klaar om te archiveren\"). */\n.cn-action-dialog__checks {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-action-dialog__check {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 2px 12px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-border);\n\tfont-size: 15px;\n}\n\n.cn-action-dialog__check-label {\n\tflex: 1 1 auto;\n\tfont-weight: 600;\n}\n\n.cn-action-dialog__check-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-action-dialog__check-icon--met {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-action-dialog__muted {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 14px;\n}\n\n.cn-action-dialog__field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-action-dialog__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["CnDialog","CnIcon","t","axios"],"mappings":";;;;;;;;;;;;;;;AA0JA;AACA,MAAM,YAAW,GAAI,kBAAgB;;AAErC;AACA,IAAI,SAAQ,GAAI,EAAA;;AAEhB;AACC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;;;;AAIA;;;AAGA;AACA;;;;AAIA;AACA;AACA;;AAEA;;;AAGA;;;AAGD,aAAe;AACd,CAAA,IAAI,EAAE,gBAAgB;;CAEtB,UAAU,EAAE,EAAE,WAAW,EAAE,aAAa,YAAEA,UAAQ,UAAEC,YAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAU,EAAG;;AAExI,CAAA,MAAM,EAAE;;AAEP,EAAA,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,KAAK;AAC5C;AACA,EAAA,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM;EACnC;;AAED,CAAA,KAAK,EAAE;AACN;;AAEC;;;AAGD,EAAA,MAAM,EAAE;GACP,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,OAAO,EAAE,CAAC;GACnB;;AAED;AACA,EAAA,QAAQ,EAAE;AACT,GAAA,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;GACtB,OAAO,EAAE,EAAE;GACX;;AAED;;AAEC;AACA;;AAED,EAAA,MAAM,EAAE;GACP,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,IAAI;GACb;EACD;;CAED,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;;AAExB,CAAA,IAAI,GAAG;AACN,EAAA,OAAO;AACN,GAAA,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,GAAA,KAAK,EAAE,EAAE;AACT,GAAA,cAAc,EAAE,EAAE;GAClB,OAAO,EAAE,IAAI;AACb,GAAA,MAAM,EAAE,EAAE;AACV,GAAA,MAAM,EAAE,EAAE;GACV,IAAI,EAAE,KAAK;GACX,OAAO,EAAE,EAAE;GACX,IAAI,EAAE,KAAK;GACX,QAAQ,EAAE,CAAC,wBAAwB,EAAE,EAAE,SAAS,CAAC,CAAC;AACnD,GAAA;EACA;;AAED,CAAA,QAAQ,EAAE;AACT;EACA,QAAQ,GAAG;GACV,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAO,IAAG,EAAG,EAAA;GAC5D;;AAED;;AAEC;AACA;;;EAGD,QAAQ,GAAG;GACV,MAAM,KAAM,GAAE,IAAI,CAAC,SAAO;AAC1B,GAAA,IAAI,KAAM,KAAI,EAAG,IAAG,KAAM,KAAI,QAAQ,KAAI,KAAM,SAAQ,IAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;IAC5F,OAAO,KAAI;AACZ,IAAA;AACA,GAAA,OAAO,CAAC,IAAI,CAAC,MAAO,IAAG,IAAI,CAAC,MAAM,CAAC,MAAK,IAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAC;GACxE;;AAED;AACA,EAAA,aAAa,GAAG;AACf,GAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAM,IAAK,OAAO,IAAI,CAAC,MAAM,CAAC,OAAQ,KAAI,QAAS,GAAE,IAAI,CAAC,MAAM,CAAC,OAAM,GAAI,EAAC;GAC/F;;AAED;;AAEC;;;;AAID,EAAA,OAAO,GAAG;GACT,MAAM,GAAI,GAAE,IAAI,CAAC,MAAM,CAAC,QAAM;GAC9B,IAAI,CAAC,GAAI,IAAG,CAAC,IAAI,CAAC,MAAM,EAAE;AACzB,IAAA,OAAO,IAAG;AACX,IAAA;AACA,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAA;AACjC,GAAA,OAAO,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,EAAA,GAAI,IAAG;GACtF;;AAED;AACA,EAAA,YAAY,GAAG;GACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA,IAAK,CAAC,IAAI,CAAC,MAAM,EAAE;AACtD,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,MAAM,KAAI,GAAIC,SAAC,CAAC,eAAe,EAAE,SAAS,EAAA;AAC1C,GAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM;AAC1C,IAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/B,IAAA,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAE,GAAE,OAAO,CAAC,KAAI,GAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAA,IAAK,KAAM,EAAC,CAAC,CAAC;AACpJ,IAAC,CAAC,CAAA;GACF;;AAED;AACC;AACA;;AAEA;;EAED,SAAS,GAAG;AACX,GAAA,MAAM,MAAK,GAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAQ,IAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,GAAC;GAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK;AAC/B,IAAA,MAAM,GAAI,GAAE,IAAI,CAAC,GAAI,KAAI,IAAG,IAAK,IAAI,CAAC,GAAI,KAAI,SAAU,GAAE,IAAK,GAAE,IAAI,CAAC,GAAE,KAAM,KAAG;IACjF,MAAM,GAAI,GAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA,IAAK,GAAC;AAChC,IAAA,MAAM,MAAK,GAAI,QAAQ,SAAS,GAAG,CAAC,cAAc,GAAG,CAAC,eAAe,GAAG,CAAC,MAAO,IAAG,IAAI,CAAC,UAAU,EAAE,EAAA;AACpG,IAAA,OAAO;AACN,KAAA,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,KAAA,GAAG;KACH,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAM,IAAG,IAAI,CAAC,KAAI,IAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAClE,KAAA,MAAM,EAAE,GAAE,KAAM,QAAQ,CAAC,IAAI,CAAC,SAASA,SAAC,CAAC,eAAe,EAAE,mBAAmB,CAAE,GAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACzG,KAAA;IACA,CAAA;GACD;;;EAGD,WAAW,GAAG;AACb,GAAA,MAAM,QAAO,GAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAU,IAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAA,GAAI,GAAC;AAC1I,GAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAE,KAAI,EAAG,IAAG,IAAI,CAAC,GAAE,KAAM,IAAI,CAAC,CAAA;GACpG;;;AAGD,EAAA,YAAY,GAAG;AACd,GAAA,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAE,IAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAS,KAAI,KAAI;GAC1E;;AAED;EACA,WAAW,GAAG;AACb,GAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAO,IAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAA,IAAKA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAA;GAC/F;;AAED;EACA,QAAQ,GAAG;GACV,MAAM,OAAQ,GAAE,IAAI,CAAC,MAAM,CAAC,IAAK,IAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAM;AAC3D,GAAA,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAA,GAAI,UAAU,MAAK;GAClF;;AAED;;AAEC;AACA;;AAEA;;EAED,UAAU,GAAG;GACZ,OAAO,CAAC,IAAI,CAAC,IAAG,IAAK,IAAI,CAAC,OAAM,IAAK,IAAI,CAAC,WAAU,IAAK,IAAI,CAAC,YAAa,KAAI,CAAC,IAAI,CAAC,YAAW,IAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,KAAM,EAAE,CAAA;GAC9H;;AAED;EACA,WAAW,GAAG;GACb,OAAO,IAAI,CAAC,MAAO,GAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,IAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAE,GAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;GACrH;;AAED;AACA,EAAA,MAAM,GAAG;AACR,GAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,GAAI,IAAI,CAAC,MAAM,CAAC,MAAK,GAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAE,IAAG,CAAC,CAAC,KAAK,CAAA;GAC/F;;AAED;AACC;AACA;AACA;AACA;;AAED,EAAA,YAAY,GAAG;GACd,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAS,KAAI,KAAI,IAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA,IAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAE,IAAG,EAAE,CAAC,CAAC,IAAI,EAAC,KAAM,EAAE,CAAA;GAChI;EACD;;AAED,CAAA,KAAK,EAAE;AACN,EAAA,MAAM,EAAE;AACP,GAAA,OAAO,GAAG;AACT,IAAA,IAAI,CAAC,WAAW,GAAC;IACjB;;AAED,GAAA,SAAS,EAAE,IAAI;GACf;EACD;;AAED,CAAA,MAAM,OAAO,GAAG;AACf,EAAA,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,EAAA;EAClF;;AAED,CAAA,OAAO,EAAE;KACRA,SAAC;;AAED;;AAEC;;AAEA;;EAED,IAAI,CAAC,KAAK,EAAE;AACX,GAAA,OAAO,OAAO,KAAM,KAAI,QAAO,IAAK,KAAI,KAAM,EAAG,GAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA,GAAI,EAAC;GAC9E;;AAED;;AAEC;AACA;;AAEA;;AAED,EAAA,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;AACnB,GAAA,IAAI,OAAO,aAAa,YAAY,QAAS,KAAI,EAAE,EAAE;AACpD,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,GAAI,IAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAC;GAC/E;;AAED;AACC;AACA;AACA;;;EAGD,IAAI,CAAC,MAAM,EAAE;GACZ,OAAO,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAG,EAAG,CAAA;GACjE;;;AAGD,EAAA,MAAM,UAAU,GAAG;GAClB,MAAM,MAAO,GAAE,IAAI,CAAC,MAAM,CAAC,OAAQ,IAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAK;GAC/D,IAAI,CAAC,MAAK,IAAK,CAAC,MAAM,CAAC,GAAG,EAAE;IAC3B,MAAK;AACN,IAAA;AACA,GAAA,IAAI;AACH,IAAA,MAAM,IAAG,GAAI,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAA;IACnC,IAAI,CAAC,MAAK,GAAI,IAAG,IAAK,OAAO,SAAS,QAAO,GAAI,IAAG,GAAI,IAAI,CAAC,OAAK;AACnE,IAAA,CAAE,MAAM;;AAER,IAAA;GACA;;;AAGD,EAAA,MAAM,aAAa,GAAG;GACrB,MAAM,GAAE,GAAI,IAAI,CAAC,MAAM,CAAC,UAAQ;AAChC,GAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAO,IAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;IAC3C,MAAK;AACN,IAAA;AACA,GAAA,IAAI;AACH,IAAA,MAAM,IAAK,GAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAA;IACvC,MAAM,IAAG,GAAI,GAAG,CAAC,SAAU,GAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAE,GAAE,KAAG;AAChE,IAAA,IAAI,CAAC,KAAM,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,GAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAK,IAAG,IAAI,CAAC,EAAC,KAAM,SAAS,CAAA,GAAI,GAAC;AAC5F,IAAA,CAAE,MAAM;IACP,IAAI,CAAC,KAAM,GAAE,GAAC;AACd,IAAA,IAAI,CAAC,cAAa,GAAIA,SAAC,CAAC,eAAe,EAAE,0CAA0C,EAAA;AACpF,IAAA;GACA;;AAED;;AAEC;;AAEA;AACA;;AAED,EAAA,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;AACpB,GAAA,MAAM,SAAS,MAAM,CAAC,OAAO,CAAC,KAAI,IAAK,EAAE,EAAA;AACzC,GAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,GAAE,IAAG,GAAI,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,KAAI,IAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,KAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,IAAK,IAAG;GAC9I;;AAED;AACC;AACA;;;;AAID,EAAA,SAAS,CAAC,KAAK,EAAE;AAChB,GAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAE,GAAE,KAAK,CAAC,OAAM,GAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA,IAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAI,EAAG,CAAC,CAAA;GAC7J;;AAED;;AAEC;;AAEA;;AAED,EAAA,cAAc,CAAC,KAAK,EAAE;AACrB,GAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAG,KAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA,IAAK,EAAE,CAAC,CAAA,IAAK,IAAG;GAChG;;AAED;AACC;AACA;;;;AAID,EAAA,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;AACrB,GAAA,IAAI,CAAC,MAAK,GAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,KAAM,KAAI,IAAK,IAAG,UAAU,SAAU,GAAE,EAAG,GAAE,MAAM,CAAC,KAAK,CAAE,GAAA;GACnG;;AAED;;AAEC;AACA;;;AAGD,EAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;AACnB,GAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,CAAC,EAAG,GAAE,EAAE,EAAA;AAClD,GAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAE,IAAG,MAAM,CAAC,OAAO,CAAC,CAAC,MAAK,IAAK,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE;AAC3E,IAAA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,IAAG,EAAE,CAAC,CAAC,IAAI,EAAG,KAAI,EAAE,EAAE;AAClD,KAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,EAAA;AAC9C,KAAA;AACD,IAAA;GACA;;;AAGD,EAAA,MAAM,cAAc,GAAG;AACtB,GAAA,MAAM,GAAI,GAAE,IAAI,CAAC,MAAM,CAAC,WAAS;AACjC,GAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAO,IAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;IAC3C,MAAK;AACN,IAAA;AACA,GAAA,IAAI;AACH,IAAA,MAAM,IAAK,GAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAA;AACvC,IAAA,MAAM,KAAM,GAAE,GAAG,CAAC,QAAS,GAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,KAAG;IACxF,IAAI,CAAC,OAAM,GAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,WAAY,IAAG,SAAS,CAAE,KAAI,KAAG;AACpE,IAAA,IAAI,CAAC,OAAM,GAAI,IAAI,CAAC,OAAQ,IAAG,CAAC,GAAG,CAAC,UAAW,GAAE,EAAC,GAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,KAAK,EAAE,EAAA;AACnG,IAAA,CAAE,MAAM;AACP,IAAA,IAAI,CAAC,OAAQ,GAAE,MAAI;AACpB,IAAA;GACA;;AAED;;;AAGC;;;;AAID,EAAA,MAAM,OAAO,GAAG;AACf,GAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;IACrB,MAAK;AACN,IAAA;GACA,IAAI,CAAC,IAAK,GAAE,KAAG;AACf,GAAA,IAAI,CAAC,OAAQ,GAAE,GAAC;GAChB,MAAM,MAAO,GAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAC;AAChC,GAAA,IAAI;AACH,IAAA,MAAM,UAAU,IAAI,CAAC,aAAa,CAAC,QAAM;IACzC,IAAI,OAAM,IAAK,OAAO,CAAC,GAAG,EAAE;KAC3B,MAAM,GAAI,GAAE,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAA;KAC3D,MAAM,IAAK,GAAE,GAAC;KACd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAA,IAAK,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAK,IAAG,EAAE,CAAC,EAAE;AAC9D,MAAA,IAAI,CAAC,GAAG,CAAE,GAAE,OAAO,KAAI,KAAM,QAAO,GAAI,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAA,GAAI,MAAI;AACvG,MAAA;KACA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;MACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAI,IAAK,QAAQ,CAAE,GAAE,OAAK;AACnD,MAAA;KACA,KAAK,MAAM,KAAI,IAAK,IAAI,CAAC,MAAM,EAAE;AAChC,MAAA,IAAI,KAAK,CAAC,IAAG,KAAM,QAAS,IAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA,IAAK,EAAE,CAAA,KAAM,EAAE,EAAE;AAC7E,OAAA,QAAO;AACR,OAAA;AACA,MAAA,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,IAAG,GAAC;AAClD,MAAA;KACA,MAAM,MAAK,GAAI,MAAM,CAAC,OAAO,CAAC,MAAO,IAAG,MAAM,CAAC,CAAC,WAAW,GAAC;AAC5D,KAAA,MAAMC,cAAK,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAA,GAAI,MAAO,GAAE,MAAM,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAE,GAAE,GAAI,GAAE,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAA;AAC5I,KAAA,MAAO,IAAI,IAAI,CAAC,aAAa,CAAC,MAAK,IAAK,OAAO,IAAI,CAAC,gBAAe,KAAM,UAAU,EAAE;AACpF,KAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAK,IAAG,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,MAAO,EAAC,GAAG,EAAA;AAC5I,KAAA;IACA,IAAI,CAAC,IAAK,GAAE,KAAG;AACf,IAAA,IAAI,CAAC,YAAY,EAAE,EAAE,EAAA;;AAErB,IAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAA;AAC9C,IAAA,CAAE,OAAO,OAAO,EAAE;IACjB,MAAM,IAAG,GAAI,OAAQ,IAAG,OAAO,CAAC,QAAO,IAAK,OAAO,CAAC,QAAQ,CAAC,KAAG;IAChE,IAAI,CAAC,OAAM,GAAI,MAAM,CAAC,CAAC,IAAK,KAAI,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,KAAKD,SAAC,CAAC,eAAe,EAAE,oCAAoC,CAAC,EAAA;AACzH,IAAA,SAAU;AACT,IAAA,IAAI,CAAC,IAAG,GAAI,MAAI;AACjB,IAAA;GACA;;AAED;;AAEC;AACA;AACA;;;EAGD,WAAW,GAAG;AACb,GAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;IACjB,MAAK;AACN,IAAA;GACA,MAAM,MAAK,GAAI,EAAE,GAAG,IAAI,CAAC,MAAO,GAAA;GAChC,KAAK,MAAM,KAAI,IAAK,IAAI,CAAC,MAAM,EAAE;AAChC,IAAA,IAAI,KAAK,CAAC,SAAQ,IAAK,KAAK,CAAC,IAAG,KAAM,QAAO,IAAK,EAAE,KAAK,CAAC,KAAI,IAAK,MAAM,CAAC,EAAE;KAC3E,MAAM,KAAM,GAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAA;AACnD,KAAA,IAAI,KAAI,KAAM,QAAQ,KAAM,KAAI,SAAS,EAAE;AAC1C,MAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,GAAE,MAAM,CAAC,KAAK,EAAA;AACnC,MAAA;AACD,KAAA;AACD,IAAA;AACA,GAAA,IAAI,CAAC,SAAS,OAAK;GACnB;;AAED;AACC;AACA;;AAEA;;AAED,EAAA,YAAY,CAAC,KAAK,EAAE;GACnB,OAAO,KAAK,CAAC,IAAK,KAAI,YAAY,OAAO,CAAC,KAAK,CAAC,UAAS,IAAK,IAAI,CAAC,MAAK,IAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;GACpH;;AAED;AACA,EAAA,KAAK,GAAG;GACP,IAAI,IAAI,CAAC,IAAI,EAAE;IACd,MAAK;AACN,IAAA;AACA;AACA,GAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAA;GAClB;EACD;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"CnActionDialog.vue2.js","sources":["../../../../src/components/CnActionDialog/CnActionDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:name=\"text(config.title) || t('nextcloud-vue', 'Confirm')\"\n\t\t:eyebrow=\"eyebrowText\"\n\t\t:subtitle=\"text(config.subtitle)\"\n\t\twidth=\"form\"\n\t\t:noClose=\"busy\"\n\t\tdata-testid=\"cn-action-dialog\"\n\t\t@closing=\"close\">\n\t\t<div v-if=\"!done\" class=\"cn-action-dialog\">\n\t\t\t<!-- The record the action is about: its title, a meta line, a badge. -->\n\t\t\t<div v-if=\"summary\" class=\"cn-action-dialog__summary\" data-testid=\"cn-action-dialog-summary\">\n\t\t\t\t<CnIcon :name=\"config.summary.icon || 'FolderOutline'\" :size=\"20\" class=\"cn-action-dialog__summary-icon\" />\n\t\t\t\t<span class=\"cn-action-dialog__summary-text\">\n\t\t\t\t\t<strong>{{ summary.title }}</strong>\n\t\t\t\t\t<span v-if=\"summary.meta\" class=\"cn-action-dialog__muted\">{{ summary.meta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<span v-if=\"summary.badge\" class=\"cn-action-dialog__badge\">{{ summary.badge }}</span>\n\t\t\t</div>\n\n\t\t\t<!-- Facts about the record, in titled groups (\"Retention under the case type\"). -->\n\t\t\t<section v-for=\"(section, index) in factSections\"\n\t\t\t\t:key=\"`facts-${index}`\"\n\t\t\t\tclass=\"cn-action-dialog__section\"\n\t\t\t\tdata-testid=\"cn-action-dialog-facts\">\n\t\t\t\t<h3 v-if=\"section.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ section.title }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-action-dialog__facts\">\n\t\t\t\t\t<div v-for=\"fact in section.facts\" :key=\"fact.label\" class=\"cn-action-dialog__fact\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ fact.value }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t</section>\n\n\t\t\t<!-- The checklist, read from an endpoint: each item met, not met or\n\t\t\t unknown. Items named in `required` decide whether the action may\n\t\t\t run; the others inform. -->\n\t\t\t<section v-if=\"config.checklist\" class=\"cn-action-dialog__section\" data-testid=\"cn-action-dialog-checklist\">\n\t\t\t\t<h3 v-if=\"config.checklist.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ text(config.checklist.title) }}\n\t\t\t\t</h3>\n\t\t\t\t<p v-if=\"checklistError\" class=\"cn-action-dialog__muted\" role=\"status\">\n\t\t\t\t\t{{ checklistError }}\n\t\t\t\t</p>\n\t\t\t\t<ul class=\"cn-action-dialog__checks\">\n\t\t\t\t\t<li v-for=\"item in checklist\"\n\t\t\t\t\t\t:key=\"item.id\"\n\t\t\t\t\t\tclass=\"cn-action-dialog__check\"\n\t\t\t\t\t\t:data-testid=\"`cn-action-dialog-check-${item.id}`\"\n\t\t\t\t\t\t:data-met=\"String(item.met)\">\n\t\t\t\t\t\t<CheckCircle v-if=\"item.met === true\" :size=\"20\" class=\"cn-action-dialog__check-icon cn-action-dialog__check-icon--met\" />\n\t\t\t\t\t\t<HelpCircleOutline v-else-if=\"item.met === null\" :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<CircleOutline v-else :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<strong class=\"cn-action-dialog__check-label\">{{ item.label }}</strong>\n\t\t\t\t\t\t<span v-if=\"item.detail\" class=\"cn-action-dialog__muted\">{{ item.detail }}</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<!-- Fields the action asks for, sent beside the reason. -->\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.field\"\n\t\t\t\tclass=\"cn-action-dialog__field\"\n\t\t\t\t:data-testid=\"`cn-action-dialog-field-${field.field}`\">\n\t\t\t\t<!-- A checkbox field: a tinted box, the label filled from the\n\t\t\t\t record, a hint under it (DqArchiveren \"Sanne de Vries laten\n\t\t\t\t weten...\"). -->\n\t\t\t\t<NcCheckboxRadioSwitch v-if=\"field.type === 'checkbox'\"\n\t\t\t\t\tclass=\"cn-action-dialog__checkbox\"\n\t\t\t\t\t:modelValue=\"checkboxValue(field)\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t@update:modelValue=\"(on) => setChecked(field.field, on)\">\n\t\t\t\t\t<span class=\"cn-action-dialog__checkbox-text\">\n\t\t\t\t\t\t<strong class=\"cn-action-dialog__checkbox-label\">{{ fill(field.label) || field.field }}</strong>\n\t\t\t\t\t\t<span v-if=\"field.hint\" class=\"cn-action-dialog__muted\">{{ fill(field.hint) }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<!-- A search field: records of `source` found as the reader\n\t\t\t\t types (DqZaakKoppelen \"Zaak koppelen\"). -->\n\t\t\t\t<CnSearchSelect v-else-if=\"field.type === 'search'\"\n\t\t\t\t\t:modelValue=\"values[field.field] || null\"\n\t\t\t\t\t:options=\"searchOptions[field.field] || []\"\n\t\t\t\t\t:inputLabel=\"fill(field.label) || field.field\"\n\t\t\t\t\t:labelOutside=\"true\"\n\t\t\t\t\t:loading=\"searching === field.field\"\n\t\t\t\t\t:filterable=\"false\"\n\t\t\t\t\t:placeholder=\"fill(field.placeholder)\"\n\t\t\t\t\t@search=\"(typed) => onSearch(field, typed)\"\n\t\t\t\t\t@update:modelValue=\"(value) => setValue(field.field, value && typeof value === 'object' ? value.id : value)\" />\n\t\t\t\t<NcSelect v-else-if=\"field.type === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"optionsOf(field)\"\n\t\t\t\t\t:inputLabel=\"fill(field.label) || field.field\"\n\t\t\t\t\t:clearable=\"field.required === false\"\n\t\t\t\t\t@update:modelValue=\"(option) => pick(field, option)\" />\n\t\t\t\t<NcTextField v-else-if=\"field.type === 'secret'\"\n\t\t\t\t\t:modelValue=\"values[field.field] || ''\"\n\t\t\t\t\ttype=\"password\"\n\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t:label=\"text(field.label) || field.field\"\n\t\t\t\t\t:placeholder=\"secretStored(field) ? t('nextcloud-vue', 'Stored. Type a new value to replace it.') : ''\"\n\t\t\t\t\t@update:modelValue=\"(value) => setValue(field.field, value)\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"values[field.field] || ''\"\n\t\t\t\t\t:type=\"field.type === 'datetime' ? 'datetime-local' : (field.type === 'date' ? 'date' : 'text')\"\n\t\t\t\t\t:label=\"fill(field.label) || field.field\"\n\t\t\t\t\t@update:modelValue=\"(value) => setValue(field.field, value)\" />\n\t\t\t\t<span v-if=\"field.hint && field.type !== 'checkbox'\" class=\"cn-action-dialog__muted\">{{ fill(field.hint) }}</span>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"config.reason\" class=\"cn-action-dialog__field\">\n\t\t\t\t<NcTextArea\n\t\t\t\t\t:id=\"reasonId\"\n\t\t\t\t\tv-model=\"reason\"\n\t\t\t\t\t:label=\"reasonLabel\"\n\t\t\t\t\t:labelOutside=\"false\"\n\t\t\t\t\t:rows=\"config.reason.rows || 2\"\n\t\t\t\t\tresize=\"vertical\"\n\t\t\t\t\tdata-testid=\"cn-action-dialog-reason\" />\n\t\t\t\t<span v-if=\"config.reason.hint\" class=\"cn-action-dialog__muted\">{{ text(config.reason.hint) }}</span>\n\t\t\t</div>\n\n\t\t\t<NcNoteCard v-if=\"config.note\"\n\t\t\t\t:type=\"noteType\"\n\t\t\t\t:heading=\"text(config.note.title)\"\n\t\t\t\tdata-testid=\"cn-action-dialog-note\">\n\t\t\t\t{{ text(config.note.text) }}\n\t\t\t</NcNoteCard>\n\n\t\t\t<p v-if=\"refusal\"\n\t\t\t\tclass=\"cn-action-dialog__error\"\n\t\t\t\trole=\"alert\"\n\t\t\t\tdata-testid=\"cn-action-dialog-refusal\">\n\t\t\t\t{{ refusal }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<p v-else role=\"status\" data-testid=\"cn-action-dialog-done\">\n\t\t\t{{ text(config.doneText) || t('nextcloud-vue', 'Done') }}\n\t\t</p>\n\n\t\t<template #actions>\n\t\t\t<NcButton :disabled=\"busy\" data-testid=\"cn-action-dialog-cancel\" @click=\"close\">\n\t\t\t\t{{ done ? t('nextcloud-vue', 'Close') : t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"!done\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\tdata-testid=\"cn-action-dialog-confirm\"\n\t\t\t\t@click=\"confirm\">\n\t\t\t\t<template v-if=\"confirmConfig.icon\" #icon>\n\t\t\t\t\t<CnIcon :name=\"confirmConfig.icon\" :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ text(confirmConfig.label) || t('nextcloud-vue', 'Confirm') }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { emit } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcButton, NcCheckboxRadioSwitch, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport CircleOutline from 'vue-material-design-icons/CircleOutline.vue'\nimport HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue'\nimport { fetchEndpointSource, interpolateUrlTokens } from '../../composables/useEndpointSource.js'\nimport { fillTemplate } from '../../utils/fillTemplate.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { CnDialog } from '../CnDialog/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\nimport { CnSearchSelect } from '../CnSearchSelect/index.js'\n\n/** How long typing rests before a search field searches, in ms. */\nconst SEARCH_DELAY = 250\n\n/** The page refresh channel the built-in widgets listen on. */\nconst PAGE_REFRESH = 'cn:page:refresh'\n\n/** Gives each dialog's reason field its own id. */\nlet reasonSeq = 0\n\n/**\n * CnActionDialog — the generic \"summary, checklist, reason, confirm\" dialog\n * for an act on a record, configured from the manifest (an `open-modal`\n * action's props), so an app does not hand-build each one. dossiq's archive\n * dialog (board DqArchiveren) is the first: the case, what its case type\n * keeps, a readiness checklist read from an endpoint, a reason, a read-only\n * note and Archive it.\n *\n * `config`:\n * - `title`, `subtitle`, `doneText`: texts, through the host translate;\n * `eyebrow` a template filled from the record (\"Close off · {identifier}\").\n * - `summary`: `{ source?, title, meta?, badge?, icon? }`: templates filled from\n * the record (`source` an endpointSource to read it from, else `object`).\n * - `facts`: `[{ title?, items: [{ label, value }] }]`, `value` a template.\n * - `checklist`: `{ title?, source, itemsPath?, labels?, required? }`: items\n * `{ id, met, label?, detail? }` read from `source`; `labels[id]` gives an\n * item's `{ label, detail?, unmetDetail? }`; the ids in `required` must be\n * met before the action can run. `met: null` reads as unknown.\n * - `permission`: `{ source, listPath?, match?, allowedPath, reasonPath? }`:\n * the action runs only while `allowedPath` reads true; `reasonPath` says\n * why not. With `listPath` the paths read the entry of that list whose\n * fields equal `match` (`{ act: \"archive\" }`).\n * - `fields`: `[{ field, type?: \"text\"|\"date\"|\"datetime\"|\"select\"|\"checkbox\", label?,\n * required?, options?: [{ value, label, fills? }], hint?, default? }]`: inputs\n * sent beside the reason, required by default; a select option's `fills`\n * sets other fields that are still empty. A `checkbox` is sent as a boolean,\n * starts at `default` (false), fills its `label` and `hint` from the record,\n * and is optional unless `required: true` (then it must be ticked). A\n * `search` field finds records of `source: { register, schema }` as the\n * reader types, shows each as `optionLabel` with `optionSecondary` under\n * it (templates on the found record), leaves the record in hand out with\n * `excludeSelf`, and sends the chosen record's id. Every field's `label`,\n * `hint` and `placeholder` are templates filled from the record.\n * - `reason`: `{ label?, hint?, required?, field?, rows? }`: a text area; required by\n * default; sent as `field` (default `reason`). `rows` is its height in lines\n * (default 2; board DqBesluit draws 4).\n * - `note`: `{ variant?, title?, text }`: a read-only note.\n * - `confirm`: `{ label, icon?, request?: { method?, url, body? }, action? }`.\n * `request` posts itself (`body` templates filled with the record and\n * `{reason}`); `action` dispatches a manifest action through the page.\n *\n * Tokens (`@objectId`, `@object.<field>`) resolve in every url.\n */\nexport default {\n\tname: 'CnActionDialog',\n\n\tcomponents: { CheckCircle, CircleOutline, CnDialog, CnIcon, CnSearchSelect, HelpCircleOutline, NcButton, NcCheckboxRadioSwitch, NcNoteCard, NcSelect, NcTextArea, NcTextField },\n\n\tinject: {\n\t\t/** The host app's translate (CnAppRoot `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The page's pre-bound action dispatcher (CnPageRenderer), for `confirm.action`. */\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The dialog's configuration (see the component docs).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The record's id, for the `@objectId` token. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The record, when the host has it: the summary and facts read it.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tobject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['close', 'done'],\n\n\tdata() {\n\t\treturn {\n\t\t\trecord: this.object,\n\t\t\titems: [],\n\t\t\tchecklistError: '',\n\t\t\tallowed: true,\n\t\t\treason: '',\n\t\t\tvalues: {},\n\t\t\t/** A search field's found options, by field name. */\n\t\t\tsearchOptions: {},\n\t\t\t/** The search field whose search runs, or ''. */\n\t\t\tsearching: '',\n\t\t\tbusy: false,\n\t\t\trefusal: '',\n\t\t\tdone: false,\n\t\t\treasonId: `cn-action-dialog-reason-${++reasonSeq}`,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {object} The token context. */\n\t\ttokenCtx() {\n\t\t\treturn { objectId: this.recordId, object: this.record || {} }\n\t\t},\n\n\t\t/**\n\t\t * The record's id: `objectId`, or the route's `id` when the prop is\n\t\t * empty or a token the opener could not resolve.\n\t\t *\n\t\t * @return {string|number}\n\t\t */\n\t\trecordId() {\n\t\t\tconst given = this.objectId\n\t\t\tif (given !== '' && given !== null && given !== undefined && !String(given).startsWith('@')) {\n\t\t\t\treturn given\n\t\t\t}\n\t\t\treturn (this.$route && this.$route.params && this.$route.params.id) || ''\n\t\t},\n\n\t\t/** @return {object} The confirm config. */\n\t\tconfirmConfig() {\n\t\t\treturn this.config.confirm && typeof this.config.confirm === 'object' ? this.config.confirm : {}\n\t\t},\n\n\t\t/**\n\t\t * The summary row, or null without one or before the record is known.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {{title: string, meta: string, badge: string}|null}\n\t\t */\n\t\tsummary() {\n\t\t\tconst def = this.config.summary\n\t\t\tif (!def || !this.record) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst title = this.fill(def.title)\n\t\t\treturn title ? { title, meta: this.fill(def.meta), badge: this.fill(def.badge) } : null\n\t\t},\n\n\t\t/** @return {Array<{title: string, facts: Array<{label: string, value: string}>}>} The fact groups. */\n\t\tfactSections() {\n\t\t\tif (!Array.isArray(this.config.facts) || !this.record) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst empty = t('nextcloud-vue', 'Not set')\n\t\t\treturn this.config.facts.map((section) => ({\n\t\t\t\ttitle: this.text(section.title),\n\t\t\t\tfacts: (Array.isArray(section.items) ? section.items : []).map((fact) => ({ label: this.text(fact.label), value: this.fill(fact.value) || empty })),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The checklist rows: label and detail from `labels` by id, else the item's own.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Array<{id: string, met: (boolean|null), label: string, detail: string}>}\n\t\t */\n\t\tchecklist() {\n\t\t\tconst labels = (this.config.checklist && this.config.checklist.labels) || {}\n\t\t\treturn this.items.map((item) => {\n\t\t\t\tconst met = item.met === null || item.met === undefined ? null : item.met === true\n\t\t\t\tconst own = labels[item.id] || {}\n\t\t\t\tconst detail = met === false && own.unmetDetail ? own.unmetDetail : (own.detail || item.detail || '')\n\t\t\t\treturn {\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tmet,\n\t\t\t\t\tlabel: this.fill(own.label || item.label || String(item.id), item),\n\t\t\t\t\tdetail: met === null && !item.detail ? t('nextcloud-vue', 'Could not be read') : this.fill(detail, item),\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/** @return {boolean} Whether every required item is met. */\n\t\trequiredMet() {\n\t\t\tconst required = (this.config.checklist && Array.isArray(this.config.checklist.required)) ? this.config.checklist.required.map(String) : []\n\t\t\treturn required.every((id) => this.items.some((item) => String(item.id) === id && item.met === true))\n\t\t},\n\n\t\t/** @return {boolean} Whether a reason is asked and needed. */\n\t\treasonNeeded() {\n\t\t\treturn Boolean(this.config.reason) && this.config.reason.required !== false\n\t\t},\n\n\t\t/** @return {string} The reason field's label. */\n\t\treasonLabel() {\n\t\t\treturn this.text(this.config.reason && this.config.reason.label) || t('nextcloud-vue', 'Reason')\n\t\t},\n\n\t\t/** @return {string} The note's NcNoteCard type. */\n\t\tnoteType() {\n\t\t\tconst variant = this.config.note && this.config.note.variant\n\t\t\treturn ['info', 'warning', 'error', 'success'].includes(variant) ? variant : 'info'\n\t\t},\n\n\t\t/**\n\t\t * Whether the action may run: allowed, required items met, a reason\n\t\t * when one is needed, and nothing in flight.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {boolean}\n\t\t */\n\t\tcanConfirm() {\n\t\t\treturn !this.busy && this.allowed && this.requiredMet && this.fieldsFilled && (!this.reasonNeeded || this.reason.trim() !== '')\n\t\t},\n\n\t\t/** @return {string} The eyebrow, filled from the record once it is known. */\n\t\teyebrowText() {\n\t\t\treturn this.record ? this.fill(this.config.eyebrow) || this.text(this.config.eyebrow) : this.text(this.config.eyebrow)\n\t\t},\n\n\t\t/**\n\t\t * The value of every field as sent: a checkbox as a boolean, the\n\t\t * others as entered ('' when empty).\n\t\t *\n\t\t * @return {object} Values by field name.\n\t\t */\n\t\tfieldValues() {\n\t\t\tconst out = { ...this.values }\n\t\t\tfor (const field of this.fields) {\n\t\t\t\tout[field.field] = field.type === 'checkbox' ? this.checkboxValue(field) : (this.values[field.field] ?? '')\n\t\t\t}\n\t\t\treturn out\n\t\t},\n\n\t\t/** @return {Array<object>} The fields with a name. */\n\t\tfields() {\n\t\t\treturn (Array.isArray(this.config.fields) ? this.config.fields : []).filter((f) => f && f.field)\n\t\t},\n\n\t\t/**\n\t\t * Whether every required field has a value.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog-fields-and-acts/specs/action-dialog/spec.md#requirement-an-action-dialog-asks-for-fields-and-reads-a-permission-from-a-list\n\t\t * @return {boolean}\n\t\t */\n\t\tfieldsFilled() {\n\t\t\treturn this.fields.every((f) => {\n\t\t\t\tif (f.type === 'checkbox') {\n\t\t\t\t\treturn f.required !== true || this.checkboxValue(f)\n\t\t\t\t}\n\t\t\t\treturn f.required === false || this.secretStored(f) || String(this.values[f.field] ?? '').trim() !== ''\n\t\t\t})\n\t\t},\n\t},\n\n\twatch: {\n\t\trecord: {\n\t\t\thandler() {\n\t\t\t\tthis.startValues()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait Promise.all([this.loadRecord(), this.loadChecklist(), this.loadPermission()])\n\t},\n\n\tbeforeUnmount() {\n\t\tclearTimeout(this.searchTimer)\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A config text through the host translate, '' for anything else.\n\t\t *\n\t\t * @param {unknown} value The text.\n\t\t * @return {string}\n\t\t */\n\t\t/**\n\t\t * Search a search field's records once typing rests.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @param {string} typed What the reader typed.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/action-dialog-search-field/specs/action-dialog-search-field/spec.md#requirement-an-action-dialog-field-can-search-records\n\t\t */\n\t\tonSearch(field, typed) {\n\t\t\tclearTimeout(this.searchTimer)\n\t\t\tthis.searchTimer = setTimeout(() => this.searchRecords(field, String(typed || '').trim()), SEARCH_DELAY)\n\t\t},\n\n\t\t/**\n\t\t * Read the records of a search field's `source` that match the term.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @param {string} term The term.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync searchRecords(field, term) {\n\t\t\tconst source = field.source || {}\n\t\t\tif (!term || !source.register || !source.schema) {\n\t\t\t\tthis.searchOptions = { ...this.searchOptions, [field.field]: [] }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.searching = field.field\n\t\t\ttry {\n\t\t\t\tconst url = generateUrl(`/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}`)\n\t\t\t\tconst { data } = await axios.get(url, { params: { _search: term, _limit: 10 } })\n\t\t\t\tconst rows = Array.isArray(data) ? data : (data && Array.isArray(data.results) ? data.results : [])\n\t\t\t\tconst self = String(this.recordId || '')\n\t\t\t\tconst options = rows\n\t\t\t\t\t.map((row) => ({ row, id: String(row.id || (row['@self'] && row['@self'].id) || '') }))\n\t\t\t\t\t.filter(({ id }) => id !== '' && !(field.excludeSelf && id === self))\n\t\t\t\t\t.map(({ row, id }) => {\n\t\t\t\t\t\tconst option = { id, label: this.fill(field.optionLabel || '{title}', row) || id }\n\t\t\t\t\t\tconst secondary = this.fill(field.optionSecondary, row)\n\t\t\t\t\t\treturn secondary ? { ...option, secondary } : option\n\t\t\t\t\t})\n\t\t\t\tthis.searchOptions = { ...this.searchOptions, [field.field]: options }\n\t\t\t} catch {\n\t\t\t\tthis.searchOptions = { ...this.searchOptions, [field.field]: [] }\n\t\t\t} finally {\n\t\t\t\tthis.searching = ''\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A checkbox field's state: what was ticked, else its `default`.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/action-dialog-checkbox-field/specs/action-dialog-checkbox-field/spec.md#requirement-an-action-dialog-field-can-be-a-checkbox\n\t\t */\n\t\tcheckboxValue(field) {\n\t\t\treturn field.field in this.values ? this.values[field.field] === true : field.default === true\n\t\t},\n\n\t\t/**\n\t\t * Tick or untick a checkbox field.\n\t\t *\n\t\t * @param {string} name The field.\n\t\t * @param {boolean} on Ticked.\n\t\t * @return {void}\n\t\t */\n\t\tsetChecked(name, on) {\n\t\t\tthis.values = { ...this.values, [name]: on === true }\n\t\t},\n\n\t\ttext(value) {\n\t\t\treturn typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''\n\t\t},\n\n\t\t/**\n\t\t * A template filled from a row (the record by default), translated first.\n\t\t *\n\t\t * @param {unknown} template The template.\n\t\t * @param {object} [row] The row.\n\t\t * @return {string}\n\t\t */\n\t\tfill(template, row) {\n\t\t\tif (typeof template !== 'string' || template === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn fillTemplate(this.cnTranslate(template), row || this.record || {}).trim()\n\t\t},\n\n\t\t/**\n\t\t * Read an endpoint, fresh.\n\t\t *\n\t\t * @param {object} source An endpointSource block.\n\t\t * @return {Promise<unknown>}\n\t\t */\n\t\tread(source) {\n\t\t\treturn fetchEndpointSource(source, this.tokenCtx, { fresh: true })\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadRecord() {\n\t\t\tconst source = this.config.summary && this.config.summary.source\n\t\t\tif (!source || !source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(source)\n\t\t\t\tthis.record = data && typeof data === 'object' ? data : this.record\n\t\t\t} catch {\n\t\t\t\t// The summary stays empty; the checklist and the action still work.\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadChecklist() {\n\t\t\tconst def = this.config.checklist\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst list = def.itemsPath ? readPath(data, def.itemsPath) : data\n\t\t\t\tthis.items = Array.isArray(list) ? list.filter((item) => item && item.id !== undefined) : []\n\t\t\t} catch {\n\t\t\t\tthis.items = []\n\t\t\t\tthis.checklistError = t('nextcloud-vue', 'Whether this is ready could not be read.')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The entry of a list whose fields equal `match`, or null.\n\t\t *\n\t\t * @param {unknown} list The list.\n\t\t * @param {object} [match] The fields to match.\n\t\t * @return {object|null}\n\t\t */\n\t\tmatchIn(list, match) {\n\t\t\tconst wanted = Object.entries(match || {})\n\t\t\treturn (Array.isArray(list) ? list : []).find((entry) => entry && wanted.every(([key, value]) => String(entry[key]) === String(value))) || null\n\t\t},\n\n\t\t/**\n\t\t * A select field's options, labels translated.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {Array<{id: string, label: string, fills?: object}>}\n\t\t */\n\t\toptionsOf(field) {\n\t\t\treturn (Array.isArray(field.options) ? field.options : []).map((o) => ({ id: String(o.value), label: this.text(o.label) || String(o.value), fills: o.fills }))\n\t\t},\n\n\t\t/**\n\t\t * A select field's chosen option.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {object|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\treturn this.optionsOf(field).find((o) => o.id === String(this.values[field.field] ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Set a field's value.\n\t\t *\n\t\t * @param {string} name The field.\n\t\t * @param {unknown} value The value.\n\t\t */\n\t\tsetValue(name, value) {\n\t\t\tthis.values = { ...this.values, [name]: value === null || value === undefined ? '' : String(value) }\n\t\t},\n\n\t\t/**\n\t\t * Choose a select option; its `fills` set the fields still empty.\n\t\t *\n\t\t * @param {object} field The select field.\n\t\t * @param {{id: string, fills?: object}|null} option The option.\n\t\t */\n\t\tpick(field, option) {\n\t\t\tthis.setValue(field.field, option ? option.id : '')\n\t\t\tfor (const [name, value] of Object.entries((option && option.fills) || {})) {\n\t\t\t\tif (String(this.values[name] ?? '').trim() === '') {\n\t\t\t\t\tthis.setValue(name, this.text(value) || value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadPermission() {\n\t\t\tconst def = this.config.permission\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst entry = def.listPath ? this.matchIn(readPath(data, def.listPath), def.match) : data\n\t\t\t\tthis.allowed = readPath(entry, def.allowedPath || 'allowed') === true\n\t\t\t\tthis.refusal = this.allowed || !def.reasonPath ? '' : String(readPath(entry, def.reasonPath) || '')\n\t\t\t} catch {\n\t\t\t\tthis.allowed = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run the action once: post `confirm.request`, or dispatch\n\t\t * `confirm.action`, then show the done text and refresh the page.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync confirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\tthis.refusal = ''\n\t\t\tconst reason = this.reason.trim()\n\t\t\ttry {\n\t\t\t\tconst request = this.confirmConfig.request\n\t\t\t\tif (request && request.url) {\n\t\t\t\t\tconst url = interpolateUrlTokens(request.url, this.tokenCtx)\n\t\t\t\t\tconst body = {}\n\t\t\t\t\tfor (const [key, value] of Object.entries(request.body || {})) {\n\t\t\t\t\t\tbody[key] = typeof value === 'string' ? fillTemplate(value, { ...(this.record || {}), reason }) : value\n\t\t\t\t\t}\n\t\t\t\t\tif (this.config.reason) {\n\t\t\t\t\t\tbody[this.config.reason.field || 'reason'] = reason\n\t\t\t\t\t}\n\t\t\t\t\tconst values = { ...this.fieldValues }\n\t\t\t\t\tfor (const field of this.fields) {\n\t\t\t\t\t\tif (field.type === 'secret' && String(this.values[field.field] ?? '') === '') {\n\t\t\t\t\t\t\tdelete values[field.field]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tObject.assign(body, values)\n\t\t\t\t\tconst method = String(request.method || 'POST').toLowerCase()\n\t\t\t\t\tawait axios[['post', 'put', 'patch', 'delete'].includes(method) ? method : 'post'](/^https?:\\/\\//i.test(url) ? url : generateUrl(url), body)\n\t\t\t\t} else if (this.confirmConfig.action && typeof this.cnDispatchAction === 'function') {\n\t\t\t\t\tawait this.cnDispatchAction({ ...this.confirmConfig.action, args: [...(this.confirmConfig.action.args || []), { ...this.fieldValues, reason }] })\n\t\t\t\t}\n\t\t\t\tthis.done = true\n\t\t\t\temit(PAGE_REFRESH, {})\n\t\t\t\t/** @event done The action ran. Payload: the field values and `reason`. */\n\t\t\t\tthis.$emit('done', { ...this.fieldValues, reason })\n\t\t\t} catch (failure) {\n\t\t\t\tconst data = failure && failure.response && failure.response.data\n\t\t\t\tthis.refusal = String((data && (data.message || data.error)) || t('nextcloud-vue', 'The action could not be completed.'))\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 * Start each field with `valuePath` from the record, unless it was\n\t\t * already edited.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog-secret-field/specs/action-dialog/spec.md#requirement-a-field-can-start-from-the-record-and-a-secret-is-write-only\n\t\t * @return {void}\n\t\t */\n\t\tstartValues() {\n\t\t\tif (!this.record) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst values = { ...this.values }\n\t\t\tfor (const field of this.fields) {\n\t\t\t\tif (field.valuePath && field.type !== 'secret' && !(field.field in values)) {\n\t\t\t\t\tconst value = readPath(this.record, field.valuePath)\n\t\t\t\t\tif (value !== null && value !== undefined) {\n\t\t\t\t\t\tvalues[field.field] = String(value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.values = values\n\t\t},\n\n\t\t/**\n\t\t * Whether a secret field has a value stored: `storedPath` reads true on the record.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {boolean}\n\t\t */\n\t\tsecretStored(field) {\n\t\t\treturn field.type === 'secret' && Boolean(field.storedPath && this.record && readPath(this.record, field.storedPath))\n\t\t},\n\n\t\t/** Close the dialog, unless the action is running. */\n\t\tclose() {\n\t\t\tif (this.busy) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/** @event close The dialog was closed. */\n\t\t\tthis.$emit('close')\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-action-dialog {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-action-dialog__summary {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 12px 14px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-action-dialog__summary-text {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tmin-width: 0;\n}\n\n.cn-action-dialog__badge {\n\tpadding: 3px 10px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 13px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n\n.cn-action-dialog__title {\n\tmargin: 0 0 8px;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n/* Facts in columns of at least 200px, each a label over its value above a\n hairline (DqArchiveren \"Bewaring volgens het zaaktype\"). */\n.cn-action-dialog__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n\tgap: 12px 24px;\n\tmargin: 0;\n}\n\n.cn-action-dialog__fact {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 3px;\n\tpadding-bottom: 10px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-action-dialog__facts dt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-action-dialog__facts dd {\n\tmargin: 0;\n\tfont-size: 15px;\n\tfont-weight: 500;\n}\n\n/* Checklist rows divided by hairlines, the detail at the row's end\n (DqArchiveren \"Klaar om te archiveren\"). */\n.cn-action-dialog__checks {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-action-dialog__check {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 2px 12px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-border);\n\tfont-size: 15px;\n}\n\n.cn-action-dialog__check-label {\n\tflex: 1 1 auto;\n\tfont-weight: 600;\n}\n\n.cn-action-dialog__check-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-action-dialog__check-icon--met {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-action-dialog__muted {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 14px;\n}\n\n/* A checkbox field is a tinted box with a 2px edge, its label bold and its\n hint under it (DqArchiveren). */\n.cn-action-dialog__checkbox {\n\tpadding: 12px 14px;\n\tborder: 2px solid var(--color-primary-element);\n\tborder-radius: var(--border-radius-element, 8px);\n\tbackground: var(--color-primary-element-light);\n}\n\n.cn-action-dialog__checkbox-text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n.cn-action-dialog__checkbox-label {\n\tfont-size: 15px;\n\tfont-weight: 600;\n}\n\n.cn-action-dialog__checkbox .cn-action-dialog__muted {\n\tfont-size: 13px;\n}\n\n.cn-action-dialog__field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-action-dialog__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["CnDialog","CnIcon","CnSearchSelect","t","axios"],"mappings":";;;;;;;;;;;;;;;;AAqLA;AACA,MAAM,YAAa,GAAE,IAAE;;AAEvB;AACA,MAAM,YAAW,GAAI,kBAAgB;;AAErC;AACA,IAAI,SAAQ,GAAI,EAAA;;AAEhB;AACC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;;;;AAIA;;;AAGA;AACA;AACA;;;AAGA;;;AAGA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;;AAGD,aAAe;AACd,CAAA,IAAI,EAAE,gBAAgB;;AAEtB,CAAA,UAAU,EAAE,EAAE,WAAW,EAAE,aAAa,YAAEA,UAAQ,UAAEC,YAAM,kBAAEC,YAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa;;AAE/K,CAAA,MAAM,EAAE;;AAEP,EAAA,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,KAAK;AAC5C;AACA,EAAA,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM;EACnC;;AAED,CAAA,KAAK,EAAE;AACN;;AAEC;;;AAGD,EAAA,MAAM,EAAE;GACP,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,OAAO,EAAE,CAAC;GACnB;;AAED;AACA,EAAA,QAAQ,EAAE;AACT,GAAA,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;GACtB,OAAO,EAAE,EAAE;GACX;;AAED;;AAEC;AACA;;AAED,EAAA,MAAM,EAAE;GACP,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,IAAI;GACb;EACD;;CAED,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;;AAExB,CAAA,IAAI,GAAG;AACN,EAAA,OAAO;AACN,GAAA,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,GAAA,KAAK,EAAE,EAAE;AACT,GAAA,cAAc,EAAE,EAAE;GAClB,OAAO,EAAE,IAAI;AACb,GAAA,MAAM,EAAE,EAAE;AACV,GAAA,MAAM,EAAE,EAAE;AACV;AACA,GAAA,aAAa,EAAE,EAAE;AACjB;GACA,SAAS,EAAE,EAAE;GACb,IAAI,EAAE,KAAK;GACX,OAAO,EAAE,EAAE;GACX,IAAI,EAAE,KAAK;GACX,QAAQ,EAAE,CAAC,wBAAwB,EAAE,EAAE,SAAS,CAAC,CAAC;AACnD,GAAA;EACA;;AAED,CAAA,QAAQ,EAAE;AACT;EACA,QAAQ,GAAG;GACV,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAO,IAAG,EAAG,EAAA;GAC5D;;AAED;;AAEC;AACA;;;EAGD,QAAQ,GAAG;GACV,MAAM,KAAM,GAAE,IAAI,CAAC,SAAO;AAC1B,GAAA,IAAI,KAAM,KAAI,EAAG,IAAG,KAAM,KAAI,QAAQ,KAAI,KAAM,SAAQ,IAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;IAC5F,OAAO,KAAI;AACZ,IAAA;AACA,GAAA,OAAO,CAAC,IAAI,CAAC,MAAO,IAAG,IAAI,CAAC,MAAM,CAAC,MAAK,IAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAC;GACxE;;AAED;AACA,EAAA,aAAa,GAAG;AACf,GAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAM,IAAK,OAAO,IAAI,CAAC,MAAM,CAAC,OAAQ,KAAI,QAAS,GAAE,IAAI,CAAC,MAAM,CAAC,OAAM,GAAI,EAAC;GAC/F;;AAED;;AAEC;;;;AAID,EAAA,OAAO,GAAG;GACT,MAAM,GAAI,GAAE,IAAI,CAAC,MAAM,CAAC,QAAM;GAC9B,IAAI,CAAC,GAAI,IAAG,CAAC,IAAI,CAAC,MAAM,EAAE;AACzB,IAAA,OAAO,IAAG;AACX,IAAA;AACA,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAA;AACjC,GAAA,OAAO,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,EAAA,GAAI,IAAG;GACtF;;AAED;AACA,EAAA,YAAY,GAAG;GACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA,IAAK,CAAC,IAAI,CAAC,MAAM,EAAE;AACtD,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,MAAM,KAAI,GAAIC,SAAC,CAAC,eAAe,EAAE,SAAS,EAAA;AAC1C,GAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM;AAC1C,IAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/B,IAAA,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAE,GAAE,OAAO,CAAC,KAAI,GAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAA,IAAK,KAAM,EAAC,CAAC,CAAC;AACpJ,IAAC,CAAC,CAAA;GACF;;AAED;AACC;AACA;;AAEA;;EAED,SAAS,GAAG;AACX,GAAA,MAAM,MAAK,GAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAQ,IAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,GAAC;GAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK;AAC/B,IAAA,MAAM,GAAI,GAAE,IAAI,CAAC,GAAI,KAAI,IAAG,IAAK,IAAI,CAAC,GAAI,KAAI,SAAU,GAAE,IAAK,GAAE,IAAI,CAAC,GAAE,KAAM,KAAG;IACjF,MAAM,GAAI,GAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA,IAAK,GAAC;AAChC,IAAA,MAAM,MAAK,GAAI,QAAQ,SAAS,GAAG,CAAC,cAAc,GAAG,CAAC,eAAe,GAAG,CAAC,MAAO,IAAG,IAAI,CAAC,UAAU,EAAE,EAAA;AACpG,IAAA,OAAO;AACN,KAAA,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,KAAA,GAAG;KACH,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAM,IAAG,IAAI,CAAC,KAAI,IAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAClE,KAAA,MAAM,EAAE,GAAE,KAAM,QAAQ,CAAC,IAAI,CAAC,SAASA,SAAC,CAAC,eAAe,EAAE,mBAAmB,CAAE,GAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACzG,KAAA;IACA,CAAA;GACD;;;EAGD,WAAW,GAAG;AACb,GAAA,MAAM,QAAO,GAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAU,IAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAA,GAAI,GAAC;AAC1I,GAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAE,KAAI,EAAG,IAAG,IAAI,CAAC,GAAE,KAAM,IAAI,CAAC,CAAA;GACpG;;;AAGD,EAAA,YAAY,GAAG;AACd,GAAA,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAE,IAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAS,KAAI,KAAI;GAC1E;;AAED;EACA,WAAW,GAAG;AACb,GAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAO,IAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAA,IAAKA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAA;GAC/F;;AAED;EACA,QAAQ,GAAG;GACV,MAAM,OAAQ,GAAE,IAAI,CAAC,MAAM,CAAC,IAAK,IAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAM;AAC3D,GAAA,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAA,GAAI,UAAU,MAAK;GAClF;;AAED;;AAEC;AACA;;AAEA;;EAED,UAAU,GAAG;GACZ,OAAO,CAAC,IAAI,CAAC,IAAG,IAAK,IAAI,CAAC,OAAM,IAAK,IAAI,CAAC,WAAU,IAAK,IAAI,CAAC,YAAa,KAAI,CAAC,IAAI,CAAC,YAAW,IAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,KAAM,EAAE,CAAA;GAC9H;;AAED;EACA,WAAW,GAAG;GACb,OAAO,IAAI,CAAC,MAAO,GAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,IAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAE,GAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;GACrH;;AAED;;;AAGC;AACA;;EAED,WAAW,GAAG;GACb,MAAM,GAAE,GAAI,EAAE,GAAG,IAAI,CAAC,MAAO,GAAA;GAC7B,KAAK,MAAM,KAAI,IAAK,IAAI,CAAC,MAAM,EAAE;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,GAAE,KAAK,CAAC,SAAS,UAAW,GAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAA,IAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,IAAG,EAAE,EAAA;AAC3G,IAAA;AACA,GAAA,OAAO,GAAE;GACT;;AAED;AACA,EAAA,MAAM,GAAG;AACR,GAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,GAAI,IAAI,CAAC,MAAM,CAAC,MAAK,GAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAE,IAAG,CAAC,CAAC,KAAK,CAAA;GAC/F;;AAED;AACC;AACA;AACA;AACA;;AAED,EAAA,YAAY,GAAG;GACd,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;IAC/B,IAAI,CAAC,CAAC,SAAS,UAAU,EAAE;AAC1B,KAAA,OAAO,CAAC,CAAC,QAAO,KAAM,QAAQ,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;AACnD,KAAA;AACA,IAAA,OAAO,CAAC,CAAC,QAAO,KAAM,KAAI,IAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAE,IAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,OAAO,EAAC;IACtG,CAAA;GACD;EACD;;AAED,CAAA,KAAK,EAAE;AACN,EAAA,MAAM,EAAE;AACP,GAAA,OAAO,GAAG;AACT,IAAA,IAAI,CAAC,WAAW,GAAC;IACjB;;AAED,GAAA,SAAS,EAAE,IAAI;GACf;EACD;;AAED,CAAA,MAAM,OAAO,GAAG;AACf,EAAA,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,EAAA;EAClF;;AAED,CAAA,aAAa,GAAG;EACf,YAAY,CAAC,IAAI,CAAC,WAAW,EAAA;EAC7B;;AAED,CAAA,OAAO,EAAE;KACRA,SAAC;;AAED;;AAEC;;AAEA;;AAED;AACC;AACA;;AAEA;;AAEA;;AAED,EAAA,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE;GACtB,YAAY,CAAC,IAAI,CAAC,WAAW,EAAA;GAC7B,IAAI,CAAC,WAAY,GAAE,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,EAAA;GACvG;;AAED;;AAEC;;;;;AAKD,EAAA,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE;GAChC,MAAM,MAAK,GAAI,KAAK,CAAC,MAAK,IAAK,GAAC;AAChC,GAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAO,IAAK,CAAC,MAAM,CAAC,MAAM,EAAE;IAChD,IAAI,CAAC,aAAc,GAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,EAAG,GAAA;IAChE,MAAK;AACN,IAAA;GACA,IAAI,CAAC,SAAU,GAAE,KAAK,CAAC,MAAI;AAC3B,GAAA,IAAI;AACH,IAAA,MAAM,GAAI,GAAE,WAAW,CAAC,CAAC,+BAA+B,EAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAA;AACpI,IAAA,MAAM,EAAE,IAAK,EAAA,GAAI,MAAMC,cAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAC,IAAK,EAAA;AAC/E,IAAA,MAAM,IAAG,GAAI,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,QAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA,GAAI,IAAI,CAAC,OAAQ,GAAE,EAAE,EAAA;AAClG,IAAA,MAAM,IAAK,GAAE,MAAM,CAAC,IAAI,CAAC,QAAO,IAAK,EAAE,EAAA;AACvC,IAAA,MAAM,OAAM,GAAI,IAAG;AAClB,MAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAC,KAAM,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAA,IAAK,EAAE,CAAA,EAAG,CAAC,CAAA;MACrF,MAAM,CAAC,CAAC,EAAE,EAAG,EAAC,KAAK,EAAC,KAAM,EAAG,IAAG,EAAE,KAAK,CAAC,WAAY,IAAG,EAAG,KAAI,IAAI,CAAC,CAAA;AACpE,MAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAC,EAAG,KAAK;AACrB,MAAA,MAAM,MAAK,GAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAU,IAAK,SAAS,EAAE,GAAG,CAAA,IAAK,EAAG,GAAA;MACjF,MAAM,SAAU,GAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,EAAA;AACtD,MAAA,OAAO,SAAQ,GAAI,EAAE,GAAG,MAAM,EAAE,WAAY,GAAE,MAAK;MACnD,EAAA;AACF,IAAA,IAAI,CAAC,aAAc,GAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,OAAQ,GAAA;AACtE,IAAA,CAAE,MAAM;IACP,IAAI,CAAC,aAAc,GAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,EAAG,GAAA;AACjE,IAAA,SAAU;AACT,IAAA,IAAI,CAAC,SAAQ,GAAI,GAAC;AACnB,IAAA;GACA;;AAED;;AAEC;;AAEA;AACA;;AAED,EAAA,aAAa,CAAC,KAAK,EAAE;AACpB,GAAA,OAAO,KAAK,CAAC,KAAI,IAAK,IAAI,CAAC,MAAK,GAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,KAAI,IAAG,GAAI,KAAK,CAAC,OAAQ,KAAI,IAAG;GAC7F;;AAED;;AAEC;;;;;AAKD,EAAA,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE;AACpB,GAAA,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,OAAO,IAAK,GAAA;GACpD;;EAED,IAAI,CAAC,KAAK,EAAE;AACX,GAAA,OAAO,OAAO,KAAM,KAAI,QAAO,IAAK,KAAI,KAAM,EAAG,GAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA,GAAI,EAAC;GAC9E;;AAED;;AAEC;AACA;;AAEA;;AAED,EAAA,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;AACnB,GAAA,IAAI,OAAO,aAAa,YAAY,QAAS,KAAI,EAAE,EAAE;AACpD,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,GAAI,IAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAC;GAC/E;;AAED;AACC;AACA;AACA;;;EAGD,IAAI,CAAC,MAAM,EAAE;GACZ,OAAO,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAG,EAAG,CAAA;GACjE;;;AAGD,EAAA,MAAM,UAAU,GAAG;GAClB,MAAM,MAAO,GAAE,IAAI,CAAC,MAAM,CAAC,OAAQ,IAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAK;GAC/D,IAAI,CAAC,MAAK,IAAK,CAAC,MAAM,CAAC,GAAG,EAAE;IAC3B,MAAK;AACN,IAAA;AACA,GAAA,IAAI;AACH,IAAA,MAAM,IAAG,GAAI,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAA;IACnC,IAAI,CAAC,MAAK,GAAI,IAAG,IAAK,OAAO,SAAS,QAAO,GAAI,IAAG,GAAI,IAAI,CAAC,OAAK;AACnE,IAAA,CAAE,MAAM;;AAER,IAAA;GACA;;;AAGD,EAAA,MAAM,aAAa,GAAG;GACrB,MAAM,GAAE,GAAI,IAAI,CAAC,MAAM,CAAC,UAAQ;AAChC,GAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAO,IAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;IAC3C,MAAK;AACN,IAAA;AACA,GAAA,IAAI;AACH,IAAA,MAAM,IAAK,GAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAA;IACvC,MAAM,IAAG,GAAI,GAAG,CAAC,SAAU,GAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAE,GAAE,KAAG;AAChE,IAAA,IAAI,CAAC,KAAM,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,GAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAK,IAAG,IAAI,CAAC,EAAC,KAAM,SAAS,CAAA,GAAI,GAAC;AAC5F,IAAA,CAAE,MAAM;IACP,IAAI,CAAC,KAAM,GAAE,GAAC;AACd,IAAA,IAAI,CAAC,cAAa,GAAID,SAAC,CAAC,eAAe,EAAE,0CAA0C,EAAA;AACpF,IAAA;GACA;;AAED;;AAEC;;AAEA;AACA;;AAED,EAAA,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;AACpB,GAAA,MAAM,SAAS,MAAM,CAAC,OAAO,CAAC,KAAI,IAAK,EAAE,EAAA;AACzC,GAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAE,GAAE,IAAG,GAAI,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,KAAI,IAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,KAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,IAAK,IAAG;GAC9I;;AAED;AACC;AACA;;;;AAID,EAAA,SAAS,CAAC,KAAK,EAAE;AAChB,GAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAE,GAAE,KAAK,CAAC,OAAM,GAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA,IAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAI,EAAG,CAAC,CAAA;GAC7J;;AAED;;AAEC;;AAEA;;AAED,EAAA,cAAc,CAAC,KAAK,EAAE;AACrB,GAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAG,KAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA,IAAK,EAAE,CAAC,CAAA,IAAK,IAAG;GAChG;;AAED;AACC;AACA;;;;AAID,EAAA,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;AACrB,GAAA,IAAI,CAAC,MAAK,GAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,KAAM,KAAI,IAAK,IAAG,UAAU,SAAU,GAAE,EAAG,GAAE,MAAM,CAAC,KAAK,CAAE,GAAA;GACnG;;AAED;;AAEC;AACA;;;AAGD,EAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;AACnB,GAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,CAAC,EAAG,GAAE,EAAE,EAAA;AAClD,GAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAE,IAAG,MAAM,CAAC,OAAO,CAAC,CAAC,MAAK,IAAK,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE;AAC3E,IAAA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,IAAG,EAAE,CAAC,CAAC,IAAI,EAAG,KAAI,EAAE,EAAE;AAClD,KAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,EAAA;AAC9C,KAAA;AACD,IAAA;GACA;;;AAGD,EAAA,MAAM,cAAc,GAAG;AACtB,GAAA,MAAM,GAAI,GAAE,IAAI,CAAC,MAAM,CAAC,WAAS;AACjC,GAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAO,IAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;IAC3C,MAAK;AACN,IAAA;AACA,GAAA,IAAI;AACH,IAAA,MAAM,IAAK,GAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAA;AACvC,IAAA,MAAM,KAAM,GAAE,GAAG,CAAC,QAAS,GAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,KAAG;IACxF,IAAI,CAAC,OAAM,GAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,WAAY,IAAG,SAAS,CAAE,KAAI,KAAG;AACpE,IAAA,IAAI,CAAC,OAAM,GAAI,IAAI,CAAC,OAAQ,IAAG,CAAC,GAAG,CAAC,UAAW,GAAE,EAAC,GAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,KAAK,EAAE,EAAA;AACnG,IAAA,CAAE,MAAM;AACP,IAAA,IAAI,CAAC,OAAQ,GAAE,MAAI;AACpB,IAAA;GACA;;AAED;;;AAGC;;;;AAID,EAAA,MAAM,OAAO,GAAG;AACf,GAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;IACrB,MAAK;AACN,IAAA;GACA,IAAI,CAAC,IAAK,GAAE,KAAG;AACf,GAAA,IAAI,CAAC,OAAQ,GAAE,GAAC;GAChB,MAAM,MAAO,GAAE,IAAI,CAAC,MAAM,CAAC,IAAI,GAAC;AAChC,GAAA,IAAI;AACH,IAAA,MAAM,UAAU,IAAI,CAAC,aAAa,CAAC,QAAM;IACzC,IAAI,OAAM,IAAK,OAAO,CAAC,GAAG,EAAE;KAC3B,MAAM,GAAI,GAAE,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAA;KAC3D,MAAM,IAAK,GAAE,GAAC;KACd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAA,IAAK,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAK,IAAG,EAAE,CAAC,EAAE;AAC9D,MAAA,IAAI,CAAC,GAAG,CAAE,GAAE,OAAO,KAAI,KAAM,QAAO,GAAI,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAA,GAAI,MAAI;AACvG,MAAA;KACA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;MACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAI,IAAK,QAAQ,CAAE,GAAE,OAAK;AACnD,MAAA;AACA,KAAA,MAAM,MAAK,GAAI,EAAE,GAAG,IAAI,CAAC,WAAY,GAAA;KACrC,KAAK,MAAM,KAAI,IAAK,IAAI,CAAC,MAAM,EAAE;AAChC,MAAA,IAAI,KAAK,CAAC,IAAG,KAAM,QAAS,IAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA,IAAK,EAAE,CAAA,KAAM,EAAE,EAAE;OAC7E,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAA;AAC1B,OAAA;AACD,MAAA;KACA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAA;KAC1B,MAAM,MAAK,GAAI,MAAM,CAAC,OAAO,CAAC,MAAO,IAAG,MAAM,CAAC,CAAC,WAAW,GAAC;AAC5D,KAAA,MAAMC,cAAK,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAA,GAAI,MAAO,GAAE,MAAM,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAE,GAAE,GAAI,GAAE,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAA;AAC5I,KAAA,MAAO,IAAI,IAAI,CAAC,aAAa,CAAC,MAAK,IAAK,OAAO,IAAI,CAAC,gBAAe,KAAM,UAAU,EAAE;AACpF,KAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAG,IAAK,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,MAAO,EAAC,GAAG,EAAA;AACjJ,KAAA;IACA,IAAI,CAAC,IAAK,GAAE,KAAG;AACf,IAAA,IAAI,CAAC,YAAY,EAAE,EAAE,EAAA;;IAErB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAA;AACnD,IAAA,CAAE,OAAO,OAAO,EAAE;IACjB,MAAM,IAAG,GAAI,OAAQ,IAAG,OAAO,CAAC,QAAO,IAAK,OAAO,CAAC,QAAQ,CAAC,KAAG;IAChE,IAAI,CAAC,OAAM,GAAI,MAAM,CAAC,CAAC,IAAK,KAAI,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,KAAKD,SAAC,CAAC,eAAe,EAAE,oCAAoC,CAAC,EAAA;AACzH,IAAA,SAAU;AACT,IAAA,IAAI,CAAC,IAAG,GAAI,MAAI;AACjB,IAAA;GACA;;AAED;;AAEC;AACA;AACA;;;EAGD,WAAW,GAAG;AACb,GAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;IACjB,MAAK;AACN,IAAA;GACA,MAAM,MAAK,GAAI,EAAE,GAAG,IAAI,CAAC,MAAO,GAAA;GAChC,KAAK,MAAM,KAAI,IAAK,IAAI,CAAC,MAAM,EAAE;AAChC,IAAA,IAAI,KAAK,CAAC,SAAQ,IAAK,KAAK,CAAC,IAAG,KAAM,QAAO,IAAK,EAAE,KAAK,CAAC,KAAI,IAAK,MAAM,CAAC,EAAE;KAC3E,MAAM,KAAM,GAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAA;AACnD,KAAA,IAAI,KAAI,KAAM,QAAQ,KAAM,KAAI,SAAS,EAAE;AAC1C,MAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,GAAE,MAAM,CAAC,KAAK,EAAA;AACnC,MAAA;AACD,KAAA;AACD,IAAA;AACA,GAAA,IAAI,CAAC,SAAS,OAAK;GACnB;;AAED;AACC;AACA;;AAEA;;AAED,EAAA,YAAY,CAAC,KAAK,EAAE;GACnB,OAAO,KAAK,CAAC,IAAK,KAAI,YAAY,OAAO,CAAC,KAAK,CAAC,UAAS,IAAK,IAAI,CAAC,MAAK,IAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;GACpH;;AAED;AACA,EAAA,KAAK,GAAG;GACP,IAAI,IAAI,CAAC,IAAI,EAAE;IACd,MAAK;AACN,IAAA;AACA;AACA,GAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAA;GAClB;EACD;AACF;;;;"}
|
|
@@ -45,21 +45,31 @@ const _hoisted_14 = {
|
|
|
45
45
|
class: "cn-action-dialog__muted"
|
|
46
46
|
};
|
|
47
47
|
const _hoisted_15 = ["data-testid"];
|
|
48
|
-
const _hoisted_16 = {
|
|
48
|
+
const _hoisted_16 = { class: "cn-action-dialog__checkbox-text" };
|
|
49
|
+
const _hoisted_17 = { class: "cn-action-dialog__checkbox-label" };
|
|
50
|
+
const _hoisted_18 = {
|
|
51
|
+
key: 0,
|
|
52
|
+
class: "cn-action-dialog__muted"
|
|
53
|
+
};
|
|
54
|
+
const _hoisted_19 = {
|
|
55
|
+
key: 5,
|
|
56
|
+
class: "cn-action-dialog__muted"
|
|
57
|
+
};
|
|
58
|
+
const _hoisted_20 = {
|
|
49
59
|
key: 2,
|
|
50
60
|
class: "cn-action-dialog__field"
|
|
51
61
|
};
|
|
52
|
-
const
|
|
62
|
+
const _hoisted_21 = {
|
|
53
63
|
key: 0,
|
|
54
64
|
class: "cn-action-dialog__muted"
|
|
55
65
|
};
|
|
56
|
-
const
|
|
66
|
+
const _hoisted_22 = {
|
|
57
67
|
key: 4,
|
|
58
68
|
class: "cn-action-dialog__error",
|
|
59
69
|
role: "alert",
|
|
60
70
|
"data-testid": "cn-action-dialog-refusal"
|
|
61
71
|
};
|
|
62
|
-
const
|
|
72
|
+
const _hoisted_23 = {
|
|
63
73
|
key: 1,
|
|
64
74
|
role: "status",
|
|
65
75
|
"data-testid": "cn-action-dialog-done"
|
|
@@ -70,6 +80,8 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
70
80
|
const _component_CheckCircle = resolveComponent("CheckCircle");
|
|
71
81
|
const _component_HelpCircleOutline = resolveComponent("HelpCircleOutline");
|
|
72
82
|
const _component_CircleOutline = resolveComponent("CircleOutline");
|
|
83
|
+
const _component_NcCheckboxRadioSwitch = resolveComponent("NcCheckboxRadioSwitch");
|
|
84
|
+
const _component_CnSearchSelect = resolveComponent("CnSearchSelect");
|
|
73
85
|
const _component_NcSelect = resolveComponent("NcSelect");
|
|
74
86
|
const _component_NcTextField = resolveComponent("NcTextField");
|
|
75
87
|
const _component_NcTextArea = resolveComponent("NcTextArea");
|
|
@@ -216,36 +228,70 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
216
228
|
class: "cn-action-dialog__field",
|
|
217
229
|
"data-testid": `cn-action-dialog-field-${field.field}`
|
|
218
230
|
}, [
|
|
219
|
-
(field.type === '
|
|
220
|
-
? (openBlock(), createBlock(
|
|
231
|
+
(field.type === 'checkbox')
|
|
232
|
+
? (openBlock(), createBlock(_component_NcCheckboxRadioSwitch, {
|
|
221
233
|
key: 0,
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
234
|
+
class: "cn-action-dialog__checkbox",
|
|
235
|
+
modelValue: $options.checkboxValue(field),
|
|
236
|
+
type: "checkbox",
|
|
237
|
+
"onUpdate:modelValue": (on) => $options.setChecked(field.field, on)
|
|
238
|
+
}, {
|
|
239
|
+
default: withCtx(() => [
|
|
240
|
+
createElementVNode("span", _hoisted_16, [
|
|
241
|
+
createElementVNode("strong", _hoisted_17, toDisplayString($options.fill(field.label) || field.field), 1 /* TEXT */),
|
|
242
|
+
(field.hint)
|
|
243
|
+
? (openBlock(), createElementBlock("span", _hoisted_18, toDisplayString($options.fill(field.hint)), 1 /* TEXT */))
|
|
244
|
+
: createCommentVNode("v-if", true)
|
|
245
|
+
])
|
|
246
|
+
]),
|
|
247
|
+
_: 2 /* DYNAMIC */
|
|
248
|
+
}, 1032 /* PROPS, DYNAMIC_SLOTS */, ["modelValue", "onUpdate:modelValue"]))
|
|
249
|
+
: (field.type === 'search')
|
|
250
|
+
? (openBlock(), createBlock(_component_CnSearchSelect, {
|
|
230
251
|
key: 1,
|
|
231
|
-
modelValue: $data.values[field.field] ||
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
252
|
+
modelValue: $data.values[field.field] || null,
|
|
253
|
+
options: $data.searchOptions[field.field] || [],
|
|
254
|
+
inputLabel: $options.fill(field.label) || field.field,
|
|
255
|
+
labelOutside: true,
|
|
256
|
+
loading: $data.searching === field.field,
|
|
257
|
+
filterable: false,
|
|
258
|
+
placeholder: $options.fill(field.placeholder),
|
|
259
|
+
onSearch: (typed) => $options.onSearch(field, typed),
|
|
260
|
+
"onUpdate:modelValue": (value) => $options.setValue(field.field, value && typeof value === 'object' ? value.id : value)
|
|
261
|
+
}, null, 8 /* PROPS */, ["modelValue", "options", "inputLabel", "loading", "placeholder", "onSearch", "onUpdate:modelValue"]))
|
|
262
|
+
: (field.type === 'select')
|
|
263
|
+
? (openBlock(), createBlock(_component_NcSelect, {
|
|
264
|
+
key: 2,
|
|
265
|
+
modelValue: $options.selectedOption(field),
|
|
266
|
+
options: $options.optionsOf(field),
|
|
267
|
+
inputLabel: $options.fill(field.label) || field.field,
|
|
268
|
+
clearable: field.required === false,
|
|
269
|
+
"onUpdate:modelValue": (option) => $options.pick(field, option)
|
|
270
|
+
}, null, 8 /* PROPS */, ["modelValue", "options", "inputLabel", "clearable", "onUpdate:modelValue"]))
|
|
271
|
+
: (field.type === 'secret')
|
|
272
|
+
? (openBlock(), createBlock(_component_NcTextField, {
|
|
273
|
+
key: 3,
|
|
274
|
+
modelValue: $data.values[field.field] || '',
|
|
275
|
+
type: "password",
|
|
276
|
+
autocomplete: "new-password",
|
|
277
|
+
label: $options.text(field.label) || field.field,
|
|
278
|
+
placeholder: $options.secretStored(field) ? $options.t('nextcloud-vue', 'Stored. Type a new value to replace it.') : '',
|
|
279
|
+
"onUpdate:modelValue": (value) => $options.setValue(field.field, value)
|
|
280
|
+
}, null, 8 /* PROPS */, ["modelValue", "label", "placeholder", "onUpdate:modelValue"]))
|
|
281
|
+
: (openBlock(), createBlock(_component_NcTextField, {
|
|
282
|
+
key: 4,
|
|
283
|
+
modelValue: $data.values[field.field] || '',
|
|
284
|
+
type: field.type === 'datetime' ? 'datetime-local' : (field.type === 'date' ? 'date' : 'text'),
|
|
285
|
+
label: $options.fill(field.label) || field.field,
|
|
286
|
+
"onUpdate:modelValue": (value) => $options.setValue(field.field, value)
|
|
287
|
+
}, null, 8 /* PROPS */, ["modelValue", "type", "label", "onUpdate:modelValue"])),
|
|
288
|
+
(field.hint && field.type !== 'checkbox')
|
|
289
|
+
? (openBlock(), createElementBlock("span", _hoisted_19, toDisplayString($options.fill(field.hint)), 1 /* TEXT */))
|
|
290
|
+
: createCommentVNode("v-if", true)
|
|
245
291
|
], 8 /* PROPS */, _hoisted_15))
|
|
246
292
|
}), 128 /* KEYED_FRAGMENT */)),
|
|
247
293
|
($props.config.reason)
|
|
248
|
-
? (openBlock(), createElementBlock("div",
|
|
294
|
+
? (openBlock(), createElementBlock("div", _hoisted_20, [
|
|
249
295
|
createVNode(_component_NcTextArea, {
|
|
250
296
|
id: $data.reasonId,
|
|
251
297
|
modelValue: $data.reason,
|
|
@@ -257,7 +303,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
257
303
|
"data-testid": "cn-action-dialog-reason"
|
|
258
304
|
}, null, 8 /* PROPS */, ["id", "modelValue", "label", "rows"]),
|
|
259
305
|
($props.config.reason.hint)
|
|
260
|
-
? (openBlock(), createElementBlock("span",
|
|
306
|
+
? (openBlock(), createElementBlock("span", _hoisted_21, toDisplayString($options.text($props.config.reason.hint)), 1 /* TEXT */))
|
|
261
307
|
: createCommentVNode("v-if", true)
|
|
262
308
|
]))
|
|
263
309
|
: createCommentVNode("v-if", true),
|
|
@@ -275,10 +321,10 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
275
321
|
}, 8 /* PROPS */, ["type", "heading"]))
|
|
276
322
|
: createCommentVNode("v-if", true),
|
|
277
323
|
($data.refusal)
|
|
278
|
-
? (openBlock(), createElementBlock("p",
|
|
324
|
+
? (openBlock(), createElementBlock("p", _hoisted_22, toDisplayString($data.refusal), 1 /* TEXT */))
|
|
279
325
|
: createCommentVNode("v-if", true)
|
|
280
326
|
]))
|
|
281
|
-
: (openBlock(), createElementBlock("p",
|
|
327
|
+
: (openBlock(), createElementBlock("p", _hoisted_23, toDisplayString($options.text($props.config.doneText) || $options.t('nextcloud-vue', 'Done')), 1 /* TEXT */))
|
|
282
328
|
]),
|
|
283
329
|
_: 1 /* STABLE */
|
|
284
330
|
}, 8 /* PROPS */, ["name", "eyebrow", "subtitle", "noClose", "onClosing"]))
|