@conduction/nextcloud-vue 2.83.0 → 2.85.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 (246) hide show
  1. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  2. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +131 -3
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +54 -18
  5. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  7. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +1 -1
  8. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  10. package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
  11. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +232 -4
  12. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  13. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +95 -51
  14. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  15. package/dist/esm/components/CnBodySections/CnBodySections.vue.js +1 -1
  16. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js +22 -1
  17. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBodySections/CnBodySections.vue3.js.map +1 -1
  19. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
  20. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +47 -4
  21. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
  22. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
  24. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +239 -3
  25. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js +5 -5
  27. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  29. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +50 -0
  30. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +22 -12
  32. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  33. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue.js +1 -1
  34. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js +1 -1
  35. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue3.js.map +1 -1
  37. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +226 -8
  38. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  39. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  40. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  41. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +3 -1
  42. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  43. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  44. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  45. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +18 -5
  46. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  47. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  48. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  49. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +38 -1
  50. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  51. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +45 -5
  52. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  53. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue.js +1 -1
  54. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js +1 -1
  55. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js.map +1 -1
  56. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +548 -77
  58. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  59. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +191 -82
  60. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  61. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +11 -2
  62. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  63. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js +29 -6
  64. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  65. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  66. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  67. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +126 -2
  68. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  69. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +24 -2
  70. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  71. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  72. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +106 -3
  73. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  74. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  75. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
  76. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +67 -5
  77. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
  78. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +181 -124
  79. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
  80. package/dist/esm/components/CnReportsPage/CnReportsPage.vue.js +1 -1
  81. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js +135 -2
  82. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
  83. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js +95 -43
  84. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js.map +1 -1
  85. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
  86. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +5 -1
  87. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
  88. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
  89. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue.js +1 -1
  90. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +72 -5
  91. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  92. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +33 -8
  93. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  94. package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
  95. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +135 -11
  96. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  97. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -2
  98. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  99. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue.js +1 -1
  100. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +17 -2
  101. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  102. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +1 -1
  103. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  104. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  105. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +39 -6
  106. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  107. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  108. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +1 -1
  109. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +140 -7
  110. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -1
  111. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -1
  112. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
  113. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +37 -9
  114. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
  115. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +6 -5
  116. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
  117. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue.js +1 -1
  118. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js +16 -0
  119. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js.map +1 -1
  120. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js.map +1 -1
  121. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +1 -1
  122. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +2 -1
  123. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -1
  124. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -1
  125. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js +53 -1
  126. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js.map +1 -1
  127. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js +3 -2
  128. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js.map +1 -1
  129. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
  130. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +135 -0
  131. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  132. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  133. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
  134. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +19 -0
  135. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  136. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +37 -19
  137. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  138. package/dist/esm/composables/useListView.js +21 -0
  139. package/dist/esm/composables/useListView.js.map +1 -1
  140. package/dist/esm/dialogs/CnTransitionInputDialog.vue.js +1 -1
  141. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js +68 -6
  142. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js.map +1 -1
  143. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js +133 -105
  144. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js.map +1 -1
  145. package/dist/esm/index.js +1 -0
  146. package/dist/esm/index.js.map +1 -1
  147. package/dist/esm/l10n/en.json.js +38 -1
  148. package/dist/esm/l10n/en.json.js.map +1 -1
  149. package/dist/esm/l10n/nl.json.js +78 -1
  150. package/dist/esm/l10n/nl.json.js.map +1 -1
  151. package/dist/esm/library-style.js +1 -1
  152. package/dist/esm/nextcloud-vue.css +1030 -533
  153. package/dist/esm/store/useObjectStore.js +16 -2
  154. package/dist/esm/store/useObjectStore.js.map +1 -1
  155. package/dist/esm/utils/boardColumns.js +8 -1
  156. package/dist/esm/utils/boardColumns.js.map +1 -1
  157. package/dist/esm/utils/boardReferenceColumns.js +278 -0
  158. package/dist/esm/utils/boardReferenceColumns.js.map +1 -0
  159. package/dist/esm/utils/buildManifest.js +41 -4
  160. package/dist/esm/utils/buildManifest.js.map +1 -1
  161. package/dist/esm/utils/detailWidgetVisibility.js +149 -0
  162. package/dist/esm/utils/detailWidgetVisibility.js.map +1 -0
  163. package/dist/esm/utils/formatMetric.js +39 -3
  164. package/dist/esm/utils/formatMetric.js.map +1 -1
  165. package/dist/esm/utils/gridStack.js +40 -1
  166. package/dist/esm/utils/gridStack.js.map +1 -1
  167. package/dist/esm/utils/humaniseKey.js +41 -0
  168. package/dist/esm/utils/humaniseKey.js.map +1 -0
  169. package/dist/esm/utils/notificationRuleLabel.js +6 -23
  170. package/dist/esm/utils/notificationRuleLabel.js.map +1 -1
  171. package/dist/esm/utils/resolveManifestTokens.js +1 -0
  172. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  173. package/dist/esm/utils/sentinelTokens.js +9 -0
  174. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  175. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  176. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  177. package/dist/esm/utils/widgetDispatch.js +8 -2
  178. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  179. package/dist/nextcloud-vue.cjs.js +17159 -13422
  180. package/dist/nextcloud-vue.cjs.js.map +2 -2
  181. package/dist/nextcloud-vue.css +1030 -533
  182. package/l10n/en.json +38 -1
  183. package/l10n/nl.json +78 -1
  184. package/package.json +1 -1
  185. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +160 -8
  186. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +1 -1
  187. package/src/components/CnBoardView/CnBoardView.vue +262 -6
  188. package/src/components/CnBodySections/CnBodySections.vue +22 -1
  189. package/src/components/CnCountdownWidget/CnCountdownWidget.vue +47 -4
  190. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +244 -8
  191. package/src/components/CnDashboardPage/CnDashboardPage.vue +62 -2
  192. package/src/components/CnDeltaWidget/CnDeltaWidget.vue +1 -1
  193. package/src/components/CnDetailPage/CnDetailPage.md +3 -1
  194. package/src/components/CnDetailPage/CnDetailPage.vue +226 -8
  195. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +3 -1
  196. package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -5
  197. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +63 -1
  198. package/src/components/CnGaugeWidget/CnGaugeWidget.vue +1 -1
  199. package/src/components/CnIndexPage/CnIndexPage.vue +586 -25
  200. package/src/components/CnIndexPage/useSelfFetchList.js +10 -1
  201. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +29 -6
  202. package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -1
  203. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +154 -5
  204. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +106 -3
  205. package/src/components/CnRegisterMapping/CnRegisterMapping.md +5 -0
  206. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +231 -96
  207. package/src/components/CnReportsPage/CnReportsPage.vue +179 -1
  208. package/src/components/CnSettingsPage/CnSettingsPage.vue +5 -1
  209. package/src/components/CnStagesWidget/CnStagesWidget.vue +103 -6
  210. package/src/components/CnStatWidget/CnStatWidget.vue +137 -12
  211. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +34 -3
  212. package/src/components/CnTabsWidget/CnTabsWidget.vue +39 -6
  213. package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +140 -7
  214. package/src/components/CnVersionInfoCard/CnVersionInfoCard.md +2 -1
  215. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +42 -13
  216. package/src/components/CnWalkthrough/CnWalkthrough.vue +16 -0
  217. package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +2 -1
  218. package/src/components/CnWidgetCardGrid/CnWidgetCardGrid.vue +55 -2
  219. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +135 -0
  220. package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +10 -0
  221. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +44 -1
  222. package/src/composables/useListView.js +21 -0
  223. package/src/css/board.css +65 -4
  224. package/src/css/dialog.css +4 -2
  225. package/src/css/form-field.css +14 -0
  226. package/src/css/form-widget.css +11 -0
  227. package/src/css/index-page.css +49 -0
  228. package/src/css/kpi-card.css +13 -0
  229. package/src/css/look-board-reports.css +58 -0
  230. package/src/css/look-board.css +108 -7
  231. package/src/dialogs/CnTransitionInputDialog.vue +87 -7
  232. package/src/index.js +2 -0
  233. package/src/schemas/app-manifest-v2.schema.json +137 -6
  234. package/src/store/useObjectStore.js +16 -2
  235. package/src/utils/boardColumns.js +8 -1
  236. package/src/utils/boardReferenceColumns.js +274 -0
  237. package/src/utils/buildManifest.js +40 -3
  238. package/src/utils/detailWidgetVisibility.js +145 -0
  239. package/src/utils/formatMetric.js +38 -2
  240. package/src/utils/gridStack.js +39 -0
  241. package/src/utils/humaniseKey.js +38 -0
  242. package/src/utils/notificationRuleLabel.js +5 -23
  243. package/src/utils/resolveManifestTokens.js +1 -0
  244. package/src/utils/sentinelTokens.js +9 -0
  245. package/src/utils/validateManifestV2.compiled.js +3 -3
  246. package/src/utils/widgetDispatch.js +8 -2
