@conduction/nextcloud-vue 2.144.0 → 2.146.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 (133) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +1 -0
  4. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue2.js.map +1 -1
  6. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js.map +1 -1
  7. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  8. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +55 -2
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  10. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  11. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  12. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +16 -0
  13. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  14. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -1
  15. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
  17. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
  18. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +12 -2
  20. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +42 -30
  22. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +22 -0
  24. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -1
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +1 -1
  28. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js +1 -1
  29. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -1
  30. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js +3 -3
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -1
  32. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  33. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +46 -8
  34. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  35. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +3 -3
  36. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  37. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  38. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +2 -2
  39. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +6 -3
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  43. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  44. package/dist/esm/components/CnMailTab/CnMailTab.vue.js +1 -1
  45. package/dist/esm/components/CnMailTab/CnMailTab.vue2.js.map +1 -1
  46. package/dist/esm/components/CnMailTab/CnMailTab.vue3.js +2 -2
  47. package/dist/esm/components/CnMailTab/CnMailTab.vue3.js.map +1 -1
  48. package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
  49. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
  50. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js +1 -0
  51. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
  52. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue.js +1 -1
  53. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js +21 -2
  54. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js.map +1 -1
  55. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue3.js.map +1 -1
  56. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  57. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +73 -12
  58. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  59. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +165 -126
  60. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  61. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +1 -1
  62. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -1
  64. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +1 -1
  65. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js +14 -0
  66. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -1
  67. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +2 -1
  68. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -1
  69. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  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/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
  73. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -8
  74. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  75. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  76. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue.js +1 -1
  77. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +10 -2
  78. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  79. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  80. package/dist/esm/composables/indexSources.js +35 -9
  81. package/dist/esm/composables/indexSources.js.map +1 -1
  82. package/dist/esm/l10n/nl.json.js +2 -0
  83. package/dist/esm/l10n/nl.json.js.map +1 -1
  84. package/dist/esm/library-style.js +1 -1
  85. package/dist/esm/nextcloud-vue.css +1204 -467
  86. package/dist/esm/utils/builtInFormatters.js +18 -1
  87. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  88. package/dist/esm/utils/detailObjectContext.js +7 -2
  89. package/dist/esm/utils/detailObjectContext.js.map +1 -1
  90. package/dist/esm/utils/localHeaderRows.js +95 -0
  91. package/dist/esm/utils/localHeaderRows.js.map +1 -0
  92. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  93. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  94. package/dist/esm/utils/visibleWhen.js +6 -0
  95. package/dist/esm/utils/visibleWhen.js.map +1 -1
  96. package/dist/nextcloud-vue.cjs.js +686 -239
  97. package/dist/nextcloud-vue.cjs.js.map +2 -2
  98. package/dist/nextcloud-vue.css +1204 -467
  99. package/l10n/nl.json +2 -0
  100. package/package.json +1 -1
  101. package/src/components/CnActionDialog/CnActionDialog.vue +8 -1
  102. package/src/components/CnAiCompanion/CnAiChatPanel.vue +3 -0
  103. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +55 -2
  104. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +18 -0
  105. package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +4 -2
  106. package/src/components/CnDataTable/CnDataTable.vue +19 -2
  107. package/src/components/CnDetailPage/CnDetailPage.md +1 -0
  108. package/src/components/CnDetailPage/CnDetailPage.vue +23 -0
  109. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +3 -1
  110. package/src/components/CnFactsWidget/CnFactsWidget.vue +74 -9
  111. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +2 -2
  112. package/src/components/CnIndexPage/CnIndexPage.vue +6 -3
  113. package/src/components/CnMailTab/CnMailTab.vue +6 -4
  114. package/src/components/CnNotesCard/CnNotesCard.vue +7 -2
  115. package/src/components/CnNotificationMatrix/CnNotificationMatrix.vue +25 -3
  116. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +132 -20
  117. package/src/components/CnRetentionWidget/CnRetentionWidget.vue +2 -0
  118. package/src/components/CnSettingsField/CnSettingsField.vue +15 -0
  119. package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -1
  120. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -8
  121. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +10 -2
  122. package/src/composables/indexSources.js +35 -9
  123. package/src/css/dialog.css +25 -9
  124. package/src/css/look-board-detail.css +370 -30
  125. package/src/css/look-board-index.css +116 -4
  126. package/src/css/look-board.css +168 -8
  127. package/src/css/table.css +17 -1
  128. package/src/schemas/app-manifest-v2.schema.json +2 -2
  129. package/src/utils/builtInFormatters.js +17 -0
  130. package/src/utils/detailObjectContext.js +7 -2
  131. package/src/utils/localHeaderRows.js +91 -0
  132. package/src/utils/validateManifestV2.compiled.js +2 -2
  133. package/src/utils/visibleWhen.js +6 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CnSettingsField.vue2.js","sources":["../../../../src/components/CnSettingsField/CnSettingsField.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-settings-field\" :class=\"`cn-settings-field--${kind}`\" :data-testid=\"`cn-settings-field-${field.key}`\">\n\t\t<h3 v-if=\"kind === 'heading'\" class=\"cn-settings-field__heading\">\n\t\t\t{{ label }}\n\t\t</h3>\n\t\t<NcNoteCard\n\t\t\tv-else-if=\"kind === 'status'\"\n\t\t\t:type=\"statusTone\"\n\t\t\t:role=\"statusTone === 'error' || statusTone === 'warning' ? 'alert' : 'status'\"\n\t\t\t:data-testid=\"`cn-settings-field-status-${field.key}`\">\n\t\t\t{{ field.text }}\n\t\t</NcNoteCard>\n\t\t<div v-else-if=\"kind === 'note'\" class=\"cn-settings-field__note\">\n\t\t\t<span class=\"cn-settings-field__note-label\">{{ label }}</span>\n\t\t\t<p class=\"cn-settings-field__note-text\" :data-testid=\"`cn-settings-field-note-${field.key}`\">\n\t\t\t\t{{ field.text }}\n\t\t\t</p>\n\t\t</div>\n\t\t<div v-else-if=\"kind === 'action'\" class=\"cn-settings-field__action\">\n\t\t\t<div class=\"cn-settings-field__action-row\">\n\t\t\t\t<NcButton v-if=\"field.href\"\n\t\t\t\t\t:href=\"actionHref\"\n\t\t\t\t\t:target=\"field.target || undefined\"\n\t\t\t\t\t:rel=\"field.target === '_blank' ? 'noopener noreferrer' : undefined\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\">\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-else\n\t\t\t\t\t:disabled=\"field.readOnly || field.actionBusy\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\"\n\t\t\t\t\t@click=\"runAction\">\n\t\t\t\t\t<template v-if=\"field.actionBusy\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<NcNoteCard v-if=\"field.actionResult\"\n\t\t\t\t:type=\"field.actionResult.type\"\n\t\t\t\t:role=\"field.actionResult.type === 'error' ? 'alert' : 'status'\"\n\t\t\t\t:data-testid=\"`cn-settings-field-action-result-${field.key}`\">\n\t\t\t\t{{ field.actionResult.text }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'radio'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"inputId\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:modelValue=\"modelValue === null || modelValue === undefined ? '' : String(modelValue)\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"emitValue(option.value)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'checkboxes'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:modelValue=\"listValue.some((entry) => String(entry) === String(option.value))\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"toggleOption(option.value, $event)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'pairs'\"\n\t\t\tclass=\"cn-settings-field__pairs\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"(row, index) in pairRows\"\n\t\t\t\t:key=\"index\"\n\t\t\t\tclass=\"cn-settings-field__pair\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-${field.key}`\">\n\t\t\t\t<NcTextField\n\t\t\t\t\t:label=\"pairKeyLabel\"\n\t\t\t\t\t:modelValue=\"row.key\"\n\t\t\t\t\t:maxlength=\"field.keyMaxLength\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'key', $event)\" />\n\t\t\t\t<NcSelect v-if=\"field.valueSource\"\n\t\t\t\t\t:modelValue=\"sourceOption(row.value)\"\n\t\t\t\t\t:options=\"sourceOptions\"\n\t\t\t\t\t:inputLabel=\"pairValueLabel\"\n\t\t\t\t\t:loading=\"sourceLoading\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event ? $event.value : '')\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:label=\"pairValueLabel\"\n\t\t\t\t\t:type=\"field.valueType === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t:modelValue=\"row.value === null || row.value === undefined ? '' : String(row.value)\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event)\" />\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t:ariaLabel=\"t('nextcloud-vue', 'Remove {name}', { name: row.key || pairKeyLabel })\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-pair-remove-${field.key}`\"\n\t\t\t\t\t@click=\"removePair(index)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<p v-if=\"sourceTruncated\"\n\t\t\t\tclass=\"cn-settings-field__hint\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pairs-truncated-${field.key}`\">\n\t\t\t\t{{ t('nextcloud-vue', 'Only the first {count} choices are listed.', { count: sourceOptions.length }) }}\n\t\t\t</p>\n\t\t\t<NcButton\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-add-${field.key}`\"\n\t\t\t\t@click=\"addPair\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ field.addLabel || t('nextcloud-vue', 'Add a row') }}\n\t\t\t</NcButton>\n\t\t</fieldset>\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-else-if=\"kind === 'switch' || kind === 'boolean'\"\n\t\t\t:type=\"kind === 'switch' ? 'switch' : 'checkbox'\"\n\t\t\t:modelValue=\"!!modelValue\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\">\n\t\t\t{{ label }}\n\t\t</NcCheckboxRadioSwitch>\n\t\t<div v-else-if=\"kind === 'image'\"\n\t\t\tclass=\"cn-settings-field__image\"\n\t\t\trole=\"group\"\n\t\t\t:aria-labelledby=\"`${inputId}-label`\">\n\t\t\t<!-- `hideLabel` keeps the name for a screen reader only. -->\n\t\t\t<span :id=\"`${inputId}-label`\"\n\t\t\t\tclass=\"cn-settings-field__image-label\"\n\t\t\t\t:class=\"{ 'hidden-visually': field.hideLabel === true }\">{{ label }}</span>\n\t\t\t<div class=\"cn-settings-field__image-row\">\n\t\t\t\t<span class=\"cn-settings-field__image-tile\" :data-testid=\"`cn-settings-field-image-${field.key}`\">\n\t\t\t\t\t<img v-if=\"stringValue\" :src=\"stringValue\" :alt=\"t('nextcloud-vue', 'Current {name}', { name: label })\">\n\t\t\t\t\t<span v-else class=\"cn-settings-field__image-initials\" aria-hidden=\"true\">{{ field.initials || '' }}</span>\n\t\t\t\t</span>\n\t\t\t\t<input\n\t\t\t\t\t:id=\"inputId\"\n\t\t\t\t\tref=\"file\"\n\t\t\t\t\tclass=\"hidden-visually\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t:accept=\"field.accept || 'image/*'\"\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t:aria-labelledby=\"`${inputId}-label`\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t@change=\"upload($event.target.files && $event.target.files[0])\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"!field.readOnly && field.uploadUrl\"\n\t\t\t\t\t:disabled=\"uploading\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-upload-${field.key}`\"\n\t\t\t\t\t@click=\"$refs.file && $refs.file.click()\">\n\t\t\t\t\t<template v-if=\"uploading\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ field.uploadLabel || t('nextcloud-vue', 'Upload {name}', { name: label }) }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\t\t<NcSelect\n\t\t\tv-else-if=\"kind === 'select'\"\n\t\t\t:inputId=\"inputId\"\n\t\t\t:modelValue=\"field.multiple ? selectedOptions : selectedOption\"\n\t\t\t:options=\"normalizedOptions\"\n\t\t\t:multiple=\"!!field.multiple\"\n\t\t\t:inputLabel=\"label\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:loading=\"optionsLoading\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:clearable=\"!field.required\"\n\t\t\tlabel=\"label\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue(field.multiple ? optionValues($event) : optionValue($event))\" />\n\t\t<NcTextArea\n\t\t\tv-else-if=\"kind === 'textarea' || kind === 'lines'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:rows=\"field.rows || 4\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<div v-else-if=\"kind === 'secret'\" class=\"cn-settings-field__secret\">\n\t\t\t<NcTextField\n\t\t\t\t:id=\"inputId\"\n\t\t\t\t:label=\"label\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t:modelValue=\"stringValue\"\n\t\t\t\t:placeholder=\"field.secretSet ? secretSetPlaceholder : (field.placeholder || '')\"\n\t\t\t\t:readonly=\"field.readOnly\"\n\t\t\t\t:disabled=\"field.clearing === true\"\n\t\t\t\t:error=\"!!error\"\n\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t\t<NcCheckboxRadioSwitch v-if=\"field.clearable && field.secretSet\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t:modelValue=\"field.clearing === true\"\n\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t:data-testid=\"`cn-settings-field-clear-${field.key}`\"\n\t\t\t\t@update:modelValue=\"onClear\">\n\t\t\t\t{{ field.clearLabel || t('nextcloud-vue', 'Remove the stored value') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'week-hours'\"\n\t\t\tclass=\"cn-settings-field__week\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"day in weekDays\"\n\t\t\t\t:key=\"day.key\"\n\t\t\t\tclass=\"cn-settings-field__day\"\n\t\t\t\t:data-testid=\"`cn-settings-field-day-${day.key}`\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:modelValue=\"!!weekValue[day.key]\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Open on {day}', { day: day.label })\"\n\t\t\t\t\t@update:modelValue=\"setDayOpen(day.key, $event)\">\n\t\t\t\t\t{{ day.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<template v-if=\"weekValue[day.key]\">\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Opens on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].opens || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'opens', $event)\" />\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Closes on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].closes || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'closes', $event)\" />\n\t\t\t\t</template>\n\t\t\t\t<span v-else class=\"cn-settings-field__hint\">{{ t('nextcloud-vue', 'Closed') }}</span>\n\t\t\t</div>\n\t\t</fieldset>\n\t\t<NcTextField\n\t\t\tv-else-if=\"kind === 'number'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\ttype=\"number\"\n\t\t\t:min=\"field.min\"\n\t\t\t:max=\"field.max\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event === '' ? null : Number($event))\" />\n\t\t<NcTextField\n\t\t\tv-else\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:type=\"inputType\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<p v-if=\"shownError\"\n\t\t\t:id=\"`${inputId}-error`\"\n\t\t\tclass=\"cn-settings-field__error\"\n\t\t\t:data-testid=\"`cn-settings-field-error-${field.key}`\">\n\t\t\t{{ shownError }}\n\t\t</p>\n\t\t<p v-else-if=\"hint\" :id=\"`${inputId}-hint`\" class=\"cn-settings-field__hint\">\n\t\t\t{{ hint }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { getDayNames, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { serverErrorMessage } from '../../utils/serverErrorMessage.js'\n\nlet fieldUid = 0\n\n/** Field types and the names CnSettingsPage's manifest uses for them. */\nconst KIND_ALIASES = { enum: 'select', string: 'text', datetime: 'datetime-local', 'date-time': 'datetime-local' }\n\n/** The days of a week, Monday first: the keys a week-hours value uses. */\nconst WEEK_DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']\n\n/** The same keys in the order of getDayNames(), which starts on Sunday. */\nconst WEEK_DAYS_FROM_SUNDAY = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']\n\n/** The kinds drawn as a text field with their own input type. */\nconst INPUT_TYPES = ['password', 'date', 'datetime-local', 'email', 'url']\n\n/**\n * CnSettingsField - one settings field: the control for its type with its\n * label, and under it an error or a hint. Shared by CnSettingsPage and\n * CnSettingsFieldsSection.\n *\n * Types: `text` (default), `textarea`, `number`, `switch`, `boolean` (a checkbox),\n * `select` (`enum`) with static `options` or options read from `optionsUrl`,\n * `password` (a masked input that shows its value back) and `secret`\n * (replace-only: the input stays empty, and with `secretSet` says a value is\n * stored; the host sends it only when something is typed), and `image` (a\n * preview tile, the initials without an image, and an upload button that\n * posts the file to `uploadUrl` at once and emits `uploaded`), `radio` (one\n * choice from `options`, each with an optional `description` under it),\n * `lines` (a textarea, one entry per line), `checkboxes` (several choices\n * from `options`, the value a list; `select` with `multiple` is the same as a\n * multi-select) and `pairs` (key-to-value rows with add and remove, the value\n * a list of `{ key, value }` rows). Three types hold no value of their\n * own: `heading` (a subheading between fields), `status` (a read-only note:\n * the host passes its `text` and `tone`) and `action` (a button that emits\n * `action`; the host passes `actionBusy` and the `actionResult` note).\n * `date`, `datetime-local` (also `datetime`, `date-time`), `email` and `url`\n * are text fields of that input type; the value stays the text the input holds.\n *\n * ```vue\n * <CnSettingsField\n * :field=\"{ key: 'apiKey', label: 'API key', type: 'secret', secretSet: true }\"\n * v-model=\"form.apiKey\" />\n * ```\n */\nexport default {\n\tname: 'CnSettingsField',\n\n\tcomponents: { Close, NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField, Plus },\n\n\tprops: {\n\t\t/**\n\t\t * The field: `{ key, label, type?, options?, optionsUrl?, optionsPath?,\n\t\t * optionLabel?, optionValue?, optionDetail?, placeholder?, rows?, min?, max?, required?,\n\t\t * readOnly?, secretSet? }`. `label` arrives translated.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tfield: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The value: text, a number, a boolean or a select value. Any type,\n\t\t * because a Boolean in a type list would read an empty string as true.\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: null,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** A validation message, drawn under the control and tied to it. */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** A hint under the control (not drawn while there is an error). */\n\t\thint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'uploaded', 'action', 'clear'],\n\n\tdata() {\n\t\tfieldUid += 1\n\t\treturn {\n\t\t\tuid: fieldUid,\n\t\t\tfetchedOptions: null,\n\t\t\toptionsLoading: false,\n\t\t\tsourceOptions: [],\n\t\t\tsourceLoading: false,\n\t\t\tsourceTruncated: false,\n\t\t\tuploading: false,\n\t\t\tuploadError: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {string} The control kind. */\n\t\tkind() {\n\t\t\tconst type = String(this.field.type || 'text')\n\t\t\treturn KIND_ALIASES[type] || type\n\t\t},\n\n\t\t/** @return {string} The input type of a text-like field. */\n\t\tinputType() {\n\t\t\treturn INPUT_TYPES.includes(this.kind) ? this.kind : 'text'\n\t\t},\n\n\t\t/** @return {string} The label. */\n\t\tlabel() {\n\t\t\treturn String(this.field.label || this.field.key || '')\n\t\t},\n\n\t\t/** @return {string} The control's id. */\n\t\tinputId() {\n\t\t\treturn `cn-settings-field-${this.uid}-${String(this.field.key).replace(/[^A-Za-z0-9_-]/g, '-')}`\n\t\t},\n\n\t\t/** @return {string} The message shown under the control: an upload failure, else `error`. */\n\t\tshownError() {\n\t\t\treturn this.uploadError || this.error\n\t\t},\n\n\t\t/** @return {string|null} The id of the error or hint the control is described by. */\n\t\tdescribedBy() {\n\t\t\tif (this.shownError) {\n\t\t\t\treturn `${this.inputId}-error`\n\t\t\t}\n\t\t\treturn this.hint ? `${this.inputId}-hint` : null\n\t\t},\n\n\t\t/** @return {string} A status note's tone: `info`, `success`, `warning` or `error`. */\n\t\tstatusTone() {\n\t\t\treturn ['info', 'success', 'warning', 'error'].includes(this.field.tone) ? this.field.tone : 'info'\n\t\t},\n\n\t\t/** @return {string} The value as text for a text control. */\n\t\tstringValue() {\n\t\t\treturn this.modelValue === null || this.modelValue === undefined ? '' : String(this.modelValue)\n\t\t},\n\n\t\t/** @return {Array<{key: string, label: string}>} The days of a week-hours field, Monday first by default. */\n\t\tweekDays() {\n\t\t\tconst names = getDayNames()\n\t\t\tconst days = Array.isArray(this.field.days) && this.field.days.length > 0 ? this.field.days : WEEK_DAYS\n\t\t\treturn days.map((key) => ({ key, label: names[WEEK_DAYS_FROM_SUNDAY.indexOf(key)] || key }))\n\t\t},\n\n\t\t/** @return {object} A week-hours field's value: day to `{ opens, closes }` or null. */\n\t\tweekValue() {\n\t\t\treturn this.modelValue && typeof this.modelValue === 'object' && !Array.isArray(this.modelValue) ? this.modelValue : {}\n\t\t},\n\n\t\t/** @return {string} An action link's address, with the web root for an app path. */\n\t\tactionHref() {\n\t\t\treturn prefixUrl(String(this.field.href || ''))\n\t\t},\n\n\t\t/** @return {string} The placeholder of a secret that is stored. */\n\t\tsecretSetPlaceholder() {\n\t\t\treturn t('nextcloud-vue', 'Stored. Type a new value to replace it.')\n\t\t},\n\n\t\t/**\n\t\t * The select options as `{ label, value }`: the static `options` (strings,\n\t\t * numbers or objects), or those read from `optionsUrl`.\n\t\t *\n\t\t * @return {Array<{label: string, value: (string|number|boolean)}>}\n\t\t */\n\t\tnormalizedOptions() {\n\t\t\tconst raw = Array.isArray(this.field.options) ? this.field.options : (this.fetchedOptions || [])\n\t\t\treturn raw.map((option) => (option && typeof option === 'object'\n\t\t\t\t? { ...option, label: String(option.label ?? option.value ?? ''), value: option.value }\n\t\t\t\t: { label: String(option), value: option }))\n\t\t},\n\n\t\t/** @return {Array} The value as a list, for a multi-choice field. */\n\t\tlistValue() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {Array<object>} The options a multi-select's value selects. */\n\t\tselectedOptions() {\n\t\t\treturn this.listValue.map((value) => this.normalizedOptions.find((option) => String(option.value) === String(value))\n\t\t\t\t|| { label: String(value), value })\n\t\t},\n\n\t\t/** @return {Array<{key: string, value: unknown}>} A pairs field's rows. */\n\t\tpairRows() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {string} The label of a pair's key. */\n\t\tpairKeyLabel() {\n\t\t\treturn String(this.field.keyLabel || t('nextcloud-vue', 'Key'))\n\t\t},\n\n\t\t/** @return {string} The label of a pair's value. */\n\t\tpairValueLabel() {\n\t\t\treturn String(this.field.valueLabel || t('nextcloud-vue', 'Value'))\n\t\t},\n\n\t\t/** @return {object|null} The option the value selects, for NcSelect. */\n\t\tselectedOption() {\n\t\t\tif (this.modelValue === null || this.modelValue === undefined || this.modelValue === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// A stored value is often text where the options carry numbers (an\n\t\t\t// app config holding an id), so the two are compared as text.\n\t\t\treturn this.normalizedOptions.find((option) => option.value === this.modelValue)\n\t\t\t\t|| this.normalizedOptions.find((option) => String(option.value) === String(this.modelValue))\n\t\t\t\t|| { label: String(this.modelValue), value: this.modelValue }\n\t\t},\n\t},\n\n\twatch: {\n\t\t'field.optionsUrl': {\n\t\t\thandler() {\n\t\t\t\tthis.loadOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\n\t\t'field.valueSource': {\n\t\t\thandler() {\n\t\t\t\tthis.loadSourceOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The \"remove the stored value\" switch of a secret changed.\n\t\t *\n\t\t * @param {boolean} on Whether the stored value is to be removed.\n\t\t * @return {void}\n\t\t */\n\t\tonClear(on) {\n\t\t\t/** @event clear The stored secret is to be removed (true) or kept (false). */\n\t\t\tthis.$emit('clear', on === true)\n\t\t},\n\n\t\tt,\n\n\t\t/** Ask the host to run an `action` field's action. */\n\t\trunAction() {\n\t\t\t/** @event action The user pressed an `action` field's button. */\n\t\t\tthis.$emit('action')\n\t\t},\n\n\t\t/**\n\t\t * Upload a chosen image to `uploadUrl` as multipart form data (the\n\t\t * file under `uploadField`, default `image`, plus `uploadParams`), then\n\t\t * take the new image url from the answer at `uploadValuePath` (or a\n\t\t * cache-busted `previewUrl`).\n\t\t *\n\t\t * @param {File|undefined} file The chosen file.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/settings-fields-section/specs/settings-fields-section/spec.md#requirement-an-image-field-uploads-at-once\n\t\t */\n\t\tasync upload(file) {\n\t\t\tif (!file || !this.field.uploadUrl) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst form = new FormData()\n\t\t\tfor (const [name, value] of Object.entries(this.field.uploadParams || {})) {\n\t\t\t\tform.append(name, value)\n\t\t\t}\n\t\t\tform.append(this.field.uploadField || 'image', file)\n\t\t\tthis.uploading = true\n\t\t\tthis.uploadError = ''\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(prefixUrl(this.field.uploadUrl), form)\n\t\t\t\tconst fromAnswer = this.field.uploadValuePath ? readPath(response?.data, this.field.uploadValuePath) : ''\n\t\t\t\tconst next = fromAnswer || (this.field.previewUrl ? `${prefixUrl(this.field.previewUrl)}${this.field.previewUrl.includes('?') ? '&' : '?'}v=${Date.now()}` : '')\n\t\t\t\t/**\n\t\t\t\t * @event uploaded An image was uploaded. Payload: its new url.\n\t\t\t\t */\n\t\t\t\tthis.$emit('uploaded', next)\n\t\t\t} catch (error) {\n\t\t\t\tthis.uploadError = t('nextcloud-vue', 'The image could not be uploaded: {reason}', { reason: serverErrorMessage(error) })\n\t\t\t} finally {\n\t\t\t\tthis.uploading = false\n\t\t\t\tif (this.$refs.file) {\n\t\t\t\t\tthis.$refs.file.value = ''\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Report a new value.\n\t\t *\n\t\t * @param {unknown} value The value.\n\t\t * @return {void}\n\t\t */\n\t\temitValue(value) {\n\t\t\t/**\n\t\t\t * @event update:modelValue The value changed. Payload: the new value.\n\t\t\t */\n\t\t\tthis.$emit('update:modelValue', value)\n\t\t},\n\n\t\t/**\n\t\t * Check or uncheck one choice of a `checkboxes` field; the list keeps\n\t\t * the order of the options.\n\t\t *\n\t\t * @param {string|number} value The option's value.\n\t\t * @param {boolean} checked Whether it is now checked.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleOption(value, checked) {\n\t\t\tconst chosen = new Set(this.listValue.map(String))\n\t\t\tif (checked) {\n\t\t\t\tchosen.add(String(value))\n\t\t\t} else {\n\t\t\t\tchosen.delete(String(value))\n\t\t\t}\n\t\t\tthis.emitValue(this.normalizedOptions.filter((option) => chosen.has(String(option.value))).map((option) => option.value))\n\t\t},\n\n\t\t/**\n\t\t * Change a pair's key or value.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @param {string} part `key` or `value`.\n\t\t * @param {string} text What was typed.\n\t\t * @return {void}\n\t\t */\n\t\tsetPair(index, part, text) {\n\t\t\tconst rows = this.pairRows.map((row) => ({ ...row }))\n\t\t\trows[index] = { ...rows[index], [part]: part === 'value' && this.field.valueType === 'number' && text !== '' ? Number(text) : text }\n\t\t\tthis.emitValue(rows)\n\t\t},\n\n\t\t/** Add an empty pair. */\n\t\taddPair() {\n\t\t\tthis.emitValue([...this.pairRows, { key: '', value: '' }])\n\t\t},\n\n\t\t/**\n\t\t * Remove a pair.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @return {void}\n\t\t */\n\t\tremovePair(index) {\n\t\t\tthis.emitValue(this.pairRows.filter((_row, at) => at !== index))\n\t\t},\n\n\t\t/**\n\t\t * The storable values of what a multi-select emits.\n\t\t *\n\t\t * @param {Array|null} emitted The chosen options.\n\t\t * @return {Array}\n\t\t */\n\t\toptionValues(emitted) {\n\t\t\treturn (Array.isArray(emitted) ? emitted : []).map((option) => this.optionValue(option))\n\t\t},\n\n\t\t/**\n\t\t * The storable value of what NcSelect emits.\n\t\t *\n\t\t * @param {object|string|number|null} emitted An option, or null on clear.\n\t\t * @return {string|number|boolean|null}\n\t\t */\n\t\toptionValue(emitted) {\n\t\t\tif (emitted === null || emitted === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn typeof emitted === 'object' && 'value' in emitted ? emitted.value : emitted\n\t\t},\n\n\t\t/**\n\t\t * Open or close one day of a week-hours field; an opened day takes\n\t\t * `defaultOpens`/`defaultCloses` (08:00 to 17:00).\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {boolean} open Whether it is open.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayOpen(day, open) {\n\t\t\tconst hours = open ? { opens: this.field.defaultOpens || '08:00', closes: this.field.defaultCloses || '17:00' } : null\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: hours })\n\t\t},\n\n\t\t/**\n\t\t * Change one time of an open day.\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {string} part `opens` or `closes`.\n\t\t * @param {string} time The time, `HH:MM`.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayTime(day, part, time) {\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: { ...(this.weekValue[day] || {}), [part]: time } })\n\t\t},\n\n\t\t/**\n\t\t * The option a pairs value selects; an id no object answers keeps its id as label.\n\t\t *\n\t\t * @param {unknown} value The stored id.\n\t\t * @return {object|null}\n\t\t */\n\t\tsourceOption(value) {\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.sourceOptions.find((option) => String(option.value) === String(value)) || { label: String(value), value }\n\t\t},\n\n\t\t/**\n\t\t * Read the objects a pairs field's values are chosen from:\n\t\t * `valueSource { register, schema, labelField?, valueField?, limit? }`.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadSourceOptions() {\n\t\t\tconst source = this.kind === 'pairs' ? this.field.valueSource : null\n\t\t\tif (!source || !source.register || !source.schema) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst limit = Number(source.limit) > 0 ? Number(source.limit) : 1000\n\t\t\tthis.sourceLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = `/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}?_limit=${limit}`\n\t\t\t\tconst { data } = await axios.get(prefixUrl(url))\n\t\t\t\tconst list = Array.isArray(data?.results) ? data.results : []\n\t\t\t\tthis.sourceOptions = list.filter((item) => item && typeof item === 'object').map((item) => {\n\t\t\t\t\tconst value = source.valueField ? readPath(item, source.valueField) : (item.id ?? item.uuid ?? item['@self']?.id)\n\t\t\t\t\tconst label = source.labelField ? readPath(item, source.labelField) : (item.name ?? item.title)\n\t\t\t\t\treturn { label: String(label || value || ''), value }\n\t\t\t\t})\n\t\t\t\tthis.sourceTruncated = Number(data?.total) > list.length\n\t\t\t} catch {\n\t\t\t\tthis.sourceOptions = []\n\t\t\t\tthis.sourceTruncated = false\n\t\t\t} finally {\n\t\t\t\tthis.sourceLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read a sourced select's options: a list (or the list at\n\t\t * `optionsPath`, or under `results`) mapped through `optionLabel` and\n\t\t * `optionValue` (dotted paths; default `label`/`title`/`name` and `value`/`id`).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadOptions() {\n\t\t\tconst url = this.kind === 'select' && !Array.isArray(this.field.options) ? this.field.optionsUrl : ''\n\t\t\tif (!url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.optionsLoading = true\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(url), { headers: buildHeaders() })\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.fetchedOptions = []\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst list = this.field.optionsPath ? readPath(data, this.field.optionsPath) : (Array.isArray(data) ? data : data?.results)\n\t\t\t\tthis.fetchedOptions = (Array.isArray(list) ? list : []).map((item) => {\n\t\t\t\t\tif (!item || typeof item !== 'object') {\n\t\t\t\t\t\treturn { label: String(item), value: item }\n\t\t\t\t\t}\n\t\t\t\t\tconst value = this.field.optionValue ? readPath(item, this.field.optionValue) : (item.value ?? item.id)\n\t\t\t\t\tconst label = this.field.optionLabel ? readPath(item, this.field.optionLabel) : (item.label ?? item.title ?? item.name ?? value)\n\t\t\t\t\tconst detail = this.field.optionDetail ? readPath(item, this.field.optionDetail) : ''\n\t\t\t\t\treturn { label: detail ? `${label ?? ''} (${detail})` : String(label ?? ''), value }\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.optionsLoading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-settings-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__error {\n\tmargin: 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__image {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__image-label {\n\tfont-weight: 600;\n}\n\n/* A note: the field's label, then a line of muted text where a control would\n stand (DqInstellingenAlgemeen \"Toegestane websites (CORS)\"). */\n.cn-settings-field__note {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__note-label {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__note-text {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__image-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__image-tile {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 64px;\n\theight: 64px;\n\toverflow: hidden;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tbackground: var(--color-primary-element-light);\n}\n\n.cn-settings-field__image-tile img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tobject-fit: contain;\n}\n\n.cn-settings-field__image-initials {\n\tfont-size: 20px;\n\tfont-weight: 700;\n\tcolor: var(--color-primary-element-light-text, var(--color-primary-element));\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__option-description {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__heading {\n\tmargin: 8px 0 0;\n\tfont-size: 16px;\n\tfont-weight: 600;\n}\n\n.cn-settings-field__radio {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__week {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__day {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n}\n\n.cn-settings-field__day > :first-child {\n\tflex: 0 0 160px;\n}\n\n.cn-settings-field__pairs {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: flex-start;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__pair {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n\twidth: 100%;\n}\n\n.cn-settings-field__pair > :not(button) {\n\tflex: 1 1 140px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__radio-legend {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__option-description {\n\tmargin: 0 0 8px calc(var(--default-grid-baseline, 4px) * 9);\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__action-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__error {\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["t","axios"],"mappings":"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"}
