@conduction/nextcloud-vue 2.121.0 → 2.123.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +1 -0
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue.js +1 -1
- package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue2.js +18 -4
- package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue3.js +63 -32
- package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +35 -0
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +11 -5
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +13 -0
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +37 -5
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +40 -0
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +71 -65
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue.js +1 -1
- package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue2.js +20 -0
- package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue3.js +2 -1
- package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue.js +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js +2 -0
- package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js +49 -44
- package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js +10 -0
- package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js +2 -1
- package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js.map +1 -1
- package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue2.js +31 -0
- package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue2.js.map +1 -1
- package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue3.js +4 -3
- package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +34 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +1 -0
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +2 -0
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +2 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +1 -1
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +31 -1
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +14 -4
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -1
- package/dist/esm/composables/flowGraphLayout.js +36 -7
- package/dist/esm/composables/flowGraphLayout.js.map +1 -1
- package/dist/esm/composables/useFlowStore.js +7 -3
- package/dist/esm/composables/useFlowStore.js.map +1 -1
- package/dist/esm/l10n/en.json.js +3 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +3 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +670 -316
- package/dist/esm/utils/manifestTranslate.js +12 -3
- package/dist/esm/utils/manifestTranslate.js.map +1 -1
- package/dist/esm/utils/routeFilters.js +3 -3
- package/dist/esm/utils/routeFilters.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +1218 -847
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +670 -316
- package/l10n/en.json +3 -1
- package/l10n/nl.json +3 -1
- package/package.json +1 -1
- package/src/components/CnAppRoot/CnAppRoot.vue +1 -0
- package/src/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue +50 -5
- package/src/components/CnChartWidget/CnChartWidget.vue +10 -8
- package/src/components/CnDetailPage/CnDetailPage.md +10 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +42 -1
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +39 -0
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +95 -37
- package/src/components/CnFlowDetail/CnFlowDetail.vue +21 -0
- package/src/components/CnFlowsPage/CnFlowBoard.vue +35 -18
- package/src/components/CnFlowsPage/CnFlowEditorPage.vue +11 -0
- package/src/components/CnGraphCanvas/CnGraphCanvas.vue +34 -2
- package/src/components/CnIndexPage/CnIndexPage.vue +34 -2
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +1 -0
- package/src/components/CnObjectSidebar/CnFilesTab.vue +3 -0
- package/src/components/CnSectionsWidget/CnSectionsWidget.vue +53 -2
- package/src/composables/flowGraphLayout.js +35 -6
- package/src/composables/useFlowStore.js +7 -3
- package/src/css/detail-page.css +6 -0
- package/src/css/look-board-detail.css +53 -6
- package/src/css/look-board-index.css +151 -12
- package/src/css/look-board.css +116 -4
- package/src/utils/manifestTranslate.js +12 -3
- package/src/utils/routeFilters.js +3 -3
|
@@ -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=\"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/* The board page's padding, so the title stands where every board page puts it (DqFlow). */\n.cn-flow-board {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: var(--cn-board-content-padding, 24px 28px);\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/* A step is a plain 400 label (DqFlow \"Status zetten\"); the nldesign theme\n sets every button's weight with `!important` through its token. */\n.cn-flow-board__palette-step {\n\t--nldesign-component-button-font-weight: 400;\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\tfont-weight: 400;\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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"}
|
|
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\"\n\t\t\t\tclass=\"cn-flow-board__card cn-flow-board__palette\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Steps')\"\n\t\t\t\tdata-testid=\"flow-board-palette\">\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:layoutDirection=\"flowDirection === 'down' ? 'down' : 'right'\"\n\t\t\t\t\t:fitMaxZoom=\"flowDirection === 'down' ? 1 : 0\"\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<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<!-- The step type as a pill under the name (DqFlow \"Beslistabel van OpenRegister\"). -->\n\t\t\t\t\t<CnStatusBadge :label=\"stepTypeLabel\"\n\t\t\t\t\t\tvariant=\"purple\"\n\t\t\t\t\t\tclass=\"cn-flow-board__step-type\"\n\t\t\t\t\t\tdata-testid=\"flow-board-step-type\" />\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/** `down` runs the steps top to bottom and opens them at their own size (DqFlow); default `right`, left to right and fitted. */\n\t\tflowDirection: { type: String, default: 'right' },\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/* The board page's padding, so the title stands where every board page puts it (DqFlow). */\n.cn-flow-board {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: var(--cn-board-content-padding, 24px 28px);\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/* Palette, canvas and inspector at 220 / rest / 280 (DqFlow). */\n.cn-flow-board--with-palette .cn-flow-board__body {\n\tgrid-template-columns: 220px minmax(0, 1fr) 280px;\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/* The canvas is the white card with the dot grid; the palette beside it sits\n on the page ground (DqFlow). */\n.cn-flow-board__canvas {\n\tpadding: 0;\n\toverflow: hidden;\n\tbackground-color: var(--color-main-background);\n\tbackground-image: radial-gradient(var(--color-border) 1px, transparent 1px);\n\tbackground-size: 16px 16px;\n}\n\n.cn-flow-board__palette {\n\tgap: 14px;\n\tpadding: 14px;\n\tbackground: transparent;\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__step-type {\n\talign-self: flex-start;\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: 6px;\n}\n\n/* The providing app as a small caps label, no title row above the groups. */\n.cn-flow-board__palette-app {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tletter-spacing: 0.06em;\n\ttext-transform: uppercase;\n}\n\n.cn-flow-board__palette-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n/* A step is a plain 400 label (DqFlow \"Status zetten\"); the nldesign theme\n sets every button's weight with `!important` through its token. */\n.cn-flow-board__palette-step {\n\t--nldesign-component-button-font-weight: 400;\n\twidth: 100%;\n\tmin-height: 34px;\n\tpadding: 8px 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\tfont-size: 14px;\n\tfont-weight: 400;\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":";;;;;;;;;;;;;;;;AA0QA;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,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS;;AAEjD,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;AACN,EAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAM,EAAA;EAC1F;;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;;AAED;;;AAGC;AACA;AACA;;AAED,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,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAA,IAAK,GAAG,EAAE,OAAO,EAAE,EAAG,GAAA;AACnE,KAAA;AACA,IAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAA;IAC9B,EAAA;AACD,GAAA,MAAM,IAAG,GAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAA;GACjC,MAAM,IAAG,GAAI,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAI,KAAI,IAAI,CAAC,GAAG,EAAA;AAC7D,GAAA,OAAO,IAAG,GAAI,CAAA,GAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAK,GAAE,CAAC,CAAC,CAAA,GAAI,IAAG;GACrF;;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;;;AAGC;AACA;AACA;;AAED,EAAA,YAAY,GAAG;AACd,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,MAAM,MAAO,GAAE,CAAC,IAAG,IAAK,IAAI,CAAC,MAAM,KAAK,GAAC;AACzC,GAAA,MAAM,IAAG,GAAI,CAAC,KAAI,IAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAS,GAAI,GAAC;AAC9E,GAAA,OAAO,IAAG;KACR,MAAM,CAAC,CAAC,KAAK,KAAK,KAAI,IAAK,KAAK,CAAC,GAAE,IAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAE,KAAI,SAAQ,IAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAE,KAAI,IAAK,IAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAA,KAAM,EAAE,CAAA;AAClI,KAAC,GAAG,CAAC,CAAC,KAAK,KAAK;KACf,MAAM,GAAE,GAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAA;AAC5B,KAAA,MAAM,MAAO,GAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAA,GAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAE,IAAG,CAAC,CAAC,KAAM,KAAI,GAAG,IAAI,KAAG;AACnG,KAAA,IAAI,MAAI;KACR,IAAI,MAAM,EAAE;AACX,MAAA,KAAM,GAAE,MAAM,CAAC,MAAM,CAAC,KAAM,IAAG,MAAM,CAAC,KAAK,EAAA;AAC5C,MAAA,MAAO,IAAI,OAAO,GAAE,KAAM,SAAS,EAAE;AACpC,MAAA,KAAI,GAAI,GAAE,GAAI,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,KAAK,CAAA,GAAI,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,EAAA;MAC1E,MAAK,IAAI,OAAO,GAAI,KAAI,QAAQ,EAAE;MACnC,KAAI,GAAI,IAAI,CAAC,SAAS,CAAC,GAAG,EAAA;MACzB,MAAK;AACN,MAAA,KAAI,GAAI,MAAM,CAAC,GAAG,EAAA;AACnB,MAAA;KACA,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAM,IAAG,KAAK,CAAC,GAAG,EAAE,KAAM,EAAA;KAChE,CAAA;GACF;;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,KAAK,EAAE;;AAEN,EAAA,sBAAsB,EAAE,SAAS,EAAE,EAAE;AACpC,GAAA,IAAI,EAAE,EAAE;AACP,IAAA,IAAI,CAAC,QAAS,GAAE,MAAI;AACrB,IAAA;GACA;EACD;;AAED,CAAA,MAAM,OAAO,GAAG;;AAEf;EACA,IAAI,IAAI,CAAC,OAAQ,KAAI,QAAQ,EAAE;GAC9B,MAAK;AACN,GAAA;EACA,MAAM,EAAE,OAAO,EAAE,OAAQ,GAAE,MAAM,OAAO,kBAAkB,EAAA;AAC1D,EAAA,IAAI,CAAC,QAAS,GAAE,MAAM,eAAe,CAAC,KAAK,EAAA;EAC3C;;AAED,CAAA,OAAO,EAAE;AACR;;AAEC;;;AAGD,EAAA,KAAK,GAAG;AACP,GAAA,IAAI,CAAC,QAAO,GAAI,KAAG;AACnB,GAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAA;GAChB;;AAED;;;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;;;;"}
|
|
@@ -23,48 +23,42 @@ const _hoisted_10 = {
|
|
|
23
23
|
class: "cn-flow-board__meta"
|
|
24
24
|
};
|
|
25
25
|
const _hoisted_11 = { class: "cn-flow-board__body" };
|
|
26
|
-
const _hoisted_12 =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const _hoisted_13 = { class: "cn-flow-board__card-title" };
|
|
32
|
-
const _hoisted_14 = { class: "cn-flow-board__palette-app" };
|
|
33
|
-
const _hoisted_15 = { class: "cn-flow-board__palette-list" };
|
|
34
|
-
const _hoisted_16 = ["disabled", "data-testid", "onClick"];
|
|
35
|
-
const _hoisted_17 = {
|
|
26
|
+
const _hoisted_12 = ["aria-label"];
|
|
27
|
+
const _hoisted_13 = { class: "cn-flow-board__palette-app" };
|
|
28
|
+
const _hoisted_14 = { class: "cn-flow-board__palette-list" };
|
|
29
|
+
const _hoisted_15 = ["disabled", "data-testid", "onClick"];
|
|
30
|
+
const _hoisted_16 = {
|
|
36
31
|
key: 0,
|
|
37
32
|
class: "cn-flow-board__palette-note"
|
|
38
33
|
};
|
|
39
|
-
const
|
|
40
|
-
const
|
|
34
|
+
const _hoisted_17 = ["aria-label"];
|
|
35
|
+
const _hoisted_18 = {
|
|
41
36
|
key: 0,
|
|
42
37
|
class: "cn-flow-board__legend",
|
|
43
38
|
"data-testid": "flow-board-legend"
|
|
44
39
|
};
|
|
45
|
-
const
|
|
40
|
+
const _hoisted_19 = {
|
|
46
41
|
class: "cn-flow-board__card cn-flow-board__inspector",
|
|
47
42
|
"data-testid": "flow-board-inspector"
|
|
48
43
|
};
|
|
49
|
-
const
|
|
44
|
+
const _hoisted_20 = {
|
|
50
45
|
class: "cn-flow-board__tabs",
|
|
51
46
|
role: "tablist"
|
|
52
47
|
};
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
const _hoisted_25 = {
|
|
48
|
+
const _hoisted_21 = ["aria-selected", "data-testid", "onClick"];
|
|
49
|
+
const _hoisted_22 = { class: "cn-flow-board__tab-count" };
|
|
50
|
+
const _hoisted_23 = {
|
|
57
51
|
class: "cn-flow-board__card-title",
|
|
58
52
|
"data-testid": "flow-board-step-name"
|
|
59
53
|
};
|
|
60
|
-
const
|
|
54
|
+
const _hoisted_24 = {
|
|
61
55
|
key: 0,
|
|
62
56
|
class: "cn-flow-board__settings"
|
|
63
57
|
};
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const
|
|
58
|
+
const _hoisted_25 = { class: "cn-flow-board__step-actions" };
|
|
59
|
+
const _hoisted_26 = { class: "cn-flow-board__subtitle" };
|
|
60
|
+
const _hoisted_27 = { class: "cn-flow-board__step-footer" };
|
|
61
|
+
const _hoisted_28 = {
|
|
68
62
|
key: 3,
|
|
69
63
|
class: "cn-flow-board__inspector-empty",
|
|
70
64
|
"data-testid": "flow-board-inspector-empty"
|
|
@@ -249,15 +243,19 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
249
243
|
: createCommentVNode("v-if", true),
|
|
250
244
|
createElementVNode("div", _hoisted_11, [
|
|
251
245
|
($options.showPalette)
|
|
252
|
-
? (openBlock(), createElementBlock("aside",
|
|
253
|
-
|
|
246
|
+
? (openBlock(), createElementBlock("aside", {
|
|
247
|
+
key: 0,
|
|
248
|
+
class: "cn-flow-board__card cn-flow-board__palette",
|
|
249
|
+
"aria-label": $options.t('nextcloud-vue', 'Steps'),
|
|
250
|
+
"data-testid": "flow-board-palette"
|
|
251
|
+
}, [
|
|
254
252
|
(openBlock(true), createElementBlock(Fragment, null, renderList($options.paletteGroups, (group) => {
|
|
255
253
|
return (openBlock(), createElementBlock("section", {
|
|
256
254
|
key: group.app,
|
|
257
255
|
class: "cn-flow-board__palette-group"
|
|
258
256
|
}, [
|
|
259
|
-
createElementVNode("h4",
|
|
260
|
-
createElementVNode("ul",
|
|
257
|
+
createElementVNode("h4", _hoisted_13, toDisplayString(group.name), 1 /* TEXT */),
|
|
258
|
+
createElementVNode("ul", _hoisted_14, [
|
|
261
259
|
(openBlock(true), createElementBlock(Fragment, null, renderList(group.entries, (entry) => {
|
|
262
260
|
return (openBlock(), createElementBlock("li", {
|
|
263
261
|
key: entry.id
|
|
@@ -268,16 +266,16 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
268
266
|
disabled: $setup.store.graphLocked,
|
|
269
267
|
"data-testid": `flow-board-palette-${entry.id}`,
|
|
270
268
|
onClick: $event => ($setup.store.addNode(entry.id))
|
|
271
|
-
}, toDisplayString(entry.displayName || entry.label || entry.id), 9 /* TEXT, PROPS */,
|
|
269
|
+
}, toDisplayString(entry.displayName || entry.label || entry.id), 9 /* TEXT, PROPS */, _hoisted_15)
|
|
272
270
|
]))
|
|
273
271
|
}), 128 /* KEYED_FRAGMENT */))
|
|
274
272
|
])
|
|
275
273
|
]))
|
|
276
274
|
}), 128 /* KEYED_FRAGMENT */)),
|
|
277
275
|
($props.paletteFootnote)
|
|
278
|
-
? (openBlock(), createElementBlock("p",
|
|
276
|
+
? (openBlock(), createElementBlock("p", _hoisted_16, toDisplayString($props.paletteFootnote), 1 /* TEXT */))
|
|
279
277
|
: createCommentVNode("v-if", true)
|
|
280
|
-
]))
|
|
278
|
+
], 8 /* PROPS */, _hoisted_12))
|
|
281
279
|
: createCommentVNode("v-if", true),
|
|
282
280
|
createElementVNode("section", {
|
|
283
281
|
class: "cn-flow-board__card cn-flow-board__canvas",
|
|
@@ -287,13 +285,15 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
287
285
|
id: $props.id,
|
|
288
286
|
app: $props.app,
|
|
289
287
|
run: $props.run,
|
|
288
|
+
layoutDirection: $props.flowDirection === 'down' ? 'down' : 'right',
|
|
289
|
+
fitMaxZoom: $props.flowDirection === 'down' ? 1 : 0,
|
|
290
290
|
toolbarActions: false,
|
|
291
291
|
addStep: !$options.showPalette,
|
|
292
292
|
onSave: _cache[8] || (_cache[8] = $event => (_ctx.$emit('save'))),
|
|
293
293
|
onRun: $options.onRun
|
|
294
|
-
}, null, 8 /* PROPS */, ["id", "app", "run", "addStep", "onRun"]),
|
|
294
|
+
}, null, 8 /* PROPS */, ["id", "app", "run", "layoutDirection", "fitMaxZoom", "addStep", "onRun"]),
|
|
295
295
|
($setup.store.inRunView)
|
|
296
|
-
? (openBlock(), createElementBlock("div",
|
|
296
|
+
? (openBlock(), createElementBlock("div", _hoisted_18, [
|
|
297
297
|
(openBlock(true), createElementBlock(Fragment, null, renderList($options.legend, (level) => {
|
|
298
298
|
return (openBlock(), createElementBlock("span", {
|
|
299
299
|
key: level.id,
|
|
@@ -313,8 +313,8 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
313
313
|
role: "status",
|
|
314
314
|
"data-testid": "flow-board-validity"
|
|
315
315
|
}, toDisplayString($options.validity.text), 3 /* TEXT, CLASS */))
|
|
316
|
-
], 8 /* PROPS */,
|
|
317
|
-
createElementVNode("aside",
|
|
316
|
+
], 8 /* PROPS */, _hoisted_17),
|
|
317
|
+
createElementVNode("aside", _hoisted_19, [
|
|
318
318
|
($setup.store.inRunView)
|
|
319
319
|
? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
|
|
320
320
|
createVNode(_component_CnFlowRunSummary, {
|
|
@@ -324,7 +324,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
324
324
|
onBack: $options.onBackToFlow,
|
|
325
325
|
onRetry: $options.onRetry
|
|
326
326
|
}, null, 8 /* PROPS */, ["run", "stepsTotal", "canRetry", "onBack", "onRetry"]),
|
|
327
|
-
createElementVNode("div",
|
|
327
|
+
createElementVNode("div", _hoisted_20, [
|
|
328
328
|
(openBlock(true), createElementBlock(Fragment, null, renderList($options.runTabs, (tab) => {
|
|
329
329
|
return (openBlock(), createElementBlock("button", {
|
|
330
330
|
key: tab.id,
|
|
@@ -336,8 +336,8 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
336
336
|
onClick: $event => ($data.runTab = tab.id)
|
|
337
337
|
}, [
|
|
338
338
|
createTextVNode(toDisplayString(tab.label) + " ", 1 /* TEXT */),
|
|
339
|
-
createElementVNode("span",
|
|
340
|
-
], 10 /* CLASS, PROPS */,
|
|
339
|
+
createElementVNode("span", _hoisted_22, toDisplayString(tab.count), 1 /* TEXT */)
|
|
340
|
+
], 10 /* CLASS, PROPS */, _hoisted_21))
|
|
341
341
|
}), 128 /* KEYED_FRAGMENT */))
|
|
342
342
|
]),
|
|
343
343
|
createVNode(_component_CnFlowStepLog, {
|
|
@@ -347,10 +347,15 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
347
347
|
], 64 /* STABLE_FRAGMENT */))
|
|
348
348
|
: ($setup.store.selectedNode)
|
|
349
349
|
? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
350
|
-
createElementVNode("
|
|
351
|
-
|
|
350
|
+
createElementVNode("h3", _hoisted_23, toDisplayString($options.stepName), 1 /* TEXT */),
|
|
351
|
+
createVNode(_component_CnStatusBadge, {
|
|
352
|
+
label: $options.stepTypeLabel,
|
|
353
|
+
variant: "purple",
|
|
354
|
+
class: "cn-flow-board__step-type",
|
|
355
|
+
"data-testid": "flow-board-step-type"
|
|
356
|
+
}, null, 8 /* PROPS */, ["label"]),
|
|
352
357
|
($options.stepSettings.length > 0)
|
|
353
|
-
? (openBlock(), createElementBlock("dl",
|
|
358
|
+
? (openBlock(), createElementBlock("dl", _hoisted_24, [
|
|
354
359
|
(openBlock(true), createElementBlock(Fragment, null, renderList($options.stepSettings, (setting) => {
|
|
355
360
|
return (openBlock(), createElementBlock("div", {
|
|
356
361
|
key: setting.key,
|
|
@@ -363,7 +368,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
363
368
|
}), 128 /* KEYED_FRAGMENT */))
|
|
364
369
|
]))
|
|
365
370
|
: createCommentVNode("v-if", true),
|
|
366
|
-
createElementVNode("div",
|
|
371
|
+
createElementVNode("div", _hoisted_25, [
|
|
367
372
|
createVNode(_component_NcButton, {
|
|
368
373
|
"data-testid": "flow-board-edit-step",
|
|
369
374
|
onClick: _cache[9] || (_cache[9] = $event => ($setup.store.editingNodeId = $setup.store.selectedNodeId))
|
|
@@ -387,13 +392,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
387
392
|
}))
|
|
388
393
|
: createCommentVNode("v-if", true)
|
|
389
394
|
]),
|
|
390
|
-
createElementVNode("h4",
|
|
395
|
+
createElementVNode("h4", _hoisted_26, toDisplayString($options.t('nextcloud-vue', 'Recent log lines of this step')), 1 /* TEXT */),
|
|
391
396
|
createVNode(_component_CnFlowStepLog, {
|
|
392
397
|
lines: $options.recentStepLines,
|
|
393
398
|
withDay: "",
|
|
394
399
|
emptyText: $options.t('nextcloud-vue', 'This step has not run yet.')
|
|
395
400
|
}, null, 8 /* PROPS */, ["lines", "emptyText"]),
|
|
396
|
-
createElementVNode("div",
|
|
401
|
+
createElementVNode("div", _hoisted_27, [
|
|
397
402
|
createVNode(_component_NcButton, {
|
|
398
403
|
variant: "tertiary",
|
|
399
404
|
disabled: $setup.store.graphLocked,
|
|
@@ -431,7 +436,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
431
436
|
}),
|
|
432
437
|
createVNode(_component_CnFlowSidebar, { embedded: "" })
|
|
433
438
|
], 64 /* STABLE_FRAGMENT */))
|
|
434
|
-
: (openBlock(), createElementBlock("div",
|
|
439
|
+
: (openBlock(), createElementBlock("div", _hoisted_28, [
|
|
435
440
|
createElementVNode("p", null, toDisplayString($options.t('nextcloud-vue', 'Select a step on the canvas to see its settings.')), 1 /* TEXT */),
|
|
436
441
|
createVNode(_component_NcButton, {
|
|
437
442
|
variant: "secondary",
|