Flowfile 0.5.3__py3-none-any.whl → 0.5.6__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.
Files changed (153) hide show
  1. flowfile/__init__.py +16 -0
  2. flowfile/__main__.py +94 -1
  3. flowfile/web/static/assets/{AdminView-49392a9a.js → AdminView-c2c7942b.js} +1 -1
  4. flowfile/web/static/assets/{CloudConnectionView-f13f202b.js → CloudConnectionView-7a3042c6.js} +4 -4
  5. flowfile/web/static/assets/{CloudConnectionView-36bcd6df.css → CloudConnectionView-cf85f943.css} +17 -17
  6. flowfile/web/static/assets/{CloudStorageReader-0023d4a5.js → CloudStorageReader-709c4037.js} +8 -8
  7. flowfile/web/static/assets/{CloudStorageWriter-8e781e11.js → CloudStorageWriter-604c51a8.js} +8 -8
  8. flowfile/web/static/assets/ColumnActionInput-c44b7aee.css +159 -0
  9. flowfile/web/static/assets/ColumnActionInput-d63d6746.js +330 -0
  10. flowfile/web/static/assets/{ColumnSelector-8ad68ea9.js → ColumnSelector-0c8cd1cd.js} +1 -1
  11. flowfile/web/static/assets/ContextMenu-366bf1b4.js +9 -0
  12. flowfile/web/static/assets/ContextMenu-85cf5b44.js +9 -0
  13. flowfile/web/static/assets/ContextMenu-9d28ae6d.js +9 -0
  14. flowfile/web/static/assets/ContextMenu.vue_vue_type_script_setup_true_lang-774c517c.js +59 -0
  15. flowfile/web/static/assets/{CrossJoin-03df6938.js → CrossJoin-38e5b99a.js} +9 -9
  16. flowfile/web/static/assets/{CustomNode-8479239b.js → CustomNode-76e8f3f5.js} +27 -20
  17. flowfile/web/static/assets/CustomNode-edb9b939.css +42 -0
  18. flowfile/web/static/assets/{DatabaseConnectionSettings-869e3efd.js → DatabaseConnectionSettings-38155669.js} +4 -4
  19. flowfile/web/static/assets/{DatabaseConnectionSettings-e91df89a.css → DatabaseConnectionSettings-c20a1e16.css} +22 -20
  20. flowfile/web/static/assets/{DatabaseReader-c58b9552.js → DatabaseReader-2e549c8f.js} +13 -13
  21. flowfile/web/static/assets/{DatabaseReader-36898a00.css → DatabaseReader-5bf8c75b.css} +39 -44
  22. flowfile/web/static/assets/{DatabaseView-d26a9140.js → DatabaseView-dc877c29.js} +2 -2
  23. flowfile/web/static/assets/{DatabaseWriter-217a99f1.css → DatabaseWriter-bdcf2c8b.css} +27 -25
  24. flowfile/web/static/assets/{DatabaseWriter-4d05ddc7.js → DatabaseWriter-ffb91864.js} +12 -12
  25. flowfile/web/static/assets/{DesignerView-a6d0ee84.css → DesignerView-71d4e9a1.css} +429 -376
  26. flowfile/web/static/assets/{DesignerView-e6f5c0e8.js → DesignerView-a4466dab.js} +338 -183
  27. flowfile/web/static/assets/{DocumentationView-2e78ef1b.js → DocumentationView-979afc84.js} +3 -3
  28. flowfile/web/static/assets/{DocumentationView-fd46c656.css → DocumentationView-9ea6e871.css} +9 -9
  29. flowfile/web/static/assets/{ExploreData-7b54caca.js → ExploreData-e4b92aaf.js} +7 -7
  30. flowfile/web/static/assets/{ExternalSource-47ab05a3.css → ExternalSource-7ac7373f.css} +17 -17
  31. flowfile/web/static/assets/{ExternalSource-3fa399b2.js → ExternalSource-d08e7227.js} +9 -9
  32. flowfile/web/static/assets/{Filter-8cbbdbf3.js → Filter-7add806d.js} +9 -9
  33. flowfile/web/static/assets/{Formula-aac42b1e.js → Formula-36ab24d2.js} +9 -9
  34. flowfile/web/static/assets/{FuzzyMatch-cd9bbfca.js → FuzzyMatch-cc01bb04.js} +10 -10
  35. flowfile/web/static/assets/{GraphSolver-c24dec17.css → GraphSolver-4b4d7db9.css} +4 -4
  36. flowfile/web/static/assets/{GraphSolver-c7e6780e.js → GraphSolver-4fb98f3b.js} +11 -11
  37. flowfile/web/static/assets/GroupBy-5792782d.css +9 -0
  38. flowfile/web/static/assets/{GroupBy-93c5d22b.js → GroupBy-b3c8f429.js} +9 -9
  39. flowfile/web/static/assets/{Join-a19b2de2.js → Join-096b7b26.js} +10 -10
  40. flowfile/web/static/assets/{LoginView-0df4ed0a.js → LoginView-c33a246a.js} +1 -1
  41. flowfile/web/static/assets/{ManualInput-3702e677.css → ManualInput-39111f19.css} +48 -48
  42. flowfile/web/static/assets/{ManualInput-8d3374b2.js → ManualInput-7307e9b1.js} +55 -13
  43. flowfile/web/static/assets/{MultiSelect-ad1b6243.js → MultiSelect-14822c48.js} +2 -2
  44. flowfile/web/static/assets/{MultiSelect.vue_vue_type_script_setup_true_lang-e278950d.js → MultiSelect.vue_vue_type_script_setup_true_lang-90c4d340.js} +1 -1
  45. flowfile/web/static/assets/{NodeDesigner-40b647c9.js → NodeDesigner-5036c392.js} +171 -69
  46. flowfile/web/static/assets/{NodeDesigner-5f53be3f.css → NodeDesigner-94cd4dd3.css} +190 -190
  47. flowfile/web/static/assets/{NumericInput-7100234c.js → NumericInput-15cf3b72.js} +2 -2
  48. flowfile/web/static/assets/{NumericInput.vue_vue_type_script_setup_true_lang-5130219f.js → NumericInput.vue_vue_type_script_setup_true_lang-91e679d7.js} +1 -1
  49. flowfile/web/static/assets/{Output-f5efd2aa.js → Output-1f8ed42c.js} +13 -12
  50. flowfile/web/static/assets/{Output-35e97000.css → Output-692dd25d.css} +10 -10
  51. flowfile/web/static/assets/{Pivot-d981d23c.js → Pivot-0e153f4e.js} +10 -10
  52. flowfile/web/static/assets/{PivotValidation-63de1f73.js → PivotValidation-5a4f7c79.js} +1 -1
  53. flowfile/web/static/assets/{PivotValidation-39386e95.js → PivotValidation-81ec2a33.js} +1 -1
  54. flowfile/web/static/assets/{PolarsCode-f9d69217.js → PolarsCode-a39f15ac.js} +7 -7
  55. flowfile/web/static/assets/PopOver-ddcfe4f6.js +138 -0
  56. flowfile/web/static/assets/{Read-aec2e377.js → Read-39b63932.js} +15 -14
  57. flowfile/web/static/assets/{Read-36e7bd51.css → Read-90f366bc.css} +13 -13
  58. flowfile/web/static/assets/{RecordCount-78ed6845.js → RecordCount-e9048ccd.js} +6 -6
  59. flowfile/web/static/assets/{RecordId-2156e890.js → RecordId-ad02521d.js} +9 -9
  60. flowfile/web/static/assets/{SQLQueryComponent-48c72f5b.js → SQLQueryComponent-2eeecf0b.js} +3 -3
  61. flowfile/web/static/assets/SQLQueryComponent-edb90b98.css +29 -0
  62. flowfile/web/static/assets/{Sample-1352ca74.js → Sample-9a68c23d.js} +6 -6
  63. flowfile/web/static/assets/{SecretSelector-22b5ff89.js → SecretSelector-2429f35a.js} +2 -2
  64. flowfile/web/static/assets/{SecretsView-17df66ee.js → SecretsView-c6afc915.js} +2 -2
  65. flowfile/web/static/assets/{Select-0aee4c54.js → Select-fcd002b6.js} +9 -9
  66. flowfile/web/static/assets/{SettingsSection-cd341bb6.js → SettingsSection-5ce15962.js} +1 -1
  67. flowfile/web/static/assets/{SettingsSection-0784e157.js → SettingsSection-c6b1362c.js} +1 -1
  68. flowfile/web/static/assets/{SettingsSection-f2002a6d.js → SettingsSection-cebb91d5.js} +1 -1
  69. flowfile/web/static/assets/SetupView-2d12e01f.js +160 -0
  70. flowfile/web/static/assets/SetupView-ec26f76a.css +230 -0
  71. flowfile/web/static/assets/{SingleSelect-460cc0ea.js → SingleSelect-b67de4eb.js} +2 -2
  72. flowfile/web/static/assets/{SingleSelect.vue_vue_type_script_setup_true_lang-30741bb2.js → SingleSelect.vue_vue_type_script_setup_true_lang-eedb70eb.js} +1 -1
  73. flowfile/web/static/assets/{SliderInput-5d926864.js → SliderInput-fd8134ac.js} +1 -1
  74. flowfile/web/static/assets/Sort-4abb7fae.css +9 -0
  75. flowfile/web/static/assets/{Sort-3cdc971b.js → Sort-c005a573.js} +9 -9
  76. flowfile/web/static/assets/{TextInput-a2d0bfbd.js → TextInput-1bb31dab.js} +2 -2
  77. flowfile/web/static/assets/{TextInput.vue_vue_type_script_setup_true_lang-abad1ca2.js → TextInput.vue_vue_type_script_setup_true_lang-a51fe730.js} +1 -1
  78. flowfile/web/static/assets/{TextToRows-918945f7.js → TextToRows-4f363753.js} +9 -9
  79. flowfile/web/static/assets/{ToggleSwitch-f0ef5196.js → ToggleSwitch-ca0f2e5e.js} +2 -2
  80. flowfile/web/static/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-5605c793.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-49aa41d8.js} +1 -1
  81. flowfile/web/static/assets/{UnavailableFields-54d2f518.css → UnavailableFields-394a1f78.css} +13 -13
  82. flowfile/web/static/assets/{UnavailableFields-bdad6144.js → UnavailableFields-f6147968.js} +4 -4
  83. flowfile/web/static/assets/{Union-e8ab8c86.js → Union-c65f17b7.js} +6 -6
  84. flowfile/web/static/assets/Unique-2b705521.css +3 -0
  85. flowfile/web/static/assets/{Unique-8cd4f976.js → Unique-a1d96fb2.js} +12 -12
  86. flowfile/web/static/assets/{Unpivot-710a2948.css → Unpivot-b6ad6427.css} +6 -6
  87. flowfile/web/static/assets/{Unpivot-8da14095.js → Unpivot-c2657ff3.js} +11 -11
  88. flowfile/web/static/assets/{UnpivotValidation-6f7d89ff.js → UnpivotValidation-28e29a3b.js} +1 -1
  89. flowfile/web/static/assets/{VueGraphicWalker-3fb312e1.js → VueGraphicWalker-2fc3ddd4.js} +1 -1
  90. flowfile/web/static/assets/{api-24483f0d.js → api-df48ec50.js} +1 -1
  91. flowfile/web/static/assets/{api-8b81fa73.js → api-ee542cf7.js} +1 -1
  92. flowfile/web/static/assets/{dropDown-3d8dc5fa.css → dropDown-1d6acbd9.css} +26 -26
  93. flowfile/web/static/assets/{dropDown-ac0fda9d.js → dropDown-7576a76a.js} +3 -3
  94. flowfile/web/static/assets/{fullEditor-5497a84a.js → fullEditor-7583bef5.js} +3 -3
  95. flowfile/web/static/assets/{fullEditor-a0be62b3.css → fullEditor-fe9f7e18.css} +3 -3
  96. flowfile/web/static/assets/{genericNodeSettings-99014e1d.js → genericNodeSettings-0155288b.js} +2 -3
  97. flowfile/web/static/assets/{index-3ba44389.js → index-057d770d.js} +2 -2
  98. flowfile/web/static/assets/{index-07dda503.js → index-aeec439d.js} +1 -1
  99. flowfile/web/static/assets/{index-fb6493ae.js → index-ca6799de.js} +2293 -196
  100. flowfile/web/static/assets/{index-e6289dd0.css → index-d60c9dd4.css} +560 -10
  101. flowfile/web/static/assets/nodeInput-d478b9ac.js +2 -0
  102. flowfile/web/static/assets/{outputCsv-8f8ba42d.js → outputCsv-c492b15e.js} +3 -3
  103. flowfile/web/static/assets/outputCsv-cc84e09f.css +2499 -0
  104. flowfile/web/static/assets/{outputExcel-393f4fef.js → outputExcel-13bfa10f.js} +1 -1
  105. flowfile/web/static/assets/{outputParquet-07c81f65.js → outputParquet-9be1523a.js} +1 -1
  106. flowfile/web/static/assets/{readCsv-07f6d9ad.js → readCsv-5a49a8c9.js} +1 -1
  107. flowfile/web/static/assets/{readExcel-ed69bc8f.js → readExcel-27c30ad8.js} +3 -3
  108. flowfile/web/static/assets/{readParquet-e3ed4528.js → readParquet-446bde68.js} +1 -1
  109. flowfile/web/static/assets/{secrets.api-002e7d7e.js → secrets.api-34431884.js} +1 -1
  110. flowfile/web/static/assets/{selectDynamic-80b92899.js → selectDynamic-5754a2b1.js} +2 -3
  111. flowfile/web/static/assets/{vue-codemirror.esm-0965f39f.js → vue-codemirror.esm-8f46fb36.js} +1 -1
  112. flowfile/web/static/assets/{vue-content-loader.es-c506ad97.js → vue-content-loader.es-808fe33a.js} +1 -1
  113. flowfile/web/static/index.html +2 -2
  114. {flowfile-0.5.3.dist-info → flowfile-0.5.6.dist-info}/METADATA +2 -2
  115. {flowfile-0.5.3.dist-info → flowfile-0.5.6.dist-info}/RECORD +139 -134
  116. flowfile_core/auth/secrets.py +56 -13
  117. flowfile_core/fileExplorer/funcs.py +26 -4
  118. flowfile_core/flowfile/code_generator/__init__.py +11 -0
  119. flowfile_core/flowfile/code_generator/code_generator.py +347 -2
  120. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +13 -1
  121. flowfile_core/flowfile/flow_data_engine/subprocess_operations/subprocess_operations.py +12 -0
  122. flowfile_core/flowfile/flow_graph.py +2 -0
  123. flowfile_core/flowfile/flow_node/flow_node.py +52 -28
  124. flowfile_core/flowfile/node_designer/__init__.py +4 -0
  125. flowfile_core/flowfile/node_designer/ui_components.py +144 -1
  126. flowfile_core/main.py +2 -4
  127. flowfile_core/routes/public.py +43 -1
  128. flowfile_core/schemas/cloud_storage_schemas.py +39 -15
  129. flowfile_core/secret_manager/secret_manager.py +107 -6
  130. flowfile_frame/__init__.py +11 -0
  131. flowfile_frame/database/__init__.py +36 -0
  132. flowfile_frame/database/connection_manager.py +205 -0
  133. flowfile_frame/database/frame_helpers.py +249 -0
  134. flowfile_worker/configs.py +31 -15
  135. flowfile_worker/secrets.py +105 -15
  136. flowfile_worker/spawner.py +10 -6
  137. flowfile/web/static/assets/ContextMenu-26d4dd27.css +0 -26
  138. flowfile/web/static/assets/ContextMenu-31ee57f0.js +0 -41
  139. flowfile/web/static/assets/ContextMenu-69a74055.js +0 -41
  140. flowfile/web/static/assets/ContextMenu-8e2051c6.js +0 -41
  141. flowfile/web/static/assets/ContextMenu-8ec1729e.css +0 -26
  142. flowfile/web/static/assets/ContextMenu-9b310c60.css +0 -26
  143. flowfile/web/static/assets/CustomNode-59e99a86.css +0 -32
  144. flowfile/web/static/assets/GroupBy-be7ac0bf.css +0 -51
  145. flowfile/web/static/assets/PopOver-b22f049e.js +0 -939
  146. flowfile/web/static/assets/SQLQueryComponent-1c2f26b4.css +0 -27
  147. flowfile/web/static/assets/Sort-8a871341.css +0 -51
  148. flowfile/web/static/assets/Unique-9fb2f567.css +0 -51
  149. flowfile/web/static/assets/nodeInput-0eb13f1a.js +0 -2
  150. flowfile/web/static/assets/outputCsv-b9a072af.css +0 -2499
  151. {flowfile-0.5.3.dist-info → flowfile-0.5.6.dist-info}/WHEEL +0 -0
  152. {flowfile-0.5.3.dist-info → flowfile-0.5.6.dist-info}/entry_points.txt +0 -0
  153. {flowfile-0.5.3.dist-info → flowfile-0.5.6.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,330 @@
1
+ import { d as defineComponent, r as ref, G as computed, H as watch, J as onMounted, q as onUnmounted, y as resolveComponent, o as openBlock, c as createElementBlock, a as createBaseVNode, t as toDisplayString, z as createVNode, A as withCtx, K as Fragment, L as renderList, C as createBlock, e as createCommentVNode, n as normalizeClass, w as withModifiers, a4 as normalizeStyle, B as unref, ay as ElIcon, g as _export_sfc } from "./index-ca6799de.js";
2
+ import { d as delete_default } from "./DesignerView-a4466dab.js";
3
+ import "./PopOver-ddcfe4f6.js";
4
+ import "./index-057d770d.js";
5
+ import "./vue-codemirror.esm-8f46fb36.js";
6
+ const _hoisted_1 = { class: "component-container" };
7
+ const _hoisted_2 = { class: "listbox-subtitle" };
8
+ const _hoisted_3 = {
9
+ key: 0,
10
+ class: "config-section"
11
+ };
12
+ const _hoisted_4 = {
13
+ key: 0,
14
+ class: "config-row"
15
+ };
16
+ const _hoisted_5 = { class: "column-type" };
17
+ const _hoisted_6 = {
18
+ key: 1,
19
+ class: "config-row"
20
+ };
21
+ const _hoisted_7 = { class: "column-type" };
22
+ const _hoisted_8 = { class: "column-list-wrapper" };
23
+ const _hoisted_9 = { class: "listbox" };
24
+ const _hoisted_10 = ["onClick", "onContextmenu"];
25
+ const _hoisted_11 = ["onClick"];
26
+ const _hoisted_12 = {
27
+ key: 2,
28
+ class: "table-wrapper"
29
+ };
30
+ const _hoisted_13 = { class: "styled-table" };
31
+ const _hoisted_14 = { class: "action-cell" };
32
+ const _hoisted_15 = {
33
+ key: 3,
34
+ class: "empty-state"
35
+ };
36
+ const _sfc_main = /* @__PURE__ */ defineComponent({
37
+ __name: "ColumnActionInput",
38
+ props: {
39
+ schema: {
40
+ type: Object,
41
+ required: true
42
+ },
43
+ modelValue: {
44
+ type: Object,
45
+ default: () => ({
46
+ rows: [],
47
+ group_by_columns: [],
48
+ order_by_column: null
49
+ })
50
+ },
51
+ incomingColumns: {
52
+ type: Array,
53
+ default: () => []
54
+ }
55
+ },
56
+ emits: ["update:modelValue"],
57
+ setup(__props, { emit: __emit }) {
58
+ const props = __props;
59
+ const emit = __emit;
60
+ const localValue = ref({
61
+ rows: [],
62
+ group_by_columns: [],
63
+ order_by_column: null
64
+ });
65
+ const selectedColumns = ref([]);
66
+ const showContextMenu = ref(false);
67
+ const contextMenuPosition = ref({ x: 0, y: 0 });
68
+ const contextMenuRef = ref(null);
69
+ const firstSelectedIndex = ref(null);
70
+ const allColumns = computed(() => props.incomingColumns);
71
+ const filteredColumns = computed(() => {
72
+ if (!props.schema.data_types || props.schema.data_types === "ALL") {
73
+ return props.incomingColumns;
74
+ }
75
+ if (Array.isArray(props.schema.data_types)) {
76
+ return props.incomingColumns.filter(
77
+ (column) => props.schema.data_types.includes(column.data_type)
78
+ );
79
+ }
80
+ return props.incomingColumns;
81
+ });
82
+ watch(
83
+ () => props.modelValue,
84
+ (newValue) => {
85
+ if (newValue) {
86
+ localValue.value = {
87
+ rows: newValue.rows || [],
88
+ group_by_columns: newValue.group_by_columns || [],
89
+ order_by_column: newValue.order_by_column || null
90
+ };
91
+ }
92
+ },
93
+ { immediate: true, deep: true }
94
+ );
95
+ const emitUpdate = () => {
96
+ emit("update:modelValue", { ...localValue.value });
97
+ };
98
+ const generateOutputName = (column, action) => {
99
+ return props.schema.output_name_template.replace("{column}", column).replace("{action}", action);
100
+ };
101
+ const handleColumnClick = (clickedIndex, columnName, event) => {
102
+ if (event.shiftKey && firstSelectedIndex.value !== null) {
103
+ const start = Math.min(firstSelectedIndex.value, clickedIndex);
104
+ const end = Math.max(firstSelectedIndex.value, clickedIndex);
105
+ selectedColumns.value = filteredColumns.value.slice(start, end + 1).map((col) => col.name);
106
+ } else {
107
+ if (selectedColumns.value.length === 1 && selectedColumns.value[0] === columnName) {
108
+ selectedColumns.value = [];
109
+ firstSelectedIndex.value = null;
110
+ } else {
111
+ firstSelectedIndex.value = clickedIndex;
112
+ selectedColumns.value = [columnName];
113
+ }
114
+ }
115
+ };
116
+ const openContextMenu = (columnName, event) => {
117
+ event.preventDefault();
118
+ if (!selectedColumns.value.includes(columnName)) {
119
+ selectedColumns.value = [columnName];
120
+ }
121
+ contextMenuPosition.value = { x: event.clientX, y: event.clientY };
122
+ showContextMenu.value = true;
123
+ };
124
+ const addRow = (action) => {
125
+ selectedColumns.value.forEach((column) => {
126
+ const newRow = {
127
+ column,
128
+ action,
129
+ output_name: generateOutputName(column, action)
130
+ };
131
+ localValue.value.rows.push(newRow);
132
+ });
133
+ showContextMenu.value = false;
134
+ selectedColumns.value = [];
135
+ emitUpdate();
136
+ };
137
+ const removeRow = (index) => {
138
+ localValue.value.rows.splice(index, 1);
139
+ emitUpdate();
140
+ };
141
+ const updateOutputName = (index) => {
142
+ const row = localValue.value.rows[index];
143
+ row.output_name = generateOutputName(row.column, row.action);
144
+ emitUpdate();
145
+ };
146
+ const handleClickOutside = (event) => {
147
+ var _a;
148
+ if (!((_a = contextMenuRef.value) == null ? void 0 : _a.contains(event.target))) {
149
+ showContextMenu.value = false;
150
+ }
151
+ };
152
+ onMounted(() => {
153
+ window.addEventListener("click", handleClickOutside);
154
+ });
155
+ onUnmounted(() => {
156
+ window.removeEventListener("click", handleClickOutside);
157
+ });
158
+ return (_ctx, _cache) => {
159
+ const _component_el_option = resolveComponent("el-option");
160
+ const _component_el_select = resolveComponent("el-select");
161
+ const _component_el_input = resolveComponent("el-input");
162
+ const _component_el_button = resolveComponent("el-button");
163
+ return openBlock(), createElementBlock("div", _hoisted_1, [
164
+ createBaseVNode("label", _hoisted_2, toDisplayString(__props.schema.label), 1),
165
+ __props.schema.show_group_by || __props.schema.show_order_by ? (openBlock(), createElementBlock("div", _hoisted_3, [
166
+ __props.schema.show_group_by ? (openBlock(), createElementBlock("div", _hoisted_4, [
167
+ _cache[2] || (_cache[2] = createBaseVNode("label", { class: "config-label" }, "Group By (optional)", -1)),
168
+ createVNode(_component_el_select, {
169
+ modelValue: localValue.value.group_by_columns,
170
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => localValue.value.group_by_columns = $event),
171
+ multiple: "",
172
+ filterable: "",
173
+ placeholder: "Select columns to group by...",
174
+ style: { "width": "100%" },
175
+ onChange: emitUpdate
176
+ }, {
177
+ default: withCtx(() => [
178
+ (openBlock(true), createElementBlock(Fragment, null, renderList(allColumns.value, (column) => {
179
+ return openBlock(), createBlock(_component_el_option, {
180
+ key: column.name,
181
+ label: column.name,
182
+ value: column.name
183
+ }, {
184
+ default: withCtx(() => [
185
+ createBaseVNode("span", null, toDisplayString(column.name), 1),
186
+ createBaseVNode("span", _hoisted_5, toDisplayString(column.data_type), 1)
187
+ ]),
188
+ _: 2
189
+ }, 1032, ["label", "value"]);
190
+ }), 128))
191
+ ]),
192
+ _: 1
193
+ }, 8, ["modelValue"])
194
+ ])) : createCommentVNode("", true),
195
+ __props.schema.show_order_by ? (openBlock(), createElementBlock("div", _hoisted_6, [
196
+ _cache[3] || (_cache[3] = createBaseVNode("label", { class: "config-label" }, "Order By (optional)", -1)),
197
+ createVNode(_component_el_select, {
198
+ modelValue: localValue.value.order_by_column,
199
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => localValue.value.order_by_column = $event),
200
+ filterable: "",
201
+ clearable: "",
202
+ placeholder: "Select column to order by...",
203
+ style: { "width": "100%" },
204
+ onChange: emitUpdate
205
+ }, {
206
+ default: withCtx(() => [
207
+ (openBlock(true), createElementBlock(Fragment, null, renderList(allColumns.value, (column) => {
208
+ return openBlock(), createBlock(_component_el_option, {
209
+ key: column.name,
210
+ label: column.name,
211
+ value: column.name
212
+ }, {
213
+ default: withCtx(() => [
214
+ createBaseVNode("span", null, toDisplayString(column.name), 1),
215
+ createBaseVNode("span", _hoisted_7, toDisplayString(column.data_type), 1)
216
+ ]),
217
+ _: 2
218
+ }, 1032, ["label", "value"]);
219
+ }), 128))
220
+ ]),
221
+ _: 1
222
+ }, 8, ["modelValue"])
223
+ ])) : createCommentVNode("", true)
224
+ ])) : createCommentVNode("", true),
225
+ createBaseVNode("div", _hoisted_8, [
226
+ _cache[4] || (_cache[4] = createBaseVNode("div", { class: "listbox-subtitle" }, "Available Columns", -1)),
227
+ createBaseVNode("ul", _hoisted_9, [
228
+ (openBlock(true), createElementBlock(Fragment, null, renderList(filteredColumns.value, (column, index) => {
229
+ return openBlock(), createElementBlock("li", {
230
+ key: column.name,
231
+ class: normalizeClass({ "is-selected": selectedColumns.value.includes(column.name) }),
232
+ onClick: ($event) => handleColumnClick(index, column.name, $event),
233
+ onContextmenu: withModifiers(($event) => openContextMenu(column.name, $event), ["prevent"])
234
+ }, toDisplayString(column.name) + " (" + toDisplayString(column.data_type) + ") ", 43, _hoisted_10);
235
+ }), 128))
236
+ ])
237
+ ]),
238
+ showContextMenu.value ? (openBlock(), createElementBlock("div", {
239
+ key: 1,
240
+ ref_key: "contextMenuRef",
241
+ ref: contextMenuRef,
242
+ class: "context-menu",
243
+ style: normalizeStyle({
244
+ top: contextMenuPosition.value.y + "px",
245
+ left: contextMenuPosition.value.x + "px"
246
+ })
247
+ }, [
248
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.schema.actions, (action) => {
249
+ return openBlock(), createElementBlock("button", {
250
+ key: action.value,
251
+ onClick: ($event) => addRow(action.value)
252
+ }, toDisplayString(action.label), 9, _hoisted_11);
253
+ }), 128))
254
+ ], 4)) : createCommentVNode("", true),
255
+ _cache[7] || (_cache[7] = createBaseVNode("div", { class: "listbox-subtitle" }, "Settings", -1)),
256
+ localValue.value.rows.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_12, [
257
+ createBaseVNode("table", _hoisted_13, [
258
+ _cache[5] || (_cache[5] = createBaseVNode("thead", null, [
259
+ createBaseVNode("tr", null, [
260
+ createBaseVNode("th", null, "Field"),
261
+ createBaseVNode("th", null, "Action"),
262
+ createBaseVNode("th", null, "Output Field Name"),
263
+ createBaseVNode("th")
264
+ ])
265
+ ], -1)),
266
+ createBaseVNode("tbody", null, [
267
+ (openBlock(true), createElementBlock(Fragment, null, renderList(localValue.value.rows, (row, index) => {
268
+ return openBlock(), createElementBlock("tr", { key: index }, [
269
+ createBaseVNode("td", null, toDisplayString(row.column), 1),
270
+ createBaseVNode("td", null, [
271
+ createVNode(_component_el_select, {
272
+ modelValue: row.action,
273
+ "onUpdate:modelValue": ($event) => row.action = $event,
274
+ size: "small",
275
+ onChange: ($event) => updateOutputName(index)
276
+ }, {
277
+ default: withCtx(() => [
278
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.schema.actions, (action) => {
279
+ return openBlock(), createBlock(_component_el_option, {
280
+ key: action.value,
281
+ label: action.label,
282
+ value: action.value
283
+ }, null, 8, ["label", "value"]);
284
+ }), 128))
285
+ ]),
286
+ _: 2
287
+ }, 1032, ["modelValue", "onUpdate:modelValue", "onChange"])
288
+ ]),
289
+ createBaseVNode("td", null, [
290
+ createVNode(_component_el_input, {
291
+ modelValue: row.output_name,
292
+ "onUpdate:modelValue": ($event) => row.output_name = $event,
293
+ size: "small",
294
+ onChange: emitUpdate
295
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
296
+ ]),
297
+ createBaseVNode("td", _hoisted_14, [
298
+ createVNode(_component_el_button, {
299
+ type: "danger",
300
+ circle: "",
301
+ onClick: ($event) => removeRow(index)
302
+ }, {
303
+ default: withCtx(() => [
304
+ createVNode(unref(ElIcon), null, {
305
+ default: withCtx(() => [
306
+ createVNode(unref(delete_default))
307
+ ]),
308
+ _: 1
309
+ })
310
+ ]),
311
+ _: 2
312
+ }, 1032, ["onClick"])
313
+ ])
314
+ ]);
315
+ }), 128))
316
+ ])
317
+ ])
318
+ ])) : (openBlock(), createElementBlock("div", _hoisted_15, _cache[6] || (_cache[6] = [
319
+ createBaseVNode("p", null, "No rows configured.", -1),
320
+ createBaseVNode("p", { class: "hint" }, "Right-click on a column above to add a row.", -1)
321
+ ])))
322
+ ]);
323
+ };
324
+ }
325
+ });
326
+ const ColumnActionInput_vue_vue_type_style_index_0_scoped_d3070256_lang = "";
327
+ const ColumnActionInput = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d3070256"]]);
328
+ export {
329
+ ColumnActionInput as default
330
+ };
@@ -1,4 +1,4 @@
1
- import { d as defineComponent, A as computed, l as resolveComponent, o as openBlock, c as createElementBlock, b as createBaseVNode, q as createTextVNode, t as toDisplayString, f as createCommentVNode, m as createVNode, p as withCtx, F as Fragment, D as renderList, x as createBlock, i as _export_sfc } from "./index-fb6493ae.js";
1
+ import { d as defineComponent, G as computed, y as resolveComponent, o as openBlock, c as createElementBlock, a as createBaseVNode, f as createTextVNode, t as toDisplayString, e as createCommentVNode, z as createVNode, A as withCtx, K as Fragment, L as renderList, C as createBlock, g as _export_sfc } from "./index-ca6799de.js";
2
2
  const _hoisted_1 = { class: "component-container" };
