@conduction/nextcloud-vue 2.104.0 → 2.106.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 (224) hide show
  1. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  2. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  5. package/dist/esm/components/CnCardGrid/CnCardGrid.vue.js +1 -1
  6. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +18 -0
  7. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  8. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js +3 -1
  9. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  10. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  11. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +18 -0
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  13. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +1 -1
  14. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  15. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  16. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +93 -1
  17. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  18. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  20. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +6 -3
  21. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  22. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +3 -3
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +112 -5
  25. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +9 -0
  28. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js.map +1 -0
  29. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js +24 -0
  30. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -0
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js +49 -0
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -0
  33. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  34. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +36 -18
  35. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  36. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +17 -38
  37. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  38. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  39. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue.js +1 -1
  42. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js +1 -1
  43. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  44. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  45. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js +1 -1
  46. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js +2 -0
  47. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js.map +1 -1
  48. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js +32 -29
  49. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js.map +1 -1
  50. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  51. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +53 -2
  52. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  53. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +119 -111
  54. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  55. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue.js +1 -1
  56. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +62 -1
  57. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  58. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  59. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue.js +1 -1
  60. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js +73 -4
  61. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js.map +1 -1
  62. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js +74 -27
  63. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js.map +1 -1
  64. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +208 -46
  65. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  66. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +121 -98
  67. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  68. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +1 -1
  69. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +24 -0
  70. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -1
  71. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +20 -4
  72. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -1
  73. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +25 -6
  74. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  75. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +112 -1
  76. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  77. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +100 -44
  78. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  79. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue.js +1 -1
  80. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js +67 -4
  81. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js.map +1 -1
  82. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js +1 -1
  83. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js.map +1 -1
  84. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue.js +9 -0
  85. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue.js.map +1 -0
  86. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue2.js +88 -0
  87. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue2.js.map +1 -0
  88. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue3.js +39 -0
  89. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue3.js.map +1 -0
  90. package/dist/esm/components/CnObjectCard/CnObjectCard.vue.js +1 -1
  91. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +295 -12
  92. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  93. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +267 -144
  94. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  95. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  96. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +4 -0
  97. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  98. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +3 -1
  99. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  100. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  101. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +93 -1
  102. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  103. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +322 -246
  104. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  105. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue.js +1 -1
  106. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +122 -7
  107. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  108. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js +189 -93
  109. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  110. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +1 -1
  111. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -1
  112. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +3 -3
  113. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -1
  114. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue.js +1 -1
  115. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  116. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +16 -4
  117. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  118. package/dist/esm/components/CnTabs/CnTabs.vue.js +1 -1
  119. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  120. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  121. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  122. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +42 -0
  123. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  124. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +38 -19
  125. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  126. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js +9 -0
  127. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js.map +1 -0
  128. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js +258 -0
  129. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js.map +1 -0
  130. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js +69 -0
  131. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js.map +1 -0
  132. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
  133. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +11 -0
  134. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
  135. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +4 -4
  136. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
  137. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +16 -14
  138. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  139. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  140. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  141. package/dist/esm/index.js +2 -0
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/l10n/en.json.js +24 -1
  144. package/dist/esm/l10n/en.json.js.map +1 -1
  145. package/dist/esm/l10n/nl.json.js +24 -1
  146. package/dist/esm/l10n/nl.json.js.map +1 -1
  147. package/dist/esm/library-style.js +1 -1
  148. package/dist/esm/nextcloud-vue.css +1369 -748
  149. package/dist/esm/utils/dueText.js +18 -3
  150. package/dist/esm/utils/dueText.js.map +1 -1
  151. package/dist/esm/utils/libraryWidgetKeys.js +2 -0
  152. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  153. package/dist/esm/utils/nextcloudApps.js +45 -0
  154. package/dist/esm/utils/nextcloudApps.js.map +1 -0
  155. package/dist/esm/utils/scopeListLayout.js +9 -2
  156. package/dist/esm/utils/scopeListLayout.js.map +1 -1
  157. package/dist/esm/utils/sortOrder.js +11 -1
  158. package/dist/esm/utils/sortOrder.js.map +1 -1
  159. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  160. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  161. package/dist/esm/utils/visibleWhen.js +12 -4
  162. package/dist/esm/utils/visibleWhen.js.map +1 -1
  163. package/dist/nextcloud-vue.cjs.js +8965 -6497
  164. package/dist/nextcloud-vue.cjs.js.map +2 -2
  165. package/dist/nextcloud-vue.css +1369 -748
  166. package/l10n/en.json +24 -1
  167. package/l10n/nl.json +24 -1
  168. package/package.json +1 -1
  169. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -1
  170. package/src/components/CnCardGrid/CnCardGrid.md +2 -0
  171. package/src/components/CnCardGrid/CnCardGrid.vue +20 -0
  172. package/src/components/CnCellRenderer/CnCellRenderer.vue +19 -1
  173. package/src/components/CnChartWidget/CnChartWidget.md +2 -0
  174. package/src/components/CnChartWidget/CnChartWidget.vue +93 -1
  175. package/src/components/CnDashboardPage/CnDashboardPage.vue +9 -6
  176. package/src/components/CnDetailPage/CnDetailPage.md +3 -2
  177. package/src/components/CnDetailPage/CnDetailPage.vue +112 -5
  178. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +60 -0
  179. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +36 -29
  180. package/src/components/CnFactsWidget/CnFactsWidget.vue +4 -0
  181. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -1
  182. package/src/components/CnFeaturesBoard/CnFeaturesBoard.vue +4 -1
  183. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +70 -4
  184. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +62 -1
  185. package/src/components/CnFlowsPage/CnFlowBoard.vue +132 -8
  186. package/src/components/CnIndexPage/CnIndexPage.md +8 -5
  187. package/src/components/CnIndexPage/CnIndexPage.vue +236 -54
  188. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +36 -1
  189. package/src/components/CnIndexPage/useSelfFetchList.js +25 -6
  190. package/src/components/CnIndexSidebar/CnIndexSidebar.md +2 -0
  191. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +148 -1
  192. package/src/components/CnNcWidgetWidget/CnNcWidgetWidget.vue +68 -5
  193. package/src/components/CnNoticeWidget/CnNoticeWidget.vue +153 -0
  194. package/src/components/CnNoticeWidget/index.js +12 -0
  195. package/src/components/CnObjectCard/CnObjectCard.md +1 -0
  196. package/src/components/CnObjectCard/CnObjectCard.vue +354 -13
  197. package/src/components/CnObjectSidebar/CnFilesTab.vue +6 -0
  198. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +190 -4
  199. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +209 -9
  200. package/src/components/CnSettingsField/CnSettingsField.vue +4 -1
  201. package/src/components/CnSetupWizard/CnSetupWizard.vue +9 -1
  202. package/src/components/CnTabs/CnTabs.vue +11 -0
  203. package/src/components/CnTabsWidget/CnTabsWidget.vue +91 -18
  204. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.md +11 -0
  205. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue +382 -0
  206. package/src/components/CnTeamWorkloadWidget/index.js +14 -0
  207. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +15 -4
  208. package/src/components/CnWidgetGrid/builtInWidgets.js +2 -0
  209. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  210. package/src/components/index.js +2 -0
  211. package/src/css/dialog.css +20 -2
  212. package/src/css/index-page.css +14 -2
  213. package/src/css/look-board-detail.css +125 -8
  214. package/src/css/look-board-index.css +100 -4
  215. package/src/css/look-board.css +122 -14
  216. package/src/index.js +2 -1
  217. package/src/schemas/app-manifest-v2.schema.json +110 -8
  218. package/src/utils/dueText.js +18 -3
  219. package/src/utils/libraryWidgetKeys.js +2 -0
  220. package/src/utils/nextcloudApps.js +50 -0
  221. package/src/utils/scopeListLayout.js +9 -2
  222. package/src/utils/sortOrder.js +10 -0
  223. package/src/utils/validateManifestV2.compiled.js +3 -3
  224. package/src/utils/visibleWhen.js +12 -4
@@ -11,6 +11,7 @@ import __sfc_main$3 from '../CnResourceSelect/CnResourceSelect.vue.js';
11
11
  import { useFlowStore, FLOW_RUN_ACTIVE_STATUSES } from '../../composables/useFlowStore.js';
12
12
  import { formatRelativeDate } from '../../utils/boardDate.js';
13
13
  import { formatFlowDuration, flowRunDurationMs, flowRunName, flowRunLogLines, flowOutcomeLevels } from '../../utils/flowRunLog.js';
14
+ import { appDisplayNames } from '../../utils/nextcloudApps.js';
14
15
  import __sfc_main$7 from '../CnStatusBadge/CnStatusBadge.vue.js';
15
16
 
16
17
  /**
@@ -57,7 +58,7 @@ var script = {
57
58
  },
58
59
 
59
60
  data() {
60
- return { runTab: 'step', testOpen: false, testRecord: null }
61
+ return { runTab: 'step', testOpen: false, testRecord: null, appNames: {}, showRuns: false }
61
62
  },
62
63
 
63
64
  computed: {
@@ -193,17 +194,25 @@ var script = {
193
194
  return { tone: 'success', text: this.t('nextcloud-vue', 'The flow is valid.') }
194
195
  },
195
196
 
196
- /** @return {Array<object>} The palette grouped by owning app. */
197
+ /**
198
+ * The palette grouped by owning app, each group named by the app's
199
+ * display name (its id when Nextcloud names none), the app that owns
200
+ * this flow first.
201
+ *
202
+ * @return {Array<{app: string, name: string, entries: Array<object>}>} The groups.
203
+ */
197
204
  paletteGroups() {
198
205
  const groups = {}
199
206
  ;(this.store.nodeCatalog || []).forEach((entry) => {
200
207
  const app = String(entry?.app || String(entry?.id || '').split('.')[0] || '');
201
208
  if (!groups[app]) {
202
- groups[app] = { app, entries: [] };
209
+ groups[app] = { app, name: this.appNames[app] || app, entries: [] };
203
210
  }
204
211
  groups[app].entries.push(entry);
205
212
  });
206
- return Object.values(groups)
213
+ const list = Object.values(groups);
214
+ const host = list.findIndex((group) => group.app === this.app);
215
+ return host > 0 ? [list[host], ...list.slice(0, host), ...list.slice(host + 1)] : list
207
216
  },
208
217
 
209
218
  /** @return {object|null} The run on screen. */
@@ -256,6 +265,37 @@ var script = {
256
265
  return entry ? (entry.displayName || entry.id) : String(node?.type || '')
257
266
  },
258
267
 
268
+ /**
269
+ * The selected step's settings as its owner declares them in the
270
+ * catalogue's `configForm`: label and value, a select's option label,
271
+ * Yes or No for a switch. Unset settings are left out.
272
+ *
273
+ * @return {Array<{key: string, label: string, value: string}>} The settings.
274
+ */
275
+ stepSettings() {
276
+ const node = this.store.selectedNode;
277
+ const entry = node ? this.store.catalogEntry(node.type) : null;
278
+ const config = (node && node.config) || {};
279
+ const form = (entry && Array.isArray(entry.configForm)) ? entry.configForm : [];
280
+ return form
281
+ .filter((field) => field && field.key && config[field.key] !== undefined && config[field.key] !== null && config[field.key] !== '')
282
+ .map((field) => {
283
+ const raw = config[field.key];
284
+ const option = Array.isArray(field.options) ? field.options.find((o) => o && o.value === raw) : null;
285
+ let value;
286
+ if (option) {
287
+ value = String(option.label ?? option.value);
288
+ } else if (typeof raw === 'boolean') {
289
+ value = raw ? this.t('nextcloud-vue', 'Yes') : this.t('nextcloud-vue', 'No');
290
+ } else if (typeof raw === 'object') {
291
+ value = JSON.stringify(raw);
292
+ } else {
293
+ value = String(raw);
294
+ }
295
+ return { key: field.key, label: field.label || field.key, value }
296
+ })
297
+ },
298
+
259
299
  /** @return {string} The selected step's name. */
260
300
  stepName() {
261
301
  const node = this.store.selectedNode;
@@ -286,7 +326,36 @@ var script = {
286
326
  },
287
327
  },
288
328
 
