@conduction/nextcloud-vue 2.119.0 → 2.120.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js +9 -0
  2. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js.map +1 -0
  3. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js +226 -0
  4. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js.map +1 -0
  5. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js +211 -0
  6. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js.map +1 -0
  7. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js +9 -0
  8. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js.map +1 -0
  9. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js +64 -0
  10. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js.map +1 -0
  11. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js +89 -0
  12. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js.map +1 -0
  13. package/dist/esm/components/CnIcon/semanticIcons.js +2 -2
  14. package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
  15. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js +9 -0
  16. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js.map +1 -0
  17. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js +257 -0
  18. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js.map +1 -0
  19. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js +266 -0
  20. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js.map +1 -0
  21. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue.js +1 -1
  22. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js +14 -7
  23. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js.map +1 -1
  24. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue3.js.map +1 -1
  25. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js +9 -0
  26. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js.map +1 -0
  27. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js +278 -0
  28. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js.map +1 -0
  29. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js +128 -0
  30. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js.map +1 -0
  31. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js +10 -0
  32. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js.map +1 -0
  33. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js +944 -0
  34. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js.map +1 -0
  35. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js +276 -0
  36. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js.map +1 -0
  37. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js +9 -0
  38. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js.map +1 -0
  39. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js +354 -0
  40. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js.map +1 -0
  41. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js +392 -0
  42. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js.map +1 -0
  43. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js +9 -0
  44. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js.map +1 -0
  45. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js +180 -0
  46. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js.map +1 -0
  47. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js +208 -0
  48. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js.map +1 -0
  49. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js +9 -0
  50. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js.map +1 -0
  51. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js +244 -0
  52. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js.map +1 -0
  53. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js +76 -0
  54. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js.map +1 -0
  55. package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js +290 -0
  56. package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js.map +1 -0
  57. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +9 -0
  58. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js.map +1 -0
  59. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +448 -0
  60. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -0
  61. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +303 -0
  62. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -0
  63. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +1 -1
  64. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +19 -2
  65. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
  66. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js +73 -62
  67. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +6 -0
  69. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  70. package/dist/esm/index.js +5 -0
  71. package/dist/esm/index.js.map +1 -1
  72. package/dist/esm/l10n/en.json.js +166 -1
  73. package/dist/esm/l10n/en.json.js.map +1 -1
  74. package/dist/esm/l10n/nl.json.js +166 -1
  75. package/dist/esm/l10n/nl.json.js.map +1 -1
  76. package/dist/esm/library-style.js +1 -1
  77. package/dist/esm/nextcloud-vue.css +889 -101
  78. package/dist/esm/utils/aiFeatures.js +245 -0
  79. package/dist/esm/utils/aiFeatures.js.map +1 -0
  80. package/dist/esm/utils/aiSuggestionTracker.js +182 -0
  81. package/dist/esm/utils/aiSuggestionTracker.js.map +1 -0
  82. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  83. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  84. package/dist/esm/utils/objectPermissions.js +552 -0
  85. package/dist/esm/utils/objectPermissions.js.map +1 -0
  86. package/dist/esm/utils/objectTranslations.js +180 -0
  87. package/dist/esm/utils/objectTranslations.js.map +1 -0
  88. package/dist/esm/utils/stateMachineValidation.js +254 -0
  89. package/dist/esm/utils/stateMachineValidation.js.map +1 -0
  90. package/dist/esm/utils/widgetDispatch.js +3 -1
  91. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  92. package/dist/nextcloud-vue.cjs.js +20052 -13138
  93. package/dist/nextcloud-vue.cjs.js.map +2 -2
  94. package/dist/nextcloud-vue.css +889 -101
  95. package/l10n/en.json +166 -1
  96. package/l10n/nl.json +166 -1
  97. package/package.json +1 -1
  98. package/src/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue +416 -0
  99. package/src/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue +136 -0
  100. package/src/components/CnAiFeaturesWidget/__tests__/CnAiFeaturesWidget.spec.js +213 -0
  101. package/src/components/CnAiFeaturesWidget/index.js +14 -0
  102. package/src/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue +499 -0
  103. package/src/components/CnObjectPermissionsTab/__tests__/CnObjectPermissionsTab.spec.js +186 -0
  104. package/src/components/CnObjectPermissionsTab/index.js +13 -0
  105. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +8 -1
  106. package/src/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue +424 -0
  107. package/src/components/CnObjectTranslationsWidget/__tests__/CnObjectTranslationsWidget.spec.js +189 -0
  108. package/src/components/CnObjectTranslationsWidget/index.js +13 -0
  109. package/src/components/CnStateMachineEditor/CnStateMachineEditor.vue +1332 -0
  110. package/src/components/CnStateMachineEditor/CnStateMachineFields.vue +791 -0
  111. package/src/components/CnStateMachineEditor/CnStateMachineNode.vue +442 -0
  112. package/src/components/CnStateMachineEditor/CnStateMachinePanel.vue +326 -0
  113. package/src/components/CnStateMachineEditor/index.js +8 -0
  114. package/src/components/CnStateMachineEditor/stateMachineFields.js +287 -0
  115. package/src/components/CnTimelineWidget/CnTimelineManage.vue +827 -0
  116. package/src/components/CnTimelineWidget/CnTimelineWidget.vue +29 -3
  117. package/src/components/CnWidgetGrid/builtInWidgets.js +6 -0
  118. package/src/components/index.js +4 -0
  119. package/src/index.js +5 -0
  120. package/src/utils/aiFeatures.js +241 -0
  121. package/src/utils/aiSuggestionTracker.js +178 -0
  122. package/src/utils/libraryWidgetKeys.js +1 -0
  123. package/src/utils/objectPermissions.js +548 -0
  124. package/src/utils/objectTranslations.js +176 -0
  125. package/src/utils/stateMachineValidation.js +250 -0
  126. package/src/utils/widgetDispatch.js +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnStateMachineEditor.vue2.js","sources":["../../../../src/components/CnStateMachineEditor/CnStateMachineEditor.vue"],"sourcesContent":["<!--\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-state-machine-editor\" :style=\"rootStyle\">\n\t\t<!-- Issues found by validate(), and refusals of an edit. Text says the\n\t\t severity, so it does not rest on colour. -->\n\t\t<div\n\t\t\tv-if=\"issues.length > 0\"\n\t\t\tclass=\"cn-state-machine-editor__issues\"\n\t\t\t:class=\"hasErrors ? 'cn-state-machine-editor__issues--error' : 'cn-state-machine-editor__issues--warning'\"\n\t\t\trole=\"alert\"\n\t\t\tdata-testid=\"cn-state-machine-issues\">\n\t\t\t<ul class=\"cn-state-machine-editor__issue-list\">\n\t\t\t\t<li\n\t\t\t\t\tv-for=\"(issue, index) in issues\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"cn-state-machine-editor__issue\"\n\t\t\t\t\t:class=\"`cn-state-machine-editor__issue--${issue.type}`\">\n\t\t\t\t\t<AlertCircle v-if=\"issue.type === 'error'\" :size=\"18\" />\n\t\t\t\t\t<Alert v-else :size=\"18\" />\n\t\t\t\t\t<span class=\"cn-state-machine-editor__sr\">{{ issue.type === 'error' ? t('nextcloud-vue', 'Error:') : t('nextcloud-vue', 'Warning:') }}</span>\n\t\t\t\t\t<span>{{ issue.message }}</span>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<NcButton variant=\"tertiary\" @click=\"issues = []\">\n\t\t\t\t{{ say('dismiss') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<div class=\"cn-state-machine-editor__layout\">\n\t\t\t<!-- Palette: drag a state onto the canvas, or add one with the button. -->\n\t\t\t<section\n\t\t\t\tv-if=\"!readOnly\"\n\t\t\t\tclass=\"cn-state-machine-editor__palette\"\n\t\t\t\t:aria-labelledby=\"`${uid}-palette`\">\n\t\t\t\t<h3 :id=\"`${uid}-palette`\" class=\"cn-state-machine-editor__palette-title\">\n\t\t\t\t\t{{ say('paletteTitle') }}\n\t\t\t\t</h3>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"cn-state-machine-editor__palette-item\"\n\t\t\t\t\tdraggable=\"true\"\n\t\t\t\t\tdata-testid=\"cn-state-machine-palette-state\"\n\t\t\t\t\t@dragstart=\"onPaletteDragStart\">\n\t\t\t\t\t<SquareOutline :size=\"18\" />\n\t\t\t\t\t<span>{{ say('paletteItem') }}</span>\n\t\t\t\t</div>\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\twide\n\t\t\t\t\tdata-testid=\"cn-state-machine-add-state\"\n\t\t\t\t\t@click=\"addStateFromKeyboard\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ say('addState') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<div class=\"cn-state-machine-editor__help\">\n\t\t\t\t\t<p v-for=\"(line, index) in paletteHelp\" :key=\"index\">\n\t\t\t\t\t\t{{ line }}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<h3 class=\"cn-state-machine-editor__palette-title\">\n\t\t\t\t\t{{ say('controlsTitle') }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-state-machine-editor__controls\">\n\t\t\t\t\t<template v-for=\"(control, index) in controlsHelp\" :key=\"index\">\n\t\t\t\t\t\t<dt>{{ control.term }}</dt>\n\t\t\t\t\t\t<dd>{{ control.text }}</dd>\n\t\t\t\t\t</template>\n\t\t\t\t</dl>\n\t\t\t</section>\n\n\t\t\t<section\n\t\t\t\tclass=\"cn-state-machine-editor__canvas\"\n\t\t\t\t:aria-label=\"say('canvasLabel')\"\n\t\t\t\tdata-testid=\"cn-state-machine-canvas\">\n\t\t\t\t<CnGraphCanvas\n\t\t\t\t\t:nodes=\"canvasNodes\"\n\t\t\t\t\t:edges=\"canvasEdges\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:snapToGrid=\"false\"\n\t\t\t\t\t:fitView=\"fitView\"\n\t\t\t\t\t@nodesChange=\"onNodesChange\"\n\t\t\t\t\t@edgesChange=\"onEdgesChange\"\n\t\t\t\t\t@connect=\"onConnect\"\n\t\t\t\t\t@nodeSelect=\"onNodeSelect\"\n\t\t\t\t\t@nodeActivate=\"selectState\"\n\t\t\t\t\t@nodeRemove=\"requestStateRemoval\"\n\t\t\t\t\t@nodeMenu=\"menuOpenFor = $event.id\"\n\t\t\t\t\t@edgeSelect=\"onEdgeSelect\"\n\t\t\t\t\t@edgeLabelClick=\"selectTransition\"\n\t\t\t\t\t@edgeLabelMove=\"onEdgeLabelMove\"\n\t\t\t\t\t@canvasClick=\"clearSelection\"\n\t\t\t\t\t@canvasDrop=\"onCanvasDrop\">\n\t\t\t\t\t<template #node=\"{ node }\">\n\t\t\t\t\t\t<CnStateMachineNode\n\t\t\t\t\t\t\t:label=\"stateLabel(node.id)\"\n\t\t\t\t\t\t\t:final=\"isFinal(node.id)\"\n\t\t\t\t\t\t\t:steps=\"stepsOf(node.id)\"\n\t\t\t\t\t\t\t:showSteps=\"showSteps\"\n\t\t\t\t\t\t\t:stepKeys=\"stepKeys\"\n\t\t\t\t\t\t\t:selectedStepId=\"selection.kind === 'step' ? selection.id : null\"\n\t\t\t\t\t\t\t:connectTargets=\"connectTargetsOf(node.id)\"\n\t\t\t\t\t\t\t:outgoing=\"outgoingOf(node.id)\"\n\t\t\t\t\t\t\t:menuOpen=\"menuOpenFor === node.id\"\n\t\t\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t\t\t:say=\"say\"\n\t\t\t\t\t\t\t@update:menuOpen=\"onMenuToggle(node.id, $event)\"\n\t\t\t\t\t\t\t@connect=\"connect(node.id, $event)\"\n\t\t\t\t\t\t\t@disconnect=\"removeTransition\"\n\t\t\t\t\t\t\t@editTransition=\"selectTransition\"\n\t\t\t\t\t\t\t@addStep=\"addStep(node.id)\"\n\t\t\t\t\t\t\t@deleteState=\"requestStateRemoval(node.id)\"\n\t\t\t\t\t\t\t@stepClick=\"selectStep\"\n\t\t\t\t\t\t\t@stepMove=\"moveStep(node.id, $event)\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #edge-label=\"{ edge }\">\n\t\t\t\t\t\t<span class=\"cn-state-machine-editor__edge-label\">{{ transitionText(edge.id) }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t</CnGraphCanvas>\n\t\t\t</section>\n\n\t\t\t<aside\n\t\t\t\tclass=\"cn-state-machine-editor__properties\"\n\t\t\t\t:aria-label=\"say('propertiesLabel')\"\n\t\t\t\tdata-testid=\"cn-state-machine-properties\">\n\t\t\t\t<CnStateMachinePanel\n\t\t\t\t\tv-if=\"selectedStep\"\n\t\t\t\t\t:key=\"`step-${selectedStep.id}`\"\n\t\t\t\t\t:record=\"selectedStep\"\n\t\t\t\t\t:fields=\"stepFields\"\n\t\t\t\t\t:title=\"say('stepPanelTitle')\"\n\t\t\t\t\t:subtitle=\"stateLabel(selectedStep[keys.stepState])\"\n\t\t\t\t\t:closeLabel=\"say('closeStepPanel')\"\n\t\t\t\t\t:deleteLabel=\"say('deleteStep')\"\n\t\t\t\t\t:canDelete=\"!locked\"\n\t\t\t\t\t:locked=\"locked\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:optionSets=\"optionSets\"\n\t\t\t\t\t:translate=\"tr\"\n\t\t\t\t\t:uid=\"`${uid}-step`\"\n\t\t\t\t\t@update=\"updateStep\"\n\t\t\t\t\t@delete=\"removeStep(selectedStep.id)\"\n\t\t\t\t\t@close=\"clearSelection\" />\n\n\t\t\t\t<CnStateMachinePanel\n\t\t\t\t\tv-else-if=\"selectedTransition\"\n\t\t\t\t\t:key=\"`transition-${selectedTransition.id}`\"\n\t\t\t\t\t:record=\"selectedTransition\"\n\t\t\t\t\t:fields=\"transitionFields\"\n\t\t\t\t\t:title=\"say('transitionPanelTitle')\"\n\t\t\t\t\t:subtitle=\"transitionRoute(selectedTransition)\"\n\t\t\t\t\t:closeLabel=\"say('closeTransitionPanel')\"\n\t\t\t\t\t:deleteLabel=\"say('deleteTransition')\"\n\t\t\t\t\tcanDelete\n\t\t\t\t\t:locked=\"locked\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:optionSets=\"optionSets\"\n\t\t\t\t\t:translate=\"tr\"\n\t\t\t\t\t:uid=\"`${uid}-transition`\"\n\t\t\t\t\t@update=\"updateTransition\"\n\t\t\t\t\t@delete=\"requestTransitionRemoval(selectedTransition.id)\"\n\t\t\t\t\t@close=\"clearSelection\" />\n\n\t\t\t\t<CnStateMachinePanel\n\t\t\t\t\tv-else-if=\"selectedState\"\n\t\t\t\t\t:key=\"`state-${selectedState.id}`\"\n\t\t\t\t\t:record=\"selectedState\"\n\t\t\t\t\t:fields=\"stateFields\"\n\t\t\t\t\t:title=\"stateLabel(selectedState.id)\"\n\t\t\t\t\t:subtitle=\"say('statePanelTitle')\"\n\t\t\t\t\t:closeLabel=\"say('closeStatePanel')\"\n\t\t\t\t\t:deleteLabel=\"say('deleteState')\"\n\t\t\t\t\tcanDelete\n\t\t\t\t\t:locked=\"locked\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:optionSets=\"optionSets\"\n\t\t\t\t\t:translate=\"tr\"\n\t\t\t\t\t:uid=\"`${uid}-state`\"\n\t\t\t\t\t@update=\"updateState\"\n\t\t\t\t\t@delete=\"requestStateRemoval(selectedState.id)\"\n\t\t\t\t\t@close=\"clearSelection\">\n\t\t\t\t\t<NcButton v-if=\"showSteps && !readOnly\" variant=\"secondary\" @click=\"addStep(selectedState.id)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ say('addStep') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</CnStateMachinePanel>\n\n\t\t\t\t<p v-else class=\"cn-state-machine-editor__empty\">\n\t\t\t\t\t{{ say('emptyPanel') }}\n\t\t\t\t</p>\n\t\t\t</aside>\n\t\t</div>\n\n\t\t<CnDeleteDialog\n\t\t\tv-if=\"pendingRemoval\"\n\t\t\tref=\"removeDialog\"\n\t\t\t:item=\"pendingRemoval\"\n\t\t\tnameField=\"name\"\n\t\t\t:dialogTitle=\"pendingRemoval.title\"\n\t\t\t:warningText=\"pendingRemoval.warning\"\n\t\t\t:irreversible=\"false\"\n\t\t\t@confirm=\"confirmRemoval\"\n\t\t\t@close=\"cancelRemoval\" />\n\t</div>\n</template>\n\n<script>\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { NcButton } from '@nextcloud/vue'\nimport Alert from 'vue-material-design-icons/Alert.vue'\nimport AlertCircle from 'vue-material-design-icons/AlertCircle.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport SquareOutline from 'vue-material-design-icons/SquareOutline.vue'\nimport CnDeleteDialog from '../CnDeleteDialog/CnDeleteDialog.vue'\nimport CnGraphCanvas from '../CnGraphCanvas/CnGraphCanvas.vue'\nimport CnStateMachineNode from './CnStateMachineNode.vue'\nimport CnStateMachinePanel from './CnStateMachinePanel.vue'\nimport { validateStateMachine } from '../../utils/stateMachineValidation.js'\n\n/** The drag type a palette state carries, so other drops are ignored. */\nconst PALETTE_TYPE = 'application/x-cn-state-machine-state'\n\n/** Record keys by role. A host passes its own names through `config.keys`. */\nexport const DEFAULT_STATE_MACHINE_EDITOR_KEYS = Object.freeze({\n\tstateLabel: 'label',\n\tstateFinal: 'final',\n\ttransitionFrom: 'from',\n\ttransitionTo: 'to',\n\ttransitionLabel: 'label',\n\tstepState: 'state',\n\tstepTitle: 'title',\n\tstepOrder: 'order',\n\tstepRequired: 'required',\n\tstepBadge: '',\n})\n\nlet editorCount = 0\n\n/**\n * Fill `{name}` placeholders.\n *\n * @param {string} text The text.\n * @param {object} [vars] Values by placeholder.\n * @return {string} The filled text.\n */\nfunction fill(text, vars) {\n\tif (!vars) {\n\t\treturn String(text ?? '')\n\t}\n\treturn String(text ?? '').replace(/\\{(\\w+)\\}/g, (match, name) => (Object.hasOwn(vars, name) ? String(vars[name]) : match))\n}\n\n/**\n * An editor for a state machine: states drawn on a canvas, the transitions\n * between them, the steps inside each state, and a property panel for whichever\n * of those is selected. What a state, step or transition carries is described\n * by field descriptors in `config`, so the component has no domain words of its\n * own.\n *\n * The editor never changes the records it is given. Every edit is an event;\n * the host stores the change and passes the records back down, the same rule\n * CnGraphCanvas holds for positions.\n *\n * Every pointer gesture has a keyboard route: the palette's add button instead\n * of a drag, a state's actions menu (or `c` on two states) instead of drawing a\n * line, arrow keys instead of dragging a state, Alt with an arrow or the panel's\n * move buttons instead of dragging a step or list item.\n */\nexport default {\n\tname: 'CnStateMachineEditor',\n\n\tcomponents: {\n\t\tNcButton,\n\t\tAlert,\n\t\tAlertCircle,\n\t\tPlus,\n\t\tSquareOutline,\n\t\tCnDeleteDialog,\n\t\tCnGraphCanvas,\n\t\tCnStateMachineNode,\n\t\tCnStateMachinePanel,\n\t},\n\n\tinject: {\n\t\tcnTranslate: { default: null },\n\t},\n\n\tprops: {\n\t\t/** The states. Each has an `id`; its name and final flag sit under `config.keys`. */\n\t\tstates: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/** The transitions, each `{ id }` plus a from and to state id under `config.keys`. */\n\t\ttransitions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The steps inside states, each `{ id }` plus its state id under `config.keys.stepState`. */\n\t\tsteps: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Canvas positions by state id: `{ [id]: { x, y } }`. A state without one is placed on a grid. */\n\t\tpositions: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * What the machine's records carry and what the editor says.\n\t\t *\n\t\t * - `keys`: record keys by role, see DEFAULT_STATE_MACHINE_EDITOR_KEYS.\n\t\t * - `stateFields`, `stepFields`, `transitionFields`: field descriptors for\n\t\t * each property panel (see the docs page for the descriptor types).\n\t\t * - `steps`: false to leave steps out of the machine. On by default when\n\t\t * `stepFields` is given.\n\t\t * - `labels`: the editor's own texts by name, overriding the defaults.\n\t\t * - `paletteHelp`, `controlsHelp`: the help under the palette.\n\t\t * - `messages`: validation messages by rule code.\n\t\t * - `requireFinal`: refuse to delete the last final state (default true).\n\t\t * - `blockOnWarnings`: let warnings fail validate() too (default false).\n\t\t * - `canvasHeight`: the canvas height in px (default 540).\n\t\t *\n\t\t * Texts are translated through `translate`, or the app's `cnTranslate`.\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Named option lists a select or checkboxes field points at with `optionSet`. */\n\t\toptionSets: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Disable the panel fields marked `lockable`, and step deletion. */\n\t\tlocked: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show the machine without any editing control. */\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Frame the whole machine when the canvas first renders. */\n\t\tfitView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Translates configured texts. Falls back to the injected `cnTranslate`. */\n\t\ttranslate: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: [\n\t\t'state-add',\n\t\t'state-move',\n\t\t'state-update',\n\t\t'state-remove',\n\t\t'transition-add',\n\t\t'transition-update',\n\t\t'transition-remove',\n\t\t'step-add',\n\t\t'step-update',\n\t\t'step-remove',\n\t\t'step-reorder',\n\t\t'validated',\n\t],\n\n\tdata() {\n\t\teditorCount += 1\n\t\treturn {\n\t\t\tuid: `cn-state-machine-${editorCount}`,\n\t\t\tselection: { kind: null, id: null },\n\t\t\tissues: [],\n\t\t\tmenuOpenFor: null,\n\t\t\tpendingRemoval: null,\n\t\t\tlabelPositions: {},\n\t\t\tsyncTick: 0,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * @return {object} Record keys by role.\n\t\t */\n\t\tkeys() {\n\t\t\treturn { ...DEFAULT_STATE_MACHINE_EDITOR_KEYS, ...(this.config.keys || {}) }\n\t\t},\n\n\t\t/**\n\t\t * @return {object} The step keys the node reads.\n\t\t */\n\t\tstepKeys() {\n\t\t\treturn { title: this.keys.stepTitle, required: this.keys.stepRequired, badge: this.keys.stepBadge }\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The step panel's fields.\n\t\t */\n\t\tstepFields() {\n\t\t\treturn Array.isArray(this.config.stepFields) ? this.config.stepFields : []\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The transition panel's fields.\n\t\t */\n\t\ttransitionFields() {\n\t\t\treturn Array.isArray(this.config.transitionFields) ? this.config.transitionFields : []\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The state panel's fields.\n\t\t */\n\t\tstateFields() {\n\t\t\treturn Array.isArray(this.config.stateFields) ? this.config.stateFields : []\n\t\t},\n\n\t\t/**\n\t\t * @return {boolean} Whether states hold steps.\n\t\t */\n\t\tshowSteps() {\n\t\t\tif (this.config.steps === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.config.steps === true || this.stepFields.length > 0\n\t\t},\n\n\t\t/**\n\t\t * @return {object} The root's style.\n\t\t */\n\t\trootStyle() {\n\t\t\tconst height = Number(this.config.canvasHeight)\n\t\t\treturn { '--cn-state-machine-canvas-height': `${Number.isFinite(height) && height > 0 ? height : 540}px` }\n\t\t},\n\n\t\t/**\n\t\t * @return {boolean} Whether any issue is an error.\n\t\t */\n\t\thasErrors() {\n\t\t\treturn this.issues.some((issue) => issue.type === 'error')\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<string>} The palette's help lines.\n\t\t */\n\t\tpaletteHelp() {\n\t\t\tif (Array.isArray(this.config.paletteHelp)) {\n\t\t\t\treturn this.config.paletteHelp.map((line) => this.tr(line))\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tt('nextcloud-vue', 'Drag a state onto the canvas to add it, or use the add button.'),\n\t\t\t\tt('nextcloud-vue', 'Connect states by dragging from one port to another, by pressing c on one state and then on another, or through a state\\'s actions menu.'),\n\t\t\t\tt('nextcloud-vue', 'Click a state, a step or a transition to see its properties.'),\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<{term: string, text: string}>} The canvas controls help.\n\t\t */\n\t\tcontrolsHelp() {\n\t\t\tif (Array.isArray(this.config.controlsHelp)) {\n\t\t\t\treturn this.config.controlsHelp.map((control) => ({ term: this.tr(control.term), text: this.tr(control.text) }))\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{ term: t('nextcloud-vue', 'Pan'), text: t('nextcloud-vue', 'Drag the empty canvas') },\n\t\t\t\t{ term: t('nextcloud-vue', 'Zoom'), text: t('nextcloud-vue', 'Scroll wheel or the zoom buttons') },\n\t\t\t\t{ term: t('nextcloud-vue', 'Move'), text: t('nextcloud-vue', 'Arrow keys on a focused state') },\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * @return {Map<string, object>} States by id.\n\t\t */\n\t\tstateById() {\n\t\t\treturn new Map(this.states.map((state) => [state.id, state]))\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The canvas nodes.\n\t\t */\n\t\tcanvasNodes() {\n\t\t\t// `sync` changes when a refused removal must re-send the graph Vue Flow\n\t\t\t// already dropped, so the nodes are rebuilt.\n\t\t\tconst sync = this.syncTick\n\t\t\treturn this.states.map((state, index) => ({\n\t\t\t\tid: state.id,\n\t\t\t\ttype: 'default',\n\t\t\t\tposition: this.positionOf(state.id, index),\n\t\t\t\tselected: this.selection.kind === 'state' && this.selection.id === state.id,\n\t\t\t\tstyle: { width: '200px' },\n\t\t\t\tdata: { label: this.say('stateAria', { name: this.stateLabel(state.id) }), sync },\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The canvas edges.\n\t\t */\n\t\tcanvasEdges() {\n\t\t\tconst sync = this.syncTick\n\t\t\treturn this.transitions\n\t\t\t\t.filter((transition) => this.stateById.has(this.fromOf(transition)) && this.stateById.has(this.toOf(transition)))\n\t\t\t\t.map((transition) => ({\n\t\t\t\t\tid: transition.id,\n\t\t\t\t\tsource: this.fromOf(transition),\n\t\t\t\t\ttarget: this.toOf(transition),\n\t\t\t\t\tselected: this.selection.kind === 'transition' && this.selection.id === transition.id,\n\t\t\t\t\tmarkerEnd: { type: 'arrowclosed', width: 22, height: 22 },\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tanimated: false,\n\t\t\t\t\t\tsync,\n\t\t\t\t\t\tlabelT: this.labelPositions[transition.id],\n\t\t\t\t\t\tlabelAriaLabel: `${this.say('transitionAria', { from: this.stateLabel(this.fromOf(transition)), to: this.stateLabel(this.toOf(transition)) })}: ${this.transitionText(transition.id)}`,\n\t\t\t\t\t},\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * @return {object|null} The selected step.\n\t\t */\n\t\tselectedStep() {\n\t\t\treturn this.selection.kind === 'step' ? (this.steps.find((step) => step.id === this.selection.id) || null) : null\n\t\t},\n\n\t\t/**\n\t\t * @return {object|null} The selected transition.\n\t\t */\n\t\tselectedTransition() {\n\t\t\treturn this.selection.kind === 'transition' ? (this.transitions.find((transition) => transition.id === this.selection.id) || null) : null\n\t\t},\n\n\t\t/**\n\t\t * @return {object|null} The selected state.\n\t\t */\n\t\tselectedState() {\n\t\t\treturn this.selection.kind === 'state' ? (this.stateById.get(this.selection.id) || null) : null\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * Hand the panel's edited step to the host.\n\t\t *\n\t\t * @param {object} record The edited step, complete.\n\t\t */\n\t\tupdateStep(record) {\n\t\t\t/** @event step-update The edited step, complete, as the panel returns it. */\n\t\t\tthis.$emit('step-update', record)\n\t\t},\n\n\t\t/**\n\t\t * Hand the panel's edited transition to the host.\n\t\t *\n\t\t * @param {object} record The edited transition, complete.\n\t\t */\n\t\tupdateTransition(record) {\n\t\t\t/** @event transition-update The edited transition, complete, as the panel returns it. */\n\t\t\tthis.$emit('transition-update', record)\n\t\t},\n\n\t\t/**\n\t\t * Hand the panel's edited state to the host.\n\t\t *\n\t\t * @param {object} record The edited state, complete.\n\t\t */\n\t\tupdateState(record) {\n\t\t\t/** @event state-update The edited state, complete, as the panel returns it. */\n\t\t\tthis.$emit('state-update', record)\n\t\t},\n\n\t\t/**\n\t\t * Translate a configured text.\n\t\t *\n\t\t * @param {string} text The text.\n\t\t * @return {string} The translation, or the text.\n\t\t */\n\t\ttr(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn text || ''\n\t\t\t}\n\t\t\tconst translate = this.translate || this.cnTranslate\n\t\t\tconst answer = typeof translate === 'function' ? translate(text) : text\n\t\t\treturn typeof answer === 'string' && answer !== '' ? answer : text\n\t\t},\n\n\t\t/**\n\t\t * One of the editor's own texts: the config's, translated, or the default.\n\t\t *\n\t\t * @param {string} name The text's name.\n\t\t * @param {object} [vars] Placeholder values.\n\t\t * @return {string} The text.\n\t\t */\n\t\tsay(name, vars) {\n\t\t\tconst own = this.config.labels && this.config.labels[name]\n\t\t\tif (typeof own === 'string' && own !== '') {\n\t\t\t\treturn fill(this.tr(own), vars)\n\t\t\t}\n\t\t\tif (name === 'stepCount') {\n\t\t\t\treturn n('nextcloud-vue', '%n step', '%n steps', vars?.count ?? 0)\n\t\t\t}\n\t\t\treturn fill(this.defaultText(name), vars)\n\t\t},\n\n\t\t/**\n\t\t * @param {string} name A text's name.\n\t\t * @return {string} Its default, in the library's domain.\n\t\t */\n\t\tdefaultText(name) {\n\t\t\tconst texts = {\n\t\t\t\tpaletteTitle: t('nextcloud-vue', 'Elements'),\n\t\t\t\tpaletteItem: t('nextcloud-vue', 'State'),\n\t\t\t\taddState: t('nextcloud-vue', 'Add state'),\n\t\t\t\tcontrolsTitle: t('nextcloud-vue', 'Controls'),\n\t\t\t\tcanvasLabel: t('nextcloud-vue', 'States and transitions'),\n\t\t\t\tpropertiesLabel: t('nextcloud-vue', 'Properties'),\n\t\t\t\temptyPanel: t('nextcloud-vue', 'Select a state, a step or a transition to see its properties.'),\n\t\t\t\tfinal: t('nextcloud-vue', 'Final'),\n\t\t\t\tstateAria: t('nextcloud-vue', 'State: {name}'),\n\t\t\t\trequired: t('nextcloud-vue', 'required'),\n\t\t\t\tstateActions: t('nextcloud-vue', 'Actions for state {name}'),\n\t\t\t\tconnectTo: t('nextcloud-vue', 'Connect to {name}'),\n\t\t\t\tdisconnectFrom: t('nextcloud-vue', 'Disconnect from {name}'),\n\t\t\t\teditTransitionTo: t('nextcloud-vue', 'Edit transition to {name}'),\n\t\t\t\taddStep: t('nextcloud-vue', 'Add step'),\n\t\t\t\tdeleteState: t('nextcloud-vue', 'Delete state'),\n\t\t\t\tstatePanelTitle: t('nextcloud-vue', 'State'),\n\t\t\t\tcloseStatePanel: t('nextcloud-vue', 'Close state properties'),\n\t\t\t\tstepPanelTitle: t('nextcloud-vue', 'Step'),\n\t\t\t\tcloseStepPanel: t('nextcloud-vue', 'Close step properties'),\n\t\t\t\tdeleteStep: t('nextcloud-vue', 'Delete step'),\n\t\t\t\ttransitionPanelTitle: t('nextcloud-vue', 'Transition'),\n\t\t\t\tcloseTransitionPanel: t('nextcloud-vue', 'Close transition properties'),\n\t\t\t\tdeleteTransition: t('nextcloud-vue', 'Delete transition'),\n\t\t\t\tdeleteTransitionConfirm: t('nextcloud-vue', 'Delete the transition {name}?'),\n\t\t\t\tdeleteStateConfirm: t('nextcloud-vue', 'Delete state \"{name}\"? Its steps and transitions go with it.'),\n\t\t\t\tneedsFinal: t('nextcloud-vue', 'At least one state must stay final'),\n\t\t\t\tdeleteStateFailed: t('nextcloud-vue', 'The state could not be deleted'),\n\t\t\t\tunnamedTransition: t('nextcloud-vue', 'Transition'),\n\t\t\t\ttransitionAria: t('nextcloud-vue', 'Transition from {from} to {to}'),\n\t\t\t\tdismiss: t('nextcloud-vue', 'Dismiss'),\n\t\t\t}\n\t\t\treturn texts[name] ?? name\n\t\t},\n\n\t\t/**\n\t\t * @param {object} transition A transition.\n\t\t * @return {string} Its source state id.\n\t\t */\n\t\tfromOf(transition) {\n\t\t\treturn transition[this.keys.transitionFrom]\n\t\t},\n\n\t\t/**\n\t\t * @param {object} transition A transition.\n\t\t * @return {string} Its target state id.\n\t\t */\n\t\ttoOf(transition) {\n\t\t\treturn transition[this.keys.transitionTo]\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {string} Its name, or the id.\n\t\t */\n\t\tstateLabel(id) {\n\t\t\tconst state = this.stateById.get(id)\n\t\t\treturn (state && state[this.keys.stateLabel]) || id || ''\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {boolean} Whether it is final.\n\t\t */\n\t\tisFinal(id) {\n\t\t\tconst state = this.stateById.get(id)\n\t\t\treturn !!state && state[this.keys.stateFinal] === true\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A transition id.\n\t\t * @return {string} The text its label shows.\n\t\t */\n\t\ttransitionText(id) {\n\t\t\tconst transition = this.transitions.find((candidate) => candidate.id === id)\n\t\t\tconst label = transition ? transition[this.keys.transitionLabel] : ''\n\t\t\treturn label || this.say('unnamedTransition')\n\t\t},\n\n\t\t/**\n\t\t * @param {object} transition A transition.\n\t\t * @return {string} `From → To`.\n\t\t */\n\t\ttransitionRoute(transition) {\n\t\t\treturn `${this.stateLabel(this.fromOf(transition))} → ${this.stateLabel(this.toOf(transition))}`\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @param {number} index Its position in `states`.\n\t\t * @return {{x: number, y: number}} Its stored position, or its grid slot.\n\t\t */\n\t\tpositionOf(id, index) {\n\t\t\tconst stored = this.positions && this.positions[id]\n\t\t\tif (stored && Number.isFinite(stored.x) && Number.isFinite(stored.y)) {\n\t\t\t\treturn { x: stored.x, y: stored.y }\n\t\t\t}\n\t\t\treturn this.gridSlot(index)\n\t\t},\n\n\t\t/**\n\t\t * @param {number} index A slot number.\n\t\t * @return {{x: number, y: number}} Four states to a row, 250 by 200 apart.\n\t\t */\n\t\tgridSlot(index) {\n\t\t\treturn { x: 100 + (index % 4) * 250, y: 100 + Math.floor(index / 4) * 200 }\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {Array<object>} Its steps in order.\n\t\t */\n\t\tstepsOf(id) {\n\t\t\tconst order = this.keys.stepOrder\n\t\t\treturn this.steps\n\t\t\t\t.filter((step) => step[this.keys.stepState] === id)\n\t\t\t\t.sort((a, b) => (Number(a[order]) || 0) - (Number(b[order]) || 0))\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {Array<{id: string, label: string}>} States it has no transition to yet.\n\t\t */\n\t\tconnectTargetsOf(id) {\n\t\t\tconst connected = new Set(this.transitions.filter((transition) => this.fromOf(transition) === id).map(this.toOf))\n\t\t\treturn this.states\n\t\t\t\t.filter((state) => state.id !== id && !connected.has(state.id))\n\t\t\t\t.map((state) => ({ id: state.id, label: this.stateLabel(state.id) }))\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {Array<{id: string, targetLabel: string}>} Its outgoing transitions.\n\t\t */\n\t\toutgoingOf(id) {\n\t\t\treturn this.transitions\n\t\t\t\t.filter((transition) => this.fromOf(transition) === id)\n\t\t\t\t.map((transition) => ({ id: transition.id, targetLabel: this.stateLabel(this.toOf(transition)) }))\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {void}\n\t\t */\n\t\tselectState(id) {\n\t\t\tthis.selection = { kind: 'state', id }\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A transition id.\n\t\t * @return {void}\n\t\t */\n\t\tselectTransition(id) {\n\t\t\tthis.selection = { kind: 'transition', id }\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A step id.\n\t\t * @return {void}\n\t\t */\n\t\tselectStep(id) {\n\t\t\tthis.selection = { kind: 'step', id }\n\t\t},\n\n\t\t/**\n\t\t * @return {void}\n\t\t */\n\t\tclearSelection() {\n\t\t\tthis.selection = { kind: null, id: null }\n\t\t},\n\n\t\t/**\n\t\t * @param {object} event CnGraphCanvas's node event.\n\t\t * @return {void}\n\t\t */\n\t\tonNodeSelect(event) {\n\t\t\tif (event && event.node) {\n\t\t\t\tthis.selectState(event.node.id)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {object} event CnGraphCanvas's edge event.\n\t\t * @return {void}\n\t\t */\n\t\tonEdgeSelect(event) {\n\t\t\tif (event && event.edge) {\n\t\t\t\tthis.selectTransition(event.edge.id)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @param {boolean} open Whether its menu opened.\n\t\t * @return {void}\n\t\t */\n\t\tonMenuToggle(id, open) {\n\t\t\tif (open) {\n\t\t\t\tthis.menuOpenFor = id\n\t\t\t} else if (this.menuOpenFor === id) {\n\t\t\t\tthis.menuOpenFor = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Report moves; Vue Flow reports a drag once per frame and a keyboard\n\t\t * move once per key.\n\t\t *\n\t\t * @param {Array<object>} changes Vue Flow's node changes.\n\t\t * @return {void}\n\t\t */\n\t\tonNodesChange(changes) {\n\t\t\tfor (const change of changes || []) {\n\t\t\t\tif (change.type === 'position' && change.position) {\n\t\t\t\t\t/**\n\t\t\t\t\t * @event state-move A state was moved: `{ id, x, y }`.\n\t\t\t\t\t */\n\t\t\t\t\tthis.$emit('state-move', { id: change.id, x: Math.round(change.position.x), y: Math.round(change.position.y) })\n\t\t\t\t} else if (change.type === 'remove') {\n\t\t\t\t\tthis.requestStateRemoval(change.id)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {Array<object>} changes Vue Flow's edge changes.\n\t\t * @return {void}\n\t\t */\n\t\tonEdgesChange(changes) {\n\t\t\tfor (const change of changes || []) {\n\t\t\t\tif (change.type === 'remove') {\n\t\t\t\t\tthis.requestTransitionRemoval(change.id)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {{source: string, target: string}} connection A new connection.\n\t\t * @return {void}\n\t\t */\n\t\tonConnect(connection) {\n\t\t\tif (connection && connection.source && connection.target) {\n\t\t\t\tthis.connect(connection.source, connection.target)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {string} from The source state.\n\t\t * @param {string} to The target state.\n\t\t * @return {void}\n\t\t */\n\t\tconnect(from, to) {\n\t\t\tif (this.readOnly || from === to) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event transition-add A transition should be added: `{ from, to }`.\n\t\t\t */\n\t\t\tthis.$emit('transition-add', { from, to })\n\t\t},\n\n\t\t/**\n\t\t * @param {{id: string, labelT: number}} payload The label and its place on the line.\n\t\t * @return {void}\n\t\t */\n\t\tonEdgeLabelMove(payload) {\n\t\t\tthis.labelPositions = { ...this.labelPositions, [payload.id]: payload.labelT }\n\t\t},\n\n\t\t/**\n\t\t * @param {DragEvent} event The palette drag.\n\t\t * @return {void}\n\t\t */\n\t\tonPaletteDragStart(event) {\n\t\t\tif (event.dataTransfer) {\n\t\t\t\tevent.dataTransfer.setData(PALETTE_TYPE, 'state')\n\t\t\t\tevent.dataTransfer.setData('text/plain', 'state')\n\t\t\t\tevent.dataTransfer.effectAllowed = 'copy'\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {{position: object, event: DragEvent}} payload The drop.\n\t\t * @return {void}\n\t\t */\n\t\tonCanvasDrop({ position, event }) {\n\t\t\tconst types = event && event.dataTransfer ? Array.from(event.dataTransfer.types || []) : []\n\t\t\tif (!types.includes(PALETTE_TYPE)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.addState({ x: Math.round(position.x), y: Math.round(position.y) }, false)\n\t\t},\n\n\t\t/**\n\t\t * The keyboard route to a new state: the next free grid slot, and the\n\t\t * new state selected so its panel opens.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\taddStateFromKeyboard() {\n\t\t\tthis.addState(this.gridSlot(this.states.length), true)\n\t\t},\n\n\t\t/**\n\t\t * @param {{x: number, y: number}} position Where the state goes.\n\t\t * @param {boolean} select Whether to select it once added.\n\t\t * @return {void}\n\t\t */\n\t\taddState(position, select) {\n\t\t\tif (this.readOnly) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event state-add A state should be added at `position`. The host\n\t\t\t * creates it and calls `done(id)`; the editor then selects it when\n\t\t\t * it was added from the keyboard.\n\t\t\t */\n\t\t\tthis.$emit('state-add', {\n\t\t\t\tposition,\n\t\t\t\tdone: (id) => {\n\t\t\t\t\tif (select && id) {\n\t\t\t\t\t\tthis.selectState(id)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * @param {string} stateId The state.\n\t\t * @return {void}\n\t\t */\n\t\taddStep(stateId) {\n\t\t\tif (this.readOnly) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event step-add A step should be added to a state:\n\t\t\t * `{ state, done }`. The host calls `done(id)` and the editor opens\n\t\t\t * the new step.\n\t\t\t */\n\t\t\tthis.$emit('step-add', {\n\t\t\t\tstate: stateId,\n\t\t\t\tdone: (id) => {\n\t\t\t\t\tif (id) {\n\t\t\t\t\t\tthis.selectStep(id)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A step.\n\t\t * @return {void}\n\t\t */\n\t\tremoveStep(id) {\n\t\t\tif (this.selection.kind === 'step' && this.selection.id === id) {\n\t\t\t\tthis.clearSelection()\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event step-remove A step should be removed, by id.\n\t\t\t */\n\t\t\tthis.$emit('step-remove', id)\n\t\t},\n\n\t\t/**\n\t\t * @param {string} stateId The state the step is in.\n\t\t * @param {{from: number, to: number}} move The step's old and new place.\n\t\t * @return {void}\n\t\t */\n\t\tmoveStep(stateId, { from, to }) {\n\t\t\tconst ids = this.stepsOf(stateId).map((step) => step.id)\n\t\t\tif (from < 0 || to < 0 || from >= ids.length || to >= ids.length) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst [moved] = ids.splice(from, 1)\n\t\t\tids.splice(to, 0, moved)\n\t\t\t/**\n\t\t\t * @event step-reorder The steps of a state in their new order:\n\t\t\t * `{ state, ids }`.\n\t\t\t */\n\t\t\tthis.$emit('step-reorder', { state: stateId, ids })\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A transition.\n\t\t * @return {void}\n\t\t */\n\t\tremoveTransition(id) {\n\t\t\tif (this.selection.kind === 'transition' && this.selection.id === id) {\n\t\t\t\tthis.clearSelection()\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event transition-remove A transition should be removed, by id.\n\t\t\t */\n\t\t\tthis.$emit('transition-remove', id)\n\t\t},\n\n\t\t/**\n\t\t * Ask before removing a transition.\n\t\t *\n\t\t * @param {string} id A transition.\n\t\t * @return {void}\n\t\t */\n\t\trequestTransitionRemoval(id) {\n\t\t\tconst transition = this.transitions.find((candidate) => candidate.id === id)\n\t\t\tif (!transition || this.readOnly || this.pendingRemoval) {\n\t\t\t\tthis.syncTick += 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.pendingRemoval = {\n\t\t\t\tkind: 'transition',\n\t\t\t\tid,\n\t\t\t\tname: this.transitionRoute(transition),\n\t\t\t\ttitle: this.say('deleteTransition'),\n\t\t\t\twarning: this.say('deleteTransitionConfirm', { name: this.transitionRoute(transition) }),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Ask before removing a state, unless it is the last final one.\n\t\t *\n\t\t * @param {string} id A state.\n\t\t * @return {void}\n\t\t */\n\t\trequestStateRemoval(id) {\n\t\t\tconst state = this.stateById.get(id)\n\t\t\tif (!state || this.readOnly || (this.pendingRemoval && this.pendingRemoval.id === id)) {\n\t\t\t\tthis.syncTick += 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.menuOpenFor = null\n\t\t\tif (this.config.requireFinal !== false && this.isFinal(id)\n\t\t\t\t&& !this.states.some((other) => other.id !== id && this.isFinal(other.id))) {\n\t\t\t\tthis.issues = [{ type: 'error', code: 'LAST_FINAL_STATE', message: this.say('needsFinal') }]\n\t\t\t\tthis.syncTick += 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.pendingRemoval = {\n\t\t\t\tkind: 'state',\n\t\t\t\tid,\n\t\t\t\tname: this.stateLabel(id),\n\t\t\t\ttitle: this.say('deleteState'),\n\t\t\t\twarning: this.say('deleteStateConfirm'),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The removal was confirmed: hand it to the host.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tconfirmRemoval() {\n\t\t\tconst pending = this.pendingRemoval\n\t\t\tif (!pending) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (pending.kind === 'transition') {\n\t\t\t\tthis.removeTransition(pending.id)\n\t\t\t\tthis.pendingRemoval = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event state-remove A state should be removed: `{ id, done }`. The\n\t\t\t * host removes the state with its steps and transitions and calls\n\t\t\t * `done(true)`, or `done(false)` when it could not.\n\t\t\t */\n\t\t\tthis.$emit('state-remove', {\n\t\t\t\tid: pending.id,\n\t\t\t\tdone: (ok) => {\n\t\t\t\t\tif (ok) {\n\t\t\t\t\t\tif (this.selection.id === pending.id) {\n\t\t\t\t\t\t\tthis.clearSelection()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.pendingRemoval = null\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (this.$refs.removeDialog) {\n\t\t\t\t\t\tthis.$refs.removeDialog.setResult({ error: this.say('deleteStateFailed') })\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The removal dialog closed without a removal.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tcancelRemoval() {\n\t\t\tthis.pendingRemoval = null\n\t\t\tthis.syncTick += 1\n\t\t},\n\n\t\t/**\n\t\t * Check the machine and show what is wrong with it.\n\t\t *\n\t\t * @return {boolean} True when nothing blocks: no errors, and no warnings\n\t\t * either when `config.blockOnWarnings` is set.\n\t\t * @public\n\t\t */\n\t\tvalidate() {\n\t\t\tthis.issues = validateStateMachine(\n\t\t\t\t{ states: this.states, transitions: this.transitions },\n\t\t\t\t{\n\t\t\t\t\tkeys: {\n\t\t\t\t\t\tlabel: this.keys.stateLabel,\n\t\t\t\t\t\tfinal: this.keys.stateFinal,\n\t\t\t\t\t\tfrom: this.keys.transitionFrom,\n\t\t\t\t\t\tto: this.keys.transitionTo,\n\t\t\t\t\t\ttransitionLabel: this.keys.transitionLabel,\n\t\t\t\t\t},\n\t\t\t\t\tmessages: this.config.messages,\n\t\t\t\t\ttranslate: (text) => this.tr(text),\n\t\t\t\t},\n\t\t\t)\n\t\t\t/**\n\t\t\t * @event validated The issues validate() found.\n\t\t\t */\n\t\t\tthis.$emit('validated', this.issues)\n\t\t\tconst blocking = this.config.blockOnWarnings === true\n\t\t\t\t? this.issues\n\t\t\t\t: this.issues.filter((issue) => issue.type === 'error')\n\t\t\treturn blocking.length === 0\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-state-machine-editor {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tmin-width: 0;\n}\n\n.cn-state-machine-editor__issues {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--color-warning, #c28900);\n\tborder-inline-start-width: 4px;\n\tborder-radius: var(--border-radius-large, 10px);\n\tbackground: var(--color-main-background, #fff);\n}\n\n.cn-state-machine-editor__issues--error {\n\tborder-color: var(--color-error, #d91812);\n}\n\n.cn-state-machine-editor__issue-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-state-machine-editor__issue {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 14px;\n}\n\n.cn-state-machine-editor__issue--error {\n\tcolor: var(--color-error-text, #c9302c);\n}\n\n.cn-state-machine-editor__issue--warning {\n\tcolor: var(--color-warning-text, #7a5600);\n}\n\n.cn-state-machine-editor__layout {\n\tdisplay: grid;\n\tgrid-template-columns: 220px minmax(0, 1fr) 280px;\n\tgap: 16px;\n\talign-items: start;\n}\n\n.cn-state-machine-editor__palette {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tpadding: 14px;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 12px;\n\tbackground: var(--color-background-hover, #f5f6f8);\n}\n\n.cn-state-machine-editor__palette-title {\n\tmargin: 0;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tletter-spacing: 0.06em;\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__palette-item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 8px 10px;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 8px;\n\tbackground: var(--color-main-background, #fff);\n\tfont-size: 14px;\n\tcursor: grab;\n}\n\n.cn-state-machine-editor__palette-item:hover {\n\tborder-color: var(--color-primary-element, #0082c9);\n}\n\n.cn-state-machine-editor__help {\n\tfont-size: 13px;\n\tline-height: 1.5;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__help p {\n\tmargin: 0 0 6px;\n}\n\n.cn-state-machine-editor__controls {\n\tdisplay: grid;\n\tgrid-template-columns: max-content 1fr;\n\tgap: 4px 8px;\n\tmargin: 0;\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__controls dt {\n\tfont-weight: 600;\n}\n\n.cn-state-machine-editor__controls dd {\n\tmargin: 0;\n}\n\n.cn-state-machine-editor__canvas {\n\tposition: relative;\n\theight: var(--cn-state-machine-canvas-height, 540px);\n\toverflow: hidden;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 12px;\n\tbackground: var(--color-main-background, #fff);\n}\n\n.cn-state-machine-editor__properties {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 16px;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 12px;\n\tbackground: var(--color-main-background, #fff);\n}\n\n.cn-state-machine-editor__empty {\n\tmargin: 0;\n\tfont-size: 14px;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__edge-label {\n\tfont-size: 12px;\n\tfont-weight: 500;\n}\n\n.cn-state-machine-editor__sr {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\toverflow: hidden;\n\tclip-path: inset(50%);\n\twhite-space: nowrap;\n}\n\n/* The board's state card: a 1px outline, a 10px radius and a soft shadow; a\n selected state gets the 2px primary outline. */\n.cn-state-machine-editor__canvas :deep(.cn-flow-node) {\n\tpadding: 10px 12px;\n\tborder: 1px solid var(--color-border-maxcontrast, #828a95);\n\tborder-radius: 10px;\n\tbox-shadow: 0 1px 2px rgba(27, 28, 29, 0.08);\n}\n\n.cn-state-machine-editor__canvas :deep(.cn-flow-node--selected) {\n\tpadding: 9px 11px;\n\tborder: 2px solid var(--color-primary-element, #0082c9);\n}\n\n@media (max-width: 1100px) {\n\t.cn-state-machine-editor__layout {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n</style>\n"],"names":["CnDeleteDialog","CnGraphCanvas","CnStateMachineNode","CnStateMachinePanel","t","n"],"mappings":"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"}