3
3
  const _hoisted_2 = { class: "listbox-subtitle" };
4
4
  const _hoisted_3 = {
@@ -0,0 +1,9 @@
1
+ import "./index-ca6799de.js";
2
+ import "./DesignerView-a4466dab.js";
3
+ import { _ as _sfc_main } from "./ContextMenu.vue_vue_type_script_setup_true_lang-774c517c.js";
4
+ import "./PopOver-ddcfe4f6.js";
5
+ import "./index-057d770d.js";
6
+ import "./vue-codemirror.esm-8f46fb36.js";
7
+ export {
8
+ _sfc_main as default
9
+ };
@@ -0,0 +1,9 @@
1
+ import "./index-ca6799de.js";
2
+ import "./DesignerView-a4466dab.js";
3
+ import { _ as _sfc_main } from "./ContextMenu.vue_vue_type_script_setup_true_lang-774c517c.js";
4
+ import "./PopOver-ddcfe4f6.js";
5
+ import "./index-057d770d.js";
6
+ import "./vue-codemirror.esm-8f46fb36.js";
7
+ export {
8
+ _sfc_main as default
9
+ };
@@ -0,0 +1,9 @@
1
+ import "./index-ca6799de.js";
2
+ import "./DesignerView-a4466dab.js";
3
+ import { _ as _sfc_main } from "./ContextMenu.vue_vue_type_script_setup_true_lang-774c517c.js";
4
+ import "./PopOver-ddcfe4f6.js";
5
+ import "./index-057d770d.js";
6
+ import "./vue-codemirror.esm-8f46fb36.js";
7
+ export {
8
+ _sfc_main as default
9
+ };
@@ -0,0 +1,59 @@
1
+ import { d as defineComponent, r as ref, J as onMounted, q as onUnmounted, o as openBlock, c as createElementBlock, a as createBaseVNode, K as Fragment, L as renderList, n as normalizeClass, t as toDisplayString, a4 as normalizeStyle } from "./index-ca6799de.js";
2
+ const _hoisted_1 = ["onClick"];
3
+ const _sfc_main = /* @__PURE__ */ defineComponent({
4
+ __name: "ContextMenu",
5
+ props: {
6
+ position: {},
7
+ options: {}
8
+ },
9
+ emits: ["select", "close"],
10
+ setup(__props, { emit: __emit }) {
11
+ const emit = __emit;
12
+ const menuRef = ref(null);
13
+ const selectOption = (option) => {
14
+ if (option.disabled)
15
+ return;
16
+ emit("select", option.action);
17
+ emit("close");
18
+ };
19
+ const handleClickOutside = (event) => {
20
+ if (menuRef.value && !menuRef.value.contains(event.target)) {
21
+ emit("close");
22
+ }
23
+ };
24
+ const handleKeyDown = (event) => {
25
+ if (event.key === "Escape") {
26
+ emit("close");
27
+ }
28
+ };
29
+ onMounted(() => {
30
+ document.addEventListener("mousedown", handleClickOutside);
31
+ document.addEventListener("keydown", handleKeyDown);
32
+ });
33
+ onUnmounted(() => {
34
+ document.removeEventListener("mousedown", handleClickOutside);
35
+ document.removeEventListener("keydown", handleKeyDown);
36
+ });
37
+ return (_ctx, _cache) => {
38
+ return openBlock(), createElementBlock("div", {
39
+ ref_key: "menuRef",
40
+ ref: menuRef,
41
+ class: "context-menu",
42
+ style: normalizeStyle({ top: _ctx.position.y + "px", left: _ctx.position.x + "px" })
43
+ }, [
44
+ createBaseVNode("ul", null, [
45
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.options, (option) => {
46
+ return openBlock(), createElementBlock("li", {
47
+ key: option.action,
48
+ class: normalizeClass({ disabled: option.disabled, danger: option.danger }),
49
+ onClick: ($event) => selectOption(option)
50
+ }, toDisplayString(option.label), 11, _hoisted_1);
51
+ }), 128))
52
+ ])
53
+ ], 4);
54
+ };
55
+ }
56
+ });
57
+ export {
58
+ _sfc_main as _
59
+ };
@@ -1,12 +1,12 @@
1
- import { C as CodeLoader } from "./vue-content-loader.es-c506ad97.js";
2
- import { u as useNodeStore } from "./PopOver-b22f049e.js";
3
- import { d as defineComponent, r as ref, o as openBlock, c as createElementBlock, m as createVNode, p as withCtx, b as createBaseVNode, x as createBlock, s as unref, i as _export_sfc } from "./index-fb6493ae.js";
4
- import { s as selectDynamic } from "./selectDynamic-80b92899.js";
5
- import { G as GenericNodeSettings } from "./genericNodeSettings-99014e1d.js";
6
- import "./UnavailableFields-bdad6144.js";
7
- import "./DesignerView-e6f5c0e8.js";
8
- import "./index-3ba44389.js";
9
- import "./vue-codemirror.esm-0965f39f.js";
1
+ import { C as CodeLoader } from "./vue-content-loader.es-808fe33a.js";
2
+ import { d as defineComponent, r as ref, l as useNodeStore, o as openBlock, c as createElementBlock, z as createVNode, A as withCtx, a as createBaseVNode, C as createBlock, B as unref, g as _export_sfc } from "./index-ca6799de.js";
3
+ import { s as selectDynamic } from "./selectDynamic-5754a2b1.js";
4
+ import { G as GenericNodeSettings } from "./genericNodeSettings-0155288b.js";
5
+ import "./UnavailableFields-f6147968.js";
6
+ import "./PopOver-ddcfe4f6.js";
7
+ import "./DesignerView-a4466dab.js";
8
+ import "./index-057d770d.js";
9
+ import "./vue-codemirror.esm-8f46fb36.js";
10
10
  const _hoisted_1 = { key: 0 };