@@ -1 +1 @@
1
- {"version":3,"file":"CnTransitionInputDialog.vue2.js","sources":["../../../src/dialogs/CnTransitionInputDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:look=\"look\"\n\t\t:width=\"width\"\n\t\tdefaultWidth=\"form\"\n\t\t:eyebrow=\"eyebrow\"\n\t\t:subtitle=\"subtitle\"\n\t\t:name=\"dialogTitle\"\n\t\tsize=\"normal\"\n\t\t@closing=\"$emit('close')\">\n\t\t<div\n\t\t\tclass=\"cn-transition-input\"\n\t\t\tdata-testid=\"cn-modal\"\n\t\t\tdata-testid-modal=\"cn-transition-input-dialog\">\n\t\t\t<!-- A refusal keeps this dialog open with what was typed still in\n\t\t\t it. Closing first and reporting behind it loses the work and\n\t\t\t asks the person to retype it from memory. -->\n\t\t\t<p v-if=\"error\"\n\t\t\t\tclass=\"cn-transition-input__error\"\n\t\t\t\tdata-testid=\"cn-transition-input-error\">\n\t\t\t\t{{ error }}\n\t\t\t</p>\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.key\"\n\t\t\t\tclass=\"cn-transition-input__field\"\n\t\t\t\t:class=\"{ 'cn-transition-input__field--refused': isRefused(field.key) }\"\n\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}`\">\n\t\t\t\t<!-- An input that points at another record is picked, never typed. -->\n\t\t\t\t<div v-if=\"field.widget === 'reference'\" class=\"cn-transition-input__reference\">\n\t\t\t\t\t<label class=\"cn-transition-input__label\">{{ requiredLabel(field) }}</label>\n\t\t\t\t\t<CnResourceSelect\n\t\t\t\t\t\t:register=\"field.referenceRegister\"\n\t\t\t\t\t\t:schema=\"String(field.reference.schema)\"\n\t\t\t\t\t\t:labelField=\"(field.picker && field.picker.labelField) || field.reference.labelField || 'name'\"\n\t\t\t\t\t\t:filter=\"(field.picker && field.picker.filter) || {}\"\n\t\t\t\t\t\t:exclude=\"excludedIds(field)\"\n\t\t\t\t\t\t:allowCreate=\"false\"\n\t\t\t\t\t\t:preload=\"true\"\n\t\t\t\t\t\t:inputLabel=\"requiredLabel(field)\"\n\t\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-picker-${field.key}`\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- An object input: its sub-properties, one field at a time. -->\n\t\t\t\t<fieldset v-else-if=\"field.widget === 'object'\" class=\"cn-transition-input__object\">\n\t\t\t\t\t<legend>{{ requiredLabel(field) }}</legend>\n\t\t\t\t\t<div v-for=\"sub in field.subFields\"\n\t\t\t\t\t\t:key=\"sub.key\"\n\t\t\t\t\t\tclass=\"cn-transition-input__subfield\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}-${sub.key}`\">\n\t\t\t\t\t\t<NcTextArea v-if=\"sub.widget === 'textarea'\"\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"sub.widget === 'checkbox'\"\n\t\t\t\t\t\t\t:modelValue=\"subValue(field.key, sub.key) === true\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event === true)\">\n\t\t\t\t\t\t\t{{ subLabel(sub) }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:type=\"sub.widget === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<p v-if=\"isSubRefused(field.key, sub.key)\"\n\t\t\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}.${sub.key}`\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'This value was not accepted.') }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\n\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t:modelValue=\"values[field.key] === true\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event === true)\">\n\t\t\t\t\t{{ requiredLabel(field) }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t<NcTextArea v-else-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\trows=\"4\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else-if=\"field.widget === 'number'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<p v-if=\"isRefused(field.key)\"\n\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}`\">\n\t\t\t\t\t{{ refusalFor(field.key) }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- A key the refusal names that this dialog never offered is not a\n\t\t\t field anybody can correct here. Saying so beats saying nothing:\n\t\t\t the request sent something the transition does not accept. -->\n\t\t\t<p v-for=\"key in unofferedRefusals\"\n\t\t\t\t:key=\"key\"\n\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t:data-testid=\"`cn-transition-input-error-${key}`\">\n\t\t\t\t{{ undeclaredMessage(key) }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tdata-testid=\"cn-transition-input-cancel\"\n\t\t\t\t@click=\"$emit('close')\">\n\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\tdata-testid=\"cn-transition-input-confirm\"\n\t\t\t\t@click=\"onConfirm\">\n\t\t\t\t{{ confirmLabel }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CnDialog from '../components/CnDialog/CnDialog.vue'\nimport CnResourceSelect from '../components/CnResourceSelect/CnResourceSelect.vue'\nimport { dialogBoardMixin } from '../mixins/dialogBoard.js'\nimport { fieldsFromSchema } from '../utils/schema.js'\n\n/**\n * CnTransitionInputDialog — collects a lifecycle transition's declared\n * `inputs` before the transition is applied.\n *\n * A schema's `x-openregister-lifecycle.transitions.<action>` block may declare\n * `inputs: [{ field, required }]`; the transition endpoint then accepts\n * `{ action, data: { <field>: <value> } }`. This dialog renders one input per\n * declared field, disables the confirm button until every `required: true`\n * field is filled, and emits the collected values — the parent\n * (`CnLifecycleActions`) performs the actual POST. Cancel emits `close`\n * without any confirm, so no request is made.\n *\n * Field rendering resolves each declared field against the object's JSON\n * Schema via `fieldsFromSchema()` when a `schema` is given: the label comes\n * from the property `title`, booleans render as a switch, numbers as a number\n * field, and long text (`maxLength > 255` or a `textarea`/`markdown` format)\n * as a textarea. Anything else — including a field the schema does not\n * declare — falls back to a plain labelled text input. Deliberately minimal:\n * text, textarea, number and checkbox cover transition inputs; this is not a\n * form engine (use `CnFormDialog` for full object forms).\n *\n * Lives in its own file under `src/dialogs/` per the modal-isolation rule.\n *\n * ```vue\n * <CnTransitionInputDialog\n * v-if=\"inputTransition\"\n * :transition=\"inputTransition\"\n * :schema=\"schema\"\n * @confirm=\"onInputConfirm\"\n * @close=\"inputTransition = null\" />\n * ```\n */\nexport default {\n\tname: 'CnTransitionInputDialog',\n\n\tcomponents: {\n\t\tCnResourceSelect,\n\t\tCnDialog,\n\t\tNcButton,\n\t\tNcTextField,\n\t\tNcTextArea,\n\t\tNcCheckboxRadioSwitch,\n\t},\n\n\tmixins: [dialogBoardMixin],\n\n\tprops: {\n\t\t/**\n\t\t * The transition being applied. `inputs` is the declared input list from\n\t\t * `x-openregister-lifecycle.transitions.<action>.inputs` (server-derived\n\t\t * or config-declared); `label` doubles as dialog title + confirm label.\n\t\t *\n\t\t * @type {{action?: string, label?: string, inputs?: Array<{field: string, required?: boolean}>}}\n\t\t */\n\t\ttransition: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The object's JSON Schema (with `properties`), used to resolve each\n\t\t * input's label, widget and helper text. Optional — undeclared fields\n\t\t * render as plain text inputs labelled by their field name.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The record the transition runs on. Gives `picker.excludeSelf` its id\n\t\t * to leave out, and the current value an object input is merged over.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tcurrentObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Register slug the reference pickers look in when the schema property\n\t\t * names none of its own.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tregister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The sentence a refused transition answered with. Present means the\n\t\t * dialog stayed open BECAUSE the attempt was refused, with everything\n\t\t * typed still in it.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The input keys the refusal named (`fields` in the 400 body). Each one\n\t\t * that this dialog offers is marked on its own field; each one it does\n\t\t * not is reported as a key the transition does not accept.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tfieldErrors: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether the parent is mid-POST. Keeps the confirm button from firing\n\t\t * a second attempt while the first is in flight.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tbusy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['confirm', 'close'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** @type {{[key: string]: unknown}} Collected input values, keyed by declared field name. */\n\t\t\tvalues: this.initialValues(),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** The declared inputs, normalised to `{ field, required }`. */\n\t\tinputs() {\n\t\t\tconst declared = Array.isArray(this.transition.inputs) ? this.transition.inputs : []\n\t\t\treturn declared\n\t\t\t\t.filter((input) => input && typeof input.field === 'string' && input.field !== '')\n\t\t\t\t.map((input) => ({\n\t\t\t\t\tfield: input.field,\n\t\t\t\t\trequired: input.required === true,\n\t\t\t\t\tpicker: input.picker && typeof input.picker === 'object' ? input.picker : null,\n\t\t\t\t\tfields: Array.isArray(input.fields) ? input.fields.filter((f) => typeof f === 'string') : null,\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * One renderable field descriptor per declared input. Schema-declared\n\t\t * fields come from `fieldsFromSchema()` (label from the property title,\n\t\t * widget from the type/format); the widget is then clamped to the minimal\n\t\t * set this dialog renders (text / textarea / number / checkbox). Fields\n\t\t * the schema does not declare fall back to a plain text input.\n\t\t */\n\t\tfields() {\n\t\t\tconst keys = this.inputs.map((input) => input.field)\n\t\t\tconst resolved = fieldsFromSchema(this.schema, { include: keys, includeReadOnly: true })\n\t\t\treturn this.inputs.map((input) => {\n\t\t\t\tconst field = resolved.find((f) => f.key === input.field)\n\t\t\t\tconst prop = (this.schema && this.schema.properties && this.schema.properties[input.field]) || null\n\t\t\t\tif (prop && prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\treturn this.objectField(input, prop)\n\t\t\t\t}\n\t\t\t\tif (!field) {\n\t\t\t\t\treturn { key: input.field, label: input.field, description: '', widget: 'text', required: input.required }\n\t\t\t\t}\n\t\t\t\tif (field.reference && field.reference.multiple !== true) {\n\t\t\t\t\tconst register = field.reference.register || this.register\n\t\t\t\t\tif (register !== '') {\n\t\t\t\t\t\treturn { ...field, widget: 'reference', referenceRegister: register, picker: input.picker, required: input.required }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { ...field, widget: this.clampWidget(field.widget), required: input.required }\n\t\t\t})\n\t\t},\n\n\t\t/** Dialog title — the transition's label, with a generic fallback. */\n\t\tdialogTitle() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Provide details')\n\t\t},\n\n\t\t/** Confirm button label — the transition's label per the contract. */\n\t\tconfirmLabel() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Confirm')\n\t\t},\n\n\t\t/** True when every `required: true` input holds a non-empty value. */\n\t\tcanConfirm() {\n\t\t\tif (this.busy === true) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.fields.every((field) => (field.widget === 'object'\n\t\t\t\t? field.subFields.every((sub) => !sub.required || this.isSubFilled(field.key, sub))\n\t\t\t\t: (!field.required || this.isFilled(field))))\n\t\t},\n\n\t\t/** The refused keys this dialog offers no field for. */\n\t\tunofferedRefusals() {\n\t\t\tconst offered = this.fields.map((field) => field.key)\n\t\t\treturn this.refusedKeys.filter((key) => !offered.includes(key))\n\t\t},\n\n\t\t/** The refusal's field keys, normalised to strings. */\n\t\trefusedKeys() {\n\t\t\tif (!Array.isArray(this.fieldErrors)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.fieldErrors.filter((key) => typeof key === 'string' && key !== '')\n\t\t},\n\t},\n\n\tmethods: {\n\t\t// Exposed to the template for the static button labels — the same\n\t\t// `methods: { t }` pattern the other dialogs in this folder use.\n\t\tt,\n\n\t\t/**\n\t\t * Whether the refusal named this field.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRefused(key) {\n\t\t\treturn this.refusedKeys.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * What to say beside a refused field.\n\t\t *\n\t\t * The KIND is decided here rather than read out of the refusal's\n\t\t * sentence. A field this dialog offers and the person left empty is a\n\t\t * missing required input; one it offers that carries a value was\n\t\t * refused for what is in it. Parsing the server's prose to tell those\n\t\t * apart would break the first time the sentence is reworded, and a\n\t\t * reworded sentence is not a contract change.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\trefusalFor(key) {\n\t\t\tconst field = this.fields.find((candidate) => candidate.key === key)\n\t\t\tif (field && !this.isFilled(field)) {\n\t\t\t\treturn t('nextcloud-vue', 'This field is required.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'This value was not accepted.')\n\t\t},\n\n\t\t/**\n\t\t * What to say about a refused key this dialog does not offer.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\tundeclaredMessage(key) {\n\t\t\treturn t('nextcloud-vue', 'This action does not accept the field \"{field}\".', { field: key })\n\t\t},\n\n\t\t/**\n\t\t * The descriptor of an object input: its sub-properties (narrowed to the\n\t\t * input's `fields` when it names them), each with its own widget.\n\t\t * A sub-field is required when the input names it in `fields` and the\n\t\t * sub-schema lists it as required, or when the whole input is required\n\t\t * and it is the only one asked.\n\t\t *\n\t\t * @param {object} input The normalised input.\n\t\t * @param {object} prop The object property's schema.\n\t\t * @return {object} The field descriptor.\n\t\t */\n\t\tobjectField(input, prop) {\n\t\t\tconst subs = fieldsFromSchema(prop, { includeReadOnly: true, ...(input.fields ? { include: input.fields } : {}) })\n\t\t\tconst required = Array.isArray(prop.required) ? prop.required : []\n\t\t\tconst only = subs.length === 1\n\t\t\treturn {\n\t\t\t\tkey: input.field,\n\t\t\t\tlabel: prop.title || input.field,\n\t\t\t\tdescription: prop.description || '',\n\t\t\t\twidget: 'object',\n\t\t\t\trequired: input.required,\n\t\t\t\tsubFields: subs.map((sub) => ({\n\t\t\t\t\t...sub,\n\t\t\t\t\twidget: this.clampWidget(sub.widget),\n\t\t\t\t\trequired: (input.fields ? required.includes(sub.key) : sub.required === true) || (input.required && only),\n\t\t\t\t})),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Ids a reference picker must not offer: the current record, when the\n\t\t * input's `picker.excludeSelf` says so.\n\t\t *\n\t\t * @param {object} field The reference field descriptor.\n\t\t * @return {string[]} The ids to leave out.\n\t\t */\n\t\texcludedIds(field) {\n\t\t\tif (!field.picker || field.picker.excludeSelf !== true || !this.currentObject) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst self = this.currentObject\n\t\t\treturn [self.id, self.uuid, self['@self'] && self['@self'].id].filter((id) => id !== undefined && id !== null).map(String)\n\t\t},\n\n\t\t/**\n\t\t * Label of a sub-field, with the required marker.\n\t\t *\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tsubLabel(sub) {\n\t\t\treturn sub.required ? `${sub.label} *` : sub.label\n\t\t},\n\n\t\t/**\n\t\t * A typed sub-value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {unknown}\n\t\t */\n\t\tsubValue(key, sub) {\n\t\t\tconst group = this.values[key]\n\t\t\treturn group && typeof group === 'object' ? group[sub] : undefined\n\t\t},\n\n\t\t/**\n\t\t * Store one sub-value, keeping the rest of the object input's values.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetSubValue(key, sub, value) {\n\t\t\tconst group = this.values[key] && typeof this.values[key] === 'object' ? this.values[key] : {}\n\t\t\tthis.setValue(key, { ...group, [sub]: value })\n\t\t},\n\n\t\t/**\n\t\t * Whether a required sub-field holds a value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubFilled(key, sub) {\n\t\t\tconst value = this.subValue(key, sub.key)\n\t\t\treturn sub.widget === 'checkbox' ? value === true : String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * Whether a refusal named `<input>.<sub>`.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubRefused(key, sub) {\n\t\t\treturn this.refusedKeys.includes(`${key}.${sub}`)\n\t\t},\n\n\t\t/** Seed each declared input from its schema default (booleans start false). */\n\t\tinitialValues() {\n\t\t\tconst values = {}\n\t\t\tconst declared = Array.isArray(this.transition?.inputs) ? this.transition.inputs : []\n\t\t\tconst properties = (this.schema && this.schema.properties) || {}\n\t\t\tfor (const input of declared) {\n\t\t\t\tif (!input || typeof input.field !== 'string' || input.field === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst prop = properties[input.field] || {}\n\t\t\t\tif (prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\t// An object input starts from the record's present value, so\n\t\t\t\t\t// the sub-fields it asks for show what is there.\n\t\t\t\t\tconst present = this.currentObject ? this.currentObject[input.field] : null\n\t\t\t\t\tvalues[input.field] = present && typeof present === 'object' ? { ...present } : {}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tvalues[input.field] = prop.default !== undefined\n\t\t\t\t\t? prop.default\n\t\t\t\t\t: (prop.type === 'boolean' ? false : '')\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Clamp a `fieldsFromSchema()` widget to the minimal set this dialog\n\t\t * renders. Anything richer (select, date, user picker, …) degrades to a\n\t\t * plain text input rather than pulling a form engine into the dialog.\n\t\t *\n\t\t * @param {string} widget The resolved widget name.\n\t\t * @return {'text'|'textarea'|'number'|'checkbox'}\n\t\t */\n\t\tclampWidget(widget) {\n\t\t\tif (widget === 'checkbox' || widget === 'switch') {\n\t\t\t\treturn 'checkbox'\n\t\t\t}\n\t\t\tif (widget === 'textarea') {\n\t\t\t\treturn 'textarea'\n\t\t\t}\n\t\t\tif (widget === 'number') {\n\t\t\t\treturn 'number'\n\t\t\t}\n\t\t\treturn 'text'\n\t\t},\n\n\t\t/**\n\t\t * The field's visible label, with a `*` marker on required inputs so the\n\t\t * confirm-gating is visually explained.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\trequiredLabel(field) {\n\t\t\treturn field.required ? `${field.label} *` : field.label\n\t\t},\n\n\t\t/**\n\t\t * Store one input's value.\n\t\t *\n\t\t * @param {string} key The declared field name.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetValue(key, value) {\n\t\t\tthis.values = { ...this.values, [key]: value }\n\t\t},\n\n\t\t/**\n\t\t * Whether a required field counts as filled: a checked switch for\n\t\t * booleans, a non-blank string otherwise.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisFilled(field) {\n\t\t\tconst value = this.values[field.key]\n\t\t\tif (field.widget === 'checkbox') {\n\t\t\t\treturn value === true\n\t\t\t}\n\t\t\treturn String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * The object an object input sends: the record's current value with the\n\t\t * asked sub-fields merged over it, so a sub-field that was not asked for\n\t\t * keeps its value. A shown field left empty over an empty current value\n\t\t * is not written. Never a dotted key.\n\t\t *\n\t\t * @param {object} field The object field descriptor.\n\t\t * @return {object}\n\t\t */\n\t\tmergedObject(field) {\n\t\t\tconst present = this.currentObject ? this.currentObject[field.key] : null\n\t\t\tconst base = present && typeof present === 'object' ? { ...present } : {}\n\t\t\tfor (const sub of field.subFields) {\n\t\t\t\tlet value = this.subValue(field.key, sub.key)\n\t\t\t\tconst empty = sub.widget === 'checkbox' ? value === undefined : String(value ?? '').trim() === ''\n\t\t\t\tconst had = base[sub.key]\n\t\t\t\tif (empty && (had === undefined || had === null || had === '')) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (sub.widget === 'number' && !empty && !Number.isNaN(Number(value))) {\n\t\t\t\t\tvalue = Number(value)\n\t\t\t\t}\n\t\t\t\tbase[sub.key] = value\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/** Confirm: emit exactly the declared keys (numbers cast) and let the parent POST. */\n\t\tonConfirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst data = {}\n\t\t\tfor (const field of this.fields) {\n\t\t\t\tif (field.widget === 'object') {\n\t\t\t\t\tdata[field.key] = this.mergedObject(field)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tlet value = this.values[field.key]\n\t\t\t\tif (field.widget === 'number' && String(value ?? '').trim() !== '') {\n\t\t\t\t\tconst parsed = Number(value)\n\t\t\t\t\tif (!Number.isNaN(parsed)) {\n\t\t\t\t\t\tvalue = parsed\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdata[field.key] = value\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event confirm Emitted when the user confirms with all required\n\t\t\t * inputs filled. Payload holds exactly the declared input keys; the\n\t\t\t * parent POSTs `{ action, data }`.\n\t\t\t * @type {{[key: string]: unknown}}\n\t\t\t */\n\t\t\tthis.$emit('confirm', data)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-transition-input {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 4px 0;\n}\n\n.cn-transition-input__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__field-error {\n\tmargin: 4px 0 0;\n\tfont-size: 0.9em;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__object {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\tpadding: 8px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-transition-input__label {\n\tdisplay: block;\n\tmargin-bottom: 4px;\n}\n\n.cn-transition-input__field--refused {\n\tborder-inline-start: 2px solid var(--color-error);\n\tpadding-inline-start: 8px;\n}\n</style>\n"],"names":["CnResourceSelect","CnDialog","t"],"mappings":"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"}
1
+ {"version":3,"file":"CnTransitionInputDialog.vue2.js","sources":["../../../src/dialogs/CnTransitionInputDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:look=\"look\"\n\t\t:width=\"width\"\n\t\tdefaultWidth=\"form\"\n\t\t:eyebrow=\"eyebrow\"\n\t\t:subtitle=\"subtitle\"\n\t\t:name=\"dialogTitle\"\n\t\tsize=\"normal\"\n\t\t@closing=\"$emit('close')\">\n\t\t<div\n\t\t\tclass=\"cn-transition-input\"\n\t\t\t:aria-busy=\"busy ? 'true' : null\"\n\t\t\tdata-testid=\"cn-modal\"\n\t\t\tdata-testid-modal=\"cn-transition-input-dialog\">\n\t\t\t<!-- A refusal keeps this dialog open with what was typed still in\n\t\t\t it. Closing first and reporting behind it loses the work and\n\t\t\t asks the person to retype it from memory. -->\n\t\t\t<p v-if=\"error\"\n\t\t\t\tclass=\"cn-transition-input__error\"\n\t\t\t\tdata-testid=\"cn-transition-input-error\">\n\t\t\t\t{{ error }}\n\t\t\t</p>\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.key\"\n\t\t\t\tclass=\"cn-transition-input__field\"\n\t\t\t\t:class=\"{ 'cn-transition-input__field--refused': isRefused(field.key) }\"\n\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}`\">\n\t\t\t\t<!-- An input that declares its choices is picked from them. -->\n\t\t\t\t<NcSelect v-if=\"field.widget === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"field.options\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t:inputLabel=\"requiredLabel(field)\"\n\t\t\t\t\t:clearable=\"!field.required\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-select-${field.key}`\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event && $event.value !== undefined ? $event.value : '')\" />\n\n\t\t\t\t<!-- An input that points at another record is picked, never typed. -->\n\t\t\t\t<div v-else-if=\"field.widget === 'reference'\" class=\"cn-transition-input__reference\">\n\t\t\t\t\t<label class=\"cn-transition-input__label\">{{ requiredLabel(field) }}</label>\n\t\t\t\t\t<CnResourceSelect\n\t\t\t\t\t\t:register=\"field.referenceRegister\"\n\t\t\t\t\t\t:schema=\"String(field.reference.schema)\"\n\t\t\t\t\t\t:labelField=\"(field.picker && field.picker.labelField) || field.reference.labelField || 'name'\"\n\t\t\t\t\t\t:filter=\"(field.picker && field.picker.filter) || {}\"\n\t\t\t\t\t\t:exclude=\"excludedIds(field)\"\n\t\t\t\t\t\t:allowCreate=\"false\"\n\t\t\t\t\t\t:preload=\"true\"\n\t\t\t\t\t\t:inputLabel=\"requiredLabel(field)\"\n\t\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-picker-${field.key}`\"\n\t\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- An object input: its sub-properties, one field at a time. -->\n\t\t\t\t<fieldset v-else-if=\"field.widget === 'object'\" class=\"cn-transition-input__object\">\n\t\t\t\t\t<legend>{{ requiredLabel(field) }}</legend>\n\t\t\t\t\t<div v-for=\"sub in field.subFields\"\n\t\t\t\t\t\t:key=\"sub.key\"\n\t\t\t\t\t\tclass=\"cn-transition-input__subfield\"\n\t\t\t\t\t\t:data-testid=\"`cn-transition-input-${field.key}-${sub.key}`\">\n\t\t\t\t\t\t<NcTextArea v-if=\"sub.widget === 'textarea'\"\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\trows=\"3\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"sub.widget === 'checkbox'\"\n\t\t\t\t\t\t\t:modelValue=\"subValue(field.key, sub.key) === true\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event === true)\">\n\t\t\t\t\t\t\t{{ subLabel(sub) }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcTextField v-else\n\t\t\t\t\t\t\t:modelValue=\"String(subValue(field.key, sub.key) ?? '')\"\n\t\t\t\t\t\t\t:type=\"sub.widget === 'number' ? 'number' : 'text'\"\n\t\t\t\t\t\t\t:label=\"subLabel(sub)\"\n\t\t\t\t\t\t\t@update:modelValue=\"setSubValue(field.key, sub.key, $event)\" />\n\t\t\t\t\t\t<p v-if=\"isSubRefused(field.key, sub.key)\"\n\t\t\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}.${sub.key}`\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'This value was not accepted.') }}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\n\t\t\t\t<NcCheckboxRadioSwitch v-else-if=\"field.widget === 'checkbox'\"\n\t\t\t\t\t:modelValue=\"values[field.key] === true\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event === true)\">\n\t\t\t\t\t{{ requiredLabel(field) }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t<NcTextArea v-else-if=\"field.widget === 'textarea'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\trows=\"4\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else-if=\"field.widget === 'number'\"\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"String(values[field.key] ?? '')\"\n\t\t\t\t\t:label=\"requiredLabel(field)\"\n\t\t\t\t\t:helperText=\"field.description || ''\"\n\t\t\t\t\t@update:modelValue=\"setValue(field.key, $event)\" />\n\n\t\t\t\t<p v-if=\"isRefused(field.key)\"\n\t\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t\t:data-testid=\"`cn-transition-input-error-${field.key}`\">\n\t\t\t\t\t{{ refusalFor(field.key) }}\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<!-- A key the refusal names that this dialog never offered is not a\n\t\t\t field anybody can correct here. Saying so beats saying nothing:\n\t\t\t the request sent something the transition does not accept. -->\n\t\t\t<p v-for=\"key in unofferedRefusals\"\n\t\t\t\t:key=\"key\"\n\t\t\t\tclass=\"cn-transition-input__field-error\"\n\t\t\t\t:data-testid=\"`cn-transition-input-error-${key}`\">\n\t\t\t\t{{ undeclaredMessage(key) }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tdata-testid=\"cn-transition-input-cancel\"\n\t\t\t\t@click=\"$emit('close')\">\n\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<!-- Busy while the parent's POST runs: a transition can take\n\t\t\t seconds, and a confirm button that only greys out reads as one\n\t\t\t that did nothing. -->\n\t\t\t<NcButton\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\t:aria-busy=\"busy ? 'true' : null\"\n\t\t\t\tdata-testid=\"cn-transition-input-confirm\"\n\t\t\t\t@click=\"onConfirm\">\n\t\t\t\t<template v-if=\"busy\" #icon>\n\t\t\t\t\t<NcLoadingIcon :size=\"20\" data-testid=\"cn-transition-input-busy\" />\n\t\t\t\t</template>\n\t\t\t\t{{ confirmLabel }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CnDialog from '../components/CnDialog/CnDialog.vue'\nimport CnResourceSelect from '../components/CnResourceSelect/CnResourceSelect.vue'\nimport { dialogBoardMixin } from '../mixins/dialogBoard.js'\nimport { fieldsFromSchema } from '../utils/schema.js'\n\n/**\n * CnTransitionInputDialog — collects a lifecycle transition's declared\n * `inputs` before the transition is applied.\n *\n * A schema's `x-openregister-lifecycle.transitions.<action>` block may declare\n * `inputs: [{ field, required }]`; the transition endpoint then accepts\n * `{ action, data: { <field>: <value> } }`. This dialog renders one input per\n * declared field, disables the confirm button until every `required: true`\n * field is filled, and emits the collected values — the parent\n * (`CnLifecycleActions`) performs the actual POST. Cancel emits `close`\n * without any confirm, so no request is made.\n *\n * Field rendering resolves each declared field against the object's JSON\n * Schema via `fieldsFromSchema()` when a `schema` is given: the label comes\n * from the property `title`, booleans render as a switch, numbers as a number\n * field, and long text (`maxLength > 255` or a `textarea`/`markdown` format)\n * as a textarea. Anything else — including a field the schema does not\n * declare — falls back to a plain labelled text input.\n *\n * An input may also say how it is asked for, which matters when the choices\n * depend on the record rather than on its schema: `label` names the field,\n * and `options: [{ value, label }]` turns it into a picker that shows each\n * `label` and sends the chosen `value`. An input that declares neither is\n * rendered from the schema as before. Deliberately minimal:\n * text, textarea, number and checkbox cover transition inputs; this is not a\n * form engine (use `CnFormDialog` for full object forms).\n *\n * Lives in its own file under `src/dialogs/` per the modal-isolation rule.\n *\n * ```vue\n * <CnTransitionInputDialog\n * v-if=\"inputTransition\"\n * :transition=\"inputTransition\"\n * :schema=\"schema\"\n * @confirm=\"onInputConfirm\"\n * @close=\"inputTransition = null\" />\n * ```\n */\nexport default {\n\tname: 'CnTransitionInputDialog',\n\n\tcomponents: {\n\t\tCnResourceSelect,\n\t\tCnDialog,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcTextField,\n\t\tNcTextArea,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSelect,\n\t},\n\n\tmixins: [dialogBoardMixin],\n\n\tprops: {\n\t\t/**\n\t\t * The transition being applied. `inputs` is the declared input list from\n\t\t * `x-openregister-lifecycle.transitions.<action>.inputs` (server-derived\n\t\t * or config-declared); `label` doubles as dialog title + confirm label.\n\t\t *\n\t\t * An input may carry a `label` for its field and `options` to pick\n\t\t * from, each `{ value, label }`; the picker shows the label and sends\n\t\t * the value.\n\t\t *\n\t\t * @type {{action?: string, label?: string, inputs?: Array<{field: string, required?: boolean, label?: string, options?: Array<{value: string, label?: string}>}>}}\n\t\t */\n\t\ttransition: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The object's JSON Schema (with `properties`), used to resolve each\n\t\t * input's label, widget and helper text. Optional — undeclared fields\n\t\t * render as plain text inputs labelled by their field name.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The record the transition runs on. Gives `picker.excludeSelf` its id\n\t\t * to leave out, and the current value an object input is merged over.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tcurrentObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Register slug the reference pickers look in when the schema property\n\t\t * names none of its own.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tregister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The sentence a refused transition answered with. Present means the\n\t\t * dialog stayed open BECAUSE the attempt was refused, with everything\n\t\t * typed still in it.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\terror: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The input keys the refusal named (`fields` in the 400 body). Each one\n\t\t * that this dialog offers is marked on its own field; each one it does\n\t\t * not is reported as a key the transition does not accept.\n\t\t *\n\t\t * @type {string[]}\n\t\t */\n\t\tfieldErrors: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether the parent is mid-POST. Keeps the confirm button from firing\n\t\t * a second attempt while the first is in flight.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tbusy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['confirm', 'close'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** @type {{[key: string]: unknown}} Collected input values, keyed by declared field name. */\n\t\t\tvalues: this.initialValues(),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** The declared inputs, normalised to `{ field, required }`. */\n\t\tinputs() {\n\t\t\tconst declared = Array.isArray(this.transition.inputs) ? this.transition.inputs : []\n\t\t\treturn declared\n\t\t\t\t.filter((input) => input && typeof input.field === 'string' && input.field !== '')\n\t\t\t\t.map((input) => ({\n\t\t\t\t\tfield: input.field,\n\t\t\t\t\trequired: input.required === true,\n\t\t\t\t\tpicker: input.picker && typeof input.picker === 'object' ? input.picker : null,\n\t\t\t\t\tfields: Array.isArray(input.fields) ? input.fields.filter((f) => typeof f === 'string') : null,\n\t\t\t\t\tlabel: typeof input.label === 'string' && input.label.trim() !== '' ? input.label.trim() : null,\n\t\t\t\t\toptions: this.declaredOptions(input.options),\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * One renderable field descriptor per declared input. Schema-declared\n\t\t * fields come from `fieldsFromSchema()` (label from the property title,\n\t\t * widget from the type/format); the widget is then clamped to the minimal\n\t\t * set this dialog renders (text / textarea / number / checkbox). Fields\n\t\t * the schema does not declare fall back to a plain text input.\n\t\t *\n\t\t * An input that declares `options` is a picker whatever the schema\n\t\t * says, because its choices are the ones this transition offers on\n\t\t * this record. A declared `label` names the field over the schema's.\n\t\t */\n\t\tfields() {\n\t\t\tconst keys = this.inputs.map((input) => input.field)\n\t\t\tconst resolved = fieldsFromSchema(this.schema, { include: keys, includeReadOnly: true })\n\t\t\treturn this.inputs.map((input) => {\n\t\t\t\tconst field = resolved.find((f) => f.key === input.field)\n\t\t\t\tif (input.options) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: input.field,\n\t\t\t\t\t\tlabel: input.label || (field && field.label) || input.field,\n\t\t\t\t\t\tdescription: (field && field.description) || '',\n\t\t\t\t\t\twidget: 'select',\n\t\t\t\t\t\toptions: input.options,\n\t\t\t\t\t\trequired: input.required,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst prop = (this.schema && this.schema.properties && this.schema.properties[input.field]) || null\n\t\t\t\tif (prop && prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\treturn this.objectField(input, prop)\n\t\t\t\t}\n\t\t\t\tif (!field) {\n\t\t\t\t\treturn { key: input.field, label: input.label || input.field, description: '', widget: 'text', required: input.required }\n\t\t\t\t}\n\t\t\t\tif (field.reference && field.reference.multiple !== true) {\n\t\t\t\t\tconst register = field.reference.register || this.register\n\t\t\t\t\tif (register !== '') {\n\t\t\t\t\t\treturn { ...field, label: input.label || field.label, widget: 'reference', referenceRegister: register, picker: input.picker, required: input.required }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { ...field, label: input.label || field.label, widget: this.clampWidget(field.widget), required: input.required }\n\t\t\t})\n\t\t},\n\n\t\t/** Dialog title — the transition's label, with a generic fallback. */\n\t\tdialogTitle() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Provide details')\n\t\t},\n\n\t\t/** Confirm button label — the transition's label per the contract. */\n\t\tconfirmLabel() {\n\t\t\treturn this.transition.label || t('nextcloud-vue', 'Confirm')\n\t\t},\n\n\t\t/** True when every `required: true` input holds a non-empty value. */\n\t\tcanConfirm() {\n\t\t\tif (this.busy === true) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.fields.every((field) => (field.widget === 'object'\n\t\t\t\t? field.subFields.every((sub) => !sub.required || this.isSubFilled(field.key, sub))\n\t\t\t\t: (!field.required || this.isFilled(field))))\n\t\t},\n\n\t\t/** The refused keys this dialog offers no field for. */\n\t\tunofferedRefusals() {\n\t\t\tconst offered = this.fields.map((field) => field.key)\n\t\t\treturn this.refusedKeys.filter((key) => !offered.includes(key))\n\t\t},\n\n\t\t/** The refusal's field keys, normalised to strings. */\n\t\trefusedKeys() {\n\t\t\tif (!Array.isArray(this.fieldErrors)) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.fieldErrors.filter((key) => typeof key === 'string' && key !== '')\n\t\t},\n\t},\n\n\tmethods: {\n\t\t// Exposed to the template for the static button labels — the same\n\t\t// `methods: { t }` pattern the other dialogs in this folder use.\n\t\tt,\n\n\t\t/**\n\t\t * Whether the refusal named this field.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisRefused(key) {\n\t\t\treturn this.refusedKeys.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * What to say beside a refused field.\n\t\t *\n\t\t * The KIND is decided here rather than read out of the refusal's\n\t\t * sentence. A field this dialog offers and the person left empty is a\n\t\t * missing required input; one it offers that carries a value was\n\t\t * refused for what is in it. Parsing the server's prose to tell those\n\t\t * apart would break the first time the sentence is reworded, and a\n\t\t * reworded sentence is not a contract change.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\trefusalFor(key) {\n\t\t\tconst field = this.fields.find((candidate) => candidate.key === key)\n\t\t\tif (field && !this.isFilled(field)) {\n\t\t\t\treturn t('nextcloud-vue', 'This field is required.')\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'This value was not accepted.')\n\t\t},\n\n\t\t/**\n\t\t * What to say about a refused key this dialog does not offer.\n\t\t *\n\t\t * @param {string} key The field key.\n\t\t * @return {string}\n\t\t */\n\t\tundeclaredMessage(key) {\n\t\t\treturn t('nextcloud-vue', 'This action does not accept the field \"{field}\".', { field: key })\n\t\t},\n\n\t\t/**\n\t\t * The descriptor of an object input: its sub-properties (narrowed to the\n\t\t * input's `fields` when it names them), each with its own widget.\n\t\t * A sub-field is required when the input names it in `fields` and the\n\t\t * sub-schema lists it as required, or when the whole input is required\n\t\t * and it is the only one asked.\n\t\t *\n\t\t * @param {object} input The normalised input.\n\t\t * @param {object} prop The object property's schema.\n\t\t * @return {object} The field descriptor.\n\t\t */\n\t\tobjectField(input, prop) {\n\t\t\tconst subs = fieldsFromSchema(prop, { includeReadOnly: true, ...(input.fields ? { include: input.fields } : {}) })\n\t\t\tconst required = Array.isArray(prop.required) ? prop.required : []\n\t\t\tconst only = subs.length === 1\n\t\t\treturn {\n\t\t\t\tkey: input.field,\n\t\t\t\tlabel: prop.title || input.field,\n\t\t\t\tdescription: prop.description || '',\n\t\t\t\twidget: 'object',\n\t\t\t\trequired: input.required,\n\t\t\t\tsubFields: subs.map((sub) => ({\n\t\t\t\t\t...sub,\n\t\t\t\t\twidget: this.clampWidget(sub.widget),\n\t\t\t\t\trequired: (input.fields ? required.includes(sub.key) : sub.required === true) || (input.required && only),\n\t\t\t\t})),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The choices an input declares, as `[{ value, label }]`, or null when\n\t\t * it declares none. An option without a value is dropped, because it\n\t\t * cannot be sent; one without a label shows its value.\n\t\t *\n\t\t * @param {unknown} options The input's declared `options`.\n\t\t * @return {Array<{value: string, label: string}>|null}\n\t\t */\n\t\tdeclaredOptions(options) {\n\t\t\tif (!Array.isArray(options)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst usable = options\n\t\t\t\t.filter((option) => option && typeof option === 'object'\n\t\t\t\t\t&& (typeof option.value === 'string' || typeof option.value === 'number')\n\t\t\t\t\t&& String(option.value).trim() !== '')\n\t\t\t\t.map((option) => ({\n\t\t\t\t\tvalue: String(option.value),\n\t\t\t\t\tlabel: typeof option.label === 'string' && option.label.trim() !== '' ? option.label.trim() : String(option.value),\n\t\t\t\t}))\n\t\t\treturn usable.length > 0 ? usable : null\n\t\t},\n\n\t\t/**\n\t\t * The option a picker field currently holds, or null.\n\t\t *\n\t\t * @param {object} field The select field descriptor.\n\t\t * @return {{value: string, label: string}|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\tconst value = this.values[field.key]\n\t\t\treturn field.options.find((option) => option.value === String(value ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Ids a reference picker must not offer: the current record, when the\n\t\t * input's `picker.excludeSelf` says so.\n\t\t *\n\t\t * @param {object} field The reference field descriptor.\n\t\t * @return {string[]} The ids to leave out.\n\t\t */\n\t\texcludedIds(field) {\n\t\t\tif (!field.picker || field.picker.excludeSelf !== true || !this.currentObject) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst self = this.currentObject\n\t\t\treturn [self.id, self.uuid, self['@self'] && self['@self'].id].filter((id) => id !== undefined && id !== null).map(String)\n\t\t},\n\n\t\t/**\n\t\t * Label of a sub-field, with the required marker.\n\t\t *\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\tsubLabel(sub) {\n\t\t\treturn sub.required ? `${sub.label} *` : sub.label\n\t\t},\n\n\t\t/**\n\t\t * A typed sub-value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {unknown}\n\t\t */\n\t\tsubValue(key, sub) {\n\t\t\tconst group = this.values[key]\n\t\t\treturn group && typeof group === 'object' ? group[sub] : undefined\n\t\t},\n\n\t\t/**\n\t\t * Store one sub-value, keeping the rest of the object input's values.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetSubValue(key, sub, value) {\n\t\t\tconst group = this.values[key] && typeof this.values[key] === 'object' ? this.values[key] : {}\n\t\t\tthis.setValue(key, { ...group, [sub]: value })\n\t\t},\n\n\t\t/**\n\t\t * Whether a required sub-field holds a value.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {object} sub The sub-field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubFilled(key, sub) {\n\t\t\tconst value = this.subValue(key, sub.key)\n\t\t\treturn sub.widget === 'checkbox' ? value === true : String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * Whether a refusal named `<input>.<sub>`.\n\t\t *\n\t\t * @param {string} key The input key.\n\t\t * @param {string} sub The sub-field key.\n\t\t * @return {boolean}\n\t\t */\n\t\tisSubRefused(key, sub) {\n\t\t\treturn this.refusedKeys.includes(`${key}.${sub}`)\n\t\t},\n\n\t\t/** Seed each declared input from its schema default (booleans start false). */\n\t\tinitialValues() {\n\t\t\tconst values = {}\n\t\t\tconst declared = Array.isArray(this.transition?.inputs) ? this.transition.inputs : []\n\t\t\tconst properties = (this.schema && this.schema.properties) || {}\n\t\t\tfor (const input of declared) {\n\t\t\t\tif (!input || typeof input.field !== 'string' || input.field === '') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst prop = properties[input.field] || {}\n\t\t\t\tif (prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\t\t\t// An object input starts from the record's present value, so\n\t\t\t\t\t// the sub-fields it asks for show what is there.\n\t\t\t\t\tconst present = this.currentObject ? this.currentObject[input.field] : null\n\t\t\t\t\tvalues[input.field] = present && typeof present === 'object' ? { ...present } : {}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tvalues[input.field] = prop.default !== undefined\n\t\t\t\t\t? prop.default\n\t\t\t\t\t: (prop.type === 'boolean' ? false : '')\n\t\t\t}\n\t\t\treturn values\n\t\t},\n\n\t\t/**\n\t\t * Clamp a `fieldsFromSchema()` widget to the minimal set this dialog\n\t\t * renders. Anything richer (select, date, user picker, …) degrades to a\n\t\t * plain text input rather than pulling a form engine into the dialog.\n\t\t *\n\t\t * @param {string} widget The resolved widget name.\n\t\t * @return {'text'|'textarea'|'number'|'checkbox'}\n\t\t */\n\t\tclampWidget(widget) {\n\t\t\tif (widget === 'checkbox' || widget === 'switch') {\n\t\t\t\treturn 'checkbox'\n\t\t\t}\n\t\t\tif (widget === 'textarea') {\n\t\t\t\treturn 'textarea'\n\t\t\t}\n\t\t\tif (widget === 'number') {\n\t\t\t\treturn 'number'\n\t\t\t}\n\t\t\treturn 'text'\n\t\t},\n\n\t\t/**\n\t\t * The field's visible label, with a `*` marker on required inputs so the\n\t\t * confirm-gating is visually explained.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {string}\n\t\t */\n\t\trequiredLabel(field) {\n\t\t\treturn field.required ? `${field.label} *` : field.label\n\t\t},\n\n\t\t/**\n\t\t * Store one input's value.\n\t\t *\n\t\t * @param {string} key The declared field name.\n\t\t * @param {unknown} value The new value.\n\t\t */\n\t\tsetValue(key, value) {\n\t\t\tthis.values = { ...this.values, [key]: value }\n\t\t},\n\n\t\t/**\n\t\t * Whether a required field counts as filled: a checked switch for\n\t\t * booleans, a non-blank string otherwise.\n\t\t *\n\t\t * @param {object} field The field descriptor.\n\t\t * @return {boolean}\n\t\t */\n\t\tisFilled(field) {\n\t\t\tconst value = this.values[field.key]\n\t\t\tif (field.widget === 'checkbox') {\n\t\t\t\treturn value === true\n\t\t\t}\n\t\t\treturn String(value ?? '').trim() !== ''\n\t\t},\n\n\t\t/**\n\t\t * The object an object input sends: the record's current value with the\n\t\t * asked sub-fields merged over it, so a sub-field that was not asked for\n\t\t * keeps its value. A shown field left empty over an empty current value\n\t\t * is not written. Never a dotted key.\n\t\t *\n\t\t * @param {object} field The object field descriptor.\n\t\t * @return {object}\n\t\t */\n\t\tmergedObject(field) {\n\t\t\tconst present = this.currentObject ? this.currentObject[field.key] : null\n\t\t\tconst base = present && typeof present === 'object' ? { ...present } : {}\n\t\t\tfor (const sub of field.subFields) {\n\t\t\t\tlet value = this.subValue(field.key, sub.key)\n\t\t\t\tconst empty = sub.widget === 'checkbox' ? value === undefined : String(value ?? '').trim() === ''\n\t\t\t\tconst had = base[sub.key]\n\t\t\t\tif (empty && (had === undefined || had === null || had === '')) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (sub.widget === 'number' && !empty && !Number.isNaN(Number(value))) {\n\t\t\t\t\tvalue = Number(value)\n\t\t\t\t}\n\t\t\t\tbase[sub.key] = value\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/** Confirm: emit exactly the declared keys (numbers cast) and let the parent POST. */\n\t\tonConfirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst data = {}\n\t\t\tfor (const field of this.fields) {\n\t\t\t\tif (field.widget === 'object') {\n\t\t\t\t\tdata[field.key] = this.mergedObject(field)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tlet value = this.values[field.key]\n\t\t\t\tif (field.widget === 'number' && String(value ?? '').trim() !== '') {\n\t\t\t\t\tconst parsed = Number(value)\n\t\t\t\t\tif (!Number.isNaN(parsed)) {\n\t\t\t\t\t\tvalue = parsed\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdata[field.key] = value\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event confirm Emitted when the user confirms with all required\n\t\t\t * inputs filled. Payload holds exactly the declared input keys; the\n\t\t\t * parent POSTs `{ action, data }`.\n\t\t\t * @type {{[key: string]: unknown}}\n\t\t\t */\n\t\t\tthis.$emit('confirm', data)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-transition-input {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 4px 0;\n}\n\n.cn-transition-input__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__field-error {\n\tmargin: 4px 0 0;\n\tfont-size: 0.9em;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n\n.cn-transition-input__object {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\tpadding: 8px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-transition-input__label {\n\tdisplay: block;\n\tmargin-bottom: 4px;\n}\n\n.cn-transition-input__field--refused {\n\tborder-inline-start: 2px solid var(--color-error);\n\tpadding-inline-start: 8px;\n}\n</style>\n"],"names":["CnResourceSelect","CnDialog","t"],"mappings":"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"}
@@ -1,10 +1,6 @@
1
- import { resolveComponent, openBlock, createBlock, withCtx, createVNode, createTextVNode, toDisplayString, createElementVNode, createElementBlock, createCommentVNode, Fragment, renderList, normalizeClass } from 'vue';
1
+ import { resolveComponent, openBlock, createBlock, withCtx, createVNode, createTextVNode, toDisplayString, createSlots, createElementVNode, createElementBlock, createCommentVNode, Fragment, renderList, normalizeClass } from 'vue';
2
2
 