329
+ watch: {
330
+ // A selected step takes the panel back from the run history.
331
+ 'store.selectedNodeId': function(id) {
332
+ if (id) {
333
+ this.showRuns = false;
334
+ }
335
+ },
336
+ },
337
+
338
+ async created() {
339
+ // The palette names its groups by app display name; only the column
340
+ // palette draws them, so only it reads the names.
341
+ if (this.palette !== 'column') {
342
+ return
343
+ }
344
+ const { default: axios } = await import('@nextcloud/axios');
345
+ this.appNames = await appDisplayNames(axios);
346
+ },
347
+
289
348
  methods: {
349
+ /**
350
+ * Run the flow, with the run history in the panel to follow it.
351
+ *
352
+ * @return {void}
353
+ */
354
+ onRun() {
355
+ this.showRuns = true;
356
+ this.$emit('run');
357
+ },
358
+
290
359
  /**
291
360
  * Run the saved flow once with the picked record as its subject, then
292
361
  * close the dialog; the run shows on the canvas as any run does.
@@ -1 +1 @@
1
- {"version":3,"file":"CnFlowBoard.vue2.js","sources":["../../../../src/components/CnFlowsPage/CnFlowBoard.vue"],"sourcesContent":["<!--\n CnFlowBoard — the flow editor in the board look: a page header with the\n flow's name, path and actions, then the canvas in a card beside an\n inspector card. Optionally a palette card on the left (`palette: column`).\n The same page shows one run when the route carries `?run=`: the canvas\n paints each step's outcome and the inspector holds the run's card and logs.\n\n The canvas itself is CnFlowDetail; this component only lays it out and adds\n what the board draws around it.\n\n SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-flow-board\" :class=\"{ 'cn-flow-board--with-palette': showPalette }\" data-testid=\"flow-board\">\n\t\t<header class=\"cn-flow-board__header\">\n\t\t\t<div class=\"cn-flow-board__heading\">\n\t\t\t\t<h2 class=\"cn-flow-board__title\" data-testid=\"flow-board-title\">\n\t\t\t\t\t{{ titleText }}\n\t\t\t\t</h2>\n\t\t\t\t<CnStatusBadge v-if=\"pillText\" :label=\"pillText\" variant=\"default\" />\n\t\t\t</div>\n\t\t\t<div v-if=\"!store.inRunView\" class=\"cn-flow-board__actions\">\n\t\t\t\t<NcCheckboxRadioSwitch v-if=\"store.flow.id\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:modelValue=\"store.flow.enabled !== false\"\n\t\t\t\t\tdata-testid=\"flow-board-enabled\"\n\t\t\t\t\t@update:modelValue=\"onEnabledChange\">\n\t\t\t\t\t{{ store.flow.enabled !== false ? t('nextcloud-vue', 'Active') : t('nextcloud-vue', 'Paused') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<NcButton :disabled=\"store.checking || !store.nodes.length\"\n\t\t\t\t\tdata-testid=\"flow-board-check\"\n\t\t\t\t\t@click=\"store.check()\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Check') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-if=\"showRun\"\n\t\t\t\t\t:disabled=\"store.running || !store.flow.id\"\n\t\t\t\t\tdata-testid=\"flow-board-run\"\n\t\t\t\t\t@click=\"$emit('run')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Run') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-if=\"testSubjectReady\"\n\t\t\t\t\t:disabled=\"store.running || !store.flow.id\"\n\t\t\t\t\tdata-testid=\"flow-board-test\"\n\t\t\t\t\t@click=\"testOpen = true\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TestTube :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ testLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<CnBuildiqEditButton />\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"store.saving || !store.flow.name || store.graphLocked\"\n\t\t\t\t\tdata-testid=\"flow-board-save\"\n\t\t\t\t\t@click=\"$emit('save')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Save') }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<CnDialog v-if=\"testOpen\"\n\t\t\t:name=\"testLabel\"\n\t\t\tdata-testid=\"flow-board-test-dialog\"\n\t\t\t@closing=\"testOpen = false\">\n\t\t\t<p class=\"cn-flow-board__test-intro\">\n\t\t\t\t{{ t('nextcloud-vue', 'The saved flow runs once with the record you pick as its subject.') }}\n\t\t\t</p>\n\t\t\t<CnResourceSelect v-model=\"testRecord\"\n\t\t\t\t:register=\"testSubject.register\"\n\t\t\t\t:schema=\"testSubject.schema\"\n\t\t\t\t:labelField=\"testSubject.labelField || 'title'\"\n\t\t\t\t:inputLabel=\"t('nextcloud-vue', 'Record')\"\n\t\t\t\tdata-testid=\"flow-board-test-record\" />\n\t\t\t<template #actions>\n\t\t\t\t<NcButton data-testid=\"flow-board-test-cancel\" @click=\"testOpen = false\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"!testRecord || store.running\"\n\t\t\t\t\tdata-testid=\"flow-board-test-run\"\n\t\t\t\t\t@click=\"runTest\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Run test') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</CnDialog>\n\n\t\t<p class=\"cn-flow-board__path\" data-testid=\"flow-board-path\">\n\t\t\t<a :href=\"listHref\" class=\"cn-flow-board__crumb\" @click=\"onCrumbClick($event, detailRoute)\">{{ listText }}</a>\n\t\t\t<span aria-hidden=\"true\"> / </span>\n\t\t\t<template v-if=\"store.inRunView\">\n\t\t\t\t<a :href=\"flowHref\" class=\"cn-flow-board__crumb\" @click=\"onCrumbClick($event, flowPath)\">{{ flowName }}</a>\n\t\t\t\t<span aria-hidden=\"true\"> / </span>\n\t\t\t\t<span>{{ runCrumb }}</span>\n\t\t\t</template>\n\t\t\t<span v-else>{{ flowName }}</span>\n\t\t\t<span v-if=\"metaText\" class=\"cn-flow-board__meta\"> · {{ metaText }}</span>\n\t\t</p>\n\n\t\t<NcNoteCard v-if=\"notice && !store.inRunView\" type=\"info\" class=\"cn-flow-board__notice\">\n\t\t\t{{ notice }}\n\t\t</NcNoteCard>\n\n\t\t<div class=\"cn-flow-board__body\">\n\t\t\t<aside v-if=\"showPalette\" class=\"cn-flow-board__card cn-flow-board__palette\" data-testid=\"flow-board-palette\">\n\t\t\t\t<h3 class=\"cn-flow-board__card-title\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Steps') }}\n\t\t\t\t</h3>\n\t\t\t\t<section v-for=\"group in paletteGroups\"\n\t\t\t\t\t:key=\"group.app\"\n\t\t\t\t\tclass=\"cn-flow-board__palette-group\">\n\t\t\t\t\t<h4 class=\"cn-flow-board__palette-app\">\n\t\t\t\t\t\t{{ group.app }}\n\t\t\t\t\t</h4>\n\t\t\t\t\t<ul class=\"cn-flow-board__palette-list\">\n\t\t\t\t\t\t<li v-for=\"entry in group.entries\" :key=\"entry.id\">\n\t\t\t\t\t\t\t<button type=\"button\"\n\t\t\t\t\t\t\t\tclass=\"cn-flow-board__palette-step\"\n\t\t\t\t\t\t\t\t:disabled=\"store.graphLocked\"\n\t\t\t\t\t\t\t\t:data-testid=\"`flow-board-palette-${entry.id}`\"\n\t\t\t\t\t\t\t\t@click=\"store.addNode(entry.id)\">\n\t\t\t\t\t\t\t\t{{ entry.displayName || entry.label || entry.id }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</section>\n\t\t\t\t<p v-if=\"paletteFootnote\" class=\"cn-flow-board__palette-note\">\n\t\t\t\t\t{{ paletteFootnote }}\n\t\t\t\t</p>\n\t\t\t</aside>\n\n\t\t\t<section class=\"cn-flow-board__card cn-flow-board__canvas\" :aria-label=\"t('nextcloud-vue', 'Flow canvas')\">\n\t\t\t\t<CnFlowDetail :id=\"id\"\n\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t:run=\"run\"\n\t\t\t\t\t:toolbarActions=\"false\"\n\t\t\t\t\t:addStep=\"!showPalette\"\n\t\t\t\t\t@save=\"$emit('save')\"\n\t\t\t\t\t@run=\"$emit('run')\" />\n\t\t\t\t<div v-if=\"store.inRunView\"\n\t\t\t\t\tclass=\"cn-flow-board__legend\"\n\t\t\t\t\tdata-testid=\"flow-board-legend\">\n\t\t\t\t\t<span v-for=\"level in legend\" :key=\"level.id\" class=\"cn-flow-board__legend-item\">\n\t\t\t\t\t\t<CnStatusBadge :label=\"level.label\" :variant=\"level.variant\" size=\"small\" />\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<p v-else\n\t\t\t\t\tclass=\"cn-flow-board__validity\"\n\t\t\t\t\t:class=\"`cn-flow-board__validity--${validity.tone}`\"\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\tdata-testid=\"flow-board-validity\">\n\t\t\t\t\t{{ validity.text }}\n\t\t\t\t</p>\n\t\t\t</section>\n\n\t\t\t<aside class=\"cn-flow-board__card cn-flow-board__inspector\" data-testid=\"flow-board-inspector\">\n\t\t\t\t<template v-if=\"store.inRunView\">\n\t\t\t\t\t<CnFlowRunSummary :run=\"runRecord\"\n\t\t\t\t\t\t:stepsTotal=\"store.nodes.length\"\n\t\t\t\t\t\t:canRetry=\"canRetry\"\n\t\t\t\t\t\t@back=\"onBackToFlow\"\n\t\t\t\t\t\t@retry=\"onRetry\" />\n\t\t\t\t\t<div class=\"cn-flow-board__tabs\" role=\"tablist\">\n\t\t\t\t\t\t<button v-for=\"tab in runTabs\"\n\t\t\t\t\t\t\t:key=\"tab.id\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\tclass=\"cn-flow-board__tab\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-flow-board__tab--active': runTab === tab.id }\"\n\t\t\t\t\t\t\t:aria-selected=\"runTab === tab.id ? 'true' : 'false'\"\n\t\t\t\t\t\t\t:data-testid=\"`flow-board-run-tab-${tab.id}`\"\n\t\t\t\t\t\t\t@click=\"runTab = tab.id\">\n\t\t\t\t\t\t\t{{ tab.label }}\n\t\t\t\t\t\t\t<span class=\"cn-flow-board__tab-count\">{{ tab.count }}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CnFlowStepLog :lines=\"runTab === 'step' ? selectedRunLines : allRunLines\"\n\t\t\t\t\t\t:emptyText=\"runTab === 'step' && !store.selectedNodeId ? t('nextcloud-vue', 'Select a step on the canvas to see what it did.') : ''\" />\n\t\t\t\t</template>\n\t\t\t\t<template v-else-if=\"store.selectedNode\">\n\t\t\t\t\t<p class=\"cn-flow-board__eyebrow\">\n\t\t\t\t\t\t{{ stepTypeLabel }}\n\t\t\t\t\t</p>\n\t\t\t\t\t<h3 class=\"cn-flow-board__card-title\" data-testid=\"flow-board-step-name\">\n\t\t\t\t\t\t{{ stepName }}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<div class=\"cn-flow-board__step-actions\">\n\t\t\t\t\t\t<NcButton data-testid=\"flow-board-edit-step\" @click=\"store.editingNodeId = store.selectedNodeId\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Edit step') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t<NcButton v-if=\"lastRunUuid\"\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tdata-testid=\"flow-board-open-last-run\"\n\t\t\t\t\t\t\t@click=\"openRun(lastRunUuid)\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Open the last run on the canvas') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h4 class=\"cn-flow-board__subtitle\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Recent log lines of this step') }}\n\t\t\t\t\t</h4>\n\t\t\t\t\t<CnFlowStepLog :lines=\"recentStepLines\"\n\t\t\t\t\t\twithDay\n\t\t\t\t\t\t:emptyText=\"t('nextcloud-vue', 'This step has not run yet.')\" />\n\t\t\t\t\t<div class=\"cn-flow-board__step-footer\">\n\t\t\t\t\t\t<NcButton variant=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"store.graphLocked\"\n\t\t\t\t\t\t\tdata-testid=\"flow-board-delete-step\"\n\t\t\t\t\t\t\t@click=\"store.removeNode(store.selectedNodeId)\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Delete step') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t<NcButton data-testid=\"flow-board-done\" @click=\"store.selectedNodeId = null\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Done') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<CnFlowSidebar v-else embedded />\n\t\t\t</aside>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcNoteCard } from '@nextcloud/vue'\nimport TestTube from 'vue-material-design-icons/TestTube.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport CnDialog from '../CnDialog/CnDialog.vue'\nimport CnFlowDetail from '../CnFlowDetail/CnFlowDetail.vue'\nimport CnFlowRunSummary from '../CnFlowDetail/CnFlowRunSummary.vue'\nimport CnFlowSidebar from '../CnFlowDetail/CnFlowSidebar.vue'\nimport CnFlowStepLog from '../CnFlowDetail/CnFlowStepLog.vue'\nimport CnResourceSelect from '../CnResourceSelect/CnResourceSelect.vue'\nimport { FLOW_RUN_ACTIVE_STATUSES, useFlowStore } from '../../composables/useFlowStore.js'\nimport { formatRelativeDate } from '../../utils/boardDate.js'\nimport { flowOutcomeLevels, flowRunDurationMs, flowRunLogLines, flowRunName, formatFlowDuration } from '../../utils/flowRunLog.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\n\n/**\n * The board-look flow editor and run view. CnFlowEditorPage renders it when\n * the app or page is in the board look; the Nextcloud look keeps the canvas\n * on its own with the app sidebar.\n */\nexport default {\n\tname: 'CnFlowBoard',\n\n\tcomponents: { CnBuildiqEditButton, CnDialog, CnFlowDetail, CnResourceSelect, TestTube, CnFlowRunSummary, CnFlowSidebar, CnFlowStepLog, CnStatusBadge, NcButton, NcCheckboxRadioSwitch, NcNoteCard },\n\n\tprops: {\n\t\t/** The flow uuid, or `new`. */\n\t\tid: { type: String, default: '' },\n\t\t/** The owning app, for a new flow and the list scope. */\n\t\tapp: { type: String, default: null },\n\t\t/** The run to show, or ''. */\n\t\trun: { type: String, default: '' },\n\t\t/** Where the flow list lives; flows open at `<detailRoute>/<id>`. */\n\t\tdetailRoute: { type: String, default: '/flows' },\n\t\t/** The list's name in the path (\"Flows\", \"Settings / Flows\"). */\n\t\tlistLabel: { type: String, default: '' },\n\t\t/** `column` draws the step palette as a card on the left. */\n\t\tpalette: { type: String, default: 'picker' },\n\t\t/** Free text under the path in the palette card. */\n\t\tpaletteFootnote: { type: String, default: '' },\n\t\t/** An info notice under the path. */\n\t\tnotice: { type: String, default: '' },\n\t\t/** The pill beside the title (\"Case type flow\"). */\n\t\tpill: { type: String, default: '' },\n\t\t/**\n\t\t * The records a test run can take as its subject: `{ register, schema,\n\t\t * labelField?, label? }`. Draws a header button (\"Testen met een zaak\",\n\t\t * DqFlow) that runs the saved flow once with a picked record.\n\t\t */\n\t\ttestSubject: { type: Object, default: null },\n\t},\n\n\temits: ['save', 'run', 'retried'],\n\n\tsetup() {\n\t\treturn { store: useFlowStore() }\n\t},\n\n\tdata() {\n\t\treturn { runTab: 'step', testOpen: false, testRecord: null }\n\t},\n\n\tcomputed: {\n\t\t/** @return {boolean} Whether a test subject is declared well enough to pick one. */\n\t\ttestSubjectReady() {\n\t\t\treturn Boolean(this.testSubject && this.testSubject.register && this.testSubject.schema)\n\t\t},\n\n\t\t/** @return {string} The test button's label: the page's own, else the library's. */\n\t\ttestLabel() {\n\t\t\treturn (this.testSubject && this.testSubject.label) || t('nextcloud-vue', 'Test with a record')\n\t\t},\n\n\t\t/** @return {boolean} Whether the palette card is drawn. */\n\t\tshowPalette() {\n\t\t\treturn this.palette === 'column' && !this.store.inRunView\n\t\t},\n\n\t\t/** @return {string} The page title. */\n\t\ttitleText() {\n\t\t\treturn this.store.flow.name || this.t('nextcloud-vue', 'New flow')\n\t\t},\n\n\t\t/** @return {string} The flow's name in the path. */\n\t\tflowName() {\n\t\t\treturn this.store.flow.name || this.t('nextcloud-vue', 'New flow')\n\t\t},\n\n\t\t/** @return {string} The pill text: the page's, else the lifecycle. */\n\t\tpillText() {\n\t\t\tif (this.pill) {\n\t\t\t\treturn this.pill\n\t\t\t}\n\t\t\tconst lifecycle = String(this.store.flow.lifecycleStatus || '')\n\t\t\tif (lifecycle === 'draft') {\n\t\t\t\treturn this.t('nextcloud-vue', 'Draft')\n\t\t\t}\n\t\t\tif (lifecycle === 'deprecated') {\n\t\t\t\treturn this.t('nextcloud-vue', 'Retired')\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\t/** @return {string} The list label. */\n\t\tlistText() {\n\t\t\treturn this.listLabel || this.t('nextcloud-vue', 'Flows')\n\t\t},\n\n\t\t/** @return {string} The flow's own path. */\n\t\tflowPath() {\n\t\t\treturn `${this.detailRoute}/${this.store.flow.id || this.id}`\n\t\t},\n\n\t\t/** @return {string} The list href. */\n\t\tlistHref() {\n\t\t\treturn this.hrefOf(this.detailRoute)\n\t\t},\n\n\t\t/** @return {string} The flow href. */\n\t\tflowHref() {\n\t\t\treturn this.hrefOf(this.flowPath)\n\t\t},\n\n\t\t/**\n\t\t * What the path says after the name: the trigger, the step count and\n\t\t * the version in the editor; when the run started and how long it\n\t\t * took in the run view.\n\t\t *\n\t\t * @return {string} The meta text.\n\t\t */\n\t\tmetaText() {\n\t\t\tif (this.store.inRunView) {\n\t\t\t\tconst record = this.runRecord\n\t\t\t\tif (!record) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\t\t\t\tconst parts = [formatRelativeDate(record.created, { withTime: true })]\n\t\t\t\tconst duration = formatFlowDuration(flowRunDurationMs(record))\n\t\t\t\tif (duration) {\n\t\t\t\t\tparts.push(this.t('nextcloud-vue', 'done in {duration}', { duration }))\n\t\t\t\t}\n\t\t\t\treturn parts.filter(Boolean).join(' · ')\n\t\t\t}\n\t\t\tconst parts = []\n\t\t\tconst trigger = this.triggerText\n\t\t\tif (trigger) {\n\t\t\t\tparts.push(this.t('nextcloud-vue', 'trigger {trigger}', { trigger }))\n\t\t\t}\n\t\t\tconst count = this.store.nodes.length\n\t\t\tparts.push(count === 1 ? this.t('nextcloud-vue', '1 step') : this.t('nextcloud-vue', '{count} steps', { count }))\n\t\t\tif (this.store.flow.version) {\n\t\t\t\tparts.push(this.t('nextcloud-vue', 'version {version}', { version: this.store.flow.version }))\n\t\t\t}\n\t\t\treturn parts.join(' · ')\n\t\t},\n\n\t\t/** @return {string} How the flow starts, as the catalogue names it. */\n\t\ttriggerText() {\n\t\t\tconst trigger = String(this.store.flow.trigger || '')\n\t\t\tif (trigger === 'schedule') {\n\t\t\t\treturn this.t('nextcloud-vue', 'On a schedule')\n\t\t\t}\n\t\t\tif (trigger === '' || trigger === 'manual') {\n\t\t\t\treturn this.t('nextcloud-vue', 'Run by hand')\n\t\t\t}\n\t\t\tconst entry = (this.store.eventCatalog || []).find((item) => item && item.id === trigger)\n\t\t\treturn (entry && entry.label) || trigger\n\t\t},\n\n\t\t/** @return {boolean} Whether Run is offered. */\n\t\tshowRun() {\n\t\t\treturn this.store.nodes.some((node) => node?.type === 'openregister.trigger-manual')\n\t\t},\n\n\t\t/**\n\t\t * The engine's verdict on the canvas as one line under it.\n\t\t *\n\t\t * @return {{tone: string, text: string}} The validity bar.\n\t\t */\n\t\tvalidity() {\n\t\t\tconst result = this.store.checkResult\n\t\t\tif (!result) {\n\t\t\t\treturn { tone: 'unknown', text: this.t('nextcloud-vue', 'Not checked yet. Check runs the flow past the engine without saving it.') }\n\t\t\t}\n\t\t\tconst blocking = Array.isArray(result.blocking) ? result.blocking.length : 0\n\t\t\tconst warnings = Array.isArray(result.warnings) ? result.warnings.length : 0\n\t\t\tif (result.valid === false || blocking > 0) {\n\t\t\t\treturn { tone: 'error', text: result.message || this.t('nextcloud-vue', 'The flow cannot run as it is. See the messages on the canvas.') }\n\t\t\t}\n\t\t\tif (warnings > 0) {\n\t\t\t\treturn { tone: 'warning', text: this.t('nextcloud-vue', 'The flow is valid, with {count} warnings.', { count: warnings }) }\n\t\t\t}\n\t\t\treturn { tone: 'success', text: this.t('nextcloud-vue', 'The flow is valid.') }\n\t\t},\n\n\t\t/** @return {Array<object>} The palette grouped by owning app. */\n\t\tpaletteGroups() {\n\t\t\tconst groups = {}\n\t\t\t;(this.store.nodeCatalog || []).forEach((entry) => {\n\t\t\t\tconst app = String(entry?.app || String(entry?.id || '').split('.')[0] || '')\n\t\t\t\tif (!groups[app]) {\n\t\t\t\t\tgroups[app] = { app, entries: [] }\n\t\t\t\t}\n\t\t\t\tgroups[app].entries.push(entry)\n\t\t\t})\n\t\t\treturn Object.values(groups)\n\t\t},\n\n\t\t/** @return {object|null} The run on screen. */\n\t\trunRecord() {\n\t\t\treturn this.store.runDetail\n\t\t\t\t|| (this.store.runs || []).find((item) => item.uuid === this.store.inspectedRunUuid)\n\t\t\t\t|| null\n\t\t},\n\n\t\t/** @return {string} The run's place in the path. */\n\t\trunCrumb() {\n\t\t\treturn this.t('nextcloud-vue', 'Run {id}', { id: flowRunName(this.runRecord) })\n\t\t},\n\n\t\t/** @return {boolean} Whether Run again is offered. */\n\t\tcanRetry() {\n\t\t\treturn !!this.runRecord && !FLOW_RUN_ACTIVE_STATUSES.includes(this.runRecord.status)\n\t\t},\n\n\t\t/** @return {Array<object>} Every line of the run on screen. */\n\t\tallRunLines() {\n\t\t\treturn this.runRecord ? flowRunLogLines(this.runRecord) : []\n\t\t},\n\n\t\t/** @return {Array<object>} The selected step's lines in this run. */\n\t\tselectedRunLines() {\n\t\t\treturn this.runRecord && this.store.selectedNodeId\n\t\t\t\t? flowRunLogLines(this.runRecord, this.store.selectedNodeId)\n\t\t\t\t: []\n\t\t},\n\n\t\t/** @return {Array<object>} The two log tabs with their counts. */\n\t\trunTabs() {\n\t\t\treturn [\n\t\t\t\t{ id: 'step', label: this.t('nextcloud-vue', 'This step'), count: this.selectedRunLines.length },\n\t\t\t\t{ id: 'run', label: this.t('nextcloud-vue', 'Logs of the whole run'), count: this.allRunLines.length },\n\t\t\t]\n\t\t},\n\n\t\t/** @return {Array<object>} The legend of outcomes on the canvas. */\n\t\tlegend() {\n\t\t\tconst levels = flowOutcomeLevels()\n\t\t\treturn ['success', 'warning', 'error', 'info', 'skipped'].map((id) => ({ id, ...levels[id] }))\n\t\t},\n\n\t\t/** @return {string} The selected step's type, as the catalogue names it. */\n\t\tstepTypeLabel() {\n\t\t\tconst node = this.store.selectedNode\n\t\t\tconst entry = node ? this.store.catalogEntry(node.type) : null\n\t\t\treturn entry ? (entry.displayName || entry.id) : String(node?.type || '')\n\t\t},\n\n\t\t/** @return {string} The selected step's name. */\n\t\tstepName() {\n\t\t\tconst node = this.store.selectedNode\n\t\t\treturn (node && (node.name || node.label)) || this.stepTypeLabel\n\t\t},\n\n\t\t/**\n\t\t * The selected step's lines from the flow's recent runs, newest run\n\t\t * first, at most ten.\n\t\t *\n\t\t * @return {Array<object>} The lines.\n\t\t */\n\t\trecentStepLines() {\n\t\t\tconst id = this.store.selectedNodeId\n\t\t\tif (!id) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst lines = []\n\t\t\t;(this.store.runs || []).forEach((item) => {\n\t\t\t\tflowRunLogLines(item, id).forEach((line) => lines.push({ ...line, key: `${item.uuid}-${line.key}` }))\n\t\t\t})\n\t\t\treturn lines.slice(0, 10)\n\t\t},\n\n\t\t/** @return {string} The newest run's uuid, or ''. */\n\t\tlastRunUuid() {\n\t\t\treturn (this.store.runs && this.store.runs[0] && this.store.runs[0].uuid) || ''\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Run the saved flow once with the picked record as its subject, then\n\t\t * close the dialog; the run shows on the canvas as any run does.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync runTest() {\n\t\t\tconst uuid = Array.isArray(this.testRecord) ? this.testRecord[0] : this.testRecord\n\t\t\tif (!uuid) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tawait this.store.run({ uuid, register: this.testSubject.register, schema: this.testSubject.schema })\n\t\t\tthis.testOpen = false\n\t\t\tthis.testRecord = null\n\t\t},\n\n\t\tt,\n\n\t\t/**\n\t\t * @param {string} path An app route path.\n\t\t * @return {string} Its href.\n\t\t */\n\t\threfOf(path) {\n\t\t\tif (this.$router && typeof this.$router.resolve === 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = this.$router.resolve(path)\n\t\t\t\t\tif (resolved && resolved.href) {\n\t\t\t\t\t\treturn resolved.href\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// A path the router does not know stays a plain path.\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn path\n\t\t},\n\n\t\t/**\n\t\t * Follow a path link on the app's router; a modified click keeps the\n\t\t * browser's own behaviour.\n\t\t *\n\t\t * @param {MouseEvent} event The click.\n\t\t * @param {string} path The target path.\n\t\t * @return {void}\n\t\t */\n\t\tonCrumbClick(event, path) {\n\t\t\tif (!this.$router || event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.$router.push(path).catch(() => {})\n\t\t},\n\n\t\t/**\n\t\t * Switch the flow on or off. The change is saved with the flow.\n\t\t *\n\t\t * @param {boolean} on The new state.\n\t\t * @return {void}\n\t\t */\n\t\tonEnabledChange(on) {\n\t\t\tthis.store.flow.enabled = on === true\n\t\t\tthis.store.dirty = true\n\t\t},\n\n\t\t/**\n\t\t * Open a run of this flow on the canvas.\n\t\t *\n\t\t * @param {string} uuid The run.\n\t\t * @return {void}\n\t\t */\n\t\topenRun(uuid) {\n\t\t\tif (this.$router) {\n\t\t\t\tthis.$router.push({ path: this.flowPath, query: { run: uuid } }).catch(() => {})\n\t\t\t} else {\n\t\t\t\tthis.store.inspectRun(uuid)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Leave the run view for the flow.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonBackToFlow() {\n\t\t\tthis.store.closeRun()\n\t\t\tif (this.$router) {\n\t\t\t\tthis.$router.push({ path: this.flowPath }).catch(() => {})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Start the shown run again and open the new one.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onRetry() {\n\t\t\tconst retried = await this.store.retryRun(this.runRecord?.uuid)\n\t\t\tthis.$emit('retried', retried)\n\t\t\tif (retried && retried.uuid) {\n\t\t\t\tthis.openRun(retried.uuid)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-flow-board {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 20px 24px;\n\tmin-height: 100%;\n\tbox-sizing: border-box;\n}\n\n.cn-flow-board__header {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n}\n\n.cn-flow-board__heading {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tmin-width: 0;\n}\n\n.cn-flow-board__title {\n\tmargin: 0;\n\tfont-size: 24px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-flow-board__test-intro {\n\tmargin: 0 0 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-flow-board__path {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-flow-board__crumb {\n\tcolor: var(--color-main-text);\n\ttext-decoration: underline;\n}\n\n.cn-flow-board__body {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1fr) 340px;\n\tgap: 16px;\n\tflex: 1 1 auto;\n\tmin-height: 520px;\n}\n\n.cn-flow-board--with-palette .cn-flow-board__body {\n\tgrid-template-columns: 240px minmax(0, 1fr) 340px;\n}\n\n.cn-flow-board__card {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tmin-width: 0;\n\tpadding: 16px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: 12px;\n\tbackground: var(--color-main-background);\n}\n\n.cn-flow-board__canvas {\n\tpadding: 0;\n\toverflow: hidden;\n\tbackground-color: var(--color-background-hover);\n\tbackground-image: radial-gradient(var(--color-border-dark) 1px, transparent 1px);\n\tbackground-size: 16px 16px;\n}\n\n.cn-flow-board__canvas > :first-child {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n}\n\n.cn-flow-board__card-title {\n\tmargin: 0;\n\tfont-size: 16px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__subtitle {\n\tmargin: 4px 0 0;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__eyebrow {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-flow-board__validity,\n.cn-flow-board__legend {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 10px 16px;\n\tborder-top: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n}\n\n.cn-flow-board__validity--success {\n\tcolor: var(--color-success-text);\n}\n\n.cn-flow-board__validity--warning {\n\tcolor: var(--color-warning-text);\n}\n\n.cn-flow-board__validity--error {\n\tcolor: var(--color-error-text);\n}\n\n.cn-flow-board__palette-group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-flow-board__palette-app {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__palette-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-flow-board__palette-step {\n\twidth: 100%;\n\tmin-height: 34px;\n\tpadding: 6px 10px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: 8px;\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-flow-board__palette-step:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-flow-board__palette-note {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-flow-board__tabs {\n\tdisplay: flex;\n\tgap: 4px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-flow-board__tab {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 8px 10px;\n\tmargin-bottom: -1px;\n\tborder: 1px solid transparent;\n\tborder-radius: 8px 8px 0 0;\n\tbackground: transparent;\n\tcolor: var(--color-main-text);\n\tcursor: pointer;\n}\n\n.cn-flow-board__tab--active {\n\tborder-color: var(--color-border);\n\tborder-bottom-color: var(--color-main-background);\n\tfont-weight: 600;\n}\n\n.cn-flow-board__tab-count {\n\tmin-width: 18px;\n\tpadding: 0 5px;\n\tborder-radius: 9px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 12px;\n\tline-height: 18px;\n\ttext-align: center;\n}\n\n.cn-flow-board__step-actions,\n.cn-flow-board__step-footer {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n}\n\n.cn-flow-board__step-footer {\n\tjustify-content: space-between;\n\tmargin-top: auto;\n}\n\n@media (max-width: 1024px) {\n\t.cn-flow-board__body,\n\t.cn-flow-board--with-palette .cn-flow-board__body {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n</style>\n"],"names":["CnBuildiqEditButton","CnDialog","CnFlowDetail","CnResourceSelect","CnFlowRunSummary","CnFlowSidebar","CnFlowStepLog","CnStatusBadge","t"],"mappings":";;;;;;;;;;;;;;;AA4OA;AACC;;;;AAID,aAAe;AACd,CAAA,IAAI,EAAE,aAAa;;AAEnB,CAAA,UAAU,EAAE,uBAAEA,UAAmB,YAAEC,YAAQ,gBAAEC,YAAY,oBAAEC,YAAgB,EAAE,QAAQ,oBAAEC,YAAgB,iBAAEC,YAAa,iBAAEC,YAAa,iBAAEC,YAAa,EAAE,QAAQ,EAAE,qBAAqB,EAAE,YAAY;;AAEnM,CAAA,KAAK,EAAE;;EAEN,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAC,EAAG;AACjC;AACA,EAAA,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAG,EAAG;;EAEpC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAC,EAAG;;AAElC,EAAA,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;;AAEhD,EAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;;AAExC,EAAA,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;AAC5C;AACA,EAAA,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;;AAE9C,EAAA,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;AACrC;EACA,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAC,EAAG;AACnC;;;;;AAKA,EAAA,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;EAC5C;;AAED,CAAA,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;;AAEjC,CAAA,KAAK,GAAG;EACP,OAAO,EAAE,KAAK,EAAE,YAAY,EAAG,EAAA;EAC/B;;AAED,CAAA,IAAI,GAAG;EACN,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAK,EAAA;EAC3D;;AAED,CAAA,QAAQ,EAAE;AACT;AACA,EAAA,gBAAgB,GAAG;AAClB,GAAA,OAAO,OAAO,CAAC,IAAI,CAAC,WAAU,IAAK,IAAI,CAAC,WAAW,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;GACvF;;AAED;EACA,SAAS,GAAG;AACX,GAAA,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,CAAC,KAAK,KAAKC,SAAC,CAAC,eAAe,EAAE,oBAAoB,CAAA;GAC9F;;;EAGD,WAAW,GAAG;GACb,OAAO,IAAI,CAAC,OAAM,KAAM,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAQ;GACxD;;AAED;EACA,SAAS,GAAG;GACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAG,IAAK,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,UAAU,CAAA;GACjE;;AAED;EACA,QAAQ,GAAG;GACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAG,IAAK,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,UAAU,CAAA;GACjE;;;EAGD,QAAQ,GAAG;GACV,IAAI,IAAI,CAAC,IAAI,EAAE;AACd,IAAA,OAAO,IAAI,CAAC,IAAG;AAChB,IAAA;GACA,MAAM,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAgB,IAAG,EAAE,EAAA;GAC9D,IAAI,cAAc,OAAO,EAAE;AAC1B,IAAA,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,OAAO,CAAA;AACvC,IAAA;GACA,IAAI,SAAQ,KAAM,YAAY,EAAE;AAC/B,IAAA,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,SAAS,CAAA;AACzC,IAAA;AACA,GAAA,OAAO,EAAC;GACR;;AAED;EACA,QAAQ,GAAG;GACV,OAAO,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,OAAO,CAAA;GACxD;;AAED;EACA,QAAQ,GAAG;GACV,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAG,IAAG,IAAI,CAAC,EAAE,CAAC,CAAA;GAC5D;;AAED;EACA,QAAQ,GAAG;AACV,GAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAA;GACnC;;AAED;EACA,QAAQ,GAAG;AACV,GAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAA;GAChC;;AAED;;;AAGC;AACA;;;EAGD,QAAQ,GAAG;GACV,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;IACzB,MAAM,MAAO,GAAE,IAAI,CAAC,UAAQ;IAC5B,IAAI,CAAC,MAAM,EAAE;AACZ,KAAA,OAAO,EAAC;AACT,KAAA;AACA,IAAA,MAAM,KAAM,GAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAK,EAAC,CAAC,EAAA;IACrE,MAAM,QAAS,GAAE,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAA;IAC7D,IAAI,QAAQ,EAAE;AACb,KAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,oBAAoB,EAAE,EAAE,QAAO,EAAG,CAAC,EAAA;AACvE,KAAA;AACA,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;AACxC,IAAA;GACA,MAAM,KAAM,GAAE,GAAC;GACf,MAAM,OAAM,GAAI,IAAI,CAAC,YAAU;GAC/B,IAAI,OAAO,EAAE;AACZ,IAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,mBAAmB,EAAE,EAAE,OAAM,EAAG,CAAC,EAAA;AACrE,IAAA;AACA,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAK;GACpC,KAAK,CAAC,IAAI,CAAC,KAAM,KAAI,CAAA,GAAI,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,QAAQ,CAAA,GAAI,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,eAAe,EAAE,EAAE,KAAM,EAAC,CAAC,EAAA;GAChH,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;AAC5B,IAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAM,EAAG,CAAC,EAAA;AAC9F,IAAA;AACA,GAAA,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;GACvB;;;EAGD,WAAW,GAAG;GACb,MAAM,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAQ,IAAG,EAAE,EAAA;GACpD,IAAI,OAAM,KAAM,UAAU,EAAE;AAC3B,IAAA,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,eAAe,CAAA;AAC/C,IAAA;AACA,GAAA,IAAI,OAAM,KAAM,EAAC,IAAK,OAAM,KAAM,QAAQ,EAAE;AAC3C,IAAA,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,aAAa,CAAA;AAC7C,IAAA;AACA,GAAA,MAAM,KAAI,GAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAW,IAAK,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAG,IAAK,IAAI,CAAC,EAAG,KAAI,OAAO,EAAA;AACxF,GAAA,OAAO,CAAC,KAAI,IAAK,KAAK,CAAC,KAAK,KAAK,OAAM;GACvC;;AAED;AACA,EAAA,OAAO,GAAG;AACT,GAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,IAAG,KAAM,6BAA6B,CAAA;GACnF;;AAED;;AAEC;;;EAGD,QAAQ,GAAG;AACV,GAAA,MAAM,MAAK,GAAI,IAAI,CAAC,KAAK,CAAC,YAAU;GACpC,IAAI,CAAC,MAAM,EAAE;IACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,yEAAyE,CAAE,EAAA;AACpI,IAAA;AACA,GAAA,MAAM,QAAO,GAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAA;AAC3E,GAAA,MAAM,QAAO,GAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAA;AAC3E,GAAA,IAAI,MAAM,CAAC,KAAI,KAAM,KAAM,IAAG,QAAS,GAAE,CAAC,EAAE;IAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAM,IAAK,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,+DAA+D,CAAE,EAAA;AAC1I,IAAA;AACA,GAAA,IAAI,QAAO,GAAI,CAAC,EAAE;IACjB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,2CAA2C,EAAE,EAAE,KAAK,EAAE,QAAS,EAAC,CAAE,EAAA;AAC3H,IAAA;AACA,GAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,oBAAoB,CAAE,EAAA;GAC9E;;;AAGD,EAAA,aAAa,GAAG;GACf,MAAM,MAAO,GAAE,EAAC;IACf,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK;AAClD,IAAA,MAAM,GAAI,GAAE,MAAM,CAAC,KAAK,EAAE,GAAE,IAAK,MAAM,CAAC,KAAK,EAAE,EAAG,IAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,IAAK,EAAE,EAAA;AAC5E,IAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;KACjB,MAAM,CAAC,GAAG,CAAA,GAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAG,GAAA;AAClC,KAAA;AACA,IAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAA;IAC9B,EAAA;GACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA;GAC3B;;AAED;EACA,SAAS,GAAG;GACX,OAAO,IAAI,CAAC,KAAK,CAAC,SAAQ;AACzB,OAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAG,IAAK,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAK,KAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAA;OAChF,IAAG;GACP;;AAED;EACA,QAAQ,GAAG;AACV,GAAA,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,GAAG,CAAA;GAC9E;;AAED;EACA,QAAQ,GAAG;AACV,GAAA,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAA;GACnF;;;EAGD,WAAW,GAAG;GACb,OAAO,IAAI,CAAC,SAAQ,GAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAE,GAAE,EAAC;GAC3D;;;AAGD,EAAA,gBAAgB,GAAG;GAClB,OAAO,IAAI,CAAC,SAAQ,IAAK,IAAI,CAAC,KAAK,CAAC,cAAa;MAC9C,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAA;AAC3D,MAAE,EAAC;GACJ;;;AAGD,EAAA,OAAO,GAAG;AACT,GAAA,OAAO;AACN,IAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ;AAChG,IAAA,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,uBAAuB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ;AACvG,IAAA;GACA;;;AAGD,EAAA,MAAM,GAAG;AACR,GAAA,MAAM,MAAK,GAAI,iBAAiB,GAAC;AACjC,GAAA,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,CAAA,EAAG,CAAC,CAAA;GAC7F;;AAED;AACA,EAAA,aAAa,GAAG;AACf,GAAA,MAAM,IAAG,GAAI,IAAI,CAAC,KAAK,CAAC,aAAW;GACnC,MAAM,KAAM,GAAE,IAAK,GAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAE,GAAE,KAAG;AAC7D,GAAA,OAAO,KAAI,IAAK,KAAK,CAAC,WAAY,IAAG,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,IAAG,IAAK,EAAE,CAAA;GACxE;;AAED;EACA,QAAQ,GAAG;AACV,GAAA,MAAM,IAAG,GAAI,IAAI,CAAC,KAAK,CAAC,aAAW;GACnC,OAAO,CAAC,IAAG,KAAM,IAAI,CAAC,IAAK,IAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,aAAY;GAC/D;;AAED;;AAEC;AACA;AACA;;AAED,EAAA,eAAe,GAAG;AACjB,GAAA,MAAM,EAAC,GAAI,IAAI,CAAC,KAAK,CAAC,eAAa;AACnC,GAAA,IAAI,CAAC,EAAE,EAAE;AACR,IAAA,OAAO,EAAC;AACT,IAAA;GACA,MAAM,KAAM,GAAE,EAAC;AACf,IAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK;AAC1C,IAAA,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA,EAAG,CAAC,EAAA;IACpG,EAAA;GACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAA;GACxB;;AAED;EACA,WAAW,GAAG;AACb,GAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAK,IAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAC;GAC9E;EACD;;AAED,CAAA,OAAO,EAAE;AACR;;;AAGC;;;AAGD,EAAA,MAAM,OAAO,GAAG;AACf,GAAA,MAAM,IAAK,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAE,GAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,GAAE,IAAI,CAAC,WAAS;AACjF,GAAA,IAAI,CAAC,IAAI,EAAE;IACV,MAAK;AACN,IAAA;AACA,GAAA,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAA;AACnG,GAAA,IAAI,CAAC,QAAS,GAAE,MAAI;AACpB,GAAA,IAAI,CAAC,aAAa,KAAG;GACrB;;KAEDA,SAAC;;AAED;AACC;;;EAGD,MAAM,CAAC,IAAI,EAAE;GACZ,IAAI,IAAI,CAAC,OAAQ,IAAG,OAAO,IAAI,CAAC,OAAO,CAAC,OAAM,KAAM,UAAU,EAAE;AAC/D,IAAA,IAAI;AACH,KAAA,MAAM,QAAS,GAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAA;KAC1C,IAAI,QAAO,IAAK,QAAQ,CAAC,IAAI,EAAE;AAC9B,MAAA,OAAO,QAAQ,CAAC,IAAG;AACpB,MAAA;AACD,KAAA,CAAE,MAAM;AACP;AACD,KAAA;AACD,IAAA;AACA,GAAA,OAAO,IAAG;GACV;;AAED;;;AAGC;AACA;AACA;;;EAGD,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;AACzB,GAAA,IAAI,CAAC,IAAI,CAAC,OAAM,IAAK,KAAK,CAAC,OAAM,IAAK,KAAK,CAAC,OAAQ,IAAG,KAAK,CAAC,QAAS,IAAG,KAAK,CAAC,MAAK,KAAM,CAAC,EAAE;IAC5F,MAAK;AACN,IAAA;AACA,GAAA,KAAK,CAAC,cAAc,GAAC;AACrB,GAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAA;GACtC;;AAED;;AAEC;;;;AAID,EAAA,eAAe,CAAC,EAAE,EAAE;AACnB,GAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAQ,GAAE,EAAC,KAAM,KAAG;AACpC,GAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAG;GACtB;;AAED;AACC;AACA;;;;EAID,OAAO,CAAC,IAAI,EAAE;AACb,GAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACjB,IAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAK,EAAA,EAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAA;IAC9E,MAAK;IACN,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAA;AAC3B,IAAA;GACA;;AAED;;AAEC;;;AAGD,EAAA,YAAY,GAAG;AACd,GAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAC;AACpB,GAAA,IAAI,IAAI,CAAC,OAAO,EAAE;IACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAO,EAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAA;AAC1D,IAAA;GACA;;AAED;AACC;AACA;;;AAGD,EAAA,MAAM,OAAO,GAAG;GACf,MAAM,OAAM,GAAI,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAA;GAC9D,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAA;GAC7B,IAAI,OAAM,IAAK,OAAO,CAAC,IAAI,EAAE;IAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAA;AAC1B,IAAA;GACA;EACD;AACF;;;;"}
1
+ {"version":3,"file":"CnFlowBoard.vue2.js","sources":["../../../../src/components/CnFlowsPage/CnFlowBoard.vue"],"sourcesContent":["<!--\n CnFlowBoard — the flow editor in the board look: a page header with the\n flow's name, path and actions, then the canvas in a card beside an\n inspector card. Optionally a palette card on the left (`palette: column`).\n The same page shows one run when the route carries `?run=`: the canvas\n paints each step's outcome and the inspector holds the run's card and logs.\n\n The canvas itself is CnFlowDetail; this component only lays it out and adds\n what the board draws around it.\n\n SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-flow-board\" :class=\"{ 'cn-flow-board--with-palette': showPalette }\" data-testid=\"flow-board\">\n\t\t<header class=\"cn-flow-board__header\">\n\t\t\t<div class=\"cn-flow-board__heading\">\n\t\t\t\t<h2 class=\"cn-flow-board__title\" data-testid=\"flow-board-title\">\n\t\t\t\t\t{{ titleText }}\n\t\t\t\t</h2>\n\t\t\t\t<CnStatusBadge v-if=\"pillText\" :label=\"pillText\" variant=\"default\" />\n\t\t\t</div>\n\t\t\t<div v-if=\"!store.inRunView\" class=\"cn-flow-board__actions\">\n\t\t\t\t<NcCheckboxRadioSwitch v-if=\"store.flow.id\"\n\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t:modelValue=\"store.flow.enabled !== false\"\n\t\t\t\t\tdata-testid=\"flow-board-enabled\"\n\t\t\t\t\t@update:modelValue=\"onEnabledChange\">\n\t\t\t\t\t{{ store.flow.enabled !== false ? t('nextcloud-vue', 'Active') : t('nextcloud-vue', 'Paused') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<NcButton :disabled=\"store.checking || !store.nodes.length\"\n\t\t\t\t\tdata-testid=\"flow-board-check\"\n\t\t\t\t\t@click=\"store.check()\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Check') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-if=\"showRun\"\n\t\t\t\t\t:disabled=\"store.running || !store.flow.id\"\n\t\t\t\t\tdata-testid=\"flow-board-run\"\n\t\t\t\t\t@click=\"onRun\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Run') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton v-if=\"testSubjectReady\"\n\t\t\t\t\t:disabled=\"store.running || !store.flow.id\"\n\t\t\t\t\tdata-testid=\"flow-board-test\"\n\t\t\t\t\t@click=\"testOpen = true\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TestTube :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ testLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<CnBuildiqEditButton />\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"store.saving || !store.flow.name || store.graphLocked\"\n\t\t\t\t\tdata-testid=\"flow-board-save\"\n\t\t\t\t\t@click=\"$emit('save')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Save') }}\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<CnDialog v-if=\"testOpen\"\n\t\t\t:name=\"testLabel\"\n\t\t\tdata-testid=\"flow-board-test-dialog\"\n\t\t\t@closing=\"testOpen = false\">\n\t\t\t<p class=\"cn-flow-board__test-intro\">\n\t\t\t\t{{ t('nextcloud-vue', 'The saved flow runs once with the record you pick as its subject.') }}\n\t\t\t</p>\n\t\t\t<CnResourceSelect v-model=\"testRecord\"\n\t\t\t\t:register=\"testSubject.register\"\n\t\t\t\t:schema=\"testSubject.schema\"\n\t\t\t\t:labelField=\"testSubject.labelField || 'title'\"\n\t\t\t\t:inputLabel=\"t('nextcloud-vue', 'Record')\"\n\t\t\t\tdata-testid=\"flow-board-test-record\" />\n\t\t\t<template #actions>\n\t\t\t\t<NcButton data-testid=\"flow-board-test-cancel\" @click=\"testOpen = false\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"!testRecord || store.running\"\n\t\t\t\t\tdata-testid=\"flow-board-test-run\"\n\t\t\t\t\t@click=\"runTest\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Run test') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</CnDialog>\n\n\t\t<p class=\"cn-flow-board__path\" data-testid=\"flow-board-path\">\n\t\t\t<a :href=\"listHref\" class=\"cn-flow-board__crumb\" @click=\"onCrumbClick($event, detailRoute)\">{{ listText }}</a>\n\t\t\t<span aria-hidden=\"true\"> / </span>\n\t\t\t<template v-if=\"store.inRunView\">\n\t\t\t\t<a :href=\"flowHref\" class=\"cn-flow-board__crumb\" @click=\"onCrumbClick($event, flowPath)\">{{ flowName }}</a>\n\t\t\t\t<span aria-hidden=\"true\"> / </span>\n\t\t\t\t<span>{{ runCrumb }}</span>\n\t\t\t</template>\n\t\t\t<span v-else>{{ flowName }}</span>\n\t\t\t<span v-if=\"metaText\" class=\"cn-flow-board__meta\"> · {{ metaText }}</span>\n\t\t</p>\n\n\t\t<NcNoteCard v-if=\"notice && !store.inRunView\" type=\"info\" class=\"cn-flow-board__notice\">\n\t\t\t{{ notice }}\n\t\t</NcNoteCard>\n\n\t\t<div class=\"cn-flow-board__body\">\n\t\t\t<aside v-if=\"showPalette\" class=\"cn-flow-board__card cn-flow-board__palette\" data-testid=\"flow-board-palette\">\n\t\t\t\t<h3 class=\"cn-flow-board__card-title\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Steps') }}\n\t\t\t\t</h3>\n\t\t\t\t<section v-for=\"group in paletteGroups\"\n\t\t\t\t\t:key=\"group.app\"\n\t\t\t\t\tclass=\"cn-flow-board__palette-group\">\n\t\t\t\t\t<h4 class=\"cn-flow-board__palette-app\">\n\t\t\t\t\t\t{{ group.name }}\n\t\t\t\t\t</h4>\n\t\t\t\t\t<ul class=\"cn-flow-board__palette-list\">\n\t\t\t\t\t\t<li v-for=\"entry in group.entries\" :key=\"entry.id\">\n\t\t\t\t\t\t\t<button type=\"button\"\n\t\t\t\t\t\t\t\tclass=\"cn-flow-board__palette-step\"\n\t\t\t\t\t\t\t\t:disabled=\"store.graphLocked\"\n\t\t\t\t\t\t\t\t:data-testid=\"`flow-board-palette-${entry.id}`\"\n\t\t\t\t\t\t\t\t@click=\"store.addNode(entry.id)\">\n\t\t\t\t\t\t\t\t{{ entry.displayName || entry.label || entry.id }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</section>\n\t\t\t\t<p v-if=\"paletteFootnote\" class=\"cn-flow-board__palette-note\">\n\t\t\t\t\t{{ paletteFootnote }}\n\t\t\t\t</p>\n\t\t\t</aside>\n\n\t\t\t<section class=\"cn-flow-board__card cn-flow-board__canvas\" :aria-label=\"t('nextcloud-vue', 'Flow canvas')\">\n\t\t\t\t<CnFlowDetail :id=\"id\"\n\t\t\t\t\t:app=\"app\"\n\t\t\t\t\t:run=\"run\"\n\t\t\t\t\t:toolbarActions=\"false\"\n\t\t\t\t\t:addStep=\"!showPalette\"\n\t\t\t\t\t@save=\"$emit('save')\"\n\t\t\t\t\t@run=\"onRun\" />\n\t\t\t\t<div v-if=\"store.inRunView\"\n\t\t\t\t\tclass=\"cn-flow-board__legend\"\n\t\t\t\t\tdata-testid=\"flow-board-legend\">\n\t\t\t\t\t<span v-for=\"level in legend\" :key=\"level.id\" class=\"cn-flow-board__legend-item\">\n\t\t\t\t\t\t<CnStatusBadge :label=\"level.label\" :variant=\"level.variant\" size=\"small\" />\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<p v-else\n\t\t\t\t\tclass=\"cn-flow-board__validity\"\n\t\t\t\t\t:class=\"`cn-flow-board__validity--${validity.tone}`\"\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\tdata-testid=\"flow-board-validity\">\n\t\t\t\t\t{{ validity.text }}\n\t\t\t\t</p>\n\t\t\t</section>\n\n\t\t\t<aside class=\"cn-flow-board__card cn-flow-board__inspector\" data-testid=\"flow-board-inspector\">\n\t\t\t\t<template v-if=\"store.inRunView\">\n\t\t\t\t\t<CnFlowRunSummary :run=\"runRecord\"\n\t\t\t\t\t\t:stepsTotal=\"store.nodes.length\"\n\t\t\t\t\t\t:canRetry=\"canRetry\"\n\t\t\t\t\t\t@back=\"onBackToFlow\"\n\t\t\t\t\t\t@retry=\"onRetry\" />\n\t\t\t\t\t<div class=\"cn-flow-board__tabs\" role=\"tablist\">\n\t\t\t\t\t\t<button v-for=\"tab in runTabs\"\n\t\t\t\t\t\t\t:key=\"tab.id\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\tclass=\"cn-flow-board__tab\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-flow-board__tab--active': runTab === tab.id }\"\n\t\t\t\t\t\t\t:aria-selected=\"runTab === tab.id ? 'true' : 'false'\"\n\t\t\t\t\t\t\t:data-testid=\"`flow-board-run-tab-${tab.id}`\"\n\t\t\t\t\t\t\t@click=\"runTab = tab.id\">\n\t\t\t\t\t\t\t{{ tab.label }}\n\t\t\t\t\t\t\t<span class=\"cn-flow-board__tab-count\">{{ tab.count }}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CnFlowStepLog :lines=\"runTab === 'step' ? selectedRunLines : allRunLines\"\n\t\t\t\t\t\t:emptyText=\"runTab === 'step' && !store.selectedNodeId ? t('nextcloud-vue', 'Select a step on the canvas to see what it did.') : ''\" />\n\t\t\t\t</template>\n\t\t\t\t<template v-else-if=\"store.selectedNode\">\n\t\t\t\t\t<p class=\"cn-flow-board__eyebrow\">\n\t\t\t\t\t\t{{ stepTypeLabel }}\n\t\t\t\t\t</p>\n\t\t\t\t\t<h3 class=\"cn-flow-board__card-title\" data-testid=\"flow-board-step-name\">\n\t\t\t\t\t\t{{ stepName }}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<dl v-if=\"stepSettings.length > 0\" class=\"cn-flow-board__settings\">\n\t\t\t\t\t\t<div v-for=\"setting in stepSettings\"\n\t\t\t\t\t\t\t:key=\"setting.key\"\n\t\t\t\t\t\t\tclass=\"cn-flow-board__setting\"\n\t\t\t\t\t\t\tdata-testid=\"flow-board-step-setting\">\n\t\t\t\t\t\t\t<dt>{{ setting.label }}</dt>\n\t\t\t\t\t\t\t<dd>{{ setting.value }}</dd>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</dl>\n\t\t\t\t\t<div class=\"cn-flow-board__step-actions\">\n\t\t\t\t\t\t<NcButton data-testid=\"flow-board-edit-step\" @click=\"store.editingNodeId = store.selectedNodeId\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Edit step') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t<NcButton v-if=\"lastRunUuid\"\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tdata-testid=\"flow-board-open-last-run\"\n\t\t\t\t\t\t\t@click=\"openRun(lastRunUuid)\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Open the last run on the canvas') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h4 class=\"cn-flow-board__subtitle\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Recent log lines of this step') }}\n\t\t\t\t\t</h4>\n\t\t\t\t\t<CnFlowStepLog :lines=\"recentStepLines\"\n\t\t\t\t\t\twithDay\n\t\t\t\t\t\t:emptyText=\"t('nextcloud-vue', 'This step has not run yet.')\" />\n\t\t\t\t\t<div class=\"cn-flow-board__step-footer\">\n\t\t\t\t\t\t<NcButton variant=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"store.graphLocked\"\n\t\t\t\t\t\t\tdata-testid=\"flow-board-delete-step\"\n\t\t\t\t\t\t\t@click=\"store.removeNode(store.selectedNodeId)\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Delete step') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t<NcButton data-testid=\"flow-board-done\" @click=\"store.selectedNodeId = null\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Done') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<template v-else-if=\"showRuns\">\n\t\t\t\t\t<NcButton variant=\"tertiary\"\n\t\t\t\t\t\tclass=\"cn-flow-board__runs-back\"\n\t\t\t\t\t\tdata-testid=\"flow-board-hide-runs\"\n\t\t\t\t\t\t@click=\"showRuns = false\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Back to the step settings') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<CnFlowSidebar embedded />\n\t\t\t\t</template>\n\t\t\t\t<div v-else class=\"cn-flow-board__inspector-empty\" data-testid=\"flow-board-inspector-empty\">\n\t\t\t\t\t<p>{{ t('nextcloud-vue', 'Select a step on the canvas to see its settings.') }}</p>\n\t\t\t\t\t<NcButton variant=\"secondary\"\n\t\t\t\t\t\tdata-testid=\"flow-board-show-runs\"\n\t\t\t\t\t\t@click=\"showRuns = true\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Show runs') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</aside>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcCheckboxRadioSwitch, NcNoteCard } from '@nextcloud/vue'\nimport TestTube from 'vue-material-design-icons/TestTube.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport CnDialog from '../CnDialog/CnDialog.vue'\nimport CnFlowDetail from '../CnFlowDetail/CnFlowDetail.vue'\nimport CnFlowRunSummary from '../CnFlowDetail/CnFlowRunSummary.vue'\nimport CnFlowSidebar from '../CnFlowDetail/CnFlowSidebar.vue'\nimport CnFlowStepLog from '../CnFlowDetail/CnFlowStepLog.vue'\nimport CnResourceSelect from '../CnResourceSelect/CnResourceSelect.vue'\nimport { FLOW_RUN_ACTIVE_STATUSES, useFlowStore } from '../../composables/useFlowStore.js'\nimport { formatRelativeDate } from '../../utils/boardDate.js'\nimport { flowOutcomeLevels, flowRunDurationMs, flowRunLogLines, flowRunName, formatFlowDuration } from '../../utils/flowRunLog.js'\nimport { appDisplayNames } from '../../utils/nextcloudApps.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\n\n/**\n * The board-look flow editor and run view. CnFlowEditorPage renders it when\n * the app or page is in the board look; the Nextcloud look keeps the canvas\n * on its own with the app sidebar.\n */\nexport default {\n\tname: 'CnFlowBoard',\n\n\tcomponents: { CnBuildiqEditButton, CnDialog, CnFlowDetail, CnResourceSelect, TestTube, CnFlowRunSummary, CnFlowSidebar, CnFlowStepLog, CnStatusBadge, NcButton, NcCheckboxRadioSwitch, NcNoteCard },\n\n\tprops: {\n\t\t/** The flow uuid, or `new`. */\n\t\tid: { type: String, default: '' },\n\t\t/** The owning app, for a new flow and the list scope. */\n\t\tapp: { type: String, default: null },\n\t\t/** The run to show, or ''. */\n\t\trun: { type: String, default: '' },\n\t\t/** Where the flow list lives; flows open at `<detailRoute>/<id>`. */\n\t\tdetailRoute: { type: String, default: '/flows' },\n\t\t/** The list's name in the path (\"Flows\", \"Settings / Flows\"). */\n\t\tlistLabel: { type: String, default: '' },\n\t\t/** `column` draws the step palette as a card on the left. */\n\t\tpalette: { type: String, default: 'picker' },\n\t\t/** Free text under the path in the palette card. */\n\t\tpaletteFootnote: { type: String, default: '' },\n\t\t/** An info notice under the path. */\n\t\tnotice: { type: String, default: '' },\n\t\t/** The pill beside the title (\"Case type flow\"). */\n\t\tpill: { type: String, default: '' },\n\t\t/**\n\t\t * The records a test run can take as its subject: `{ register, schema,\n\t\t * labelField?, label? }`. Draws a header button (\"Testen met een zaak\",\n\t\t * DqFlow) that runs the saved flow once with a picked record.\n\t\t */\n\t\ttestSubject: { type: Object, default: null },\n\t},\n\n\temits: ['save', 'run', 'retried'],\n\n\tsetup() {\n\t\treturn { store: useFlowStore() }\n\t},\n\n\tdata() {\n\t\treturn { runTab: 'step', testOpen: false, testRecord: null, appNames: {}, showRuns: false }\n\t},\n\n\tcomputed: {\n\t\t/** @return {boolean} Whether a test subject is declared well enough to pick one. */\n\t\ttestSubjectReady() {\n\t\t\treturn Boolean(this.testSubject && this.testSubject.register && this.testSubject.schema)\n\t\t},\n\n\t\t/** @return {string} The test button's label: the page's own, else the library's. */\n\t\ttestLabel() {\n\t\t\treturn (this.testSubject && this.testSubject.label) || t('nextcloud-vue', 'Test with a record')\n\t\t},\n\n\t\t/** @return {boolean} Whether the palette card is drawn. */\n\t\tshowPalette() {\n\t\t\treturn this.palette === 'column' && !this.store.inRunView\n\t\t},\n\n\t\t/** @return {string} The page title. */\n\t\ttitleText() {\n\t\t\treturn this.store.flow.name || this.t('nextcloud-vue', 'New flow')\n\t\t},\n\n\t\t/** @return {string} The flow's name in the path. */\n\t\tflowName() {\n\t\t\treturn this.store.flow.name || this.t('nextcloud-vue', 'New flow')\n\t\t},\n\n\t\t/** @return {string} The pill text: the page's, else the lifecycle. */\n\t\tpillText() {\n\t\t\tif (this.pill) {\n\t\t\t\treturn this.pill\n\t\t\t}\n\t\t\tconst lifecycle = String(this.store.flow.lifecycleStatus || '')\n\t\t\tif (lifecycle === 'draft') {\n\t\t\t\treturn this.t('nextcloud-vue', 'Draft')\n\t\t\t}\n\t\t\tif (lifecycle === 'deprecated') {\n\t\t\t\treturn this.t('nextcloud-vue', 'Retired')\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\t/** @return {string} The list label. */\n\t\tlistText() {\n\t\t\treturn this.listLabel || this.t('nextcloud-vue', 'Flows')\n\t\t},\n\n\t\t/** @return {string} The flow's own path. */\n\t\tflowPath() {\n\t\t\treturn `${this.detailRoute}/${this.store.flow.id || this.id}`\n\t\t},\n\n\t\t/** @return {string} The list href. */\n\t\tlistHref() {\n\t\t\treturn this.hrefOf(this.detailRoute)\n\t\t},\n\n\t\t/** @return {string} The flow href. */\n\t\tflowHref() {\n\t\t\treturn this.hrefOf(this.flowPath)\n\t\t},\n\n\t\t/**\n\t\t * What the path says after the name: the trigger, the step count and\n\t\t * the version in the editor; when the run started and how long it\n\t\t * took in the run view.\n\t\t *\n\t\t * @return {string} The meta text.\n\t\t */\n\t\tmetaText() {\n\t\t\tif (this.store.inRunView) {\n\t\t\t\tconst record = this.runRecord\n\t\t\t\tif (!record) {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\t\t\t\tconst parts = [formatRelativeDate(record.created, { withTime: true })]\n\t\t\t\tconst duration = formatFlowDuration(flowRunDurationMs(record))\n\t\t\t\tif (duration) {\n\t\t\t\t\tparts.push(this.t('nextcloud-vue', 'done in {duration}', { duration }))\n\t\t\t\t}\n\t\t\t\treturn parts.filter(Boolean).join(' · ')\n\t\t\t}\n\t\t\tconst parts = []\n\t\t\tconst trigger = this.triggerText\n\t\t\tif (trigger) {\n\t\t\t\tparts.push(this.t('nextcloud-vue', 'trigger {trigger}', { trigger }))\n\t\t\t}\n\t\t\tconst count = this.store.nodes.length\n\t\t\tparts.push(count === 1 ? this.t('nextcloud-vue', '1 step') : this.t('nextcloud-vue', '{count} steps', { count }))\n\t\t\tif (this.store.flow.version) {\n\t\t\t\tparts.push(this.t('nextcloud-vue', 'version {version}', { version: this.store.flow.version }))\n\t\t\t}\n\t\t\treturn parts.join(' · ')\n\t\t},\n\n\t\t/** @return {string} How the flow starts, as the catalogue names it. */\n\t\ttriggerText() {\n\t\t\tconst trigger = String(this.store.flow.trigger || '')\n\t\t\tif (trigger === 'schedule') {\n\t\t\t\treturn this.t('nextcloud-vue', 'On a schedule')\n\t\t\t}\n\t\t\tif (trigger === '' || trigger === 'manual') {\n\t\t\t\treturn this.t('nextcloud-vue', 'Run by hand')\n\t\t\t}\n\t\t\tconst entry = (this.store.eventCatalog || []).find((item) => item && item.id === trigger)\n\t\t\treturn (entry && entry.label) || trigger\n\t\t},\n\n\t\t/** @return {boolean} Whether Run is offered. */\n\t\tshowRun() {\n\t\t\treturn this.store.nodes.some((node) => node?.type === 'openregister.trigger-manual')\n\t\t},\n\n\t\t/**\n\t\t * The engine's verdict on the canvas as one line under it.\n\t\t *\n\t\t * @return {{tone: string, text: string}} The validity bar.\n\t\t */\n\t\tvalidity() {\n\t\t\tconst result = this.store.checkResult\n\t\t\tif (!result) {\n\t\t\t\treturn { tone: 'unknown', text: this.t('nextcloud-vue', 'Not checked yet. Check runs the flow past the engine without saving it.') }\n\t\t\t}\n\t\t\tconst blocking = Array.isArray(result.blocking) ? result.blocking.length : 0\n\t\t\tconst warnings = Array.isArray(result.warnings) ? result.warnings.length : 0\n\t\t\tif (result.valid === false || blocking > 0) {\n\t\t\t\treturn { tone: 'error', text: result.message || this.t('nextcloud-vue', 'The flow cannot run as it is. See the messages on the canvas.') }\n\t\t\t}\n\t\t\tif (warnings > 0) {\n\t\t\t\treturn { tone: 'warning', text: this.t('nextcloud-vue', 'The flow is valid, with {count} warnings.', { count: warnings }) }\n\t\t\t}\n\t\t\treturn { tone: 'success', text: this.t('nextcloud-vue', 'The flow is valid.') }\n\t\t},\n\n\t\t/**\n\t\t * The palette grouped by owning app, each group named by the app's\n\t\t * display name (its id when Nextcloud names none), the app that owns\n\t\t * this flow first.\n\t\t *\n\t\t * @return {Array<{app: string, name: string, entries: Array<object>}>} The groups.\n\t\t */\n\t\tpaletteGroups() {\n\t\t\tconst groups = {}\n\t\t\t;(this.store.nodeCatalog || []).forEach((entry) => {\n\t\t\t\tconst app = String(entry?.app || String(entry?.id || '').split('.')[0] || '')\n\t\t\t\tif (!groups[app]) {\n\t\t\t\t\tgroups[app] = { app, name: this.appNames[app] || app, entries: [] }\n\t\t\t\t}\n\t\t\t\tgroups[app].entries.push(entry)\n\t\t\t})\n\t\t\tconst list = Object.values(groups)\n\t\t\tconst host = list.findIndex((group) => group.app === this.app)\n\t\t\treturn host > 0 ? [list[host], ...list.slice(0, host), ...list.slice(host + 1)] : list\n\t\t},\n\n\t\t/** @return {object|null} The run on screen. */\n\t\trunRecord() {\n\t\t\treturn this.store.runDetail\n\t\t\t\t|| (this.store.runs || []).find((item) => item.uuid === this.store.inspectedRunUuid)\n\t\t\t\t|| null\n\t\t},\n\n\t\t/** @return {string} The run's place in the path. */\n\t\trunCrumb() {\n\t\t\treturn this.t('nextcloud-vue', 'Run {id}', { id: flowRunName(this.runRecord) })\n\t\t},\n\n\t\t/** @return {boolean} Whether Run again is offered. */\n\t\tcanRetry() {\n\t\t\treturn !!this.runRecord && !FLOW_RUN_ACTIVE_STATUSES.includes(this.runRecord.status)\n\t\t},\n\n\t\t/** @return {Array<object>} Every line of the run on screen. */\n\t\tallRunLines() {\n\t\t\treturn this.runRecord ? flowRunLogLines(this.runRecord) : []\n\t\t},\n\n\t\t/** @return {Array<object>} The selected step's lines in this run. */\n\t\tselectedRunLines() {\n\t\t\treturn this.runRecord && this.store.selectedNodeId\n\t\t\t\t? flowRunLogLines(this.runRecord, this.store.selectedNodeId)\n\t\t\t\t: []\n\t\t},\n\n\t\t/** @return {Array<object>} The two log tabs with their counts. */\n\t\trunTabs() {\n\t\t\treturn [\n\t\t\t\t{ id: 'step', label: this.t('nextcloud-vue', 'This step'), count: this.selectedRunLines.length },\n\t\t\t\t{ id: 'run', label: this.t('nextcloud-vue', 'Logs of the whole run'), count: this.allRunLines.length },\n\t\t\t]\n\t\t},\n\n\t\t/** @return {Array<object>} The legend of outcomes on the canvas. */\n\t\tlegend() {\n\t\t\tconst levels = flowOutcomeLevels()\n\t\t\treturn ['success', 'warning', 'error', 'info', 'skipped'].map((id) => ({ id, ...levels[id] }))\n\t\t},\n\n\t\t/** @return {string} The selected step's type, as the catalogue names it. */\n\t\tstepTypeLabel() {\n\t\t\tconst node = this.store.selectedNode\n\t\t\tconst entry = node ? this.store.catalogEntry(node.type) : null\n\t\t\treturn entry ? (entry.displayName || entry.id) : String(node?.type || '')\n\t\t},\n\n\t\t/**\n\t\t * The selected step's settings as its owner declares them in the\n\t\t * catalogue's `configForm`: label and value, a select's option label,\n\t\t * Yes or No for a switch. Unset settings are left out.\n\t\t *\n\t\t * @return {Array<{key: string, label: string, value: string}>} The settings.\n\t\t */\n\t\tstepSettings() {\n\t\t\tconst node = this.store.selectedNode\n\t\t\tconst entry = node ? this.store.catalogEntry(node.type) : null\n\t\t\tconst config = (node && node.config) || {}\n\t\t\tconst form = (entry && Array.isArray(entry.configForm)) ? entry.configForm : []\n\t\t\treturn form\n\t\t\t\t.filter((field) => field && field.key && config[field.key] !== undefined && config[field.key] !== null && config[field.key] !== '')\n\t\t\t\t.map((field) => {\n\t\t\t\t\tconst raw = config[field.key]\n\t\t\t\t\tconst option = Array.isArray(field.options) ? field.options.find((o) => o && o.value === raw) : null\n\t\t\t\t\tlet value\n\t\t\t\t\tif (option) {\n\t\t\t\t\t\tvalue = String(option.label ?? option.value)\n\t\t\t\t\t} else if (typeof raw === 'boolean') {\n\t\t\t\t\t\tvalue = raw ? this.t('nextcloud-vue', 'Yes') : this.t('nextcloud-vue', 'No')\n\t\t\t\t\t} else if (typeof raw === 'object') {\n\t\t\t\t\t\tvalue = JSON.stringify(raw)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = String(raw)\n\t\t\t\t\t}\n\t\t\t\t\treturn { key: field.key, label: field.label || field.key, value }\n\t\t\t\t})\n\t\t},\n\n\t\t/** @return {string} The selected step's name. */\n\t\tstepName() {\n\t\t\tconst node = this.store.selectedNode\n\t\t\treturn (node && (node.name || node.label)) || this.stepTypeLabel\n\t\t},\n\n\t\t/**\n\t\t * The selected step's lines from the flow's recent runs, newest run\n\t\t * first, at most ten.\n\t\t *\n\t\t * @return {Array<object>} The lines.\n\t\t */\n\t\trecentStepLines() {\n\t\t\tconst id = this.store.selectedNodeId\n\t\t\tif (!id) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst lines = []\n\t\t\t;(this.store.runs || []).forEach((item) => {\n\t\t\t\tflowRunLogLines(item, id).forEach((line) => lines.push({ ...line, key: `${item.uuid}-${line.key}` }))\n\t\t\t})\n\t\t\treturn lines.slice(0, 10)\n\t\t},\n\n\t\t/** @return {string} The newest run's uuid, or ''. */\n\t\tlastRunUuid() {\n\t\t\treturn (this.store.runs && this.store.runs[0] && this.store.runs[0].uuid) || ''\n\t\t},\n\t},\n\n\twatch: {\n\t\t// A selected step takes the panel back from the run history.\n\t\t'store.selectedNodeId': function(id) {\n\t\t\tif (id) {\n\t\t\t\tthis.showRuns = false\n\t\t\t}\n\t\t},\n\t},\n\n\tasync created() {\n\t\t// The palette names its groups by app display name; only the column\n\t\t// palette draws them, so only it reads the names.\n\t\tif (this.palette !== 'column') {\n\t\t\treturn\n\t\t}\n\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\tthis.appNames = await appDisplayNames(axios)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Run the flow, with the run history in the panel to follow it.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonRun() {\n\t\t\tthis.showRuns = true\n\t\t\tthis.$emit('run')\n\t\t},\n\n\t\t/**\n\t\t * Run the saved flow once with the picked record as its subject, then\n\t\t * close the dialog; the run shows on the canvas as any run does.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync runTest() {\n\t\t\tconst uuid = Array.isArray(this.testRecord) ? this.testRecord[0] : this.testRecord\n\t\t\tif (!uuid) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tawait this.store.run({ uuid, register: this.testSubject.register, schema: this.testSubject.schema })\n\t\t\tthis.testOpen = false\n\t\t\tthis.testRecord = null\n\t\t},\n\n\t\tt,\n\n\t\t/**\n\t\t * @param {string} path An app route path.\n\t\t * @return {string} Its href.\n\t\t */\n\t\threfOf(path) {\n\t\t\tif (this.$router && typeof this.$router.resolve === 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = this.$router.resolve(path)\n\t\t\t\t\tif (resolved && resolved.href) {\n\t\t\t\t\t\treturn resolved.href\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// A path the router does not know stays a plain path.\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn path\n\t\t},\n\n\t\t/**\n\t\t * Follow a path link on the app's router; a modified click keeps the\n\t\t * browser's own behaviour.\n\t\t *\n\t\t * @param {MouseEvent} event The click.\n\t\t * @param {string} path The target path.\n\t\t * @return {void}\n\t\t */\n\t\tonCrumbClick(event, path) {\n\t\t\tif (!this.$router || event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.$router.push(path).catch(() => {})\n\t\t},\n\n\t\t/**\n\t\t * Switch the flow on or off. The change is saved with the flow.\n\t\t *\n\t\t * @param {boolean} on The new state.\n\t\t * @return {void}\n\t\t */\n\t\tonEnabledChange(on) {\n\t\t\tthis.store.flow.enabled = on === true\n\t\t\tthis.store.dirty = true\n\t\t},\n\n\t\t/**\n\t\t * Open a run of this flow on the canvas.\n\t\t *\n\t\t * @param {string} uuid The run.\n\t\t * @return {void}\n\t\t */\n\t\topenRun(uuid) {\n\t\t\tif (this.$router) {\n\t\t\t\tthis.$router.push({ path: this.flowPath, query: { run: uuid } }).catch(() => {})\n\t\t\t} else {\n\t\t\t\tthis.store.inspectRun(uuid)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Leave the run view for the flow.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonBackToFlow() {\n\t\t\tthis.store.closeRun()\n\t\t\tif (this.$router) {\n\t\t\t\tthis.$router.push({ path: this.flowPath }).catch(() => {})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Start the shown run again and open the new one.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onRetry() {\n\t\t\tconst retried = await this.store.retryRun(this.runRecord?.uuid)\n\t\t\tthis.$emit('retried', retried)\n\t\t\tif (retried && retried.uuid) {\n\t\t\t\tthis.openRun(retried.uuid)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-flow-board {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 20px 24px;\n\tmin-height: 100%;\n\tbox-sizing: border-box;\n}\n\n.cn-flow-board__header {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n}\n\n.cn-flow-board__heading {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tmin-width: 0;\n}\n\n.cn-flow-board__title {\n\tmargin: 0;\n\tfont-size: 24px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-flow-board__test-intro {\n\tmargin: 0 0 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-flow-board__path {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-flow-board__crumb {\n\tcolor: var(--color-main-text);\n\ttext-decoration: underline;\n}\n\n.cn-flow-board__body {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1fr) 340px;\n\tgap: 16px;\n\tflex: 1 1 auto;\n\tmin-height: 520px;\n}\n\n.cn-flow-board--with-palette .cn-flow-board__body {\n\tgrid-template-columns: 240px minmax(0, 1fr) 340px;\n}\n\n.cn-flow-board__card {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tmin-width: 0;\n\tpadding: 16px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: 12px;\n\tbackground: var(--color-main-background);\n}\n\n.cn-flow-board__canvas {\n\tpadding: 0;\n\toverflow: hidden;\n\tbackground-color: var(--color-background-hover);\n\tbackground-image: radial-gradient(var(--color-border-dark) 1px, transparent 1px);\n\tbackground-size: 16px 16px;\n}\n\n.cn-flow-board__canvas > :first-child {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n}\n\n.cn-flow-board__card-title {\n\tmargin: 0;\n\tfont-size: 16px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__subtitle {\n\tmargin: 4px 0 0;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__eyebrow {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-flow-board__validity,\n.cn-flow-board__legend {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tmargin: 0;\n\tpadding: 10px 16px;\n\tborder-top: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n}\n\n.cn-flow-board__validity--success {\n\tcolor: var(--color-success-text);\n}\n\n.cn-flow-board__validity--warning {\n\tcolor: var(--color-warning-text);\n}\n\n.cn-flow-board__validity--error {\n\tcolor: var(--color-error-text);\n}\n\n.cn-flow-board__palette-group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-flow-board__palette-app {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-flow-board__palette-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-flow-board__palette-step {\n\twidth: 100%;\n\tmin-height: 34px;\n\tpadding: 6px 10px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: 8px;\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-flow-board__palette-step:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-flow-board__palette-note {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-flow-board__tabs {\n\tdisplay: flex;\n\tgap: 4px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-flow-board__tab {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 8px 10px;\n\tmargin-bottom: -1px;\n\tborder: 1px solid transparent;\n\tborder-radius: 8px 8px 0 0;\n\tbackground: transparent;\n\tcolor: var(--color-main-text);\n\tcursor: pointer;\n}\n\n.cn-flow-board__tab--active {\n\tborder-color: var(--color-border);\n\tborder-bottom-color: var(--color-main-background);\n\tfont-weight: 600;\n}\n\n.cn-flow-board__tab-count {\n\tmin-width: 18px;\n\tpadding: 0 5px;\n\tborder-radius: 9px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 12px;\n\tline-height: 18px;\n\ttext-align: center;\n}\n\n.cn-flow-board__settings {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tmargin: 0;\n}\n\n.cn-flow-board__setting dt {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-flow-board__setting dd {\n\tmargin: 2px 0 0;\n\tfont-weight: 600;\n\toverflow-wrap: anywhere;\n}\n\n.cn-flow-board__inspector-empty {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: flex-start;\n\tgap: 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-flow-board__inspector-empty p {\n\tmargin: 0;\n}\n\n.cn-flow-board__step-actions,\n.cn-flow-board__step-footer {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n}\n\n.cn-flow-board__step-footer {\n\tjustify-content: space-between;\n\tmargin-top: auto;\n}\n\n@media (max-width: 1024px) {\n\t.cn-flow-board__body,\n\t.cn-flow-board--with-palette .cn-flow-board__body {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n</style>\n"],"names":["CnBuildiqEditButton","CnDialog","CnFlowDetail","CnResourceSelect","CnFlowRunSummary","CnFlowSidebar","CnFlowStepLog","CnStatusBadge","t"],"mappings":"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"}
@@ -57,9 +57,18 @@ const _hoisted_25 = {
57
57
  class: "cn-flow-board__card-title",
58
58
  "data-testid": "flow-board-step-name"
59
59
  };
60
- const _hoisted_26 = { class: "cn-flow-board__step-actions" };
61
- const _hoisted_27 = { class: "cn-flow-board__subtitle" };
62
- const _hoisted_28 = { class: "cn-flow-board__step-footer" };
60
+ const _hoisted_26 = {
61
+ key: 0,
62
+ class: "cn-flow-board__settings"
63
+ };
64
+ const _hoisted_27 = { class: "cn-flow-board__step-actions" };
65
+ const _hoisted_28 = { class: "cn-flow-board__subtitle" };
66
+ const _hoisted_29 = { class: "cn-flow-board__step-footer" };
67
+ const _hoisted_30 = {
68
+ key: 3,
69
+ class: "cn-flow-board__inspector-empty",
70
+ "data-testid": "flow-board-inspector-empty"
71
+ };
63
72
 
64
73
  function render(_ctx, _cache, $props, $setup, $data, $options) {
65
74
  const _component_CnStatusBadge = resolveComponent("CnStatusBadge");
@@ -121,20 +130,20 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
121
130
  key: 1,
122
131
  disabled: $setup.store.running || !$setup.store.flow.id,
123
132
  "data-testid": "flow-board-run",
124
- onClick: _cache[1] || (_cache[1] = $event => (_ctx.$emit('run')))
133
+ onClick: $options.onRun
125
134
  }, {
126
135
  default: withCtx(() => [
127
136
  createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Run')), 1 /* TEXT */)
128
137
  ]),
129
138
  _: 1 /* STABLE */
130
- }, 8 /* PROPS */, ["disabled"]))
139
+ }, 8 /* PROPS */, ["disabled", "onClick"]))
131
140
  : createCommentVNode("v-if", true),
132
141
  ($options.testSubjectReady)
133
142
  ? (openBlock(), createBlock(_component_NcButton, {
134
143
  key: 2,
135
144
  disabled: $setup.store.running || !$setup.store.flow.id,
136
145
  "data-testid": "flow-board-test",
137
- onClick: _cache[2] || (_cache[2] = $event => ($data.testOpen = true))
146
+ onClick: _cache[1] || (_cache[1] = $event => ($data.testOpen = true))
138
147
  }, {
139
148
  icon: withCtx(() => [
140
149
  createVNode(_component_TestTube, { size: 16 })
@@ -150,7 +159,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
150
159
  variant: "primary",
151
160
  disabled: $setup.store.saving || !$setup.store.flow.name || $setup.store.graphLocked,
152
161
  "data-testid": "flow-board-save",
153
- onClick: _cache[3] || (_cache[3] = $event => (_ctx.$emit('save')))
162
+ onClick: _cache[2] || (_cache[2] = $event => (_ctx.$emit('save')))
154
163
  }, {
155
164
  default: withCtx(() => [
156
165
  createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Save')), 1 /* TEXT */)
@@ -165,12 +174,12 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
165
174
  key: 0,
166
175
  name: $options.testLabel,
167
176
  "data-testid": "flow-board-test-dialog",
168
- onClosing: _cache[6] || (_cache[6] = $event => ($data.testOpen = false))
177
+ onClosing: _cache[5] || (_cache[5] = $event => ($data.testOpen = false))
169
178
  }, {
170
179
  actions: withCtx(() => [
171
180
  createVNode(_component_NcButton, {
172
181
  "data-testid": "flow-board-test-cancel",
173
- onClick: _cache[5] || (_cache[5] = $event => ($data.testOpen = false))
182
+ onClick: _cache[4] || (_cache[4] = $event => ($data.testOpen = false))
174
183
  }, {
175
184
  default: withCtx(() => [
176
185
  createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Cancel')), 1 /* TEXT */)
@@ -193,7 +202,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
193
202
  createElementVNode("p", _hoisted_5, toDisplayString($options.t('nextcloud-vue', 'The saved flow runs once with the record you pick as its subject.')), 1 /* TEXT */),
194
203
  createVNode(_component_CnResourceSelect, {
195
204
  modelValue: $data.testRecord,
196
- "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => (($data.testRecord) = $event)),
205
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => (($data.testRecord) = $event)),
197
206
  register: $props.testSubject.register,
198
207
  schema: $props.testSubject.schema,
199
208
  labelField: $props.testSubject.labelField || 'title',
@@ -208,7 +217,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
208
217
  createElementVNode("a", {
209
218
  href: $options.listHref,
210
219
  class: "cn-flow-board__crumb",
211
- onClick: _cache[7] || (_cache[7] = $event => ($options.onCrumbClick($event, $props.detailRoute)))
220
+ onClick: _cache[6] || (_cache[6] = $event => ($options.onCrumbClick($event, $props.detailRoute)))
212
221
  }, toDisplayString($options.listText), 9 /* TEXT, PROPS */, _hoisted_7),
213
222
  _cache[16] || (_cache[16] = createElementVNode("span", { "aria-hidden": "true" }, " / ", -1 /* CACHED */)),
214
223
  ($setup.store.inRunView)
@@ -216,7 +225,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
216
225
  createElementVNode("a", {
217
226
  href: $options.flowHref,
218
227
  class: "cn-flow-board__crumb",
219
- onClick: _cache[8] || (_cache[8] = $event => ($options.onCrumbClick($event, $options.flowPath)))
228
+ onClick: _cache[7] || (_cache[7] = $event => ($options.onCrumbClick($event, $options.flowPath)))
220
229
  }, toDisplayString($options.flowName), 9 /* TEXT, PROPS */, _hoisted_8),
221
230
  _cache[15] || (_cache[15] = createElementVNode("span", { "aria-hidden": "true" }, " / ", -1 /* CACHED */)),
222
231
  createElementVNode("span", null, toDisplayString($options.runCrumb), 1 /* TEXT */)
@@ -247,7 +256,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
247
256
  key: group.app,
248
257
  class: "cn-flow-board__palette-group"
249
258
  }, [
250
- createElementVNode("h4", _hoisted_14, toDisplayString(group.app), 1 /* TEXT */),
259
+ createElementVNode("h4", _hoisted_14, toDisplayString(group.name), 1 /* TEXT */),
251
260
  createElementVNode("ul", _hoisted_15, [
252
261
  (openBlock(true), createElementBlock(Fragment, null, renderList(group.entries, (entry) => {
253
262
  return (openBlock(), createElementBlock("li", {
@@ -280,9 +289,9 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
280
289
  run: $props.run,
281
290
  toolbarActions: false,
282
291
  addStep: !$options.showPalette,
283
- onSave: _cache[9] || (_cache[9] = $event => (_ctx.$emit('save'))),
284
- onRun: _cache[10] || (_cache[10] = $event => (_ctx.$emit('run')))
285
- }, null, 8 /* PROPS */, ["id", "app", "run", "addStep"]),
292
+ onSave: _cache[8] || (_cache[8] = $event => (_ctx.$emit('save'))),
293
+ onRun: $options.onRun
294
+ }, null, 8 /* PROPS */, ["id", "app", "run", "addStep", "onRun"]),
286
295
  ($setup.store.inRunView)
287
296
  ? (openBlock(), createElementBlock("div", _hoisted_19, [
288
297
  (openBlock(true), createElementBlock(Fragment, null, renderList($options.legend, (level) => {
@@ -340,10 +349,24 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
340
349
  ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
341
350
  createElementVNode("p", _hoisted_24, toDisplayString($options.stepTypeLabel), 1 /* TEXT */),
342
351
  createElementVNode("h3", _hoisted_25, toDisplayString($options.stepName), 1 /* TEXT */),
343
- createElementVNode("div", _hoisted_26, [
352
+ ($options.stepSettings.length > 0)
353
+ ? (openBlock(), createElementBlock("dl", _hoisted_26, [
354
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.stepSettings, (setting) => {
355
+ return (openBlock(), createElementBlock("div", {
356
+ key: setting.key,
357
+ class: "cn-flow-board__setting",
358
+ "data-testid": "flow-board-step-setting"
359
+ }, [
360
+ createElementVNode("dt", null, toDisplayString(setting.label), 1 /* TEXT */),
361
+ createElementVNode("dd", null, toDisplayString(setting.value), 1 /* TEXT */)
362
+ ]))
363
+ }), 128 /* KEYED_FRAGMENT */))
364
+ ]))
365
+ : createCommentVNode("v-if", true),
366
+ createElementVNode("div", _hoisted_27, [
344
367
  createVNode(_component_NcButton, {
345
368
  "data-testid": "flow-board-edit-step",
346
- onClick: _cache[11] || (_cache[11] = $event => ($setup.store.editingNodeId = $setup.store.selectedNodeId))
369
+ onClick: _cache[9] || (_cache[9] = $event => ($setup.store.editingNodeId = $setup.store.selectedNodeId))
347
370
  }, {
348
371
  default: withCtx(() => [
349
372
  createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Edit step')), 1 /* TEXT */)
@@ -355,7 +378,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
355
378
  key: 0,
356
379
  variant: "tertiary",
357
380
  "data-testid": "flow-board-open-last-run",
358
- onClick: _cache[12] || (_cache[12] = $event => ($options.openRun($options.lastRunUuid)))
381
+ onClick: _cache[10] || (_cache[10] = $event => ($options.openRun($options.lastRunUuid)))
359
382
  }, {
360
383
  default: withCtx(() => [
361
384
  createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Open the last run on the canvas')), 1 /* TEXT */)
@@ -364,18 +387,18 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
364
387
  }))
365
388
  : createCommentVNode("v-if", true)
366
389
  ]),
367
- createElementVNode("h4", _hoisted_27, toDisplayString($options.t('nextcloud-vue', 'Recent log lines of this step')), 1 /* TEXT */),
390
+ createElementVNode("h4", _hoisted_28, toDisplayString($options.t('nextcloud-vue', 'Recent log lines of this step')), 1 /* TEXT */),
368
391
  createVNode(_component_CnFlowStepLog, {
369
392
  lines: $options.recentStepLines,
370
393
  withDay: "",
371
394
  emptyText: $options.t('nextcloud-vue', 'This step has not run yet.')
372
395
  }, null, 8 /* PROPS */, ["lines", "emptyText"]),
373
- createElementVNode("div", _hoisted_28, [
396
+ createElementVNode("div", _hoisted_29, [
374
397
  createVNode(_component_NcButton, {
375
398
  variant: "tertiary",
376
399
  disabled: $setup.store.graphLocked,
377
400
  "data-testid": "flow-board-delete-step",
378
- onClick: _cache[13] || (_cache[13] = $event => ($setup.store.removeNode($setup.store.selectedNodeId)))
401
+ onClick: _cache[11] || (_cache[11] = $event => ($setup.store.removeNode($setup.store.selectedNodeId)))
379
402
  }, {
380
403
  default: withCtx(() => [
381
404
  createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Delete step')), 1 /* TEXT */)
@@ -384,7 +407,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
384
407
  }, 8 /* PROPS */, ["disabled"]),
385
408
  createVNode(_component_NcButton, {
386
409
  "data-testid": "flow-board-done",
387
- onClick: _cache[14] || (_cache[14] = $event => ($setup.store.selectedNodeId = null))
410
+ onClick: _cache[12] || (_cache[12] = $event => ($setup.store.selectedNodeId = null))
388
411
  }, {
389
412
  default: withCtx(() => [
390
413
  createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Done')), 1 /* TEXT */)
@@ -393,10 +416,34 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
393
416
  })
394
417
  ])
395
418
  ], 64 /* STABLE_FRAGMENT */))
396
- : (openBlock(), createBlock(_component_CnFlowSidebar, {
397
- key: 2,
398
- embedded: ""
399
- }))
419
+ : ($data.showRuns)
420
+ ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [
421
+ createVNode(_component_NcButton, {
422
+ variant: "tertiary",
423
+ class: "cn-flow-board__runs-back",
424
+ "data-testid": "flow-board-hide-runs",
425
+ onClick: _cache[13] || (_cache[13] = $event => ($data.showRuns = false))
426
+ }, {
427
+ default: withCtx(() => [
428
+ createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Back to the step settings')), 1 /* TEXT */)
429
+ ]),
430
+ _: 1 /* STABLE */
431
+ }),
432
+ createVNode(_component_CnFlowSidebar, { embedded: "" })
433
+ ], 64 /* STABLE_FRAGMENT */))
434
+ : (openBlock(), createElementBlock("div", _hoisted_30, [
435
+ createElementVNode("p", null, toDisplayString($options.t('nextcloud-vue', 'Select a step on the canvas to see its settings.')), 1 /* TEXT */),
436
+ createVNode(_component_NcButton, {
437
+ variant: "secondary",
438
+ "data-testid": "flow-board-show-runs",
439
+ onClick: _cache[14] || (_cache[14] = $event => ($data.showRuns = true))
440
+ }, {
441
+ default: withCtx(() => [
442
+ createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Show runs')), 1 /* TEXT */)
443
+ ]),
444
+ _: 1 /* STABLE */
445
+ })
446
+ ]))
400
447
  ])
401
448
  ])
402
449
  ], 2 /* CLASS */))