11
11
  const _hoisted_2 = { class: "listbox-wrapper" };
12
12
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -1,18 +1,19 @@
1
- import { j as axios, d as defineComponent, r as ref, o as openBlock, c as createElementBlock, b as createBaseVNode, q as createTextVNode, t as toDisplayString, f as createCommentVNode, m as createVNode, p as withCtx, F as Fragment, D as renderList, g as withDirectives, ai as vShow, x as createBlock, i as _export_sfc } from "./index-fb6493ae.js";
2
- import { u as useNodeStore } from "./PopOver-b22f049e.js";
3
- import { G as GenericNodeSettings } from "./genericNodeSettings-99014e1d.js";
4
- import { _ as _sfc_main$3 } from "./MultiSelect.vue_vue_type_script_setup_true_lang-e278950d.js";
5
- import { _ as _sfc_main$5 } from "./ToggleSwitch.vue_vue_type_script_setup_true_lang-5605c793.js";
6
- import { _ as _sfc_main$1 } from "./TextInput.vue_vue_type_script_setup_true_lang-abad1ca2.js";
7
- import { _ as _sfc_main$2 } from "./NumericInput.vue_vue_type_script_setup_true_lang-5130219f.js";
8
- import SliderInput from "./SliderInput-5d926864.js";
9
- import { _ as _sfc_main$4 } from "./SingleSelect.vue_vue_type_script_setup_true_lang-30741bb2.js";
10
- import ColumnSelector from "./ColumnSelector-8ad68ea9.js";
11
- import SecretSelector from "./SecretSelector-22b5ff89.js";
12
- import "./DesignerView-e6f5c0e8.js";
13
- import "./index-3ba44389.js";
14
- import "./vue-codemirror.esm-0965f39f.js";
15
- import "./secrets.api-002e7d7e.js";
1
+ import { k as axios, d as defineComponent, r as ref, l as useNodeStore, o as openBlock, c as createElementBlock, a as createBaseVNode, f as createTextVNode, t as toDisplayString, e as createCommentVNode, z as createVNode, A as withCtx, K as Fragment, L as renderList, i as withDirectives, ap as vShow, C as createBlock, g as _export_sfc } from "./index-ca6799de.js";
2
+ import { G as GenericNodeSettings } from "./genericNodeSettings-0155288b.js";
3
+ import { _ as _sfc_main$3 } from "./MultiSelect.vue_vue_type_script_setup_true_lang-90c4d340.js";
4
+ import { _ as _sfc_main$5 } from "./ToggleSwitch.vue_vue_type_script_setup_true_lang-49aa41d8.js";
5
+ import { _ as _sfc_main$1 } from "./TextInput.vue_vue_type_script_setup_true_lang-a51fe730.js";
6
+ import { _ as _sfc_main$2 } from "./NumericInput.vue_vue_type_script_setup_true_lang-91e679d7.js";
7
+ import SliderInput from "./SliderInput-fd8134ac.js";
8
+ import { _ as _sfc_main$4 } from "./SingleSelect.vue_vue_type_script_setup_true_lang-eedb70eb.js";
9
+ import ColumnSelector from "./ColumnSelector-0c8cd1cd.js";
10
+ import SecretSelector from "./SecretSelector-2429f35a.js";
11
+ import ColumnActionInput from "./ColumnActionInput-d63d6746.js";
12
+ import "./DesignerView-a4466dab.js";
13
+ import "./PopOver-ddcfe4f6.js";
14
+ import "./index-057d770d.js";
15
+ import "./vue-codemirror.esm-8f46fb36.js";
16
+ import "./secrets.api-34431884.js";
16
17
  async function getCustomNodeSchema(flowId, nodeId) {
17
18
  const response = await axios.get(
18
19
  `/user_defined_components/custom-node-schema`,
@@ -39,14 +40,14 @@ const _hoisted_4 = {
39
40
  key: 0,
40
41
  class: "listbox-subtitle"
41
42
  };
42
- const _hoisted_5 = { class: "listbox-subtitle" };
43
+ const _hoisted_5 = { class: "section-title" };
43
44
  const _hoisted_6 = {
44
45
  key: 0,
45
46
  class: "section-description"
46
47
  };
47
48
  const _hoisted_7 = { class: "components-container" };
48
49
  const _hoisted_8 = {
49
- key: 8,
50
+ key: 9,
50
51
  class: "text-red-500 text-xs"
51
52
  };
52
53
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -201,7 +202,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
201
202
  modelValue: formData.value[sectionKey][componentKey],
202
203
  "onUpdate:modelValue": ($event) => formData.value[sectionKey][componentKey] = $event,
203
204
  schema: component
204
- }, null, 8, ["modelValue", "onUpdate:modelValue", "schema"])) : (openBlock(), createElementBlock("div", _hoisted_8, " Unknown component type: " + toDisplayString(component.component_type), 1))
205
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "schema"])) : component.component_type === "ColumnActionInput" ? (openBlock(), createBlock(ColumnActionInput, {
206
+ key: 8,
207
+ modelValue: formData.value[sectionKey][componentKey],
208
+ "onUpdate:modelValue": ($event) => formData.value[sectionKey][componentKey] = $event,
209
+ schema: component,
210
+ "incoming-columns": columnTypes.value
211
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "schema", "incoming-columns"])) : (openBlock(), createElementBlock("div", _hoisted_8, " Unknown component type: " + toDisplayString(component.component_type), 1))
205
212
  ]);
