@conduction/nextcloud-vue 2.83.0 → 2.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  2. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +1 -1
  3. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  5. package/dist/esm/components/CnBodySections/CnBodySections.vue.js +1 -1
  6. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js +22 -1
  7. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js.map +1 -1
  8. package/dist/esm/components/CnBodySections/CnBodySections.vue3.js.map +1 -1
  9. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
  10. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +47 -4
  11. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
  12. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
  13. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
  14. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +125 -3
  15. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js +3 -3
  17. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  19. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +5 -0
  20. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  22. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue.js +1 -1
  23. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js +1 -1
  24. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js.map +1 -1
  25. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue3.js.map +1 -1
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +203 -4
  27. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  28. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  29. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  30. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +38 -1
  31. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  32. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +45 -5
  33. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  34. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue.js +1 -1
  35. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js +1 -1
  36. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js.map +1 -1
  37. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue3.js.map +1 -1
  38. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js +29 -6
  39. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  42. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +31 -2
  43. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  44. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  45. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  46. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +37 -2
  47. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  48. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  49. package/dist/esm/components/CnReportsPage/CnReportsPage.vue.js +1 -1
  50. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js +135 -2
  51. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
  52. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js +95 -43
  53. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js.map +1 -1
  54. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue.js +1 -1
  55. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +72 -5
  56. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  57. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +33 -8
  58. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  59. package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
  60. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +1 -1
  61. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  62. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  63. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue.js +1 -1
  64. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +17 -2
  65. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  66. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +1 -1
  67. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  69. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +33 -3
  70. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  71. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  72. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue.js +1 -1
  73. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js +16 -0
  74. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js.map +1 -1
  75. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js.map +1 -1
  76. package/dist/esm/dialogs/CnTransitionInputDialog.vue.js +1 -1
  77. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js +68 -6
  78. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js.map +1 -1
  79. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js +133 -105
  80. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js.map +1 -1
  81. package/dist/esm/l10n/en.json.js +16 -1
  82. package/dist/esm/l10n/en.json.js.map +1 -1
  83. package/dist/esm/l10n/nl.json.js +38 -1
  84. package/dist/esm/l10n/nl.json.js.map +1 -1
  85. package/dist/esm/library-style.js +1 -1
  86. package/dist/esm/nextcloud-vue.css +448 -296
  87. package/dist/esm/utils/buildManifest.js +37 -3
  88. package/dist/esm/utils/buildManifest.js.map +1 -1
  89. package/dist/esm/utils/detailWidgetVisibility.js +149 -0
  90. package/dist/esm/utils/detailWidgetVisibility.js.map +1 -0
  91. package/dist/esm/utils/formatMetric.js +39 -3
  92. package/dist/esm/utils/formatMetric.js.map +1 -1
  93. package/dist/esm/utils/resolveManifestTokens.js +1 -0
  94. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  95. package/dist/esm/utils/sentinelTokens.js +9 -0
  96. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  97. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  98. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  99. package/dist/nextcloud-vue.cjs.js +1706 -454
  100. package/dist/nextcloud-vue.cjs.js.map +2 -2
  101. package/dist/nextcloud-vue.css +448 -296
  102. package/l10n/en.json +16 -1
  103. package/l10n/nl.json +38 -1
  104. package/package.json +1 -1
  105. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +1 -1
  106. package/src/components/CnBodySections/CnBodySections.vue +22 -1
  107. package/src/components/CnCountdownWidget/CnCountdownWidget.vue +47 -4
  108. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +128 -6
  109. package/src/components/CnDashboardPage/CnDashboardPage.vue +5 -0
  110. package/src/components/CnDeltaWidget/CnDeltaWidget.vue +1 -1
  111. package/src/components/CnDetailPage/CnDetailPage.md +2 -0
  112. package/src/components/CnDetailPage/CnDetailPage.vue +203 -4
  113. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +63 -1
  114. package/src/components/CnGaugeWidget/CnGaugeWidget.vue +1 -1
  115. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +29 -6
  116. package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -1
  117. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +31 -2
  118. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +37 -2
  119. package/src/components/CnReportsPage/CnReportsPage.vue +179 -1
  120. package/src/components/CnStagesWidget/CnStagesWidget.vue +103 -6
  121. package/src/components/CnStatWidget/CnStatWidget.vue +1 -1
  122. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +34 -3
  123. package/src/components/CnTabsWidget/CnTabsWidget.vue +33 -3
  124. package/src/components/CnWalkthrough/CnWalkthrough.vue +16 -0
  125. package/src/css/form-field.css +14 -0
  126. package/src/css/form-widget.css +11 -0
  127. package/src/css/look-board-reports.css +58 -0
  128. package/src/css/look-board.css +12 -0
  129. package/src/dialogs/CnTransitionInputDialog.vue +87 -7
  130. package/src/schemas/app-manifest-v2.schema.json +23 -2
  131. package/src/utils/buildManifest.js +36 -2
  132. package/src/utils/detailWidgetVisibility.js +145 -0
  133. package/src/utils/formatMetric.js +38 -2
  134. package/src/utils/resolveManifestTokens.js +1 -0
  135. package/src/utils/sentinelTokens.js +9 -0
  136. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"CnTransitionInputDialog.vue3.js","sources":["../../../src/dialogs/CnTransitionInputDialog.vue?vue&type=template&id=ac83f832&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:look=\"look\"\n\t\t:width=\"width\"\n\t\tdefaultWidth=\"form\"\n\t\t:eyebrow=\"eyebrow\"\n\t\t:subtitle=\"subtitle\"\n\t\t:name=\"dialogTitle\"\n\t\tsize=\"normal\"\n\t\t@closing=\"$emit('close')\">\n\t\t<div\n\t\t\tclass=\"cn-transition-input\"\n\t\t\tdata-testid=\"cn-modal\"\n\t\t\tdata-testid-modal=\"cn-transition-input-dialog\">\n\t\t\t<!-- A refusal keeps this dialog open with what was typed still in\n\t\t\t it. Closing first and reporting behind it loses the work and\n\t\t\t asks the person to retype it from memory. -->\n\t\t\t<p v-if=\"error\"\n\t\t\t\tclass=\"cn-transition-input__error\"\n\t\t\t\tdata-testid=\"cn-transition-input-error\">\n\t\t\t\t{{ error }}\n\t\t\t</p>\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.key\"\n\t\t\t\tclass=\"cn-transition-input__field\"\n\t\t\t\t:class=\"{ 'cn-transition-input__field--refused': isRefused(field.key) }\"\n\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}`\">\n\t\t\t\t<!-- An input that points at another record is picked, never typed. -->\n\t\t\t\t<div v-if=\"field.widget === 'reference'\" class=\"cn-transition-input__reference\">\n\t\t\t\t\t<label class=\"cn-transition-input__label\">{{ requiredLabel(field) }}</label>\n\t\t\t\t\t<CnResourceSelect\n\t\t\t\t\t\t:register=\"field.referenceRegister\"\n\t\t\t\t\t\t:schema=\"String(field.reference.schema)\"\n\t\t\t\t\t\t:labelField=\"(field.picker && field.picker.labelField) || field.reference.labelField || 'name'\"\n\t\t\t\t\t\t:filter=\"(field.picker && field.picker.filter) || {}\"\n\t\t\t\t\t\t:exclude=\"excludedIds(field)\"\n\t\t\t\t\t\t:allowCreate=\"false\"\n\t\t\t\t\t\t:preload=\"true\"\n\t\t\t\t\t\t:inputLabel=\"requiredLabel(field)\"\n\t\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-picker-${field.key}`\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- An object input: its sub-properties, one field at a time. -->\n\t\t\t\t<fieldset v-else-if=\"field.widget === 'object'\" class=\"cn-transition-input__object\">\n\t\t\t\t\t<legend>{{ requiredLabel(field) }}</legend>\n\t\t\t\t\t<div v-for=\"sub in field.subFields\"\n\t\t\t\t\t\t:key=\"sub.key\"\n\t\t\t\t\t\tclass=\"cn-transition-input__subfield\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}-${sub.key}`\">\n\t\t\t\t\t\t<NcTextArea v-if=\"sub.widget === 'textarea'\"\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"sub.widget === 'checkbox'\"\n\t\t\t\t\t\t\t:modelValue=\"subValue(field.key, sub.key) === true\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event === true)\">\n\t\t\t\t\t\t\t{{ subLabel(sub) }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:type=\"sub.widget === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<p v-if=\"isSubRefused(field.key, sub.key)\"\n\t\t\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}.${sub.key}`\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'This value was not accepted.') }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\n\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t:modelValue=\"values[field.key] === true\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event === true)\">\n\t\t\t\t\t{{ requiredLabel(field) }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t<NcTextArea v-else-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\trows=\"4\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else-if=\"field.widget === 'number'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<p v-if=\"isRefused(field.key)\"\n\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}`\">\n\t\t\t\t\t{{ refusalFor(field.key) }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- A key the refusal names that this dialog never offered is not a\n\t\t\t field anybody can correct here. Saying so beats saying nothing:\n\t\t\t the request sent something the transition does not accept. -->\n\t\t\t<p v-for=\"key in unofferedRefusals\"\n\t\t\t\t:key=\"key\"\n\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t:data-testid=\"`cn-transition-input-error-${key}`\">\n\t\t\t\t{{ undeclaredMessage(key) }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tdata-testid=\"cn-transition-input-cancel\"\n\t\t\t\t@click=\"$emit('close')\">\n\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\tdata-testid=\"cn-transition-input-confirm\"\n\t\t\t\t@click=\"onConfirm\">\n\t\t\t\t{{ confirmLabel }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CnDialog from '../components/CnDialog/CnDialog.vue'\nimport CnResourceSelect from '../components/CnResourceSelect/CnResourceSelect.vue'\nimport { dialogBoardMixin } from '../mixins/dialogBoard.js'\nimport { fieldsFromSchema } from '../utils/schema.js'\n\n/**\n * CnTransitionInputDialog — collects a lifecycle transition's declared\n * `inputs` before the transition is applied.\n *\n * A schema's `x-openregister-lifecycle.transitions.<action>` block may declare\n * `inputs: [{ field, required }]`; the transition endpoint then accepts\n * `{ action, data: { <field>: <value> } }`. This dialog renders one input per\n * declared field, disables the confirm button until every `required: true`\n * field is filled, and emits the collected values — the parent\n * (`CnLifecycleActions`) performs the actual POST. Cancel emits `close`\n * without any confirm, so no request is made.\n *\n * Field rendering resolves each declared field against the object's JSON\n * Schema via `fieldsFromSchema()` when a `schema` is given: the label comes\n * from the property `title`, booleans render as a switch, numbers as a number\n * field, and long text (`maxLength > 255` or a `textarea`/`markdown` format)\n * as a textarea. Anything else — including a field the schema does not\n * declare — falls back to a plain labelled text input. Deliberately minimal:\n * text, textarea, number and checkbox cover transition inputs; this is not a\n * form engine (use `CnFormDialog` for full object forms).\n *\n * Lives in its own file under `src/dialogs/` per the modal-isolation rule.\n *\n * ```vue\n * <CnTransitionInputDialog\n * v-if=\"inputTransition\"\n * :transition=\"inputTransition\"\n * :schema=\"schema\"\n * @confirm=\"onInputConfirm\"\n * @close=\"inputTransition = null\" />\n * ```\n */\nexport default {\n\tname: 'CnTransitionInputDialog',\n\n\tcomponents: {\n\t\tCnResourceSelect,\n\t\tCnDialog,\n\t\tNcButton,\n\t\tNcTextField,\n\t\tNcTextArea,\n\t\tNcCheckboxRadioSwitch,\n\t},\n\n\tmixins: [dialogBoardMixin],\n\n\tprops: {\n\t\t/**\n\t\t * The transition being applied. `inputs` is the declared input list from\n\t\t * `x-openregister-lifecycle.transitions.<action>.inputs` (server-derived\n\t\t * or config-declared); `label` doubles as dialog title + confirm label.\n\t\t *\n\t\t * @type {{action?: string, label?: string, inputs?: Array<{field: string, required?: boolean}>}}\n\t\t */\n\t\ttransition: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The object's JSON Schema (with `properties`), used to resolve each\n\t\t * input's label, widget and helper text. Optional — undeclared fields\n\t\t * render as plain text inputs labelled by their field name.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The record the transition runs on. Gives `picker.excludeSelf` its id\n\t\t * to leave out, and the current value an object input is merged over.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tcurrentObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Register slug the reference pickers look in when the schema property\n\t\t * names none of its own.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tregister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The sentence a refused transition answered with. Present means the\n\t\t * dialog stayed open BECAUSE the attempt was refused, with everything\n\t\t * typed still in it.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The input keys the refusal named (`fields` in the 400 body). Each one\n\t\t * that this dialog offers is marked on its own field; each one it does\n\t\t * not is reported as a key the transition does not accept.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tfieldErrors: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether the parent is mid-POST. Keeps the confirm button from firing\n\t\t * a second attempt while the first is in flight.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tbusy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['confirm', 'close'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** @type {{[key: string]: unknown}} Collected input values, keyed by declared field name. */\n\t\t\tvalues: this.initialValues(),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** The declared inputs, normalised to `{ field, required }`. */\n\t\tinputs() {\n\t\t\tconst declared = Array.isArray(this.transition.inputs) ? this.transition.inputs : []\n\t\t\treturn declared\n\t\t\t\t.filter((input) => input && typeof input.field === 'string' && input.field !== '')\n\t\t\t\t.map((input) => ({\n\t\t\t\t\tfield: input.field,\n\t\t\t\t\trequired: input.required === true,\n\t\t\t\t\tpicker: input.picker && typeof input.picker === 'object' ? input.picker : null,\n\t\t\t\t\tfields: Array.isArray(input.fields) ? input.fields.filter((f) => typeof f === 'string') : null,\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * One renderable field descriptor per declared input. Schema-declared\n\t\t * fields come from `fieldsFromSchema()` (label from the property title,\n\t\t * widget from the type/format); the widget is then clamped to the minimal\n\t\t * set this dialog renders (text / textarea / number / checkbox). Fields\n\t\t * the schema does not declare fall back to a plain text input.\n\t\t */\n\t\tfields() {\n\t\t\tconst keys = this.inputs.map((input) => input.field)\n\t\t\tconst resolved = fieldsFromSchema(this.schema, { include: keys, includeReadOnly: true })\n\t\t\treturn this.inputs.map((input) => {\n\t\t\t\tconst field = resolved.find((f) => f.key === input.field)\n\t\t\t\tconst prop = (this.schema && this.schema.properties && this.schema.properties[input.field]) || null\n\t\t\t\tif (prop && prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\treturn this.objectField(input, prop)\n\t\t\t\t}\n\t\t\t\tif (!field) {\n\t\t\t\t\treturn { key: input.field, label: input.field, description: '', widget: 'text', required: input.required }\n\t\t\t\t}\n\t\t\t\tif (field.reference && field.reference.multiple !== true) {\n\t\t\t\t\tconst register = field.reference.register || this.register\n\t\t\t\t\tif (register !== '') {\n\t\t\t\t\t\treturn { ...field, widget: 'reference', referenceRegister: register, picker: input.picker, required: input.required }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { ...field, widget: this.clampWidget(field.widget), required: input.required }\n\t\t\t})\n\t\t},\n\n\t\t/** Dialog title — the transition's label, with a generic fallback. */\n\t\tdialogTitle() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Provide details')\n\t\t},\n\n\t\t/** Confirm button label — the transition's label per the contract. */\n\t\tconfirmLabel() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Confirm')\n\t\t},\n\n\t\t/** True when every `required: true` input holds a non-empty value. */\n\t\tcanConfirm() {\n\t\t\tif (this.busy === true) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.fields.every((field) => (field.widget === 'object'\n\t\t\t\t? field.subFields.every((sub) => !sub.required || this.isSubFilled(field.key, sub))\n\t\t\t\t: (!field.required || this.isFilled(field))))\n\t\t},\n\n\t\t/** The refused keys this dialog offers no field for. */\n\t\tunofferedRefusals() {\n\t\t\tconst offered = this.fields.map((field) => field.key)\n\t\t\treturn this.refusedKeys.filter((key) => !offered.includes(key))\n\t\t},\n\n\t\t/** The refusal's field keys, normalised to strings. */\n\t\trefusedKeys() {\n\t\t\tif (!Array.isArray(this.fieldErrors)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.fieldErrors.filter((key) => typeof key === 'string' && key !== '')\n\t\t},\n\t},\n\n\tmethods: {\n\t\t// Exposed to the template for the static button labels — the same\n\t\t// `methods: { t }` pattern the other dialogs in this folder use.\n\t\tt,\n\n\t\t/**\n\t\t * Whether the refusal named this field.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRefused(key) {\n\t\t\treturn this.refusedKeys.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * What to say beside a refused field.\n\t\t *\n\t\t * The KIND is decided here rather than read out of the refusal's\n\t\t * sentence. A field this dialog offers and the person left empty is a\n\t\t * missing required input; one it offers that carries a value was\n\t\t * refused for what is in it. Parsing the server's prose to tell those\n\t\t * apart would break the first time the sentence is reworded, and a\n\t\t * reworded sentence is not a contract change.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\trefusalFor(key) {\n\t\t\tconst field = this.fields.find((candidate) => candidate.key === key)\n\t\t\tif (field && !this.isFilled(field)) {\n\t\t\t\treturn t('nextcloud-vue', 'This field is required.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'This value was not accepted.')\n\t\t},\n\n\t\t/**\n\t\t * What to say about a refused key this dialog does not offer.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\tundeclaredMessage(key) {\n\t\t\treturn t('nextcloud-vue', 'This action does not accept the field \"{field}\".', { field: key })\n\t\t},\n\n\t\t/**\n\t\t * The descriptor of an object input: its sub-properties (narrowed to the\n\t\t * input's `fields` when it names them), each with its own widget.\n\t\t * A sub-field is required when the input names it in `fields` and the\n\t\t * sub-schema lists it as required, or when the whole input is required\n\t\t * and it is the only one asked.\n\t\t *\n\t\t * @param {object} input The normalised input.\n\t\t * @param {object} prop The object property's schema.\n\t\t * @return {object} The field descriptor.\n\t\t */\n\t\tobjectField(input, prop) {\n\t\t\tconst subs = fieldsFromSchema(prop, { includeReadOnly: true, ...(input.fields ? { include: input.fields } : {}) })\n\t\t\tconst required = Array.isArray(prop.required) ? prop.required : []\n\t\t\tconst only = subs.length === 1\n\t\t\treturn {\n\t\t\t\tkey: input.field,\n\t\t\t\tlabel: prop.title || input.field,\n\t\t\t\tdescription: prop.description || '',\n\t\t\t\twidget: 'object',\n\t\t\t\trequired: input.required,\n\t\t\t\tsubFields: subs.map((sub) => ({\n\t\t\t\t\t...sub,\n\t\t\t\t\twidget: this.clampWidget(sub.widget),\n\t\t\t\t\trequired: (input.fields ? required.includes(sub.key) : sub.required === true) || (input.required && only),\n\t\t\t\t})),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Ids a reference picker must not offer: the current record, when the\n\t\t * input's `picker.excludeSelf` says so.\n\t\t *\n\t\t * @param {object} field The reference field descriptor.\n\t\t * @return {string[]} The ids to leave out.\n\t\t */\n\t\texcludedIds(field) {\n\t\t\tif (!field.picker || field.picker.excludeSelf !== true || !this.currentObject) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst self = this.currentObject\n\t\t\treturn [self.id, self.uuid, self['@self'] && self['@self'].id].filter((id) => id !== undefined && id !== null).map(String)\n\t\t},\n\n\t\t/**\n\t\t * Label of a sub-field, with the required marker.\n\t\t *\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tsubLabel(sub) {\n\t\t\treturn sub.required ? `${sub.label} *` : sub.label\n\t\t},\n\n\t\t/**\n\t\t * A typed sub-value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {unknown}\n\t\t */\n\t\tsubValue(key, sub) {\n\t\t\tconst group = this.values[key]\n\t\t\treturn group && typeof group === 'object' ? group[sub] : undefined\n\t\t},\n\n\t\t/**\n\t\t * Store one sub-value, keeping the rest of the object input's values.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetSubValue(key, sub, value) {\n\t\t\tconst group = this.values[key] && typeof this.values[key] === 'object' ? this.values[key] : {}\n\t\t\tthis.setValue(key, { ...group, [sub]: value })\n\t\t},\n\n\t\t/**\n\t\t * Whether a required sub-field holds a value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubFilled(key, sub) {\n\t\t\tconst value = this.subValue(key, sub.key)\n\t\t\treturn sub.widget === 'checkbox' ? value === true : String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * Whether a refusal named `<input>.<sub>`.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubRefused(key, sub) {\n\t\t\treturn this.refusedKeys.includes(`${key}.${sub}`)\n\t\t},\n\n\t\t/** Seed each declared input from its schema default (booleans start false). */\n\t\tinitialValues() {\n\t\t\tconst values = {}\n\t\t\tconst declared = Array.isArray(this.transition?.inputs) ? this.transition.inputs : []\n\t\t\tconst properties = (this.schema && this.schema.properties) || {}\n\t\t\tfor (const input of declared) {\n\t\t\t\tif (!input || typeof input.field !== 'string' || input.field === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst prop = properties[input.field] || {}\n\t\t\t\tif (prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\t// An object input starts from the record's present value, so\n\t\t\t\t\t// the sub-fields it asks for show what is there.\n\t\t\t\t\tconst present = this.currentObject ? this.currentObject[input.field] : null\n\t\t\t\t\tvalues[input.field] = present && typeof present === 'object' ? { ...present } : {}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tvalues[input.field] = prop.default !== undefined\n\t\t\t\t\t? prop.default\n\t\t\t\t\t: (prop.type === 'boolean' ? false : '')\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Clamp a `fieldsFromSchema()` widget to the minimal set this dialog\n\t\t * renders. Anything richer (select, date, user picker, …) degrades to a\n\t\t * plain text input rather than pulling a form engine into the dialog.\n\t\t *\n\t\t * @param {string} widget The resolved widget name.\n\t\t * @return {'text'|'textarea'|'number'|'checkbox'}\n\t\t */\n\t\tclampWidget(widget) {\n\t\t\tif (widget === 'checkbox' || widget === 'switch') {\n\t\t\t\treturn 'checkbox'\n\t\t\t}\n\t\t\tif (widget === 'textarea') {\n\t\t\t\treturn 'textarea'\n\t\t\t}\n\t\t\tif (widget === 'number') {\n\t\t\t\treturn 'number'\n\t\t\t}\n\t\t\treturn 'text'\n\t\t},\n\n\t\t/**\n\t\t * The field's visible label, with a `*` marker on required inputs so the\n\t\t * confirm-gating is visually explained.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\trequiredLabel(field) {\n\t\t\treturn field.required ? `${field.label} *` : field.label\n\t\t},\n\n\t\t/**\n\t\t * Store one input's value.\n\t\t *\n\t\t * @param {string} key The declared field name.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetValue(key, value) {\n\t\t\tthis.values = { ...this.values, [key]: value }\n\t\t},\n\n\t\t/**\n\t\t * Whether a required field counts as filled: a checked switch for\n\t\t * booleans, a non-blank string otherwise.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisFilled(field) {\n\t\t\tconst value = this.values[field.key]\n\t\t\tif (field.widget === 'checkbox') {\n\t\t\t\treturn value === true\n\t\t\t}\n\t\t\treturn String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * The object an object input sends: the record's current value with the\n\t\t * asked sub-fields merged over it, so a sub-field that was not asked for\n\t\t * keeps its value. A shown field left empty over an empty current value\n\t\t * is not written. Never a dotted key.\n\t\t *\n\t\t * @param {object} field The object field descriptor.\n\t\t * @return {object}\n\t\t */\n\t\tmergedObject(field) {\n\t\t\tconst present = this.currentObject ? this.currentObject[field.key] : null\n\t\t\tconst base = present && typeof present === 'object' ? { ...present } : {}\n\t\t\tfor (const sub of field.subFields) {\n\t\t\t\tlet value = this.subValue(field.key, sub.key)\n\t\t\t\tconst empty = sub.widget === 'checkbox' ? value === undefined : String(value ?? '').trim() === ''\n\t\t\t\tconst had = base[sub.key]\n\t\t\t\tif (empty && (had === undefined || had === null || had === '')) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (sub.widget === 'number' && !empty && !Number.isNaN(Number(value))) {\n\t\t\t\t\tvalue = Number(value)\n\t\t\t\t}\n\t\t\t\tbase[sub.key] = value\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/** Confirm: emit exactly the declared keys (numbers cast) and let the parent POST. */\n\t\tonConfirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst data = {}\n\t\t\tfor (const field of this.fields) {\n\t\t\t\tif (field.widget === 'object') {\n\t\t\t\t\tdata[field.key] = this.mergedObject(field)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tlet value = this.values[field.key]\n\t\t\t\tif (field.widget === 'number' && String(value ?? '').trim() !== '') {\n\t\t\t\t\tconst parsed = Number(value)\n\t\t\t\t\tif (!Number.isNaN(parsed)) {\n\t\t\t\t\t\tvalue = parsed\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdata[field.key] = value\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event confirm Emitted when the user confirms with all required\n\t\t\t * inputs filled. Payload holds exactly the declared input keys; the\n\t\t\t * parent POSTs `{ action, data }`.\n\t\t\t * @type {{[key: string]: unknown}}\n\t\t\t */\n\t\t\tthis.$emit('confirm', data)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-transition-input {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 4px 0;\n}\n\n.cn-transition-input__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__field-error {\n\tmargin: 4px 0 0;\n\tfont-size: 0.9em;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__object {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\tpadding: 8px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-transition-input__label {\n\tdisplay: block;\n\tmargin-bottom: 4px;\n}\n\n.cn-transition-input__field--refused {\n\tborder-inline-start: 2px solid var(--color-error);\n\tpadding-inline-start: 8px;\n}\n</style>\n"],"names":["_createBlock","_createVNode","_createElementBlock","_toDisplayString","_Fragment","_renderList","_openBlock","_createElementVNode","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"CnTransitionInputDialog.vue3.js","sources":["../../../src/dialogs/CnTransitionInputDialog.vue?vue&type=template&id=457532e4&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:look=\"look\"\n\t\t:width=\"width\"\n\t\tdefaultWidth=\"form\"\n\t\t:eyebrow=\"eyebrow\"\n\t\t:subtitle=\"subtitle\"\n\t\t:name=\"dialogTitle\"\n\t\tsize=\"normal\"\n\t\t@closing=\"$emit('close')\">\n\t\t<div\n\t\t\tclass=\"cn-transition-input\"\n\t\t\t:aria-busy=\"busy ? 'true' : null\"\n\t\t\tdata-testid=\"cn-modal\"\n\t\t\tdata-testid-modal=\"cn-transition-input-dialog\">\n\t\t\t<!-- A refusal keeps this dialog open with what was typed still in\n\t\t\t it. Closing first and reporting behind it loses the work and\n\t\t\t asks the person to retype it from memory. -->\n\t\t\t<p v-if=\"error\"\n\t\t\t\tclass=\"cn-transition-input__error\"\n\t\t\t\tdata-testid=\"cn-transition-input-error\">\n\t\t\t\t{{ error }}\n\t\t\t</p>\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.key\"\n\t\t\t\tclass=\"cn-transition-input__field\"\n\t\t\t\t:class=\"{ 'cn-transition-input__field--refused': isRefused(field.key) }\"\n\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}`\">\n\t\t\t\t<!-- An input that declares its choices is picked from them. -->\n\t\t\t\t<NcSelect v-if=\"field.widget === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"field.options\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t:inputLabel=\"requiredLabel(field)\"\n\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-select-${field.key}`\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event && $event.value !== undefined ? $event.value : '')\" />\n\n\t\t\t\t<!-- An input that points at another record is picked, never typed. -->\n\t\t\t\t<div v-else-if=\"field.widget === 'reference'\" class=\"cn-transition-input__reference\">\n\t\t\t\t\t<label class=\"cn-transition-input__label\">{{ requiredLabel(field) }}</label>\n\t\t\t\t\t<CnResourceSelect\n\t\t\t\t\t\t:register=\"field.referenceRegister\"\n\t\t\t\t\t\t:schema=\"String(field.reference.schema)\"\n\t\t\t\t\t\t:labelField=\"(field.picker && field.picker.labelField) || field.reference.labelField || 'name'\"\n\t\t\t\t\t\t:filter=\"(field.picker && field.picker.filter) || {}\"\n\t\t\t\t\t\t:exclude=\"excludedIds(field)\"\n\t\t\t\t\t\t:allowCreate=\"false\"\n\t\t\t\t\t\t:preload=\"true\"\n\t\t\t\t\t\t:inputLabel=\"requiredLabel(field)\"\n\t\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-picker-${field.key}`\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- An object input: its sub-properties, one field at a time. -->\n\t\t\t\t<fieldset v-else-if=\"field.widget === 'object'\" class=\"cn-transition-input__object\">\n\t\t\t\t\t<legend>{{ requiredLabel(field) }}</legend>\n\t\t\t\t\t<div v-for=\"sub in field.subFields\"\n\t\t\t\t\t\t:key=\"sub.key\"\n\t\t\t\t\t\tclass=\"cn-transition-input__subfield\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}-${sub.key}`\">\n\t\t\t\t\t\t<NcTextArea v-if=\"sub.widget === 'textarea'\"\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"sub.widget === 'checkbox'\"\n\t\t\t\t\t\t\t:modelValue=\"subValue(field.key, sub.key) === true\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event === true)\">\n\t\t\t\t\t\t\t{{ subLabel(sub) }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:type=\"sub.widget === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<p v-if=\"isSubRefused(field.key, sub.key)\"\n\t\t\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}.${sub.key}`\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'This value was not accepted.') }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\n\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t:modelValue=\"values[field.key] === true\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event === true)\">\n\t\t\t\t\t{{ requiredLabel(field) }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t<NcTextArea v-else-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\trows=\"4\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else-if=\"field.widget === 'number'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<p v-if=\"isRefused(field.key)\"\n\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}`\">\n\t\t\t\t\t{{ refusalFor(field.key) }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- A key the refusal names that this dialog never offered is not a\n\t\t\t field anybody can correct here. Saying so beats saying nothing:\n\t\t\t the request sent something the transition does not accept. -->\n\t\t\t<p v-for=\"key in unofferedRefusals\"\n\t\t\t\t:key=\"key\"\n\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t:data-testid=\"`cn-transition-input-error-${key}`\">\n\t\t\t\t{{ undeclaredMessage(key) }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tdata-testid=\"cn-transition-input-cancel\"\n\t\t\t\t@click=\"$emit('close')\">\n\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<!-- Busy while the parent's POST runs: a transition can take\n\t\t\t seconds, and a confirm button that only greys out reads as one\n\t\t\t that did nothing. -->\n\t\t\t<NcButton\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\t:aria-busy=\"busy ? 'true' : null\"\n\t\t\t\tdata-testid=\"cn-transition-input-confirm\"\n\t\t\t\t@click=\"onConfirm\">\n\t\t\t\t<template v-if=\"busy\" #icon>\n\t\t\t\t\t<NcLoadingIcon :size=\"20\" data-testid=\"cn-transition-input-busy\" />\n\t\t\t\t</template>\n\t\t\t\t{{ confirmLabel }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CnDialog from '../components/CnDialog/CnDialog.vue'\nimport CnResourceSelect from '../components/CnResourceSelect/CnResourceSelect.vue'\nimport { dialogBoardMixin } from '../mixins/dialogBoard.js'\nimport { fieldsFromSchema } from '../utils/schema.js'\n\n/**\n * CnTransitionInputDialog — collects a lifecycle transition's declared\n * `inputs` before the transition is applied.\n *\n * A schema's `x-openregister-lifecycle.transitions.<action>` block may declare\n * `inputs: [{ field, required }]`; the transition endpoint then accepts\n * `{ action, data: { <field>: <value> } }`. This dialog renders one input per\n * declared field, disables the confirm button until every `required: true`\n * field is filled, and emits the collected values — the parent\n * (`CnLifecycleActions`) performs the actual POST. Cancel emits `close`\n * without any confirm, so no request is made.\n *\n * Field rendering resolves each declared field against the object's JSON\n * Schema via `fieldsFromSchema()` when a `schema` is given: the label comes\n * from the property `title`, booleans render as a switch, numbers as a number\n * field, and long text (`maxLength > 255` or a `textarea`/`markdown` format)\n * as a textarea. Anything else — including a field the schema does not\n * declare — falls back to a plain labelled text input.\n *\n * An input may also say how it is asked for, which matters when the choices\n * depend on the record rather than on its schema: `label` names the field,\n * and `options: [{ value, label }]` turns it into a picker that shows each\n * `label` and sends the chosen `value`. An input that declares neither is\n * rendered from the schema as before. Deliberately minimal:\n * text, textarea, number and checkbox cover transition inputs; this is not a\n * form engine (use `CnFormDialog` for full object forms).\n *\n * Lives in its own file under `src/dialogs/` per the modal-isolation rule.\n *\n * ```vue\n * <CnTransitionInputDialog\n * v-if=\"inputTransition\"\n * :transition=\"inputTransition\"\n * :schema=\"schema\"\n * @confirm=\"onInputConfirm\"\n * @close=\"inputTransition = null\" />\n * ```\n */\nexport default {\n\tname: 'CnTransitionInputDialog',\n\n\tcomponents: {\n\t\tCnResourceSelect,\n\t\tCnDialog,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t\tNcTextArea,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSelect,\n\t},\n\n\tmixins: [dialogBoardMixin],\n\n\tprops: {\n\t\t/**\n\t\t * The transition being applied. `inputs` is the declared input list from\n\t\t * `x-openregister-lifecycle.transitions.<action>.inputs` (server-derived\n\t\t * or config-declared); `label` doubles as dialog title + confirm label.\n\t\t *\n\t\t * An input may carry a `label` for its field and `options` to pick\n\t\t * from, each `{ value, label }`; the picker shows the label and sends\n\t\t * the value.\n\t\t *\n\t\t * @type {{action?: string, label?: string, inputs?: Array<{field: string, required?: boolean, label?: string, options?: Array<{value: string, label?: string}>}>}}\n\t\t */\n\t\ttransition: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The object's JSON Schema (with `properties`), used to resolve each\n\t\t * input's label, widget and helper text. Optional — undeclared fields\n\t\t * render as plain text inputs labelled by their field name.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The record the transition runs on. Gives `picker.excludeSelf` its id\n\t\t * to leave out, and the current value an object input is merged over.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tcurrentObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Register slug the reference pickers look in when the schema property\n\t\t * names none of its own.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tregister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The sentence a refused transition answered with. Present means the\n\t\t * dialog stayed open BECAUSE the attempt was refused, with everything\n\t\t * typed still in it.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The input keys the refusal named (`fields` in the 400 body). Each one\n\t\t * that this dialog offers is marked on its own field; each one it does\n\t\t * not is reported as a key the transition does not accept.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tfieldErrors: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether the parent is mid-POST. Keeps the confirm button from firing\n\t\t * a second attempt while the first is in flight.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tbusy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['confirm', 'close'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** @type {{[key: string]: unknown}} Collected input values, keyed by declared field name. */\n\t\t\tvalues: this.initialValues(),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** The declared inputs, normalised to `{ field, required }`. */\n\t\tinputs() {\n\t\t\tconst declared = Array.isArray(this.transition.inputs) ? this.transition.inputs : []\n\t\t\treturn declared\n\t\t\t\t.filter((input) => input && typeof input.field === 'string' && input.field !== '')\n\t\t\t\t.map((input) => ({\n\t\t\t\t\tfield: input.field,\n\t\t\t\t\trequired: input.required === true,\n\t\t\t\t\tpicker: input.picker && typeof input.picker === 'object' ? input.picker : null,\n\t\t\t\t\tfields: Array.isArray(input.fields) ? input.fields.filter((f) => typeof f === 'string') : null,\n\t\t\t\t\tlabel: typeof input.label === 'string' && input.label.trim() !== '' ? input.label.trim() : null,\n\t\t\t\t\toptions: this.declaredOptions(input.options),\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * One renderable field descriptor per declared input. Schema-declared\n\t\t * fields come from `fieldsFromSchema()` (label from the property title,\n\t\t * widget from the type/format); the widget is then clamped to the minimal\n\t\t * set this dialog renders (text / textarea / number / checkbox). Fields\n\t\t * the schema does not declare fall back to a plain text input.\n\t\t *\n\t\t * An input that declares `options` is a picker whatever the schema\n\t\t * says, because its choices are the ones this transition offers on\n\t\t * this record. A declared `label` names the field over the schema's.\n\t\t */\n\t\tfields() {\n\t\t\tconst keys = this.inputs.map((input) => input.field)\n\t\t\tconst resolved = fieldsFromSchema(this.schema, { include: keys, includeReadOnly: true })\n\t\t\treturn this.inputs.map((input) => {\n\t\t\t\tconst field = resolved.find((f) => f.key === input.field)\n\t\t\t\tif (input.options) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: input.field,\n\t\t\t\t\t\tlabel: input.label || (field && field.label) || input.field,\n\t\t\t\t\t\tdescription: (field && field.description) || '',\n\t\t\t\t\t\twidget: 'select',\n\t\t\t\t\t\toptions: input.options,\n\t\t\t\t\t\trequired: input.required,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst prop = (this.schema && this.schema.properties && this.schema.properties[input.field]) || null\n\t\t\t\tif (prop && prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\treturn this.objectField(input, prop)\n\t\t\t\t}\n\t\t\t\tif (!field) {\n\t\t\t\t\treturn { key: input.field, label: input.label || input.field, description: '', widget: 'text', required: input.required }\n\t\t\t\t}\n\t\t\t\tif (field.reference && field.reference.multiple !== true) {\n\t\t\t\t\tconst register = field.reference.register || this.register\n\t\t\t\t\tif (register !== '') {\n\t\t\t\t\t\treturn { ...field, label: input.label || field.label, widget: 'reference', referenceRegister: register, picker: input.picker, required: input.required }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { ...field, label: input.label || field.label, widget: this.clampWidget(field.widget), required: input.required }\n\t\t\t})\n\t\t},\n\n\t\t/** Dialog title — the transition's label, with a generic fallback. */\n\t\tdialogTitle() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Provide details')\n\t\t},\n\n\t\t/** Confirm button label — the transition's label per the contract. */\n\t\tconfirmLabel() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Confirm')\n\t\t},\n\n\t\t/** True when every `required: true` input holds a non-empty value. */\n\t\tcanConfirm() {\n\t\t\tif (this.busy === true) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.fields.every((field) => (field.widget === 'object'\n\t\t\t\t? field.subFields.every((sub) => !sub.required || this.isSubFilled(field.key, sub))\n\t\t\t\t: (!field.required || this.isFilled(field))))\n\t\t},\n\n\t\t/** The refused keys this dialog offers no field for. */\n\t\tunofferedRefusals() {\n\t\t\tconst offered = this.fields.map((field) => field.key)\n\t\t\treturn this.refusedKeys.filter((key) => !offered.includes(key))\n\t\t},\n\n\t\t/** The refusal's field keys, normalised to strings. */\n\t\trefusedKeys() {\n\t\t\tif (!Array.isArray(this.fieldErrors)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.fieldErrors.filter((key) => typeof key === 'string' && key !== '')\n\t\t},\n\t},\n\n\tmethods: {\n\t\t// Exposed to the template for the static button labels — the same\n\t\t// `methods: { t }` pattern the other dialogs in this folder use.\n\t\tt,\n\n\t\t/**\n\t\t * Whether the refusal named this field.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRefused(key) {\n\t\t\treturn this.refusedKeys.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * What to say beside a refused field.\n\t\t *\n\t\t * The KIND is decided here rather than read out of the refusal's\n\t\t * sentence. A field this dialog offers and the person left empty is a\n\t\t * missing required input; one it offers that carries a value was\n\t\t * refused for what is in it. Parsing the server's prose to tell those\n\t\t * apart would break the first time the sentence is reworded, and a\n\t\t * reworded sentence is not a contract change.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\trefusalFor(key) {\n\t\t\tconst field = this.fields.find((candidate) => candidate.key === key)\n\t\t\tif (field && !this.isFilled(field)) {\n\t\t\t\treturn t('nextcloud-vue', 'This field is required.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'This value was not accepted.')\n\t\t},\n\n\t\t/**\n\t\t * What to say about a refused key this dialog does not offer.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\tundeclaredMessage(key) {\n\t\t\treturn t('nextcloud-vue', 'This action does not accept the field \"{field}\".', { field: key })\n\t\t},\n\n\t\t/**\n\t\t * The descriptor of an object input: its sub-properties (narrowed to the\n\t\t * input's `fields` when it names them), each with its own widget.\n\t\t * A sub-field is required when the input names it in `fields` and the\n\t\t * sub-schema lists it as required, or when the whole input is required\n\t\t * and it is the only one asked.\n\t\t *\n\t\t * @param {object} input The normalised input.\n\t\t * @param {object} prop The object property's schema.\n\t\t * @return {object} The field descriptor.\n\t\t */\n\t\tobjectField(input, prop) {\n\t\t\tconst subs = fieldsFromSchema(prop, { includeReadOnly: true, ...(input.fields ? { include: input.fields } : {}) })\n\t\t\tconst required = Array.isArray(prop.required) ? prop.required : []\n\t\t\tconst only = subs.length === 1\n\t\t\treturn {\n\t\t\t\tkey: input.field,\n\t\t\t\tlabel: prop.title || input.field,\n\t\t\t\tdescription: prop.description || '',\n\t\t\t\twidget: 'object',\n\t\t\t\trequired: input.required,\n\t\t\t\tsubFields: subs.map((sub) => ({\n\t\t\t\t\t...sub,\n\t\t\t\t\twidget: this.clampWidget(sub.widget),\n\t\t\t\t\trequired: (input.fields ? required.includes(sub.key) : sub.required === true) || (input.required && only),\n\t\t\t\t})),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The choices an input declares, as `[{ value, label }]`, or null when\n\t\t * it declares none. An option without a value is dropped, because it\n\t\t * cannot be sent; one without a label shows its value.\n\t\t *\n\t\t * @param {unknown} options The input's declared `options`.\n\t\t * @return {Array<{value: string, label: string}>|null}\n\t\t */\n\t\tdeclaredOptions(options) {\n\t\t\tif (!Array.isArray(options)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst usable = options\n\t\t\t\t.filter((option) => option && typeof option === 'object'\n\t\t\t\t\t&& (typeof option.value === 'string' || typeof option.value === 'number')\n\t\t\t\t\t&& String(option.value).trim() !== '')\n\t\t\t\t.map((option) => ({\n\t\t\t\t\tvalue: String(option.value),\n\t\t\t\t\tlabel: typeof option.label === 'string' && option.label.trim() !== '' ? option.label.trim() : String(option.value),\n\t\t\t\t}))\n\t\t\treturn usable.length > 0 ? usable : null\n\t\t},\n\n\t\t/**\n\t\t * The option a picker field currently holds, or null.\n\t\t *\n\t\t * @param {object} field The select field descriptor.\n\t\t * @return {{value: string, label: string}|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\tconst value = this.values[field.key]\n\t\t\treturn field.options.find((option) => option.value === String(value ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Ids a reference picker must not offer: the current record, when the\n\t\t * input's `picker.excludeSelf` says so.\n\t\t *\n\t\t * @param {object} field The reference field descriptor.\n\t\t * @return {string[]} The ids to leave out.\n\t\t */\n\t\texcludedIds(field) {\n\t\t\tif (!field.picker || field.picker.excludeSelf !== true || !this.currentObject) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst self = this.currentObject\n\t\t\treturn [self.id, self.uuid, self['@self'] && self['@self'].id].filter((id) => id !== undefined && id !== null).map(String)\n\t\t},\n\n\t\t/**\n\t\t * Label of a sub-field, with the required marker.\n\t\t *\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tsubLabel(sub) {\n\t\t\treturn sub.required ? `${sub.label} *` : sub.label\n\t\t},\n\n\t\t/**\n\t\t * A typed sub-value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {unknown}\n\t\t */\n\t\tsubValue(key, sub) {\n\t\t\tconst group = this.values[key]\n\t\t\treturn group && typeof group === 'object' ? group[sub] : undefined\n\t\t},\n\n\t\t/**\n\t\t * Store one sub-value, keeping the rest of the object input's values.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetSubValue(key, sub, value) {\n\t\t\tconst group = this.values[key] && typeof this.values[key] === 'object' ? this.values[key] : {}\n\t\t\tthis.setValue(key, { ...group, [sub]: value })\n\t\t},\n\n\t\t/**\n\t\t * Whether a required sub-field holds a value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubFilled(key, sub) {\n\t\t\tconst value = this.subValue(key, sub.key)\n\t\t\treturn sub.widget === 'checkbox' ? value === true : String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * Whether a refusal named `<input>.<sub>`.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubRefused(key, sub) {\n\t\t\treturn this.refusedKeys.includes(`${key}.${sub}`)\n\t\t},\n\n\t\t/** Seed each declared input from its schema default (booleans start false). */\n\t\tinitialValues() {\n\t\t\tconst values = {}\n\t\t\tconst declared = Array.isArray(this.transition?.inputs) ? this.transition.inputs : []\n\t\t\tconst properties = (this.schema && this.schema.properties) || {}\n\t\t\tfor (const input of declared) {\n\t\t\t\tif (!input || typeof input.field !== 'string' || input.field === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst prop = properties[input.field] || {}\n\t\t\t\tif (prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\t// An object input starts from the record's present value, so\n\t\t\t\t\t// the sub-fields it asks for show what is there.\n\t\t\t\t\tconst present = this.currentObject ? this.currentObject[input.field] : null\n\t\t\t\t\tvalues[input.field] = present && typeof present === 'object' ? { ...present } : {}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tvalues[input.field] = prop.default !== undefined\n\t\t\t\t\t? prop.default\n\t\t\t\t\t: (prop.type === 'boolean' ? false : '')\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Clamp a `fieldsFromSchema()` widget to the minimal set this dialog\n\t\t * renders. Anything richer (select, date, user picker, …) degrades to a\n\t\t * plain text input rather than pulling a form engine into the dialog.\n\t\t *\n\t\t * @param {string} widget The resolved widget name.\n\t\t * @return {'text'|'textarea'|'number'|'checkbox'}\n\t\t */\n\t\tclampWidget(widget) {\n\t\t\tif (widget === 'checkbox' || widget === 'switch') {\n\t\t\t\treturn 'checkbox'\n\t\t\t}\n\t\t\tif (widget === 'textarea') {\n\t\t\t\treturn 'textarea'\n\t\t\t}\n\t\t\tif (widget === 'number') {\n\t\t\t\treturn 'number'\n\t\t\t}\n\t\t\treturn 'text'\n\t\t},\n\n\t\t/**\n\t\t * The field's visible label, with a `*` marker on required inputs so the\n\t\t * confirm-gating is visually explained.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\trequiredLabel(field) {\n\t\t\treturn field.required ? `${field.label} *` : field.label\n\t\t},\n\n\t\t/**\n\t\t * Store one input's value.\n\t\t *\n\t\t * @param {string} key The declared field name.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetValue(key, value) {\n\t\t\tthis.values = { ...this.values, [key]: value }\n\t\t},\n\n\t\t/**\n\t\t * Whether a required field counts as filled: a checked switch for\n\t\t * booleans, a non-blank string otherwise.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisFilled(field) {\n\t\t\tconst value = this.values[field.key]\n\t\t\tif (field.widget === 'checkbox') {\n\t\t\t\treturn value === true\n\t\t\t}\n\t\t\treturn String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * The object an object input sends: the record's current value with the\n\t\t * asked sub-fields merged over it, so a sub-field that was not asked for\n\t\t * keeps its value. A shown field left empty over an empty current value\n\t\t * is not written. Never a dotted key.\n\t\t *\n\t\t * @param {object} field The object field descriptor.\n\t\t * @return {object}\n\t\t */\n\t\tmergedObject(field) {\n\t\t\tconst present = this.currentObject ? this.currentObject[field.key] : null\n\t\t\tconst base = present && typeof present === 'object' ? { ...present } : {}\n\t\t\tfor (const sub of field.subFields) {\n\t\t\t\tlet value = this.subValue(field.key, sub.key)\n\t\t\t\tconst empty = sub.widget === 'checkbox' ? value === undefined : String(value ?? '').trim() === ''\n\t\t\t\tconst had = base[sub.key]\n\t\t\t\tif (empty && (had === undefined || had === null || had === '')) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (sub.widget === 'number' && !empty && !Number.isNaN(Number(value))) {\n\t\t\t\t\tvalue = Number(value)\n\t\t\t\t}\n\t\t\t\tbase[sub.key] = value\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/** Confirm: emit exactly the declared keys (numbers cast) and let the parent POST. */\n\t\tonConfirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst data = {}\n\t\t\tfor (const field of this.fields) {\n\t\t\t\tif (field.widget === 'object') {\n\t\t\t\t\tdata[field.key] = this.mergedObject(field)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tlet value = this.values[field.key]\n\t\t\t\tif (field.widget === 'number' && String(value ?? '').trim() !== '') {\n\t\t\t\t\tconst parsed = Number(value)\n\t\t\t\t\tif (!Number.isNaN(parsed)) {\n\t\t\t\t\t\tvalue = parsed\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdata[field.key] = value\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event confirm Emitted when the user confirms with all required\n\t\t\t * inputs filled. Payload holds exactly the declared input keys; the\n\t\t\t * parent POSTs `{ action, data }`.\n\t\t\t * @type {{[key: string]: unknown}}\n\t\t\t */\n\t\t\tthis.$emit('confirm', data)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-transition-input {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 4px 0;\n}\n\n.cn-transition-input__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__field-error {\n\tmargin: 4px 0 0;\n\tfont-size: 0.9em;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__object {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\tpadding: 8px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-transition-input__label {\n\tdisplay: block;\n\tmargin-bottom: 4px;\n}\n\n.cn-transition-input__field--refused {\n\tborder-inline-start: 2px solid var(--color-error);\n\tpadding-inline-start: 8px;\n}\n</style>\n"],"names":["_createBlock","_createVNode","_createTextVNode","_createElementBlock","_toDisplayString","_Fragment","_renderList","_openBlock","_createElementVNode"],"mappings":"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"}