3
- const _hoisted_1 = {
4
- class: "cn-transition-input",
5
- "data-testid": "cn-modal",
6
- "data-testid-modal": "cn-transition-input-dialog"
7
- };
3
+ const _hoisted_1 = ["aria-busy"];
8
4
  const _hoisted_2 = {
9
5
  key: 0,
10
6
  class: "cn-transition-input__error",
@@ -12,12 +8,12 @@ const _hoisted_2 = {
12
8
  };
13
9
  const _hoisted_3 = ["data-testid"];
14
10
  const _hoisted_4 = {
15
- key: 0,
11
+ key: 1,
16
12
  class: "cn-transition-input__reference"
17
13
  };
18
14
  const _hoisted_5 = { class: "cn-transition-input__label" };
19
15
  const _hoisted_6 = {
20
- key: 1,
16
+ key: 2,
21
17
  class: "cn-transition-input__object"
22
18
  };
23
19
  const _hoisted_7 = ["data-testid"];
@@ -26,11 +22,13 @@ const _hoisted_9 = ["data-testid"];
26
22
  const _hoisted_10 = ["data-testid"];
27
23
 
28
24
  function render(_ctx, _cache, $props, $setup, $data, $options) {
25
+ const _component_NcSelect = resolveComponent("NcSelect");
29
26
  const _component_CnResourceSelect = resolveComponent("CnResourceSelect");
30
27
  const _component_NcTextArea = resolveComponent("NcTextArea");
31
28
  const _component_NcCheckboxRadioSwitch = resolveComponent("NcCheckboxRadioSwitch");
32
29
  const _component_NcTextField = resolveComponent("NcTextField");
33
30
  const _component_NcButton = resolveComponent("NcButton");
31
+ const _component_NcLoadingIcon = resolveComponent("NcLoadingIcon");
34
32
  const _component_CnDialog = resolveComponent("CnDialog");
35
33
 
36
34
  return (openBlock(), createBlock(_component_CnDialog, {
@@ -56,17 +54,36 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
56
54
  createVNode(_component_NcButton, {
57
55
  variant: "primary",
58
56
  disabled: !$options.canConfirm,
57
+ "aria-busy": $props.busy ? 'true' : null,
59
58
  "data-testid": "cn-transition-input-confirm",
60
59
  onClick: $options.onConfirm
61
- }, {
60
+ }, createSlots({
62
61
  default: withCtx(() => [
63
- createTextVNode(toDisplayString($options.confirmLabel), 1 /* TEXT */)
62
+ createTextVNode(" " + toDisplayString($options.confirmLabel), 1 /* TEXT */)
64
63
  ]),
65
- _: 1 /* STABLE */
66
- }, 8 /* PROPS */, ["disabled", "onClick"])
64
+ _: 2 /* DYNAMIC */
65
+ }, [
66
+ ($props.busy)
67
+ ? {
68
+ name: "icon",
69
+ fn: withCtx(() => [
70
+ createVNode(_component_NcLoadingIcon, {
71
+ size: 20,
72
+ "data-testid": "cn-transition-input-busy"
73
+ })
74
+ ]),
75
+ key: "0"
76
+ }
77
+ : undefined
78
+ ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["disabled", "aria-busy", "onClick"])
67
79
  ]),
68
80
  default: withCtx(() => [
69
- createElementVNode("div", _hoisted_1, [
81
+ createElementVNode("div", {
82
+ class: "cn-transition-input",
83
+ "aria-busy": $props.busy ? 'true' : null,
84
+ "data-testid": "cn-modal",
85
+ "data-testid-modal": "cn-transition-input-dialog"
86
+ }, [
70
87
  ($props.error)
71
88
  ? (openBlock(), createElementBlock("p", _hoisted_2, toDisplayString($props.error), 1 /* TEXT */))
72
89
  : createCommentVNode("v-if", true),
@@ -76,109 +93,120 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
76
93
  class: normalizeClass(["cn-transition-input__field", { 'cn-transition-input__field--refused': $options.isRefused(field.key) }]),
77
94
  "data-testid": `cn-transition-input-${field.key}`
78
95
  }, [
79
- (field.widget === 'reference')
80
- ? (openBlock(), createElementBlock("div", _hoisted_4, [
81
- createElementVNode("label", _hoisted_5, toDisplayString($options.requiredLabel(field)), 1 /* TEXT */),
82
- createVNode(_component_CnResourceSelect, {
83
- register: field.referenceRegister,
84
- schema: String(field.reference.schema),
85
- labelField: (field.picker && field.picker.labelField) || field.reference.labelField || 'name',
86
- filter: (field.picker && field.picker.filter) || {},
87
- exclude: $options.excludedIds(field),
88
- allowCreate: false,
89
- preload: true,
90
- inputLabel: $options.requiredLabel(field),
91
- modelValue: String($data.values[field.key] ?? ''),
92
- "data-testid": `cn-transition-input-picker-${field.key}`,
93
- "onUpdate:modelValue": $event => ($options.setValue(field.key, $event))
94
- }, null, 8 /* PROPS */, ["register", "schema", "labelField", "filter", "exclude", "inputLabel", "modelValue", "data-testid", "onUpdate:modelValue"])
95
- ]))
96
- : (field.widget === 'object')
97
- ? (openBlock(), createElementBlock("fieldset", _hoisted_6, [
98
- createElementVNode("legend", null, toDisplayString($options.requiredLabel(field)), 1 /* TEXT */),
99
- (openBlock(true), createElementBlock(Fragment, null, renderList(field.subFields, (sub) => {
100
- return (openBlock(), createElementBlock("div", {
101
- key: sub.key,
102
- class: "cn-transition-input__subfield",
103
- "data-testid": `cn-transition-input-${field.key}-${sub.key}`
104
- }, [
105
- (sub.widget === 'textarea')
106
- ? (openBlock(), createBlock(_component_NcTextArea, {
107
- key: 0,
108
- modelValue: String($options.subValue(field.key, sub.key) ?? ''),
109
- label: $options.subLabel(sub),
110
- rows: "3",
111
- "onUpdate:modelValue": $event => ($options.setSubValue(field.key, sub.key, $event))
112
- }, null, 8 /* PROPS */, ["modelValue", "label", "onUpdate:modelValue"]))
113
- : (sub.widget === 'checkbox')
114
- ? (openBlock(), createBlock(_component_NcCheckboxRadioSwitch, {
115
- key: 1,
116
- modelValue: $options.subValue(field.key, sub.key) === true,
117
- type: "switch",
118
- "onUpdate:modelValue": $event => ($options.setSubValue(field.key, sub.key, $event === true))
119
- }, {
120
- default: withCtx(() => [
121
- createTextVNode(toDisplayString($options.subLabel(sub)), 1 /* TEXT */)
122
- ]),
123
- _: 2 /* DYNAMIC */
124
- }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["modelValue", "onUpdate:modelValue"]))
125
- : (openBlock(), createBlock(_component_NcTextField, {
126
- key: 2,
96
+ (field.widget === 'select')
97
+ ? (openBlock(), createBlock(_component_NcSelect, {
98
+ key: 0,
99
+ modelValue: $options.selectedOption(field),
100
+ options: field.options,
101
+ label: "label",
102
+ inputLabel: $options.requiredLabel(field),
103
+ clearable: !field.required,
104
+ "data-testid": `cn-transition-input-select-${field.key}`,
105
+ "onUpdate:modelValue": $event => ($options.setValue(field.key, $event && $event.value !== undefined ? $event.value : ''))
106
+ }, null, 8 /* PROPS */, ["modelValue", "options", "inputLabel", "clearable", "data-testid", "onUpdate:modelValue"]))
107
+ : (field.widget === 'reference')
108
+ ? (openBlock(), createElementBlock("div", _hoisted_4, [
109
+ createElementVNode("label", _hoisted_5, toDisplayString($options.requiredLabel(field)), 1 /* TEXT */),
110
+ createVNode(_component_CnResourceSelect, {
111
+ register: field.referenceRegister,
112
+ schema: String(field.reference.schema),
113
+ labelField: (field.picker && field.picker.labelField) || field.reference.labelField || 'name',
114
+ filter: (field.picker && field.picker.filter) || {},
115
+ exclude: $options.excludedIds(field),
116
+ allowCreate: false,
117
+ preload: true,
118
+ inputLabel: $options.requiredLabel(field),
119
+ modelValue: String($data.values[field.key] ?? ''),
120
+ "data-testid": `cn-transition-input-picker-${field.key}`,
121
+ "onUpdate:modelValue": $event => ($options.setValue(field.key, $event))
122
+ }, null, 8 /* PROPS */, ["register", "schema", "labelField", "filter", "exclude", "inputLabel", "modelValue", "data-testid", "onUpdate:modelValue"])
123
+ ]))
124
+ : (field.widget === 'object')
125
+ ? (openBlock(), createElementBlock("fieldset", _hoisted_6, [
126
+ createElementVNode("legend", null, toDisplayString($options.requiredLabel(field)), 1 /* TEXT */),
127
+ (openBlock(true), createElementBlock(Fragment, null, renderList(field.subFields, (sub) => {
128
+ return (openBlock(), createElementBlock("div", {
129
+ key: sub.key,
130
+ class: "cn-transition-input__subfield",
131
+ "data-testid": `cn-transition-input-${field.key}-${sub.key}`
132
+ }, [
133
+ (sub.widget === 'textarea')
134
+ ? (openBlock(), createBlock(_component_NcTextArea, {
135
+ key: 0,
127
136
  modelValue: String($options.subValue(field.key, sub.key) ?? ''),
128
- type: sub.widget === 'number' ? 'number' : 'text',
129
137
  label: $options.subLabel(sub),
138
+ rows: "3",
130
139
  "onUpdate:modelValue": $event => ($options.setSubValue(field.key, sub.key, $event))
131
- }, null, 8 /* PROPS */, ["modelValue", "type", "label", "onUpdate:modelValue"])),
132
- ($options.isSubRefused(field.key, sub.key))
133
- ? (openBlock(), createElementBlock("p", {
134
- key: 3,
135
- class: "cn-transition-input__field-error",
136
- "data-testid": `cn-transition-input-error-${field.key}.${sub.key}`
137
- }, toDisplayString($options.t('nextcloud-vue', 'This value was not accepted.')), 9 /* TEXT, PROPS */, _hoisted_8))
138
- : createCommentVNode("v-if", true)
139
- ], 8 /* PROPS */, _hoisted_7))
140
- }), 128 /* KEYED_FRAGMENT */))
141
- ]))
142
- : (field.widget === 'checkbox')
143
- ? (openBlock(), createBlock(_component_NcCheckboxRadioSwitch, {
144
- key: 2,
145
- modelValue: $data.values[field.key] === true,
146
- type: "switch",
147
- "onUpdate:modelValue": $event => ($options.setValue(field.key, $event === true))
148
- }, {
149
- default: withCtx(() => [
150
- createTextVNode(toDisplayString($options.requiredLabel(field)), 1 /* TEXT */)
151
- ]),
152
- _: 2 /* DYNAMIC */
153
- }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["modelValue", "onUpdate:modelValue"]))
154
- : (field.widget === 'textarea')
155
- ? (openBlock(), createBlock(_component_NcTextArea, {
140
+ }, null, 8 /* PROPS */, ["modelValue", "label", "onUpdate:modelValue"]))
141
+ : (sub.widget === 'checkbox')
142
+ ? (openBlock(), createBlock(_component_NcCheckboxRadioSwitch, {
143
+ key: 1,
144
+ modelValue: $options.subValue(field.key, sub.key) === true,
145
+ type: "switch",
146
+ "onUpdate:modelValue": $event => ($options.setSubValue(field.key, sub.key, $event === true))
147
+ }, {
148
+ default: withCtx(() => [
149
+ createTextVNode(toDisplayString($options.subLabel(sub)), 1 /* TEXT */)
150
+ ]),
151
+ _: 2 /* DYNAMIC */
152
+ }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["modelValue", "onUpdate:modelValue"]))
153
+ : (openBlock(), createBlock(_component_NcTextField, {
154
+ key: 2,
155
+ modelValue: String($options.subValue(field.key, sub.key) ?? ''),
156
+ type: sub.widget === 'number' ? 'number' : 'text',
157
+ label: $options.subLabel(sub),
158
+ "onUpdate:modelValue": $event => ($options.setSubValue(field.key, sub.key, $event))
159
+ }, null, 8 /* PROPS */, ["modelValue", "type", "label", "onUpdate:modelValue"])),
160
+ ($options.isSubRefused(field.key, sub.key))
161
+ ? (openBlock(), createElementBlock("p", {
162
+ key: 3,
163
+ class: "cn-transition-input__field-error",
164
+ "data-testid": `cn-transition-input-error-${field.key}.${sub.key}`
165
+ }, toDisplayString($options.t('nextcloud-vue', 'This value was not accepted.')), 9 /* TEXT, PROPS */, _hoisted_8))
166
+ : createCommentVNode("v-if", true)
167
+ ], 8 /* PROPS */, _hoisted_7))
168
+ }), 128 /* KEYED_FRAGMENT */))
169
+ ]))
170
+ : (field.widget === 'checkbox')
171
+ ? (openBlock(), createBlock(_component_NcCheckboxRadioSwitch, {
156
172
  key: 3,
157
- modelValue: String($data.values[field.key] ?? ''),
158
- label: $options.requiredLabel(field),
159
- helperText: field.description || '',
160
- rows: "4",
161
- "onUpdate:modelValue": $event => ($options.setValue(field.key, $event))
162
- }, null, 8 /* PROPS */, ["modelValue", "label", "helperText", "onUpdate:modelValue"]))
163
- : (field.widget === 'number')
164
- ? (openBlock(), createBlock(_component_NcTextField, {
173
+ modelValue: $data.values[field.key] === true,
174
+ type: "switch",
175
+ "onUpdate:modelValue": $event => ($options.setValue(field.key, $event === true))
176
+ }, {
177
+ default: withCtx(() => [
178
+ createTextVNode(toDisplayString($options.requiredLabel(field)), 1 /* TEXT */)
179
+ ]),
180
+ _: 2 /* DYNAMIC */
181
+ }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["modelValue", "onUpdate:modelValue"]))
182
+ : (field.widget === 'textarea')
183
+ ? (openBlock(), createBlock(_component_NcTextArea, {
165
184
  key: 4,
166
185
  modelValue: String($data.values[field.key] ?? ''),
167
- type: "number",
168
186
  label: $options.requiredLabel(field),
169
187
  helperText: field.description || '',
188
+ rows: "4",
170
189
  "onUpdate:modelValue": $event => ($options.setValue(field.key, $event))
171
190
  }, null, 8 /* PROPS */, ["modelValue", "label", "helperText", "onUpdate:modelValue"]))
172
- : (openBlock(), createBlock(_component_NcTextField, {
173
- key: 5,
174
- modelValue: String($data.values[field.key] ?? ''),
175
- label: $options.requiredLabel(field),
176
- helperText: field.description || '',
177
- "onUpdate:modelValue": $event => ($options.setValue(field.key, $event))
178
- }, null, 8 /* PROPS */, ["modelValue", "label", "helperText", "onUpdate:modelValue"])),
191
+ : (field.widget === 'number')
192
+ ? (openBlock(), createBlock(_component_NcTextField, {
193
+ key: 5,
194
+ modelValue: String($data.values[field.key] ?? ''),
195
+ type: "number",
196
+ label: $options.requiredLabel(field),
197
+ helperText: field.description || '',
198
+ "onUpdate:modelValue": $event => ($options.setValue(field.key, $event))
199
+ }, null, 8 /* PROPS */, ["modelValue", "label", "helperText", "onUpdate:modelValue"]))
200
+ : (openBlock(), createBlock(_component_NcTextField, {
201
+ key: 6,
202
+ modelValue: String($data.values[field.key] ?? ''),
203
+ label: $options.requiredLabel(field),
204
+ helperText: field.description || '',
205
+ "onUpdate:modelValue": $event => ($options.setValue(field.key, $event))
206
+ }, null, 8 /* PROPS */, ["modelValue", "label", "helperText", "onUpdate:modelValue"])),
179
207
  ($options.isRefused(field.key))
180
208
  ? (openBlock(), createElementBlock("p", {
181
- key: 6,
209
+ key: 7,
182
210
  class: "cn-transition-input__field-error",
183
211
  "data-testid": `cn-transition-input-error-${field.key}`
184
212
  }, toDisplayString($options.refusalFor(field.key)), 9 /* TEXT, PROPS */, _hoisted_9))
@@ -192,7 +220,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
192
220
  "data-testid": `cn-transition-input-error-${key}`
193
221
  }, toDisplayString($options.undeclaredMessage(key)), 9 /* TEXT, PROPS */, _hoisted_10))
194
222
  }), 128 /* KEYED_FRAGMENT */))
195
- ])
223
+ ], 8 /* PROPS */, _hoisted_1)
196
224
  ]),
197
225
  _: 1 /* STABLE */
198
226
  }, 8 /* PROPS */, ["look", "width", "eyebrow", "subtitle", "name"]))