206
213
  }), 128))
207
214
  ])
@@ -216,8 +223,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
216
223
  };
217
224
  }
218
225
  });
219
- const CustomNode_vue_vue_type_style_index_0_scoped_04422d4f_lang = "";
220
- const CustomNode = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-04422d4f"]]);
226
+ const CustomNode_vue_vue_type_style_index_0_scoped_69093399_lang = "";
227
+ const CustomNode = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-69093399"]]);
221
228
  export {
222
229
  CustomNode as default
223
230
  };
@@ -0,0 +1,42 @@
1
+
2
+ .custom-node-wrapper[data-v-69093399] {
3
+ padding: 1.5rem;
4
+ background-color: var(--color-background-primary);
5
+ }
6
+ .node-header[data-v-69093399] {
7
+ padding-bottom: 1rem;
8
+ border-bottom: 1px solid var(--color-border-primary);
9
+ margin-bottom: 1.5rem;
10
+ }
11
+ .node-title[data-v-69093399] {
12
+ font-size: 1.25rem;
13
+ font-weight: 700;
14
+ color: var(--color-text-primary);
15
+ }
16
+ .node-category[data-v-69093399] {
17
+ font-size: 0.875rem;
18
+ color: var(--color-text-secondary);
19
+ margin-top: 0.25rem;
20
+ }
21
+ .section-description[data-v-69093399] {
22
+ font-size: 0.875rem;
23
+ color: var(--color-text-secondary);
24
+ margin-top: 0.25rem;
25
+ margin-bottom: 1.25rem;
26
+ padding-left: 0.5rem;
27
+ }
28
+ .components-container[data-v-69093399] {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: 1.25rem;
32
+ }
33
+ .section-title[data-v-69093399] {
34
+ font-size: var(--font-size-lg, 15px);
35
+ font-weight: var(--font-weight-semibold, 600);
36
+ color: var(--color-text-primary);
37
+ padding: var(--spacing-3, 12px) var(--spacing-4, 16px);
38
+ margin-bottom: var(--spacing-3, 12px);
39
+ background-color: var(--color-background-tertiary, #f1f3f5);
40
+ border-radius: var(--border-radius-md, 6px);
41
+ border-left: 3px solid var(--color-accent, #0891b2);
42
+ }
@@ -1,5 +1,5 @@
1
- import { d as defineComponent, r as ref, C as onMounted, o as openBlock, c as createElementBlock, b as createBaseVNode, t as toDisplayString, F as Fragment, D as renderList, f as createCommentVNode, i as _export_sfc } from "./index-fb6493ae.js";
2
- import { S as SecretsApi } from "./secrets.api-002e7d7e.js";
1
+ import { d as defineComponent, r as ref, J as onMounted, o as openBlock, c as createElementBlock, a as createBaseVNode, t as toDisplayString, K as Fragment, L as renderList, e as createCommentVNode, g as _export_sfc } from "./index-ca6799de.js";
2
+ import { S as SecretsApi } from "./secrets.api-34431884.js";
3
3
  const _hoisted_1 = { class: "connection-settings-container" };
4
4
  const _hoisted_2 = { class: "toggle-button" };
5
5
  const _hoisted_3 = {
@@ -145,8 +145,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
145
145
  };
146
146
  }
147
147
  });
148
- const DatabaseConnectionSettings_vue_vue_type_style_index_0_scoped_3cfba70e_lang = "";
149
- const DatabaseConnectionSettings = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3cfba70e"]]);
148
+ const DatabaseConnectionSettings_vue_vue_type_style_index_0_scoped_62ec37a1_lang = "";
149
+ const DatabaseConnectionSettings = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-62ec37a1"]]);
150
150
  export {
151
151
  DatabaseConnectionSettings as default
152
152
  };