@@ -1,4 +1,15 @@
1
1
  var translations = {
2
+ Channel: "Channel",
3
+ Outcome: "Outcome",
4
+ Chat: "Chat",
5
+ Counter: "Counter",
6
+ "Social media": "Social media",
7
+ Letter: "Letter",
8
+ "Save contact moment": "Save contact moment",
9
+ "Saving…": "Saving…",
10
+ "Subject is required": "Subject is required",
11
+ "Cannot save right now": "Cannot save right now",
12
+ "Failed to save interaction": "Failed to save interaction",
2
13
  "You cannot see these files": "You cannot see these files",
3
14
  "Delete {name}? This cannot be undone here.": "Delete {name}? This cannot be undone here.",
4
15
  "Linked items": "Linked items",
@@ -325,6 +336,9 @@ var translations = {
325
336
  Constant: "Constant",
326
337
  Copy: "Copy",
327
338
  Copied: "Copied",
339
+ "Copy the name": "Copy the name",
340
+ "Copy the value": "Copy the value",
341
+ "Copying did not work. Select the text and copy it yourself.": "Copying did not work. Select the text and copy it yourself.",
328
342
  Show: "Show",
329
343
  "Copy {label}": "Copy {label}",
330
344
  "Show {label}": "Show {label}",
@@ -1402,7 +1416,8 @@ var translations = {
1402
1416
  "This answer was refused.": "This answer was refused.",
1403
1417
  "No value ({count})": "No value ({count})",
1404
1418
  "{start} to {end}": "{start} to {end}",
1405
- Breadcrumb: "Breadcrumb"
1419
+ Breadcrumb: "Breadcrumb",
1420
+ "Moving to {stage}": "Moving to {stage}"
1406
1421
  };
1407
1422
  var plurals = {
1408
1423
  "{count} selected": [
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,15 @@
1
1
  var translations = {
2
+ Channel: "Kanaal",
3
+ Outcome: "Uitkomst",
4
+ Chat: "Chat",
5
+ Counter: "Balie",
6
+ "Social media": "Sociale media",
7
+ Letter: "Brief",
8
+ "Save contact moment": "Contactmoment opslaan",
9
+ "Saving…": "Opslaan…",
10
+ "Subject is required": "Onderwerp is verplicht",
11
+ "Cannot save right now": "Opslaan kan nu niet",
12
+ "Failed to save interaction": "Het contactmoment is niet opgeslagen",
2
13
  "You cannot see these files": "Je kunt deze bestanden niet zien",
3
14
  "Delete {name}? This cannot be undone here.": "{name} verwijderen? Dit kun je hier niet ongedaan maken.",
4
15
  "Linked items": "Gekoppelde items",
@@ -347,6 +358,9 @@ var translations = {
347
358
  Constant: "Constante",
348
359
  Copy: "Kopiëren",
349
360
  Copied: "Gekopieerd",
361
+ "Copy the name": "Naam kopiëren",
362
+ "Copy the value": "Waarde kopiëren",
363
+ "Copying did not work. Select the text and copy it yourself.": "Kopiëren lukte niet. Selecteer de tekst en kopieer hem zelf.",
350
364
  Show: "Tonen",
351
365
  "Copy {label}": "{label} kopiëren",
352
366
  "Show {label}": "{label} tonen",
@@ -1546,7 +1560,30 @@ var translations = {
1546
1560
  "This answer was refused.": "Dit antwoord is geweigerd.",
1547
1561
  "No value ({count})": "Geen waarde ({count})",
1548
1562
  "{start} to {end}": "{start} tot {end} uur",
1549
- Breadcrumb: "Kruimelpad"
1563
+ Breadcrumb: "Kruimelpad",
1564
+ "Cannot move: this record has no id, so the move would create a duplicate instead of updating it.": "Verplaatsen kan niet: dit record heeft geen id, dus de verplaatsing zou een kopie maken in plaats van het record bij te werken.",
1565
+ "Could not check whether this stage can be reached": "Kon niet controleren of deze fase bereikbaar is",
1566
+ "Could not check which stages can be reached": "Kon niet controleren welke fases bereikbaar zijn",
1567
+ "Could not load the stages": "De fases konden niet worden geladen",
1568
+ "Just a moment, the last move is still running": "Een moment, de vorige verplaatsing loopt nog",
1569
+ "Loading stages": "Fases laden",
1570
+ "Move to {stage}": "Naar {stage} verplaatsen",
1571
+ "Moved to {stage}": "Verplaatst naar {stage}",
1572
+ "No stages to show": "Geen fases om te tonen",
1573
+ "Not reachable from the current stage": "Niet bereikbaar vanuit de huidige fase",
1574
+ Stages: "Fases",
1575
+ "The move could not be made": "De verplaatsing is niet gelukt",
1576
+ "The record is not loaded yet": "Het record is nog niet geladen",
1577
+ "The stages cannot be read for this record yet": "De fases van dit record zijn nog niet te lezen",
1578
+ "This move is not possible right now": "Deze verplaatsing kan nu niet",
1579
+ "This stage cannot be chosen right now": "Deze fase kan nu niet worden gekozen",
1580
+ "Are you sure you want to \"{action}\"?": "Weet je zeker dat je \"{action}\" wilt uitvoeren?",
1581
+ "Moved to {state}": "Verplaatst naar {state}",
1582
+ "Moved {title} to {state}": "{title} verplaatst naar {state}",
1583
+ "Transition failed": "De overgang is mislukt",
1584
+ Closed: "Afgesloten",
1585
+ "Skip to {action}": "Ga naar {action}",
1586
+ "Moving to {stage}": "Bezig met verplaatsen naar {stage}"
1550
1587
  };
1551
1588
  var plurals = {
1552
1589
  "{count} selected": [
@@ -1 +1 @@
1
- {"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}