Flowfile 0.3.9__py3-none-any.whl → 0.4.0__py3-none-any.whl

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.

Potentially problematic release.


This version of Flowfile might be problematic. Click here for more details.

Files changed (169) hide show
  1. flowfile/__init__.py +6 -1
  2. flowfile/api.py +0 -1
  3. flowfile/web/static/assets/{CloudConnectionManager-c97c25f8.js → CloudConnectionManager-109ecc3c.js} +2 -2
  4. flowfile/web/static/assets/{CloudStorageReader-f1ff509e.js → CloudStorageReader-19cdd67a.js} +11 -78
  5. flowfile/web/static/assets/{CloudStorageWriter-034f8b78.js → CloudStorageWriter-48e0ae20.js} +12 -79
  6. flowfile/web/static/assets/{CloudStorageWriter-49c9a4b2.css → CloudStorageWriter-b0ee067f.css} +24 -24
  7. flowfile/web/static/assets/ColumnSelector-47996a16.css +10 -0
  8. flowfile/web/static/assets/ColumnSelector-ecaf7c44.js +83 -0
  9. flowfile/web/static/assets/ContextMenu-2b348c4c.js +41 -0
  10. flowfile/web/static/assets/{SettingsSection-9c836ecc.css → ContextMenu-4c74eef1.css} +0 -21
  11. flowfile/web/static/assets/ContextMenu-63cfa99b.css +26 -0
  12. flowfile/web/static/assets/ContextMenu-a779eed7.js +41 -0
  13. flowfile/web/static/assets/ContextMenu-c13f91d0.css +26 -0
  14. flowfile/web/static/assets/ContextMenu-eca26a03.js +41 -0
  15. flowfile/web/static/assets/{CrossJoin-41efa4cb.css → CrossJoin-1119d18e.css} +18 -18
  16. flowfile/web/static/assets/{CrossJoin-9e156ebe.js → CrossJoin-a88f8142.js} +14 -84
  17. flowfile/web/static/assets/CustomNode-74a37f74.css +32 -0
  18. flowfile/web/static/assets/CustomNode-cb863dff.js +211 -0
  19. flowfile/web/static/assets/{DatabaseConnectionSettings-d5c625b3.js → DatabaseConnectionSettings-819d3267.js} +3 -3
  20. flowfile/web/static/assets/{DatabaseManager-265adc5e.js → DatabaseManager-84ee2834.js} +2 -2
  21. flowfile/web/static/assets/{DatabaseReader-0b10551e.js → DatabaseReader-060dd412.js} +14 -114
  22. flowfile/web/static/assets/{DatabaseReader-f50c6558.css → DatabaseReader-ae61773c.css} +0 -27
  23. flowfile/web/static/assets/{DatabaseWriter-c17c6916.js → DatabaseWriter-7fc7750f.js} +13 -74
  24. flowfile/web/static/assets/{ExploreData-5bdae813.css → ExploreData-2d0cf4db.css} +8 -14
  25. flowfile/web/static/assets/ExploreData-82c95991.js +192 -0
  26. flowfile/web/static/assets/{ExternalSource-3a66556c.js → ExternalSource-e1a6ddc7.js} +8 -79
  27. flowfile/web/static/assets/{Filter-91ad87e7.js → Filter-8aca894a.js} +12 -85
  28. flowfile/web/static/assets/{Filter-a9d08ba1.css → Filter-f62091b3.css} +3 -3
  29. flowfile/web/static/assets/{Formula-29f19d21.css → Formula-bb96803d.css} +4 -4
  30. flowfile/web/static/assets/{Formula-3c395ab1.js → Formula-e33686d9.js} +18 -85
  31. flowfile/web/static/assets/{FuzzyMatch-6857de82.css → FuzzyMatch-1010f966.css} +42 -42
  32. flowfile/web/static/assets/{FuzzyMatch-2df0d230.js → FuzzyMatch-abda150d.js} +16 -87
  33. flowfile/web/static/assets/{GraphSolver-d285877f.js → GraphSolver-4ecad1d7.js} +13 -159
  34. flowfile/web/static/assets/GraphSolver-f0cb7bfb.css +22 -0
  35. flowfile/web/static/assets/{GroupBy-0bd1cc6b.js → GroupBy-656d07f3.js} +12 -75
  36. flowfile/web/static/assets/{Unique-b5615727.css → GroupBy-b9505323.css} +8 -8
  37. flowfile/web/static/assets/{Join-5a78a203.js → Join-b84ec849.js} +15 -85
  38. flowfile/web/static/assets/{Join-f45eff22.css → Join-fd79b451.css} +20 -20
  39. flowfile/web/static/assets/{ManualInput-a71b52c6.css → ManualInput-3246a08d.css} +20 -20
  40. flowfile/web/static/assets/{ManualInput-93aef9d6.js → ManualInput-346f4135.js} +11 -82
  41. flowfile/web/static/assets/MultiSelect-61b98268.js +5 -0
  42. flowfile/web/static/assets/MultiSelect.vue_vue_type_script_setup_true_lang-2a7c8312.js +63 -0
  43. flowfile/web/static/assets/NumericInput-e36602c2.js +5 -0
  44. flowfile/web/static/assets/NumericInput.vue_vue_type_script_setup_true_lang-211a1990.js +35 -0
  45. flowfile/web/static/assets/Output-ddc9079f.css +37 -0
  46. flowfile/web/static/assets/{Output-411ecaee.js → Output-eb041599.js} +13 -243
  47. flowfile/web/static/assets/Pivot-cf333e3d.css +22 -0
  48. flowfile/web/static/assets/{Pivot-89db4b04.js → Pivot-f5c774f4.js} +14 -138
  49. flowfile/web/static/assets/PivotValidation-26546cbc.js +61 -0
  50. flowfile/web/static/assets/PivotValidation-891ddfb0.css +13 -0
  51. flowfile/web/static/assets/PivotValidation-c46cd420.css +13 -0
  52. flowfile/web/static/assets/PivotValidation-e150a24b.js +61 -0
  53. flowfile/web/static/assets/{PolarsCode-a9f974f8.js → PolarsCode-da3a7abf.js} +13 -80
  54. flowfile/web/static/assets/Read-0c768769.js +243 -0
  55. flowfile/web/static/assets/Read-6b17491f.css +62 -0
  56. flowfile/web/static/assets/RecordCount-84736276.js +53 -0
  57. flowfile/web/static/assets/{RecordId-55ae7d36.js → RecordId-60055e6d.js} +8 -80
  58. flowfile/web/static/assets/SQLQueryComponent-36cef432.css +27 -0
  59. flowfile/web/static/assets/SQLQueryComponent-8a486004.js +38 -0
  60. flowfile/web/static/assets/{Sample-b4a18476.js → Sample-2d662611.js} +8 -77
  61. flowfile/web/static/assets/{SecretManager-b066d13a.js → SecretManager-ef586cab.js} +2 -2
  62. flowfile/web/static/assets/{Select-727688dc.js → Select-2e4a6965.js} +11 -85
  63. flowfile/web/static/assets/SettingsSection-2e4d03c4.css +21 -0
  64. flowfile/web/static/assets/{SettingsSection-695ac487.js → SettingsSection-310b61c0.js} +2 -40
  65. flowfile/web/static/assets/SettingsSection-5634f439.js +45 -0
  66. flowfile/web/static/assets/SettingsSection-5c696bee.css +20 -0
  67. flowfile/web/static/assets/SettingsSection-71e6b7e3.css +21 -0
  68. flowfile/web/static/assets/SettingsSection-7c68b19f.js +53 -0
  69. flowfile/web/static/assets/SingleSelect-7298811a.js +5 -0
  70. flowfile/web/static/assets/SingleSelect.vue_vue_type_script_setup_true_lang-43807bad.js +62 -0
  71. flowfile/web/static/assets/SliderInput-53105476.js +40 -0
  72. flowfile/web/static/assets/SliderInput-b8fb6a8c.css +4 -0
  73. flowfile/web/static/assets/{GroupBy-ab1ea74b.css → Sort-3643d625.css} +8 -8
  74. flowfile/web/static/assets/{Sort-be3339a8.js → Sort-4fdebe74.js} +12 -97
  75. flowfile/web/static/assets/TextInput-28366b7e.js +5 -0
  76. flowfile/web/static/assets/TextInput.vue_vue_type_script_setup_true_lang-9cad14ba.js +32 -0
  77. flowfile/web/static/assets/{TextToRows-c92d1ec2.css → TextToRows-5d2c1190.css} +9 -9
  78. flowfile/web/static/assets/{TextToRows-7b8998da.js → TextToRows-73ffa692.js} +14 -83
  79. flowfile/web/static/assets/ToggleSwitch-598add30.js +5 -0
  80. flowfile/web/static/assets/ToggleSwitch.vue_vue_type_script_setup_true_lang-f620cd32.js +31 -0
  81. flowfile/web/static/assets/{UnavailableFields-8b0cb48e.js → UnavailableFields-66239e83.js} +2 -2
  82. flowfile/web/static/assets/Union-26b10614.js +77 -0
  83. flowfile/web/static/assets/{Union-8d9ac7f9.css → Union-af6c3d9b.css} +6 -6
  84. flowfile/web/static/assets/{Unique-af5a80b4.js → Unique-33b9edbb.js} +22 -91
  85. flowfile/web/static/assets/{Sort-7ccfa0fe.css → Unique-f9fb0809.css} +8 -8
  86. flowfile/web/static/assets/Unpivot-1e422df3.css +30 -0
  87. flowfile/web/static/assets/{Unpivot-5195d411.js → Unpivot-ef69d0e2.js} +12 -166
  88. flowfile/web/static/assets/UnpivotValidation-0d240eeb.css +13 -0
  89. flowfile/web/static/assets/UnpivotValidation-8658388e.js +51 -0
  90. flowfile/web/static/assets/{ExploreData-18a4fe52.js → VueGraphicWalker-4d7861f4.js} +4 -264
  91. flowfile/web/static/assets/VueGraphicWalker-ed5ab88b.css +6 -0
  92. flowfile/web/static/assets/{api-023d1733.js → api-2d1394bd.js} +1 -1
  93. flowfile/web/static/assets/{api-cb00cce6.js → api-c908fffe.js} +1 -1
  94. flowfile/web/static/assets/{designer-6c322d8e.js → designer-1667687d.js} +2201 -705
  95. flowfile/web/static/assets/{designer-2197d782.css → designer-665e9408.css} +836 -201
  96. flowfile/web/static/assets/{documentation-4d1fafe1.js → documentation-5eed779e.js} +1 -1
  97. flowfile/web/static/assets/{dropDown-0b46dd77.js → dropDown-41ebe3c2.js} +1 -1
  98. flowfile/web/static/assets/{fullEditor-ec4e4f95.js → fullEditor-0670d32d.js} +2 -2
  99. flowfile/web/static/assets/{genericNodeSettings-def5879b.js → genericNodeSettings-38410ebf.js} +3 -3
  100. flowfile/web/static/assets/{index-681a3ed0.css → index-50508d4d.css} +8 -0
  101. flowfile/web/static/assets/{index-683fc198.js → index-5ec791df.js} +210 -31
  102. flowfile/web/static/assets/outputCsv-059583b6.js +86 -0
  103. flowfile/web/static/assets/{Output-48f81019.css → outputCsv-9cc59e0b.css} +0 -143
  104. flowfile/web/static/assets/outputExcel-76b1e02c.js +56 -0
  105. flowfile/web/static/assets/outputExcel-b41305c0.css +102 -0
  106. flowfile/web/static/assets/outputParquet-440fd4c7.js +31 -0
  107. flowfile/web/static/assets/outputParquet-cf8cf3f2.css +4 -0
  108. flowfile/web/static/assets/readCsv-9813903a.js +178 -0
  109. flowfile/web/static/assets/readCsv-bca3ed53.css +52 -0
  110. flowfile/web/static/assets/readExcel-7f40d237.js +203 -0
  111. flowfile/web/static/assets/readExcel-e1b381ea.css +64 -0
  112. flowfile/web/static/assets/readParquet-22d56002.js +26 -0
  113. flowfile/web/static/assets/readParquet-cee068e2.css +19 -0
  114. flowfile/web/static/assets/{secretApi-baceb6f9.js → secretApi-b3cb072e.js} +1 -1
  115. flowfile/web/static/assets/{selectDynamic-de91449a.js → selectDynamic-7ad95bca.js} +7 -7
  116. flowfile/web/static/assets/{selectDynamic-b062bc9b.css → selectDynamic-aa913ff4.css} +16 -16
  117. flowfile/web/static/assets/user-defined-icon-0ae16c90.png +0 -0
  118. flowfile/web/static/assets/{vue-codemirror.esm-dc5e3348.js → vue-codemirror.esm-b1dfaa46.js} +59 -33
  119. flowfile/web/static/assets/{vue-content-loader.es-ba94b82f.js → vue-content-loader.es-22bac17c.js} +1 -1
  120. flowfile/web/static/index.html +2 -2
  121. {flowfile-0.3.9.dist-info → flowfile-0.4.0.dist-info}/METADATA +1 -1
  122. {flowfile-0.3.9.dist-info → flowfile-0.4.0.dist-info}/RECORD +160 -102
  123. flowfile_core/configs/flow_logger.py +5 -13
  124. flowfile_core/configs/node_store/__init__.py +30 -0
  125. flowfile_core/configs/node_store/nodes.py +383 -99
  126. flowfile_core/configs/node_store/user_defined_node_registry.py +193 -0
  127. flowfile_core/configs/settings.py +2 -1
  128. flowfile_core/database/connection.py +5 -21
  129. flowfile_core/fileExplorer/funcs.py +239 -121
  130. flowfile_core/flowfile/flow_data_engine/flow_file_column/interface.py +4 -0
  131. flowfile_core/flowfile/flow_data_engine/flow_file_column/main.py +19 -34
  132. flowfile_core/flowfile/flow_data_engine/flow_file_column/type_registry.py +36 -0
  133. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +28 -8
  134. flowfile_core/flowfile/flow_graph.py +117 -34
  135. flowfile_core/flowfile/flow_node/flow_node.py +45 -13
  136. flowfile_core/flowfile/handler.py +22 -3
  137. flowfile_core/flowfile/manage/open_flowfile.py +9 -1
  138. flowfile_core/flowfile/node_designer/__init__.py +47 -0
  139. flowfile_core/flowfile/node_designer/_type_registry.py +197 -0
  140. flowfile_core/flowfile/node_designer/custom_node.py +371 -0
  141. flowfile_core/flowfile/node_designer/data_types.py +146 -0
  142. flowfile_core/flowfile/node_designer/ui_components.py +277 -0
  143. flowfile_core/flowfile/schema_callbacks.py +8 -4
  144. flowfile_core/flowfile/setting_generator/settings.py +0 -1
  145. flowfile_core/main.py +5 -1
  146. flowfile_core/routes/routes.py +73 -28
  147. flowfile_core/routes/user_defined_components.py +55 -0
  148. flowfile_core/schemas/input_schema.py +7 -1
  149. flowfile_core/schemas/output_model.py +5 -2
  150. flowfile_core/schemas/schemas.py +8 -3
  151. flowfile_core/schemas/transform_schema.py +1 -0
  152. flowfile_core/utils/validate_setup.py +3 -1
  153. flowfile_worker/__init__.py +6 -35
  154. flowfile_worker/main.py +5 -2
  155. flowfile_worker/routes.py +47 -5
  156. shared/__init__.py +15 -0
  157. shared/storage_config.py +258 -0
  158. flowfile/web/static/assets/GraphSolver-17fd26db.css +0 -68
  159. flowfile/web/static/assets/Pivot-f415e85f.css +0 -35
  160. flowfile/web/static/assets/Read-80dc1675.css +0 -197
  161. flowfile/web/static/assets/Read-c3b1929c.js +0 -701
  162. flowfile/web/static/assets/RecordCount-4e95f98e.js +0 -122
  163. flowfile/web/static/assets/Union-89fd73dc.js +0 -146
  164. flowfile/web/static/assets/Unpivot-246e9bbd.css +0 -77
  165. flowfile/web/static/assets/nodeTitle-a16db7c3.js +0 -227
  166. flowfile/web/static/assets/nodeTitle-f4b12bcb.css +0 -134
  167. {flowfile-0.3.9.dist-info → flowfile-0.4.0.dist-info}/LICENSE +0 -0
  168. {flowfile-0.3.9.dist-info → flowfile-0.4.0.dist-info}/WHEEL +0 -0
  169. {flowfile-0.3.9.dist-info → flowfile-0.4.0.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,11 @@
1
- import { a as axios, d as defineComponent, r as ref, o as onUnmounted, b as resolveComponent, c as openBlock, e as createElementBlock, f as createVNode, w as withCtx, g as createTextVNode, u as unref, h as createBlock, i as createCommentVNode, E as ElNotification, _ as _export_sfc, j as defineStore, k as getDefaultExportFromCjs, l as computed$1, m as watch$1, n as onMounted, p as createBaseVNode, t as toDisplayString, F as Fragment, q as renderList, s as normalizeClass, v as withModifiers, x as withKeys, y as _imports_1, z as ElMessage, A as ElMessageBox, B as inject, C as effectScope, D as provide, G as getCurrentInstance, H as getCurrentScope, I as onScopeDispose, J as createPropsRestProxy, K as toRef, L as renderSlot, M as reactive, N as useSlots, O as isRef, P as toRefs$1, Q as customRef, R as nextTick, S as onBeforeMount, T as normalizeStyle, U as onBeforeUnmount, V as isMemoSame, W as toValue$1, X as shallowRef, Y as h, Z as markRaw$1, $ as readonly, a0 as useAttrs, a1 as mergeProps, a2 as resolveDynamicComponent, a3 as watchEffect, a4 as normalizeProps, a5 as withDirectives, a6 as vModelText, a7 as Teleport, a8 as guardReactiveProps, a9 as __vitePreload, aa as render, ab as vShow, ac as authService, ad as flowfileCorebaseURL } from "./index-683fc198.js";
2
- import { u as useNodeStore, P as PopOver, a as Parser, N as NodeSet, b as NodeType, D as DefaultBufferLength, c as NodeProp, T as Tree, I as IterMode, s as styleTags, t as tags, L as LanguageSupport, d as syntaxTree, i as ifNotIn, e as LRLanguage, f as indentNodeProp, g as delimitedIndent, h as foldNodeProp, j as foldInside, k as completeFromList, l as NodeWeakMap, m as snippetCompletion, H as HighlightStyle, n as syntaxHighlighting, E as EditorView, o as T } from "./vue-codemirror.esm-dc5e3348.js";
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => {
4
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ return value;
6
+ };
7
+ import { a as axios, r as ref, o as onUnmounted, E as ElNotification, d as defineComponent, b as resolveComponent, c as openBlock, e as createElementBlock, f as createVNode, w as withCtx, g as createTextVNode, u as unref, h as createBlock, i as createCommentVNode, _ as _export_sfc, j as defineStore, k as getDefaultExportFromCjs, l as computed$1, m as watch$1, n as onMounted, p as createBaseVNode, t as toDisplayString, F as Fragment, q as renderList, s as normalizeClass, v as withModifiers, x as withKeys, y as _imports_1, z as ElMessage, A as ElMessageBox, B as inject, C as effectScope, D as provide, G as getCurrentInstance, H as getCurrentScope, I as onScopeDispose, J as createPropsRestProxy, K as toRef, L as renderSlot, M as reactive, N as useSlots, O as isRef, P as toRefs$1, Q as customRef, R as nextTick, S as onBeforeMount, T as normalizeStyle, U as onBeforeUnmount, V as isMemoSame, W as toValue$1, X as shallowRef, Y as h, Z as markRaw$1, $ as readonly, a0 as useAttrs, a1 as mergeProps, a2 as resolveDynamicComponent, a3 as watchEffect, a4 as normalizeProps, a5 as defineAsyncComponent, a6 as onErrorCaptured, a7 as __vitePreload, a8 as withDirectives, a9 as vModelText, aa as Teleport, ab as guardReactiveProps, ac as Transition$2, ad as createStaticVNode, ae as render, af as vShow, ag as authService, ah as flowfileCorebaseURL } from "./index-5ec791df.js";
8
+ import { u as useNodeStore, P as PopOver, a as Parser, N as NodeSet, b as NodeType, D as DefaultBufferLength, c as NodeProp, T as Tree, I as IterMode, s as styleTags, t as tags, L as LanguageSupport, d as syntaxTree, i as ifNotIn, e as LRLanguage, f as indentNodeProp, g as delimitedIndent, h as foldNodeProp, j as foldInside, k as completeFromList, l as NodeWeakMap, m as snippetCompletion, H as HighlightStyle, n as syntaxHighlighting, E as EditorView, o as T } from "./vue-codemirror.esm-b1dfaa46.js";
3
9
  const saveFlow = async (flowId, flowPath) => {
4
10
  try {
5
11
  await axios.get("/save_flow", {
@@ -15,14 +21,17 @@ const saveFlow = async (flowId, flowPath) => {
15
21
  console.error("There was an error saving the flow:", error);
16
22
  }
17
23
  };
18
- async function createFlow(flowPath) {
19
- console.log("Creating flow", flowPath);
24
+ async function createFlow(flowPath = null, name = null) {
25
+ console.log("Creating flow", flowPath, name);
20
26
  const response = await axios.post(
21
27
  "/editor/create_flow",
22
28
  {},
23
29
  {
24
30
  headers: { accept: "application/json" },
25
- params: { flow_path: flowPath }
31
+ params: {
32
+ flow_path: flowPath,
33
+ name
34
+ }
26
35
  }
27
36
  );
28
37
  if (response.status === 200) {
@@ -72,8 +81,291 @@ const updateRunStatus = async (flowId, nodeStore, showRunResults = true) => {
72
81
  }
73
82
  return response;
74
83
  };
75
- const _hoisted_1$h = { class: "button-group" };
76
- const _sfc_main$k = /* @__PURE__ */ defineComponent({
84
+ const _FlowExecutionState = class _FlowExecutionState {
85
+ constructor() {
86
+ __publicField(this, "pollingIntervals", /* @__PURE__ */ new Map());
87
+ __publicField(this, "activeExecutions", /* @__PURE__ */ new Map());
88
+ }
89
+ static getInstance() {
90
+ if (!_FlowExecutionState.instance) {
91
+ _FlowExecutionState.instance = new _FlowExecutionState();
92
+ }
93
+ return _FlowExecutionState.instance;
94
+ }
95
+ setPollingInterval(key, interval2) {
96
+ this.pollingIntervals.set(key, interval2);
97
+ }
98
+ getPollingInterval(key) {
99
+ return this.pollingIntervals.get(key) || null;
100
+ }
101
+ clearPollingInterval(key) {
102
+ const interval2 = this.pollingIntervals.get(key);
103
+ if (interval2) {
104
+ clearInterval(interval2);
105
+ this.pollingIntervals.delete(key);
106
+ }
107
+ }
108
+ setExecutionState(key, state2) {
109
+ this.activeExecutions.set(key, state2);
110
+ }
111
+ getExecutionState(key) {
112
+ return this.activeExecutions.get(key) || false;
113
+ }
114
+ clearAll() {
115
+ this.pollingIntervals.forEach((interval2) => clearInterval(interval2));
116
+ this.pollingIntervals.clear();
117
+ this.activeExecutions.clear();
118
+ }
119
+ };
120
+ __publicField(_FlowExecutionState, "instance");
121
+ let FlowExecutionState = _FlowExecutionState;
122
+ function useFlowExecution(flowId, pollingConfig = {
123
+ interval: 2e3,
124
+ enabled: true,
125
+ maxAttempts: Infinity
126
+ }, options = {}) {
127
+ const nodeStore = useNodeStore();
128
+ const state2 = FlowExecutionState.getInstance();
129
+ const localPollingInterval = ref(null);
130
+ const isExecuting = ref(false);
131
+ const getFlowId = () => {
132
+ return typeof flowId === "number" ? flowId : flowId.value;
133
+ };
134
+ const getPollingKey = (suffix = "") => {
135
+ const customKey = options.pollingKey || `flow_${getFlowId()}`;
136
+ return suffix ? `${customKey}_${suffix}` : customKey;
137
+ };
138
+ const freezeFlow = () => {
139
+ const vueFlowElement = nodeStore.vueFlowInstance;
140
+ if (vueFlowElement) {
141
+ vueFlowElement.nodesDraggable.value = false;
142
+ vueFlowElement.nodesConnectable.value = false;
143
+ vueFlowElement.elementsSelectable.value = false;
144
+ }
145
+ };
146
+ const unFreezeFlow = () => {
147
+ const vueFlowElement = nodeStore.vueFlowInstance;
148
+ if (vueFlowElement) {
149
+ vueFlowElement.nodesDraggable.value = true;
150
+ vueFlowElement.nodesConnectable.value = true;
151
+ vueFlowElement.elementsSelectable.value = true;
152
+ }
153
+ };
154
+ const showNotification = (title, message, type, dangerouslyUseHTMLString) => {
155
+ ElNotification({
156
+ title,
157
+ message,
158
+ type,
159
+ position: "top-left",
160
+ dangerouslyUseHTMLString
161
+ });
162
+ };
163
+ const startPolling = (checkFn, pollingKeySuffix = "") => {
164
+ const key = getPollingKey(pollingKeySuffix);
165
+ if (options.persistPolling) {
166
+ const existingInterval = state2.getPollingInterval(key);
167
+ if (existingInterval === null && pollingConfig.enabled) {
168
+ const interval2 = setInterval(checkFn, pollingConfig.interval || 2e3);
169
+ state2.setPollingInterval(key, interval2);
170
+ }
171
+ } else {
172
+ if (localPollingInterval.value === null && pollingConfig.enabled) {
173
+ localPollingInterval.value = setInterval(
174
+ checkFn,
175
+ pollingConfig.interval || 2e3
176
+ );
177
+ }
178
+ }
179
+ };
180
+ const stopPolling = (pollingKeySuffix = "") => {
181
+ if (options.persistPolling) {
182
+ const key = getPollingKey(pollingKeySuffix);
183
+ state2.clearPollingInterval(key);
184
+ } else {
185
+ if (localPollingInterval.value !== null) {
186
+ clearInterval(localPollingInterval.value);
187
+ localPollingInterval.value = null;
188
+ }
189
+ }
190
+ };
191
+ const isPollingActive = (pollingKeySuffix = "") => {
192
+ if (options.persistPolling) {
193
+ const key = getPollingKey(pollingKeySuffix);
194
+ return state2.getPollingInterval(key) !== null;
195
+ }
196
+ return localPollingInterval.value !== null;
197
+ };
198
+ const createNotificationConfig = (runInfo) => ({
199
+ title: runInfo.success ? "Success" : "Error",
200
+ message: runInfo.success ? "The operation has completed successfully" : "There were issues with the operation, check the logging for more information",
201
+ type: runInfo.success ? "success" : "error"
202
+ });
203
+ const checkRunStatus = async (customSuccessMessage, pollingKeySuffix = "") => {
204
+ try {
205
+ const response = await updateRunStatus(getFlowId(), nodeStore);
206
+ if (response.status === 200) {
207
+ stopPolling(pollingKeySuffix);
208
+ unFreezeFlow();
209
+ nodeStore.isRunning = false;
210
+ isExecuting.value = false;
211
+ state2.setExecutionState(getPollingKey(pollingKeySuffix), false);
212
+ console.log("response data", response.data);
213
+ const notificationConfig = createNotificationConfig(response.data);
214
+ if (customSuccessMessage && response.data.success) {
215
+ notificationConfig.message = customSuccessMessage;
216
+ }
217
+ showNotification(
218
+ notificationConfig.title,
219
+ notificationConfig.message,
220
+ notificationConfig.type
221
+ );
222
+ } else if (response.status === 404) {
223
+ stopPolling(pollingKeySuffix);
224
+ unFreezeFlow();
225
+ nodeStore.isRunning = false;
226
+ isExecuting.value = false;
227
+ state2.setExecutionState(getPollingKey(pollingKeySuffix), false);
228
+ nodeStore.runResults = {};
229
+ }
230
+ } catch (error) {
231
+ console.error("Error checking run status:", error);
232
+ stopPolling(pollingKeySuffix);
233
+ unFreezeFlow();
234
+ nodeStore.isRunning = false;
235
+ isExecuting.value = false;
236
+ state2.setExecutionState(getPollingKey(pollingKeySuffix), false);
237
+ }
238
+ };
239
+ const escapeHtml = (text) => {
240
+ const div = document.createElement("div");
241
+ div.textContent = text;
242
+ return div.innerHTML;
243
+ };
244
+ const runFlow = async () => {
245
+ const flowSettings = await getFlowSettings(getFlowId());
246
+ if (!flowSettings) {
247
+ throw new Error("Failed to retrieve flow settings");
248
+ }
249
+ freezeFlow();
250
+ nodeStore.resetNodeResult();
251
+ isExecuting.value = true;
252
+ nodeStore.isRunning = true;
253
+ nodeStore.hideLogViewerForThisRun = false;
254
+ state2.setExecutionState(getPollingKey(), true);
255
+ const executionLocationText = flowSettings.execution_location === "local" ? "Local" : "Remote";
256
+ const escapedFlowName = escapeHtml(flowSettings.name);
257
+ const notificationMessage = `
258
+ <div style="line-height: 1.4;">
259
+ <div><strong>Flow:</strong> "${escapedFlowName}"</div>
260
+ <div><strong>Mode:</strong> ${flowSettings.execution_mode}</div>
261
+ <div><strong>Location:</strong> ${executionLocationText}</div>
262
+ </div>
263
+ `;
264
+ showNotification("🚀 Flow Started", notificationMessage, void 0, true);
265
+ try {
266
+ await axios.post("/flow/run/", null, {
267
+ params: { flow_id: getFlowId() },
268
+ headers: { accept: "application/json" }
269
+ });
270
+ nodeStore.showLogViewer();
271
+ startPolling(() => checkRunStatus());
272
+ } catch (error) {
273
+ console.error("Error starting run:", error);
274
+ unFreezeFlow();
275
+ nodeStore.isRunning = false;
276
+ isExecuting.value = false;
277
+ state2.setExecutionState(getPollingKey(), false);
278
+ showNotification("Error", "Failed to start the flow", "error");
279
+ }
280
+ };
281
+ const triggerNodeFetch = async (nodeId) => {
282
+ var _a, _b;
283
+ const pollingKeySuffix = `node_${nodeId}`;
284
+ if (isPollingActive(pollingKeySuffix)) {
285
+ console.log(`Node ${nodeId} fetch already in progress`);
286
+ return;
287
+ }
288
+ freezeFlow();
289
+ nodeStore.resetNodeResult();
290
+ isExecuting.value = true;
291
+ nodeStore.isRunning = true;
292
+ state2.setExecutionState(getPollingKey(pollingKeySuffix), true);
293
+ showNotification(
294
+ "📊 Fetching Node Data",
295
+ `Starting data fetch for node ${nodeId}...`,
296
+ void 0,
297
+ false
298
+ );
299
+ try {
300
+ await axios.post("/node/trigger_fetch_data", null, {
301
+ params: {
302
+ flow_id: getFlowId(),
303
+ node_id: nodeId
304
+ },
305
+ headers: { accept: "application/json" }
306
+ });
307
+ nodeStore.showLogViewer();
308
+ startPolling(
309
+ () => checkRunStatus("Node data has been fetched successfully", pollingKeySuffix),
310
+ pollingKeySuffix
311
+ );
312
+ } catch (error) {
313
+ console.error("Error triggering node fetch:", error);
314
+ unFreezeFlow();
315
+ nodeStore.isRunning = false;
316
+ isExecuting.value = false;
317
+ state2.setExecutionState(getPollingKey(pollingKeySuffix), false);
318
+ const errorMessage = ((_b = (_a = error.response) == null ? void 0 : _a.data) == null ? void 0 : _b.detail) || "Failed to fetch node data";
319
+ showNotification("Error", errorMessage, "error");
320
+ throw error;
321
+ }
322
+ };
323
+ const cancelFlow = async () => {
324
+ try {
325
+ await axios.post("/flow/cancel/", null, {
326
+ params: { flow_id: getFlowId() },
327
+ headers: { accept: "application/json" }
328
+ });
329
+ showNotification("Cancelling", "The operation is being cancelled");
330
+ unFreezeFlow();
331
+ nodeStore.isRunning = false;
332
+ isExecuting.value = false;
333
+ stopPolling();
334
+ if (options.persistPolling) {
335
+ for (let i2 = 0; i2 < 100; i2++) {
336
+ state2.clearPollingInterval(getPollingKey(`node_${i2}`));
337
+ }
338
+ }
339
+ } catch (error) {
340
+ console.error("Error cancelling run:", error);
341
+ showNotification("Error", "Failed to cancel the operation", "error");
342
+ }
343
+ };
344
+ onUnmounted(() => {
345
+ if (!options.persistPolling && localPollingInterval.value !== null) {
346
+ clearInterval(localPollingInterval.value);
347
+ localPollingInterval.value = null;
348
+ }
349
+ });
350
+ return {
351
+ // State
352
+ isExecuting,
353
+ // Methods
354
+ runFlow,
355
+ triggerNodeFetch,
356
+ cancelFlow,
357
+ showNotification,
358
+ startPolling,
359
+ stopPolling,
360
+ checkRunStatus,
361
+ isPollingActive,
362
+ // Expose flow control if needed
363
+ freezeFlow,
364
+ unFreezeFlow
365
+ };
366
+ }
367
+ const _hoisted_1$k = { class: "button-group" };
368
+ const _sfc_main$n = /* @__PURE__ */ defineComponent({
77
369
  __name: "run",
78
370
  props: {
79
371
  flowId: { type: Number, required: true },
@@ -84,133 +376,20 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
84
376
  enabled: true,
85
377
  maxAttempts: Infinity
86
378
  })
379
+ },
380
+ persistPolling: {
381
+ type: Boolean,
382
+ default: false
383
+ // RunButton doesn't need persistent polling by default
87
384
  }
88
385
  },
89
386
  emits: ["logs-start", "logs-stop"],
90
387
  setup(__props, { expose: __expose, emit: __emit }) {
91
388
  const nodeStore = useNodeStore();
92
- const pollingInterval = ref(null);
93
389
  const props2 = __props;
94
- const freezeFlow = () => {
95
- let vueFlowElement = nodeStore.vueFlowInstance;
96
- if (vueFlowElement) {
97
- vueFlowElement.nodesDraggable.value = false;
98
- vueFlowElement.nodesConnectable.value = false;
99
- vueFlowElement.elementsSelectable.value = false;
100
- }
101
- };
102
- const unFreezeFlow = () => {
103
- let vueFlowElement = nodeStore.vueFlowInstance;
104
- if (vueFlowElement) {
105
- vueFlowElement.nodesDraggable.value = true;
106
- vueFlowElement.nodesConnectable.value = true;
107
- vueFlowElement.elementsSelectable.value = true;
108
- }
109
- };
110
- const showNotification = (title, message, type, dangerouslyUseHTMLString) => {
111
- ElNotification({
112
- title,
113
- message,
114
- type,
115
- position: "top-left",
116
- dangerouslyUseHTMLString
117
- });
118
- };
119
- const startPolling = (checkFn) => {
120
- if (pollingInterval.value === null && props2.pollingConfig.enabled) {
121
- pollingInterval.value = setInterval(checkFn, props2.pollingConfig.interval);
122
- }
123
- };
124
- const stopPolling = () => {
125
- if (pollingInterval.value !== null) {
126
- clearInterval(pollingInterval.value);
127
- pollingInterval.value = null;
128
- }
129
- };
130
- const createNotificationConfig = (runInfo) => ({
131
- title: runInfo.success ? "Success" : "Error",
132
- message: runInfo.success ? "The flow has completed" : "There were issues with the flow run, check the logging for more information",
133
- type: runInfo.success ? "success" : "error"
134
- });
135
- const checkRunStatus = async () => {
136
- try {
137
- const response = await updateRunStatus(props2.flowId, nodeStore);
138
- if (response.status === 200) {
139
- stopPolling();
140
- unFreezeFlow();
141
- nodeStore.isRunning = false;
142
- const notificationConfig = createNotificationConfig(response.data);
143
- showNotification(
144
- notificationConfig.title,
145
- notificationConfig.message,
146
- notificationConfig.type
147
- );
148
- } else if (response.status === 404) {
149
- stopPolling();
150
- unFreezeFlow();
151
- nodeStore.isRunning = false;
152
- nodeStore.runResults = {};
153
- }
154
- } catch (error) {
155
- console.error("Error checking run status:", error);
156
- stopPolling();
157
- unFreezeFlow();
158
- nodeStore.isRunning = false;
159
- }
160
- };
161
- const runFlow = async () => {
162
- const flowSettings = await getFlowSettings(nodeStore.flow_id);
163
- if (!flowSettings) {
164
- throw new Error("Failed to retrieve flow settings");
165
- }
166
- const escapeHtml = (text) => {
167
- const div = document.createElement("div");
168
- div.textContent = text;
169
- return div.innerHTML;
170
- };
171
- freezeFlow();
172
- nodeStore.resetNodeResult();
173
- const executionLocationText = flowSettings.execution_location === "local" ? "Local" : "Remote";
174
- const escapedFlowName = escapeHtml(flowSettings.name);
175
- const notificationMessage = `
176
- <div style="line-height: 1.4;">
177
- <div><strong>Flow:</strong> "${escapedFlowName}"</div>
178
- <div><strong>Mode:</strong> ${flowSettings.execution_mode}</div>
179
- <div><strong>Location:</strong> ${executionLocationText}</div>
180
- </div>
181
- `;
182
- showNotification("🚀 Flow Started", notificationMessage, void 0, true);
183
- try {
184
- await axios.post("/flow/run/", null, {
185
- params: { flow_id: props2.flowId },
186
- headers: { accept: "application/json" }
187
- });
188
- nodeStore.isRunning = true;
189
- nodeStore.showLogViewer();
190
- startPolling(checkRunStatus);
191
- } catch (error) {
192
- console.error("Error starting run:", error);
193
- unFreezeFlow();
194
- nodeStore.isRunning = false;
195
- }
196
- };
197
- const cancelFlow = async () => {
198
- try {
199
- await axios.post("/flow/cancel/", null, {
200
- params: { flow_id: props2.flowId },
201
- headers: { accept: "application/json" }
202
- });
203
- showNotification("Cancelling", "The flow is being cancelled");
204
- unFreezeFlow();
205
- nodeStore.isRunning = false;
206
- stopPolling();
207
- } catch (error) {
208
- console.error("Error cancelling run:", error);
209
- showNotification("Error", "Failed to cancel the flow", "error");
210
- }
211
- };
212
- onUnmounted(() => {
213
- stopPolling();
390
+ const { runFlow, cancelFlow, showNotification, startPolling, stopPolling, checkRunStatus } = useFlowExecution(props2.flowId, props2.pollingConfig, {
391
+ persistPolling: props2.persistPolling,
392
+ pollingKey: `run_button_${props2.flowId}`
214
393
  });
215
394
  __expose({
216
395
  startPolling,
@@ -222,12 +401,12 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
222
401
  });
223
402
  return (_ctx, _cache) => {
224
403
  const _component_el_button = resolveComponent("el-button");
225
- return openBlock(), createElementBlock("div", _hoisted_1$h, [
404
+ return openBlock(), createElementBlock("div", _hoisted_1$k, [
226
405
  createVNode(_component_el_button, {
227
406
  size: "small",
228
407
  disabled: unref(nodeStore).isRunning,
229
408
  round: "",
230
- onClick: _cache[0] || (_cache[0] = ($event) => runFlow())
409
+ onClick: _cache[0] || (_cache[0] = ($event) => unref(runFlow)())
231
410
  }, {
232
411
  default: withCtx(() => _cache[2] || (_cache[2] = [
233
412
  createTextVNode(" Run ")
@@ -239,7 +418,7 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
239
418
  key: 0,
240
419
  size: "small",
241
420
  round: "",
242
- onClick: _cache[1] || (_cache[1] = ($event) => cancelFlow())
421
+ onClick: _cache[1] || (_cache[1] = ($event) => unref(cancelFlow)())
243
422
  }, {
244
423
  default: withCtx(() => _cache[3] || (_cache[3] = [
245
424
  createTextVNode(" Cancel ")
@@ -251,8 +430,8 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
251
430
  };
252
431
  }
253
432
  });
254
- const run_vue_vue_type_style_index_0_scoped_e9cba087_lang = "";
255
- const RunButton = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-e9cba087"]]);
433
+ const run_vue_vue_type_style_index_0_scoped_c0f9acc7_lang = "";
434
+ const RunButton = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["__scopeId", "data-v-c0f9acc7"]]);
256
435
  const _imports_0 = "/images/sheets.png";
257
436
  const useFileBrowserStore = defineStore("fileBrowser", {
258
437
  state: () => ({
@@ -275,7 +454,7 @@ const useFileBrowserStore = defineStore("fileBrowser", {
275
454
  }
276
455
  }
277
456
  });
278
- const handleApiError = (error) => {
457
+ const handleApiError$1 = (error) => {
279
458
  var _a, _b, _c;
280
459
  throw {
281
460
  message: ((_b = (_a = error.response) == null ? void 0 : _a.data) == null ? void 0 : _b.detail) || "An unknown error occurred",
@@ -287,7 +466,7 @@ const getCurrentDirectoryContents = async (params) => {
287
466
  const response = await axios.get("files/current_directory_contents/", { params });
288
467
  return response.data;
289
468
  } catch (error) {
290
- return handleApiError(error);
469
+ return handleApiError$1(error);
291
470
  }
292
471
  };
293
472
  const navigateUp = async () => {
@@ -295,7 +474,7 @@ const navigateUp = async () => {
295
474
  const response = await axios.post("files/navigate_up/");
296
475
  return response.data;
297
476
  } catch (error) {
298
- return handleApiError(error);
477
+ return handleApiError$1(error);
299
478
  }
300
479
  };
301
480
  const navigateInto = async (directoryName) => {
@@ -305,7 +484,7 @@ const navigateInto = async (directoryName) => {
305
484
  });
306
485
  return response.data;
307
486
  } catch (error) {
308
- return handleApiError(error);
487
+ return handleApiError$1(error);
309
488
  }
310
489
  };
311
490
  const navigateTo = async (directoryPath) => {
@@ -315,7 +494,7 @@ const navigateTo = async (directoryPath) => {
315
494
  });
316
495
  return response.data;
317
496
  } catch (error) {
318
- return handleApiError(error);
497
+ return handleApiError$1(error);
319
498
  }
320
499
  };
321
500
  const getCurrentPath = async () => {
@@ -323,7 +502,7 @@ const getCurrentPath = async () => {
323
502
  const response = await axios.get("files/current_path/");
324
503
  return response.data;
325
504
  } catch (error) {
326
- return handleApiError(error);
505
+ return handleApiError$1(error);
327
506
  }
328
507
  };
329
508
  function assertPath(path2) {
@@ -749,16 +928,16 @@ var posix = {
749
928
  posix.posix = posix;
750
929
  var pathBrowserify = posix;
751
930
  const path = /* @__PURE__ */ getDefaultExportFromCjs(pathBrowserify);
752
- const _hoisted_1$g = { class: "file-browser" };
753
- const _hoisted_2$d = { class: "browser-content" };
754
- const _hoisted_3$c = { class: "browser-toolbar" };
755
- const _hoisted_4$9 = { class: "path-navigation" };
756
- const _hoisted_5$7 = ["disabled"];
757
- const _hoisted_6$6 = { class: "current-path" };
758
- const _hoisted_7$3 = { class: "controls-row" };
759
- const _hoisted_8$1 = { class: "search-container" };
760
- const _hoisted_9 = { class: "sort-controls" };
761
- const _hoisted_10 = { class: "material-icons" };
931
+ const _hoisted_1$j = { class: "file-browser" };
932
+ const _hoisted_2$h = { class: "browser-content" };
933
+ const _hoisted_3$g = { class: "browser-toolbar" };
934
+ const _hoisted_4$b = { class: "path-navigation" };
935
+ const _hoisted_5$8 = ["disabled"];
936
+ const _hoisted_6$7 = { class: "current-path" };
937
+ const _hoisted_7$5 = { class: "controls-row" };
938
+ const _hoisted_8$3 = { class: "search-container" };
939
+ const _hoisted_9$2 = { class: "sort-controls" };
940
+ const _hoisted_10$1 = { class: "material-icons" };
762
941
  const _hoisted_11 = { class: "show-hidden-toggle" };
763
942
  const _hoisted_12 = { class: "browser-main" };
764
943
  const _hoisted_13 = {
@@ -788,7 +967,7 @@ const _hoisted_20 = { class: "file-details" };
788
967
  const _hoisted_21 = { class: "file-info" };
789
968
  const _hoisted_22 = { class: "browser-actions" };
790
969
  const _hoisted_23 = { class: "dialog-footer" };
791
- const _sfc_main$j = /* @__PURE__ */ defineComponent({
970
+ const _sfc_main$m = /* @__PURE__ */ defineComponent({
792
971
  __name: "fileBrowser",
793
972
  props: {
794
973
  allowedFileTypes: { default: () => [] },
@@ -1069,16 +1248,16 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1069
1248
  const _component_el_form_item = resolveComponent("el-form-item");
1070
1249
  const _component_el_form = resolveComponent("el-form");
1071
1250
  const _component_el_dialog = resolveComponent("el-dialog");
1072
- return openBlock(), createElementBlock("div", _hoisted_1$g, [
1073
- _cache[17] || (_cache[17] = createBaseVNode("div", { class: "browser-header" }, [
1251
+ return openBlock(), createElementBlock("div", _hoisted_1$j, [
1252
+ _cache[16] || (_cache[16] = createBaseVNode("div", { class: "browser-header" }, [
1074
1253
  createBaseVNode("div", { class: "browser-title" }, [
1075
1254
  createBaseVNode("span", { class: "material-icons" }, "folder"),
1076
1255
  createBaseVNode("span", null, "File Browser")
1077
1256
  ])
1078
1257
  ], -1)),
1079
- createBaseVNode("div", _hoisted_2$d, [
1080
- createBaseVNode("div", _hoisted_3$c, [
1081
- createBaseVNode("div", _hoisted_4$9, [
1258
+ createBaseVNode("div", _hoisted_2$h, [
1259
+ createBaseVNode("div", _hoisted_3$g, [
1260
+ createBaseVNode("div", _hoisted_4$b, [
1082
1261
  createBaseVNode("button", {
1083
1262
  class: "nav-button",
1084
1263
  disabled: loading.value,
@@ -1086,11 +1265,11 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1086
1265
  }, _cache[7] || (_cache[7] = [
1087
1266
  createBaseVNode("span", { class: "material-icons" }, "arrow_upward", -1),
1088
1267
  createBaseVNode("span", null, "Up", -1)
1089
- ]), 8, _hoisted_5$7),
1090
- createBaseVNode("div", _hoisted_6$6, toDisplayString(currentPath.value), 1)
1268
+ ]), 8, _hoisted_5$8),
1269
+ createBaseVNode("div", _hoisted_6$7, toDisplayString(currentPath.value), 1)
1091
1270
  ]),
1092
- createBaseVNode("div", _hoisted_7$3, [
1093
- createBaseVNode("div", _hoisted_8$1, [
1271
+ createBaseVNode("div", _hoisted_7$5, [
1272
+ createBaseVNode("div", _hoisted_8$3, [
1094
1273
  createVNode(_component_el_input, {
1095
1274
  modelValue: searchTerm.value,
1096
1275
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchTerm.value = $event),
@@ -1103,7 +1282,7 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1103
1282
  _: 1
1104
1283
  }, 8, ["modelValue"])
1105
1284
  ]),
1106
- createBaseVNode("div", _hoisted_9, [
1285
+ createBaseVNode("div", _hoisted_9$2, [
1107
1286
  createVNode(_component_el_select, {
1108
1287
  modelValue: sortBy.value,
1109
1288
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => sortBy.value = $event),
@@ -1137,7 +1316,7 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1137
1316
  onClick: toggleSortDirection
1138
1317
  }, {
1139
1318
  default: withCtx(() => [
1140
- createBaseVNode("span", _hoisted_10, toDisplayString(sortDirection.value === "asc" ? "arrow_upward" : "arrow_downward"), 1)
1319
+ createBaseVNode("span", _hoisted_10$1, toDisplayString(sortDirection.value === "asc" ? "arrow_upward" : "arrow_downward"), 1)
1141
1320
  ]),
1142
1321
  _: 1
1143
1322
  })
@@ -1253,21 +1432,6 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1253
1432
  ])),
1254
1433
  _: 1,
1255
1434
  __: [13]
1256
- }, 8, ["disabled"])) : createCommentVNode("", true),
1257
- _ctx.mode === "open" && selectedFile.value && !selectedFile.value.is_directory ? (openBlock(), createBlock(_component_el_button, {
1258
- key: 3,
1259
- type: "primary",
1260
- disabled: loading.value,
1261
- size: "small",
1262
- style: { "background-color": "rgb(92, 92, 92)", "color": "white" },
1263
- onClick: handleOpenFile
1264
- }, {
1265
- default: withCtx(() => _cache[14] || (_cache[14] = [
1266
- createBaseVNode("span", { class: "material-icons" }, "open_in_new", -1),
1267
- createTextVNode(" Open File ")
1268
- ])),
1269
- _: 1,
1270
- __: [14]
1271
1435
  }, 8, ["disabled"])) : createCommentVNode("", true)
1272
1436
  ])
1273
1437
  ]),
@@ -1284,22 +1448,22 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1284
1448
  createVNode(_component_el_button, {
1285
1449
  onClick: _cache[5] || (_cache[5] = ($event) => showCreateDialog.value = false)
1286
1450
  }, {
1287
- default: withCtx(() => _cache[15] || (_cache[15] = [
1451
+ default: withCtx(() => _cache[14] || (_cache[14] = [
1288
1452
  createTextVNode("Cancel")
1289
1453
  ])),
1290
1454
  _: 1,
1291
- __: [15]
1455
+ __: [14]
1292
1456
  }),
1293
1457
  createVNode(_component_el_button, {
1294
1458
  type: "primary",
1295
1459
  disabled: !newFileName.value.trim(),
1296
1460
  onClick: handleCreateFile
1297
1461
  }, {
1298
- default: withCtx(() => _cache[16] || (_cache[16] = [
1462
+ default: withCtx(() => _cache[15] || (_cache[15] = [
1299
1463
  createTextVNode(" Create ")
1300
1464
  ])),
1301
1465
  _: 1,
1302
- __: [16]
1466
+ __: [15]
1303
1467
  }, 8, ["disabled"])
1304
1468
  ])
1305
1469
  ]),
@@ -1334,15 +1498,19 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1334
1498
  };
1335
1499
  }
1336
1500
  });
1337
- const fileBrowser_vue_vue_type_style_index_0_scoped_d5bb1173_lang = "";
1338
- const FileBrowser = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["__scopeId", "data-v-d5bb1173"]]);
1339
- const _hoisted_1$f = { class: "action-buttons" };
1340
- const _hoisted_2$c = { key: 0 };
1341
- const _hoisted_3$b = { class: "settings-modal-content" };
1342
- const _hoisted_4$8 = { class: "form-group" };
1343
- const _hoisted_5$6 = { class: "form-group" };
1344
- const _hoisted_6$5 = { class: "form-group" };
1345
- const _sfc_main$i = /* @__PURE__ */ defineComponent({
1501
+ const fileBrowser_vue_vue_type_style_index_0_scoped_b74852a7_lang = "";
1502
+ const FileBrowser = /* @__PURE__ */ _export_sfc(_sfc_main$m, [["__scopeId", "data-v-b74852a7"]]);
1503
+ const _hoisted_1$i = { class: "action-buttons" };
1504
+ const _hoisted_2$g = { class: "quick-create-modal" };
1505
+ const _hoisted_3$f = { class: "form-group" };
1506
+ const _hoisted_4$a = { class: "preview-text" };
1507
+ const _hoisted_5$7 = { class: "dialog-footer" };
1508
+ const _hoisted_6$6 = { key: 0 };
1509
+ const _hoisted_7$4 = { class: "settings-modal-content" };
1510
+ const _hoisted_8$2 = { class: "form-group" };
1511
+ const _hoisted_9$1 = { class: "form-group" };
1512
+ const _hoisted_10 = { class: "form-group" };
1513
+ const _sfc_main$l = /* @__PURE__ */ defineComponent({
1346
1514
  __name: "HeaderButtons",
1347
1515
  emits: ["openFlow", "refreshFlow", "logs-start", "logs-stop"],
1348
1516
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -1350,16 +1518,35 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1350
1518
  const modalVisibleForOpen = ref(false);
1351
1519
  const modalVisibleForSave = ref(false);
1352
1520
  const modalVisibleForCreate = ref(false);
1521
+ const modalVisibleForQuickCreate = ref(false);
1353
1522
  const modalVisibleForSettings = ref(false);
1354
1523
  const flowSettings = ref(null);
1355
1524
  const savePath = ref(void 0);
1356
1525
  const runButton = ref(null);
1526
+ const quickCreateName = ref("");
1357
1527
  const executionModes = ref(["Development", "Performance"]);
1358
1528
  const executionLocationOptions = ref([
1359
1529
  { key: "local", label: "Local" },
1360
1530
  { key: "remote", label: "Remote" }
1361
1531
  ]);
1362
1532
  const emit = __emit;
1533
+ const generateDefaultFileName = () => {
1534
+ const now2 = /* @__PURE__ */ new Date();
1535
+ const year = now2.getFullYear();
1536
+ const month = String(now2.getMonth() + 1).padStart(2, "0");
1537
+ const day = String(now2.getDate()).padStart(2, "0");
1538
+ const hours = String(now2.getHours()).padStart(2, "0");
1539
+ const minutes = String(now2.getMinutes()).padStart(2, "0");
1540
+ const seconds = String(now2.getSeconds()).padStart(2, "0");
1541
+ return `${year}${month}${day}_${hours}${minutes}${seconds}_flow.flowfile`;
1542
+ };
1543
+ const getPreviewFileName = () => {
1544
+ if (quickCreateName.value.trim()) {
1545
+ const name = quickCreateName.value.trim();
1546
+ return name.endsWith(".flowfile") ? name : `${name}.flowfile`;
1547
+ }
1548
+ return generateDefaultFileName();
1549
+ };
1363
1550
  const loadFlowSettings = async () => {
1364
1551
  if (!(nodeStore.flow_id && nodeStore.flow_id > 0))
1365
1552
  return;
@@ -1422,11 +1609,23 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1422
1609
  const pathWithoutExtension = flowPath.replace(/\.[^/.]+$/, "");
1423
1610
  const normalizedPath = `${pathWithoutExtension}.flowfile`;
1424
1611
  const createdFlowId = await createFlow(normalizedPath);
1425
- await saveFlow(createdFlowId, normalizedPath);
1426
1612
  modalVisibleForCreate.value = false;
1427
1613
  nodeStore.flow_id = createdFlowId;
1428
1614
  emit("refreshFlow");
1429
1615
  };
1616
+ const handleQuickCreateAction = async () => {
1617
+ const fileName = getPreviewFileName();
1618
+ console.log("Creating flow with name:", fileName);
1619
+ try {
1620
+ const createdFlowId = await createFlow(null, fileName);
1621
+ modalVisibleForQuickCreate.value = false;
1622
+ quickCreateName.value = "";
1623
+ nodeStore.flow_id = createdFlowId;
1624
+ emit("refreshFlow");
1625
+ } catch (error) {
1626
+ console.error("Failed to create quick flow:", error);
1627
+ }
1628
+ };
1430
1629
  const openSettingsModal = () => {
1431
1630
  modalVisibleForSettings.value = true;
1432
1631
  };
@@ -1441,6 +1640,7 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1441
1640
  __expose({
1442
1641
  loadFlowSettings,
1443
1642
  openCreateDialog: () => modalVisibleForCreate.value = true,
1643
+ handleQuickCreateAction,
1444
1644
  openOpenDialog: () => modalVisibleForOpen.value = true,
1445
1645
  openSaveModal: () => modalVisibleForSave.value = true,
1446
1646
  runFlow
@@ -1452,36 +1652,45 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1452
1652
  });
1453
1653
  return (_ctx, _cache) => {
1454
1654
  const _component_el_dialog = resolveComponent("el-dialog");
1655
+ const _component_el_input = resolveComponent("el-input");
1656
+ const _component_el_button = resolveComponent("el-button");
1455
1657
  const _component_el_option = resolveComponent("el-option");
1456
1658
  const _component_el_select = resolveComponent("el-select");
1457
1659
  const _component_el_checkbox = resolveComponent("el-checkbox");
1458
1660
  return openBlock(), createElementBlock(Fragment, null, [
1459
- createBaseVNode("div", _hoisted_1$f, [
1661
+ createBaseVNode("div", _hoisted_1$i, [
1460
1662
  createBaseVNode("button", {
1461
1663
  class: "action-btn",
1462
1664
  onClick: openSaveModal
1463
- }, _cache[9] || (_cache[9] = [
1665
+ }, _cache[13] || (_cache[13] = [
1464
1666
  createBaseVNode("span", { class: "material-icons btn-icon" }, "save", -1),
1465
1667
  createBaseVNode("span", { class: "btn-text" }, "Save", -1)
1466
1668
  ])),
1467
1669
  createBaseVNode("button", {
1468
1670
  class: "action-btn",
1469
1671
  onClick: _cache[0] || (_cache[0] = ($event) => modalVisibleForOpen.value = true)
1470
- }, _cache[10] || (_cache[10] = [
1672
+ }, _cache[14] || (_cache[14] = [
1471
1673
  createBaseVNode("span", { class: "material-icons btn-icon" }, "folder_open", -1),
1472
1674
  createBaseVNode("span", { class: "btn-text" }, "Open", -1)
1473
1675
  ])),
1474
1676
  createBaseVNode("button", {
1475
1677
  class: "action-btn",
1476
1678
  onClick: _cache[1] || (_cache[1] = ($event) => modalVisibleForCreate.value = true)
1477
- }, _cache[11] || (_cache[11] = [
1679
+ }, _cache[15] || (_cache[15] = [
1478
1680
  createBaseVNode("span", { class: "material-icons btn-icon" }, "add_circle_outline", -1),
1479
1681
  createBaseVNode("span", { class: "btn-text" }, "Create", -1)
1480
1682
  ])),
1683
+ createBaseVNode("button", {
1684
+ class: "action-btn",
1685
+ onClick: _cache[2] || (_cache[2] = ($event) => modalVisibleForQuickCreate.value = true)
1686
+ }, _cache[16] || (_cache[16] = [
1687
+ createBaseVNode("span", { class: "material-icons btn-icon" }, "flash_on", -1),
1688
+ createBaseVNode("span", { class: "btn-text" }, "Quick Create", -1)
1689
+ ])),
1481
1690
  createBaseVNode("button", {
1482
1691
  class: "action-btn",
1483
1692
  onClick: openSettingsModal
1484
- }, _cache[12] || (_cache[12] = [
1693
+ }, _cache[17] || (_cache[17] = [
1485
1694
  createBaseVNode("span", { class: "material-icons btn-icon" }, "settings", -1),
1486
1695
  createBaseVNode("span", { class: "btn-text" }, "Settings", -1)
1487
1696
  ])),
@@ -1494,14 +1703,14 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1494
1703
  class: normalizeClass(["action-btn", { active: unref(nodeStore).showCodeGenerator }]),
1495
1704
  title: "Generate Python Code (Ctrl+G)",
1496
1705
  onClick: toggleCodeGenerator
1497
- }, _cache[13] || (_cache[13] = [
1706
+ }, _cache[18] || (_cache[18] = [
1498
1707
  createBaseVNode("span", { class: "material-icons btn-icon" }, "code", -1),
1499
1708
  createBaseVNode("span", { class: "btn-text" }, "Generate code", -1)
1500
1709
  ]), 2)
1501
1710
  ]),
1502
1711
  createVNode(_component_el_dialog, {
1503
1712
  modelValue: modalVisibleForOpen.value,
1504
- "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => modalVisibleForOpen.value = $event),
1713
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => modalVisibleForOpen.value = $event),
1505
1714
  title: "Select or Enter a Flow File",
1506
1715
  width: "70%"
1507
1716
  }, {
@@ -1516,7 +1725,7 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1516
1725
  }, 8, ["modelValue"]),
1517
1726
  createVNode(_component_el_dialog, {
1518
1727
  modelValue: modalVisibleForSave.value,
1519
- "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => modalVisibleForSave.value = $event),
1728
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => modalVisibleForSave.value = $event),
1520
1729
  title: "Select save location",
1521
1730
  width: "70%"
1522
1731
  }, {
@@ -1535,7 +1744,7 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1535
1744
  }, 8, ["modelValue"]),
1536
1745
  createVNode(_component_el_dialog, {
1537
1746
  modelValue: modalVisibleForCreate.value,
1538
- "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => modalVisibleForCreate.value = $event),
1747
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => modalVisibleForCreate.value = $event),
1539
1748
  title: "Select save location",
1540
1749
  width: "70%"
1541
1750
  }, {
@@ -1549,20 +1758,70 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1549
1758
  ]),
1550
1759
  _: 1
1551
1760
  }, 8, ["modelValue"]),
1761
+ createVNode(_component_el_dialog, {
1762
+ modelValue: modalVisibleForQuickCreate.value,
1763
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => modalVisibleForQuickCreate.value = $event),
1764
+ title: "Create New Flow",
1765
+ width: "400px"
1766
+ }, {
1767
+ footer: withCtx(() => [
1768
+ createBaseVNode("span", _hoisted_5$7, [
1769
+ createVNode(_component_el_button, {
1770
+ onClick: _cache[7] || (_cache[7] = ($event) => modalVisibleForQuickCreate.value = false)
1771
+ }, {
1772
+ default: withCtx(() => _cache[22] || (_cache[22] = [
1773
+ createTextVNode("Cancel")
1774
+ ])),
1775
+ _: 1,
1776
+ __: [22]
1777
+ }),
1778
+ createVNode(_component_el_button, {
1779
+ type: "primary",
1780
+ onClick: handleQuickCreateAction
1781
+ }, {
1782
+ default: withCtx(() => _cache[23] || (_cache[23] = [
1783
+ createTextVNode("Create Flow")
1784
+ ])),
1785
+ _: 1,
1786
+ __: [23]
1787
+ })
1788
+ ])
1789
+ ]),
1790
+ default: withCtx(() => [
1791
+ createBaseVNode("div", _hoisted_2$g, [
1792
+ createBaseVNode("div", _hoisted_3$f, [
1793
+ _cache[19] || (_cache[19] = createBaseVNode("label", { for: "flow-name" }, "Flow Name (optional):", -1)),
1794
+ createVNode(_component_el_input, {
1795
+ id: "flow-name",
1796
+ modelValue: quickCreateName.value,
1797
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => quickCreateName.value = $event),
1798
+ placeholder: "Leave empty for auto-generated name",
1799
+ clearable: ""
1800
+ }, null, 8, ["modelValue"])
1801
+ ]),
1802
+ createBaseVNode("div", _hoisted_4$a, [
1803
+ _cache[20] || (_cache[20] = createBaseVNode("strong", null, "File will be created as:", -1)),
1804
+ _cache[21] || (_cache[21] = createBaseVNode("br", null, null, -1)),
1805
+ createBaseVNode("code", null, toDisplayString(getPreviewFileName()), 1)
1806
+ ])
1807
+ ])
1808
+ ]),
1809
+ _: 1
1810
+ }, 8, ["modelValue"]),
1552
1811
  createVNode(_component_el_dialog, {
1553
1812
  modelValue: modalVisibleForSettings.value,
1554
- "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => modalVisibleForSettings.value = $event),
1813
+ "onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => modalVisibleForSettings.value = $event),
1555
1814
  title: "Execution Settings",
1556
1815
  width: "30%"
1557
1816
  }, {
1558
1817
  default: withCtx(() => [
1559
- flowSettings.value ? (openBlock(), createElementBlock("div", _hoisted_2$c, [
1560
- createBaseVNode("div", _hoisted_3$b, [
1561
- createBaseVNode("div", _hoisted_4$8, [
1562
- _cache[14] || (_cache[14] = createBaseVNode("label", null, "Execution Mode:", -1)),
1818
+ flowSettings.value ? (openBlock(), createElementBlock("div", _hoisted_6$6, [
1819
+ createBaseVNode("div", _hoisted_7$4, [
1820
+ createBaseVNode("div", _hoisted_8$2, [
1821
+ _cache[24] || (_cache[24] = createBaseVNode("label", null, "Execution Mode:", -1)),
1563
1822
  createVNode(_component_el_select, {
1564
1823
  modelValue: flowSettings.value.execution_mode,
1565
- "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => flowSettings.value.execution_mode = $event),
1824
+ "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => flowSettings.value.execution_mode = $event),
1566
1825
  size: "small",
1567
1826
  placeholder: "Select run mode",
1568
1827
  style: { "width": "100%" },
@@ -1580,11 +1839,11 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1580
1839
  _: 1
1581
1840
  }, 8, ["modelValue"])
1582
1841
  ]),
1583
- createBaseVNode("div", _hoisted_5$6, [
1584
- _cache[15] || (_cache[15] = createBaseVNode("label", null, "Execution location:", -1)),
1842
+ createBaseVNode("div", _hoisted_9$1, [
1843
+ _cache[25] || (_cache[25] = createBaseVNode("label", null, "Execution location:", -1)),
1585
1844
  createVNode(_component_el_select, {
1586
1845
  modelValue: flowSettings.value.execution_location,
1587
- "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => flowSettings.value.execution_location = $event),
1846
+ "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => flowSettings.value.execution_location = $event),
1588
1847
  size: "small",
1589
1848
  placeholder: "Select the execution location",
1590
1849
  style: { "width": "100%" },
@@ -1602,10 +1861,10 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1602
1861
  _: 1
1603
1862
  }, 8, ["modelValue"])
1604
1863
  ]),
1605
- createBaseVNode("div", _hoisted_6$5, [
1864
+ createBaseVNode("div", _hoisted_10, [
1606
1865
  createVNode(_component_el_checkbox, {
1607
1866
  modelValue: flowSettings.value.show_detailed_progress,
1608
- "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => flowSettings.value.show_detailed_progress = $event),
1867
+ "onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => flowSettings.value.show_detailed_progress = $event),
1609
1868
  label: "Show details during execution",
1610
1869
  size: "small",
1611
1870
  onChange: pushFlowSettings
@@ -1620,8 +1879,385 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
1620
1879
  };
1621
1880
  }
1622
1881
  });
1623
- const HeaderButtons_vue_vue_type_style_index_0_scoped_bc5487da_lang = "";
1624
- const HeaderButtons = /* @__PURE__ */ _export_sfc(_sfc_main$i, [["__scopeId", "data-v-bc5487da"]]);
1882
+ const HeaderButtons_vue_vue_type_style_index_0_scoped_2566c44c_lang = "";
1883
+ const HeaderButtons = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["__scopeId", "data-v-2566c44c"]]);
1884
+ const useItemStore = defineStore("itemStore", () => {
1885
+ const items = ref({});
1886
+ const initialItemStates = ref({});
1887
+ const groups = ref({});
1888
+ const inResizing = ref(false);
1889
+ const idItemClicked = ref(null);
1890
+ const idItemVisible = ref(null);
1891
+ const layoutPresets = {
1892
+ sidePanel: { width: 400, height: "100%" },
1893
+ bottomPanel: { width: "100%", height: 300 },
1894
+ dataView: { width: 600, height: 400 },
1895
+ logView: { width: 600, height: 400 }
1896
+ };
1897
+ const getGroupItems = computed$1(() => (groupName) => {
1898
+ if (!groups.value[groupName])
1899
+ return [];
1900
+ return groups.value[groupName].map((id2) => items.value[id2]).filter(Boolean);
1901
+ });
1902
+ const registerInitialState = (id2, initialState) => {
1903
+ if (!initialItemStates.value[id2]) {
1904
+ initialItemStates.value[id2] = { ...initialState };
1905
+ }
1906
+ };
1907
+ const bringToFront = (id2) => {
1908
+ if (!items.value[id2]) {
1909
+ console.warn(`Item ${id2} not found`);
1910
+ return;
1911
+ }
1912
+ if (items.value[id2].fullScreen)
1913
+ return;
1914
+ let maxZIndex = 99;
1915
+ Object.entries(items.value).forEach(([itemId, item]) => {
1916
+ if (!item.fullScreen && itemId !== id2) {
1917
+ maxZIndex = Math.max(maxZIndex, item.zIndex);
1918
+ }
1919
+ });
1920
+ items.value[id2].zIndex = maxZIndex + 1;
1921
+ saveItemState(id2);
1922
+ };
1923
+ const setItemState = (id2, state2) => {
1924
+ if (!items.value[id2]) {
1925
+ items.value[id2] = {
1926
+ width: 400,
1927
+ height: 300,
1928
+ left: 100,
1929
+ top: 100,
1930
+ stickynessPosition: "free",
1931
+ fullWidth: false,
1932
+ fullHeight: false,
1933
+ zIndex: 100,
1934
+ fullScreen: false,
1935
+ clicked: false
1936
+ };
1937
+ }
1938
+ const oldGroup = items.value[id2].group;
1939
+ Object.assign(items.value[id2], state2);
1940
+ if (state2.group !== void 0) {
1941
+ if (oldGroup && groups.value[oldGroup]) {
1942
+ groups.value[oldGroup] = groups.value[oldGroup].filter((itemId) => itemId !== id2);
1943
+ }
1944
+ if (state2.group) {
1945
+ if (!groups.value[state2.group]) {
1946
+ groups.value[state2.group] = [];
1947
+ }
1948
+ if (!groups.value[state2.group].includes(id2)) {
1949
+ groups.value[state2.group].push(id2);
1950
+ }
1951
+ if (state2.syncDimensions) {
1952
+ syncGroupDimensions(state2.group, id2);
1953
+ }
1954
+ }
1955
+ }
1956
+ };
1957
+ const syncGroupDimensions = (groupName, sourceId) => {
1958
+ const groupItems = groups.value[groupName];
1959
+ if (!groupItems || groupItems.length < 2)
1960
+ return;
1961
+ const referenceId = sourceId || groupItems[0];
1962
+ const reference = items.value[referenceId];
1963
+ if (!reference)
1964
+ return;
1965
+ groupItems.forEach((id2) => {
1966
+ var _a;
1967
+ if (id2 !== referenceId && ((_a = items.value[id2]) == null ? void 0 : _a.syncDimensions)) {
1968
+ items.value[id2].width = reference.width;
1969
+ items.value[id2].height = reference.height;
1970
+ saveItemState(id2);
1971
+ }
1972
+ });
1973
+ };
1974
+ const arrangeItems = (arrangement) => {
1975
+ const visibleItems = Object.entries(items.value).filter(([, item]) => !item.fullScreen).sort((a3, b2) => a3[1].zIndex - b2[1].zIndex);
1976
+ switch (arrangement) {
1977
+ case "cascade": {
1978
+ let offset = 0;
1979
+ visibleItems.forEach(([id2, item]) => {
1980
+ item.left = 100 + offset;
1981
+ item.top = 100 + offset;
1982
+ item.stickynessPosition = "free";
1983
+ offset += 30;
1984
+ saveItemState(id2);
1985
+ });
1986
+ break;
1987
+ }
1988
+ case "tile": {
1989
+ const screenWidth = window.innerWidth;
1990
+ const screenHeight = window.innerHeight;
1991
+ const itemCount = visibleItems.length;
1992
+ const cols = Math.ceil(Math.sqrt(itemCount));
1993
+ const rows = Math.ceil(itemCount / cols);
1994
+ const itemWidth = Math.floor(screenWidth / cols) - 20;
1995
+ const itemHeight = Math.floor(screenHeight / rows) - 20;
1996
+ visibleItems.forEach(([id2, item], index) => {
1997
+ const col = index % cols;
1998
+ const row = Math.floor(index / cols);
1999
+ item.left = col * (itemWidth + 10) + 10;
2000
+ item.top = row * (itemHeight + 10) + 10;
2001
+ item.width = itemWidth;
2002
+ item.height = itemHeight;
2003
+ item.stickynessPosition = "free";
2004
+ saveItemState(id2);
2005
+ });
2006
+ break;
2007
+ }
2008
+ case "stack": {
2009
+ visibleItems.forEach(([id2, item]) => {
2010
+ item.left = 100;
2011
+ item.top = 100;
2012
+ item.stickynessPosition = "free";
2013
+ saveItemState(id2);
2014
+ });
2015
+ break;
2016
+ }
2017
+ }
2018
+ };
2019
+ const preventOverlap = (id2) => {
2020
+ const item = items.value[id2];
2021
+ if (!item || item.stickynessPosition !== "free")
2022
+ return;
2023
+ const threshold = 50;
2024
+ let adjusted = false;
2025
+ Object.entries(items.value).forEach(([otherId, otherItem]) => {
2026
+ if (otherId === id2 || otherItem.fullScreen)
2027
+ return;
2028
+ const horizontalOverlap = item.left < otherItem.left + otherItem.width && item.left + item.width > otherItem.left;
2029
+ const verticalOverlap = item.top < otherItem.top + otherItem.height && item.top + item.height > otherItem.top;
2030
+ if (horizontalOverlap && verticalOverlap) {
2031
+ item.left = otherItem.left + otherItem.width + threshold;
2032
+ if (item.left + item.width > window.innerWidth) {
2033
+ item.left = 100;
2034
+ item.top = otherItem.top + otherItem.height + threshold;
2035
+ }
2036
+ adjusted = true;
2037
+ }
2038
+ });
2039
+ if (adjusted) {
2040
+ saveItemState(id2);
2041
+ }
2042
+ };
2043
+ const saveItemState = (id2) => {
2044
+ const itemState = items.value[id2];
2045
+ localStorage.setItem(`overlayPositionAndSize_${id2}`, JSON.stringify(itemState));
2046
+ if (itemState.group) {
2047
+ const groupData = { groups: groups.value };
2048
+ localStorage.setItem("overlayGroups", JSON.stringify(groupData));
2049
+ }
2050
+ };
2051
+ const loadItemState = (id2) => {
2052
+ const savedState = localStorage.getItem(`overlayPositionAndSize_${id2}`);
2053
+ if (savedState) {
2054
+ const state2 = JSON.parse(savedState);
2055
+ setItemState(id2, state2);
2056
+ }
2057
+ const savedGroups = localStorage.getItem("overlayGroups");
2058
+ if (savedGroups) {
2059
+ const groupData = JSON.parse(savedGroups);
2060
+ groups.value = groupData.groups || {};
2061
+ }
2062
+ };
2063
+ const applyPreset = (id2, presetName) => {
2064
+ const preset = layoutPresets[presetName];
2065
+ const updates = {};
2066
+ if (preset.width === "100%") {
2067
+ updates.width = window.innerWidth;
2068
+ updates.fullWidth = true;
2069
+ } else {
2070
+ updates.width = preset.width;
2071
+ updates.fullWidth = false;
2072
+ }
2073
+ if (preset.height === "100%") {
2074
+ updates.height = window.innerHeight;
2075
+ updates.fullHeight = true;
2076
+ } else {
2077
+ updates.height = preset.height;
2078
+ updates.fullHeight = false;
2079
+ }
2080
+ setItemState(id2, updates);
2081
+ saveItemState(id2);
2082
+ };
2083
+ const toggleFullScreen = (id2) => {
2084
+ if (!items.value[id2])
2085
+ return;
2086
+ setFullScreen(id2, !items.value[id2].fullScreen);
2087
+ };
2088
+ const setFullScreen = (id2, fullScreen) => {
2089
+ if (!items.value[id2])
2090
+ return;
2091
+ if (items.value[id2].fullScreen !== fullScreen) {
2092
+ if (fullScreen) {
2093
+ Object.keys(items.value).forEach((otherId) => {
2094
+ if (otherId !== id2) {
2095
+ items.value[otherId].zIndex = 1;
2096
+ }
2097
+ });
2098
+ items.value[id2].fullScreen = true;
2099
+ items.value[id2].prevWidth = items.value[id2].width;
2100
+ items.value[id2].prevHeight = items.value[id2].height;
2101
+ items.value[id2].prevLeft = items.value[id2].left;
2102
+ items.value[id2].prevTop = items.value[id2].top;
2103
+ items.value[id2].width = window.innerWidth;
2104
+ items.value[id2].height = window.innerHeight;
2105
+ items.value[id2].left = 0;
2106
+ items.value[id2].top = 0;
2107
+ items.value[id2].zIndex = 9999;
2108
+ } else {
2109
+ items.value[id2].fullScreen = false;
2110
+ items.value[id2].width = items.value[id2].prevWidth || 400;
2111
+ items.value[id2].height = items.value[id2].prevHeight || 300;
2112
+ items.value[id2].left = items.value[id2].prevLeft || 100;
2113
+ items.value[id2].top = items.value[id2].prevTop || 100;
2114
+ items.value[id2].zIndex = 1e3;
2115
+ Object.keys(items.value).forEach((otherId) => {
2116
+ if (otherId !== id2) {
2117
+ items.value[otherId].zIndex = 100;
2118
+ }
2119
+ });
2120
+ }
2121
+ saveItemState(id2);
2122
+ clickOnItem(id2);
2123
+ }
2124
+ };
2125
+ const resetLayout = () => {
2126
+ Object.keys(items.value).forEach((id2) => {
2127
+ localStorage.removeItem(`overlayPositionAndSize_${id2}`);
2128
+ });
2129
+ localStorage.removeItem("overlayGroups");
2130
+ groups.value = {};
2131
+ Object.keys(initialItemStates.value).forEach((id2) => {
2132
+ const initialState = initialItemStates.value[id2];
2133
+ if (!initialState)
2134
+ return;
2135
+ const resetState = {
2136
+ width: initialState.width || 400,
2137
+ height: initialState.height || 300,
2138
+ left: initialState.left || 100,
2139
+ top: initialState.top || 100,
2140
+ stickynessPosition: initialState.stickynessPosition || "free",
2141
+ fullWidth: initialState.fullWidth || false,
2142
+ fullHeight: initialState.fullHeight || false,
2143
+ zIndex: 100,
2144
+ fullScreen: false,
2145
+ clicked: false,
2146
+ group: initialState.group,
2147
+ syncDimensions: initialState.syncDimensions
2148
+ };
2149
+ items.value[id2] = resetState;
2150
+ if (resetState.group) {
2151
+ if (!groups.value[resetState.group]) {
2152
+ groups.value[resetState.group] = [];
2153
+ }
2154
+ if (!groups.value[resetState.group].includes(id2)) {
2155
+ groups.value[resetState.group].push(id2);
2156
+ }
2157
+ }
2158
+ });
2159
+ setTimeout(() => {
2160
+ window.dispatchEvent(
2161
+ new CustomEvent("layout-reset", {
2162
+ detail: { initialStates: initialItemStates.value }
2163
+ })
2164
+ );
2165
+ }, 0);
2166
+ };
2167
+ const resetSingleItem = (id2) => {
2168
+ var _a;
2169
+ const initialState = initialItemStates.value[id2];
2170
+ if (!initialState) {
2171
+ console.warn(`No initial state found for item ${id2}`);
2172
+ return;
2173
+ }
2174
+ localStorage.removeItem(`overlayPositionAndSize_${id2}`);
2175
+ const resetState = {
2176
+ width: initialState.width || 400,
2177
+ height: initialState.height || 300,
2178
+ left: initialState.left || 100,
2179
+ top: initialState.top || 100,
2180
+ stickynessPosition: initialState.stickynessPosition || "free",
2181
+ fullWidth: initialState.fullWidth || false,
2182
+ fullHeight: initialState.fullHeight || false,
2183
+ zIndex: ((_a = items.value[id2]) == null ? void 0 : _a.zIndex) || 100,
2184
+ fullScreen: false,
2185
+ clicked: false,
2186
+ group: initialState.group,
2187
+ syncDimensions: initialState.syncDimensions
2188
+ };
2189
+ items.value[id2] = resetState;
2190
+ };
2191
+ const clickOnItem = (id2) => {
2192
+ if (!items.value[id2] || items.value[id2].fullScreen)
2193
+ return;
2194
+ let maxZIndex = 99;
2195
+ Object.values(items.value).forEach((item) => {
2196
+ if (!item.fullScreen) {
2197
+ maxZIndex = Math.max(maxZIndex, item.zIndex);
2198
+ }
2199
+ });
2200
+ if (items.value[id2].zIndex <= maxZIndex) {
2201
+ items.value[id2].zIndex = maxZIndex + 1;
2202
+ saveItemState(id2);
2203
+ }
2204
+ idItemClicked.value = id2;
2205
+ };
2206
+ const setResizing = (resizing) => {
2207
+ inResizing.value = resizing;
2208
+ };
2209
+ const getResizing = () => {
2210
+ return inResizing.value;
2211
+ };
2212
+ const scrollOnItem = (id2) => {
2213
+ const itemElement = document.getElementById(id2);
2214
+ if (!itemElement)
2215
+ return;
2216
+ const observer = new IntersectionObserver(
2217
+ (entries) => {
2218
+ entries.forEach((entry) => {
2219
+ if (entry.isIntersecting) {
2220
+ idItemVisible.value = id2;
2221
+ items.value[id2].zIndex = 1e3;
2222
+ } else if (idItemVisible.value === id2) {
2223
+ items.value[id2].zIndex = 100;
2224
+ idItemVisible.value = null;
2225
+ }
2226
+ });
2227
+ },
2228
+ {
2229
+ threshold: 0.5
2230
+ }
2231
+ );
2232
+ observer.observe(itemElement);
2233
+ };
2234
+ return {
2235
+ inResizing,
2236
+ items,
2237
+ groups,
2238
+ layoutPresets,
2239
+ initialItemStates,
2240
+ registerInitialState,
2241
+ setItemState,
2242
+ saveItemState,
2243
+ loadItemState,
2244
+ setResizing,
2245
+ getResizing,
2246
+ clickOnItem,
2247
+ scrollOnItem,
2248
+ idItemVisible,
2249
+ toggleFullScreen,
2250
+ setFullScreen,
2251
+ arrangeItems,
2252
+ preventOverlap,
2253
+ syncGroupDimensions,
2254
+ applyPreset,
2255
+ getGroupItems,
2256
+ resetLayout,
2257
+ resetSingleItem,
2258
+ bringToFront
2259
+ };
2260
+ });
1625
2261
  /*! Element Plus Icons Vue v2.3.1 */
1626
2262
  var arrow_down_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1627
2263
  name: "ArrowDown",
@@ -1719,13 +2355,14 @@ var warning_filled_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
1719
2355
  }
1720
2356
  });
1721
2357
  var warning_filled_default = warning_filled_vue_vue_type_script_setup_true_lang_default;
1722
- const _hoisted_1$e = { class: "status-wrapper" };
1723
- const _hoisted_2$b = { class: "flow-card" };
1724
- const _hoisted_3$a = ["title"];
1725
- const _sfc_main$h = /* @__PURE__ */ defineComponent({
2358
+ const _hoisted_1$h = { class: "status-wrapper" };
2359
+ const _hoisted_2$f = { class: "flow-card" };
2360
+ const _hoisted_3$e = ["title"];
2361
+ const _sfc_main$k = /* @__PURE__ */ defineComponent({
1726
2362
  __name: "status",
1727
2363
  setup(__props) {
1728
2364
  const nodeStore = useNodeStore();
2365
+ const draggableItemStore = useItemStore();
1729
2366
  const lastStatusChange = ref(/* @__PURE__ */ new Date());
1730
2367
  const isRunning = computed$1(() => nodeStore.isRunning);
1731
2368
  const showFlowResult = computed$1(() => nodeStore.showFlowResult);
@@ -1761,17 +2398,21 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
1761
2398
  const toggleResults = () => {
1762
2399
  nodeStore.showFlowResult = !nodeStore.showFlowResult;
1763
2400
  nodeStore.isShowingLogViewer = nodeStore.showFlowResult;
2401
+ if (nodeStore.isShowingLogViewer) {
2402
+ draggableItemStore.bringToFront("logViewer");
2403
+ draggableItemStore.bringToFront("flowresults");
2404
+ }
1764
2405
  };
1765
2406
  return (_ctx, _cache) => {
1766
2407
  const _component_el_icon = resolveComponent("el-icon");
1767
- return openBlock(), createElementBlock("div", _hoisted_1$e, [
2408
+ return openBlock(), createElementBlock("div", _hoisted_1$h, [
1768
2409
  createVNode(PopOver, {
1769
2410
  content: tooltipContent.value,
1770
2411
  title: isRunning.value ? "Processing Flow" : "Flow Idle",
1771
2412
  placement: "left"
1772
2413
  }, {
1773
2414
  default: withCtx(() => [
1774
- createBaseVNode("div", _hoisted_2$b, [
2415
+ createBaseVNode("div", _hoisted_2$f, [
1775
2416
  (openBlock(), createElementBlock("svg", {
1776
2417
  viewBox: "0 0 100 100",
1777
2418
  class: normalizeClass(["flow-animation", { "is-flowing": isRunning.value }])
@@ -1860,7 +2501,7 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
1860
2501
  ]),
1861
2502
  _: 1
1862
2503
  })) : createCommentVNode("", true)
1863
- ], 10, _hoisted_3$a)
2504
+ ], 10, _hoisted_3$e)
1864
2505
  ]),
1865
2506
  _: 1
1866
2507
  })
@@ -1868,8 +2509,8 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
1868
2509
  };
1869
2510
  }
1870
2511
  });
1871
- const status_vue_vue_type_style_index_0_scoped_88e0f447_lang = "";
1872
- const Status = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["__scopeId", "data-v-88e0f447"]]);
2512
+ const status_vue_vue_type_style_index_0_scoped_4aa2388b_lang = "";
2513
+ const Status = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-4aa2388b"]]);
1873
2514
  function tryOnScopeDispose(fn) {
1874
2515
  if (getCurrentScope()) {
1875
2516
  onScopeDispose(fn);
@@ -8475,7 +9116,7 @@ const __default__$f = {
8475
9116
  name: "Handle",
8476
9117
  compatConfig: { MODE: 3 }
8477
9118
  };
8478
- const _sfc_main$f = /* @__PURE__ */ defineComponent({
9119
+ const _sfc_main$f$1 = /* @__PURE__ */ defineComponent({
8479
9120
  ...__default__$f,
8480
9121
  props: {
8481
9122
  id: { default: null },
@@ -8636,9 +9277,9 @@ const DefaultNode = function({
8636
9277
  }) {
8637
9278
  const label = data.label || _label;
8638
9279
  return [
8639
- h(_sfc_main$f, { type: "target", position: targetPosition, connectable, isValidConnection: isValidTargetPos }),
9280
+ h(_sfc_main$f$1, { type: "target", position: targetPosition, connectable, isValidConnection: isValidTargetPos }),
8640
9281
  typeof label !== "string" && label ? h(label) : h(Fragment, [label]),
8641
- h(_sfc_main$f, { type: "source", position: sourcePosition, connectable, isValidConnection: isValidSourcePos })
9282
+ h(_sfc_main$f$1, { type: "source", position: sourcePosition, connectable, isValidConnection: isValidSourcePos })
8642
9283
  ];
8643
9284
  };
8644
9285
  DefaultNode.props = ["sourcePosition", "targetPosition", "label", "isValidTargetPos", "isValidSourcePos", "connectable", "data"];
@@ -8654,7 +9295,7 @@ const OutputNode = function({
8654
9295
  }) {
8655
9296
  const label = data.label || _label;
8656
9297
  return [
8657
- h(_sfc_main$f, { type: "target", position: targetPosition, connectable, isValidConnection: isValidTargetPos }),
9298
+ h(_sfc_main$f$1, { type: "target", position: targetPosition, connectable, isValidConnection: isValidTargetPos }),
8658
9299
  typeof label !== "string" && label ? h(label) : h(Fragment, [label])
8659
9300
  ];
8660
9301
  };
@@ -8672,7 +9313,7 @@ const InputNode = function({
8672
9313
  const label = data.label || _label;
8673
9314
  return [
8674
9315
  typeof label !== "string" && label ? h(label) : h(Fragment, [label]),
8675
- h(_sfc_main$f, { type: "source", position: sourcePosition, connectable, isValidConnection: isValidSourcePos })
9316
+ h(_sfc_main$f$1, { type: "source", position: sourcePosition, connectable, isValidConnection: isValidSourcePos })
8676
9317
  ];
8677
9318
  };
8678
9319
  InputNode.props = ["sourcePosition", "label", "isValidSourcePos", "connectable", "data"];
@@ -8686,7 +9327,7 @@ const __default__$e = {
8686
9327
  name: "EdgeText",
8687
9328
  compatConfig: { MODE: 3 }
8688
9329
  };
8689
- const _sfc_main$e = /* @__PURE__ */ defineComponent({
9330
+ const _sfc_main$e$1 = /* @__PURE__ */ defineComponent({
8690
9331
  ...__default__$e,
8691
9332
  props: {
8692
9333
  x: {},
@@ -8802,7 +9443,7 @@ const _sfc_main$d$1 = /* @__PURE__ */ defineComponent({
8802
9443
  "stroke-opacity": 0,
8803
9444
  class: "vue-flow__edge-interaction"
8804
9445
  }, null, 8, _hoisted_2$1$1)) : createCommentVNode("", true),
8805
- _ctx.label && _ctx.labelX && _ctx.labelY ? (openBlock(), createBlock(_sfc_main$e, {
9446
+ _ctx.label && _ctx.labelX && _ctx.labelY ? (openBlock(), createBlock(_sfc_main$e$1, {
8806
9447
  key: 1,
8807
9448
  ref_key: "labelEl",
8808
9449
  ref: labelEl,
@@ -10248,8 +10889,8 @@ const _sfc_main$8$1 = /* @__PURE__ */ defineComponent({
10248
10889
  }
10249
10890
  });
10250
10891
  const _hoisted_1$5$1 = ["id"];
10251
- const _hoisted_2$a = ["id"];
10252
- const _hoisted_3$9 = ["id"];
10892
+ const _hoisted_2$e = ["id"];
10893
+ const _hoisted_3$d = ["id"];
10253
10894
  const __default__$7 = {
10254
10895
  name: "A11yDescriptions",
10255
10896
  compatConfig: { MODE: 3 }
@@ -10267,14 +10908,14 @@ const _sfc_main$7$1 = /* @__PURE__ */ defineComponent({
10267
10908
  createBaseVNode("div", {
10268
10909
  id: `${unref(ARIA_EDGE_DESC_KEY)}-${unref(id2)}`,
10269
10910
  style: { "display": "none" }
10270
- }, " Press enter or space to select an edge. You can then press delete to remove it or press escape to cancel. ", 8, _hoisted_2$a),
10911
+ }, " Press enter or space to select an edge. You can then press delete to remove it or press escape to cancel. ", 8, _hoisted_2$e),
10271
10912
  !unref(disableKeyboardA11y) ? (openBlock(), createElementBlock("div", {
10272
10913
  key: 0,
10273
10914
  id: `${unref(ARIA_LIVE_MESSAGE)}-${unref(id2)}`,
10274
10915
  "aria-live": "assertive",
10275
10916
  "aria-atomic": "true",
10276
10917
  style: { "position": "absolute", "width": "1px", "height": "1px", "margin": "-1px", "border": "0", "padding": "0", "overflow": "hidden", "clip": "rect(0px, 0px, 0px, 0px)", "clip-path": "inset(100%)" }
10277
- }, toDisplayString(unref(ariaLiveMessage)), 9, _hoisted_3$9)) : createCommentVNode("", true)
10918
+ }, toDisplayString(unref(ariaLiveMessage)), 9, _hoisted_3$d)) : createCommentVNode("", true)
10278
10919
  ], 64);
10279
10920
  };
10280
10921
  }
@@ -11321,7 +11962,7 @@ function useStylesLoadedWarning() {
11321
11962
  }
11322
11963
  });
11323
11964
  }
11324
- const _hoisted_1$d = /* @__PURE__ */ createBaseVNode("div", { class: "vue-flow__edge-labels" }, null, -1);
11965
+ const _hoisted_1$g = /* @__PURE__ */ createBaseVNode("div", { class: "vue-flow__edge-labels" }, null, -1);
11325
11966
  const __default__$1$1 = {
11326
11967
  name: "VueFlow",
11327
11968
  compatConfig: { MODE: 3 }
@@ -11414,7 +12055,7 @@ const _sfc_main$1$2 = /* @__PURE__ */ defineComponent({
11414
12055
  createVNode(_sfc_main$8$1, null, {
11415
12056
  default: withCtx(() => [
11416
12057
  createVNode(_sfc_main$4$1),
11417
- _hoisted_1$d,
12058
+ _hoisted_1$g,
11418
12059
  createVNode(_sfc_main$2$1),
11419
12060
  renderSlot(_ctx.$slots, "zoom-pane")
11420
12061
  ]),
@@ -11430,7 +12071,7 @@ const __default__$3 = {
11430
12071
  name: "Panel",
11431
12072
  compatConfig: { MODE: 3 }
11432
12073
  };
11433
- const _sfc_main$g = /* @__PURE__ */ defineComponent({
12074
+ const _sfc_main$j = /* @__PURE__ */ defineComponent({
11434
12075
  ...__default__$3,
11435
12076
  props: {
11436
12077
  position: {}
@@ -14172,14 +14813,14 @@ const _sfc_main$1$1 = /* @__PURE__ */ defineComponent({
14172
14813
  };
14173
14814
  }
14174
14815
  });
14175
- const _hoisted_1$c = ["width", "height", "viewBox", "aria-labelledby"];
14176
- const _hoisted_2$9 = ["id"];
14177
- const _hoisted_3$8 = ["d", "fill", "stroke", "stroke-width"];
14816
+ const _hoisted_1$f = ["width", "height", "viewBox", "aria-labelledby"];
14817
+ const _hoisted_2$d = ["id"];
14818
+ const _hoisted_3$c = ["d", "fill", "stroke", "stroke-width"];
14178
14819
  const __default__ = {
14179
14820
  name: "MiniMap",
14180
14821
  compatConfig: { MODE: 3 }
14181
14822
  };
14182
- const _sfc_main$d = /* @__PURE__ */ defineComponent({
14823
+ const _sfc_main$i = /* @__PURE__ */ defineComponent({
14183
14824
  ...__default__,
14184
14825
  props: {
14185
14826
  nodeColor: { type: [String, Function], default: "#e2e2e2" },
@@ -14342,7 +14983,7 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
14342
14983
  emit("nodeMouseleave", param);
14343
14984
  }
14344
14985
  return (_ctx, _cache) => {
14345
- return openBlock(), createBlock(unref(_sfc_main$g), {
14986
+ return openBlock(), createBlock(unref(_sfc_main$j), {
14346
14987
  position: _ctx.position,
14347
14988
  class: normalizeClass(["vue-flow__minimap", { pannable: _ctx.pannable, zoomable: _ctx.zoomable }])
14348
14989
  }, {
@@ -14360,7 +15001,7 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
14360
15001
  _ctx.ariaLabel ? (openBlock(), createElementBlock("title", {
14361
15002
  key: 0,
14362
15003
  id: `vue-flow__minimap-${unref(id2)}`
14363
- }, toDisplayString(_ctx.ariaLabel), 9, _hoisted_2$9)) : createCommentVNode("", true),
15004
+ }, toDisplayString(_ctx.ariaLabel), 9, _hoisted_2$d)) : createCommentVNode("", true),
14364
15005
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(getNodesInitialized), (node) => {
14365
15006
  return openBlock(), createBlock(_sfc_main$1$1, {
14366
15007
  id: node.id,
@@ -14392,8 +15033,8 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
14392
15033
  stroke: _ctx.maskStrokeColor,
14393
15034
  "stroke-width": _ctx.maskStrokeWidth,
14394
15035
  "fill-rule": "evenodd"
14395
- }, null, 8, _hoisted_3$8)
14396
- ], 8, _hoisted_1$c))
15036
+ }, null, 8, _hoisted_3$c)
15037
+ ], 8, _hoisted_1$f))
14397
15038
  ]),
14398
15039
  _: 1
14399
15040
  }, 8, ["position", "class"]);
@@ -14408,16 +15049,327 @@ function toSnakeCase(str) {
14408
15049
  return str;
14409
15050
  return str.replace(/([A-Z])/g, "_$1").replace(/^_/, "").toLowerCase();
14410
15051
  }
14411
- const _hoisted_1$b = { class: "description-text" };
14412
- const _hoisted_2$8 = {
15052
+ const __vite_glob_0_0 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAACO0lEQVR4nN2Yz0vbYBjHv29NbZUy0B43QUG9zNPEHUT05NCTiu6o0NbDLk5a/RMERaonkSrO8zw4alFQtBsMBG96kJ5EUTcRh78QRGvsu4O8MSk1fdMmaeLnlL7p++ST53kfkjeADSCKX5GI4Ci+XQCl3uwzKXUkyYD4ZWjXKDnpUuxA+BbeBEij9hD0SgwMl+kplY5McoLmHEVMNYi06E/eNs4iEQf/zjEyonDRR9IAxMCQ5OYopIgawlz4gR1bVhKECJgPvwOsLAlAoIgAFpdMgXgAQFD704M/ZI4NAOf85IvnLJ1Jhi0kVcvNUCtFvvAsKVtk0haSXOU2s8sz8XoyqWfjsKpMJ3bQUVmNt6WerHNMzSQT/ByPYXDrJyq/z+Li/i7rPK5M6gET7NqIYvloXxovd7mzzjW1cdrXFrHx91BzXNPKnS6Y1HDjhjYOy1TnelQp6Aum7QDVMSyTTLAnHsPK8fMaTPqCIESLokGScsGlwz1pPBdBgLPciR4fd8CaN0+72871qDKD/pCmEsvhkmQX5qVtdRHxE2WT5CoI6Ng4/to6zDR9wlRiWymosUkyoduaHG1oBgAEt35JY7muwXR0eeJ4BCfKXW78Pn36iDH+sQXBuno9QgPglIy1dqme97pLAAA752eGvNZxSbZXVHEF+/r+Q14yL2GL90lbSKqW28hdohYsnUkCeglYXPKx2NkHyCQpJT8Kp5MJmkTv4A0gk3zsD3WnQMYKJyWHXouBYVehLV4f/wHit6c8llKODwAAAABJRU5ErkJggg==";
15053
+ const __vite_glob_0_1 = "/assets/airbyte-292aa232.png";
15054
+ const __vite_glob_0_2 = "/assets/cloud_storage_reader-aa1415d6.png";
15055
+ const __vite_glob_0_3 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAeFBMVEVHcEz////////////////////L8/D////////W6un////1+/rk9PPD6OWe1dJ108xqv7o90sc9ubATx7oTxLcTwbQ7racTvLATuKwUtagTsaUzop0SrqMRqp8Qo5oPnJQhjIsMlY4KkIsKjYgJiYUJhYIIgX8Gf37b7Js+AAAACnRSTlMABAoXKGNiwt3osdvRlAAABj5JREFUeNrtm9ty2zgMhrfb3bZLECSlOEqsg+Vj8v5vuKB5iiWLpGS70wt/oESYAoFfoNuZztR/PfmD+Pbj3+v8WMpkwm9XBXz/xUYARymLxUiJCGzEz7/zBAAXxcvNFBJhmQCUL/ehKBDmC+C3l18FV+JMAYDF6g7lV85fvQiYIwAk7Vnl1MhH8nwBXFJqPcw1wC+tCD1p3OeI2oLnCuDF6yoBFRsSdEzwWvA8ASBXJOARFDwhwNc/YycSo72BKFqy88TrDoINEjIEiNcEpGUxMi2Ar95eH8bqBVMCQFL9B0qQkBCAVJ54dUbomYab3IMQ8TYyu+0aGBcA8lz9AkoVoIdpxim8vRUQFYCvdrOezc0w9Oih/TAcjsGKX8SoAPn+9mhkTAAUPu5RStYFjwhAW1tbkPJuFzXn2QU5QuRoIcTSZbZgRIB4H0O7HV5EwJQYPPYLtrImfBQRAfL9NyCnBYBcP77+uoBpAQUJeDhlREC5JkyYn42zJse6AVoIrlux/ijafXor+aQAbgWs56CjJ7b5FavHTHEBi6jr+nzPi369l4B6baqWUgpCqqzd6Q7UZyOs695vVJ+gbBL5l3/GlbTm9/tdei1TQJ0PlWlLYat7DTKd4i0lIB/J2QiUbVtHiXagrTOhKqUAdgUQdXtvAe01AWtkE4i11kfXIENr3LgAoibsbF2iNjdHpD6BLtDvJsfNaQEBCp+gXgsWQbYTiWju4gJidB0VpvZ25EsWA1Q7zTomoJsorYuvlUDkiEKW1EYWBdftBIkOdETbaWy0u3W1RGAWQGQJJGUwprGuztrFBfjy3SWtuigJwBJg200RP4IJJLB5gLJv0ZJdUs0XsKH6cxH37IACNhted46bO1ByNh9ebrqrtPMFCLYAUMuOYENGbPSwFzVgCRxR6nyDlPEjqGwomZnpthFsMYCqdhldyoQAjVHgRos3CGAMS5NSD+NFBbjSndviTmA5IHWikDUhgDDFfbyCGwWA6ExautJHELDxvWK3AlKn8qQEdF+PrCslspsBZZLlCLikEsDuwUXiOl+A4uwuABObQH4HJLB7wcv5AjoF7H7IGQL6s+k//3cEu42l7+ICehu2wbzEyLKAihLrEe8ARdmwPu8AQFFcXmC/sblTAnoyumc2oMnsFJO9O90uLkAbjYpnNiCvBcCETdwnjsBAJ5DZAKSRJVX0mvQROGRmAyD3WyDNixFNjoCdyGyAvaVRvSYtwCEyG6DvJWTElvME7CRLgxW6KQlvMgXsqLg2ldkAAMZyWiD6nbFkB0xQn5ETG+SiqgTP+RaonX61dAd2ln6D6QY0qukJmkpIiqX3ssQEmLCeLH0GuOkrpV9KUd8wJda8lraEAE/DUzkVAmqpAlApyPkGGBICfFwiJ3CdmOL2ghwOiQNw5Hcg668CdVbKErivVl4HAk1KAbByR1TAomCo3+cICPQikZri9dliVKWgoEUd2JMpZDHQBEaCANVuwD4qYG+hOLqRWoWRLojdOVBMVedC9fudM4KmfVyAD6fyNPRVKSkmUDqOIiaeVg091LjJeDkdsPWteyDorj0zrNkISkvPDSGCliZId4DwyckmCaGxiN0wto8JGOVLldj5K70p3QGoDvuHc4gLONhD33spwUll/hqruXgU/AomBTB1PKSwqcdLfp7ECNtWbFqAOCxlny37qCICkEIezVZEBPDmeBYZws1nsntx7HlEAFNHU+3oLFI9KAtuWuxJsZgA3B/zOXjnENbsfQJSIKICoAoJaCIL3mG45J0h4wwhqOFRAUxQ5COhBsQFQHU6PpBTwxMCGG4pTDPYSWYZL52uVHLXqAEpAUza+mSuTHC9NjOZy66GJ+6xX3dqTwrSAqD6OHmOREgxzTG2Eqg4SwtgvCEFj+CzQZYWQGBzeghbZCkBXsHH/Zvw0SDLFcB4RQo+9C5rwfXe2IjgDOM/Kpz1n9vVlrbq4XphZu/R5Z7R7Jfcyslj9RwVZzkCAlidPj8MYaYxG9rzeWrE/B84gGhOn4aQy0/50PZGwLKfeAi1JQ0LOJc17mlbCc7YIgEEF6pqtotpKhWqpwX8/HWd/xZzPR8YAWP++V18n/6t07fRILsFn8dfz1+UPXny5MmTJ0+e/Gn8D1jTqp1bBNAQAAAAAElFTkSuQmCC";
15056
+ const __vite_glob_0_4 = "/assets/cross_join-d30c0290.png";
15057
+ const __vite_glob_0_5 = "/assets/database_reader-ce1e55f3.svg";
15058
+ const __vite_glob_0_6 = "/assets/database_writer-b4ad0753.svg";
15059
+ const __vite_glob_0_7 = "/assets/explore_data-8a0a2861.png";
15060
+ const __vite_glob_0_8 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABZCAYAAADIBoEnAAAKM0lEQVR4nO2cf2xV1R3AP+fe+15HWoRRYIGH7dRYVnEDlAZKHNgwW5xiRWsn29BuAWEII2YmjEUtnZgt/GonJhVDpgkSt9csaCRWCKG04iKhdP4hzgQZWJpO0zqElkLLvffsj3sP7/Gk0L629Dy9n+SE19J3e+75vHPO95ye74XUQQCG/3oy8GfgQ6BTCGGPGjXKnjp1aufq1as/fPfddze0tbX9AEBKaUgpxfBU+ZtLfIP+HvgSkFcqlmXJmTNnym3btn3Z1NS0FkAIkXiNgAGgeoYJ/JVY49uAG/e1FEJI/3t2RkaGfPnll+UHH3zwKmAGPWXwUMNUBV7DXyRBRGIxTVMCbnp6es+uXbtkfX19BUB5ebmRePGA/qEacCrQzRV6RW9FSZkzZ47d0NDQXVNT8yPw5pTrewv9Q+vKERv3lwBhvMbu07DjOA5CCHHw4EF56tSp8Pjx45cA1NTUaD1s6S7EAULA3XgyzP68WQiB67rG4cOHZTgcvvvOO+8MlZaWOkNQz0FDZyHqkzwOyCKJKElFVydOnBDd3d1ZZWVl4wB0ntx1FqIYgTdcJc2FCxcA0kaOHDliUGo0hKSCEDlYFwqFQoN2raEiFYR8qwiEaEYgRDMCIZoRCNGMQIhmBEI0IxCiGYEQzQiEaEYgRDMCIZoRCNGMQIhmBEI0IxCiGYEQzQiEaEYgRDMCIZoRCNGMQIhmBEI0IxCiGYEQzehNiPCLUV5erhJdtD0PmwJcak/AkFKK3s4XJwpRmUoqz8KtqKhw/cwkGY1GTZ0PKmuIIKE9AVcIIYUQ8pFHHjET81WsuNcm3vF/gHRgAmCtXr1aVFVVdQKtQggHvKQXIYQ7xDeT6hh4Ahz/9UQgY/bs2fKVV15xpkyZ8oUQokMIcVl7WnFvdoAfAr8F5uEJEa+99po4dOhQz3333fdJU1PTrtbW1mohxOloNGrqnmsxjCgZGcByoAS4DUhrbGyUJSUl5Ofnf15bW3sgEom8JIRojJeikmBWAB30kiIWDofl448/Luvr64/W1dVNgyHP2VND483AeWJd/prpbCSktRUVFckDBw6c37lz580w5Pkhqk1ygX9drX4zZsyQO3fuvPDee+/9zq/XpfYsi/tBlVR5qRiGobrexdLSUnnw4MH/vvHGGzlCiIFIEQnFSCim/++tDFBIYWGh3Ldv3/nq6upbAWPu3LmWf/2vFX+eHOg9ZQGfEWtPh7j2FEKoNr0YiUTc2tpauX///hXqIjfh5X2rRr/izQkh1A32bN68WTY0NOzBj8KSqLgJXoZTbyWOCUAXAxCyYMEC2djY2CWl/J4QAtM0MQzja8WyYlNqkr1ItcU//Dr0XK1+lmVJwLnnnnuc+vr6jmg0epsANgJP48m4ag6fYRhIKZk2bZpbWVkp2tvbf1xSUvJ+P+YT4VdmDLDZsqzxcYGC47rupWjEdV3VO9Nd172XywOQPuFPmDIrK0tMmTLFbmpqevvcuXOdhmEIP3JESikBwuGwbG9vdxctWuQuW7as49ixY88vXbr0f3F1vhZq3pgOHObyJ0/0Wj//X2fHjh3mxIkTt1nAvfQxu1VKiZSSjz/+2D19+rR1ww03/AR4f9y4cX39NEm/kqeBN23bfvNab/C8JIff1qK5uZnm5mYLWHilnzNNk7Nnz5KTk8Njjz1GT0/PqlGjRp0pLy83Kioq+loBJaSAyyPWq9bPMAxc1zWOHDkis7OziwxgEn2wGXeDdHd3c+bMGdLS0rIA2tra+pMq5vq/7y3gZ37Fe/By0J1eyoBQw9SVrm0YhuM4jh2JRHq2bNnC6NGjVxQWFr509OhR2Q8ZEOtF30/4+pp1A0Rra6twHCdikcRQAJfywJN6L54UE4gCEWALfRgyk0VKieM4JF7f/3SSmZnpvPjii+ExY8aU5+fnV0spTTWUJkFSbWLbNlLK0HDuZSkBlcCf/Nf29frlfg476enpTmVlpTlp0qSq2bNn/zEajQ5ExoAZ7s1F1VP+gPdgGYvrIEVNpqZp2hs2bDBzc3N3zJw58yk/OBnWHYhkh5zBQoWyBvAbvBD3XjwpQ1I3FVa7rmuvX7/emjFjRu2iRYuW+msPFVYPG8PdQyDWABeBXwBH8GQMybDhzxv2mjVrrIKCgkPvvPPOz48fP969bt06VCg8nOggBGKR12m80PQ43lA2qMOHaZo4juMsX77cWrhw4ScfffTRQxUVFV8999xz/Qlvh5ThHrLiUfPJKaAY2A+MJzakDQhfhvvoo4+aZWVlzc3NzQuWLFnSqtsmqS49ROHgfUiO4q1Ruuj7SrlXlIz58+cbq1at+rK9vb24tLT0U91kgH5CIDahHwB+7X8v6cnWlyFnzZol1qxZ09XZ2Vl6//33f1hXV2fpJgP0FAIxKX8HnqKPWxGJKBm5ubluRUWFdF23rKioaH9dXZ1VUFBw3dY8/UFXIeBJMYG/AC/QzzWKYRg4jiNvvPFGd+PGjeaIESNWzps3r0ZnGaC3EIhN9M8A2+mjFLUlMnbsWLeqqsocPXr0M3PmzKnWXQboLyR+4bgC2M01pKgtkYyMDKeqqsqMRCKb77rrrhei0aipuwzQK+ztDTWZ28BiYC+QxxU2I9WWSCgUsjdt2mRNnjz51by8vKf9zUIt1hnXQvceolB/r/kKeAj4lISJXm2JSCnt9evXW9OnT387Ly9vmS5bIn0lVYRAbD5pAR4AviBuNa+2RNauXWvNnTv3n6+//vovpZQ2sSdepwSpJARiC8d/A6XAOUAIIWzHcewnn3zSKi4uPtrY2Pjw1q1bz65bt06kkgxIjTkkEbVGaQB+JYT4mxDCKisrY/HixSdbWloeWLly5ec6rsL7QioKgZiUGilldkZGxqwnnngira2t7fmSkpL/pKoMSF0h4EkxgE0dHR3k5+cD3uG9VJUBqS0EYtv2gPe381QJb3sj1YVAXDibcMAuJUm1KOsbTyBEMwIhmhEI0YxAiGYkHWVJKXFdVwDGvn37DFJk824IUW0woFAvaSFpaWlkZGTYgLt9+/aUjv0HCdUGFwdykWSFiJaWFs6fP/9dIDczMzPc1dX1rZYipTRM07zQ2dk5VqVBJHOdZIWYzz77LFLKB4Cftre3p/6KbHBwpZQh/3VSJ/mTHrJs2wZv3AyrvJGAgTMYWyeBjcsZnkl9sCoQcDnBOkQzVE54gCYYwHeGuxIBMdQRmYBhJhwOA/QYwAliTxcIuM74SwaZnZ0tQ6HQSQMvX1wQ9JTrjn+wj3A47N5xxx2iu7v7LQPvdLk6dJayhwNSEdM0kVI6Dz74oDlhwoQvTp48uVX938PEhi2bfj7kJSj9K/4T5VzAvv322+XevXvlnj17Si6JipNycrgr+20poVBIFhYWyt27d3/W0NBQAhCNRk21ylbRVgTv2H8xcKsQIpyWloYQwnX8Z1MEJIfjOKbjOMbIkSO55ZZbLsyfP/9YcXHx25mZmdU5OTkt6oly/wc3vQgr7Up0TAAAAABJRU5ErkJggg==";
15061
+ const __vite_glob_0_9 = "/assets/filter-d7708bda.png";
15062
+ const __vite_glob_0_10 = "/assets/formula-eeeb1611.png";
15063
+ const __vite_glob_0_11 = "/assets/fuzzy_match-40c161b2.png";
15064
+ const __vite_glob_0_12 = "data:image/png;base64,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";
15065
+ const __vite_glob_0_13 = "/assets/graph_solver-8b7888b8.png";
15066
+ const __vite_glob_0_14 = "/assets/group_by-80561fc3.png";
15067
+ const __vite_glob_0_15 = "/assets/input_data-ab2eb678.png";
15068
+ const __vite_glob_0_16 = "/assets/join-349043ae.png";
15069
+ const __vite_glob_0_17 = "/assets/manual_input-ae98f31d.png";
15070
+ const __vite_glob_0_18 = "/assets/old_join-5d0eb604.png";
15071
+ const __vite_glob_0_19 = "/assets/output-06ec0371.png";
15072
+ const __vite_glob_0_20 = "/assets/pivot-9660df51.png";
15073
+ const __vite_glob_0_21 = "/assets/polars_code-05ce5dc6.png";
15074
+ const __vite_glob_0_22 = "/assets/record_count-dab44eb5.png";
15075
+ const __vite_glob_0_23 = "/assets/record_id-0b15856b.png";
15076
+ const __vite_glob_0_24 = "/assets/sample-693a88b5.png";
15077
+ const __vite_glob_0_25 = "/assets/select-b0d0437a.png";
15078
+ const __vite_glob_0_26 = "/assets/sort-2aa579f0.png";
15079
+ const __vite_glob_0_27 = "/assets/summarize-2a099231.png";
15080
+ const __vite_glob_0_28 = "/assets/text_to_rows-859b29ea.png";
15081
+ const __vite_glob_0_29 = "/assets/union-2d8609f4.png";
15082
+ const __vite_glob_0_30 = "/assets/unique-1958b98a.png";
15083
+ const __vite_glob_0_31 = "/assets/unpivot-d3cb4b5b.png";
15084
+ const __vite_glob_0_32 = "/assets/user-defined-icon-0ae16c90.png";
15085
+ const __vite_glob_0_33 = "/assets/view-7a0f0be1.png";
15086
+ const getImageUrl = (name) => {
15087
+ return new URL((/* @__PURE__ */ Object.assign({ "./assets/icons/Output2.png": __vite_glob_0_0, "./assets/icons/airbyte.png": __vite_glob_0_1, "./assets/icons/cloud_storage_reader.png": __vite_glob_0_2, "./assets/icons/cloud_storage_writer.png": __vite_glob_0_3, "./assets/icons/cross_join.png": __vite_glob_0_4, "./assets/icons/database_reader.svg": __vite_glob_0_5, "./assets/icons/database_writer.svg": __vite_glob_0_6, "./assets/icons/explore_data.png": __vite_glob_0_7, "./assets/icons/external_source.png": __vite_glob_0_8, "./assets/icons/filter.png": __vite_glob_0_9, "./assets/icons/formula.png": __vite_glob_0_10, "./assets/icons/fuzzy_match.png": __vite_glob_0_11, "./assets/icons/google_sheet.png": __vite_glob_0_12, "./assets/icons/graph_solver.png": __vite_glob_0_13, "./assets/icons/group_by.png": __vite_glob_0_14, "./assets/icons/input_data.png": __vite_glob_0_15, "./assets/icons/join.png": __vite_glob_0_16, "./assets/icons/manual_input.png": __vite_glob_0_17, "./assets/icons/old_join.png": __vite_glob_0_18, "./assets/icons/output.png": __vite_glob_0_19, "./assets/icons/pivot.png": __vite_glob_0_20, "./assets/icons/polars_code.png": __vite_glob_0_21, "./assets/icons/record_count.png": __vite_glob_0_22, "./assets/icons/record_id.png": __vite_glob_0_23, "./assets/icons/sample.png": __vite_glob_0_24, "./assets/icons/select.png": __vite_glob_0_25, "./assets/icons/sort.png": __vite_glob_0_26, "./assets/icons/summarize.png": __vite_glob_0_27, "./assets/icons/text_to_rows.png": __vite_glob_0_28, "./assets/icons/union.png": __vite_glob_0_29, "./assets/icons/unique.png": __vite_glob_0_30, "./assets/icons/unpivot.png": __vite_glob_0_31, "./assets/icons/user-defined-icon.png": __vite_glob_0_32, "./assets/icons/view.png": __vite_glob_0_33 }))[`./assets/icons/${name}`], self.location).href;
15088
+ };
15089
+ const fetchNodes = async () => {
15090
+ const response = await axios.get("/node_list");
15091
+ const listNodes = response.data;
15092
+ return listNodes;
15093
+ };
15094
+ const _hoisted_1$e = { class: "component-wrapper" };
15095
+ const _hoisted_2$c = { class: "tooltip-text" };
15096
+ const _hoisted_3$b = ["src", "alt"];
15097
+ const _sfc_main$h = /* @__PURE__ */ defineComponent({
15098
+ __name: "nodeButton",
15099
+ props: {
15100
+ nodeId: {},
15101
+ imageSrc: {},
15102
+ title: {},
15103
+ drawerComponent: {},
15104
+ drawerProps: {},
15105
+ nodeTitleInfo: {}
15106
+ },
15107
+ emits: ["click"],
15108
+ setup(__props, { emit: __emit }) {
15109
+ const description = ref("");
15110
+ const mouseX = ref(0);
15111
+ const mouseY = ref(0);
15112
+ const nodeStore = useNodeStore();
15113
+ const props2 = __props;
15114
+ const isSelected = computed$1(() => {
15115
+ return nodeStore.node_id == props2.nodeId;
15116
+ });
15117
+ computed$1(() => {
15118
+ const overlayWidth = 400;
15119
+ const overlayHeight = 200;
15120
+ const buffer = 100;
15121
+ let left = mouseX.value + buffer;
15122
+ let top = mouseY.value + buffer;
15123
+ if (left + overlayWidth > window.innerWidth) {
15124
+ left -= overlayWidth + 2 * buffer;
15125
+ }
15126
+ if (top + overlayHeight > window.innerHeight) {
15127
+ top -= overlayHeight + 2 * buffer;
15128
+ }
15129
+ left = Math.max(left, buffer);
15130
+ top = Math.max(top, buffer);
15131
+ return {
15132
+ top: `${top}px`,
15133
+ left: `${left}px`
15134
+ };
15135
+ });
15136
+ const nodeResult = computed$1(() => {
15137
+ const nodeResult2 = nodeStore.getNodeResult(props2.nodeId);
15138
+ const nodeValidation = nodeStore.getNodeValidation(props2.nodeId);
15139
+ if (nodeResult2 && nodeResult2.is_running) {
15140
+ return {
15141
+ success: void 0,
15142
+ statusIndicator: "running",
15143
+ hasRun: false,
15144
+ error: void 0
15145
+ };
15146
+ }
15147
+ if (nodeResult2 && !nodeResult2.is_running) {
15148
+ if (nodeValidation) {
15149
+ if (nodeResult2.success === true && !nodeValidation.isValid && nodeValidation.validationTime > nodeResult2.start_timestamp) {
15150
+ return {
15151
+ success: true,
15152
+ statusIndicator: "warning",
15153
+ error: nodeValidation.error,
15154
+ hasRun: true
15155
+ };
15156
+ }
15157
+ if (nodeResult2.success === true && nodeValidation.isValid) {
15158
+ return {
15159
+ success: true,
15160
+ statusIndicator: "success",
15161
+ error: nodeResult2.error || nodeValidation.error,
15162
+ hasRun: true
15163
+ };
15164
+ }
15165
+ if (nodeResult2.success === false && nodeValidation.isValid && nodeValidation.validationTime > nodeResult2.start_timestamp) {
15166
+ return {
15167
+ success: false,
15168
+ statusIndicator: "unknown",
15169
+ error: nodeResult2.error || nodeValidation.error,
15170
+ hasRun: true
15171
+ };
15172
+ }
15173
+ if (nodeResult2.success === false && (!nodeValidation.isValid || !nodeValidation.validationTime)) {
15174
+ return {
15175
+ success: false,
15176
+ statusIndicator: "failure",
15177
+ error: nodeResult2.error || nodeValidation.error,
15178
+ hasRun: true
15179
+ };
15180
+ }
15181
+ }
15182
+ return {
15183
+ success: nodeResult2.success ?? false,
15184
+ statusIndicator: nodeResult2.success ? "success" : "failure",
15185
+ error: nodeResult2.error,
15186
+ hasRun: true
15187
+ };
15188
+ }
15189
+ if (nodeValidation) {
15190
+ if (!nodeValidation.isValid) {
15191
+ return {
15192
+ success: false,
15193
+ statusIndicator: "warning",
15194
+ error: nodeValidation.error,
15195
+ hasRun: false
15196
+ };
15197
+ }
15198
+ if (nodeValidation.isValid) {
15199
+ return {
15200
+ success: true,
15201
+ statusIndicator: "unknown",
15202
+ error: nodeValidation.error,
15203
+ hasRun: false
15204
+ };
15205
+ }
15206
+ }
15207
+ return void 0;
15208
+ });
15209
+ const tooltipContent = computed$1(() => {
15210
+ var _a, _b, _c;
15211
+ switch ((_a = nodeResult.value) == null ? void 0 : _a.statusIndicator) {
15212
+ case "success":
15213
+ return "Operation successful";
15214
+ case "failure":
15215
+ return "Operation failed: \n" + (((_b = nodeResult.value) == null ? void 0 : _b.error) || "No error message available");
15216
+ case "warning":
15217
+ return "Operation warning: \n" + (((_c = nodeResult.value) == null ? void 0 : _c.error) || "No warning message available");
15218
+ case "running":
15219
+ return "Operation in progress...";
15220
+ case "unknown":
15221
+ default:
15222
+ return "Status unknown";
15223
+ }
15224
+ });
15225
+ const getNodeDescription = async () => {
15226
+ description.value = await nodeStore.getNodeDescription(props2.nodeId);
15227
+ };
15228
+ watch$1(
15229
+ () => nodeStore.node_id,
15230
+ (newNodeId, oldNodeId) => {
15231
+ if (String(newNodeId) === String(props2.nodeId) && props2.drawerComponent) {
15232
+ nodeStore.openDrawer(props2.drawerComponent, props2.nodeTitleInfo);
15233
+ }
15234
+ },
15235
+ { immediate: true }
15236
+ );
15237
+ onMounted(() => {
15238
+ watch$1(
15239
+ () => props2.nodeId,
15240
+ async (newVal) => {
15241
+ if (newVal !== -1) {
15242
+ await nextTick();
15243
+ getNodeDescription();
15244
+ }
15245
+ }
15246
+ );
15247
+ });
15248
+ return (_ctx, _cache) => {
15249
+ var _a;
15250
+ return openBlock(), createElementBlock("div", _hoisted_1$e, [
15251
+ createBaseVNode("div", {
15252
+ class: normalizeClass(["status-indicator", (_a = nodeResult.value) == null ? void 0 : _a.statusIndicator])
15253
+ }, [
15254
+ createBaseVNode("span", _hoisted_2$c, toDisplayString(tooltipContent.value), 1)
15255
+ ], 2),
15256
+ createBaseVNode("button", {
15257
+ class: normalizeClass(["node-button", { selected: isSelected.value }]),
15258
+ onClick: _cache[0] || (_cache[0] = //@ts-ignore
15259
+ (...args) => _ctx.onClick && _ctx.onClick(...args))
15260
+ }, [
15261
+ createBaseVNode("img", {
15262
+ src: unref(getImageUrl)(props2.imageSrc),
15263
+ alt: props2.title,
15264
+ width: "50"
15265
+ }, null, 8, _hoisted_3$b)
15266
+ ], 2)
15267
+ ]);
15268
+ };
15269
+ }
15270
+ });
15271
+ const nodeButton_vue_vue_type_style_index_0_scoped_3af13a13_lang = "";
15272
+ const NodeButton = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["__scopeId", "data-v-3af13a13"]]);
15273
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
15274
+ __name: "GenericNode",
15275
+ props: {
15276
+ nodeId: {},
15277
+ nodeData: {}
15278
+ },
15279
+ setup(__props) {
15280
+ const drawerModules = /* @__PURE__ */ Object.assign({ "./elements/cloudStorageReader/CloudStorageReader.vue": () => __vitePreload(() => import("./CloudStorageReader-19cdd67a.js"), true ? ["assets/CloudStorageReader-19cdd67a.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/api-c908fffe.js","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/CloudStorageReader-29d14fcc.css"] : void 0), "./elements/cloudStorageWriter/CloudStorageWriter.vue": () => __vitePreload(() => import("./CloudStorageWriter-48e0ae20.js"), true ? ["assets/CloudStorageWriter-48e0ae20.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/api-c908fffe.js","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/CloudStorageWriter-b0ee067f.css"] : void 0), "./elements/crossJoin/CrossJoin.vue": () => __vitePreload(() => import("./CrossJoin-a88f8142.js"), true ? ["assets/CrossJoin-a88f8142.js","assets/vue-content-loader.es-22bac17c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-7ad95bca.js","assets/UnavailableFields-66239e83.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-aa913ff4.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/CrossJoin-1119d18e.css"] : void 0), "./elements/customNode/CustomNode.vue": () => __vitePreload(() => import("./CustomNode-cb863dff.js"), true ? ["assets/CustomNode-cb863dff.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/MultiSelect.vue_vue_type_script_setup_true_lang-2a7c8312.js","assets/ToggleSwitch.vue_vue_type_script_setup_true_lang-f620cd32.js","assets/TextInput.vue_vue_type_script_setup_true_lang-9cad14ba.js","assets/NumericInput.vue_vue_type_script_setup_true_lang-211a1990.js","assets/SliderInput-53105476.js","assets/SliderInput-b8fb6a8c.css","assets/SingleSelect.vue_vue_type_script_setup_true_lang-43807bad.js","assets/ColumnSelector-ecaf7c44.js","assets/ColumnSelector-47996a16.css","assets/CustomNode-74a37f74.css"] : void 0), "./elements/customNode/components/ColumnSelector.vue": () => __vitePreload(() => import("./ColumnSelector-ecaf7c44.js"), true ? ["assets/ColumnSelector-ecaf7c44.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/ColumnSelector-47996a16.css"] : void 0), "./elements/customNode/components/MultiSelect.vue": () => __vitePreload(() => import("./MultiSelect-61b98268.js"), true ? ["assets/MultiSelect-61b98268.js","assets/MultiSelect.vue_vue_type_script_setup_true_lang-2a7c8312.js","assets/index-5ec791df.js","assets/index-50508d4d.css"] : void 0), "./elements/customNode/components/NumericInput.vue": () => __vitePreload(() => import("./NumericInput-e36602c2.js"), true ? ["assets/NumericInput-e36602c2.js","assets/NumericInput.vue_vue_type_script_setup_true_lang-211a1990.js","assets/index-5ec791df.js","assets/index-50508d4d.css"] : void 0), "./elements/customNode/components/SingleSelect.vue": () => __vitePreload(() => import("./SingleSelect-7298811a.js"), true ? ["assets/SingleSelect-7298811a.js","assets/SingleSelect.vue_vue_type_script_setup_true_lang-43807bad.js","assets/index-5ec791df.js","assets/index-50508d4d.css"] : void 0), "./elements/customNode/components/SliderInput.vue": () => __vitePreload(() => import("./SliderInput-53105476.js"), true ? ["assets/SliderInput-53105476.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/SliderInput-b8fb6a8c.css"] : void 0), "./elements/customNode/components/TextInput.vue": () => __vitePreload(() => import("./TextInput-28366b7e.js"), true ? ["assets/TextInput-28366b7e.js","assets/TextInput.vue_vue_type_script_setup_true_lang-9cad14ba.js","assets/index-5ec791df.js","assets/index-50508d4d.css"] : void 0), "./elements/customNode/components/ToggleSwitch.vue": () => __vitePreload(() => import("./ToggleSwitch-598add30.js"), true ? ["assets/ToggleSwitch-598add30.js","assets/ToggleSwitch.vue_vue_type_script_setup_true_lang-f620cd32.js","assets/index-5ec791df.js","assets/index-50508d4d.css"] : void 0), "./elements/databaseReader/DatabaseConnectionSettings.vue": () => __vitePreload(() => import("./DatabaseConnectionSettings-819d3267.js"), true ? ["assets/DatabaseConnectionSettings-819d3267.js","assets/secretApi-b3cb072e.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/DatabaseConnectionSettings-0c04b2e5.css"] : void 0), "./elements/databaseReader/DatabaseReader.vue": () => __vitePreload(() => import("./DatabaseReader-060dd412.js"), true ? ["assets/DatabaseReader-060dd412.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/api-2d1394bd.js","assets/DatabaseConnectionSettings-819d3267.js","assets/secretApi-b3cb072e.js","assets/DatabaseConnectionSettings-0c04b2e5.css","assets/SQLQueryComponent-8a486004.js","assets/SQLQueryComponent-36cef432.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/DatabaseReader-ae61773c.css"] : void 0), "./elements/databaseReader/SQLQueryComponent.vue": () => __vitePreload(() => import("./SQLQueryComponent-8a486004.js"), true ? ["assets/SQLQueryComponent-8a486004.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/SQLQueryComponent-36cef432.css"] : void 0), "./elements/databaseWriter/DatabaseWriter.vue": () => __vitePreload(() => import("./DatabaseWriter-7fc7750f.js"), true ? ["assets/DatabaseWriter-7fc7750f.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/api-2d1394bd.js","assets/DatabaseConnectionSettings-819d3267.js","assets/secretApi-b3cb072e.js","assets/DatabaseConnectionSettings-0c04b2e5.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/DatabaseWriter-2f570e53.css"] : void 0), "./elements/exploreData/ExploreData.vue": () => __vitePreload(() => import("./ExploreData-82c95991.js"), true ? ["assets/ExploreData-82c95991.js","assets/vue-content-loader.es-22bac17c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/VueGraphicWalker-4d7861f4.js","assets/VueGraphicWalker-ed5ab88b.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/ExploreData-2d0cf4db.css"] : void 0), "./elements/exploreData/vueGraphicWalker/VueGraphicWalker.vue": () => __vitePreload(() => import("./VueGraphicWalker-4d7861f4.js"), true ? ["assets/VueGraphicWalker-4d7861f4.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/VueGraphicWalker-ed5ab88b.css"] : void 0), "./elements/externalSource/ExternalSource.vue": () => __vitePreload(() => import("./ExternalSource-e1a6ddc7.js"), true ? ["assets/ExternalSource-e1a6ddc7.js","assets/vue-content-loader.es-22bac17c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/ExternalSource-e37b6275.css"] : void 0), "./elements/filter/Filter.vue": () => __vitePreload(() => import("./Filter-8aca894a.js"), true ? ["assets/Filter-8aca894a.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/dropDown-41ebe3c2.js","assets/dropDown-35135ba8.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-0670d32d.js","assets/fullEditor-178376bb.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Filter-f62091b3.css"] : void 0), "./elements/formula/Formula.vue": () => __vitePreload(() => import("./Formula-e33686d9.js"), true ? ["assets/Formula-e33686d9.js","assets/vue-content-loader.es-22bac17c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-0670d32d.js","assets/fullEditor-178376bb.css","assets/dropDown-41ebe3c2.js","assets/dropDown-35135ba8.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Formula-bb96803d.css"] : void 0), "./elements/fuzzyMatch/FuzzyMatch.vue": () => __vitePreload(() => import("./FuzzyMatch-abda150d.js"), true ? ["assets/FuzzyMatch-abda150d.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-41ebe3c2.js","assets/dropDown-35135ba8.css","assets/selectDynamic-7ad95bca.js","assets/UnavailableFields-66239e83.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-aa913ff4.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/vue-content-loader.es-22bac17c.js","assets/FuzzyMatch-1010f966.css"] : void 0), "./elements/graphSolver/ContextMenu.vue": () => __vitePreload(() => import("./ContextMenu-2b348c4c.js"), true ? ["assets/ContextMenu-2b348c4c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/ContextMenu-63cfa99b.css"] : void 0), "./elements/graphSolver/GraphSolver.vue": () => __vitePreload(() => import("./GraphSolver-4ecad1d7.js"), true ? ["assets/GraphSolver-4ecad1d7.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/ContextMenu-2b348c4c.js","assets/ContextMenu-63cfa99b.css","assets/SettingsSection-5634f439.js","assets/SettingsSection-5c696bee.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/GraphSolver-f0cb7bfb.css"] : void 0), "./elements/graphSolver/PivotValidation.vue": () => __vitePreload(() => import("./PivotValidation-e150a24b.js"), true ? ["assets/PivotValidation-e150a24b.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/PivotValidation-891ddfb0.css"] : void 0), "./elements/graphSolver/SettingsSection.vue": () => __vitePreload(() => import("./SettingsSection-5634f439.js"), true ? ["assets/SettingsSection-5634f439.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/SettingsSection-5c696bee.css"] : void 0), "./elements/groupBy/GroupBy.vue": () => __vitePreload(() => import("./GroupBy-656d07f3.js"), true ? ["assets/GroupBy-656d07f3.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/GroupBy-b9505323.css"] : void 0), "./elements/join/Join.vue": () => __vitePreload(() => import("./Join-b84ec849.js"), true ? ["assets/Join-b84ec849.js","assets/vue-content-loader.es-22bac17c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-41ebe3c2.js","assets/dropDown-35135ba8.css","assets/selectDynamic-7ad95bca.js","assets/UnavailableFields-66239e83.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-aa913ff4.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Join-fd79b451.css"] : void 0), "./elements/manualInput/ManualInput.vue": () => __vitePreload(() => import("./ManualInput-346f4135.js"), true ? ["assets/ManualInput-346f4135.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/ManualInput-3246a08d.css"] : void 0), "./elements/output/Output.vue": () => __vitePreload(() => import("./Output-eb041599.js"), true ? ["assets/Output-eb041599.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror-bccfde04.css","assets/outputCsv-059583b6.js","assets/outputCsv-9cc59e0b.css","assets/outputExcel-76b1e02c.js","assets/outputExcel-b41305c0.css","assets/outputParquet-440fd4c7.js","assets/outputParquet-cf8cf3f2.css","assets/Output-ddc9079f.css"] : void 0), "./elements/output/outputCsv.vue": () => __vitePreload(() => import("./outputCsv-059583b6.js"), true ? ["assets/outputCsv-059583b6.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/outputCsv-9cc59e0b.css"] : void 0), "./elements/output/outputExcel.vue": () => __vitePreload(() => import("./outputExcel-76b1e02c.js"), true ? ["assets/outputExcel-76b1e02c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/outputExcel-b41305c0.css"] : void 0), "./elements/output/outputParquet.vue": () => __vitePreload(() => import("./outputParquet-440fd4c7.js"), true ? ["assets/outputParquet-440fd4c7.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/outputParquet-cf8cf3f2.css"] : void 0), "./elements/pivot/ContextMenu.vue": () => __vitePreload(() => import("./ContextMenu-eca26a03.js"), true ? ["assets/ContextMenu-eca26a03.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/ContextMenu-4c74eef1.css"] : void 0), "./elements/pivot/Pivot.vue": () => __vitePreload(() => import("./Pivot-f5c774f4.js"), true ? ["assets/Pivot-f5c774f4.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/ContextMenu-eca26a03.js","assets/ContextMenu-4c74eef1.css","assets/SettingsSection-310b61c0.js","assets/SettingsSection-71e6b7e3.css","assets/PivotValidation-26546cbc.js","assets/PivotValidation-c46cd420.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Pivot-cf333e3d.css"] : void 0), "./elements/pivot/PivotValidation.vue": () => __vitePreload(() => import("./PivotValidation-26546cbc.js"), true ? ["assets/PivotValidation-26546cbc.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/PivotValidation-c46cd420.css"] : void 0), "./elements/pivot/SettingsSection.vue": () => __vitePreload(() => import("./SettingsSection-310b61c0.js"), true ? ["assets/SettingsSection-310b61c0.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/SettingsSection-71e6b7e3.css"] : void 0), "./elements/polarsCode/PolarsCode.vue": () => __vitePreload(() => import("./PolarsCode-da3a7abf.js"), true ? ["assets/PolarsCode-da3a7abf.js","assets/vue-content-loader.es-22bac17c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/PolarsCode-650322d1.css"] : void 0), "./elements/read/Read.vue": () => __vitePreload(() => import("./Read-0c768769.js"), true ? ["assets/Read-0c768769.js","assets/vue-content-loader.es-22bac17c.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/readExcel-7f40d237.js","assets/dropDown-41ebe3c2.js","assets/dropDown-35135ba8.css","assets/readExcel-e1b381ea.css","assets/readCsv-9813903a.js","assets/readCsv-bca3ed53.css","assets/readParquet-22d56002.js","assets/readParquet-cee068e2.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/Read-6b17491f.css"] : void 0), "./elements/read/readCsv.vue": () => __vitePreload(() => import("./readCsv-9813903a.js"), true ? ["assets/readCsv-9813903a.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/readCsv-bca3ed53.css"] : void 0), "./elements/read/readExcel.vue": () => __vitePreload(() => import("./readExcel-7f40d237.js"), true ? ["assets/readExcel-7f40d237.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/dropDown-41ebe3c2.js","assets/dropDown-35135ba8.css","assets/vue-content-loader.es-22bac17c.js","assets/readExcel-e1b381ea.css"] : void 0), "./elements/read/readParquet.vue": () => __vitePreload(() => import("./readParquet-22d56002.js"), true ? ["assets/readParquet-22d56002.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/readParquet-cee068e2.css"] : void 0), "./elements/recordCount/RecordCount.vue": () => __vitePreload(() => import("./RecordCount-84736276.js"), true ? ["assets/RecordCount-84736276.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css"] : void 0), "./elements/recordId/RecordId.vue": () => __vitePreload(() => import("./RecordId-60055e6d.js"), true ? ["assets/RecordId-60055e6d.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/ContextMenu-eca26a03.js","assets/ContextMenu-4c74eef1.css","assets/SettingsSection-310b61c0.js","assets/SettingsSection-71e6b7e3.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css"] : void 0), "./elements/sample/Sample.vue": () => __vitePreload(() => import("./Sample-2d662611.js"), true ? ["assets/Sample-2d662611.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css"] : void 0), "./elements/select/Select.vue": () => __vitePreload(() => import("./Select-2e4a6965.js"), true ? ["assets/Select-2e4a6965.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-7ad95bca.js","assets/UnavailableFields-66239e83.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-aa913ff4.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css"] : void 0), "./elements/sort/Sort.vue": () => __vitePreload(() => import("./Sort-4fdebe74.js"), true ? ["assets/Sort-4fdebe74.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/vue-content-loader.es-22bac17c.js","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Sort-3643d625.css"] : void 0), "./elements/textToRows/TextToRows.vue": () => __vitePreload(() => import("./TextToRows-73ffa692.js"), true ? ["assets/TextToRows-73ffa692.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-41ebe3c2.js","assets/dropDown-35135ba8.css","assets/UnavailableFields-66239e83.js","assets/UnavailableFields-5edd5322.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/vue-content-loader.es-22bac17c.js","assets/TextToRows-5d2c1190.css"] : void 0), "./elements/union/Union.vue": () => __vitePreload(() => import("./Union-26b10614.js"), true ? ["assets/Union-26b10614.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Union-af6c3d9b.css"] : void 0), "./elements/unique/Unique.vue": () => __vitePreload(() => import("./Unique-33b9edbb.js"), true ? ["assets/Unique-33b9edbb.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-content-loader.es-22bac17c.js","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-7ad95bca.js","assets/UnavailableFields-66239e83.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-aa913ff4.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Unique-f9fb0809.css"] : void 0), "./elements/unpivot/ContextMenu.vue": () => __vitePreload(() => import("./ContextMenu-a779eed7.js"), true ? ["assets/ContextMenu-a779eed7.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/ContextMenu-c13f91d0.css"] : void 0), "./elements/unpivot/SettingsSection.vue": () => __vitePreload(() => import("./SettingsSection-7c68b19f.js"), true ? ["assets/SettingsSection-7c68b19f.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/SettingsSection-2e4d03c4.css"] : void 0), "./elements/unpivot/Unpivot.vue": () => __vitePreload(() => import("./Unpivot-ef69d0e2.js"), true ? ["assets/Unpivot-ef69d0e2.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/vue-codemirror.esm-b1dfaa46.js","assets/vue-codemirror-bccfde04.css","assets/ContextMenu-a779eed7.js","assets/ContextMenu-c13f91d0.css","assets/SettingsSection-7c68b19f.js","assets/SettingsSection-2e4d03c4.css","assets/genericNodeSettings-38410ebf.js","assets/genericNodeSettings-924759c7.css","assets/Unpivot-1e422df3.css"] : void 0), "./elements/unpivot/UnpivotValidation.vue": () => __vitePreload(() => import("./UnpivotValidation-8658388e.js"), true ? ["assets/UnpivotValidation-8658388e.js","assets/index-5ec791df.js","assets/index-50508d4d.css","assets/UnpivotValidation-0d240eeb.css"] : void 0) });
15281
+ const props2 = __props;
15282
+ const drawerComponent = shallowRef(null);
15283
+ onMounted(() => {
15284
+ loadDrawerComponent();
15285
+ });
15286
+ const toCamelCase = (str) => {
15287
+ return str.replace(/_([a-z])/g, (_2, letter) => letter.toUpperCase());
15288
+ };
15289
+ const loadDrawerComponent = () => {
15290
+ try {
15291
+ let componentName;
15292
+ let folderName;
15293
+ if (props2.nodeData.custom_node) {
15294
+ componentName = "CustomNode";
15295
+ folderName = "customNode";
15296
+ } else {
15297
+ componentName = toTitleCase(props2.nodeData.item);
15298
+ folderName = toCamelCase(props2.nodeData.item.toLowerCase());
15299
+ }
15300
+ const componentPath = `./elements/${folderName}/${componentName}.vue`;
15301
+ const componentLoader = drawerModules[componentPath];
15302
+ if (!componentLoader) {
15303
+ console.error(`Component not found at path: ${componentPath}`);
15304
+ console.log(
15305
+ "Available paths:",
15306
+ Object.keys(drawerModules).filter((path2) => path2.includes(`/${folderName}/`))
15307
+ );
15308
+ return;
15309
+ }
15310
+ drawerComponent.value = markRaw$1(
15311
+ defineAsyncComponent({
15312
+ loader: componentLoader,
15313
+ errorComponent: void 0,
15314
+ timeout: 3e3,
15315
+ onError(error, retry, fail, attempts) {
15316
+ console.error(`Failed to load drawer component for ${props2.nodeData.item}:`, error);
15317
+ if (attempts <= 3) {
15318
+ retry();
15319
+ } else {
15320
+ fail();
15321
+ }
15322
+ }
15323
+ })
15324
+ );
15325
+ } catch (error) {
15326
+ console.error(`Error setting up drawer component for ${props2.nodeData.item}:`, error);
15327
+ }
15328
+ };
15329
+ const imageSrc = computed$1(() => {
15330
+ var _a;
15331
+ return ((_a = props2.nodeData) == null ? void 0 : _a.image) || "default.png";
15332
+ });
15333
+ const nodeTitle = computed$1(() => {
15334
+ var _a, _b;
15335
+ const displayName = ((_a = props2.nodeData) == null ? void 0 : _a.label) || ((_b = props2.nodeData) == null ? void 0 : _b.name) || "Node";
15336
+ return `${props2.nodeId}: ${displayName}`;
15337
+ });
15338
+ const nodeTitleInfo = computed$1(() => {
15339
+ var _a, _b;
15340
+ return {
15341
+ title: ((_a = props2.nodeData) == null ? void 0 : _a.drawer_title) || "Node Configuration",
15342
+ intro: ((_b = props2.nodeData) == null ? void 0 : _b.drawer_intro) || "Configure node settings"
15343
+ };
15344
+ });
15345
+ onErrorCaptured((error) => {
15346
+ console.error("Error in GenericNode component:", error);
15347
+ return false;
15348
+ });
15349
+ return (_ctx, _cache) => {
15350
+ return openBlock(), createBlock(NodeButton, {
15351
+ ref: "nodeButton",
15352
+ "node-id": _ctx.nodeId,
15353
+ "image-src": imageSrc.value,
15354
+ title: nodeTitle.value,
15355
+ "drawer-component": drawerComponent.value,
15356
+ "node-title-info": nodeTitleInfo.value
15357
+ }, null, 8, ["node-id", "image-src", "title", "drawer-component", "node-title-info"]);
15358
+ };
15359
+ }
15360
+ });
15361
+ const GenericNode_vue_vue_type_style_index_0_scoped_00eceaf3_lang = "";
15362
+ const GenericNode = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["__scopeId", "data-v-00eceaf3"]]);
15363
+ const _hoisted_1$d = { class: "description-text" };
15364
+ const _hoisted_2$b = {
14413
15365
  key: 0,
14414
15366
  class: "truncated-indicator",
14415
15367
  title: "Click to see full description"
14416
15368
  };
14417
- const _hoisted_3$7 = ["id"];
14418
- const _hoisted_4$7 = ["id"];
15369
+ const _hoisted_3$a = ["id"];
15370
+ const _hoisted_4$9 = ["id"];
14419
15371
  const CHAR_LIMIT = 100;
14420
- const _sfc_main$c = /* @__PURE__ */ defineComponent({
15372
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
14421
15373
  __name: "CustomNode",
14422
15374
  props: {
14423
15375
  data: {
@@ -14435,6 +15387,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14435
15387
  const showMenu = ref(false);
14436
15388
  const contextMenuX = ref(0);
14437
15389
  const contextMenuY = ref(0);
15390
+ const props2 = __props;
14438
15391
  const onTitleClick = (event) => {
14439
15392
  toggleEditMode(true);
14440
15393
  mouseX.value = event.clientX;
@@ -14483,22 +15436,25 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14483
15436
  window.removeEventListener("click", handleClickOutsideMenu);
14484
15437
  };
14485
15438
  const copyNode2 = () => {
15439
+ var _a, _b, _c, _d, _e;
14486
15440
  const nodeCopyValue = {
14487
15441
  nodeIdToCopyFrom: props2.data.id,
14488
- type: props2.data.component.__name || "unknown",
15442
+ type: ((_a = props2.data.nodeTemplate) == null ? void 0 : _a.item) || ((_b = props2.data.component) == null ? void 0 : _b.__name) || "unknown",
14489
15443
  label: props2.data.label,
14490
15444
  description: description.value,
14491
15445
  numberOfInputs: props2.data.inputs.length,
14492
15446
  numberOfOutputs: props2.data.outputs.length,
14493
- typeSnakeCase: toSnakeCase(props2.data.component.__name || "unknown"),
14494
- flowIdToCopyFrom: nodeStore.flow_id
15447
+ typeSnakeCase: ((_c = props2.data.nodeTemplate) == null ? void 0 : _c.item) || toSnakeCase(((_d = props2.data.component) == null ? void 0 : _d.__name) || "unknown"),
15448
+ flowIdToCopyFrom: nodeStore.flow_id,
15449
+ multi: (_e = props2.data.nodeTemplate) == null ? void 0 : _e.multi,
15450
+ nodeTemplate: props2.data.nodeTemplate
14495
15451
  };
14496
15452
  localStorage.setItem("copiedNode", JSON.stringify(nodeCopyValue));
14497
15453
  console.log("Node copied:", nodeCopyValue);
14498
15454
  closeContextMenu();
14499
15455
  };
14500
15456
  const deleteNode2 = () => {
14501
- console.log("Paste node functionality will be implemented in the next step");
15457
+ console.log("Deleting node");
14502
15458
  if (nodeStore.vueFlowInstance) {
14503
15459
  let vueFlow = nodeStore.vueFlowInstance;
14504
15460
  vueFlow.removeNodes(props2.data.id.toLocaleString(), true);
@@ -14601,7 +15557,6 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14601
15557
  }
14602
15558
  return description.value;
14603
15559
  });
14604
- const props2 = __props;
14605
15560
  function getHandleStyle(index, total) {
14606
15561
  const topMargin = 30;
14607
15562
  const bottomMargin = 25;
@@ -14672,8 +15627,8 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14672
15627
  createBaseVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" })
14673
15628
  ], -1)
14674
15629
  ])),
14675
- createBaseVNode("pre", _hoisted_1$b, toDisplayString(descriptionSummary.value), 1),
14676
- isTruncated.value ? (openBlock(), createElementBlock("span", _hoisted_2$8, "...")) : createCommentVNode("", true)
15630
+ createBaseVNode("pre", _hoisted_1$d, toDisplayString(descriptionSummary.value), 1),
15631
+ isTruncated.value ? (openBlock(), createElementBlock("span", _hoisted_2$b, "...")) : createCommentVNode("", true)
14677
15632
  ], 4)) : (openBlock(), createElementBlock("div", {
14678
15633
  key: 1,
14679
15634
  id: props2.data.id.toLocaleString(),
@@ -14687,10 +15642,10 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14687
15642
  class: "description-input",
14688
15643
  data: "description_input",
14689
15644
  onBlur: _cache[2] || (_cache[2] = ($event) => toggleEditMode(false))
14690
- }, null, 40, _hoisted_4$7), [
15645
+ }, null, 40, _hoisted_4$9), [
14691
15646
  [vModelText, description.value]
14692
15647
  ])
14693
- ], 12, _hoisted_3$7))
15648
+ ], 12, _hoisted_3$a))
14694
15649
  ])
14695
15650
  ], 32),
14696
15651
  createBaseVNode("div", {
@@ -14699,16 +15654,21 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14699
15654
  class: "custom-node",
14700
15655
  onContextmenu: withModifiers(showContextMenu, ["prevent"])
14701
15656
  }, [
14702
- (openBlock(), createBlock(resolveDynamicComponent(__props.data.component), {
15657
+ __props.data.nodeTemplate ? (openBlock(), createBlock(GenericNode, {
15658
+ key: 0,
15659
+ "node-id": __props.data.id,
15660
+ "node-data": { ...__props.data.nodeTemplate, id: __props.data.id, label: __props.data.label }
15661
+ }, null, 8, ["node-id", "node-data"])) : __props.data.component ? (openBlock(), createBlock(resolveDynamicComponent(__props.data.component), {
15662
+ key: 1,
14703
15663
  "node-id": __props.data.id
14704
- }, null, 8, ["node-id"])),
15664
+ }, null, 8, ["node-id"])) : createCommentVNode("", true),
14705
15665
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.data.inputs, (input, index) => {
14706
15666
  return openBlock(), createElementBlock("div", {
14707
15667
  key: input.id,
14708
15668
  class: "handle-input",
14709
15669
  style: normalizeStyle(getHandleStyle(index, __props.data.inputs.length))
14710
15670
  }, [
14711
- createVNode(unref(_sfc_main$f), {
15671
+ createVNode(unref(_sfc_main$f$1), {
14712
15672
  id: input.id,
14713
15673
  type: "target",
14714
15674
  position: input.position
@@ -14721,7 +15681,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14721
15681
  class: "handle-output",
14722
15682
  style: normalizeStyle(getHandleStyle(index, __props.data.outputs.length))
14723
15683
  }, [
14724
- createVNode(unref(_sfc_main$f), {
15684
+ createVNode(unref(_sfc_main$f$1), {
14725
15685
  id: output.id,
14726
15686
  type: "source",
14727
15687
  position: output.position
@@ -14729,7 +15689,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14729
15689
  ], 4);
14730
15690
  }), 128)),
14731
15691
  showMenu.value ? (openBlock(), createBlock(Teleport, {
14732
- key: 0,
15692
+ key: 2,
14733
15693
  to: "body"
14734
15694
  }, [
14735
15695
  createBaseVNode("div", {
@@ -14797,36 +15757,82 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
14797
15757
  };
14798
15758
  }
14799
15759
  });
14800
- const CustomNode_vue_vue_type_style_index_0_scoped_74411a9e_lang = "";
14801
- const CustomNode = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__scopeId", "data-v-74411a9e"]]);
14802
- const __variableDynamicImportRuntimeHelper = (glob, path2) => {
14803
- const v = glob[path2];
14804
- if (v) {
14805
- return typeof v === "function" ? v() : Promise.resolve(v);
14806
- }
14807
- return new Promise((_2, reject) => {
14808
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path2)));
14809
- });
14810
- };
14811
- const componentCache = {};
14812
- function getComponent(name) {
14813
- if (!componentCache[name]) {
14814
- componentCache[name] = __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "../../nodes/CloudStorageReader.vue": () => __vitePreload(() => import("./CloudStorageReader-f1ff509e.js"), true ? ["assets/CloudStorageReader-f1ff509e.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-cb00cce6.js","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/CloudStorageReader-29d14fcc.css"] : void 0), "../../nodes/CloudStorageWriter.vue": () => __vitePreload(() => import("./CloudStorageWriter-034f8b78.js"), true ? ["assets/CloudStorageWriter-034f8b78.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-cb00cce6.js","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/CloudStorageWriter-49c9a4b2.css"] : void 0), "../../nodes/CrossJoin.vue": () => __vitePreload(() => import("./CrossJoin-9e156ebe.js"), true ? ["assets/CrossJoin-9e156ebe.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/CrossJoin-41efa4cb.css"] : void 0), "../../nodes/DatabaseReader.vue": () => __vitePreload(() => import("./DatabaseReader-0b10551e.js"), true ? ["assets/DatabaseReader-0b10551e.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-023d1733.js","assets/DatabaseConnectionSettings-d5c625b3.js","assets/secretApi-baceb6f9.js","assets/DatabaseConnectionSettings-0c04b2e5.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/DatabaseReader-f50c6558.css"] : void 0), "../../nodes/DatabaseWriter.vue": () => __vitePreload(() => import("./DatabaseWriter-c17c6916.js"), true ? ["assets/DatabaseWriter-c17c6916.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-023d1733.js","assets/DatabaseConnectionSettings-d5c625b3.js","assets/secretApi-baceb6f9.js","assets/DatabaseConnectionSettings-0c04b2e5.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/DatabaseWriter-2f570e53.css"] : void 0), "../../nodes/ExploreData.vue": () => __vitePreload(() => import("./ExploreData-18a4fe52.js"), true ? ["assets/ExploreData-18a4fe52.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/ExploreData-5bdae813.css"] : void 0), "../../nodes/ExternalSource.vue": () => __vitePreload(() => import("./ExternalSource-3a66556c.js"), true ? ["assets/ExternalSource-3a66556c.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/ExternalSource-e37b6275.css"] : void 0), "../../nodes/Filter.vue": () => __vitePreload(() => import("./Filter-91ad87e7.js"), true ? ["assets/Filter-91ad87e7.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-ec4e4f95.js","assets/fullEditor-178376bb.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Filter-a9d08ba1.css"] : void 0), "../../nodes/Formula.vue": () => __vitePreload(() => import("./Formula-3c395ab1.js"), true ? ["assets/Formula-3c395ab1.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-ec4e4f95.js","assets/fullEditor-178376bb.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Formula-29f19d21.css"] : void 0), "../../nodes/FuzzyMatch.vue": () => __vitePreload(() => import("./FuzzyMatch-2df0d230.js"), true ? ["assets/FuzzyMatch-2df0d230.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/vue-content-loader.es-ba94b82f.js","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/FuzzyMatch-6857de82.css"] : void 0), "../../nodes/GraphSolver.vue": () => __vitePreload(() => import("./GraphSolver-d285877f.js"), true ? ["assets/GraphSolver-d285877f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/GraphSolver-17fd26db.css"] : void 0), "../../nodes/GroupBy.vue": () => __vitePreload(() => import("./GroupBy-0bd1cc6b.js"), true ? ["assets/GroupBy-0bd1cc6b.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/GroupBy-ab1ea74b.css"] : void 0), "../../nodes/Join.vue": () => __vitePreload(() => import("./Join-5a78a203.js"), true ? ["assets/Join-5a78a203.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Join-f45eff22.css"] : void 0), "../../nodes/ManualInput.vue": () => __vitePreload(() => import("./ManualInput-93aef9d6.js"), true ? ["assets/ManualInput-93aef9d6.js","assets/nodeTitle-a16db7c3.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-f4b12bcb.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/ManualInput-a71b52c6.css"] : void 0), "../../nodes/Output.vue": () => __vitePreload(() => import("./Output-411ecaee.js"), true ? ["assets/Output-411ecaee.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Output-48f81019.css"] : void 0), "../../nodes/Pivot.vue": () => __vitePreload(() => import("./Pivot-89db4b04.js"), true ? ["assets/Pivot-89db4b04.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/SettingsSection-695ac487.js","assets/SettingsSection-9c836ecc.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Pivot-f415e85f.css"] : void 0), "../../nodes/PolarsCode.vue": () => __vitePreload(() => import("./PolarsCode-a9f974f8.js"), true ? ["assets/PolarsCode-a9f974f8.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/PolarsCode-650322d1.css"] : void 0), "../../nodes/Read.vue": () => __vitePreload(() => import("./Read-c3b1929c.js"), true ? ["assets/Read-c3b1929c.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Read-80dc1675.css"] : void 0), "../../nodes/RecordCount.vue": () => __vitePreload(() => import("./RecordCount-4e95f98e.js"), true ? ["assets/RecordCount-4e95f98e.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/RecordId.vue": () => __vitePreload(() => import("./RecordId-55ae7d36.js"), true ? ["assets/RecordId-55ae7d36.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/SettingsSection-695ac487.js","assets/SettingsSection-9c836ecc.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/Sample.vue": () => __vitePreload(() => import("./Sample-b4a18476.js"), true ? ["assets/Sample-b4a18476.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/Select.vue": () => __vitePreload(() => import("./Select-727688dc.js"), true ? ["assets/Select-727688dc.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/Sort.vue": () => __vitePreload(() => import("./Sort-be3339a8.js"), true ? ["assets/Sort-be3339a8.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/vue-content-loader.es-ba94b82f.js","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Sort-7ccfa0fe.css"] : void 0), "../../nodes/TextToRows.vue": () => __vitePreload(() => import("./TextToRows-7b8998da.js"), true ? ["assets/TextToRows-7b8998da.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/vue-content-loader.es-ba94b82f.js","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/TextToRows-c92d1ec2.css"] : void 0), "../../nodes/Union.vue": () => __vitePreload(() => import("./Union-89fd73dc.js"), true ? ["assets/Union-89fd73dc.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Union-8d9ac7f9.css"] : void 0), "../../nodes/Unique.vue": () => __vitePreload(() => import("./Unique-af5a80b4.js"), true ? ["assets/Unique-af5a80b4.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Unique-b5615727.css"] : void 0), "../../nodes/Unpivot.vue": () => __vitePreload(() => import("./Unpivot-5195d411.js"), true ? ["assets/Unpivot-5195d411.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Unpivot-246e9bbd.css"] : void 0) }), `../../nodes/${toTitleCase(name)}.vue`).then((module) => {
14815
- const component = markRaw$1(module.default);
14816
- return component;
14817
- });
14818
- }
14819
- return componentCache[name];
15760
+ const CustomNode_vue_vue_type_style_index_0_scoped_e5db3d68_lang = "";
15761
+ const CustomNode = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-e5db3d68"]]);
15762
+ const componentCache = /* @__PURE__ */ new Map();
15763
+ function getComponent(nodeOrItem) {
15764
+ const cacheKey = "generic-node";
15765
+ if (componentCache.has(cacheKey)) {
15766
+ return componentCache.get(cacheKey);
15767
+ }
15768
+ const componentPromise = Promise.resolve(markRaw$1(GenericNode));
15769
+ componentCache.set(cacheKey, componentPromise);
15770
+ return componentPromise;
14820
15771
  }
14821
15772
  function getComponentRaw(name) {
14822
- if (!componentCache[name]) {
14823
- componentCache[name] = __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "../../nodes/CloudStorageReader.vue": () => __vitePreload(() => import("./CloudStorageReader-f1ff509e.js"), true ? ["assets/CloudStorageReader-f1ff509e.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-cb00cce6.js","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/CloudStorageReader-29d14fcc.css"] : void 0), "../../nodes/CloudStorageWriter.vue": () => __vitePreload(() => import("./CloudStorageWriter-034f8b78.js"), true ? ["assets/CloudStorageWriter-034f8b78.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-cb00cce6.js","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/CloudStorageWriter-49c9a4b2.css"] : void 0), "../../nodes/CrossJoin.vue": () => __vitePreload(() => import("./CrossJoin-9e156ebe.js"), true ? ["assets/CrossJoin-9e156ebe.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/CrossJoin-41efa4cb.css"] : void 0), "../../nodes/DatabaseReader.vue": () => __vitePreload(() => import("./DatabaseReader-0b10551e.js"), true ? ["assets/DatabaseReader-0b10551e.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-023d1733.js","assets/DatabaseConnectionSettings-d5c625b3.js","assets/secretApi-baceb6f9.js","assets/DatabaseConnectionSettings-0c04b2e5.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/DatabaseReader-f50c6558.css"] : void 0), "../../nodes/DatabaseWriter.vue": () => __vitePreload(() => import("./DatabaseWriter-c17c6916.js"), true ? ["assets/DatabaseWriter-c17c6916.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/api-023d1733.js","assets/DatabaseConnectionSettings-d5c625b3.js","assets/secretApi-baceb6f9.js","assets/DatabaseConnectionSettings-0c04b2e5.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/DatabaseWriter-2f570e53.css"] : void 0), "../../nodes/ExploreData.vue": () => __vitePreload(() => import("./ExploreData-18a4fe52.js"), true ? ["assets/ExploreData-18a4fe52.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/ExploreData-5bdae813.css"] : void 0), "../../nodes/ExternalSource.vue": () => __vitePreload(() => import("./ExternalSource-3a66556c.js"), true ? ["assets/ExternalSource-3a66556c.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/ExternalSource-e37b6275.css"] : void 0), "../../nodes/Filter.vue": () => __vitePreload(() => import("./Filter-91ad87e7.js"), true ? ["assets/Filter-91ad87e7.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-ec4e4f95.js","assets/fullEditor-178376bb.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Filter-a9d08ba1.css"] : void 0), "../../nodes/Formula.vue": () => __vitePreload(() => import("./Formula-3c395ab1.js"), true ? ["assets/Formula-3c395ab1.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/fullEditor-ec4e4f95.js","assets/fullEditor-178376bb.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Formula-29f19d21.css"] : void 0), "../../nodes/FuzzyMatch.vue": () => __vitePreload(() => import("./FuzzyMatch-2df0d230.js"), true ? ["assets/FuzzyMatch-2df0d230.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/vue-content-loader.es-ba94b82f.js","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/FuzzyMatch-6857de82.css"] : void 0), "../../nodes/GraphSolver.vue": () => __vitePreload(() => import("./GraphSolver-d285877f.js"), true ? ["assets/GraphSolver-d285877f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/GraphSolver-17fd26db.css"] : void 0), "../../nodes/GroupBy.vue": () => __vitePreload(() => import("./GroupBy-0bd1cc6b.js"), true ? ["assets/GroupBy-0bd1cc6b.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/GroupBy-ab1ea74b.css"] : void 0), "../../nodes/Join.vue": () => __vitePreload(() => import("./Join-5a78a203.js"), true ? ["assets/Join-5a78a203.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Join-f45eff22.css"] : void 0), "../../nodes/ManualInput.vue": () => __vitePreload(() => import("./ManualInput-93aef9d6.js"), true ? ["assets/ManualInput-93aef9d6.js","assets/nodeTitle-a16db7c3.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-f4b12bcb.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/ManualInput-a71b52c6.css"] : void 0), "../../nodes/Output.vue": () => __vitePreload(() => import("./Output-411ecaee.js"), true ? ["assets/Output-411ecaee.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Output-48f81019.css"] : void 0), "../../nodes/Pivot.vue": () => __vitePreload(() => import("./Pivot-89db4b04.js"), true ? ["assets/Pivot-89db4b04.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/SettingsSection-695ac487.js","assets/SettingsSection-9c836ecc.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Pivot-f415e85f.css"] : void 0), "../../nodes/PolarsCode.vue": () => __vitePreload(() => import("./PolarsCode-a9f974f8.js"), true ? ["assets/PolarsCode-a9f974f8.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/PolarsCode-650322d1.css"] : void 0), "../../nodes/Read.vue": () => __vitePreload(() => import("./Read-c3b1929c.js"), true ? ["assets/Read-c3b1929c.js","assets/vue-content-loader.es-ba94b82f.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Read-80dc1675.css"] : void 0), "../../nodes/RecordCount.vue": () => __vitePreload(() => import("./RecordCount-4e95f98e.js"), true ? ["assets/RecordCount-4e95f98e.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/RecordId.vue": () => __vitePreload(() => import("./RecordId-55ae7d36.js"), true ? ["assets/RecordId-55ae7d36.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/SettingsSection-695ac487.js","assets/SettingsSection-9c836ecc.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/Sample.vue": () => __vitePreload(() => import("./Sample-b4a18476.js"), true ? ["assets/Sample-b4a18476.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/Select.vue": () => __vitePreload(() => import("./Select-727688dc.js"), true ? ["assets/Select-727688dc.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css"] : void 0), "../../nodes/Sort.vue": () => __vitePreload(() => import("./Sort-be3339a8.js"), true ? ["assets/Sort-be3339a8.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/vue-content-loader.es-ba94b82f.js","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Sort-7ccfa0fe.css"] : void 0), "../../nodes/TextToRows.vue": () => __vitePreload(() => import("./TextToRows-7b8998da.js"), true ? ["assets/TextToRows-7b8998da.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/dropDown-0b46dd77.js","assets/dropDown-35135ba8.css","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/vue-content-loader.es-ba94b82f.js","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/TextToRows-c92d1ec2.css"] : void 0), "../../nodes/Union.vue": () => __vitePreload(() => import("./Union-89fd73dc.js"), true ? ["assets/Union-89fd73dc.js","assets/vue-codemirror.esm-dc5e3348.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Union-8d9ac7f9.css"] : void 0), "../../nodes/Unique.vue": () => __vitePreload(() => import("./Unique-af5a80b4.js"), true ? ["assets/Unique-af5a80b4.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-content-loader.es-ba94b82f.js","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/selectDynamic-de91449a.js","assets/UnavailableFields-8b0cb48e.js","assets/UnavailableFields-5edd5322.css","assets/selectDynamic-b062bc9b.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Unique-b5615727.css"] : void 0), "../../nodes/Unpivot.vue": () => __vitePreload(() => import("./Unpivot-5195d411.js"), true ? ["assets/Unpivot-5195d411.js","assets/index-683fc198.js","assets/index-681a3ed0.css","assets/vue-codemirror.esm-dc5e3348.js","assets/vue-codemirror-bccfde04.css","assets/genericNodeSettings-def5879b.js","assets/genericNodeSettings-924759c7.css","assets/nodeTitle-a16db7c3.js","assets/nodeTitle-f4b12bcb.css","assets/Unpivot-246e9bbd.css"] : void 0) }), `../../nodes/${name}.vue`).then((module) => {
14824
- const component = markRaw$1(module.default);
14825
- return component;
14826
- });
15773
+ return getComponent();
15774
+ }
15775
+ let nodeTemplatesCache = null;
15776
+ let cachePromise = null;
15777
+ async function fetchNodeTemplates() {
15778
+ if (nodeTemplatesCache !== null) {
15779
+ return nodeTemplatesCache;
15780
+ }
15781
+ if (cachePromise !== null) {
15782
+ return cachePromise;
15783
+ }
15784
+ cachePromise = axios.get("/node_list").then((response) => {
15785
+ const allNodes = response.data;
15786
+ nodeTemplatesCache = allNodes.filter((node) => node.prod_ready);
15787
+ return nodeTemplatesCache;
15788
+ }).catch((error) => {
15789
+ console.error("Failed to fetch node templates:", error);
15790
+ cachePromise = null;
15791
+ throw error;
15792
+ });
15793
+ return cachePromise;
15794
+ }
15795
+ function clearNodeTemplatesCache() {
15796
+ nodeTemplatesCache = null;
15797
+ cachePromise = null;
15798
+ }
15799
+ async function getNodeTemplateByItem(item) {
15800
+ try {
15801
+ const allNodes = await fetchNodeTemplates();
15802
+ return allNodes.find((node) => node.item === item);
15803
+ } catch (error) {
15804
+ console.error(`Failed to get node template for item ${item}:`, error);
15805
+ return void 0;
14827
15806
  }
14828
- return componentCache[name];
14829
15807
  }
15808
+ const useNodes = () => {
15809
+ const nodes = ref([]);
15810
+ const loading = ref(false);
15811
+ const error = ref(null);
15812
+ const fetchNodes2 = async () => {
15813
+ loading.value = true;
15814
+ error.value = null;
15815
+ try {
15816
+ nodes.value = await fetchNodeTemplates();
15817
+ } catch (err) {
15818
+ error.value = err;
15819
+ nodes.value = [];
15820
+ } finally {
15821
+ loading.value = false;
15822
+ }
15823
+ };
15824
+ onMounted(fetchNodes2);
15825
+ return {
15826
+ nodes,
15827
+ loading,
15828
+ error,
15829
+ refetch: fetchNodes2,
15830
+ clearCache: () => {
15831
+ clearNodeTemplatesCache();
15832
+ return fetchNodes2();
15833
+ }
15834
+ };
15835
+ };
14830
15836
  const connectNode = async (flowId, nodeConnection) => {
14831
15837
  console.log("Connecting node where it should happen", nodeConnection);
14832
15838
  try {
@@ -15035,7 +16041,9 @@ function useDragAndDrop() {
15035
16041
  outputs: Array.from({ length: node.numberOfOutputs }, (_2, i2) => ({
15036
16042
  id: `output-${i2}`,
15037
16043
  position: Position.Right
15038
- }))
16044
+ })),
16045
+ // Include nodeTemplate if available
16046
+ nodeTemplate: node.nodeTemplate
15039
16047
  }
15040
16048
  };
15041
16049
  const nodePromise = {
@@ -15057,7 +16065,8 @@ function useDragAndDrop() {
15057
16065
  };
15058
16066
  async function getNodeToAdd(node) {
15059
16067
  const numberOfInputs = node.multi ? 1 : node.input;
15060
- const component = await getComponent(node.item);
16068
+ const nodeTemplate = await getNodeTemplateByItem(node.item);
16069
+ const component = await getComponent(nodeTemplate || node.item);
15061
16070
  const newNode = {
15062
16071
  id: String(node.id),
15063
16072
  type: "custom-node",
@@ -15076,7 +16085,9 @@ function useDragAndDrop() {
15076
16085
  outputs: Array.from({ length: node.output }, (_2, i2) => ({
15077
16086
  id: `output-${i2}`,
15078
16087
  position: Position.Right
15079
- }))
16088
+ })),
16089
+ // IMPORTANT: Include the complete NodeTemplate
16090
+ nodeTemplate
15080
16091
  }
15081
16092
  };
15082
16093
  return newNode;
@@ -15107,21 +16118,17 @@ function useDragAndDrop() {
15107
16118
  if (!event.dataTransfer)
15108
16119
  return;
15109
16120
  const nodeData = JSON.parse(event.dataTransfer.getData("application/vueflow"));
15110
- console.log("nodeData:", nodeData);
15111
16121
  const nodeId = getId();
15112
- getComponent(nodeData.item).then((component) => {
16122
+ getComponent().then((component) => {
15113
16123
  const numberOfInputs = nodeData.multi ? 1 : nodeData.input;
15114
- console.log("logging", numberOfInputs);
15115
16124
  const newNode = {
15116
16125
  id: String(nodeId),
15117
16126
  type: "custom-node",
15118
16127
  position,
15119
16128
  data: {
15120
16129
  id: nodeId,
15121
- // Pass nodeId here
15122
16130
  label: nodeData.name,
15123
16131
  component: markRaw$1(component),
15124
- // Pass component directly
15125
16132
  inputs: Array.from({ length: numberOfInputs }, (_2, i2) => ({
15126
16133
  id: `input-${i2}`,
15127
16134
  position: Position.Left
@@ -15130,7 +16137,8 @@ function useDragAndDrop() {
15130
16137
  id: `output-${i2}`,
15131
16138
  position: Position.Right
15132
16139
  })),
15133
- nodeItem: nodeData.item
16140
+ // IMPORTANT: Pass the complete NodeTemplate data
16141
+ nodeTemplate: nodeData
15134
16142
  }
15135
16143
  };
15136
16144
  const { off } = onNodesInitialized(() => {
@@ -15145,9 +16153,7 @@ function useDragAndDrop() {
15145
16153
  });
15146
16154
  off();
15147
16155
  });
15148
- console.log("nodeData", nodeData);
15149
16156
  insertNode(flowId, nodeId, nodeData.item);
15150
- console.log(newNode);
15151
16157
  addNodes(newNode);
15152
16158
  }).catch((error) => {
15153
16159
  console.error(`Error importing component for ${nodeData.item}`, error);
@@ -17723,11 +18729,11 @@ const oneDarkHighlightStyle = /* @__PURE__ */ HighlightStyle.define([
17723
18729
  }
17724
18730
  ]);
17725
18731
  const oneDark = [oneDarkTheme, /* @__PURE__ */ syntaxHighlighting(oneDarkHighlightStyle)];
17726
- const _hoisted_1$a = { class: "code-container" };
17727
- const _hoisted_2$7 = { class: "code-header" };
17728
- const _hoisted_3$6 = { class: "header-actions" };
17729
- const _hoisted_4$6 = ["disabled"];
17730
- const _hoisted_5$5 = {
18732
+ const _hoisted_1$c = { class: "code-container" };
18733
+ const _hoisted_2$a = { class: "code-header" };
18734
+ const _hoisted_3$9 = { class: "header-actions" };
18735
+ const _hoisted_4$8 = ["disabled"];
18736
+ const _hoisted_5$6 = {
17731
18737
  key: 0,
17732
18738
  width: "16",
17733
18739
  height: "16",
@@ -17736,11 +18742,11 @@ const _hoisted_5$5 = {
17736
18742
  stroke: "currentColor",
17737
18743
  "stroke-width": "2"
17738
18744
  };
17739
- const _hoisted_6$4 = {
18745
+ const _hoisted_6$5 = {
17740
18746
  key: 1,
17741
18747
  class: "spinner"
17742
18748
  };
17743
- const _sfc_main$b = /* @__PURE__ */ defineComponent({
18749
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
17744
18750
  __name: "CodeGenerator",
17745
18751
  setup(__props) {
17746
18752
  const code = ref("");
@@ -17807,23 +18813,23 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
17807
18813
  URL.revokeObjectURL(url);
17808
18814
  };
17809
18815
  return (_ctx, _cache) => {
17810
- return openBlock(), createElementBlock("div", _hoisted_1$a, [
17811
- createBaseVNode("div", _hoisted_2$7, [
18816
+ return openBlock(), createElementBlock("div", _hoisted_1$c, [
18817
+ createBaseVNode("div", _hoisted_2$a, [
17812
18818
  _cache[3] || (_cache[3] = createBaseVNode("h4", null, "Generated code", -1)),
17813
- createBaseVNode("div", _hoisted_3$6, [
18819
+ createBaseVNode("div", _hoisted_3$9, [
17814
18820
  createBaseVNode("button", {
17815
18821
  class: "refresh-button",
17816
18822
  disabled: loading.value,
17817
18823
  onClick: refreshCode
17818
18824
  }, [
17819
- !loading.value ? (openBlock(), createElementBlock("svg", _hoisted_5$5, _cache[1] || (_cache[1] = [
18825
+ !loading.value ? (openBlock(), createElementBlock("svg", _hoisted_5$6, _cache[1] || (_cache[1] = [
17820
18826
  createBaseVNode("path", { d: "M23 4v6h-6" }, null, -1),
17821
18827
  createBaseVNode("path", { d: "M1 20v-6h6" }, null, -1),
17822
18828
  createBaseVNode("path", { d: "M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15" }, null, -1)
17823
18829
  ]))) : createCommentVNode("", true),
17824
- loading.value ? (openBlock(), createElementBlock("span", _hoisted_6$4)) : createCommentVNode("", true),
18830
+ loading.value ? (openBlock(), createElementBlock("span", _hoisted_6$5)) : createCommentVNode("", true),
17825
18831
  createTextVNode(" " + toDisplayString(loading.value ? "Loading..." : "Refresh"), 1)
17826
- ], 8, _hoisted_4$6),
18832
+ ], 8, _hoisted_4$8),
17827
18833
  createBaseVNode("button", {
17828
18834
  class: "export-button",
17829
18835
  onClick: exportCode
@@ -17860,69 +18866,18 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
17860
18866
  }
17861
18867
  });
17862
18868
  const CodeGenerator_vue_vue_type_style_index_0_scoped_8bafe064_lang = "";
17863
- const CodeGenerator = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__scopeId", "data-v-8bafe064"]]);
17864
- const __vite_glob_0_0 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAACO0lEQVR4nN2Yz0vbYBjHv29NbZUy0B43QUG9zNPEHUT05NCTiu6o0NbDLk5a/RMERaonkSrO8zw4alFQtBsMBG96kJ5EUTcRh78QRGvsu4O8MSk1fdMmaeLnlL7p++ST53kfkjeADSCKX5GI4Ci+XQCl3uwzKXUkyYD4ZWjXKDnpUuxA+BbeBEij9hD0SgwMl+kplY5McoLmHEVMNYi06E/eNs4iEQf/zjEyonDRR9IAxMCQ5OYopIgawlz4gR1bVhKECJgPvwOsLAlAoIgAFpdMgXgAQFD704M/ZI4NAOf85IvnLJ1Jhi0kVcvNUCtFvvAsKVtk0haSXOU2s8sz8XoyqWfjsKpMJ3bQUVmNt6WerHNMzSQT/ByPYXDrJyq/z+Li/i7rPK5M6gET7NqIYvloXxovd7mzzjW1cdrXFrHx91BzXNPKnS6Y1HDjhjYOy1TnelQp6Aum7QDVMSyTTLAnHsPK8fMaTPqCIESLokGScsGlwz1pPBdBgLPciR4fd8CaN0+72871qDKD/pCmEsvhkmQX5qVtdRHxE2WT5CoI6Ng4/to6zDR9wlRiWymosUkyoduaHG1oBgAEt35JY7muwXR0eeJ4BCfKXW78Pn36iDH+sQXBuno9QgPglIy1dqme97pLAAA752eGvNZxSbZXVHEF+/r+Q14yL2GL90lbSKqW28hdohYsnUkCeglYXPKx2NkHyCQpJT8Kp5MJmkTv4A0gk3zsD3WnQMYKJyWHXouBYVehLV4f/wHit6c8llKODwAAAABJRU5ErkJggg==";
17865
- const __vite_glob_0_1 = "/assets/airbyte-292aa232.png";
17866
- const __vite_glob_0_2 = "/assets/cloud_storage_reader-aa1415d6.png";
17867
- const __vite_glob_0_3 = "data:image/png;base64,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";
17868
- const __vite_glob_0_4 = "/assets/cross_join-d30c0290.png";
17869
- const __vite_glob_0_5 = "/assets/database_reader-ce1e55f3.svg";
17870
- const __vite_glob_0_6 = "/assets/database_writer-b4ad0753.svg";
17871
- const __vite_glob_0_7 = "/assets/explore_data-8a0a2861.png";
17872
- const __vite_glob_0_8 = "data:image/png;base64,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";
17873
- const __vite_glob_0_9 = "/assets/filter-d7708bda.png";
17874
- const __vite_glob_0_10 = "/assets/formula-eeeb1611.png";
17875
- const __vite_glob_0_11 = "/assets/fuzzy_match-40c161b2.png";
17876
- const __vite_glob_0_12 = "data:image/png;base64,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";
17877
- const __vite_glob_0_13 = "/assets/graph_solver-8b7888b8.png";
17878
- const __vite_glob_0_14 = "/assets/group_by-80561fc3.png";
17879
- const __vite_glob_0_15 = "/assets/input_data-ab2eb678.png";
17880
- const __vite_glob_0_16 = "/assets/join-349043ae.png";
17881
- const __vite_glob_0_17 = "/assets/manual_input-ae98f31d.png";
17882
- const __vite_glob_0_18 = "/assets/old_join-5d0eb604.png";
17883
- const __vite_glob_0_19 = "/assets/output-06ec0371.png";
17884
- const __vite_glob_0_20 = "/assets/pivot-9660df51.png";
17885
- const __vite_glob_0_21 = "/assets/polars_code-05ce5dc6.png";
17886
- const __vite_glob_0_22 = "/assets/record_count-dab44eb5.png";
17887
- const __vite_glob_0_23 = "/assets/record_id-0b15856b.png";
17888
- const __vite_glob_0_24 = "/assets/sample-693a88b5.png";
17889
- const __vite_glob_0_25 = "/assets/select-b0d0437a.png";
17890
- const __vite_glob_0_26 = "/assets/sort-2aa579f0.png";
17891
- const __vite_glob_0_27 = "/assets/summarize-2a099231.png";
17892
- const __vite_glob_0_28 = "/assets/text_to_rows-859b29ea.png";
17893
- const __vite_glob_0_29 = "/assets/union-2d8609f4.png";
17894
- const __vite_glob_0_30 = "/assets/unique-1958b98a.png";
17895
- const __vite_glob_0_31 = "/assets/unpivot-d3cb4b5b.png";
17896
- const __vite_glob_0_32 = "/assets/view-7a0f0be1.png";
17897
- const getImageUrl = (name) => {
17898
- return new URL((/* @__PURE__ */ Object.assign({ "./assets/icons/Output2.png": __vite_glob_0_0, "./assets/icons/airbyte.png": __vite_glob_0_1, "./assets/icons/cloud_storage_reader.png": __vite_glob_0_2, "./assets/icons/cloud_storage_writer.png": __vite_glob_0_3, "./assets/icons/cross_join.png": __vite_glob_0_4, "./assets/icons/database_reader.svg": __vite_glob_0_5, "./assets/icons/database_writer.svg": __vite_glob_0_6, "./assets/icons/explore_data.png": __vite_glob_0_7, "./assets/icons/external_source.png": __vite_glob_0_8, "./assets/icons/filter.png": __vite_glob_0_9, "./assets/icons/formula.png": __vite_glob_0_10, "./assets/icons/fuzzy_match.png": __vite_glob_0_11, "./assets/icons/google_sheet.png": __vite_glob_0_12, "./assets/icons/graph_solver.png": __vite_glob_0_13, "./assets/icons/group_by.png": __vite_glob_0_14, "./assets/icons/input_data.png": __vite_glob_0_15, "./assets/icons/join.png": __vite_glob_0_16, "./assets/icons/manual_input.png": __vite_glob_0_17, "./assets/icons/old_join.png": __vite_glob_0_18, "./assets/icons/output.png": __vite_glob_0_19, "./assets/icons/pivot.png": __vite_glob_0_20, "./assets/icons/polars_code.png": __vite_glob_0_21, "./assets/icons/record_count.png": __vite_glob_0_22, "./assets/icons/record_id.png": __vite_glob_0_23, "./assets/icons/sample.png": __vite_glob_0_24, "./assets/icons/select.png": __vite_glob_0_25, "./assets/icons/sort.png": __vite_glob_0_26, "./assets/icons/summarize.png": __vite_glob_0_27, "./assets/icons/text_to_rows.png": __vite_glob_0_28, "./assets/icons/union.png": __vite_glob_0_29, "./assets/icons/unique.png": __vite_glob_0_30, "./assets/icons/unpivot.png": __vite_glob_0_31, "./assets/icons/view.png": __vite_glob_0_32 }))[`./assets/icons/${name}`], self.location).href;
17899
- };
17900
- const fetchNodes = async () => {
17901
- const response = await axios.get("/node_list");
17902
- const listNodes = response.data;
17903
- return listNodes;
17904
- };
17905
- const useNodes = () => {
17906
- const nodes = ref([]);
17907
- const fetchNodes2 = async () => {
17908
- const response = await axios.get("/node_list");
17909
- const allNodes = response.data;
17910
- nodes.value = allNodes.filter((node) => node.prod_ready);
17911
- };
17912
- onMounted(fetchNodes2);
17913
- return { nodes };
17914
- };
17915
- const _hoisted_1$9 = { class: "nodes-wrapper" };
17916
- const _hoisted_2$6 = ["onClick"];
17917
- const _hoisted_3$5 = { class: "category-title" };
17918
- const _hoisted_4$5 = {
18869
+ const CodeGenerator = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-8bafe064"]]);
18870
+ const _hoisted_1$b = { class: "nodes-wrapper" };
18871
+ const _hoisted_2$9 = ["onClick"];
18872
+ const _hoisted_3$8 = { class: "category-title" };
18873
+ const _hoisted_4$7 = {
17919
18874
  key: 0,
17920
18875
  class: "category-content"
17921
18876
  };
17922
- const _hoisted_5$4 = ["onDragstart"];
17923
- const _hoisted_6$3 = ["src", "alt"];
17924
- const _hoisted_7$2 = { class: "node-name" };
17925
- const _sfc_main$a = /* @__PURE__ */ defineComponent({
18877
+ const _hoisted_5$5 = ["onDragstart"];
18878
+ const _hoisted_6$4 = ["src", "alt"];
18879
+ const _hoisted_7$3 = { class: "node-name" };
18880
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
17926
18881
  __name: "NodeList",
17927
18882
  emits: ["dragstart"],
17928
18883
  setup(__props) {
@@ -17932,7 +18887,8 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
17932
18887
  transform: { name: "Transformations", isOpen: true },
17933
18888
  combine: { name: "Combine Operations", isOpen: true },
17934
18889
  aggregate: { name: "Aggregations", isOpen: true },
17935
- output: { name: "Output Operations", isOpen: true }
18890
+ output: { name: "Output Operations", isOpen: true },
18891
+ custom: { name: "User Defined Operations", isOpen: true }
17936
18892
  };
17937
18893
  const openCategories = ref(
17938
18894
  Object.fromEntries(
@@ -17972,7 +18928,7 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
17972
18928
  };
17973
18929
  return (_ctx, _cache) => {
17974
18930
  const _component_el_icon = resolveComponent("el-icon");
17975
- return openBlock(), createElementBlock("div", _hoisted_1$9, [
18931
+ return openBlock(), createElementBlock("div", _hoisted_1$b, [
17976
18932
  withDirectives(createBaseVNode("input", {
17977
18933
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
17978
18934
  type: "text",
@@ -17990,15 +18946,15 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
17990
18946
  class: "category-header",
17991
18947
  onClick: ($event) => toggleCategory(category)
17992
18948
  }, [
17993
- createBaseVNode("span", _hoisted_3$5, toDisplayString(categoryInfo.name), 1),
18949
+ createBaseVNode("span", _hoisted_3$8, toDisplayString(categoryInfo.name), 1),
17994
18950
  createVNode(_component_el_icon, { class: "category-icon" }, {
17995
18951
  default: withCtx(() => [
17996
18952
  openCategories.value[category] ? (openBlock(), createBlock(unref(arrow_down_default), { key: 0 })) : (openBlock(), createBlock(unref(arrow_right_default), { key: 1 }))
17997
18953
  ]),
17998
18954
  _: 2
17999
18955
  }, 1024)
18000
- ], 8, _hoisted_2$6),
18001
- openCategories.value[category] && filteredNodes.value[category] ? (openBlock(), createElementBlock("div", _hoisted_4$5, [
18956
+ ], 8, _hoisted_2$9),
18957
+ openCategories.value[category] && filteredNodes.value[category] ? (openBlock(), createElementBlock("div", _hoisted_4$7, [
18002
18958
  (openBlock(true), createElementBlock(Fragment, null, renderList(filteredNodes.value[category], (node) => {
18003
18959
  return openBlock(), createElementBlock("div", {
18004
18960
  key: node.item,
@@ -18010,9 +18966,9 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
18010
18966
  src: unref(getImageUrl)(node.image),
18011
18967
  alt: node.name,
18012
18968
  class: "node-image"
18013
- }, null, 8, _hoisted_6$3),
18014
- createBaseVNode("span", _hoisted_7$2, toDisplayString(node.name), 1)
18015
- ], 40, _hoisted_5$4);
18969
+ }, null, 8, _hoisted_6$4),
18970
+ createBaseVNode("span", _hoisted_7$3, toDisplayString(node.name), 1)
18971
+ ], 40, _hoisted_5$5);
18016
18972
  }), 128))
18017
18973
  ])) : createCommentVNode("", true)
18018
18974
  ]);
@@ -18021,129 +18977,126 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
18021
18977
  };
18022
18978
  }
18023
18979
  });
18024
- const NodeList_vue_vue_type_style_index_0_scoped_a8d4b46b_lang = "";
18025
- const NodeList = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-a8d4b46b"]]);
18026
- const useItemStore = defineStore("itemStore", () => {
18027
- const items = ref({});
18028
- const setItemState = (id2, state2) => {
18029
- if (!items.value[id2]) {
18030
- items.value[id2] = {
18031
- width: 400,
18032
- height: 300,
18033
- left: 100,
18034
- top: 100,
18035
- stickynessPosition: "free",
18036
- fullWidth: false,
18037
- fullHeight: false,
18038
- zIndex: 100,
18039
- fullScreen: false,
18040
- clicked: false
18041
- };
18042
- }
18043
- Object.assign(items.value[id2], state2);
18044
- };
18045
- const saveItemState = (id2) => {
18046
- const itemState = items.value[id2];
18047
- localStorage.setItem(`overlayPositionAndSize_${id2}`, JSON.stringify(itemState));
18048
- };
18049
- const loadItemState = (id2) => {
18050
- const savedState = localStorage.getItem(`overlayPositionAndSize_${id2}`);
18051
- if (savedState) {
18052
- items.value[id2] = JSON.parse(savedState);
18980
+ const NodeList_vue_vue_type_style_index_0_scoped_63142f09_lang = "";
18981
+ const NodeList = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["__scopeId", "data-v-63142f09"]]);
18982
+ const _hoisted_1$a = { class: "listbox-wrapper" };
18983
+ const _hoisted_2$8 = { class: "listbox-title" };
18984
+ const _hoisted_3$7 = { class: "intro-content" };
18985
+ const _hoisted_4$6 = {
18986
+ key: 1,
18987
+ class: "title"
18988
+ };
18989
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
18990
+ __name: "nodeTitle",
18991
+ props: {
18992
+ title: {
18993
+ type: String,
18994
+ required: true
18995
+ },
18996
+ intro: {
18997
+ type: String,
18998
+ required: false,
18999
+ default: ""
19000
+ // Add default value to resolve warning
18053
19001
  }
18054
- };
18055
- const toggleFullScreen = (id2) => {
18056
- if (!items.value[id2])
18057
- return;
18058
- setFullScreen(id2, !items.value[id2].fullScreen);
18059
- };
18060
- const setFullScreen = (id2, fullScreen) => {
18061
- if (!items.value[id2])
18062
- return;
18063
- if (items.value[id2].fullScreen !== fullScreen) {
18064
- if (fullScreen) {
18065
- items.value[id2].fullScreen = true;
18066
- items.value[id2].prevWidth = items.value[id2].width;
18067
- items.value[id2].prevHeight = items.value[id2].height;
18068
- items.value[id2].prevLeft = items.value[id2].left;
18069
- items.value[id2].prevTop = items.value[id2].top;
18070
- items.value[id2].width = window.innerWidth;
18071
- items.value[id2].height = window.innerHeight;
18072
- items.value[id2].left = 0;
18073
- items.value[id2].top = 0;
18074
- } else {
18075
- items.value[id2].fullScreen = false;
18076
- items.value[id2].width = items.value[id2].prevWidth || 400;
18077
- items.value[id2].height = items.value[id2].prevHeight || 300;
18078
- items.value[id2].left = items.value[id2].prevLeft || 100;
18079
- items.value[id2].top = items.value[id2].prevTop || 100;
19002
+ },
19003
+ setup(__props) {
19004
+ const props2 = __props;
19005
+ return (_ctx, _cache) => {
19006
+ const _component_el_collapse_item = resolveComponent("el-collapse-item");
19007
+ const _component_el_collapse = resolveComponent("el-collapse");
19008
+ return openBlock(), createElementBlock("div", _hoisted_1$a, [
19009
+ props2.intro ? (openBlock(), createBlock(_component_el_collapse, {
19010
+ key: 0,
19011
+ class: "listbox-expandable"
19012
+ }, {
19013
+ default: withCtx(() => [
19014
+ createVNode(_component_el_collapse_item, null, {
19015
+ title: withCtx(() => [
19016
+ createBaseVNode("div", _hoisted_2$8, toDisplayString(props2.title), 1)
19017
+ ]),
19018
+ default: withCtx(() => [
19019
+ createBaseVNode("div", _hoisted_3$7, toDisplayString(props2.intro), 1)
19020
+ ]),
19021
+ _: 1
19022
+ })
19023
+ ]),
19024
+ _: 1
19025
+ })) : (openBlock(), createElementBlock("div", _hoisted_4$6, toDisplayString(props2.title), 1))
19026
+ ]);
19027
+ };
19028
+ }
19029
+ });
19030
+ const nodeTitle_vue_vue_type_style_index_0_scoped_0db5c358_lang = "";
19031
+ const NodeTitle = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__scopeId", "data-v-0db5c358"]]);
19032
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
19033
+ __name: "NodeSettingsDrawer",
19034
+ setup(__props) {
19035
+ const nodeStore = useNodeStore();
19036
+ const drawerComponentInstance = ref(null);
19037
+ ref("");
19038
+ ref("");
19039
+ const lastExecutedState = ref({
19040
+ nodeId: -1,
19041
+ componentInstance: null
19042
+ });
19043
+ const executeCleanup = async () => {
19044
+ if (lastExecutedState.value.componentInstance) {
19045
+ console.log(`executing cleanup for node ${lastExecutedState.value.nodeId}`);
19046
+ await nodeStore.executeDrawCloseFunction();
18080
19047
  }
18081
- saveItemState(id2);
18082
- clickOnItem(id2);
18083
- }
18084
- };
18085
- const inResizing = ref(false);
18086
- const idItemClicked = ref(null);
18087
- const idItemVisible = ref(null);
18088
- const clickOnItem = (id2) => {
18089
- if (idItemClicked.value === id2)
18090
- return;
18091
- if (idItemClicked.value) {
18092
- items.value[idItemClicked.value].zIndex = 100;
18093
- }
18094
- items.value[id2].zIndex = 1e3;
18095
- idItemClicked.value = id2;
18096
- };
18097
- const setResizing = (resizing) => {
18098
- inResizing.value = resizing;
18099
- };
18100
- const getResizing = () => {
18101
- return inResizing.value;
18102
- };
18103
- const scrollOnItem = (id2) => {
18104
- const itemElement = document.getElementById(id2);
18105
- if (!itemElement)
18106
- return;
18107
- const observer = new IntersectionObserver(
18108
- (entries) => {
18109
- entries.forEach((entry) => {
18110
- if (entry.isIntersecting) {
18111
- idItemVisible.value = id2;
18112
- items.value[id2].zIndex = 1e3;
18113
- } else if (idItemVisible.value === id2) {
18114
- items.value[id2].zIndex = 100;
18115
- idItemVisible.value = null;
18116
- }
18117
- });
18118
- },
18119
- {
18120
- threshold: 0.5
18121
- // Trigger when 50% of the item is visible
19048
+ };
19049
+ const setupNewNode = () => {
19050
+ var _a;
19051
+ if (((_a = drawerComponentInstance.value) == null ? void 0 : _a.loadNodeData) && nodeStore.node_id !== -1) {
19052
+ drawerComponentInstance.value.loadNodeData(nodeStore.node_id);
19053
+ nodeStore.setCloseFunction(drawerComponentInstance.value.pushNodeData);
19054
+ lastExecutedState.value = {
19055
+ nodeId: nodeStore.node_id,
19056
+ componentInstance: drawerComponentInstance.value
19057
+ };
18122
19058
  }
19059
+ };
19060
+ watch$1(
19061
+ [() => drawerComponentInstance.value, () => nodeStore.node_id],
19062
+ async ([newInstance, newNodeId], [oldInstance, oldNodeId]) => {
19063
+ const nodeIdChanged = newNodeId !== oldNodeId;
19064
+ if (nodeIdChanged && oldNodeId !== -1 && lastExecutedState.value.componentInstance) {
19065
+ await executeCleanup();
19066
+ lastExecutedState.value = {
19067
+ nodeId: -1,
19068
+ componentInstance: null
19069
+ };
19070
+ }
19071
+ if (newNodeId === -1) {
19072
+ nodeStore.isDrawerOpen = false;
19073
+ return;
19074
+ }
19075
+ if (newInstance) {
19076
+ await nextTick();
19077
+ setupNewNode();
19078
+ }
19079
+ },
19080
+ { immediate: true }
18123
19081
  );
18124
- observer.observe(itemElement);
18125
- };
18126
- return {
18127
- inResizing,
18128
- items,
18129
- setItemState,
18130
- saveItemState,
18131
- loadItemState,
18132
- setResizing,
18133
- getResizing,
18134
- clickOnItem,
18135
- scrollOnItem,
18136
- idItemVisible,
18137
- // Exposing the visible item
18138
- toggleFullScreen,
18139
- // Toggle fullscreen state
18140
- setFullScreen
18141
- // Set fullscreen state with boolean parameter
18142
- };
19082
+ return (_ctx, _cache) => {
19083
+ return openBlock(), createElementBlock(Fragment, null, [
19084
+ createVNode(NodeTitle, {
19085
+ title: unref(nodeStore).drawerProps.title,
19086
+ intro: unref(nodeStore).drawerProps.intro
19087
+ }, null, 8, ["title", "intro"]),
19088
+ (openBlock(), createBlock(resolveDynamicComponent(unref(nodeStore).activeDrawerComponent), mergeProps(unref(nodeStore).drawerProps, {
19089
+ ref_key: "drawerComponentInstance",
19090
+ ref: drawerComponentInstance
19091
+ }), null, 16))
19092
+ ], 64);
19093
+ };
19094
+ }
18143
19095
  });
18144
- const _hoisted_1$8 = ["title"];
18145
- const _hoisted_2$5 = { class: "icon" };
18146
- const _sfc_main$9 = /* @__PURE__ */ defineComponent({
19096
+ const _hoisted_1$9 = ["id"];
19097
+ const _hoisted_2$7 = ["title"];
19098
+ const _hoisted_3$6 = { class: "icon" };
19099
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
18147
19100
  __name: "DraggableItem",
18148
19101
  props: {
18149
19102
  id: {
@@ -18166,6 +19119,10 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18166
19119
  type: Boolean,
18167
19120
  default: false
18168
19121
  },
19122
+ showPresets: {
19123
+ type: Boolean,
19124
+ default: false
19125
+ },
18169
19126
  initialPosition: {
18170
19127
  type: String,
18171
19128
  default: "free"
@@ -18178,7 +19135,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18178
19135
  type: Number,
18179
19136
  default: null
18180
19137
  },
18181
- initalLeft: {
19138
+ initialLeft: {
18182
19139
  type: Number,
18183
19140
  default: null
18184
19141
  },
@@ -18205,9 +19162,49 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18205
19162
  allowFullScreen: {
18206
19163
  type: Boolean,
18207
19164
  default: false
19165
+ },
19166
+ group: {
19167
+ type: String,
19168
+ default: null
19169
+ },
19170
+ syncDimensions: {
19171
+ type: Boolean,
19172
+ default: false
19173
+ },
19174
+ preventOverlap: {
19175
+ type: Boolean,
19176
+ default: false
18208
19177
  }
18209
19178
  },
18210
19179
  setup(__props, { expose: __expose }) {
19180
+ const props2 = __props;
19181
+ const itemStore = useItemStore();
19182
+ const itemState = ref(
19183
+ itemStore.items[props2.id] || {
19184
+ width: props2.initialWidth || 400,
19185
+ height: props2.initialHeight || 300,
19186
+ left: props2.initialLeft || 100,
19187
+ // Used corrected prop
19188
+ top: props2.initialTop || 100,
19189
+ group: props2.group,
19190
+ syncDimensions: props2.syncDimensions,
19191
+ zIndex: 100
19192
+ }
19193
+ );
19194
+ const isDragging = ref(false);
19195
+ const isResizing = ref(false);
19196
+ const startX = ref(0);
19197
+ const startY = ref(0);
19198
+ const startWidth = ref(0);
19199
+ const startHeight = ref(0);
19200
+ const startLeft = ref(0);
19201
+ const startTop = ref(0);
19202
+ const isMinimized = ref(false);
19203
+ const instance = getCurrentInstance();
19204
+ const activeLine = ref(null);
19205
+ let resizeTimeout;
19206
+ const resizeDirection = ref(null);
19207
+ const initialGroupStates = ref({});
18211
19208
  const resizeDelay = ref(null);
18212
19209
  const resizeOnEnter = (e2, position) => {
18213
19210
  if (resizeDelay.value)
@@ -18231,31 +19228,51 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18231
19228
  }
18232
19229
  }, 200);
18233
19230
  };
18234
- const props2 = __props;
18235
- const itemStore = useItemStore();
18236
- const itemState = ref(
18237
- itemStore.items[props2.id] || {
18238
- width: props2.initialWidth,
18239
- height: props2.initialHeight,
18240
- left: 100,
18241
- top: 100
18242
- }
18243
- );
18244
- const isDragging = ref(false);
18245
- const isResizing = ref(false);
18246
- const startX = ref(0);
18247
- const startY = ref(0);
18248
- const startWidth = ref(0);
18249
- const startHeight = ref(0);
18250
- const startLeft = ref(0);
18251
- const startTop = ref(0);
18252
- const isMinimized = ref(false);
18253
- const instance = getCurrentInstance();
18254
- const activeLine = ref(null);
18255
- let resizeTimeout;
18256
19231
  const savePositionAndSize = () => {
18257
- itemStore.setItemState(props2.id, itemState.value);
19232
+ itemStore.setItemState(props2.id, {
19233
+ width: itemState.value.width,
19234
+ height: itemState.value.height,
19235
+ left: itemState.value.left,
19236
+ top: itemState.value.top,
19237
+ stickynessPosition: itemState.value.stickynessPosition,
19238
+ fullWidth: itemState.value.fullWidth,
19239
+ fullHeight: itemState.value.fullHeight,
19240
+ zIndex: itemState.value.zIndex,
19241
+ fullScreen: itemState.value.fullScreen,
19242
+ group: itemState.value.group,
19243
+ syncDimensions: itemState.value.syncDimensions
19244
+ });
18258
19245
  itemStore.saveItemState(props2.id);
19246
+ if (itemState.value.group && itemState.value.syncDimensions && isResizing.value) {
19247
+ const groupItems = itemStore.groups[itemState.value.group];
19248
+ if (groupItems) {
19249
+ const initialActiveState = initialGroupStates.value[props2.id];
19250
+ if (!initialActiveState)
19251
+ return;
19252
+ const deltaX = itemState.value.left - initialActiveState.left;
19253
+ const deltaY = itemState.value.top - initialActiveState.top;
19254
+ groupItems.forEach((itemId) => {
19255
+ var _a;
19256
+ if (itemId === props2.id)
19257
+ return;
19258
+ const initialItemState = initialGroupStates.value[itemId];
19259
+ if (((_a = itemStore.items[itemId]) == null ? void 0 : _a.syncDimensions) && initialItemState) {
19260
+ const updates = {
19261
+ width: itemState.value.width,
19262
+ height: itemState.value.height
19263
+ };
19264
+ if (resizeDirection.value === "top") {
19265
+ updates.top = initialItemState.top + deltaY;
19266
+ }
19267
+ if (resizeDirection.value === "left") {
19268
+ updates.left = initialItemState.left + deltaX;
19269
+ }
19270
+ itemStore.setItemState(itemId, updates);
19271
+ itemStore.saveItemState(itemId);
19272
+ }
19273
+ });
19274
+ }
19275
+ }
18259
19276
  };
18260
19277
  const loadPositionAndSize = () => {
18261
19278
  itemStore.loadItemState(props2.id);
@@ -18276,28 +19293,33 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18276
19293
  itemStore.inResizing = true;
18277
19294
  };
18278
19295
  const toggleFullScreen = () => {
18279
- if (itemState.value.fullScreen) {
18280
- itemState.value.fullScreen = false;
18281
- itemState.value.width = itemState.value.prevWidth || 300;
18282
- itemState.value.height = itemState.value.prevHeight || 300;
18283
- itemState.value.left = itemState.value.prevLeft || 100;
18284
- itemState.value.top = itemState.value.prevTop || 100;
18285
- } else {
18286
- itemState.value.fullScreen = true;
18287
- itemState.value.prevWidth = itemState.value.width;
18288
- itemState.value.prevHeight = itemState.value.height;
18289
- itemState.value.prevLeft = itemState.value.left;
18290
- itemState.value.prevTop = itemState.value.top;
18291
- itemState.value.width = window.innerWidth;
18292
- itemState.value.height = window.innerHeight;
18293
- itemState.value.left = 0;
18294
- itemState.value.top = 0;
19296
+ itemStore.toggleFullScreen(props2.id);
19297
+ loadPositionAndSize();
19298
+ };
19299
+ const captureGroupInitialStates = () => {
19300
+ if (itemState.value.group && itemState.value.syncDimensions) {
19301
+ initialGroupStates.value = {};
19302
+ const groupItems = itemStore.groups[itemState.value.group];
19303
+ if (groupItems) {
19304
+ groupItems.forEach((id2) => {
19305
+ const item = itemStore.items[id2];
19306
+ if (item) {
19307
+ initialGroupStates.value[id2] = {
19308
+ top: item.top,
19309
+ left: item.left,
19310
+ width: item.width,
19311
+ height: item.height
19312
+ };
19313
+ }
19314
+ });
19315
+ }
18295
19316
  }
18296
- savePositionAndSize();
18297
19317
  };
18298
19318
  const startResizeRight = (e2) => {
18299
19319
  e2.preventDefault();
18300
19320
  handleReziging(e2);
19321
+ resizeDirection.value = "right";
19322
+ captureGroupInitialStates();
18301
19323
  startX.value = e2.clientX;
18302
19324
  startWidth.value = itemState.value.width;
18303
19325
  document.addEventListener("mousemove", onResizeWidth);
@@ -18307,7 +19329,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18307
19329
  if (isResizing.value) {
18308
19330
  const deltaX = e2.clientX - startX.value;
18309
19331
  const newWidth = startWidth.value + deltaX;
18310
- if (newWidth > 100 && newWidth < window.innerWidth - 0) {
19332
+ if (newWidth > 100 && newWidth < window.innerWidth) {
18311
19333
  itemState.value.width = newWidth;
18312
19334
  savePositionAndSize();
18313
19335
  }
@@ -18316,6 +19338,8 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18316
19338
  const startResizeBottom = (e2) => {
18317
19339
  e2.preventDefault();
18318
19340
  handleReziging(e2);
19341
+ resizeDirection.value = "bottom";
19342
+ captureGroupInitialStates();
18319
19343
  startY.value = e2.clientY;
18320
19344
  startHeight.value = itemState.value.height;
18321
19345
  document.addEventListener("mousemove", onResizeHeight);
@@ -18334,6 +19358,8 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18334
19358
  const startResizeTop = (e2) => {
18335
19359
  e2.preventDefault();
18336
19360
  handleReziging(e2);
19361
+ resizeDirection.value = "top";
19362
+ captureGroupInitialStates();
18337
19363
  startY.value = e2.clientY;
18338
19364
  startTop.value = itemState.value.top;
18339
19365
  startHeight.value = itemState.value.height;
@@ -18345,7 +19371,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18345
19371
  const deltaY = e2.clientY - startY.value;
18346
19372
  const newTop = startTop.value + deltaY;
18347
19373
  const newHeight = startHeight.value - deltaY;
18348
- if (newHeight > 100 && newHeight < window.innerHeight - 100) {
19374
+ if (newHeight > 100 && newHeight < window.innerHeight - 100 && newTop >= 0) {
18349
19375
  itemState.value.top = newTop;
18350
19376
  itemState.value.height = newHeight;
18351
19377
  savePositionAndSize();
@@ -18355,6 +19381,8 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18355
19381
  const startResizeLeft = (e2) => {
18356
19382
  e2.preventDefault();
18357
19383
  handleReziging(e2);
19384
+ resizeDirection.value = "left";
19385
+ captureGroupInitialStates();
18358
19386
  startX.value = e2.clientX;
18359
19387
  startLeft.value = itemState.value.left;
18360
19388
  startWidth.value = itemState.value.width;
@@ -18374,15 +19402,19 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18374
19402
  }
18375
19403
  };
18376
19404
  const stopResize = () => {
18377
- isResizing.value = false;
18378
- if (activeLine.value) {
18379
- activeLine.value.classList.remove("resizing-highlight-line");
19405
+ if (isResizing.value) {
19406
+ isResizing.value = false;
19407
+ resizeDirection.value = null;
19408
+ initialGroupStates.value = {};
19409
+ if (activeLine.value) {
19410
+ activeLine.value.classList.remove("resizing-highlight-line");
19411
+ }
19412
+ itemStore.inResizing = false;
19413
+ document.removeEventListener("mousemove", onResizeWidth);
19414
+ document.removeEventListener("mousemove", onResizeHeight);
19415
+ document.removeEventListener("mousemove", onResizeTop);
19416
+ document.removeEventListener("mousemove", onResizeLeft);
18380
19417
  }
18381
- itemStore.inResizing = false;
18382
- document.removeEventListener("mousemove", onResizeWidth);
18383
- document.removeEventListener("mousemove", onResizeHeight);
18384
- document.removeEventListener("mousemove", onResizeTop);
18385
- document.removeEventListener("mousemove", onResizeLeft);
18386
19418
  };
18387
19419
  const startMove = (e2) => {
18388
19420
  registerClick();
@@ -18406,13 +19438,19 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18406
19438
  const deltaY = e2.clientY - startY.value;
18407
19439
  itemState.value.left = startLeft.value + deltaX;
18408
19440
  itemState.value.top = startTop.value + deltaY;
18409
- savePositionAndSize();
18410
19441
  }
18411
19442
  };
18412
19443
  const stopMove = () => {
18413
- isDragging.value = false;
18414
- document.removeEventListener("mousemove", onMove);
18415
- document.removeEventListener("mouseup", stopMove);
19444
+ if (isDragging.value) {
19445
+ isDragging.value = false;
19446
+ document.removeEventListener("mousemove", onMove);
19447
+ document.removeEventListener("mouseup", stopMove);
19448
+ savePositionAndSize();
19449
+ if (props2.preventOverlap) {
19450
+ itemStore.preventOverlap(props2.id);
19451
+ loadPositionAndSize();
19452
+ }
19453
+ }
18416
19454
  };
18417
19455
  const moveToRight = () => {
18418
19456
  var _a;
@@ -18433,11 +19471,11 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18433
19471
  const parentElement = (_a = instance == null ? void 0 : instance.parent) == null ? void 0 : _a.vnode.el;
18434
19472
  if (parentElement) {
18435
19473
  const parentBottom = parentElement.offsetTop + parentElement.offsetHeight;
18436
- itemState.value.left = parentElement.offsetLeft;
18437
- itemState.value.top = parentBottom - itemState.value.height;
19474
+ itemState.value.left = parentElement.offsetLeft + props2.initialLeft;
19475
+ itemState.value.top = parentBottom - (itemState.value.height + props2.initialTop);
18438
19476
  itemState.value.stickynessPosition = "bottom";
18439
19477
  if (itemState.value.fullWidth) {
18440
- itemState.value.width = parentElement.offsetWidth;
19478
+ itemState.value.width = parentElement.offsetWidth - props2.initialLeft;
18441
19479
  }
18442
19480
  savePositionAndSize();
18443
19481
  }
@@ -18469,27 +19507,50 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18469
19507
  }
18470
19508
  };
18471
19509
  const applyStickyPosition = () => {
19510
+ var _a;
19511
+ const parentElement = (_a = instance == null ? void 0 : instance.parent) == null ? void 0 : _a.vnode.el;
19512
+ if (!parentElement) {
19513
+ console.warn(`No parent element found for ${props2.id}`);
19514
+ return;
19515
+ }
18472
19516
  switch (itemState.value.stickynessPosition) {
18473
19517
  case "top":
18474
- moveToTop();
19518
+ itemState.value.left = parentElement.offsetLeft;
19519
+ itemState.value.top = parentElement.offsetTop;
19520
+ if (itemState.value.fullWidth) {
19521
+ itemState.value.width = parentElement.offsetWidth;
19522
+ }
18475
19523
  break;
18476
19524
  case "bottom":
18477
- moveToBottom();
19525
+ itemState.value.left = parentElement.offsetLeft + (props2.initialLeft || 0);
19526
+ itemState.value.top = parentElement.offsetTop + parentElement.offsetHeight - itemState.value.height - (props2.initialTop || 0);
19527
+ if (itemState.value.fullWidth) {
19528
+ itemState.value.width = parentElement.offsetWidth - (props2.initialLeft || 0);
19529
+ }
18478
19530
  break;
18479
19531
  case "left":
18480
- moveToLeft();
19532
+ itemState.value.left = parentElement.offsetLeft;
19533
+ itemState.value.top = parentElement.offsetTop + (props2.initialTop || 0);
19534
+ if (itemState.value.fullHeight) {
19535
+ itemState.value.height = parentElement.offsetHeight - (props2.initialTop || 0);
19536
+ }
18481
19537
  break;
18482
19538
  case "right":
18483
- moveToRight();
19539
+ itemState.value.left = parentElement.offsetLeft + parentElement.offsetWidth - itemState.value.width;
19540
+ itemState.value.top = parentElement.offsetTop + (props2.initialTop || 0);
19541
+ if (itemState.value.fullHeight) {
19542
+ itemState.value.height = parentElement.offsetHeight - (props2.initialTop || 0);
19543
+ }
18484
19544
  break;
18485
19545
  }
19546
+ savePositionAndSize();
18486
19547
  };
18487
19548
  const calculateWidth = () => {
18488
19549
  var _a, _b;
18489
19550
  if (props2.initialWidth) {
18490
19551
  return props2.initialWidth;
18491
19552
  } else if (props2.initialPosition === "top" || props2.initialPosition === "bottom") {
18492
- return ((_b = (_a = instance == null ? void 0 : instance.parent) == null ? void 0 : _a.vnode.el) == null ? void 0 : _b.offsetWidth) || 300;
19553
+ return ((_b = (_a = instance == null ? void 0 : instance.parent) == null ? void 0 : _a.vnode.el) == null ? void 0 : _b.offsetWidth) - props2.initialLeft || 300;
18493
19554
  } else
18494
19555
  return 300;
18495
19556
  };
@@ -18498,7 +19559,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18498
19559
  if (props2.initialHeight) {
18499
19560
  return props2.initialHeight;
18500
19561
  } else if (props2.initialPosition === "left" || props2.initialPosition === "right") {
18501
- return ((_b = (_a = instance == null ? void 0 : instance.parent) == null ? void 0 : _a.vnode.el) == null ? void 0 : _b.offsetHeight) || 300;
19562
+ return ((_b = (_a = instance == null ? void 0 : instance.parent) == null ? void 0 : _a.vnode.el) == null ? void 0 : _b.offsetHeight) - props2.initialHeight || 300;
18502
19563
  } else
18503
19564
  return 300;
18504
19565
  };
@@ -18520,74 +19581,117 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18520
19581
  itemStore.clickOnItem(props2.id);
18521
19582
  };
18522
19583
  const setFullScreen = (makeFull) => {
18523
- if (itemState.value.fullScreen !== makeFull) {
18524
- toggleFullScreen();
18525
- }
19584
+ itemStore.setFullScreen(props2.id, makeFull);
19585
+ loadPositionAndSize();
18526
19586
  };
19587
+ watch$1(
19588
+ () => itemStore.items[props2.id],
19589
+ (newState) => {
19590
+ if (newState) {
19591
+ if (isDragging.value || isResizing.value) {
19592
+ itemState.value.zIndex = newState.zIndex;
19593
+ } else {
19594
+ itemState.value = { ...newState };
19595
+ }
19596
+ }
19597
+ },
19598
+ { deep: true }
19599
+ );
19600
+ watch$1(
19601
+ () => ({ group: props2.group, syncDimensions: props2.syncDimensions }),
19602
+ ({ group, syncDimensions }) => {
19603
+ itemStore.setItemState(props2.id, {
19604
+ group,
19605
+ syncDimensions
19606
+ });
19607
+ itemState.value.group = group;
19608
+ itemState.value.syncDimensions = syncDimensions;
19609
+ }
19610
+ );
19611
+ nextTick().then(() => {
19612
+ observeParentResize();
19613
+ });
18527
19614
  onMounted(() => {
18528
- if (!itemStore.items[props2.id]) {
19615
+ const initialWidth = calculateWidth();
19616
+ const initialHeight = calculateHeight();
19617
+ const initialLeft = props2.initialLeft || 100;
19618
+ const initialTop = props2.initialTop || 100;
19619
+ itemStore.registerInitialState(props2.id, {
19620
+ width: initialWidth,
19621
+ height: initialHeight,
19622
+ left: initialLeft,
19623
+ top: initialTop,
19624
+ stickynessPosition: props2.initialPosition,
19625
+ fullWidth: !props2.initialWidth,
19626
+ fullHeight: !props2.initialHeight,
19627
+ group: props2.group,
19628
+ syncDimensions: props2.syncDimensions
19629
+ });
19630
+ const hasSavedState = localStorage.getItem(`overlayPositionAndSize_${props2.id}`) !== null;
19631
+ if (!hasSavedState) {
18529
19632
  itemStore.setItemState(props2.id, {
18530
- width: calculateWidth(),
18531
- height: calculateHeight(),
18532
- left: props2.initalLeft || 100,
18533
- top: props2.initialTop || 100,
19633
+ width: initialWidth,
19634
+ height: initialHeight,
19635
+ left: initialLeft,
19636
+ top: initialTop,
18534
19637
  fullHeight: !props2.initialHeight,
18535
- fullWidth: !props2.initialWidth
19638
+ fullWidth: !props2.initialWidth,
19639
+ stickynessPosition: props2.initialPosition,
19640
+ group: props2.group,
19641
+ syncDimensions: props2.syncDimensions
18536
19642
  });
18537
19643
  itemState.value = itemStore.items[props2.id];
18538
- itemState.value.stickynessPosition = props2.initialPosition;
18539
- if (itemState.value.stickynessPosition !== "free") {
18540
- applyStickyPosition();
19644
+ if (props2.initialPosition !== "free") {
19645
+ nextTick(() => {
19646
+ applyStickyPosition();
19647
+ });
18541
19648
  }
18542
19649
  } else {
18543
19650
  loadPositionAndSize();
19651
+ if (itemState.value.stickynessPosition && itemState.value.stickynessPosition !== "free") {
19652
+ nextTick(() => {
19653
+ applyStickyPosition();
19654
+ });
19655
+ }
18544
19656
  }
19657
+ const handleLayoutReset = (event) => {
19658
+ itemState.value = { ...itemStore.items[props2.id] };
19659
+ if (itemState.value.stickynessPosition && itemState.value.stickynessPosition !== "free") {
19660
+ nextTick(() => {
19661
+ applyStickyPosition();
19662
+ });
19663
+ }
19664
+ };
19665
+ window.addEventListener("layout-reset", handleLayoutReset);
18545
19666
  document.addEventListener("mouseup", stopResize);
18546
- document.addEventListener("mouseup", stopMove);
19667
+ window[`resetHandler_${props2.id}`] = handleLayoutReset;
18547
19668
  });
18548
- nextTick().then(() => {
18549
- observeParentResize();
19669
+ __expose({
19670
+ setFullScreen
18550
19671
  });
18551
19672
  onBeforeUnmount(() => {
19673
+ const handler = window[`resetHandler_${props2.id}`];
19674
+ if (handler) {
19675
+ window.removeEventListener("layout-reset", handler);
19676
+ delete window[`resetHandler_${props2.id}`];
19677
+ }
18552
19678
  document.removeEventListener("mouseup", stopResize);
19679
+ document.removeEventListener("mousemove", onMove);
18553
19680
  document.removeEventListener("mouseup", stopMove);
18554
- });
18555
- __expose({
18556
- width: itemState.value.width,
18557
- height: itemState.value.height,
18558
- isDragging,
18559
- isResizing,
18560
- startX,
18561
- startY,
18562
- startWidth,
18563
- startHeight,
18564
- startLeft,
18565
- startTop,
18566
- left: itemState.value.left,
18567
- top: itemState.value.top,
18568
- startResizeRight,
18569
- onResizeWidth,
18570
- startResizeBottom,
18571
- onResizeHeight,
18572
- startResizeTop,
18573
- onResizeTop,
18574
- startResizeLeft,
18575
- onResizeLeft,
18576
- stopResize,
18577
- startMove,
18578
- onMove,
18579
- stopMove,
18580
- moveToRight,
18581
- moveToBottom,
18582
- moveToLeft,
18583
- moveToTop,
18584
- setHeight: (value) => itemState.value.height = value,
18585
- setWitdh: (value) => itemState.value.width = value,
18586
- setFullScreen
19681
+ document.removeEventListener("mousemove", onResizeWidth);
19682
+ document.removeEventListener("mousemove", onResizeHeight);
19683
+ document.removeEventListener("mousemove", onResizeTop);
19684
+ document.removeEventListener("mousemove", onResizeLeft);
18587
19685
  });
18588
19686
  return (_ctx, _cache) => {
18589
19687
  return openBlock(), createElementBlock("div", {
18590
- class: normalizeClass(["overlay", { "no-transition": isResizing.value, minimized: isMinimized.value }]),
19688
+ id: props2.id,
19689
+ class: normalizeClass(["overlay", {
19690
+ "no-transition": isResizing.value,
19691
+ minimized: isMinimized.value,
19692
+ "in-group": itemState.value.group,
19693
+ synced: itemState.value.syncDimensions
19694
+ }]),
18591
19695
  style: normalizeStyle({
18592
19696
  width: isMinimized.value ? "auto" : itemState.value.width + "px",
18593
19697
  height: isMinimized.value ? "auto" : itemState.value.height + "px",
@@ -18603,14 +19707,16 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18603
19707
  __props.allowMinimizing ? (openBlock(), createElementBlock("button", {
18604
19708
  key: 0,
18605
19709
  class: "minimal-button",
19710
+ "data-tooltip": "true",
18606
19711
  title: isMinimized.value ? "Maximize" : "Minimize",
18607
19712
  onClick: toggleMinimize
18608
19713
  }, [
18609
- createBaseVNode("span", _hoisted_2$5, toDisplayString(isMinimized.value ? "+" : "−"), 1)
18610
- ], 8, _hoisted_1$8)) : createCommentVNode("", true),
19714
+ createBaseVNode("span", _hoisted_3$6, toDisplayString(isMinimized.value ? "+" : "−"), 1)
19715
+ ], 8, _hoisted_2$7)) : createCommentVNode("", true),
18611
19716
  __props.showRight && itemState.value.stickynessPosition !== "right" ? (openBlock(), createElementBlock("button", {
18612
19717
  key: 1,
18613
19718
  class: "minimal-button",
19719
+ "data-tooltip": "true",
18614
19720
  title: "Move to Right",
18615
19721
  onClick: moveToRight
18616
19722
  }, _cache[4] || (_cache[4] = [
@@ -18619,6 +19725,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18619
19725
  __props.showBottom && itemState.value.stickynessPosition !== "bottom" ? (openBlock(), createElementBlock("button", {
18620
19726
  key: 2,
18621
19727
  class: "minimal-button",
19728
+ "data-tooltip": "true",
18622
19729
  title: "Move to Bottom",
18623
19730
  onClick: moveToBottom
18624
19731
  }, _cache[5] || (_cache[5] = [
@@ -18627,6 +19734,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18627
19734
  __props.showLeft && itemState.value.stickynessPosition !== "left" ? (openBlock(), createElementBlock("button", {
18628
19735
  key: 3,
18629
19736
  class: "minimal-button",
19737
+ "data-tooltip": "true",
18630
19738
  title: "Move to Left",
18631
19739
  onClick: moveToLeft
18632
19740
  }, _cache[6] || (_cache[6] = [
@@ -18635,6 +19743,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18635
19743
  __props.showTop && itemState.value.stickynessPosition !== "top" ? (openBlock(), createElementBlock("button", {
18636
19744
  key: 4,
18637
19745
  class: "minimal-button",
19746
+ "data-tooltip": "true",
18638
19747
  title: "Move to Top",
18639
19748
  onClick: moveToTop
18640
19749
  }, _cache[7] || (_cache[7] = [
@@ -18643,7 +19752,8 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18643
19752
  __props.allowFullScreen && !itemState.value.fullScreen ? (openBlock(), createElementBlock("button", {
18644
19753
  key: 5,
18645
19754
  class: "minimal-button",
18646
- title: "Toggle Full Screen",
19755
+ "data-tooltip": "true",
19756
+ "data-tooltip-text": "Toggle Full Screen",
18647
19757
  onClick: toggleFullScreen
18648
19758
  }, _cache[8] || (_cache[8] = [
18649
19759
  createBaseVNode("span", { class: "icon" }, "⬜", -1)
@@ -18651,12 +19761,16 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18651
19761
  __props.allowFullScreen && itemState.value.fullScreen ? (openBlock(), createElementBlock("button", {
18652
19762
  key: 6,
18653
19763
  class: "minimal-button",
18654
- title: "To Small Screen",
19764
+ "data-tooltip": "true",
19765
+ "data-tooltip-text": "Exit Full Screen",
18655
19766
  onClick: toggleFullScreen
18656
19767
  }, _cache[9] || (_cache[9] = [
18657
19768
  createBaseVNode("span", { class: "icon" }, "❐", -1)
18658
19769
  ]))) : createCommentVNode("", true),
18659
- createTextVNode(" " + toDisplayString(__props.title), 1)
19770
+ createBaseVNode("span", {
19771
+ class: "group-badge",
19772
+ onMousedown: startMove
19773
+ }, toDisplayString(__props.title), 33)
18660
19774
  ], 32),
18661
19775
  createBaseVNode("div", {
18662
19776
  class: "content",
@@ -18684,12 +19798,214 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
18684
19798
  onMousedown: withModifiers(startResizeLeft, ["stop"]),
18685
19799
  onMouseenter: _cache[3] || (_cache[3] = ($event) => resizeOnEnter($event, "left"))
18686
19800
  }, null, 32)
18687
- ], 6);
19801
+ ], 14, _hoisted_1$9);
19802
+ };
19803
+ }
19804
+ });
19805
+ const DraggableItem_vue_vue_type_style_index_0_scoped_47a34251_lang = "";
19806
+ const DraggableItem = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-47a34251"]]);
19807
+ const _hoisted_1$8 = { class: "panel-header" };
19808
+ const _hoisted_2$6 = { class: "panel-body" };
19809
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
19810
+ __name: "layoutControls",
19811
+ emits: ["reset-layout-graph"],
19812
+ setup(__props, { emit: __emit }) {
19813
+ const emit = __emit;
19814
+ const itemStore = useItemStore();
19815
+ const isOpen = ref(false);
19816
+ const position = ref({ x: window.innerWidth - 80, y: window.innerHeight - 80 });
19817
+ const isDragging = ref(false);
19818
+ const hasDragged = ref(false);
19819
+ const dragStart = ref({ x: 0, y: 0 });
19820
+ const initialPosition = ref({ x: 0, y: 0 });
19821
+ const handleViewportResize = () => {
19822
+ const buttonSize = 45;
19823
+ const boundaryMargin = 10;
19824
+ position.value.x = Math.max(
19825
+ boundaryMargin,
19826
+ Math.min(window.innerWidth - buttonSize - boundaryMargin, position.value.x)
19827
+ );
19828
+ position.value.y = Math.max(
19829
+ boundaryMargin,
19830
+ Math.min(window.innerHeight - buttonSize - boundaryMargin, position.value.y)
19831
+ );
19832
+ };
19833
+ const panelStyle = computed$1(() => {
19834
+ const style = {};
19835
+ const isRightHalf = position.value.x > window.innerWidth / 2;
19836
+ const isBottomHalf = position.value.y > window.innerHeight / 2;
19837
+ if (isRightHalf) {
19838
+ style.right = "60px";
19839
+ } else {
19840
+ style.left = "60px";
19841
+ }
19842
+ if (isBottomHalf) {
19843
+ style.bottom = "0px";
19844
+ } else {
19845
+ style.top = "0px";
19846
+ }
19847
+ return style;
19848
+ });
19849
+ onMounted(() => {
19850
+ const savedPosition = localStorage.getItem("layoutControlsPosition");
19851
+ if (savedPosition) {
19852
+ const parsed = JSON.parse(savedPosition);
19853
+ position.value = parsed;
19854
+ handleViewportResize();
19855
+ }
19856
+ window.addEventListener("resize", handleViewportResize);
19857
+ });
19858
+ const savePosition = () => {
19859
+ localStorage.setItem("layoutControlsPosition", JSON.stringify(position.value));
19860
+ };
19861
+ const handleMouseDown = (e2) => {
19862
+ e2.preventDefault();
19863
+ hasDragged.value = false;
19864
+ if (isOpen.value) {
19865
+ return;
19866
+ }
19867
+ isDragging.value = true;
19868
+ dragStart.value = {
19869
+ x: e2.clientX,
19870
+ y: e2.clientY
19871
+ };
19872
+ initialPosition.value = {
19873
+ x: position.value.x,
19874
+ y: position.value.y
19875
+ };
19876
+ document.addEventListener("mousemove", onDrag);
19877
+ document.addEventListener("mouseup", stopDrag);
19878
+ };
19879
+ const handleClick = (e2) => {
19880
+ e2.preventDefault();
19881
+ e2.stopPropagation();
19882
+ if (!hasDragged.value) {
19883
+ isOpen.value = !isOpen.value;
19884
+ }
19885
+ };
19886
+ const onDrag = (e2) => {
19887
+ if (!isDragging.value)
19888
+ return;
19889
+ const deltaX = e2.clientX - dragStart.value.x;
19890
+ const deltaY = e2.clientY - dragStart.value.y;
19891
+ if (Math.abs(deltaX) > 5 || Math.abs(deltaY) > 5) {
19892
+ hasDragged.value = true;
19893
+ }
19894
+ if (hasDragged.value) {
19895
+ let newX = initialPosition.value.x + deltaX;
19896
+ let newY = initialPosition.value.y + deltaY;
19897
+ const buttonSize = 45;
19898
+ const boundaryMargin = 10;
19899
+ newX = Math.max(
19900
+ boundaryMargin,
19901
+ Math.min(window.innerWidth - buttonSize - boundaryMargin, newX)
19902
+ );
19903
+ newY = Math.max(
19904
+ boundaryMargin,
19905
+ Math.min(window.innerHeight - buttonSize - boundaryMargin, newY)
19906
+ );
19907
+ position.value = { x: newX, y: newY };
19908
+ }
19909
+ };
19910
+ const stopDrag = () => {
19911
+ if (isDragging.value) {
19912
+ isDragging.value = false;
19913
+ if (hasDragged.value) {
19914
+ savePosition();
19915
+ }
19916
+ document.removeEventListener("mousemove", onDrag);
19917
+ document.removeEventListener("mouseup", stopDrag);
19918
+ }
19919
+ };
19920
+ const runAction = (action, ...args) => {
19921
+ action(...args);
19922
+ isOpen.value = false;
19923
+ };
19924
+ const arrangeLayout = (layout) => {
19925
+ itemStore.arrangeItems(layout);
19926
+ };
19927
+ const resetLayout = () => {
19928
+ itemStore.resetLayout();
19929
+ };
19930
+ const resetLayoutGraph = () => {
19931
+ emit("reset-layout-graph");
19932
+ };
19933
+ onBeforeUnmount(() => {
19934
+ document.removeEventListener("mousemove", onDrag);
19935
+ document.removeEventListener("mouseup", stopDrag);
19936
+ window.removeEventListener("resize", handleViewportResize);
19937
+ });
19938
+ return (_ctx, _cache) => {
19939
+ return openBlock(), createElementBlock("div", {
19940
+ class: "layout-widget-wrapper",
19941
+ style: normalizeStyle({
19942
+ left: position.value.x + "px",
19943
+ top: position.value.y + "px"
19944
+ })
19945
+ }, [
19946
+ createVNode(Transition$2, { name: "panel-fade" }, {
19947
+ default: withCtx(() => [
19948
+ isOpen.value ? (openBlock(), createElementBlock("div", {
19949
+ key: 0,
19950
+ class: "panel",
19951
+ style: normalizeStyle(panelStyle.value)
19952
+ }, [
19953
+ createBaseVNode("div", _hoisted_1$8, [
19954
+ _cache[5] || (_cache[5] = createBaseVNode("span", { class: "panel-title" }, "Layout Controls", -1)),
19955
+ createBaseVNode("button", {
19956
+ class: "close-btn",
19957
+ title: "Close",
19958
+ onClick: _cache[0] || (_cache[0] = ($event) => isOpen.value = false)
19959
+ }, "✕")
19960
+ ]),
19961
+ createBaseVNode("div", _hoisted_2$6, [
19962
+ createBaseVNode("button", {
19963
+ class: "control-btn",
19964
+ onClick: _cache[1] || (_cache[1] = ($event) => runAction(arrangeLayout, "tile"))
19965
+ }, _cache[6] || (_cache[6] = [
19966
+ createBaseVNode("span", { class: "icon" }, "⊞", -1),
19967
+ createTextVNode(" Tile Layout ")
19968
+ ])),
19969
+ createBaseVNode("button", {
19970
+ class: "control-btn",
19971
+ onClick: _cache[2] || (_cache[2] = ($event) => runAction(arrangeLayout, "cascade"))
19972
+ }, _cache[7] || (_cache[7] = [
19973
+ createBaseVNode("span", { class: "icon" }, "◫", -1),
19974
+ createTextVNode(" Cascade ")
19975
+ ])),
19976
+ createBaseVNode("button", {
19977
+ class: "control-btn",
19978
+ onClick: _cache[3] || (_cache[3] = ($event) => runAction(resetLayout))
19979
+ }, _cache[8] || (_cache[8] = [
19980
+ createBaseVNode("span", { class: "icon" }, "↺", -1),
19981
+ createTextVNode(" Reset window Layout ")
19982
+ ])),
19983
+ createBaseVNode("button", {
19984
+ class: "control-btn accent",
19985
+ onClick: _cache[4] || (_cache[4] = ($event) => runAction(resetLayoutGraph))
19986
+ }, _cache[9] || (_cache[9] = [
19987
+ createBaseVNode("span", { class: "icon" }, "⟲", -1),
19988
+ createTextVNode(" Reset Layout Graph ")
19989
+ ]))
19990
+ ])
19991
+ ], 4)) : createCommentVNode("", true)
19992
+ ]),
19993
+ _: 1
19994
+ }),
19995
+ createBaseVNode("button", {
19996
+ class: normalizeClass(["trigger-btn", { "is-open": isOpen.value }]),
19997
+ title: "Layout Controls",
19998
+ onMousedown: handleMouseDown,
19999
+ onClick: handleClick
20000
+ }, _cache[10] || (_cache[10] = [
20001
+ createStaticVNode('<svg class="layout-icon" viewBox="0 0 24 24" width="24" height="24" data-v-0bdaa52f><rect x="2" y="2" width="8" height="6" fill="currentColor" opacity="0.9" data-v-0bdaa52f></rect><rect x="12" y="2" width="8" height="6" fill="currentColor" opacity="0.7" data-v-0bdaa52f></rect><rect x="2" y="10" width="8" height="10" fill="currentColor" opacity="0.7" data-v-0bdaa52f></rect><rect x="12" y="10" width="8" height="10" fill="currentColor" opacity="0.9" data-v-0bdaa52f></rect></svg>', 1)
20002
+ ]), 34)
20003
+ ], 4);
18688
20004
  };
18689
20005
  }
18690
20006
  });
18691
- const DraggableItem_vue_vue_type_style_index_0_scoped_e3b23979_lang = "";
18692
- const DraggableItem = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__scopeId", "data-v-e3b23979"]]);
20007
+ const layoutControls_vue_vue_type_style_index_0_scoped_0bdaa52f_lang = "";
20008
+ const layoutControls = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__scopeId", "data-v-0bdaa52f"]]);
18693
20009
  var __defProp$2 = Object.defineProperty;
18694
20010
  var __defProps = Object.defineProperties;
18695
20011
  var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
@@ -67227,15 +68543,15 @@ var __defProp$1 = Object.defineProperty;
67227
68543
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
67228
68544
  var __hasOwnProp = Object.prototype.hasOwnProperty;
67229
68545
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
67230
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
68546
+ var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
67231
68547
  var __spreadValues = (a3, b2) => {
67232
68548
  for (var prop in b2 || (b2 = {}))
67233
68549
  if (__hasOwnProp.call(b2, prop))
67234
- __defNormalProp(a3, prop, b2[prop]);
68550
+ __defNormalProp2(a3, prop, b2[prop]);
67235
68551
  if (__getOwnPropSymbols)
67236
68552
  for (var prop of __getOwnPropSymbols(b2)) {
67237
68553
  if (__propIsEnum.call(b2, prop))
67238
- __defNormalProp(a3, prop, b2[prop]);
68554
+ __defNormalProp2(a3, prop, b2[prop]);
67239
68555
  }
67240
68556
  return a3;
67241
68557
  };
@@ -67705,7 +69021,7 @@ var AgGridVue = defineComponent({
67705
69021
  * @license MIT
67706
69022
  **)
67707
69023
  */
67708
- var __defProp = Object.defineProperty;
69024
+ var __defProp2 = Object.defineProperty;
67709
69025
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
67710
69026
  var __decorateClass = (decorators, target, key, kind) => {
67711
69027
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
@@ -67713,7 +69029,7 @@ var __decorateClass = (decorators, target, key, kind) => {
67713
69029
  if (decorator = decorators[i2])
67714
69030
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
67715
69031
  if (kind && result)
67716
- __defProp(target, key, result);
69032
+ __defProp2(target, key, result);
67717
69033
  return result;
67718
69034
  };
67719
69035
  var _ClientSideNodeManager = class _ClientSideNodeManager2 {
@@ -69431,6 +70747,18 @@ const _hoisted_1$7 = {
69431
70747
  key: 0,
69432
70748
  class: "spinner-overlay"
69433
70749
  };
70750
+ const _hoisted_2$5 = { class: "table-container" };
70751
+ const _hoisted_3$5 = {
70752
+ key: 0,
70753
+ class: "outdated-data-banner"
70754
+ };
70755
+ const _hoisted_4$5 = {
70756
+ key: 1,
70757
+ class: "fetch-data-section"
70758
+ };
70759
+ const _hoisted_5$4 = ["disabled"];
70760
+ const _hoisted_6$3 = { key: 0 };
70761
+ const _hoisted_7$2 = { key: 1 };
69434
70762
  const _sfc_main$8 = /* @__PURE__ */ defineComponent({
69435
70763
  __name: "dataPreview",
69436
70764
  props: {
@@ -69451,6 +70779,31 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
69451
70779
  const columnLength = ref(0);
69452
70780
  const gridApi = ref(null);
69453
70781
  const columnDefs = ref([{}]);
70782
+ const showFetchButton = ref(false);
70783
+ const currentNodeId = ref(null);
70784
+ const showOutdatedDataBanner = ref(false);
70785
+ const props2 = __props;
70786
+ const { triggerNodeFetch, isPollingActive } = useFlowExecution(
70787
+ props2.flowId || nodeStore.flow_id,
70788
+ { interval: 2e3, enabled: true },
70789
+ {
70790
+ persistPolling: true,
70791
+ // Keep polling even when component unmounts
70792
+ pollingKey: `table_flow_${props2.flowId || nodeStore.flow_id}`
70793
+ }
70794
+ );
70795
+ const gridHeightComputed = computed$1(() => {
70796
+ if (showFetchButton.value) {
70797
+ return "80px";
70798
+ }
70799
+ return gridHeight.value || "100%";
70800
+ });
70801
+ const overlayNoRowsTemplate = computed$1(() => {
70802
+ if (showFetchButton.value) {
70803
+ return "<span></span>";
70804
+ }
70805
+ return void 0;
70806
+ });
69454
70807
  const defaultColDef = {
69455
70808
  editable: true,
69456
70809
  filter: true,
@@ -69459,8 +70812,17 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
69459
70812
  };
69460
70813
  const onGridReady = (params) => {
69461
70814
  gridApi.value = params.api;
70815
+ if (showFetchButton.value) {
70816
+ gridApi.value.hideOverlay();
70817
+ }
69462
70818
  };
69463
- const props2 = __props;
70819
+ function dismissOutdatedBanner() {
70820
+ showOutdatedDataBanner.value = false;
70821
+ }
70822
+ async function handleRefresh() {
70823
+ showOutdatedDataBanner.value = false;
70824
+ await handleFetchData();
70825
+ }
69464
70826
  const calculateGridHeight = () => {
69465
70827
  const otherElementsHeight = 300;
69466
70828
  const availableHeight = window.innerHeight - otherElementsHeight;
@@ -69470,39 +70832,81 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
69470
70832
  async function downloadData(nodeId) {
69471
70833
  try {
69472
70834
  isLoading.value = true;
70835
+ showFetchButton.value = false;
70836
+ showOutdatedDataBanner.value = false;
70837
+ currentNodeId.value = nodeId;
69473
70838
  let resp = await nodeStore.getTableExample(nodeStore.flow_id, nodeId);
69474
70839
  if (resp) {
69475
70840
  dataPreview.value = resp;
70841
+ showOutdatedDataBanner.value = !resp.has_run_with_current_setup && resp.has_example_data;
69476
70842
  const _cd = [];
69477
70843
  const _columns = dataPreview.value.table_schema;
69478
70844
  if (props2.showFileStats) {
69479
70845
  _columns == null ? void 0 : _columns.forEach((item) => {
69480
- _cd.push({ field: item.name, resizable: true });
70846
+ _cd.push({
70847
+ field: item.name,
70848
+ headerName: item.name,
70849
+ resizable: true
70850
+ });
69481
70851
  schema_dict[item.name] = item;
69482
70852
  });
69483
70853
  } else {
69484
70854
  _columns == null ? void 0 : _columns.forEach((item) => {
69485
- _cd.push({ field: item.name, resizable: true });
70855
+ _cd.push({
70856
+ field: item.name,
70857
+ headerName: item.name,
70858
+ resizable: true
70859
+ });
69486
70860
  });
69487
70861
  }
69488
70862
  columnDefs.value = _cd;
69489
- if (dataPreview.value) {
69490
- rowData.value = dataPreview.value.data;
69491
- dataLength.value = dataPreview.value.number_of_records;
69492
- columnLength.value = dataPreview.value.number_of_columns;
70863
+ if (resp.has_example_data === false) {
70864
+ showFetchButton.value = true;
70865
+ rowData.value = [];
70866
+ showTable.value = true;
70867
+ dataAvailable.value = false;
70868
+ } else {
70869
+ if (dataPreview.value) {
70870
+ rowData.value = dataPreview.value.data;
70871
+ dataLength.value = dataPreview.value.number_of_records;
70872
+ columnLength.value = dataPreview.value.number_of_columns;
70873
+ }
70874
+ showTable.value = true;
70875
+ dataAvailable.value = true;
70876
+ showFetchButton.value = false;
69493
70877
  }
69494
- showTable.value = true;
69495
- dataAvailable.value = true;
69496
70878
  }
69497
70879
  } finally {
69498
70880
  isLoading.value = false;
69499
70881
  }
69500
70882
  }
70883
+ async function handleFetchData() {
70884
+ if (currentNodeId.value !== null) {
70885
+ try {
70886
+ if (isPollingActive(`node_${currentNodeId.value}`)) {
70887
+ console.log("Fetch already in progress for this node");
70888
+ return;
70889
+ }
70890
+ await triggerNodeFetch(currentNodeId.value);
70891
+ const checkInterval = setInterval(async () => {
70892
+ if (!isPollingActive(`node_${currentNodeId.value}`)) {
70893
+ clearInterval(checkInterval);
70894
+ await downloadData(currentNodeId.value);
70895
+ }
70896
+ }, 1e3);
70897
+ setTimeout(() => clearInterval(checkInterval), 6e4);
70898
+ } catch (error) {
70899
+ console.error("Error fetching data:", error);
70900
+ }
70901
+ }
70902
+ }
69501
70903
  function removeData() {
69502
70904
  rowData.value = [];
69503
70905
  showTable.value = false;
69504
70906
  dataAvailable.value = false;
69505
70907
  columnDefs.value = [{}];
70908
+ showFetchButton.value = false;
70909
+ currentNodeId.value = null;
69506
70910
  }
69507
70911
  ref(null);
69508
70912
  onMounted(() => {
@@ -69518,13 +70922,41 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
69518
70922
  isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_1$7, _cache[0] || (_cache[0] = [
69519
70923
  createBaseVNode("div", { class: "spinner" }, null, -1)
69520
70924
  ]))) : createCommentVNode("", true),
69521
- withDirectives(createVNode(unref(AgGridVue), {
69522
- "default-col-def": defaultColDef,
69523
- "column-defs": columnDefs.value,
69524
- class: "ag-theme-balham",
69525
- "row-data": rowData.value,
69526
- onGridReady
69527
- }, null, 8, ["column-defs", "row-data"]), [
70925
+ withDirectives(createBaseVNode("div", _hoisted_2$5, [
70926
+ showOutdatedDataBanner.value ? (openBlock(), createElementBlock("div", _hoisted_3$5, [
70927
+ createBaseVNode("p", null, [
70928
+ _cache[1] || (_cache[1] = createTextVNode(" Displayed data might be outdated. ")),
70929
+ createBaseVNode("button", {
70930
+ class: "refresh-link-button",
70931
+ onClick: handleRefresh
70932
+ }, "Refresh now")
70933
+ ]),
70934
+ createBaseVNode("button", {
70935
+ class: "dismiss-button",
70936
+ "aria-label": "Dismiss notification",
70937
+ onClick: dismissOutdatedBanner
70938
+ }, " × ")
70939
+ ])) : createCommentVNode("", true),
70940
+ createVNode(unref(AgGridVue), {
70941
+ "default-col-def": defaultColDef,
70942
+ "column-defs": columnDefs.value,
70943
+ class: "ag-theme-balham",
70944
+ "row-data": rowData.value,
70945
+ style: normalizeStyle({ width: "100%", height: gridHeightComputed.value }),
70946
+ "overlay-no-rows-template": overlayNoRowsTemplate.value,
70947
+ onGridReady
70948
+ }, null, 8, ["column-defs", "row-data", "style", "overlay-no-rows-template"]),
70949
+ showFetchButton.value ? (openBlock(), createElementBlock("div", _hoisted_4$5, [
70950
+ _cache[2] || (_cache[2] = createBaseVNode("p", null, "Step has not stored any data yet. Click here to trigger a run for this node", -1)),
70951
+ createBaseVNode("button", {
70952
+ class: "fetch-data-button",
70953
+ disabled: unref(nodeStore).isRunning,
70954
+ onClick: handleFetchData
70955
+ }, [
70956
+ !unref(nodeStore).isRunning ? (openBlock(), createElementBlock("span", _hoisted_6$3, "Fetch Data")) : (openBlock(), createElementBlock("span", _hoisted_7$2, "Fetching..."))
70957
+ ], 8, _hoisted_5$4)
70958
+ ])) : createCommentVNode("", true)
70959
+ ], 512), [
69528
70960
  [vShow, !isLoading.value]
69529
70961
  ])
69530
70962
  ], 64);
@@ -71059,7 +72491,7 @@ const _hoisted_4$4 = { class: "node-title" };
71059
72491
  const _hoisted_5$3 = { class: "node-description" };
71060
72492
  const _hoisted_6$2 = { key: 1 };
71061
72493
  const _hoisted_7$1 = { class: "node-details" };
71062
- const _hoisted_8 = {
72494
+ const _hoisted_8$1 = {
71063
72495
  key: 0,
71064
72496
  class: "failure"
71065
72497
  };
@@ -71186,7 +72618,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
71186
72618
  })
71187
72619
  }, toDisplayString(node.success === null ? "Running" : node.success ? "Success" : "Failure"), 3)
71188
72620
  ]),
71189
- node.success === false ? (openBlock(), createElementBlock("p", _hoisted_8, "Error: " + toDisplayString(node.error), 1)) : createCommentVNode("", true)
72621
+ node.success === false ? (openBlock(), createElementBlock("p", _hoisted_8$1, "Error: " + toDisplayString(node.error), 1)) : createCommentVNode("", true)
71190
72622
  ])
71191
72623
  ]),
71192
72624
  _: 2
@@ -71256,7 +72688,6 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
71256
72688
  connectionRetries.value = 0;
71257
72689
  errorMessage.value = null;
71258
72690
  connectionStatus.value = "disconnected";
71259
- console.log("Starting log streaming");
71260
72691
  try {
71261
72692
  const token = await authService.getToken();
71262
72693
  if (!token) {
@@ -71288,7 +72719,6 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
71288
72719
  if (!hasReceivedMessage && nodeStore.isRunning) {
71289
72720
  if (connectionRetries.value < maxRetries) {
71290
72721
  connectionRetries.value++;
71291
- console.log(`Retrying log connection (${connectionRetries.value}/${maxRetries})...`);
71292
72722
  errorMessage.value = `Connection failed. Retrying (${connectionRetries.value}/${maxRetries})...`;
71293
72723
  connectionStatus.value = "error";
71294
72724
  stopStreamingLogs();
@@ -71432,8 +72862,8 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
71432
72862
  };
71433
72863
  }
71434
72864
  });
71435
- const LogViewer_vue_vue_type_style_index_0_scoped_51d5bb55_lang = "";
71436
- const LogViewer = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-51d5bb55"]]);
72865
+ const LogViewer_vue_vue_type_style_index_0_scoped_9b3bdb24_lang = "";
72866
+ const LogViewer = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-9b3bdb24"]]);
71437
72867
  const _hoisted_1$4 = { class: "context-menu-header" };
71438
72868
  const _hoisted_2$2 = { class: "context-menu-items" };
71439
72869
  const _hoisted_3$2 = ["onClick"];
@@ -71535,11 +72965,32 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
71535
72965
  });
71536
72966
  const ContextMenu_vue_vue_type_style_index_0_scoped_7db4e6fc_lang = "";
71537
72967
  const ContextMenu = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-7db4e6fc"]]);
72968
+ const handleApiError = (error) => {
72969
+ var _a, _b, _c;
72970
+ throw {
72971
+ message: ((_b = (_a = error.response) == null ? void 0 : _a.data) == null ? void 0 : _b.detail) || "An unknown error occurred",
72972
+ status: ((_c = error.response) == null ? void 0 : _c.status) || 500
72973
+ };
72974
+ };
72975
+ const applyStandardLayout = async (flowId) => {
72976
+ const url = "/flow/apply_standard_layout/";
72977
+ try {
72978
+ const response = await axios.post(url, null, {
72979
+ params: {
72980
+ flow_id: flowId
72981
+ }
72982
+ });
72983
+ return response.data;
72984
+ } catch (error) {
72985
+ return handleApiError(error);
72986
+ }
72987
+ };
71538
72988
  const _hoisted_1$3 = { class: "container" };
71539
72989
  const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71540
72990
  __name: "CanvasFlow",
71541
72991
  emits: ["save", "run"],
71542
72992
  setup(__props, { expose: __expose, emit: __emit }) {
72993
+ const itemStore = useItemStore();
71543
72994
  const availableHeight = ref(0);
71544
72995
  const nodeStore = useNodeStore();
71545
72996
  const rawCustomNode = markRaw$1(CustomNode);
@@ -71563,14 +73014,23 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71563
73014
  const contextMenuTarget = ref({ type: "pane", id: "" });
71564
73015
  const emit = __emit;
71565
73016
  const handleCanvasClick = (event) => {
71566
- nodeStore.closeDrawer();
71567
73017
  showTablePreview.value = false;
73018
+ nodeStore.node_id = -1;
73019
+ nodeStore.activeDrawerComponent = null;
71568
73020
  nodeStore.hideLogViewer();
71569
73021
  clickedPosition.value = {
71570
73022
  x: event.x,
71571
73023
  y: event.y
71572
73024
  };
71573
73025
  };
73026
+ const handleNodeSettingsClose = (event) => {
73027
+ nodeStore.node_id = -1;
73028
+ nodeStore.activeDrawerComponent = null;
73029
+ clickedPosition.value = {
73030
+ x: event.x,
73031
+ y: event.y
73032
+ };
73033
+ };
71574
73034
  const toggleShowTablePreview = () => {
71575
73035
  showTablePreview.value = !showTablePreview.value;
71576
73036
  };
@@ -71589,7 +73049,6 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71589
73049
  setNodeTableView(nodeId);
71590
73050
  });
71591
73051
  fitView({ nodes: [nodeId.toString()] });
71592
- nodeStore.node_id = nodeId;
71593
73052
  };
71594
73053
  async function onConnect(params) {
71595
73054
  if (params.target && params.source) {
@@ -71613,6 +73072,9 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71613
73072
  const nodeClick = (mouseEvent) => {
71614
73073
  showTablePreview.value = true;
71615
73074
  nextTick().then(() => {
73075
+ nodeStore.node_id = parseInt(mouseEvent.node.id);
73076
+ itemStore.bringToFront("tablePreview");
73077
+ itemStore.bringToFront("nodeSettings");
71616
73078
  if (mouseEvent.node.id && !NodeIsSelected(mouseEvent.node.id) || dataPreview.value && dataPreview.value.dataLength == 0 && dataPreview.value.columnLength == 0) {
71617
73079
  setNodeTableView(mouseEvent.node.id);
71618
73080
  }
@@ -71620,7 +73082,6 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71620
73082
  });
71621
73083
  };
71622
73084
  const setNodeTableView = (nodeId) => {
71623
- console.log(dataPreview.value);
71624
73085
  if (dataPreview.value) {
71625
73086
  dataPreview.value.downloadData(nodeId);
71626
73087
  }
@@ -71651,13 +73112,9 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71651
73112
  console.log("Edge changes length is 2 so coming from a node change event");
71652
73113
  return;
71653
73114
  }
71654
- console.log("Edge changes", edgeChanges);
71655
73115
  for (const edgeChange of edgeChanges) {
71656
- if (edgeChange.type === "add") {
71657
- console.log("This edge change does not work");
71658
- } else if (edgeChange.type === "remove") {
73116
+ if (edgeChange.type === "remove") {
71659
73117
  const nodeConnection = convertEdgeChangeToNodeConnection(edgeChange);
71660
- console.log("Removing connection", nodeConnection);
71661
73118
  deleteConnection(nodeStore.flow_id, nodeConnection);
71662
73119
  }
71663
73120
  }
@@ -71696,6 +73153,14 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71696
73153
  copyValue(position.x, position.y);
71697
73154
  }
71698
73155
  };
73156
+ const handleResetLayoutGraph = async () => {
73157
+ await applyStandardLayout(nodeStore.flow_id);
73158
+ loadFlow();
73159
+ };
73160
+ const hideLogViewer = () => {
73161
+ nodeStore.hideLogViewerForThisRun = true;
73162
+ nodeStore.hideLogViewer();
73163
+ };
71699
73164
  const handleKeyDown = (event) => {
71700
73165
  let eventKeyClicked = event.ctrlKey || event.metaKey;
71701
73166
  if (eventKeyClicked && event.key === "v" && event.target) {
@@ -71778,7 +73243,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71778
73243
  onClick: closeContextMenu
71779
73244
  }, {
71780
73245
  default: withCtx(() => [
71781
- createVNode(unref(_sfc_main$d))
73246
+ createVNode(unref(_sfc_main$i))
71782
73247
  ]),
71783
73248
  _: 1
71784
73249
  }, 8, ["nodes", "edges", "connection-mode"]),
@@ -71798,7 +73263,8 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71798
73263
  "initial-width": 200,
71799
73264
  "initial-position": "left",
71800
73265
  title: "Data actions",
71801
- "allow-free-move": true
73266
+ "allow-free-move": true,
73267
+ "prevent-overlap": true
71802
73268
  }, {
71803
73269
  default: withCtx(() => [
71804
73270
  createVNode(NodeList, { onDragstart: unref(onDragStart) }, null, 8, ["onDragstart"])
@@ -71812,13 +73278,17 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71812
73278
  title: "Log overview",
71813
73279
  "allow-full-screen": true,
71814
73280
  "initial-position": "bottom",
71815
- "on-minize": unref(nodeStore).toggleLogViewer
73281
+ "initial-left": 200,
73282
+ "on-minize": hideLogViewer,
73283
+ group: "bottomPanels",
73284
+ "sync-dimensions": true,
73285
+ "prevent-overlap": true
71816
73286
  }, {
71817
73287
  default: withCtx(() => [
71818
- createVNode(LogViewer, { "flow-id": 1 })
73288
+ createVNode(LogViewer)
71819
73289
  ]),
71820
73290
  _: 1
71821
- }, 8, ["on-minize"])) : createCommentVNode("", true),
73291
+ })) : createCommentVNode("", true),
71822
73292
  unref(nodeStore).showFlowResult ? (openBlock(), createBlock(DraggableItem, {
71823
73293
  key: 1,
71824
73294
  id: "flowresults",
@@ -71826,7 +73296,8 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71826
73296
  title: "flow results",
71827
73297
  "initial-position": "right",
71828
73298
  "initial-width": 400,
71829
- "initial-top": -50
73299
+ group: "rightPanels",
73300
+ "prevent-overlap": true
71830
73301
  }, {
71831
73302
  default: withCtx(() => [
71832
73303
  createVNode(FlowResults, { "on-click": selectNodeExternally })
@@ -71841,7 +73312,11 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71841
73312
  title: "Table Preview",
71842
73313
  "initial-position": "bottom",
71843
73314
  "on-minize": toggleShowTablePreview,
71844
- "initial-height": tablePreviewHeight.value
73315
+ "initial-height": tablePreviewHeight.value,
73316
+ "initial-left": 200,
73317
+ group: "bottomPanels",
73318
+ "sync-dimensions": true,
73319
+ "prevent-overlap": false
71845
73320
  }, {
71846
73321
  default: withCtx(() => [
71847
73322
  createVNode(_sfc_main$8, {
@@ -71862,22 +73337,18 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71862
73337
  id: "nodeSettings",
71863
73338
  "show-right": true,
71864
73339
  "initial-position": "right",
71865
- "initial-top": 0,
71866
73340
  "initial-width": 800,
71867
73341
  "initial-height": nodeSettingsHeight.value,
71868
73342
  title: "Node Settings",
71869
- "on-minize": unref(nodeStore).closeDrawer,
71870
- "allow-full-screen": true
73343
+ "on-minize": handleNodeSettingsClose,
73344
+ "allow-full-screen": true,
73345
+ "prevent-overlap": false
71871
73346
  }, {
71872
- default: withCtx(() => _cache[2] || (_cache[2] = [
71873
- createBaseVNode("div", {
71874
- id: "nodesettings",
71875
- class: "content"
71876
- }, null, -1)
71877
- ])),
71878
- _: 1,
71879
- __: [2]
71880
- }, 8, ["initial-height", "on-minize"])) : createCommentVNode("", true),
73347
+ default: withCtx(() => [
73348
+ createVNode(_sfc_main$b)
73349
+ ]),
73350
+ _: 1
73351
+ }, 8, ["initial-height"])) : createCommentVNode("", true),
71881
73352
  unref(nodeStore).showCodeGenerator ? (openBlock(), createBlock(DraggableItem, {
71882
73353
  key: 4,
71883
73354
  id: "generatedCode",
@@ -71886,13 +73357,15 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
71886
73357
  "initial-position": "right",
71887
73358
  "allow-free-move": true,
71888
73359
  "allow-full-screen": true,
71889
- "on-minize": () => unref(nodeStore).setCodeGeneratorVisibility(false)
73360
+ "on-minize": () => unref(nodeStore).setCodeGeneratorVisibility(false),
73361
+ "prevent-overlap": false
71890
73362
  }, {
71891
73363
  default: withCtx(() => [
71892
73364
  createVNode(CodeGenerator)
71893
73365
  ]),
71894
73366
  _: 1
71895
- }, 8, ["on-minize"])) : createCommentVNode("", true)
73367
+ }, 8, ["on-minize"])) : createCommentVNode("", true),
73368
+ createVNode(layoutControls, { onResetLayoutGraph: handleResetLayoutGraph })
71896
73369
  ]);
71897
73370
  };
71898
73371
  }
@@ -72261,18 +73734,20 @@ const _hoisted_1 = {
72261
73734
  key: 0,
72262
73735
  class: "header"
72263
73736
  };
72264
- const _hoisted_2 = { class: "left-section" };
72265
- const _hoisted_3 = { class: "middle-section" };
72266
- const _hoisted_4 = { class: "right-section" };
72267
- const _hoisted_5 = {
73737
+ const _hoisted_2 = { class: "header-top" };
73738
+ const _hoisted_3 = { class: "left-section" };
73739
+ const _hoisted_4 = { class: "header-bottom" };
73740
+ const _hoisted_5 = { class: "middle-section" };
73741
+ const _hoisted_6 = { class: "right-section" };
73742
+ const _hoisted_7 = {
72268
73743
  key: 1,
72269
73744
  class: "loading-state"
72270
73745
  };
72271
- const _hoisted_6 = {
73746
+ const _hoisted_8 = {
72272
73747
  key: 2,
72273
73748
  class: "empty-state"
72274
73749
  };
72275
- const _hoisted_7 = { class: "empty-state-content" };
73750
+ const _hoisted_9 = { class: "empty-state-content" };
72276
73751
  const _sfc_main = /* @__PURE__ */ defineComponent({
72277
73752
  __name: "designer",
72278
73753
  setup(__props) {
@@ -72386,6 +73861,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
72386
73861
  headerButtons.value.openOpenDialog();
72387
73862
  }
72388
73863
  };
73864
+ const openQuickCreateDialog = () => {
73865
+ if (headerButtons.value) {
73866
+ console.log("Opening quick create dialog");
73867
+ headerButtons.value.handleQuickCreateAction();
73868
+ }
73869
+ };
72389
73870
  const initialSetup = async () => {
72390
73871
  if (initialLoadComplete.value) {
72391
73872
  console.log("Initial setup already completed");
@@ -72431,34 +73912,38 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
72431
73912
  return openBlock(), createElementBlock(Fragment, null, [
72432
73913
  !isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_1, [
72433
73914
  createBaseVNode("div", _hoisted_2, [
72434
- createVNode(HeaderButtons, {
72435
- ref_key: "headerButtons",
72436
- ref: headerButtons,
72437
- onOpenFlow: openFlow,
72438
- onRefreshFlow: refreshFlow
72439
- }, null, 512)
72440
- ]),
72441
- createBaseVNode("div", _hoisted_3, [
72442
- createVNode(FlowSelector, {
72443
- ref_key: "flowSelector",
72444
- ref: flowSelector,
72445
- onFlowChanged: handleFlowChange,
72446
- onCloseTab: handleCloseFlow
72447
- }, null, 512)
73915
+ createBaseVNode("div", _hoisted_3, [
73916
+ createVNode(HeaderButtons, {
73917
+ ref_key: "headerButtons",
73918
+ ref: headerButtons,
73919
+ onOpenFlow: openFlow,
73920
+ onRefreshFlow: refreshFlow
73921
+ }, null, 512)
73922
+ ])
72448
73923
  ]),
72449
73924
  createBaseVNode("div", _hoisted_4, [
72450
- createVNode(Status)
73925
+ createBaseVNode("div", _hoisted_5, [
73926
+ createVNode(FlowSelector, {
73927
+ ref_key: "flowSelector",
73928
+ ref: flowSelector,
73929
+ onFlowChanged: handleFlowChange,
73930
+ onCloseTab: handleCloseFlow
73931
+ }, null, 512)
73932
+ ]),
73933
+ createBaseVNode("div", _hoisted_6, [
73934
+ createVNode(Status)
73935
+ ])
72451
73936
  ])
72452
73937
  ])) : createCommentVNode("", true),
72453
- isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_5, _cache[2] || (_cache[2] = [
73938
+ isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_7, _cache[2] || (_cache[2] = [
72454
73939
  createBaseVNode("div", { class: "loading-state-content" }, [
72455
73940
  createBaseVNode("p", null, "Loading flows...")
72456
73941
  ], -1)
72457
- ]))) : !isLoading.value && flowsActive.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_6, [
72458
- createBaseVNode("div", _hoisted_7, [
72459
- _cache[5] || (_cache[5] = createBaseVNode("span", { class: "material-icons empty-icon" }, "account_tree", -1)),
72460
- _cache[6] || (_cache[6] = createBaseVNode("h2", null, "No Active Flows", -1)),
72461
- _cache[7] || (_cache[7] = createBaseVNode("p", null, "There are currently no active flows in the system.", -1)),
73942
+ ]))) : !isLoading.value && flowsActive.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_8, [
73943
+ createBaseVNode("div", _hoisted_9, [
73944
+ _cache[6] || (_cache[6] = createBaseVNode("span", { class: "material-icons empty-icon" }, "account_tree", -1)),
73945
+ _cache[7] || (_cache[7] = createBaseVNode("h2", null, "No Active Flows", -1)),
73946
+ _cache[8] || (_cache[8] = createBaseVNode("p", null, "There are currently no active flows in the system.", -1)),
72462
73947
  createVNode(_component_el_button, {
72463
73948
  type: "primary",
72464
73949
  class: "action-button",
@@ -72482,6 +73967,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
72482
73967
  ])),
72483
73968
  _: 1,
72484
73969
  __: [4]
73970
+ }),
73971
+ createVNode(_component_el_button, {
73972
+ type: "primary",
73973
+ class: "action-button",
73974
+ onClick: openQuickCreateDialog
73975
+ }, {
73976
+ default: withCtx(() => _cache[5] || (_cache[5] = [
73977
+ createBaseVNode("span", { class: "material-icons" }, "folder_open", -1),
73978
+ createTextVNode(" Quick create ")
73979
+ ])),
73980
+ _: 1,
73981
+ __: [5]
72485
73982
  })
72486
73983
  ])
72487
73984
  ])) : (openBlock(), createBlock(_sfc_main$4, {
@@ -72502,8 +73999,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
72502
73999
  };
72503
74000
  }
72504
74001
  });
72505
- const designer_vue_vue_type_style_index_0_scoped_cc07b037_lang = "";
72506
- const designer = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-cc07b037"]]);
74002
+ const designer_vue_vue_type_style_index_0_scoped_24dbaac4_lang = "";
74003
+ const designer = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-24dbaac4"]]);
72507
74004
  const designer$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
72508
74005
  __proto__: null,
72509
74006
  default: designer
@@ -72511,7 +74008,6 @@ const designer$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
72511
74008
  export {
72512
74009
  FileBrowser as F,
72513
74010
  designer$1 as d,
72514
- getImageUrl as g,
72515
74011
  info_filled_default as i,
72516
74012
  oneDark as o,
72517
74013
  python as p,