@@ -0,0 +1,276 @@
1
+ import { resolveComponent, openBlock, createElementBlock, normalizeStyle, normalizeClass, createElementVNode, Fragment, renderList, createBlock, toDisplayString, createVNode, withCtx, createTextVNode, createCommentVNode } from 'vue';
2
+
3
+ const _hoisted_1 = { class: "cn-state-machine-editor__issue-list" };
4
+ const _hoisted_2 = { class: "cn-state-machine-editor__sr" };
5
+ const _hoisted_3 = { class: "cn-state-machine-editor__layout" };
6
+ const _hoisted_4 = ["aria-labelledby"];
7
+ const _hoisted_5 = ["id"];
8
+ const _hoisted_6 = { class: "cn-state-machine-editor__help" };
9
+ const _hoisted_7 = { class: "cn-state-machine-editor__palette-title" };
10
+ const _hoisted_8 = { class: "cn-state-machine-editor__controls" };
11
+ const _hoisted_9 = ["aria-label"];
12
+ const _hoisted_10 = { class: "cn-state-machine-editor__edge-label" };
13
+ const _hoisted_11 = ["aria-label"];
14
+ const _hoisted_12 = {
15
+ key: 3,
16
+ class: "cn-state-machine-editor__empty"
17
+ };
18
+
19
+ function render(_ctx, _cache, $props, $setup, $data, $options) {
20
+ const _component_AlertCircle = resolveComponent("AlertCircle");
21
+ const _component_Alert = resolveComponent("Alert");
22
+ const _component_NcButton = resolveComponent("NcButton");
23
+ const _component_SquareOutline = resolveComponent("SquareOutline");
24
+ const _component_Plus = resolveComponent("Plus");
25
+ const _component_CnStateMachineNode = resolveComponent("CnStateMachineNode");
26
+ const _component_CnGraphCanvas = resolveComponent("CnGraphCanvas");
27
+ const _component_CnStateMachinePanel = resolveComponent("CnStateMachinePanel");
28
+ const _component_CnDeleteDialog = resolveComponent("CnDeleteDialog");
29
+
30
+ return (openBlock(), createElementBlock("div", {
31
+ class: "cn-state-machine-editor",
32
+ style: normalizeStyle($options.rootStyle)
33
+ }, [
34
+ ($data.issues.length > 0)
35
+ ? (openBlock(), createElementBlock("div", {
36
+ key: 0,
37
+ class: normalizeClass(["cn-state-machine-editor__issues", $options.hasErrors ? 'cn-state-machine-editor__issues--error' : 'cn-state-machine-editor__issues--warning']),
38
+ role: "alert",
39
+ "data-testid": "cn-state-machine-issues"
40
+ }, [
41
+ createElementVNode("ul", _hoisted_1, [
42
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.issues, (issue, index) => {
43
+ return (openBlock(), createElementBlock("li", {
44
+ key: index,
45
+ class: normalizeClass(["cn-state-machine-editor__issue", `cn-state-machine-editor__issue--${issue.type}`])
46
+ }, [
47
+ (issue.type === 'error')
48
+ ? (openBlock(), createBlock(_component_AlertCircle, {
49
+ key: 0,
50
+ size: 18
51
+ }))
52
+ : (openBlock(), createBlock(_component_Alert, {
53
+ key: 1,
54
+ size: 18
55
+ })),
56
+ createElementVNode("span", _hoisted_2, toDisplayString(issue.type === 'error' ? $options.t('nextcloud-vue', 'Error:') : $options.t('nextcloud-vue', 'Warning:')), 1 /* TEXT */),
57
+ createElementVNode("span", null, toDisplayString(issue.message), 1 /* TEXT */)
58
+ ], 2 /* CLASS */))
59
+ }), 128 /* KEYED_FRAGMENT */))
60
+ ]),
61
+ createVNode(_component_NcButton, {
62
+ variant: "tertiary",
63
+ onClick: _cache[0] || (_cache[0] = $event => ($data.issues = []))
64
+ }, {
65
+ default: withCtx(() => [
66
+ createTextVNode(toDisplayString($options.say('dismiss')), 1 /* TEXT */)
67
+ ]),
68
+ _: 1 /* STABLE */
69
+ })
70
+ ], 2 /* CLASS */))
71
+ : createCommentVNode("v-if", true),
72
+ createElementVNode("div", _hoisted_3, [
73
+ (!$props.readOnly)
74
+ ? (openBlock(), createElementBlock("section", {
75
+ key: 0,
76
+ class: "cn-state-machine-editor__palette",
77
+ "aria-labelledby": `${$data.uid}-palette`
78
+ }, [
79
+ createElementVNode("h3", {
80
+ id: `${$data.uid}-palette`,
81
+ class: "cn-state-machine-editor__palette-title"
82
+ }, toDisplayString($options.say('paletteTitle')), 9 /* TEXT, PROPS */, _hoisted_5),
83
+ createElementVNode("div", {
84
+ class: "cn-state-machine-editor__palette-item",
85
+ draggable: "true",
86
+ "data-testid": "cn-state-machine-palette-state",
87
+ onDragstart: _cache[1] || (_cache[1] = (...args) => ($options.onPaletteDragStart && $options.onPaletteDragStart(...args)))
88
+ }, [
89
+ createVNode(_component_SquareOutline, { size: 18 }),
90
+ createElementVNode("span", null, toDisplayString($options.say('paletteItem')), 1 /* TEXT */)
91
+ ], 32 /* NEED_HYDRATION */),
92
+ createVNode(_component_NcButton, {
93
+ variant: "secondary",
94
+ wide: "",
95
+ "data-testid": "cn-state-machine-add-state",
96
+ onClick: $options.addStateFromKeyboard
97
+ }, {
98
+ icon: withCtx(() => [
99
+ createVNode(_component_Plus, { size: 20 })
100
+ ]),
101
+ default: withCtx(() => [
102
+ createTextVNode(" " + toDisplayString($options.say('addState')), 1 /* TEXT */)
103
+ ]),
104
+ _: 1 /* STABLE */
105
+ }, 8 /* PROPS */, ["onClick"]),
106
+ createElementVNode("div", _hoisted_6, [
107
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.paletteHelp, (line, index) => {
108
+ return (openBlock(), createElementBlock("p", { key: index }, toDisplayString(line), 1 /* TEXT */))
109
+ }), 128 /* KEYED_FRAGMENT */))
110
+ ]),
111
+ createElementVNode("h3", _hoisted_7, toDisplayString($options.say('controlsTitle')), 1 /* TEXT */),
112
+ createElementVNode("dl", _hoisted_8, [
113
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.controlsHelp, (control, index) => {
114
+ return (openBlock(), createElementBlock(Fragment, { key: index }, [
115
+ createElementVNode("dt", null, toDisplayString(control.term), 1 /* TEXT */),
116
+ createElementVNode("dd", null, toDisplayString(control.text), 1 /* TEXT */)
117
+ ], 64 /* STABLE_FRAGMENT */))
118
+ }), 128 /* KEYED_FRAGMENT */))
119
+ ])
120
+ ], 8 /* PROPS */, _hoisted_4))
121
+ : createCommentVNode("v-if", true),
122
+ createElementVNode("section", {
123
+ class: "cn-state-machine-editor__canvas",
124
+ "aria-label": $options.say('canvasLabel'),
125
+ "data-testid": "cn-state-machine-canvas"
126
+ }, [
127
+ createVNode(_component_CnGraphCanvas, {
128
+ nodes: $options.canvasNodes,
129
+ edges: $options.canvasEdges,
130
+ readOnly: $props.readOnly,
131
+ snapToGrid: false,
132
+ fitView: $props.fitView,
133
+ onNodesChange: $options.onNodesChange,
134
+ onEdgesChange: $options.onEdgesChange,
135
+ onConnect: $options.onConnect,
136
+ onNodeSelect: $options.onNodeSelect,
137
+ onNodeActivate: $options.selectState,
138
+ onNodeRemove: $options.requestStateRemoval,
139
+ onNodeMenu: _cache[2] || (_cache[2] = $event => ($data.menuOpenFor = $event.id)),
140
+ onEdgeSelect: $options.onEdgeSelect,
141
+ onEdgeLabelClick: $options.selectTransition,
142
+ onEdgeLabelMove: $options.onEdgeLabelMove,
143
+ onCanvasClick: $options.clearSelection,
144
+ onCanvasDrop: $options.onCanvasDrop
145
+ }, {
146
+ node: withCtx(({ node }) => [
147
+ createVNode(_component_CnStateMachineNode, {
148
+ label: $options.stateLabel(node.id),
149
+ final: $options.isFinal(node.id),
150
+ steps: $options.stepsOf(node.id),
151
+ showSteps: $options.showSteps,
152
+ stepKeys: $options.stepKeys,
153
+ selectedStepId: $data.selection.kind === 'step' ? $data.selection.id : null,
154
+ connectTargets: $options.connectTargetsOf(node.id),
155
+ outgoing: $options.outgoingOf(node.id),
156
+ menuOpen: $data.menuOpenFor === node.id,
157
+ readOnly: $props.readOnly,
158
+ say: $options.say,
159
+ "onUpdate:menuOpen": $event => ($options.onMenuToggle(node.id, $event)),
160
+ onConnect: $event => ($options.connect(node.id, $event)),
161
+ onDisconnect: $options.removeTransition,
162
+ onEditTransition: $options.selectTransition,
163
+ onAddStep: $event => ($options.addStep(node.id)),
164
+ onDeleteState: $event => ($options.requestStateRemoval(node.id)),
165
+ onStepClick: $options.selectStep,
166
+ onStepMove: $event => ($options.moveStep(node.id, $event))
167
+ }, null, 8 /* PROPS */, ["label", "final", "steps", "showSteps", "stepKeys", "selectedStepId", "connectTargets", "outgoing", "menuOpen", "readOnly", "say", "onUpdate:menuOpen", "onConnect", "onDisconnect", "onEditTransition", "onAddStep", "onDeleteState", "onStepClick", "onStepMove"])
168
+ ]),
169
+ "edge-label": withCtx(({ edge }) => [
170
+ createElementVNode("span", _hoisted_10, toDisplayString($options.transitionText(edge.id)), 1 /* TEXT */)
171
+ ]),
172
+ _: 1 /* STABLE */
173
+ }, 8 /* PROPS */, ["nodes", "edges", "readOnly", "fitView", "onNodesChange", "onEdgesChange", "onConnect", "onNodeSelect", "onNodeActivate", "onNodeRemove", "onEdgeSelect", "onEdgeLabelClick", "onEdgeLabelMove", "onCanvasClick", "onCanvasDrop"])
174
+ ], 8 /* PROPS */, _hoisted_9),
175
+ createElementVNode("aside", {
176
+ class: "cn-state-machine-editor__properties",
177
+ "aria-label": $options.say('propertiesLabel'),
178
+ "data-testid": "cn-state-machine-properties"
179
+ }, [
180
+ ($options.selectedStep)
181
+ ? (openBlock(), createBlock(_component_CnStateMachinePanel, {
182
+ key: `step-${$options.selectedStep.id}`,
183
+ record: $options.selectedStep,
184
+ fields: $options.stepFields,
185
+ title: $options.say('stepPanelTitle'),
186
+ subtitle: $options.stateLabel($options.selectedStep[$options.keys.stepState]),
187
+ closeLabel: $options.say('closeStepPanel'),
188
+ deleteLabel: $options.say('deleteStep'),
189
+ canDelete: !$props.locked,
190
+ locked: $props.locked,
191
+ readOnly: $props.readOnly,
192
+ optionSets: $props.optionSets,
193
+ translate: $options.tr,
194
+ uid: `${$data.uid}-step`,
195
+ onUpdate: $options.updateStep,
196
+ onDelete: _cache[3] || (_cache[3] = $event => ($options.removeStep($options.selectedStep.id))),
197
+ onClose: $options.clearSelection
198
+ }, null, 8 /* PROPS */, ["record", "fields", "title", "subtitle", "closeLabel", "deleteLabel", "canDelete", "locked", "readOnly", "optionSets", "translate", "uid", "onUpdate", "onClose"]))
199
+ : ($options.selectedTransition)
200
+ ? (openBlock(), createBlock(_component_CnStateMachinePanel, {
201
+ key: `transition-${$options.selectedTransition.id}`,
202
+ record: $options.selectedTransition,
203
+ fields: $options.transitionFields,
204
+ title: $options.say('transitionPanelTitle'),
205
+ subtitle: $options.transitionRoute($options.selectedTransition),
206
+ closeLabel: $options.say('closeTransitionPanel'),
207
+ deleteLabel: $options.say('deleteTransition'),
208
+ canDelete: "",
209
+ locked: $props.locked,
210
+ readOnly: $props.readOnly,
211
+ optionSets: $props.optionSets,
212
+ translate: $options.tr,
213
+ uid: `${$data.uid}-transition`,
214
+ onUpdate: $options.updateTransition,
215
+ onDelete: _cache[4] || (_cache[4] = $event => ($options.requestTransitionRemoval($options.selectedTransition.id))),
216
+ onClose: $options.clearSelection
217
+ }, null, 8 /* PROPS */, ["record", "fields", "title", "subtitle", "closeLabel", "deleteLabel", "locked", "readOnly", "optionSets", "translate", "uid", "onUpdate", "onClose"]))
218
+ : ($options.selectedState)
219
+ ? (openBlock(), createBlock(_component_CnStateMachinePanel, {
220
+ key: `state-${$options.selectedState.id}`,
221
+ record: $options.selectedState,
222
+ fields: $options.stateFields,
223
+ title: $options.stateLabel($options.selectedState.id),
224
+ subtitle: $options.say('statePanelTitle'),
225
+ closeLabel: $options.say('closeStatePanel'),
226
+ deleteLabel: $options.say('deleteState'),
227
+ canDelete: "",
228
+ locked: $props.locked,
229
+ readOnly: $props.readOnly,
230
+ optionSets: $props.optionSets,
231
+ translate: $options.tr,
232
+ uid: `${$data.uid}-state`,
233
+ onUpdate: $options.updateState,
234
+ onDelete: _cache[6] || (_cache[6] = $event => ($options.requestStateRemoval($options.selectedState.id))),
235
+ onClose: $options.clearSelection
236
+ }, {
237
+ default: withCtx(() => [
238
+ ($options.showSteps && !$props.readOnly)
239
+ ? (openBlock(), createBlock(_component_NcButton, {
240
+ key: 0,
241
+ variant: "secondary",
242
+ onClick: _cache[5] || (_cache[5] = $event => ($options.addStep($options.selectedState.id)))
243
+ }, {
244
+ icon: withCtx(() => [
245
+ createVNode(_component_Plus, { size: 20 })
246
+ ]),
247
+ default: withCtx(() => [
248
+ createTextVNode(" " + toDisplayString($options.say('addStep')), 1 /* TEXT */)
249
+ ]),
250
+ _: 1 /* STABLE */
251
+ }))
252
+ : createCommentVNode("v-if", true)
253
+ ]),
254
+ _: 1 /* STABLE */
255
+ }, 8 /* PROPS */, ["record", "fields", "title", "subtitle", "closeLabel", "deleteLabel", "locked", "readOnly", "optionSets", "translate", "uid", "onUpdate", "onClose"]))
256
+ : (openBlock(), createElementBlock("p", _hoisted_12, toDisplayString($options.say('emptyPanel')), 1 /* TEXT */))
257
+ ], 8 /* PROPS */, _hoisted_11)
258
+ ]),
259
+ ($data.pendingRemoval)
260
+ ? (openBlock(), createBlock(_component_CnDeleteDialog, {
261
+ key: 1,
262
+ ref: "removeDialog",
263
+ item: $data.pendingRemoval,
264
+ nameField: "name",
265
+ dialogTitle: $data.pendingRemoval.title,
266
+ warningText: $data.pendingRemoval.warning,
267
+ irreversible: false,
268
+ onConfirm: $options.confirmRemoval,
269
+ onClose: $options.cancelRemoval
270
+ }, null, 8 /* PROPS */, ["item", "dialogTitle", "warningText", "onConfirm", "onClose"]))
271
+ : createCommentVNode("v-if", true)
272
+ ], 4 /* STYLE */))
273
+ }
274
+
275
+ export { render };
276
+ //# sourceMappingURL=CnStateMachineEditor.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnStateMachineEditor.vue3.js","sources":["../../../../src/components/CnStateMachineEditor/CnStateMachineEditor.vue?vue&type=template&id=4817b208&lang.js"],"sourcesContent":["<!--\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-state-machine-editor\" :style=\"rootStyle\">\n\t\t<!-- Issues found by validate(), and refusals of an edit. Text says the\n\t\t severity, so it does not rest on colour. -->\n\t\t<div\n\t\t\tv-if=\"issues.length > 0\"\n\t\t\tclass=\"cn-state-machine-editor__issues\"\n\t\t\t:class=\"hasErrors ? 'cn-state-machine-editor__issues--error' : 'cn-state-machine-editor__issues--warning'\"\n\t\t\trole=\"alert\"\n\t\t\tdata-testid=\"cn-state-machine-issues\">\n\t\t\t<ul class=\"cn-state-machine-editor__issue-list\">\n\t\t\t\t<li\n\t\t\t\t\tv-for=\"(issue, index) in issues\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"cn-state-machine-editor__issue\"\n\t\t\t\t\t:class=\"`cn-state-machine-editor__issue--${issue.type}`\">\n\t\t\t\t\t<AlertCircle v-if=\"issue.type === 'error'\" :size=\"18\" />\n\t\t\t\t\t<Alert v-else :size=\"18\" />\n\t\t\t\t\t<span class=\"cn-state-machine-editor__sr\">{{ issue.type === 'error' ? t('nextcloud-vue', 'Error:') : t('nextcloud-vue', 'Warning:') }}</span>\n\t\t\t\t\t<span>{{ issue.message }}</span>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<NcButton variant=\"tertiary\" @click=\"issues = []\">\n\t\t\t\t{{ say('dismiss') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<div class=\"cn-state-machine-editor__layout\">\n\t\t\t<!-- Palette: drag a state onto the canvas, or add one with the button. -->\n\t\t\t<section\n\t\t\t\tv-if=\"!readOnly\"\n\t\t\t\tclass=\"cn-state-machine-editor__palette\"\n\t\t\t\t:aria-labelledby=\"`${uid}-palette`\">\n\t\t\t\t<h3 :id=\"`${uid}-palette`\" class=\"cn-state-machine-editor__palette-title\">\n\t\t\t\t\t{{ say('paletteTitle') }}\n\t\t\t\t</h3>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"cn-state-machine-editor__palette-item\"\n\t\t\t\t\tdraggable=\"true\"\n\t\t\t\t\tdata-testid=\"cn-state-machine-palette-state\"\n\t\t\t\t\t@dragstart=\"onPaletteDragStart\">\n\t\t\t\t\t<SquareOutline :size=\"18\" />\n\t\t\t\t\t<span>{{ say('paletteItem') }}</span>\n\t\t\t\t</div>\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\twide\n\t\t\t\t\tdata-testid=\"cn-state-machine-add-state\"\n\t\t\t\t\t@click=\"addStateFromKeyboard\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ say('addState') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<div class=\"cn-state-machine-editor__help\">\n\t\t\t\t\t<p v-for=\"(line, index) in paletteHelp\" :key=\"index\">\n\t\t\t\t\t\t{{ line }}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<h3 class=\"cn-state-machine-editor__palette-title\">\n\t\t\t\t\t{{ say('controlsTitle') }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-state-machine-editor__controls\">\n\t\t\t\t\t<template v-for=\"(control, index) in controlsHelp\" :key=\"index\">\n\t\t\t\t\t\t<dt>{{ control.term }}</dt>\n\t\t\t\t\t\t<dd>{{ control.text }}</dd>\n\t\t\t\t\t</template>\n\t\t\t\t</dl>\n\t\t\t</section>\n\n\t\t\t<section\n\t\t\t\tclass=\"cn-state-machine-editor__canvas\"\n\t\t\t\t:aria-label=\"say('canvasLabel')\"\n\t\t\t\tdata-testid=\"cn-state-machine-canvas\">\n\t\t\t\t<CnGraphCanvas\n\t\t\t\t\t:nodes=\"canvasNodes\"\n\t\t\t\t\t:edges=\"canvasEdges\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:snapToGrid=\"false\"\n\t\t\t\t\t:fitView=\"fitView\"\n\t\t\t\t\t@nodesChange=\"onNodesChange\"\n\t\t\t\t\t@edgesChange=\"onEdgesChange\"\n\t\t\t\t\t@connect=\"onConnect\"\n\t\t\t\t\t@nodeSelect=\"onNodeSelect\"\n\t\t\t\t\t@nodeActivate=\"selectState\"\n\t\t\t\t\t@nodeRemove=\"requestStateRemoval\"\n\t\t\t\t\t@nodeMenu=\"menuOpenFor = $event.id\"\n\t\t\t\t\t@edgeSelect=\"onEdgeSelect\"\n\t\t\t\t\t@edgeLabelClick=\"selectTransition\"\n\t\t\t\t\t@edgeLabelMove=\"onEdgeLabelMove\"\n\t\t\t\t\t@canvasClick=\"clearSelection\"\n\t\t\t\t\t@canvasDrop=\"onCanvasDrop\">\n\t\t\t\t\t<template #node=\"{ node }\">\n\t\t\t\t\t\t<CnStateMachineNode\n\t\t\t\t\t\t\t:label=\"stateLabel(node.id)\"\n\t\t\t\t\t\t\t:final=\"isFinal(node.id)\"\n\t\t\t\t\t\t\t:steps=\"stepsOf(node.id)\"\n\t\t\t\t\t\t\t:showSteps=\"showSteps\"\n\t\t\t\t\t\t\t:stepKeys=\"stepKeys\"\n\t\t\t\t\t\t\t:selectedStepId=\"selection.kind === 'step' ? selection.id : null\"\n\t\t\t\t\t\t\t:connectTargets=\"connectTargetsOf(node.id)\"\n\t\t\t\t\t\t\t:outgoing=\"outgoingOf(node.id)\"\n\t\t\t\t\t\t\t:menuOpen=\"menuOpenFor === node.id\"\n\t\t\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t\t\t:say=\"say\"\n\t\t\t\t\t\t\t@update:menuOpen=\"onMenuToggle(node.id, $event)\"\n\t\t\t\t\t\t\t@connect=\"connect(node.id, $event)\"\n\t\t\t\t\t\t\t@disconnect=\"removeTransition\"\n\t\t\t\t\t\t\t@editTransition=\"selectTransition\"\n\t\t\t\t\t\t\t@addStep=\"addStep(node.id)\"\n\t\t\t\t\t\t\t@deleteState=\"requestStateRemoval(node.id)\"\n\t\t\t\t\t\t\t@stepClick=\"selectStep\"\n\t\t\t\t\t\t\t@stepMove=\"moveStep(node.id, $event)\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #edge-label=\"{ edge }\">\n\t\t\t\t\t\t<span class=\"cn-state-machine-editor__edge-label\">{{ transitionText(edge.id) }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t</CnGraphCanvas>\n\t\t\t</section>\n\n\t\t\t<aside\n\t\t\t\tclass=\"cn-state-machine-editor__properties\"\n\t\t\t\t:aria-label=\"say('propertiesLabel')\"\n\t\t\t\tdata-testid=\"cn-state-machine-properties\">\n\t\t\t\t<CnStateMachinePanel\n\t\t\t\t\tv-if=\"selectedStep\"\n\t\t\t\t\t:key=\"`step-${selectedStep.id}`\"\n\t\t\t\t\t:record=\"selectedStep\"\n\t\t\t\t\t:fields=\"stepFields\"\n\t\t\t\t\t:title=\"say('stepPanelTitle')\"\n\t\t\t\t\t:subtitle=\"stateLabel(selectedStep[keys.stepState])\"\n\t\t\t\t\t:closeLabel=\"say('closeStepPanel')\"\n\t\t\t\t\t:deleteLabel=\"say('deleteStep')\"\n\t\t\t\t\t:canDelete=\"!locked\"\n\t\t\t\t\t:locked=\"locked\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:optionSets=\"optionSets\"\n\t\t\t\t\t:translate=\"tr\"\n\t\t\t\t\t:uid=\"`${uid}-step`\"\n\t\t\t\t\t@update=\"updateStep\"\n\t\t\t\t\t@delete=\"removeStep(selectedStep.id)\"\n\t\t\t\t\t@close=\"clearSelection\" />\n\n\t\t\t\t<CnStateMachinePanel\n\t\t\t\t\tv-else-if=\"selectedTransition\"\n\t\t\t\t\t:key=\"`transition-${selectedTransition.id}`\"\n\t\t\t\t\t:record=\"selectedTransition\"\n\t\t\t\t\t:fields=\"transitionFields\"\n\t\t\t\t\t:title=\"say('transitionPanelTitle')\"\n\t\t\t\t\t:subtitle=\"transitionRoute(selectedTransition)\"\n\t\t\t\t\t:closeLabel=\"say('closeTransitionPanel')\"\n\t\t\t\t\t:deleteLabel=\"say('deleteTransition')\"\n\t\t\t\t\tcanDelete\n\t\t\t\t\t:locked=\"locked\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:optionSets=\"optionSets\"\n\t\t\t\t\t:translate=\"tr\"\n\t\t\t\t\t:uid=\"`${uid}-transition`\"\n\t\t\t\t\t@update=\"updateTransition\"\n\t\t\t\t\t@delete=\"requestTransitionRemoval(selectedTransition.id)\"\n\t\t\t\t\t@close=\"clearSelection\" />\n\n\t\t\t\t<CnStateMachinePanel\n\t\t\t\t\tv-else-if=\"selectedState\"\n\t\t\t\t\t:key=\"`state-${selectedState.id}`\"\n\t\t\t\t\t:record=\"selectedState\"\n\t\t\t\t\t:fields=\"stateFields\"\n\t\t\t\t\t:title=\"stateLabel(selectedState.id)\"\n\t\t\t\t\t:subtitle=\"say('statePanelTitle')\"\n\t\t\t\t\t:closeLabel=\"say('closeStatePanel')\"\n\t\t\t\t\t:deleteLabel=\"say('deleteState')\"\n\t\t\t\t\tcanDelete\n\t\t\t\t\t:locked=\"locked\"\n\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t:optionSets=\"optionSets\"\n\t\t\t\t\t:translate=\"tr\"\n\t\t\t\t\t:uid=\"`${uid}-state`\"\n\t\t\t\t\t@update=\"updateState\"\n\t\t\t\t\t@delete=\"requestStateRemoval(selectedState.id)\"\n\t\t\t\t\t@close=\"clearSelection\">\n\t\t\t\t\t<NcButton v-if=\"showSteps && !readOnly\" variant=\"secondary\" @click=\"addStep(selectedState.id)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ say('addStep') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</CnStateMachinePanel>\n\n\t\t\t\t<p v-else class=\"cn-state-machine-editor__empty\">\n\t\t\t\t\t{{ say('emptyPanel') }}\n\t\t\t\t</p>\n\t\t\t</aside>\n\t\t</div>\n\n\t\t<CnDeleteDialog\n\t\t\tv-if=\"pendingRemoval\"\n\t\t\tref=\"removeDialog\"\n\t\t\t:item=\"pendingRemoval\"\n\t\t\tnameField=\"name\"\n\t\t\t:dialogTitle=\"pendingRemoval.title\"\n\t\t\t:warningText=\"pendingRemoval.warning\"\n\t\t\t:irreversible=\"false\"\n\t\t\t@confirm=\"confirmRemoval\"\n\t\t\t@close=\"cancelRemoval\" />\n\t</div>\n</template>\n\n<script>\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { NcButton } from '@nextcloud/vue'\nimport Alert from 'vue-material-design-icons/Alert.vue'\nimport AlertCircle from 'vue-material-design-icons/AlertCircle.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport SquareOutline from 'vue-material-design-icons/SquareOutline.vue'\nimport CnDeleteDialog from '../CnDeleteDialog/CnDeleteDialog.vue'\nimport CnGraphCanvas from '../CnGraphCanvas/CnGraphCanvas.vue'\nimport CnStateMachineNode from './CnStateMachineNode.vue'\nimport CnStateMachinePanel from './CnStateMachinePanel.vue'\nimport { validateStateMachine } from '../../utils/stateMachineValidation.js'\n\n/** The drag type a palette state carries, so other drops are ignored. */\nconst PALETTE_TYPE = 'application/x-cn-state-machine-state'\n\n/** Record keys by role. A host passes its own names through `config.keys`. */\nexport const DEFAULT_STATE_MACHINE_EDITOR_KEYS = Object.freeze({\n\tstateLabel: 'label',\n\tstateFinal: 'final',\n\ttransitionFrom: 'from',\n\ttransitionTo: 'to',\n\ttransitionLabel: 'label',\n\tstepState: 'state',\n\tstepTitle: 'title',\n\tstepOrder: 'order',\n\tstepRequired: 'required',\n\tstepBadge: '',\n})\n\nlet editorCount = 0\n\n/**\n * Fill `{name}` placeholders.\n *\n * @param {string} text The text.\n * @param {object} [vars] Values by placeholder.\n * @return {string} The filled text.\n */\nfunction fill(text, vars) {\n\tif (!vars) {\n\t\treturn String(text ?? '')\n\t}\n\treturn String(text ?? '').replace(/\\{(\\w+)\\}/g, (match, name) => (Object.hasOwn(vars, name) ? String(vars[name]) : match))\n}\n\n/**\n * An editor for a state machine: states drawn on a canvas, the transitions\n * between them, the steps inside each state, and a property panel for whichever\n * of those is selected. What a state, step or transition carries is described\n * by field descriptors in `config`, so the component has no domain words of its\n * own.\n *\n * The editor never changes the records it is given. Every edit is an event;\n * the host stores the change and passes the records back down, the same rule\n * CnGraphCanvas holds for positions.\n *\n * Every pointer gesture has a keyboard route: the palette's add button instead\n * of a drag, a state's actions menu (or `c` on two states) instead of drawing a\n * line, arrow keys instead of dragging a state, Alt with an arrow or the panel's\n * move buttons instead of dragging a step or list item.\n */\nexport default {\n\tname: 'CnStateMachineEditor',\n\n\tcomponents: {\n\t\tNcButton,\n\t\tAlert,\n\t\tAlertCircle,\n\t\tPlus,\n\t\tSquareOutline,\n\t\tCnDeleteDialog,\n\t\tCnGraphCanvas,\n\t\tCnStateMachineNode,\n\t\tCnStateMachinePanel,\n\t},\n\n\tinject: {\n\t\tcnTranslate: { default: null },\n\t},\n\n\tprops: {\n\t\t/** The states. Each has an `id`; its name and final flag sit under `config.keys`. */\n\t\tstates: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/** The transitions, each `{ id }` plus a from and to state id under `config.keys`. */\n\t\ttransitions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The steps inside states, each `{ id }` plus its state id under `config.keys.stepState`. */\n\t\tsteps: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Canvas positions by state id: `{ [id]: { x, y } }`. A state without one is placed on a grid. */\n\t\tpositions: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * What the machine's records carry and what the editor says.\n\t\t *\n\t\t * - `keys`: record keys by role, see DEFAULT_STATE_MACHINE_EDITOR_KEYS.\n\t\t * - `stateFields`, `stepFields`, `transitionFields`: field descriptors for\n\t\t * each property panel (see the docs page for the descriptor types).\n\t\t * - `steps`: false to leave steps out of the machine. On by default when\n\t\t * `stepFields` is given.\n\t\t * - `labels`: the editor's own texts by name, overriding the defaults.\n\t\t * - `paletteHelp`, `controlsHelp`: the help under the palette.\n\t\t * - `messages`: validation messages by rule code.\n\t\t * - `requireFinal`: refuse to delete the last final state (default true).\n\t\t * - `blockOnWarnings`: let warnings fail validate() too (default false).\n\t\t * - `canvasHeight`: the canvas height in px (default 540).\n\t\t *\n\t\t * Texts are translated through `translate`, or the app's `cnTranslate`.\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Named option lists a select or checkboxes field points at with `optionSet`. */\n\t\toptionSets: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Disable the panel fields marked `lockable`, and step deletion. */\n\t\tlocked: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show the machine without any editing control. */\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Frame the whole machine when the canvas first renders. */\n\t\tfitView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Translates configured texts. Falls back to the injected `cnTranslate`. */\n\t\ttranslate: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: [\n\t\t'state-add',\n\t\t'state-move',\n\t\t'state-update',\n\t\t'state-remove',\n\t\t'transition-add',\n\t\t'transition-update',\n\t\t'transition-remove',\n\t\t'step-add',\n\t\t'step-update',\n\t\t'step-remove',\n\t\t'step-reorder',\n\t\t'validated',\n\t],\n\n\tdata() {\n\t\teditorCount += 1\n\t\treturn {\n\t\t\tuid: `cn-state-machine-${editorCount}`,\n\t\t\tselection: { kind: null, id: null },\n\t\t\tissues: [],\n\t\t\tmenuOpenFor: null,\n\t\t\tpendingRemoval: null,\n\t\t\tlabelPositions: {},\n\t\t\tsyncTick: 0,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * @return {object} Record keys by role.\n\t\t */\n\t\tkeys() {\n\t\t\treturn { ...DEFAULT_STATE_MACHINE_EDITOR_KEYS, ...(this.config.keys || {}) }\n\t\t},\n\n\t\t/**\n\t\t * @return {object} The step keys the node reads.\n\t\t */\n\t\tstepKeys() {\n\t\t\treturn { title: this.keys.stepTitle, required: this.keys.stepRequired, badge: this.keys.stepBadge }\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The step panel's fields.\n\t\t */\n\t\tstepFields() {\n\t\t\treturn Array.isArray(this.config.stepFields) ? this.config.stepFields : []\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The transition panel's fields.\n\t\t */\n\t\ttransitionFields() {\n\t\t\treturn Array.isArray(this.config.transitionFields) ? this.config.transitionFields : []\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The state panel's fields.\n\t\t */\n\t\tstateFields() {\n\t\t\treturn Array.isArray(this.config.stateFields) ? this.config.stateFields : []\n\t\t},\n\n\t\t/**\n\t\t * @return {boolean} Whether states hold steps.\n\t\t */\n\t\tshowSteps() {\n\t\t\tif (this.config.steps === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.config.steps === true || this.stepFields.length > 0\n\t\t},\n\n\t\t/**\n\t\t * @return {object} The root's style.\n\t\t */\n\t\trootStyle() {\n\t\t\tconst height = Number(this.config.canvasHeight)\n\t\t\treturn { '--cn-state-machine-canvas-height': `${Number.isFinite(height) && height > 0 ? height : 540}px` }\n\t\t},\n\n\t\t/**\n\t\t * @return {boolean} Whether any issue is an error.\n\t\t */\n\t\thasErrors() {\n\t\t\treturn this.issues.some((issue) => issue.type === 'error')\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<string>} The palette's help lines.\n\t\t */\n\t\tpaletteHelp() {\n\t\t\tif (Array.isArray(this.config.paletteHelp)) {\n\t\t\t\treturn this.config.paletteHelp.map((line) => this.tr(line))\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tt('nextcloud-vue', 'Drag a state onto the canvas to add it, or use the add button.'),\n\t\t\t\tt('nextcloud-vue', 'Connect states by dragging from one port to another, by pressing c on one state and then on another, or through a state\\'s actions menu.'),\n\t\t\t\tt('nextcloud-vue', 'Click a state, a step or a transition to see its properties.'),\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<{term: string, text: string}>} The canvas controls help.\n\t\t */\n\t\tcontrolsHelp() {\n\t\t\tif (Array.isArray(this.config.controlsHelp)) {\n\t\t\t\treturn this.config.controlsHelp.map((control) => ({ term: this.tr(control.term), text: this.tr(control.text) }))\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{ term: t('nextcloud-vue', 'Pan'), text: t('nextcloud-vue', 'Drag the empty canvas') },\n\t\t\t\t{ term: t('nextcloud-vue', 'Zoom'), text: t('nextcloud-vue', 'Scroll wheel or the zoom buttons') },\n\t\t\t\t{ term: t('nextcloud-vue', 'Move'), text: t('nextcloud-vue', 'Arrow keys on a focused state') },\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * @return {Map<string, object>} States by id.\n\t\t */\n\t\tstateById() {\n\t\t\treturn new Map(this.states.map((state) => [state.id, state]))\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The canvas nodes.\n\t\t */\n\t\tcanvasNodes() {\n\t\t\t// `sync` changes when a refused removal must re-send the graph Vue Flow\n\t\t\t// already dropped, so the nodes are rebuilt.\n\t\t\tconst sync = this.syncTick\n\t\t\treturn this.states.map((state, index) => ({\n\t\t\t\tid: state.id,\n\t\t\t\ttype: 'default',\n\t\t\t\tposition: this.positionOf(state.id, index),\n\t\t\t\tselected: this.selection.kind === 'state' && this.selection.id === state.id,\n\t\t\t\tstyle: { width: '200px' },\n\t\t\t\tdata: { label: this.say('stateAria', { name: this.stateLabel(state.id) }), sync },\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * @return {Array<object>} The canvas edges.\n\t\t */\n\t\tcanvasEdges() {\n\t\t\tconst sync = this.syncTick\n\t\t\treturn this.transitions\n\t\t\t\t.filter((transition) => this.stateById.has(this.fromOf(transition)) && this.stateById.has(this.toOf(transition)))\n\t\t\t\t.map((transition) => ({\n\t\t\t\t\tid: transition.id,\n\t\t\t\t\tsource: this.fromOf(transition),\n\t\t\t\t\ttarget: this.toOf(transition),\n\t\t\t\t\tselected: this.selection.kind === 'transition' && this.selection.id === transition.id,\n\t\t\t\t\tmarkerEnd: { type: 'arrowclosed', width: 22, height: 22 },\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tanimated: false,\n\t\t\t\t\t\tsync,\n\t\t\t\t\t\tlabelT: this.labelPositions[transition.id],\n\t\t\t\t\t\tlabelAriaLabel: `${this.say('transitionAria', { from: this.stateLabel(this.fromOf(transition)), to: this.stateLabel(this.toOf(transition)) })}: ${this.transitionText(transition.id)}`,\n\t\t\t\t\t},\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * @return {object|null} The selected step.\n\t\t */\n\t\tselectedStep() {\n\t\t\treturn this.selection.kind === 'step' ? (this.steps.find((step) => step.id === this.selection.id) || null) : null\n\t\t},\n\n\t\t/**\n\t\t * @return {object|null} The selected transition.\n\t\t */\n\t\tselectedTransition() {\n\t\t\treturn this.selection.kind === 'transition' ? (this.transitions.find((transition) => transition.id === this.selection.id) || null) : null\n\t\t},\n\n\t\t/**\n\t\t * @return {object|null} The selected state.\n\t\t */\n\t\tselectedState() {\n\t\t\treturn this.selection.kind === 'state' ? (this.stateById.get(this.selection.id) || null) : null\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * Hand the panel's edited step to the host.\n\t\t *\n\t\t * @param {object} record The edited step, complete.\n\t\t */\n\t\tupdateStep(record) {\n\t\t\t/** @event step-update The edited step, complete, as the panel returns it. */\n\t\t\tthis.$emit('step-update', record)\n\t\t},\n\n\t\t/**\n\t\t * Hand the panel's edited transition to the host.\n\t\t *\n\t\t * @param {object} record The edited transition, complete.\n\t\t */\n\t\tupdateTransition(record) {\n\t\t\t/** @event transition-update The edited transition, complete, as the panel returns it. */\n\t\t\tthis.$emit('transition-update', record)\n\t\t},\n\n\t\t/**\n\t\t * Hand the panel's edited state to the host.\n\t\t *\n\t\t * @param {object} record The edited state, complete.\n\t\t */\n\t\tupdateState(record) {\n\t\t\t/** @event state-update The edited state, complete, as the panel returns it. */\n\t\t\tthis.$emit('state-update', record)\n\t\t},\n\n\t\t/**\n\t\t * Translate a configured text.\n\t\t *\n\t\t * @param {string} text The text.\n\t\t * @return {string} The translation, or the text.\n\t\t */\n\t\ttr(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn text || ''\n\t\t\t}\n\t\t\tconst translate = this.translate || this.cnTranslate\n\t\t\tconst answer = typeof translate === 'function' ? translate(text) : text\n\t\t\treturn typeof answer === 'string' && answer !== '' ? answer : text\n\t\t},\n\n\t\t/**\n\t\t * One of the editor's own texts: the config's, translated, or the default.\n\t\t *\n\t\t * @param {string} name The text's name.\n\t\t * @param {object} [vars] Placeholder values.\n\t\t * @return {string} The text.\n\t\t */\n\t\tsay(name, vars) {\n\t\t\tconst own = this.config.labels && this.config.labels[name]\n\t\t\tif (typeof own === 'string' && own !== '') {\n\t\t\t\treturn fill(this.tr(own), vars)\n\t\t\t}\n\t\t\tif (name === 'stepCount') {\n\t\t\t\treturn n('nextcloud-vue', '%n step', '%n steps', vars?.count ?? 0)\n\t\t\t}\n\t\t\treturn fill(this.defaultText(name), vars)\n\t\t},\n\n\t\t/**\n\t\t * @param {string} name A text's name.\n\t\t * @return {string} Its default, in the library's domain.\n\t\t */\n\t\tdefaultText(name) {\n\t\t\tconst texts = {\n\t\t\t\tpaletteTitle: t('nextcloud-vue', 'Elements'),\n\t\t\t\tpaletteItem: t('nextcloud-vue', 'State'),\n\t\t\t\taddState: t('nextcloud-vue', 'Add state'),\n\t\t\t\tcontrolsTitle: t('nextcloud-vue', 'Controls'),\n\t\t\t\tcanvasLabel: t('nextcloud-vue', 'States and transitions'),\n\t\t\t\tpropertiesLabel: t('nextcloud-vue', 'Properties'),\n\t\t\t\temptyPanel: t('nextcloud-vue', 'Select a state, a step or a transition to see its properties.'),\n\t\t\t\tfinal: t('nextcloud-vue', 'Final'),\n\t\t\t\tstateAria: t('nextcloud-vue', 'State: {name}'),\n\t\t\t\trequired: t('nextcloud-vue', 'required'),\n\t\t\t\tstateActions: t('nextcloud-vue', 'Actions for state {name}'),\n\t\t\t\tconnectTo: t('nextcloud-vue', 'Connect to {name}'),\n\t\t\t\tdisconnectFrom: t('nextcloud-vue', 'Disconnect from {name}'),\n\t\t\t\teditTransitionTo: t('nextcloud-vue', 'Edit transition to {name}'),\n\t\t\t\taddStep: t('nextcloud-vue', 'Add step'),\n\t\t\t\tdeleteState: t('nextcloud-vue', 'Delete state'),\n\t\t\t\tstatePanelTitle: t('nextcloud-vue', 'State'),\n\t\t\t\tcloseStatePanel: t('nextcloud-vue', 'Close state properties'),\n\t\t\t\tstepPanelTitle: t('nextcloud-vue', 'Step'),\n\t\t\t\tcloseStepPanel: t('nextcloud-vue', 'Close step properties'),\n\t\t\t\tdeleteStep: t('nextcloud-vue', 'Delete step'),\n\t\t\t\ttransitionPanelTitle: t('nextcloud-vue', 'Transition'),\n\t\t\t\tcloseTransitionPanel: t('nextcloud-vue', 'Close transition properties'),\n\t\t\t\tdeleteTransition: t('nextcloud-vue', 'Delete transition'),\n\t\t\t\tdeleteTransitionConfirm: t('nextcloud-vue', 'Delete the transition {name}?'),\n\t\t\t\tdeleteStateConfirm: t('nextcloud-vue', 'Delete state \"{name}\"? Its steps and transitions go with it.'),\n\t\t\t\tneedsFinal: t('nextcloud-vue', 'At least one state must stay final'),\n\t\t\t\tdeleteStateFailed: t('nextcloud-vue', 'The state could not be deleted'),\n\t\t\t\tunnamedTransition: t('nextcloud-vue', 'Transition'),\n\t\t\t\ttransitionAria: t('nextcloud-vue', 'Transition from {from} to {to}'),\n\t\t\t\tdismiss: t('nextcloud-vue', 'Dismiss'),\n\t\t\t}\n\t\t\treturn texts[name] ?? name\n\t\t},\n\n\t\t/**\n\t\t * @param {object} transition A transition.\n\t\t * @return {string} Its source state id.\n\t\t */\n\t\tfromOf(transition) {\n\t\t\treturn transition[this.keys.transitionFrom]\n\t\t},\n\n\t\t/**\n\t\t * @param {object} transition A transition.\n\t\t * @return {string} Its target state id.\n\t\t */\n\t\ttoOf(transition) {\n\t\t\treturn transition[this.keys.transitionTo]\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {string} Its name, or the id.\n\t\t */\n\t\tstateLabel(id) {\n\t\t\tconst state = this.stateById.get(id)\n\t\t\treturn (state && state[this.keys.stateLabel]) || id || ''\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {boolean} Whether it is final.\n\t\t */\n\t\tisFinal(id) {\n\t\t\tconst state = this.stateById.get(id)\n\t\t\treturn !!state && state[this.keys.stateFinal] === true\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A transition id.\n\t\t * @return {string} The text its label shows.\n\t\t */\n\t\ttransitionText(id) {\n\t\t\tconst transition = this.transitions.find((candidate) => candidate.id === id)\n\t\t\tconst label = transition ? transition[this.keys.transitionLabel] : ''\n\t\t\treturn label || this.say('unnamedTransition')\n\t\t},\n\n\t\t/**\n\t\t * @param {object} transition A transition.\n\t\t * @return {string} `From → To`.\n\t\t */\n\t\ttransitionRoute(transition) {\n\t\t\treturn `${this.stateLabel(this.fromOf(transition))} → ${this.stateLabel(this.toOf(transition))}`\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @param {number} index Its position in `states`.\n\t\t * @return {{x: number, y: number}} Its stored position, or its grid slot.\n\t\t */\n\t\tpositionOf(id, index) {\n\t\t\tconst stored = this.positions && this.positions[id]\n\t\t\tif (stored && Number.isFinite(stored.x) && Number.isFinite(stored.y)) {\n\t\t\t\treturn { x: stored.x, y: stored.y }\n\t\t\t}\n\t\t\treturn this.gridSlot(index)\n\t\t},\n\n\t\t/**\n\t\t * @param {number} index A slot number.\n\t\t * @return {{x: number, y: number}} Four states to a row, 250 by 200 apart.\n\t\t */\n\t\tgridSlot(index) {\n\t\t\treturn { x: 100 + (index % 4) * 250, y: 100 + Math.floor(index / 4) * 200 }\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {Array<object>} Its steps in order.\n\t\t */\n\t\tstepsOf(id) {\n\t\t\tconst order = this.keys.stepOrder\n\t\t\treturn this.steps\n\t\t\t\t.filter((step) => step[this.keys.stepState] === id)\n\t\t\t\t.sort((a, b) => (Number(a[order]) || 0) - (Number(b[order]) || 0))\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {Array<{id: string, label: string}>} States it has no transition to yet.\n\t\t */\n\t\tconnectTargetsOf(id) {\n\t\t\tconst connected = new Set(this.transitions.filter((transition) => this.fromOf(transition) === id).map(this.toOf))\n\t\t\treturn this.states\n\t\t\t\t.filter((state) => state.id !== id && !connected.has(state.id))\n\t\t\t\t.map((state) => ({ id: state.id, label: this.stateLabel(state.id) }))\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {Array<{id: string, targetLabel: string}>} Its outgoing transitions.\n\t\t */\n\t\toutgoingOf(id) {\n\t\t\treturn this.transitions\n\t\t\t\t.filter((transition) => this.fromOf(transition) === id)\n\t\t\t\t.map((transition) => ({ id: transition.id, targetLabel: this.stateLabel(this.toOf(transition)) }))\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @return {void}\n\t\t */\n\t\tselectState(id) {\n\t\t\tthis.selection = { kind: 'state', id }\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A transition id.\n\t\t * @return {void}\n\t\t */\n\t\tselectTransition(id) {\n\t\t\tthis.selection = { kind: 'transition', id }\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A step id.\n\t\t * @return {void}\n\t\t */\n\t\tselectStep(id) {\n\t\t\tthis.selection = { kind: 'step', id }\n\t\t},\n\n\t\t/**\n\t\t * @return {void}\n\t\t */\n\t\tclearSelection() {\n\t\t\tthis.selection = { kind: null, id: null }\n\t\t},\n\n\t\t/**\n\t\t * @param {object} event CnGraphCanvas's node event.\n\t\t * @return {void}\n\t\t */\n\t\tonNodeSelect(event) {\n\t\t\tif (event && event.node) {\n\t\t\t\tthis.selectState(event.node.id)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {object} event CnGraphCanvas's edge event.\n\t\t * @return {void}\n\t\t */\n\t\tonEdgeSelect(event) {\n\t\t\tif (event && event.edge) {\n\t\t\t\tthis.selectTransition(event.edge.id)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A state id.\n\t\t * @param {boolean} open Whether its menu opened.\n\t\t * @return {void}\n\t\t */\n\t\tonMenuToggle(id, open) {\n\t\t\tif (open) {\n\t\t\t\tthis.menuOpenFor = id\n\t\t\t} else if (this.menuOpenFor === id) {\n\t\t\t\tthis.menuOpenFor = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Report moves; Vue Flow reports a drag once per frame and a keyboard\n\t\t * move once per key.\n\t\t *\n\t\t * @param {Array<object>} changes Vue Flow's node changes.\n\t\t * @return {void}\n\t\t */\n\t\tonNodesChange(changes) {\n\t\t\tfor (const change of changes || []) {\n\t\t\t\tif (change.type === 'position' && change.position) {\n\t\t\t\t\t/**\n\t\t\t\t\t * @event state-move A state was moved: `{ id, x, y }`.\n\t\t\t\t\t */\n\t\t\t\t\tthis.$emit('state-move', { id: change.id, x: Math.round(change.position.x), y: Math.round(change.position.y) })\n\t\t\t\t} else if (change.type === 'remove') {\n\t\t\t\t\tthis.requestStateRemoval(change.id)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {Array<object>} changes Vue Flow's edge changes.\n\t\t * @return {void}\n\t\t */\n\t\tonEdgesChange(changes) {\n\t\t\tfor (const change of changes || []) {\n\t\t\t\tif (change.type === 'remove') {\n\t\t\t\t\tthis.requestTransitionRemoval(change.id)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {{source: string, target: string}} connection A new connection.\n\t\t * @return {void}\n\t\t */\n\t\tonConnect(connection) {\n\t\t\tif (connection && connection.source && connection.target) {\n\t\t\t\tthis.connect(connection.source, connection.target)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {string} from The source state.\n\t\t * @param {string} to The target state.\n\t\t * @return {void}\n\t\t */\n\t\tconnect(from, to) {\n\t\t\tif (this.readOnly || from === to) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event transition-add A transition should be added: `{ from, to }`.\n\t\t\t */\n\t\t\tthis.$emit('transition-add', { from, to })\n\t\t},\n\n\t\t/**\n\t\t * @param {{id: string, labelT: number}} payload The label and its place on the line.\n\t\t * @return {void}\n\t\t */\n\t\tonEdgeLabelMove(payload) {\n\t\t\tthis.labelPositions = { ...this.labelPositions, [payload.id]: payload.labelT }\n\t\t},\n\n\t\t/**\n\t\t * @param {DragEvent} event The palette drag.\n\t\t * @return {void}\n\t\t */\n\t\tonPaletteDragStart(event) {\n\t\t\tif (event.dataTransfer) {\n\t\t\t\tevent.dataTransfer.setData(PALETTE_TYPE, 'state')\n\t\t\t\tevent.dataTransfer.setData('text/plain', 'state')\n\t\t\t\tevent.dataTransfer.effectAllowed = 'copy'\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {{position: object, event: DragEvent}} payload The drop.\n\t\t * @return {void}\n\t\t */\n\t\tonCanvasDrop({ position, event }) {\n\t\t\tconst types = event && event.dataTransfer ? Array.from(event.dataTransfer.types || []) : []\n\t\t\tif (!types.includes(PALETTE_TYPE)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.addState({ x: Math.round(position.x), y: Math.round(position.y) }, false)\n\t\t},\n\n\t\t/**\n\t\t * The keyboard route to a new state: the next free grid slot, and the\n\t\t * new state selected so its panel opens.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\taddStateFromKeyboard() {\n\t\t\tthis.addState(this.gridSlot(this.states.length), true)\n\t\t},\n\n\t\t/**\n\t\t * @param {{x: number, y: number}} position Where the state goes.\n\t\t * @param {boolean} select Whether to select it once added.\n\t\t * @return {void}\n\t\t */\n\t\taddState(position, select) {\n\t\t\tif (this.readOnly) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event state-add A state should be added at `position`. The host\n\t\t\t * creates it and calls `done(id)`; the editor then selects it when\n\t\t\t * it was added from the keyboard.\n\t\t\t */\n\t\t\tthis.$emit('state-add', {\n\t\t\t\tposition,\n\t\t\t\tdone: (id) => {\n\t\t\t\t\tif (select && id) {\n\t\t\t\t\t\tthis.selectState(id)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * @param {string} stateId The state.\n\t\t * @return {void}\n\t\t */\n\t\taddStep(stateId) {\n\t\t\tif (this.readOnly) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event step-add A step should be added to a state:\n\t\t\t * `{ state, done }`. The host calls `done(id)` and the editor opens\n\t\t\t * the new step.\n\t\t\t */\n\t\t\tthis.$emit('step-add', {\n\t\t\t\tstate: stateId,\n\t\t\t\tdone: (id) => {\n\t\t\t\t\tif (id) {\n\t\t\t\t\t\tthis.selectStep(id)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A step.\n\t\t * @return {void}\n\t\t */\n\t\tremoveStep(id) {\n\t\t\tif (this.selection.kind === 'step' && this.selection.id === id) {\n\t\t\t\tthis.clearSelection()\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event step-remove A step should be removed, by id.\n\t\t\t */\n\t\t\tthis.$emit('step-remove', id)\n\t\t},\n\n\t\t/**\n\t\t * @param {string} stateId The state the step is in.\n\t\t * @param {{from: number, to: number}} move The step's old and new place.\n\t\t * @return {void}\n\t\t */\n\t\tmoveStep(stateId, { from, to }) {\n\t\t\tconst ids = this.stepsOf(stateId).map((step) => step.id)\n\t\t\tif (from < 0 || to < 0 || from >= ids.length || to >= ids.length) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst [moved] = ids.splice(from, 1)\n\t\t\tids.splice(to, 0, moved)\n\t\t\t/**\n\t\t\t * @event step-reorder The steps of a state in their new order:\n\t\t\t * `{ state, ids }`.\n\t\t\t */\n\t\t\tthis.$emit('step-reorder', { state: stateId, ids })\n\t\t},\n\n\t\t/**\n\t\t * @param {string} id A transition.\n\t\t * @return {void}\n\t\t */\n\t\tremoveTransition(id) {\n\t\t\tif (this.selection.kind === 'transition' && this.selection.id === id) {\n\t\t\t\tthis.clearSelection()\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event transition-remove A transition should be removed, by id.\n\t\t\t */\n\t\t\tthis.$emit('transition-remove', id)\n\t\t},\n\n\t\t/**\n\t\t * Ask before removing a transition.\n\t\t *\n\t\t * @param {string} id A transition.\n\t\t * @return {void}\n\t\t */\n\t\trequestTransitionRemoval(id) {\n\t\t\tconst transition = this.transitions.find((candidate) => candidate.id === id)\n\t\t\tif (!transition || this.readOnly || this.pendingRemoval) {\n\t\t\t\tthis.syncTick += 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.pendingRemoval = {\n\t\t\t\tkind: 'transition',\n\t\t\t\tid,\n\t\t\t\tname: this.transitionRoute(transition),\n\t\t\t\ttitle: this.say('deleteTransition'),\n\t\t\t\twarning: this.say('deleteTransitionConfirm', { name: this.transitionRoute(transition) }),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Ask before removing a state, unless it is the last final one.\n\t\t *\n\t\t * @param {string} id A state.\n\t\t * @return {void}\n\t\t */\n\t\trequestStateRemoval(id) {\n\t\t\tconst state = this.stateById.get(id)\n\t\t\tif (!state || this.readOnly || (this.pendingRemoval && this.pendingRemoval.id === id)) {\n\t\t\t\tthis.syncTick += 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.menuOpenFor = null\n\t\t\tif (this.config.requireFinal !== false && this.isFinal(id)\n\t\t\t\t&& !this.states.some((other) => other.id !== id && this.isFinal(other.id))) {\n\t\t\t\tthis.issues = [{ type: 'error', code: 'LAST_FINAL_STATE', message: this.say('needsFinal') }]\n\t\t\t\tthis.syncTick += 1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.pendingRemoval = {\n\t\t\t\tkind: 'state',\n\t\t\t\tid,\n\t\t\t\tname: this.stateLabel(id),\n\t\t\t\ttitle: this.say('deleteState'),\n\t\t\t\twarning: this.say('deleteStateConfirm'),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The removal was confirmed: hand it to the host.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tconfirmRemoval() {\n\t\t\tconst pending = this.pendingRemoval\n\t\t\tif (!pending) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (pending.kind === 'transition') {\n\t\t\t\tthis.removeTransition(pending.id)\n\t\t\t\tthis.pendingRemoval = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event state-remove A state should be removed: `{ id, done }`. The\n\t\t\t * host removes the state with its steps and transitions and calls\n\t\t\t * `done(true)`, or `done(false)` when it could not.\n\t\t\t */\n\t\t\tthis.$emit('state-remove', {\n\t\t\t\tid: pending.id,\n\t\t\t\tdone: (ok) => {\n\t\t\t\t\tif (ok) {\n\t\t\t\t\t\tif (this.selection.id === pending.id) {\n\t\t\t\t\t\t\tthis.clearSelection()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.pendingRemoval = null\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (this.$refs.removeDialog) {\n\t\t\t\t\t\tthis.$refs.removeDialog.setResult({ error: this.say('deleteStateFailed') })\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The removal dialog closed without a removal.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tcancelRemoval() {\n\t\t\tthis.pendingRemoval = null\n\t\t\tthis.syncTick += 1\n\t\t},\n\n\t\t/**\n\t\t * Check the machine and show what is wrong with it.\n\t\t *\n\t\t * @return {boolean} True when nothing blocks: no errors, and no warnings\n\t\t * either when `config.blockOnWarnings` is set.\n\t\t * @public\n\t\t */\n\t\tvalidate() {\n\t\t\tthis.issues = validateStateMachine(\n\t\t\t\t{ states: this.states, transitions: this.transitions },\n\t\t\t\t{\n\t\t\t\t\tkeys: {\n\t\t\t\t\t\tlabel: this.keys.stateLabel,\n\t\t\t\t\t\tfinal: this.keys.stateFinal,\n\t\t\t\t\t\tfrom: this.keys.transitionFrom,\n\t\t\t\t\t\tto: this.keys.transitionTo,\n\t\t\t\t\t\ttransitionLabel: this.keys.transitionLabel,\n\t\t\t\t\t},\n\t\t\t\t\tmessages: this.config.messages,\n\t\t\t\t\ttranslate: (text) => this.tr(text),\n\t\t\t\t},\n\t\t\t)\n\t\t\t/**\n\t\t\t * @event validated The issues validate() found.\n\t\t\t */\n\t\t\tthis.$emit('validated', this.issues)\n\t\t\tconst blocking = this.config.blockOnWarnings === true\n\t\t\t\t? this.issues\n\t\t\t\t: this.issues.filter((issue) => issue.type === 'error')\n\t\t\treturn blocking.length === 0\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-state-machine-editor {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tmin-width: 0;\n}\n\n.cn-state-machine-editor__issues {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--color-warning, #c28900);\n\tborder-inline-start-width: 4px;\n\tborder-radius: var(--border-radius-large, 10px);\n\tbackground: var(--color-main-background, #fff);\n}\n\n.cn-state-machine-editor__issues--error {\n\tborder-color: var(--color-error, #d91812);\n}\n\n.cn-state-machine-editor__issue-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-state-machine-editor__issue {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 14px;\n}\n\n.cn-state-machine-editor__issue--error {\n\tcolor: var(--color-error-text, #c9302c);\n}\n\n.cn-state-machine-editor__issue--warning {\n\tcolor: var(--color-warning-text, #7a5600);\n}\n\n.cn-state-machine-editor__layout {\n\tdisplay: grid;\n\tgrid-template-columns: 220px minmax(0, 1fr) 280px;\n\tgap: 16px;\n\talign-items: start;\n}\n\n.cn-state-machine-editor__palette {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tpadding: 14px;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 12px;\n\tbackground: var(--color-background-hover, #f5f6f8);\n}\n\n.cn-state-machine-editor__palette-title {\n\tmargin: 0;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tletter-spacing: 0.06em;\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__palette-item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 8px 10px;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 8px;\n\tbackground: var(--color-main-background, #fff);\n\tfont-size: 14px;\n\tcursor: grab;\n}\n\n.cn-state-machine-editor__palette-item:hover {\n\tborder-color: var(--color-primary-element, #0082c9);\n}\n\n.cn-state-machine-editor__help {\n\tfont-size: 13px;\n\tline-height: 1.5;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__help p {\n\tmargin: 0 0 6px;\n}\n\n.cn-state-machine-editor__controls {\n\tdisplay: grid;\n\tgrid-template-columns: max-content 1fr;\n\tgap: 4px 8px;\n\tmargin: 0;\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__controls dt {\n\tfont-weight: 600;\n}\n\n.cn-state-machine-editor__controls dd {\n\tmargin: 0;\n}\n\n.cn-state-machine-editor__canvas {\n\tposition: relative;\n\theight: var(--cn-state-machine-canvas-height, 540px);\n\toverflow: hidden;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 12px;\n\tbackground: var(--color-main-background, #fff);\n}\n\n.cn-state-machine-editor__properties {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 16px;\n\tborder: 1px solid var(--color-border, #e4e6ea);\n\tborder-radius: 12px;\n\tbackground: var(--color-main-background, #fff);\n}\n\n.cn-state-machine-editor__empty {\n\tmargin: 0;\n\tfont-size: 14px;\n\tcolor: var(--color-text-maxcontrast, #5e6168);\n}\n\n.cn-state-machine-editor__edge-label {\n\tfont-size: 12px;\n\tfont-weight: 500;\n}\n\n.cn-state-machine-editor__sr {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\toverflow: hidden;\n\tclip-path: inset(50%);\n\twhite-space: nowrap;\n}\n\n/* The board's state card: a 1px outline, a 10px radius and a soft shadow; a\n selected state gets the 2px primary outline. */\n.cn-state-machine-editor__canvas :deep(.cn-flow-node) {\n\tpadding: 10px 12px;\n\tborder: 1px solid var(--color-border-maxcontrast, #828a95);\n\tborder-radius: 10px;\n\tbox-shadow: 0 1px 2px rgba(27, 28, 29, 0.08);\n}\n\n.cn-state-machine-editor__canvas :deep(.cn-flow-node--selected) {\n\tpadding: 9px 11px;\n\tborder: 2px solid var(--color-primary-element, #0082c9);\n}\n\n@media (max-width: 1100px) {\n\t.cn-state-machine-editor__layout {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_Fragment","_renderList","_createBlock","_toDisplayString","_createVNode","_createTextVNode","_openBlock","_withCtx"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import script from './CnStateMachineFields.vue2.js';
2
+ import { render } from './CnStateMachineFields.vue3.js';
3
+
4
+ script.render = render;
5
+ script.__scopeId = "data-v-3e23dab3";
6
+ const __sfc_main = script;
7
+
8
+ export { __sfc_main as default };
9
+ //# sourceMappingURL=CnStateMachineFields.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnStateMachineFields.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}