1
+ {"version":3,"file":"CnSettingsField.vue2.js","sources":["../../../../src/components/CnSettingsField/CnSettingsField.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-settings-field\" :class=\"`cn-settings-field--${kind}`\" :data-testid=\"`cn-settings-field-${field.key}`\">\n\t\t<h3 v-if=\"kind === 'heading'\" class=\"cn-settings-field__heading\">\n\t\t\t{{ label }}\n\t\t</h3>\n\t\t<NcNoteCard\n\t\t\tv-else-if=\"kind === 'status'\"\n\t\t\t:type=\"statusTone\"\n\t\t\t:role=\"statusTone === 'error' || statusTone === 'warning' ? 'alert' : 'status'\"\n\t\t\t:data-testid=\"`cn-settings-field-status-${field.key}`\">\n\t\t\t{{ field.text }}\n\t\t</NcNoteCard>\n\t\t<div v-else-if=\"kind === 'note'\" class=\"cn-settings-field__note\">\n\t\t\t<span class=\"cn-settings-field__note-label\">{{ label }}</span>\n\t\t\t<p class=\"cn-settings-field__note-text\" :data-testid=\"`cn-settings-field-note-${field.key}`\">\n\t\t\t\t{{ field.text }}\n\t\t\t</p>\n\t\t</div>\n\t\t<div v-else-if=\"kind === 'action'\" class=\"cn-settings-field__action\">\n\t\t\t<div class=\"cn-settings-field__action-row\">\n\t\t\t\t<NcButton v-if=\"field.href\"\n\t\t\t\t\t:href=\"actionHref\"\n\t\t\t\t\t:target=\"field.target || undefined\"\n\t\t\t\t\t:rel=\"field.target === '_blank' ? 'noopener noreferrer' : undefined\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\">\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-else\n\t\t\t\t\t:disabled=\"field.readOnly || field.actionBusy\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\"\n\t\t\t\t\t@click=\"runAction\">\n\t\t\t\t\t<template v-if=\"field.actionBusy\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<NcNoteCard v-if=\"field.actionResult\"\n\t\t\t\t:type=\"field.actionResult.type\"\n\t\t\t\t:role=\"field.actionResult.type === 'error' ? 'alert' : 'status'\"\n\t\t\t\t:data-testid=\"`cn-settings-field-action-result-${field.key}`\">\n\t\t\t\t{{ field.actionResult.text }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'radio'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"inputId\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:modelValue=\"modelValue === null || modelValue === undefined ? '' : String(modelValue)\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"emitValue(option.value)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'checkboxes'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:modelValue=\"listValue.some((entry) => String(entry) === String(option.value))\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"toggleOption(option.value, $event)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'pairs'\"\n\t\t\tclass=\"cn-settings-field__pairs\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"(row, index) in pairRows\"\n\t\t\t\t:key=\"index\"\n\t\t\t\tclass=\"cn-settings-field__pair\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-${field.key}`\">\n\t\t\t\t<NcTextField\n\t\t\t\t\t:label=\"pairKeyLabel\"\n\t\t\t\t\t:modelValue=\"row.key\"\n\t\t\t\t\t:maxlength=\"field.keyMaxLength\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'key', $event)\" />\n\t\t\t\t<NcSelect v-if=\"field.valueSource\"\n\t\t\t\t\t:modelValue=\"sourceOption(row.value)\"\n\t\t\t\t\t:options=\"sourceOptions\"\n\t\t\t\t\t:inputLabel=\"pairValueLabel\"\n\t\t\t\t\t:loading=\"sourceLoading\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event ? $event.value : '')\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:label=\"pairValueLabel\"\n\t\t\t\t\t:type=\"field.valueType === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t:modelValue=\"row.value === null || row.value === undefined ? '' : String(row.value)\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event)\" />\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t:ariaLabel=\"t('nextcloud-vue', 'Remove {name}', { name: row.key || pairKeyLabel })\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-pair-remove-${field.key}`\"\n\t\t\t\t\t@click=\"removePair(index)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<p v-if=\"sourceTruncated\"\n\t\t\t\tclass=\"cn-settings-field__hint\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pairs-truncated-${field.key}`\">\n\t\t\t\t{{ t('nextcloud-vue', 'Only the first {count} choices are listed.', { count: sourceOptions.length }) }}\n\t\t\t</p>\n\t\t\t<NcButton\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-add-${field.key}`\"\n\t\t\t\t@click=\"addPair\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ field.addLabel || t('nextcloud-vue', 'Add a row') }}\n\t\t\t</NcButton>\n\t\t</fieldset>\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-else-if=\"kind === 'switch' || kind === 'boolean'\"\n\t\t\t:type=\"kind === 'switch' ? 'switch' : 'checkbox'\"\n\t\t\t:modelValue=\"!!modelValue\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\">\n\t\t\t{{ label }}\n\t\t</NcCheckboxRadioSwitch>\n\t\t<div v-else-if=\"kind === 'image'\"\n\t\t\tclass=\"cn-settings-field__image\"\n\t\t\trole=\"group\"\n\t\t\t:aria-labelledby=\"`${inputId}-label`\">\n\t\t\t<!-- `hideLabel` keeps the name for a screen reader only. -->\n\t\t\t<span :id=\"`${inputId}-label`\"\n\t\t\t\tclass=\"cn-settings-field__image-label\"\n\t\t\t\t:class=\"{ 'hidden-visually': field.hideLabel === true }\">{{ label }}</span>\n\t\t\t<div class=\"cn-settings-field__image-row\">\n\t\t\t\t<span class=\"cn-settings-field__image-tile\" :data-testid=\"`cn-settings-field-image-${field.key}`\">\n\t\t\t\t\t<img v-if=\"stringValue\" :src=\"stringValue\" :alt=\"t('nextcloud-vue', 'Current {name}', { name: label })\">\n\t\t\t\t\t<span v-else class=\"cn-settings-field__image-initials\" aria-hidden=\"true\">{{ field.initials || '' }}</span>\n\t\t\t\t</span>\n\t\t\t\t<input\n\t\t\t\t\t:id=\"inputId\"\n\t\t\t\t\tref=\"file\"\n\t\t\t\t\tclass=\"hidden-visually\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t:accept=\"field.accept || 'image/*'\"\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t:aria-labelledby=\"`${inputId}-label`\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t@change=\"upload($event.target.files && $event.target.files[0])\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"!field.readOnly && field.uploadUrl\"\n\t\t\t\t\t:disabled=\"uploading\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-upload-${field.key}`\"\n\t\t\t\t\t@click=\"$refs.file && $refs.file.click()\">\n\t\t\t\t\t<template v-if=\"uploading\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ field.uploadLabel || t('nextcloud-vue', 'Upload {name}', { name: label }) }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\t\t<NcSelect\n\t\t\tv-else-if=\"kind === 'select'\"\n\t\t\t:inputId=\"inputId\"\n\t\t\t:modelValue=\"field.multiple ? selectedOptions : selectedOption\"\n\t\t\t:options=\"normalizedOptions\"\n\t\t\t:multiple=\"!!field.multiple\"\n\t\t\t:inputLabel=\"label\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:loading=\"optionsLoading\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:clearable=\"!field.required\"\n\t\t\tlabel=\"label\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue(field.multiple ? optionValues($event) : optionValue($event))\" />\n\t\t<NcTextArea\n\t\t\tv-else-if=\"kind === 'textarea' || kind === 'lines'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:rows=\"field.rows || 4\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<div v-else-if=\"kind === 'secret'\" class=\"cn-settings-field__secret\">\n\t\t\t<NcTextField\n\t\t\t\t:id=\"inputId\"\n\t\t\t\t:label=\"label\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t:modelValue=\"stringValue\"\n\t\t\t\t:placeholder=\"field.secretSet ? secretSetPlaceholder : (field.placeholder || '')\"\n\t\t\t\t:readonly=\"field.readOnly\"\n\t\t\t\t:disabled=\"field.clearing === true\"\n\t\t\t\t:error=\"!!error\"\n\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t\t<NcCheckboxRadioSwitch v-if=\"field.clearable && field.secretSet\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t:modelValue=\"field.clearing === true\"\n\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t:data-testid=\"`cn-settings-field-clear-${field.key}`\"\n\t\t\t\t@update:modelValue=\"onClear\">\n\t\t\t\t{{ field.clearLabel || t('nextcloud-vue', 'Remove the stored value') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'week-hours'\"\n\t\t\tclass=\"cn-settings-field__week\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"day in weekDays\"\n\t\t\t\t:key=\"day.key\"\n\t\t\t\tclass=\"cn-settings-field__day\"\n\t\t\t\t:data-testid=\"`cn-settings-field-day-${day.key}`\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:modelValue=\"!!weekValue[day.key]\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Open on {day}', { day: day.label })\"\n\t\t\t\t\t@update:modelValue=\"setDayOpen(day.key, $event)\">\n\t\t\t\t\t{{ day.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<template v-if=\"weekValue[day.key]\">\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Opens on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].opens || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'opens', $event)\" />\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Closes on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].closes || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'closes', $event)\" />\n\t\t\t\t</template>\n\t\t\t\t<span v-else class=\"cn-settings-field__hint\">{{ t('nextcloud-vue', 'Closed') }}</span>\n\t\t\t</div>\n\t\t</fieldset>\n\t\t<NcTextField\n\t\t\tv-else-if=\"kind === 'number'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\ttype=\"number\"\n\t\t\t:min=\"field.min\"\n\t\t\t:max=\"field.max\"\n\t\t\t:step=\"numberStep\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event === '' ? null : Number($event))\" />\n\t\t<NcTextField\n\t\t\tv-else\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:type=\"inputType\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<p v-if=\"shownError\"\n\t\t\t:id=\"`${inputId}-error`\"\n\t\t\tclass=\"cn-settings-field__error\"\n\t\t\t:data-testid=\"`cn-settings-field-error-${field.key}`\">\n\t\t\t{{ shownError }}\n\t\t</p>\n\t\t<p v-else-if=\"hint\" :id=\"`${inputId}-hint`\" class=\"cn-settings-field__hint\">\n\t\t\t{{ hint }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { getDayNames, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { serverErrorMessage } from '../../utils/serverErrorMessage.js'\n\nlet fieldUid = 0\n\n/** Field types and the names CnSettingsPage's manifest uses for them. */\nconst KIND_ALIASES = { enum: 'select', string: 'text', datetime: 'datetime-local', 'date-time': 'datetime-local' }\n\n/** The days of a week, Monday first: the keys a week-hours value uses. */\nconst WEEK_DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']\n\n/** The same keys in the order of getDayNames(), which starts on Sunday. */\nconst WEEK_DAYS_FROM_SUNDAY = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']\n\n/** The kinds drawn as a text field with their own input type. */\nconst INPUT_TYPES = ['password', 'date', 'datetime-local', 'email', 'url']\n\n/**\n * CnSettingsField - one settings field: the control for its type with its\n * label, and under it an error or a hint. Shared by CnSettingsPage and\n * CnSettingsFieldsSection.\n *\n * Types: `text` (default), `textarea`, `number`, `switch`, `boolean` (a checkbox),\n * `select` (`enum`) with static `options` or options read from `optionsUrl`,\n * `password` (a masked input that shows its value back) and `secret`\n * (replace-only: the input stays empty, and with `secretSet` says a value is\n * stored; the host sends it only when something is typed), and `image` (a\n * preview tile, the initials without an image, and an upload button that\n * posts the file to `uploadUrl` at once and emits `uploaded`), `radio` (one\n * choice from `options`, each with an optional `description` under it),\n * `lines` (a textarea, one entry per line), `checkboxes` (several choices\n * from `options`, the value a list; `select` with `multiple` is the same as a\n * multi-select) and `pairs` (key-to-value rows with add and remove, the value\n * a list of `{ key, value }` rows). Three types hold no value of their\n * own: `heading` (a subheading between fields), `status` (a read-only note:\n * the host passes its `text` and `tone`) and `action` (a button that emits\n * `action`; the host passes `actionBusy` and the `actionResult` note).\n * `date`, `datetime-local` (also `datetime`, `date-time`), `email` and `url`\n * are text fields of that input type; the value stays the text the input holds.\n *\n * ```vue\n * <CnSettingsField\n * :field=\"{ key: 'apiKey', label: 'API key', type: 'secret', secretSet: true }\"\n * v-model=\"form.apiKey\" />\n * ```\n */\nexport default {\n\tname: 'CnSettingsField',\n\n\tcomponents: { Close, NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField, Plus },\n\n\tprops: {\n\t\t/**\n\t\t * The field: `{ key, label, type?, options?, optionsUrl?, optionsPath?,\n\t\t * optionLabel?, optionValue?, optionDetail?, placeholder?, rows?, min?, max?, required?,\n\t\t * readOnly?, secretSet? }`. `label` arrives translated.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tfield: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The value: text, a number, a boolean or a select value. Any type,\n\t\t * because a Boolean in a type list would read an empty string as true.\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: null,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** A validation message, drawn under the control and tied to it. */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** A hint under the control (not drawn while there is an error). */\n\t\thint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'uploaded', 'action', 'clear'],\n\n\tdata() {\n\t\tfieldUid += 1\n\t\treturn {\n\t\t\tuid: fieldUid,\n\t\t\tfetchedOptions: null,\n\t\t\toptionsLoading: false,\n\t\t\tsourceOptions: [],\n\t\t\tsourceLoading: false,\n\t\t\tsourceTruncated: false,\n\t\t\tuploading: false,\n\t\t\tuploadError: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {string} The control kind. */\n\t\tkind() {\n\t\t\tconst type = String(this.field.type || 'text')\n\t\t\treturn KIND_ALIASES[type] || type\n\t\t},\n\n\t\t/** @return {string} The input type of a text-like field. */\n\t\tinputType() {\n\t\t\treturn INPUT_TYPES.includes(this.kind) ? this.kind : 'text'\n\t\t},\n\n\t\t/**\n\t\t * The number input's step: the field's own, 1 for a whole number, else\n\t\t * any, so a decimal value (0.8) is not invalid to the browser.\n\t\t *\n\t\t * @return {string}\n\t\t * @spec openspec/changes/settings-number-decimal-step/specs/settings-fields/spec.md#requirement-a-number-setting-steps-as-it-is-declared\n\t\t */\n\t\tnumberStep() {\n\t\t\tif (typeof this.field.step === 'number' || (typeof this.field.step === 'string' && this.field.step !== '')) {\n\t\t\t\treturn String(this.field.step)\n\t\t\t}\n\t\t\treturn this.field.integer ? '1' : 'any'\n\t\t},\n\n\t\t/** @return {string} The label. */\n\t\tlabel() {\n\t\t\treturn String(this.field.label || this.field.key || '')\n\t\t},\n\n\t\t/** @return {string} The control's id. */\n\t\tinputId() {\n\t\t\treturn `cn-settings-field-${this.uid}-${String(this.field.key).replace(/[^A-Za-z0-9_-]/g, '-')}`\n\t\t},\n\n\t\t/** @return {string} The message shown under the control: an upload failure, else `error`. */\n\t\tshownError() {\n\t\t\treturn this.uploadError || this.error\n\t\t},\n\n\t\t/** @return {string|null} The id of the error or hint the control is described by. */\n\t\tdescribedBy() {\n\t\t\tif (this.shownError) {\n\t\t\t\treturn `${this.inputId}-error`\n\t\t\t}\n\t\t\treturn this.hint ? `${this.inputId}-hint` : null\n\t\t},\n\n\t\t/** @return {string} A status note's tone: `info`, `success`, `warning` or `error`. */\n\t\tstatusTone() {\n\t\t\treturn ['info', 'success', 'warning', 'error'].includes(this.field.tone) ? this.field.tone : 'info'\n\t\t},\n\n\t\t/** @return {string} The value as text for a text control. */\n\t\tstringValue() {\n\t\t\treturn this.modelValue === null || this.modelValue === undefined ? '' : String(this.modelValue)\n\t\t},\n\n\t\t/** @return {Array<{key: string, label: string}>} The days of a week-hours field, Monday first by default. */\n\t\tweekDays() {\n\t\t\tconst names = getDayNames()\n\t\t\tconst days = Array.isArray(this.field.days) && this.field.days.length > 0 ? this.field.days : WEEK_DAYS\n\t\t\treturn days.map((key) => ({ key, label: names[WEEK_DAYS_FROM_SUNDAY.indexOf(key)] || key }))\n\t\t},\n\n\t\t/** @return {object} A week-hours field's value: day to `{ opens, closes }` or null. */\n\t\tweekValue() {\n\t\t\treturn this.modelValue && typeof this.modelValue === 'object' && !Array.isArray(this.modelValue) ? this.modelValue : {}\n\t\t},\n\n\t\t/** @return {string} An action link's address, with the web root for an app path. */\n\t\tactionHref() {\n\t\t\treturn prefixUrl(String(this.field.href || ''))\n\t\t},\n\n\t\t/** @return {string} The placeholder of a secret that is stored. */\n\t\tsecretSetPlaceholder() {\n\t\t\treturn t('nextcloud-vue', 'Stored. Type a new value to replace it.')\n\t\t},\n\n\t\t/**\n\t\t * The select options as `{ label, value }`: the static `options` (strings,\n\t\t * numbers or objects), or those read from `optionsUrl`.\n\t\t *\n\t\t * @return {Array<{label: string, value: (string|number|boolean)}>}\n\t\t */\n\t\tnormalizedOptions() {\n\t\t\tconst raw = Array.isArray(this.field.options) ? this.field.options : (this.fetchedOptions || [])\n\t\t\treturn raw.map((option) => (option && typeof option === 'object'\n\t\t\t\t? { ...option, label: String(option.label ?? option.value ?? ''), value: option.value }\n\t\t\t\t: { label: String(option), value: option }))\n\t\t},\n\n\t\t/** @return {Array} The value as a list, for a multi-choice field. */\n\t\tlistValue() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {Array<object>} The options a multi-select's value selects. */\n\t\tselectedOptions() {\n\t\t\treturn this.listValue.map((value) => this.normalizedOptions.find((option) => String(option.value) === String(value))\n\t\t\t\t|| { label: String(value), value })\n\t\t},\n\n\t\t/** @return {Array<{key: string, value: unknown}>} A pairs field's rows. */\n\t\tpairRows() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {string} The label of a pair's key. */\n\t\tpairKeyLabel() {\n\t\t\treturn String(this.field.keyLabel || t('nextcloud-vue', 'Key'))\n\t\t},\n\n\t\t/** @return {string} The label of a pair's value. */\n\t\tpairValueLabel() {\n\t\t\treturn String(this.field.valueLabel || t('nextcloud-vue', 'Value'))\n\t\t},\n\n\t\t/** @return {object|null} The option the value selects, for NcSelect. */\n\t\tselectedOption() {\n\t\t\tif (this.modelValue === null || this.modelValue === undefined || this.modelValue === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// A stored value is often text where the options carry numbers (an\n\t\t\t// app config holding an id), so the two are compared as text.\n\t\t\treturn this.normalizedOptions.find((option) => option.value === this.modelValue)\n\t\t\t\t|| this.normalizedOptions.find((option) => String(option.value) === String(this.modelValue))\n\t\t\t\t|| { label: String(this.modelValue), value: this.modelValue }\n\t\t},\n\t},\n\n\twatch: {\n\t\t'field.optionsUrl': {\n\t\t\thandler() {\n\t\t\t\tthis.loadOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\n\t\t'field.valueSource': {\n\t\t\thandler() {\n\t\t\t\tthis.loadSourceOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The \"remove the stored value\" switch of a secret changed.\n\t\t *\n\t\t * @param {boolean} on Whether the stored value is to be removed.\n\t\t * @return {void}\n\t\t */\n\t\tonClear(on) {\n\t\t\t/** @event clear The stored secret is to be removed (true) or kept (false). */\n\t\t\tthis.$emit('clear', on === true)\n\t\t},\n\n\t\tt,\n\n\t\t/** Ask the host to run an `action` field's action. */\n\t\trunAction() {\n\t\t\t/** @event action The user pressed an `action` field's button. */\n\t\t\tthis.$emit('action')\n\t\t},\n\n\t\t/**\n\t\t * Upload a chosen image to `uploadUrl` as multipart form data (the\n\t\t * file under `uploadField`, default `image`, plus `uploadParams`), then\n\t\t * take the new image url from the answer at `uploadValuePath` (or a\n\t\t * cache-busted `previewUrl`).\n\t\t *\n\t\t * @param {File|undefined} file The chosen file.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/settings-fields-section/specs/settings-fields-section/spec.md#requirement-an-image-field-uploads-at-once\n\t\t */\n\t\tasync upload(file) {\n\t\t\tif (!file || !this.field.uploadUrl) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst form = new FormData()\n\t\t\tfor (const [name, value] of Object.entries(this.field.uploadParams || {})) {\n\t\t\t\tform.append(name, value)\n\t\t\t}\n\t\t\tform.append(this.field.uploadField || 'image', file)\n\t\t\tthis.uploading = true\n\t\t\tthis.uploadError = ''\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(prefixUrl(this.field.uploadUrl), form)\n\t\t\t\tconst fromAnswer = this.field.uploadValuePath ? readPath(response?.data, this.field.uploadValuePath) : ''\n\t\t\t\tconst next = fromAnswer || (this.field.previewUrl ? `${prefixUrl(this.field.previewUrl)}${this.field.previewUrl.includes('?') ? '&' : '?'}v=${Date.now()}` : '')\n\t\t\t\t/**\n\t\t\t\t * @event uploaded An image was uploaded. Payload: its new url.\n\t\t\t\t */\n\t\t\t\tthis.$emit('uploaded', next)\n\t\t\t} catch (error) {\n\t\t\t\tthis.uploadError = t('nextcloud-vue', 'The image could not be uploaded: {reason}', { reason: serverErrorMessage(error) })\n\t\t\t} finally {\n\t\t\t\tthis.uploading = false\n\t\t\t\tif (this.$refs.file) {\n\t\t\t\t\tthis.$refs.file.value = ''\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Report a new value.\n\t\t *\n\t\t * @param {unknown} value The value.\n\t\t * @return {void}\n\t\t */\n\t\temitValue(value) {\n\t\t\t/**\n\t\t\t * @event update:modelValue The value changed. Payload: the new value.\n\t\t\t */\n\t\t\tthis.$emit('update:modelValue', value)\n\t\t},\n\n\t\t/**\n\t\t * Check or uncheck one choice of a `checkboxes` field; the list keeps\n\t\t * the order of the options.\n\t\t *\n\t\t * @param {string|number} value The option's value.\n\t\t * @param {boolean} checked Whether it is now checked.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleOption(value, checked) {\n\t\t\tconst chosen = new Set(this.listValue.map(String))\n\t\t\tif (checked) {\n\t\t\t\tchosen.add(String(value))\n\t\t\t} else {\n\t\t\t\tchosen.delete(String(value))\n\t\t\t}\n\t\t\tthis.emitValue(this.normalizedOptions.filter((option) => chosen.has(String(option.value))).map((option) => option.value))\n\t\t},\n\n\t\t/**\n\t\t * Change a pair's key or value.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @param {string} part `key` or `value`.\n\t\t * @param {string} text What was typed.\n\t\t * @return {void}\n\t\t */\n\t\tsetPair(index, part, text) {\n\t\t\tconst rows = this.pairRows.map((row) => ({ ...row }))\n\t\t\trows[index] = { ...rows[index], [part]: part === 'value' && this.field.valueType === 'number' && text !== '' ? Number(text) : text }\n\t\t\tthis.emitValue(rows)\n\t\t},\n\n\t\t/** Add an empty pair. */\n\t\taddPair() {\n\t\t\tthis.emitValue([...this.pairRows, { key: '', value: '' }])\n\t\t},\n\n\t\t/**\n\t\t * Remove a pair.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @return {void}\n\t\t */\n\t\tremovePair(index) {\n\t\t\tthis.emitValue(this.pairRows.filter((_row, at) => at !== index))\n\t\t},\n\n\t\t/**\n\t\t * The storable values of what a multi-select emits.\n\t\t *\n\t\t * @param {Array|null} emitted The chosen options.\n\t\t * @return {Array}\n\t\t */\n\t\toptionValues(emitted) {\n\t\t\treturn (Array.isArray(emitted) ? emitted : []).map((option) => this.optionValue(option))\n\t\t},\n\n\t\t/**\n\t\t * The storable value of what NcSelect emits.\n\t\t *\n\t\t * @param {object|string|number|null} emitted An option, or null on clear.\n\t\t * @return {string|number|boolean|null}\n\t\t */\n\t\toptionValue(emitted) {\n\t\t\tif (emitted === null || emitted === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn typeof emitted === 'object' && 'value' in emitted ? emitted.value : emitted\n\t\t},\n\n\t\t/**\n\t\t * Open or close one day of a week-hours field; an opened day takes\n\t\t * `defaultOpens`/`defaultCloses` (08:00 to 17:00).\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {boolean} open Whether it is open.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayOpen(day, open) {\n\t\t\tconst hours = open ? { opens: this.field.defaultOpens || '08:00', closes: this.field.defaultCloses || '17:00' } : null\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: hours })\n\t\t},\n\n\t\t/**\n\t\t * Change one time of an open day.\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {string} part `opens` or `closes`.\n\t\t * @param {string} time The time, `HH:MM`.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayTime(day, part, time) {\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: { ...(this.weekValue[day] || {}), [part]: time } })\n\t\t},\n\n\t\t/**\n\t\t * The option a pairs value selects; an id no object answers keeps its id as label.\n\t\t *\n\t\t * @param {unknown} value The stored id.\n\t\t * @return {object|null}\n\t\t */\n\t\tsourceOption(value) {\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.sourceOptions.find((option) => String(option.value) === String(value)) || { label: String(value), value }\n\t\t},\n\n\t\t/**\n\t\t * Read the objects a pairs field's values are chosen from:\n\t\t * `valueSource { register, schema, labelField?, valueField?, limit? }`.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadSourceOptions() {\n\t\t\tconst source = this.kind === 'pairs' ? this.field.valueSource : null\n\t\t\tif (!source || !source.register || !source.schema) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst limit = Number(source.limit) > 0 ? Number(source.limit) : 1000\n\t\t\tthis.sourceLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = `/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}?_limit=${limit}`\n\t\t\t\tconst { data } = await axios.get(prefixUrl(url))\n\t\t\t\tconst list = Array.isArray(data?.results) ? data.results : []\n\t\t\t\tthis.sourceOptions = list.filter((item) => item && typeof item === 'object').map((item) => {\n\t\t\t\t\tconst value = source.valueField ? readPath(item, source.valueField) : (item.id ?? item.uuid ?? item['@self']?.id)\n\t\t\t\t\tconst label = source.labelField ? readPath(item, source.labelField) : (item.name ?? item.title)\n\t\t\t\t\treturn { label: String(label || value || ''), value }\n\t\t\t\t})\n\t\t\t\tthis.sourceTruncated = Number(data?.total) > list.length\n\t\t\t} catch {\n\t\t\t\tthis.sourceOptions = []\n\t\t\t\tthis.sourceTruncated = false\n\t\t\t} finally {\n\t\t\t\tthis.sourceLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read a sourced select's options: a list (or the list at\n\t\t * `optionsPath`, or under `results`) mapped through `optionLabel` and\n\t\t * `optionValue` (dotted paths; default `label`/`title`/`name` and `value`/`id`).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadOptions() {\n\t\t\tconst url = this.kind === 'select' && !Array.isArray(this.field.options) ? this.field.optionsUrl : ''\n\t\t\tif (!url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.optionsLoading = true\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(url), { headers: buildHeaders() })\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.fetchedOptions = []\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst list = this.field.optionsPath ? readPath(data, this.field.optionsPath) : (Array.isArray(data) ? data : data?.results)\n\t\t\t\tthis.fetchedOptions = (Array.isArray(list) ? list : []).map((item) => {\n\t\t\t\t\tif (!item || typeof item !== 'object') {\n\t\t\t\t\t\treturn { label: String(item), value: item }\n\t\t\t\t\t}\n\t\t\t\t\tconst value = this.field.optionValue ? readPath(item, this.field.optionValue) : (item.value ?? item.id)\n\t\t\t\t\tconst label = this.field.optionLabel ? readPath(item, this.field.optionLabel) : (item.label ?? item.title ?? item.name ?? value)\n\t\t\t\t\tconst detail = this.field.optionDetail ? readPath(item, this.field.optionDetail) : ''\n\t\t\t\t\treturn { label: detail ? `${label ?? ''} (${detail})` : String(label ?? ''), value }\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.optionsLoading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-settings-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__error {\n\tmargin: 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__image {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__image-label {\n\tfont-weight: 600;\n}\n\n/* A note: the field's label, then a line of muted text where a control would\n stand (DqInstellingenAlgemeen \"Toegestane websites (CORS)\"). */\n.cn-settings-field__note {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__note-label {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__note-text {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__image-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__image-tile {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 64px;\n\theight: 64px;\n\toverflow: hidden;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tbackground: var(--color-primary-element-light);\n}\n\n.cn-settings-field__image-tile img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tobject-fit: contain;\n}\n\n.cn-settings-field__image-initials {\n\tfont-size: 20px;\n\tfont-weight: 700;\n\tcolor: var(--color-primary-element-light-text, var(--color-primary-element));\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__option-description {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__heading {\n\tmargin: 8px 0 0;\n\tfont-size: 16px;\n\tfont-weight: 600;\n}\n\n.cn-settings-field__radio {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__week {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__day {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n}\n\n.cn-settings-field__day > :first-child {\n\tflex: 0 0 160px;\n}\n\n.cn-settings-field__pairs {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: flex-start;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__pair {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n\twidth: 100%;\n}\n\n.cn-settings-field__pair > :not(button) {\n\tflex: 1 1 140px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__radio-legend {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__option-description {\n\tmargin: 0 0 8px calc(var(--default-grid-baseline, 4px) * 9);\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__action-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__error {\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["t","axios"],"mappings":"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"}
@@ -469,12 +469,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
469
469
  type: "number",
470
470
  min: $props.field.min,
471
471
  max: $props.field.max,
472
+ step: $options.numberStep,
472
473
  modelValue: $options.stringValue,
473
474
  readonly: $props.field.readOnly,
474
475
  error: !!$props.error,
475
476
  "aria-describedby": $options.describedBy,
476
477
  "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => ($options.emitValue($event === '' ? null : Number($event))))
477
- }, null, 8 /* PROPS */, ["id", "label", "min", "max", "modelValue", "readonly", "error", "aria-describedby"]))
478
+ }, null, 8 /* PROPS */, ["id", "label", "min", "max", "step", "modelValue", "readonly", "error", "aria-describedby"]))
478
479
  : (openBlock(), createBlock(_component_NcTextField, {
479
480
  key: 14,
480
481
  id: $options.inputId,
@@ -1 +1 @@
1
- {"version":3,"file":"CnSettingsField.vue3.js","sources":["../../../../src/components/CnSettingsField/CnSettingsField.vue?vue&type=template&id=2f16c603&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-settings-field\" :class=\"`cn-settings-field--${kind}`\" :data-testid=\"`cn-settings-field-${field.key}`\">\n\t\t<h3 v-if=\"kind === 'heading'\" class=\"cn-settings-field__heading\">\n\t\t\t{{ label }}\n\t\t</h3>\n\t\t<NcNoteCard\n\t\t\tv-else-if=\"kind === 'status'\"\n\t\t\t:type=\"statusTone\"\n\t\t\t:role=\"statusTone === 'error' || statusTone === 'warning' ? 'alert' : 'status'\"\n\t\t\t:data-testid=\"`cn-settings-field-status-${field.key}`\">\n\t\t\t{{ field.text }}\n\t\t</NcNoteCard>\n\t\t<div v-else-if=\"kind === 'note'\" class=\"cn-settings-field__note\">\n\t\t\t<span class=\"cn-settings-field__note-label\">{{ label }}</span>\n\t\t\t<p class=\"cn-settings-field__note-text\" :data-testid=\"`cn-settings-field-note-${field.key}`\">\n\t\t\t\t{{ field.text }}\n\t\t\t</p>\n\t\t</div>\n\t\t<div v-else-if=\"kind === 'action'\" class=\"cn-settings-field__action\">\n\t\t\t<div class=\"cn-settings-field__action-row\">\n\t\t\t\t<NcButton v-if=\"field.href\"\n\t\t\t\t\t:href=\"actionHref\"\n\t\t\t\t\t:target=\"field.target || undefined\"\n\t\t\t\t\t:rel=\"field.target === '_blank' ? 'noopener noreferrer' : undefined\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\">\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-else\n\t\t\t\t\t:disabled=\"field.readOnly || field.actionBusy\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\"\n\t\t\t\t\t@click=\"runAction\">\n\t\t\t\t\t<template v-if=\"field.actionBusy\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<NcNoteCard v-if=\"field.actionResult\"\n\t\t\t\t:type=\"field.actionResult.type\"\n\t\t\t\t:role=\"field.actionResult.type === 'error' ? 'alert' : 'status'\"\n\t\t\t\t:data-testid=\"`cn-settings-field-action-result-${field.key}`\">\n\t\t\t\t{{ field.actionResult.text }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'radio'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"inputId\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:modelValue=\"modelValue === null || modelValue === undefined ? '' : String(modelValue)\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"emitValue(option.value)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'checkboxes'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:modelValue=\"listValue.some((entry) => String(entry) === String(option.value))\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"toggleOption(option.value, $event)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'pairs'\"\n\t\t\tclass=\"cn-settings-field__pairs\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"(row, index) in pairRows\"\n\t\t\t\t:key=\"index\"\n\t\t\t\tclass=\"cn-settings-field__pair\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-${field.key}`\">\n\t\t\t\t<NcTextField\n\t\t\t\t\t:label=\"pairKeyLabel\"\n\t\t\t\t\t:modelValue=\"row.key\"\n\t\t\t\t\t:maxlength=\"field.keyMaxLength\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'key', $event)\" />\n\t\t\t\t<NcSelect v-if=\"field.valueSource\"\n\t\t\t\t\t:modelValue=\"sourceOption(row.value)\"\n\t\t\t\t\t:options=\"sourceOptions\"\n\t\t\t\t\t:inputLabel=\"pairValueLabel\"\n\t\t\t\t\t:loading=\"sourceLoading\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event ? $event.value : '')\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:label=\"pairValueLabel\"\n\t\t\t\t\t:type=\"field.valueType === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t:modelValue=\"row.value === null || row.value === undefined ? '' : String(row.value)\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event)\" />\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t:ariaLabel=\"t('nextcloud-vue', 'Remove {name}', { name: row.key || pairKeyLabel })\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-pair-remove-${field.key}`\"\n\t\t\t\t\t@click=\"removePair(index)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<p v-if=\"sourceTruncated\"\n\t\t\t\tclass=\"cn-settings-field__hint\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pairs-truncated-${field.key}`\">\n\t\t\t\t{{ t('nextcloud-vue', 'Only the first {count} choices are listed.', { count: sourceOptions.length }) }}\n\t\t\t</p>\n\t\t\t<NcButton\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-add-${field.key}`\"\n\t\t\t\t@click=\"addPair\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ field.addLabel || t('nextcloud-vue', 'Add a row') }}\n\t\t\t</NcButton>\n\t\t</fieldset>\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-else-if=\"kind === 'switch' || kind === 'boolean'\"\n\t\t\t:type=\"kind === 'switch' ? 'switch' : 'checkbox'\"\n\t\t\t:modelValue=\"!!modelValue\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\">\n\t\t\t{{ label }}\n\t\t</NcCheckboxRadioSwitch>\n\t\t<div v-else-if=\"kind === 'image'\"\n\t\t\tclass=\"cn-settings-field__image\"\n\t\t\trole=\"group\"\n\t\t\t:aria-labelledby=\"`${inputId}-label`\">\n\t\t\t<!-- `hideLabel` keeps the name for a screen reader only. -->\n\t\t\t<span :id=\"`${inputId}-label`\"\n\t\t\t\tclass=\"cn-settings-field__image-label\"\n\t\t\t\t:class=\"{ 'hidden-visually': field.hideLabel === true }\">{{ label }}</span>\n\t\t\t<div class=\"cn-settings-field__image-row\">\n\t\t\t\t<span class=\"cn-settings-field__image-tile\" :data-testid=\"`cn-settings-field-image-${field.key}`\">\n\t\t\t\t\t<img v-if=\"stringValue\" :src=\"stringValue\" :alt=\"t('nextcloud-vue', 'Current {name}', { name: label })\">\n\t\t\t\t\t<span v-else class=\"cn-settings-field__image-initials\" aria-hidden=\"true\">{{ field.initials || '' }}</span>\n\t\t\t\t</span>\n\t\t\t\t<input\n\t\t\t\t\t:id=\"inputId\"\n\t\t\t\t\tref=\"file\"\n\t\t\t\t\tclass=\"hidden-visually\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t:accept=\"field.accept || 'image/*'\"\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t:aria-labelledby=\"`${inputId}-label`\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t@change=\"upload($event.target.files && $event.target.files[0])\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"!field.readOnly && field.uploadUrl\"\n\t\t\t\t\t:disabled=\"uploading\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-upload-${field.key}`\"\n\t\t\t\t\t@click=\"$refs.file && $refs.file.click()\">\n\t\t\t\t\t<template v-if=\"uploading\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ field.uploadLabel || t('nextcloud-vue', 'Upload {name}', { name: label }) }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\t\t<NcSelect\n\t\t\tv-else-if=\"kind === 'select'\"\n\t\t\t:inputId=\"inputId\"\n\t\t\t:modelValue=\"field.multiple ? selectedOptions : selectedOption\"\n\t\t\t:options=\"normalizedOptions\"\n\t\t\t:multiple=\"!!field.multiple\"\n\t\t\t:inputLabel=\"label\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:loading=\"optionsLoading\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:clearable=\"!field.required\"\n\t\t\tlabel=\"label\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue(field.multiple ? optionValues($event) : optionValue($event))\" />\n\t\t<NcTextArea\n\t\t\tv-else-if=\"kind === 'textarea' || kind === 'lines'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:rows=\"field.rows || 4\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<div v-else-if=\"kind === 'secret'\" class=\"cn-settings-field__secret\">\n\t\t\t<NcTextField\n\t\t\t\t:id=\"inputId\"\n\t\t\t\t:label=\"label\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t:modelValue=\"stringValue\"\n\t\t\t\t:placeholder=\"field.secretSet ? secretSetPlaceholder : (field.placeholder || '')\"\n\t\t\t\t:readonly=\"field.readOnly\"\n\t\t\t\t:disabled=\"field.clearing === true\"\n\t\t\t\t:error=\"!!error\"\n\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t\t<NcCheckboxRadioSwitch v-if=\"field.clearable && field.secretSet\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t:modelValue=\"field.clearing === true\"\n\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t:data-testid=\"`cn-settings-field-clear-${field.key}`\"\n\t\t\t\t@update:modelValue=\"onClear\">\n\t\t\t\t{{ field.clearLabel || t('nextcloud-vue', 'Remove the stored value') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'week-hours'\"\n\t\t\tclass=\"cn-settings-field__week\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"day in weekDays\"\n\t\t\t\t:key=\"day.key\"\n\t\t\t\tclass=\"cn-settings-field__day\"\n\t\t\t\t:data-testid=\"`cn-settings-field-day-${day.key}`\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:modelValue=\"!!weekValue[day.key]\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Open on {day}', { day: day.label })\"\n\t\t\t\t\t@update:modelValue=\"setDayOpen(day.key, $event)\">\n\t\t\t\t\t{{ day.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<template v-if=\"weekValue[day.key]\">\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Opens on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].opens || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'opens', $event)\" />\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Closes on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].closes || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'closes', $event)\" />\n\t\t\t\t</template>\n\t\t\t\t<span v-else class=\"cn-settings-field__hint\">{{ t('nextcloud-vue', 'Closed') }}</span>\n\t\t\t</div>\n\t\t</fieldset>\n\t\t<NcTextField\n\t\t\tv-else-if=\"kind === 'number'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\ttype=\"number\"\n\t\t\t:min=\"field.min\"\n\t\t\t:max=\"field.max\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event === '' ? null : Number($event))\" />\n\t\t<NcTextField\n\t\t\tv-else\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:type=\"inputType\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<p v-if=\"shownError\"\n\t\t\t:id=\"`${inputId}-error`\"\n\t\t\tclass=\"cn-settings-field__error\"\n\t\t\t:data-testid=\"`cn-settings-field-error-${field.key}`\">\n\t\t\t{{ shownError }}\n\t\t</p>\n\t\t<p v-else-if=\"hint\" :id=\"`${inputId}-hint`\" class=\"cn-settings-field__hint\">\n\t\t\t{{ hint }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { getDayNames, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { serverErrorMessage } from '../../utils/serverErrorMessage.js'\n\nlet fieldUid = 0\n\n/** Field types and the names CnSettingsPage's manifest uses for them. */\nconst KIND_ALIASES = { enum: 'select', string: 'text', datetime: 'datetime-local', 'date-time': 'datetime-local' }\n\n/** The days of a week, Monday first: the keys a week-hours value uses. */\nconst WEEK_DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']\n\n/** The same keys in the order of getDayNames(), which starts on Sunday. */\nconst WEEK_DAYS_FROM_SUNDAY = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']\n\n/** The kinds drawn as a text field with their own input type. */\nconst INPUT_TYPES = ['password', 'date', 'datetime-local', 'email', 'url']\n\n/**\n * CnSettingsField - one settings field: the control for its type with its\n * label, and under it an error or a hint. Shared by CnSettingsPage and\n * CnSettingsFieldsSection.\n *\n * Types: `text` (default), `textarea`, `number`, `switch`, `boolean` (a checkbox),\n * `select` (`enum`) with static `options` or options read from `optionsUrl`,\n * `password` (a masked input that shows its value back) and `secret`\n * (replace-only: the input stays empty, and with `secretSet` says a value is\n * stored; the host sends it only when something is typed), and `image` (a\n * preview tile, the initials without an image, and an upload button that\n * posts the file to `uploadUrl` at once and emits `uploaded`), `radio` (one\n * choice from `options`, each with an optional `description` under it),\n * `lines` (a textarea, one entry per line), `checkboxes` (several choices\n * from `options`, the value a list; `select` with `multiple` is the same as a\n * multi-select) and `pairs` (key-to-value rows with add and remove, the value\n * a list of `{ key, value }` rows). Three types hold no value of their\n * own: `heading` (a subheading between fields), `status` (a read-only note:\n * the host passes its `text` and `tone`) and `action` (a button that emits\n * `action`; the host passes `actionBusy` and the `actionResult` note).\n * `date`, `datetime-local` (also `datetime`, `date-time`), `email` and `url`\n * are text fields of that input type; the value stays the text the input holds.\n *\n * ```vue\n * <CnSettingsField\n * :field=\"{ key: 'apiKey', label: 'API key', type: 'secret', secretSet: true }\"\n * v-model=\"form.apiKey\" />\n * ```\n */\nexport default {\n\tname: 'CnSettingsField',\n\n\tcomponents: { Close, NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField, Plus },\n\n\tprops: {\n\t\t/**\n\t\t * The field: `{ key, label, type?, options?, optionsUrl?, optionsPath?,\n\t\t * optionLabel?, optionValue?, optionDetail?, placeholder?, rows?, min?, max?, required?,\n\t\t * readOnly?, secretSet? }`. `label` arrives translated.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tfield: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The value: text, a number, a boolean or a select value. Any type,\n\t\t * because a Boolean in a type list would read an empty string as true.\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: null,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** A validation message, drawn under the control and tied to it. */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** A hint under the control (not drawn while there is an error). */\n\t\thint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'uploaded', 'action', 'clear'],\n\n\tdata() {\n\t\tfieldUid += 1\n\t\treturn {\n\t\t\tuid: fieldUid,\n\t\t\tfetchedOptions: null,\n\t\t\toptionsLoading: false,\n\t\t\tsourceOptions: [],\n\t\t\tsourceLoading: false,\n\t\t\tsourceTruncated: false,\n\t\t\tuploading: false,\n\t\t\tuploadError: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {string} The control kind. */\n\t\tkind() {\n\t\t\tconst type = String(this.field.type || 'text')\n\t\t\treturn KIND_ALIASES[type] || type\n\t\t},\n\n\t\t/** @return {string} The input type of a text-like field. */\n\t\tinputType() {\n\t\t\treturn INPUT_TYPES.includes(this.kind) ? this.kind : 'text'\n\t\t},\n\n\t\t/** @return {string} The label. */\n\t\tlabel() {\n\t\t\treturn String(this.field.label || this.field.key || '')\n\t\t},\n\n\t\t/** @return {string} The control's id. */\n\t\tinputId() {\n\t\t\treturn `cn-settings-field-${this.uid}-${String(this.field.key).replace(/[^A-Za-z0-9_-]/g, '-')}`\n\t\t},\n\n\t\t/** @return {string} The message shown under the control: an upload failure, else `error`. */\n\t\tshownError() {\n\t\t\treturn this.uploadError || this.error\n\t\t},\n\n\t\t/** @return {string|null} The id of the error or hint the control is described by. */\n\t\tdescribedBy() {\n\t\t\tif (this.shownError) {\n\t\t\t\treturn `${this.inputId}-error`\n\t\t\t}\n\t\t\treturn this.hint ? `${this.inputId}-hint` : null\n\t\t},\n\n\t\t/** @return {string} A status note's tone: `info`, `success`, `warning` or `error`. */\n\t\tstatusTone() {\n\t\t\treturn ['info', 'success', 'warning', 'error'].includes(this.field.tone) ? this.field.tone : 'info'\n\t\t},\n\n\t\t/** @return {string} The value as text for a text control. */\n\t\tstringValue() {\n\t\t\treturn this.modelValue === null || this.modelValue === undefined ? '' : String(this.modelValue)\n\t\t},\n\n\t\t/** @return {Array<{key: string, label: string}>} The days of a week-hours field, Monday first by default. */\n\t\tweekDays() {\n\t\t\tconst names = getDayNames()\n\t\t\tconst days = Array.isArray(this.field.days) && this.field.days.length > 0 ? this.field.days : WEEK_DAYS\n\t\t\treturn days.map((key) => ({ key, label: names[WEEK_DAYS_FROM_SUNDAY.indexOf(key)] || key }))\n\t\t},\n\n\t\t/** @return {object} A week-hours field's value: day to `{ opens, closes }` or null. */\n\t\tweekValue() {\n\t\t\treturn this.modelValue && typeof this.modelValue === 'object' && !Array.isArray(this.modelValue) ? this.modelValue : {}\n\t\t},\n\n\t\t/** @return {string} An action link's address, with the web root for an app path. */\n\t\tactionHref() {\n\t\t\treturn prefixUrl(String(this.field.href || ''))\n\t\t},\n\n\t\t/** @return {string} The placeholder of a secret that is stored. */\n\t\tsecretSetPlaceholder() {\n\t\t\treturn t('nextcloud-vue', 'Stored. Type a new value to replace it.')\n\t\t},\n\n\t\t/**\n\t\t * The select options as `{ label, value }`: the static `options` (strings,\n\t\t * numbers or objects), or those read from `optionsUrl`.\n\t\t *\n\t\t * @return {Array<{label: string, value: (string|number|boolean)}>}\n\t\t */\n\t\tnormalizedOptions() {\n\t\t\tconst raw = Array.isArray(this.field.options) ? this.field.options : (this.fetchedOptions || [])\n\t\t\treturn raw.map((option) => (option && typeof option === 'object'\n\t\t\t\t? { ...option, label: String(option.label ?? option.value ?? ''), value: option.value }\n\t\t\t\t: { label: String(option), value: option }))\n\t\t},\n\n\t\t/** @return {Array} The value as a list, for a multi-choice field. */\n\t\tlistValue() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {Array<object>} The options a multi-select's value selects. */\n\t\tselectedOptions() {\n\t\t\treturn this.listValue.map((value) => this.normalizedOptions.find((option) => String(option.value) === String(value))\n\t\t\t\t|| { label: String(value), value })\n\t\t},\n\n\t\t/** @return {Array<{key: string, value: unknown}>} A pairs field's rows. */\n\t\tpairRows() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {string} The label of a pair's key. */\n\t\tpairKeyLabel() {\n\t\t\treturn String(this.field.keyLabel || t('nextcloud-vue', 'Key'))\n\t\t},\n\n\t\t/** @return {string} The label of a pair's value. */\n\t\tpairValueLabel() {\n\t\t\treturn String(this.field.valueLabel || t('nextcloud-vue', 'Value'))\n\t\t},\n\n\t\t/** @return {object|null} The option the value selects, for NcSelect. */\n\t\tselectedOption() {\n\t\t\tif (this.modelValue === null || this.modelValue === undefined || this.modelValue === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// A stored value is often text where the options carry numbers (an\n\t\t\t// app config holding an id), so the two are compared as text.\n\t\t\treturn this.normalizedOptions.find((option) => option.value === this.modelValue)\n\t\t\t\t|| this.normalizedOptions.find((option) => String(option.value) === String(this.modelValue))\n\t\t\t\t|| { label: String(this.modelValue), value: this.modelValue }\n\t\t},\n\t},\n\n\twatch: {\n\t\t'field.optionsUrl': {\n\t\t\thandler() {\n\t\t\t\tthis.loadOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\n\t\t'field.valueSource': {\n\t\t\thandler() {\n\t\t\t\tthis.loadSourceOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The \"remove the stored value\" switch of a secret changed.\n\t\t *\n\t\t * @param {boolean} on Whether the stored value is to be removed.\n\t\t * @return {void}\n\t\t */\n\t\tonClear(on) {\n\t\t\t/** @event clear The stored secret is to be removed (true) or kept (false). */\n\t\t\tthis.$emit('clear', on === true)\n\t\t},\n\n\t\tt,\n\n\t\t/** Ask the host to run an `action` field's action. */\n\t\trunAction() {\n\t\t\t/** @event action The user pressed an `action` field's button. */\n\t\t\tthis.$emit('action')\n\t\t},\n\n\t\t/**\n\t\t * Upload a chosen image to `uploadUrl` as multipart form data (the\n\t\t * file under `uploadField`, default `image`, plus `uploadParams`), then\n\t\t * take the new image url from the answer at `uploadValuePath` (or a\n\t\t * cache-busted `previewUrl`).\n\t\t *\n\t\t * @param {File|undefined} file The chosen file.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/settings-fields-section/specs/settings-fields-section/spec.md#requirement-an-image-field-uploads-at-once\n\t\t */\n\t\tasync upload(file) {\n\t\t\tif (!file || !this.field.uploadUrl) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst form = new FormData()\n\t\t\tfor (const [name, value] of Object.entries(this.field.uploadParams || {})) {\n\t\t\t\tform.append(name, value)\n\t\t\t}\n\t\t\tform.append(this.field.uploadField || 'image', file)\n\t\t\tthis.uploading = true\n\t\t\tthis.uploadError = ''\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(prefixUrl(this.field.uploadUrl), form)\n\t\t\t\tconst fromAnswer = this.field.uploadValuePath ? readPath(response?.data, this.field.uploadValuePath) : ''\n\t\t\t\tconst next = fromAnswer || (this.field.previewUrl ? `${prefixUrl(this.field.previewUrl)}${this.field.previewUrl.includes('?') ? '&' : '?'}v=${Date.now()}` : '')\n\t\t\t\t/**\n\t\t\t\t * @event uploaded An image was uploaded. Payload: its new url.\n\t\t\t\t */\n\t\t\t\tthis.$emit('uploaded', next)\n\t\t\t} catch (error) {\n\t\t\t\tthis.uploadError = t('nextcloud-vue', 'The image could not be uploaded: {reason}', { reason: serverErrorMessage(error) })\n\t\t\t} finally {\n\t\t\t\tthis.uploading = false\n\t\t\t\tif (this.$refs.file) {\n\t\t\t\t\tthis.$refs.file.value = ''\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Report a new value.\n\t\t *\n\t\t * @param {unknown} value The value.\n\t\t * @return {void}\n\t\t */\n\t\temitValue(value) {\n\t\t\t/**\n\t\t\t * @event update:modelValue The value changed. Payload: the new value.\n\t\t\t */\n\t\t\tthis.$emit('update:modelValue', value)\n\t\t},\n\n\t\t/**\n\t\t * Check or uncheck one choice of a `checkboxes` field; the list keeps\n\t\t * the order of the options.\n\t\t *\n\t\t * @param {string|number} value The option's value.\n\t\t * @param {boolean} checked Whether it is now checked.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleOption(value, checked) {\n\t\t\tconst chosen = new Set(this.listValue.map(String))\n\t\t\tif (checked) {\n\t\t\t\tchosen.add(String(value))\n\t\t\t} else {\n\t\t\t\tchosen.delete(String(value))\n\t\t\t}\n\t\t\tthis.emitValue(this.normalizedOptions.filter((option) => chosen.has(String(option.value))).map((option) => option.value))\n\t\t},\n\n\t\t/**\n\t\t * Change a pair's key or value.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @param {string} part `key` or `value`.\n\t\t * @param {string} text What was typed.\n\t\t * @return {void}\n\t\t */\n\t\tsetPair(index, part, text) {\n\t\t\tconst rows = this.pairRows.map((row) => ({ ...row }))\n\t\t\trows[index] = { ...rows[index], [part]: part === 'value' && this.field.valueType === 'number' && text !== '' ? Number(text) : text }\n\t\t\tthis.emitValue(rows)\n\t\t},\n\n\t\t/** Add an empty pair. */\n\t\taddPair() {\n\t\t\tthis.emitValue([...this.pairRows, { key: '', value: '' }])\n\t\t},\n\n\t\t/**\n\t\t * Remove a pair.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @return {void}\n\t\t */\n\t\tremovePair(index) {\n\t\t\tthis.emitValue(this.pairRows.filter((_row, at) => at !== index))\n\t\t},\n\n\t\t/**\n\t\t * The storable values of what a multi-select emits.\n\t\t *\n\t\t * @param {Array|null} emitted The chosen options.\n\t\t * @return {Array}\n\t\t */\n\t\toptionValues(emitted) {\n\t\t\treturn (Array.isArray(emitted) ? emitted : []).map((option) => this.optionValue(option))\n\t\t},\n\n\t\t/**\n\t\t * The storable value of what NcSelect emits.\n\t\t *\n\t\t * @param {object|string|number|null} emitted An option, or null on clear.\n\t\t * @return {string|number|boolean|null}\n\t\t */\n\t\toptionValue(emitted) {\n\t\t\tif (emitted === null || emitted === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn typeof emitted === 'object' && 'value' in emitted ? emitted.value : emitted\n\t\t},\n\n\t\t/**\n\t\t * Open or close one day of a week-hours field; an opened day takes\n\t\t * `defaultOpens`/`defaultCloses` (08:00 to 17:00).\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {boolean} open Whether it is open.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayOpen(day, open) {\n\t\t\tconst hours = open ? { opens: this.field.defaultOpens || '08:00', closes: this.field.defaultCloses || '17:00' } : null\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: hours })\n\t\t},\n\n\t\t/**\n\t\t * Change one time of an open day.\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {string} part `opens` or `closes`.\n\t\t * @param {string} time The time, `HH:MM`.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayTime(day, part, time) {\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: { ...(this.weekValue[day] || {}), [part]: time } })\n\t\t},\n\n\t\t/**\n\t\t * The option a pairs value selects; an id no object answers keeps its id as label.\n\t\t *\n\t\t * @param {unknown} value The stored id.\n\t\t * @return {object|null}\n\t\t */\n\t\tsourceOption(value) {\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.sourceOptions.find((option) => String(option.value) === String(value)) || { label: String(value), value }\n\t\t},\n\n\t\t/**\n\t\t * Read the objects a pairs field's values are chosen from:\n\t\t * `valueSource { register, schema, labelField?, valueField?, limit? }`.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadSourceOptions() {\n\t\t\tconst source = this.kind === 'pairs' ? this.field.valueSource : null\n\t\t\tif (!source || !source.register || !source.schema) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst limit = Number(source.limit) > 0 ? Number(source.limit) : 1000\n\t\t\tthis.sourceLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = `/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}?_limit=${limit}`\n\t\t\t\tconst { data } = await axios.get(prefixUrl(url))\n\t\t\t\tconst list = Array.isArray(data?.results) ? data.results : []\n\t\t\t\tthis.sourceOptions = list.filter((item) => item && typeof item === 'object').map((item) => {\n\t\t\t\t\tconst value = source.valueField ? readPath(item, source.valueField) : (item.id ?? item.uuid ?? item['@self']?.id)\n\t\t\t\t\tconst label = source.labelField ? readPath(item, source.labelField) : (item.name ?? item.title)\n\t\t\t\t\treturn { label: String(label || value || ''), value }\n\t\t\t\t})\n\t\t\t\tthis.sourceTruncated = Number(data?.total) > list.length\n\t\t\t} catch {\n\t\t\t\tthis.sourceOptions = []\n\t\t\t\tthis.sourceTruncated = false\n\t\t\t} finally {\n\t\t\t\tthis.sourceLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read a sourced select's options: a list (or the list at\n\t\t * `optionsPath`, or under `results`) mapped through `optionLabel` and\n\t\t * `optionValue` (dotted paths; default `label`/`title`/`name` and `value`/`id`).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadOptions() {\n\t\t\tconst url = this.kind === 'select' && !Array.isArray(this.field.options) ? this.field.optionsUrl : ''\n\t\t\tif (!url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.optionsLoading = true\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(url), { headers: buildHeaders() })\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.fetchedOptions = []\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst list = this.field.optionsPath ? readPath(data, this.field.optionsPath) : (Array.isArray(data) ? data : data?.results)\n\t\t\t\tthis.fetchedOptions = (Array.isArray(list) ? list : []).map((item) => {\n\t\t\t\t\tif (!item || typeof item !== 'object') {\n\t\t\t\t\t\treturn { label: String(item), value: item }\n\t\t\t\t\t}\n\t\t\t\t\tconst value = this.field.optionValue ? readPath(item, this.field.optionValue) : (item.value ?? item.id)\n\t\t\t\t\tconst label = this.field.optionLabel ? readPath(item, this.field.optionLabel) : (item.label ?? item.title ?? item.name ?? value)\n\t\t\t\t\tconst detail = this.field.optionDetail ? readPath(item, this.field.optionDetail) : ''\n\t\t\t\t\treturn { label: detail ? `${label ?? ''} (${detail})` : String(label ?? ''), value }\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.optionsLoading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-settings-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__error {\n\tmargin: 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__image {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__image-label {\n\tfont-weight: 600;\n}\n\n/* A note: the field's label, then a line of muted text where a control would\n stand (DqInstellingenAlgemeen \"Toegestane websites (CORS)\"). */\n.cn-settings-field__note {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__note-label {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__note-text {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__image-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__image-tile {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 64px;\n\theight: 64px;\n\toverflow: hidden;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tbackground: var(--color-primary-element-light);\n}\n\n.cn-settings-field__image-tile img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tobject-fit: contain;\n}\n\n.cn-settings-field__image-initials {\n\tfont-size: 20px;\n\tfont-weight: 700;\n\tcolor: var(--color-primary-element-light-text, var(--color-primary-element));\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__option-description {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__heading {\n\tmargin: 8px 0 0;\n\tfont-size: 16px;\n\tfont-weight: 600;\n}\n\n.cn-settings-field__radio {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__week {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__day {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n}\n\n.cn-settings-field__day > :first-child {\n\tflex: 0 0 160px;\n}\n\n.cn-settings-field__pairs {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: flex-start;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__pair {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n\twidth: 100%;\n}\n\n.cn-settings-field__pair > :not(button) {\n\tflex: 1 1 140px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__radio-legend {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__option-description {\n\tmargin: 0 0 8px calc(var(--default-grid-baseline, 4px) * 9);\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__action-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__error {\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["_normalizeClass","_createElementBlock","_toDisplayString","_createTextVNode","_openBlock","_createElementVNode","_createBlock","_createVNode","_Fragment","_renderList"],"mappings":"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"}
1
+ {"version":3,"file":"CnSettingsField.vue3.js","sources":["../../../../src/components/CnSettingsField/CnSettingsField.vue?vue&type=template&id=d11dd994&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-settings-field\" :class=\"`cn-settings-field--${kind}`\" :data-testid=\"`cn-settings-field-${field.key}`\">\n\t\t<h3 v-if=\"kind === 'heading'\" class=\"cn-settings-field__heading\">\n\t\t\t{{ label }}\n\t\t</h3>\n\t\t<NcNoteCard\n\t\t\tv-else-if=\"kind === 'status'\"\n\t\t\t:type=\"statusTone\"\n\t\t\t:role=\"statusTone === 'error' || statusTone === 'warning' ? 'alert' : 'status'\"\n\t\t\t:data-testid=\"`cn-settings-field-status-${field.key}`\">\n\t\t\t{{ field.text }}\n\t\t</NcNoteCard>\n\t\t<div v-else-if=\"kind === 'note'\" class=\"cn-settings-field__note\">\n\t\t\t<span class=\"cn-settings-field__note-label\">{{ label }}</span>\n\t\t\t<p class=\"cn-settings-field__note-text\" :data-testid=\"`cn-settings-field-note-${field.key}`\">\n\t\t\t\t{{ field.text }}\n\t\t\t</p>\n\t\t</div>\n\t\t<div v-else-if=\"kind === 'action'\" class=\"cn-settings-field__action\">\n\t\t\t<div class=\"cn-settings-field__action-row\">\n\t\t\t\t<NcButton v-if=\"field.href\"\n\t\t\t\t\t:href=\"actionHref\"\n\t\t\t\t\t:target=\"field.target || undefined\"\n\t\t\t\t\t:rel=\"field.target === '_blank' ? 'noopener noreferrer' : undefined\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\">\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-else\n\t\t\t\t\t:disabled=\"field.readOnly || field.actionBusy\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-action-${field.key}`\"\n\t\t\t\t\t@click=\"runAction\">\n\t\t\t\t\t<template v-if=\"field.actionBusy\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<NcNoteCard v-if=\"field.actionResult\"\n\t\t\t\t:type=\"field.actionResult.type\"\n\t\t\t\t:role=\"field.actionResult.type === 'error' ? 'alert' : 'status'\"\n\t\t\t\t:data-testid=\"`cn-settings-field-action-result-${field.key}`\">\n\t\t\t\t{{ field.actionResult.text }}\n\t\t\t</NcNoteCard>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'radio'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"inputId\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:modelValue=\"modelValue === null || modelValue === undefined ? '' : String(modelValue)\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"emitValue(option.value)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'checkboxes'\"\n\t\t\tclass=\"cn-settings-field__radio\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<template v-for=\"option in normalizedOptions\" :key=\"String(option.value)\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:modelValue=\"listValue.some((entry) => String(entry) === String(option.value))\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-option-${field.key}-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"toggleOption(option.value, $event)\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<p v-if=\"option.description\" class=\"cn-settings-field__option-description\">\n\t\t\t\t\t{{ option.description }}\n\t\t\t\t</p>\n\t\t\t</template>\n\t\t</fieldset>\n\t\t<fieldset v-else-if=\"kind === 'pairs'\"\n\t\t\tclass=\"cn-settings-field__pairs\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"(row, index) in pairRows\"\n\t\t\t\t:key=\"index\"\n\t\t\t\tclass=\"cn-settings-field__pair\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-${field.key}`\">\n\t\t\t\t<NcTextField\n\t\t\t\t\t:label=\"pairKeyLabel\"\n\t\t\t\t\t:modelValue=\"row.key\"\n\t\t\t\t\t:maxlength=\"field.keyMaxLength\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'key', $event)\" />\n\t\t\t\t<NcSelect v-if=\"field.valueSource\"\n\t\t\t\t\t:modelValue=\"sourceOption(row.value)\"\n\t\t\t\t\t:options=\"sourceOptions\"\n\t\t\t\t\t:inputLabel=\"pairValueLabel\"\n\t\t\t\t\t:loading=\"sourceLoading\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event ? $event.value : '')\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:label=\"pairValueLabel\"\n\t\t\t\t\t:type=\"field.valueType === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t:modelValue=\"row.value === null || row.value === undefined ? '' : String(row.value)\"\n\t\t\t\t\t@update:modelValue=\"setPair(index, 'value', $event)\" />\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t:ariaLabel=\"t('nextcloud-vue', 'Remove {name}', { name: row.key || pairKeyLabel })\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-pair-remove-${field.key}`\"\n\t\t\t\t\t@click=\"removePair(index)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t\t<p v-if=\"sourceTruncated\"\n\t\t\t\tclass=\"cn-settings-field__hint\"\n\t\t\t\t:data-testid=\"`cn-settings-field-pairs-truncated-${field.key}`\">\n\t\t\t\t{{ t('nextcloud-vue', 'Only the first {count} choices are listed.', { count: sourceOptions.length }) }}\n\t\t\t</p>\n\t\t\t<NcButton\n\t\t\t\t:data-testid=\"`cn-settings-field-pair-add-${field.key}`\"\n\t\t\t\t@click=\"addPair\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ field.addLabel || t('nextcloud-vue', 'Add a row') }}\n\t\t\t</NcButton>\n\t\t</fieldset>\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-else-if=\"kind === 'switch' || kind === 'boolean'\"\n\t\t\t:type=\"kind === 'switch' ? 'switch' : 'checkbox'\"\n\t\t\t:modelValue=\"!!modelValue\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\">\n\t\t\t{{ label }}\n\t\t</NcCheckboxRadioSwitch>\n\t\t<div v-else-if=\"kind === 'image'\"\n\t\t\tclass=\"cn-settings-field__image\"\n\t\t\trole=\"group\"\n\t\t\t:aria-labelledby=\"`${inputId}-label`\">\n\t\t\t<!-- `hideLabel` keeps the name for a screen reader only. -->\n\t\t\t<span :id=\"`${inputId}-label`\"\n\t\t\t\tclass=\"cn-settings-field__image-label\"\n\t\t\t\t:class=\"{ 'hidden-visually': field.hideLabel === true }\">{{ label }}</span>\n\t\t\t<div class=\"cn-settings-field__image-row\">\n\t\t\t\t<span class=\"cn-settings-field__image-tile\" :data-testid=\"`cn-settings-field-image-${field.key}`\">\n\t\t\t\t\t<img v-if=\"stringValue\" :src=\"stringValue\" :alt=\"t('nextcloud-vue', 'Current {name}', { name: label })\">\n\t\t\t\t\t<span v-else class=\"cn-settings-field__image-initials\" aria-hidden=\"true\">{{ field.initials || '' }}</span>\n\t\t\t\t</span>\n\t\t\t\t<input\n\t\t\t\t\t:id=\"inputId\"\n\t\t\t\t\tref=\"file\"\n\t\t\t\t\tclass=\"hidden-visually\"\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t:accept=\"field.accept || 'image/*'\"\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t:aria-labelledby=\"`${inputId}-label`\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t@change=\"upload($event.target.files && $event.target.files[0])\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"!field.readOnly && field.uploadUrl\"\n\t\t\t\t\t:disabled=\"uploading\"\n\t\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t\t:data-testid=\"`cn-settings-field-upload-${field.key}`\"\n\t\t\t\t\t@click=\"$refs.file && $refs.file.click()\">\n\t\t\t\t\t<template v-if=\"uploading\" #icon>\n\t\t\t\t\t\t<NcLoadingIcon :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ field.uploadLabel || t('nextcloud-vue', 'Upload {name}', { name: label }) }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\t\t<NcSelect\n\t\t\tv-else-if=\"kind === 'select'\"\n\t\t\t:inputId=\"inputId\"\n\t\t\t:modelValue=\"field.multiple ? selectedOptions : selectedOption\"\n\t\t\t:options=\"normalizedOptions\"\n\t\t\t:multiple=\"!!field.multiple\"\n\t\t\t:inputLabel=\"label\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:loading=\"optionsLoading\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:clearable=\"!field.required\"\n\t\t\tlabel=\"label\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue(field.multiple ? optionValues($event) : optionValue($event))\" />\n\t\t<NcTextArea\n\t\t\tv-else-if=\"kind === 'textarea' || kind === 'lines'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:rows=\"field.rows || 4\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<div v-else-if=\"kind === 'secret'\" class=\"cn-settings-field__secret\">\n\t\t\t<NcTextField\n\t\t\t\t:id=\"inputId\"\n\t\t\t\t:label=\"label\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t:modelValue=\"stringValue\"\n\t\t\t\t:placeholder=\"field.secretSet ? secretSetPlaceholder : (field.placeholder || '')\"\n\t\t\t\t:readonly=\"field.readOnly\"\n\t\t\t\t:disabled=\"field.clearing === true\"\n\t\t\t\t:error=\"!!error\"\n\t\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t\t<NcCheckboxRadioSwitch v-if=\"field.clearable && field.secretSet\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t:modelValue=\"field.clearing === true\"\n\t\t\t\t:disabled=\"field.readOnly\"\n\t\t\t\t:data-testid=\"`cn-settings-field-clear-${field.key}`\"\n\t\t\t\t@update:modelValue=\"onClear\">\n\t\t\t\t{{ field.clearLabel || t('nextcloud-vue', 'Remove the stored value') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</div>\n\t\t<fieldset v-else-if=\"kind === 'week-hours'\"\n\t\t\tclass=\"cn-settings-field__week\"\n\t\t\t:disabled=\"field.readOnly\"\n\t\t\t:aria-describedby=\"describedBy\">\n\t\t\t<legend class=\"cn-settings-field__radio-legend\" :class=\"{ 'hidden-visually': field.hideLabel === true }\">\n\t\t\t\t{{ label }}\n\t\t\t</legend>\n\t\t\t<div v-for=\"day in weekDays\"\n\t\t\t\t:key=\"day.key\"\n\t\t\t\tclass=\"cn-settings-field__day\"\n\t\t\t\t:data-testid=\"`cn-settings-field-day-${day.key}`\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:modelValue=\"!!weekValue[day.key]\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Open on {day}', { day: day.label })\"\n\t\t\t\t\t@update:modelValue=\"setDayOpen(day.key, $event)\">\n\t\t\t\t\t{{ day.label }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<template v-if=\"weekValue[day.key]\">\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Opens on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].opens || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'opens', $event)\" />\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\ttype=\"time\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Closes on {day}', { day: day.label })\"\n\t\t\t\t\t\t:modelValue=\"weekValue[day.key].closes || ''\"\n\t\t\t\t\t\t@update:modelValue=\"setDayTime(day.key, 'closes', $event)\" />\n\t\t\t\t</template>\n\t\t\t\t<span v-else class=\"cn-settings-field__hint\">{{ t('nextcloud-vue', 'Closed') }}</span>\n\t\t\t</div>\n\t\t</fieldset>\n\t\t<NcTextField\n\t\t\tv-else-if=\"kind === 'number'\"\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\ttype=\"number\"\n\t\t\t:min=\"field.min\"\n\t\t\t:max=\"field.max\"\n\t\t\t:step=\"numberStep\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event === '' ? null : Number($event))\" />\n\t\t<NcTextField\n\t\t\tv-else\n\t\t\t:id=\"inputId\"\n\t\t\t:label=\"label\"\n\t\t\t:type=\"inputType\"\n\t\t\t:modelValue=\"stringValue\"\n\t\t\t:placeholder=\"field.placeholder || ''\"\n\t\t\t:readonly=\"field.readOnly\"\n\t\t\t:error=\"!!error\"\n\t\t\t:aria-describedby=\"describedBy\"\n\t\t\t@update:modelValue=\"emitValue($event)\" />\n\t\t<p v-if=\"shownError\"\n\t\t\t:id=\"`${inputId}-error`\"\n\t\t\tclass=\"cn-settings-field__error\"\n\t\t\t:data-testid=\"`cn-settings-field-error-${field.key}`\">\n\t\t\t{{ shownError }}\n\t\t</p>\n\t\t<p v-else-if=\"hint\" :id=\"`${inputId}-hint`\" class=\"cn-settings-field__hint\">\n\t\t\t{{ hint }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { getDayNames, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { serverErrorMessage } from '../../utils/serverErrorMessage.js'\n\nlet fieldUid = 0\n\n/** Field types and the names CnSettingsPage's manifest uses for them. */\nconst KIND_ALIASES = { enum: 'select', string: 'text', datetime: 'datetime-local', 'date-time': 'datetime-local' }\n\n/** The days of a week, Monday first: the keys a week-hours value uses. */\nconst WEEK_DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']\n\n/** The same keys in the order of getDayNames(), which starts on Sunday. */\nconst WEEK_DAYS_FROM_SUNDAY = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']\n\n/** The kinds drawn as a text field with their own input type. */\nconst INPUT_TYPES = ['password', 'date', 'datetime-local', 'email', 'url']\n\n/**\n * CnSettingsField - one settings field: the control for its type with its\n * label, and under it an error or a hint. Shared by CnSettingsPage and\n * CnSettingsFieldsSection.\n *\n * Types: `text` (default), `textarea`, `number`, `switch`, `boolean` (a checkbox),\n * `select` (`enum`) with static `options` or options read from `optionsUrl`,\n * `password` (a masked input that shows its value back) and `secret`\n * (replace-only: the input stays empty, and with `secretSet` says a value is\n * stored; the host sends it only when something is typed), and `image` (a\n * preview tile, the initials without an image, and an upload button that\n * posts the file to `uploadUrl` at once and emits `uploaded`), `radio` (one\n * choice from `options`, each with an optional `description` under it),\n * `lines` (a textarea, one entry per line), `checkboxes` (several choices\n * from `options`, the value a list; `select` with `multiple` is the same as a\n * multi-select) and `pairs` (key-to-value rows with add and remove, the value\n * a list of `{ key, value }` rows). Three types hold no value of their\n * own: `heading` (a subheading between fields), `status` (a read-only note:\n * the host passes its `text` and `tone`) and `action` (a button that emits\n * `action`; the host passes `actionBusy` and the `actionResult` note).\n * `date`, `datetime-local` (also `datetime`, `date-time`), `email` and `url`\n * are text fields of that input type; the value stays the text the input holds.\n *\n * ```vue\n * <CnSettingsField\n * :field=\"{ key: 'apiKey', label: 'API key', type: 'secret', secretSet: true }\"\n * v-model=\"form.apiKey\" />\n * ```\n */\nexport default {\n\tname: 'CnSettingsField',\n\n\tcomponents: { Close, NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcNoteCard, NcSelect, NcTextArea, NcTextField, Plus },\n\n\tprops: {\n\t\t/**\n\t\t * The field: `{ key, label, type?, options?, optionsUrl?, optionsPath?,\n\t\t * optionLabel?, optionValue?, optionDetail?, placeholder?, rows?, min?, max?, required?,\n\t\t * readOnly?, secretSet? }`. `label` arrives translated.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tfield: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The value: text, a number, a boolean or a select value. Any type,\n\t\t * because a Boolean in a type list would read an empty string as true.\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: null,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** A validation message, drawn under the control and tied to it. */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** A hint under the control (not drawn while there is an error). */\n\t\thint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'uploaded', 'action', 'clear'],\n\n\tdata() {\n\t\tfieldUid += 1\n\t\treturn {\n\t\t\tuid: fieldUid,\n\t\t\tfetchedOptions: null,\n\t\t\toptionsLoading: false,\n\t\t\tsourceOptions: [],\n\t\t\tsourceLoading: false,\n\t\t\tsourceTruncated: false,\n\t\t\tuploading: false,\n\t\t\tuploadError: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {string} The control kind. */\n\t\tkind() {\n\t\t\tconst type = String(this.field.type || 'text')\n\t\t\treturn KIND_ALIASES[type] || type\n\t\t},\n\n\t\t/** @return {string} The input type of a text-like field. */\n\t\tinputType() {\n\t\t\treturn INPUT_TYPES.includes(this.kind) ? this.kind : 'text'\n\t\t},\n\n\t\t/**\n\t\t * The number input's step: the field's own, 1 for a whole number, else\n\t\t * any, so a decimal value (0.8) is not invalid to the browser.\n\t\t *\n\t\t * @return {string}\n\t\t * @spec openspec/changes/settings-number-decimal-step/specs/settings-fields/spec.md#requirement-a-number-setting-steps-as-it-is-declared\n\t\t */\n\t\tnumberStep() {\n\t\t\tif (typeof this.field.step === 'number' || (typeof this.field.step === 'string' && this.field.step !== '')) {\n\t\t\t\treturn String(this.field.step)\n\t\t\t}\n\t\t\treturn this.field.integer ? '1' : 'any'\n\t\t},\n\n\t\t/** @return {string} The label. */\n\t\tlabel() {\n\t\t\treturn String(this.field.label || this.field.key || '')\n\t\t},\n\n\t\t/** @return {string} The control's id. */\n\t\tinputId() {\n\t\t\treturn `cn-settings-field-${this.uid}-${String(this.field.key).replace(/[^A-Za-z0-9_-]/g, '-')}`\n\t\t},\n\n\t\t/** @return {string} The message shown under the control: an upload failure, else `error`. */\n\t\tshownError() {\n\t\t\treturn this.uploadError || this.error\n\t\t},\n\n\t\t/** @return {string|null} The id of the error or hint the control is described by. */\n\t\tdescribedBy() {\n\t\t\tif (this.shownError) {\n\t\t\t\treturn `${this.inputId}-error`\n\t\t\t}\n\t\t\treturn this.hint ? `${this.inputId}-hint` : null\n\t\t},\n\n\t\t/** @return {string} A status note's tone: `info`, `success`, `warning` or `error`. */\n\t\tstatusTone() {\n\t\t\treturn ['info', 'success', 'warning', 'error'].includes(this.field.tone) ? this.field.tone : 'info'\n\t\t},\n\n\t\t/** @return {string} The value as text for a text control. */\n\t\tstringValue() {\n\t\t\treturn this.modelValue === null || this.modelValue === undefined ? '' : String(this.modelValue)\n\t\t},\n\n\t\t/** @return {Array<{key: string, label: string}>} The days of a week-hours field, Monday first by default. */\n\t\tweekDays() {\n\t\t\tconst names = getDayNames()\n\t\t\tconst days = Array.isArray(this.field.days) && this.field.days.length > 0 ? this.field.days : WEEK_DAYS\n\t\t\treturn days.map((key) => ({ key, label: names[WEEK_DAYS_FROM_SUNDAY.indexOf(key)] || key }))\n\t\t},\n\n\t\t/** @return {object} A week-hours field's value: day to `{ opens, closes }` or null. */\n\t\tweekValue() {\n\t\t\treturn this.modelValue && typeof this.modelValue === 'object' && !Array.isArray(this.modelValue) ? this.modelValue : {}\n\t\t},\n\n\t\t/** @return {string} An action link's address, with the web root for an app path. */\n\t\tactionHref() {\n\t\t\treturn prefixUrl(String(this.field.href || ''))\n\t\t},\n\n\t\t/** @return {string} The placeholder of a secret that is stored. */\n\t\tsecretSetPlaceholder() {\n\t\t\treturn t('nextcloud-vue', 'Stored. Type a new value to replace it.')\n\t\t},\n\n\t\t/**\n\t\t * The select options as `{ label, value }`: the static `options` (strings,\n\t\t * numbers or objects), or those read from `optionsUrl`.\n\t\t *\n\t\t * @return {Array<{label: string, value: (string|number|boolean)}>}\n\t\t */\n\t\tnormalizedOptions() {\n\t\t\tconst raw = Array.isArray(this.field.options) ? this.field.options : (this.fetchedOptions || [])\n\t\t\treturn raw.map((option) => (option && typeof option === 'object'\n\t\t\t\t? { ...option, label: String(option.label ?? option.value ?? ''), value: option.value }\n\t\t\t\t: { label: String(option), value: option }))\n\t\t},\n\n\t\t/** @return {Array} The value as a list, for a multi-choice field. */\n\t\tlistValue() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {Array<object>} The options a multi-select's value selects. */\n\t\tselectedOptions() {\n\t\t\treturn this.listValue.map((value) => this.normalizedOptions.find((option) => String(option.value) === String(value))\n\t\t\t\t|| { label: String(value), value })\n\t\t},\n\n\t\t/** @return {Array<{key: string, value: unknown}>} A pairs field's rows. */\n\t\tpairRows() {\n\t\t\treturn Array.isArray(this.modelValue) ? this.modelValue : []\n\t\t},\n\n\t\t/** @return {string} The label of a pair's key. */\n\t\tpairKeyLabel() {\n\t\t\treturn String(this.field.keyLabel || t('nextcloud-vue', 'Key'))\n\t\t},\n\n\t\t/** @return {string} The label of a pair's value. */\n\t\tpairValueLabel() {\n\t\t\treturn String(this.field.valueLabel || t('nextcloud-vue', 'Value'))\n\t\t},\n\n\t\t/** @return {object|null} The option the value selects, for NcSelect. */\n\t\tselectedOption() {\n\t\t\tif (this.modelValue === null || this.modelValue === undefined || this.modelValue === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// A stored value is often text where the options carry numbers (an\n\t\t\t// app config holding an id), so the two are compared as text.\n\t\t\treturn this.normalizedOptions.find((option) => option.value === this.modelValue)\n\t\t\t\t|| this.normalizedOptions.find((option) => String(option.value) === String(this.modelValue))\n\t\t\t\t|| { label: String(this.modelValue), value: this.modelValue }\n\t\t},\n\t},\n\n\twatch: {\n\t\t'field.optionsUrl': {\n\t\t\thandler() {\n\t\t\t\tthis.loadOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\n\t\t'field.valueSource': {\n\t\t\thandler() {\n\t\t\t\tthis.loadSourceOptions()\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The \"remove the stored value\" switch of a secret changed.\n\t\t *\n\t\t * @param {boolean} on Whether the stored value is to be removed.\n\t\t * @return {void}\n\t\t */\n\t\tonClear(on) {\n\t\t\t/** @event clear The stored secret is to be removed (true) or kept (false). */\n\t\t\tthis.$emit('clear', on === true)\n\t\t},\n\n\t\tt,\n\n\t\t/** Ask the host to run an `action` field's action. */\n\t\trunAction() {\n\t\t\t/** @event action The user pressed an `action` field's button. */\n\t\t\tthis.$emit('action')\n\t\t},\n\n\t\t/**\n\t\t * Upload a chosen image to `uploadUrl` as multipart form data (the\n\t\t * file under `uploadField`, default `image`, plus `uploadParams`), then\n\t\t * take the new image url from the answer at `uploadValuePath` (or a\n\t\t * cache-busted `previewUrl`).\n\t\t *\n\t\t * @param {File|undefined} file The chosen file.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/settings-fields-section/specs/settings-fields-section/spec.md#requirement-an-image-field-uploads-at-once\n\t\t */\n\t\tasync upload(file) {\n\t\t\tif (!file || !this.field.uploadUrl) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst form = new FormData()\n\t\t\tfor (const [name, value] of Object.entries(this.field.uploadParams || {})) {\n\t\t\t\tform.append(name, value)\n\t\t\t}\n\t\t\tform.append(this.field.uploadField || 'image', file)\n\t\t\tthis.uploading = true\n\t\t\tthis.uploadError = ''\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(prefixUrl(this.field.uploadUrl), form)\n\t\t\t\tconst fromAnswer = this.field.uploadValuePath ? readPath(response?.data, this.field.uploadValuePath) : ''\n\t\t\t\tconst next = fromAnswer || (this.field.previewUrl ? `${prefixUrl(this.field.previewUrl)}${this.field.previewUrl.includes('?') ? '&' : '?'}v=${Date.now()}` : '')\n\t\t\t\t/**\n\t\t\t\t * @event uploaded An image was uploaded. Payload: its new url.\n\t\t\t\t */\n\t\t\t\tthis.$emit('uploaded', next)\n\t\t\t} catch (error) {\n\t\t\t\tthis.uploadError = t('nextcloud-vue', 'The image could not be uploaded: {reason}', { reason: serverErrorMessage(error) })\n\t\t\t} finally {\n\t\t\t\tthis.uploading = false\n\t\t\t\tif (this.$refs.file) {\n\t\t\t\t\tthis.$refs.file.value = ''\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Report a new value.\n\t\t *\n\t\t * @param {unknown} value The value.\n\t\t * @return {void}\n\t\t */\n\t\temitValue(value) {\n\t\t\t/**\n\t\t\t * @event update:modelValue The value changed. Payload: the new value.\n\t\t\t */\n\t\t\tthis.$emit('update:modelValue', value)\n\t\t},\n\n\t\t/**\n\t\t * Check or uncheck one choice of a `checkboxes` field; the list keeps\n\t\t * the order of the options.\n\t\t *\n\t\t * @param {string|number} value The option's value.\n\t\t * @param {boolean} checked Whether it is now checked.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleOption(value, checked) {\n\t\t\tconst chosen = new Set(this.listValue.map(String))\n\t\t\tif (checked) {\n\t\t\t\tchosen.add(String(value))\n\t\t\t} else {\n\t\t\t\tchosen.delete(String(value))\n\t\t\t}\n\t\t\tthis.emitValue(this.normalizedOptions.filter((option) => chosen.has(String(option.value))).map((option) => option.value))\n\t\t},\n\n\t\t/**\n\t\t * Change a pair's key or value.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @param {string} part `key` or `value`.\n\t\t * @param {string} text What was typed.\n\t\t * @return {void}\n\t\t */\n\t\tsetPair(index, part, text) {\n\t\t\tconst rows = this.pairRows.map((row) => ({ ...row }))\n\t\t\trows[index] = { ...rows[index], [part]: part === 'value' && this.field.valueType === 'number' && text !== '' ? Number(text) : text }\n\t\t\tthis.emitValue(rows)\n\t\t},\n\n\t\t/** Add an empty pair. */\n\t\taddPair() {\n\t\t\tthis.emitValue([...this.pairRows, { key: '', value: '' }])\n\t\t},\n\n\t\t/**\n\t\t * Remove a pair.\n\t\t *\n\t\t * @param {number} index The row.\n\t\t * @return {void}\n\t\t */\n\t\tremovePair(index) {\n\t\t\tthis.emitValue(this.pairRows.filter((_row, at) => at !== index))\n\t\t},\n\n\t\t/**\n\t\t * The storable values of what a multi-select emits.\n\t\t *\n\t\t * @param {Array|null} emitted The chosen options.\n\t\t * @return {Array}\n\t\t */\n\t\toptionValues(emitted) {\n\t\t\treturn (Array.isArray(emitted) ? emitted : []).map((option) => this.optionValue(option))\n\t\t},\n\n\t\t/**\n\t\t * The storable value of what NcSelect emits.\n\t\t *\n\t\t * @param {object|string|number|null} emitted An option, or null on clear.\n\t\t * @return {string|number|boolean|null}\n\t\t */\n\t\toptionValue(emitted) {\n\t\t\tif (emitted === null || emitted === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn typeof emitted === 'object' && 'value' in emitted ? emitted.value : emitted\n\t\t},\n\n\t\t/**\n\t\t * Open or close one day of a week-hours field; an opened day takes\n\t\t * `defaultOpens`/`defaultCloses` (08:00 to 17:00).\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {boolean} open Whether it is open.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayOpen(day, open) {\n\t\t\tconst hours = open ? { opens: this.field.defaultOpens || '08:00', closes: this.field.defaultCloses || '17:00' } : null\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: hours })\n\t\t},\n\n\t\t/**\n\t\t * Change one time of an open day.\n\t\t *\n\t\t * @param {string} day The day key.\n\t\t * @param {string} part `opens` or `closes`.\n\t\t * @param {string} time The time, `HH:MM`.\n\t\t * @return {void}\n\t\t */\n\t\tsetDayTime(day, part, time) {\n\t\t\tthis.emitValue({ ...this.weekValue, [day]: { ...(this.weekValue[day] || {}), [part]: time } })\n\t\t},\n\n\t\t/**\n\t\t * The option a pairs value selects; an id no object answers keeps its id as label.\n\t\t *\n\t\t * @param {unknown} value The stored id.\n\t\t * @return {object|null}\n\t\t */\n\t\tsourceOption(value) {\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.sourceOptions.find((option) => String(option.value) === String(value)) || { label: String(value), value }\n\t\t},\n\n\t\t/**\n\t\t * Read the objects a pairs field's values are chosen from:\n\t\t * `valueSource { register, schema, labelField?, valueField?, limit? }`.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadSourceOptions() {\n\t\t\tconst source = this.kind === 'pairs' ? this.field.valueSource : null\n\t\t\tif (!source || !source.register || !source.schema) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst limit = Number(source.limit) > 0 ? Number(source.limit) : 1000\n\t\t\tthis.sourceLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = `/apps/openregister/api/objects/${encodeURIComponent(source.register)}/${encodeURIComponent(source.schema)}?_limit=${limit}`\n\t\t\t\tconst { data } = await axios.get(prefixUrl(url))\n\t\t\t\tconst list = Array.isArray(data?.results) ? data.results : []\n\t\t\t\tthis.sourceOptions = list.filter((item) => item && typeof item === 'object').map((item) => {\n\t\t\t\t\tconst value = source.valueField ? readPath(item, source.valueField) : (item.id ?? item.uuid ?? item['@self']?.id)\n\t\t\t\t\tconst label = source.labelField ? readPath(item, source.labelField) : (item.name ?? item.title)\n\t\t\t\t\treturn { label: String(label || value || ''), value }\n\t\t\t\t})\n\t\t\t\tthis.sourceTruncated = Number(data?.total) > list.length\n\t\t\t} catch {\n\t\t\t\tthis.sourceOptions = []\n\t\t\t\tthis.sourceTruncated = false\n\t\t\t} finally {\n\t\t\t\tthis.sourceLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Read a sourced select's options: a list (or the list at\n\t\t * `optionsPath`, or under `results`) mapped through `optionLabel` and\n\t\t * `optionValue` (dotted paths; default `label`/`title`/`name` and `value`/`id`).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadOptions() {\n\t\t\tconst url = this.kind === 'select' && !Array.isArray(this.field.options) ? this.field.optionsUrl : ''\n\t\t\tif (!url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.optionsLoading = true\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(url), { headers: buildHeaders() })\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.fetchedOptions = []\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst list = this.field.optionsPath ? readPath(data, this.field.optionsPath) : (Array.isArray(data) ? data : data?.results)\n\t\t\t\tthis.fetchedOptions = (Array.isArray(list) ? list : []).map((item) => {\n\t\t\t\t\tif (!item || typeof item !== 'object') {\n\t\t\t\t\t\treturn { label: String(item), value: item }\n\t\t\t\t\t}\n\t\t\t\t\tconst value = this.field.optionValue ? readPath(item, this.field.optionValue) : (item.value ?? item.id)\n\t\t\t\t\tconst label = this.field.optionLabel ? readPath(item, this.field.optionLabel) : (item.label ?? item.title ?? item.name ?? value)\n\t\t\t\t\tconst detail = this.field.optionDetail ? readPath(item, this.field.optionDetail) : ''\n\t\t\t\t\treturn { label: detail ? `${label ?? ''} (${detail})` : String(label ?? ''), value }\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.optionsLoading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-settings-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__error {\n\tmargin: 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__image {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__image-label {\n\tfont-weight: 600;\n}\n\n/* A note: the field's label, then a line of muted text where a control would\n stand (DqInstellingenAlgemeen \"Toegestane websites (CORS)\"). */\n.cn-settings-field__note {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-settings-field__note-label {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__note-text {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__image-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__image-tile {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 64px;\n\theight: 64px;\n\toverflow: hidden;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tbackground: var(--color-primary-element-light);\n}\n\n.cn-settings-field__image-tile img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tobject-fit: contain;\n}\n\n.cn-settings-field__image-initials {\n\tfont-size: 20px;\n\tfont-weight: 700;\n\tcolor: var(--color-primary-element-light-text, var(--color-primary-element));\n}\n\n.cn-settings-field__hint,\n.cn-settings-field__option-description {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-settings-field__heading {\n\tmargin: 8px 0 0;\n\tfont-size: 16px;\n\tfont-weight: 600;\n}\n\n.cn-settings-field__radio {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__week {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__day {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n}\n\n.cn-settings-field__day > :first-child {\n\tflex: 0 0 160px;\n}\n\n.cn-settings-field__pairs {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: flex-start;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-settings-field__pair {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-end;\n\tgap: 8px;\n\twidth: 100%;\n}\n\n.cn-settings-field__pair > :not(button) {\n\tflex: 1 1 140px;\n\tmin-width: 0;\n}\n\n.cn-settings-field__radio-legend {\n\tfont-weight: 600;\n}\n\n.cn-settings-field__option-description {\n\tmargin: 0 0 8px calc(var(--default-grid-baseline, 4px) * 9);\n\tfont-size: 13px;\n\tline-height: 1.4;\n}\n\n.cn-settings-field__action-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px;\n}\n\n.cn-settings-field__error {\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["_normalizeClass","_createElementBlock","_toDisplayString","_createTextVNode","_openBlock","_createElementVNode","_createBlock","_createVNode","_Fragment","_renderList"],"mappings":"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"}
@@ -2,7 +2,7 @@ import script from './CnTabsWidget.vue2.js';
2
2
  import { render } from './CnTabsWidget.vue3.js';
3
3
 
4
4
  script.render = render;
5
- script.__scopeId = "data-v-37820b09";
5
+ script.__scopeId = "data-v-761751b1";
6
6
  const __sfc_main = script;
7
7
 
8
8
  export { __sfc_main as default };