Flowfile 0.5.3__py3-none-any.whl → 0.5.4__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 (146) hide show
  1. flowfile/__init__.py +16 -0
  2. flowfile/web/static/assets/{AdminView-49392a9a.js → AdminView-f9847d67.js} +1 -1
  3. flowfile/web/static/assets/{CloudConnectionView-36bcd6df.css → CloudConnectionView-cf85f943.css} +17 -17
  4. flowfile/web/static/assets/{CloudConnectionView-f13f202b.js → CloudConnectionView-faace55b.js} +4 -4
  5. flowfile/web/static/assets/{CloudStorageReader-0023d4a5.js → CloudStorageReader-d86ecaa7.js} +8 -8
  6. flowfile/web/static/assets/{CloudStorageWriter-8e781e11.js → CloudStorageWriter-0f4d9a44.js} +8 -8
  7. flowfile/web/static/assets/ColumnActionInput-c44b7aee.css +159 -0
  8. flowfile/web/static/assets/ColumnActionInput-f4189ae0.js +330 -0
  9. flowfile/web/static/assets/{ColumnSelector-8ad68ea9.js → ColumnSelector-e66b33da.js} +1 -1
  10. flowfile/web/static/assets/ContextMenu-49463352.js +9 -0
  11. flowfile/web/static/assets/ContextMenu-dd5f3f25.js +9 -0
  12. flowfile/web/static/assets/ContextMenu-f709b884.js +9 -0
  13. flowfile/web/static/assets/ContextMenu.vue_vue_type_script_setup_true_lang-a1bd6314.js +59 -0
  14. flowfile/web/static/assets/{CrossJoin-03df6938.js → CrossJoin-24694b8f.js} +9 -9
  15. flowfile/web/static/assets/{CustomNode-8479239b.js → CustomNode-569d45ff.js} +27 -20
  16. flowfile/web/static/assets/CustomNode-edb9b939.css +42 -0
  17. flowfile/web/static/assets/{DatabaseConnectionSettings-e91df89a.css → DatabaseConnectionSettings-c20a1e16.css} +22 -20
  18. flowfile/web/static/assets/{DatabaseConnectionSettings-869e3efd.js → DatabaseConnectionSettings-cfc08938.js} +4 -4
  19. flowfile/web/static/assets/{DatabaseReader-36898a00.css → DatabaseReader-5bf8c75b.css} +39 -44
  20. flowfile/web/static/assets/{DatabaseReader-c58b9552.js → DatabaseReader-701feabb.js} +13 -13
  21. flowfile/web/static/assets/{DatabaseView-d26a9140.js → DatabaseView-0482e5b5.js} +2 -2
  22. flowfile/web/static/assets/{DatabaseWriter-4d05ddc7.js → DatabaseWriter-16721989.js} +12 -12
  23. flowfile/web/static/assets/{DatabaseWriter-217a99f1.css → DatabaseWriter-bdcf2c8b.css} +27 -25
  24. flowfile/web/static/assets/{DesignerView-a6d0ee84.css → DesignerView-49abb835.css} +391 -339
  25. flowfile/web/static/assets/{DesignerView-e6f5c0e8.js → DesignerView-f64749fb.js} +220 -118
  26. flowfile/web/static/assets/{DocumentationView-2e78ef1b.js → DocumentationView-61bd2990.js} +3 -3
  27. flowfile/web/static/assets/{DocumentationView-fd46c656.css → DocumentationView-9ea6e871.css} +9 -9
  28. flowfile/web/static/assets/{ExploreData-7b54caca.js → ExploreData-e2735b13.js} +7 -7
  29. flowfile/web/static/assets/{ExternalSource-3fa399b2.js → ExternalSource-2535c3b2.js} +9 -9
  30. flowfile/web/static/assets/{ExternalSource-47ab05a3.css → ExternalSource-7ac7373f.css} +17 -17
  31. flowfile/web/static/assets/{Filter-8cbbdbf3.js → Filter-2cdbc93c.js} +9 -9
  32. flowfile/web/static/assets/{Formula-aac42b1e.js → Formula-fcda3c2c.js} +9 -9
  33. flowfile/web/static/assets/{FuzzyMatch-cd9bbfca.js → FuzzyMatch-f8d3b7d3.js} +10 -10
  34. flowfile/web/static/assets/{GraphSolver-c24dec17.css → GraphSolver-4b4d7db9.css} +4 -4
  35. flowfile/web/static/assets/{GraphSolver-c7e6780e.js → GraphSolver-72eaa695.js} +11 -11
  36. flowfile/web/static/assets/GroupBy-5792782d.css +9 -0
  37. flowfile/web/static/assets/{GroupBy-93c5d22b.js → GroupBy-8aa0598b.js} +9 -9
  38. flowfile/web/static/assets/{Join-a19b2de2.js → Join-e40f0ffa.js} +10 -10
  39. flowfile/web/static/assets/{LoginView-0df4ed0a.js → LoginView-5111c9ae.js} +1 -1
  40. flowfile/web/static/assets/{ManualInput-8d3374b2.js → ManualInput-9b6f3224.js} +6 -6
  41. flowfile/web/static/assets/{MultiSelect-ad1b6243.js → MultiSelect-ef28e19e.js} +2 -2
  42. flowfile/web/static/assets/{MultiSelect.vue_vue_type_script_setup_true_lang-e278950d.js → MultiSelect.vue_vue_type_script_setup_true_lang-83b3bbfd.js} +1 -1
  43. flowfile/web/static/assets/{NodeDesigner-5f53be3f.css → NodeDesigner-94cd4dd3.css} +190 -190
  44. flowfile/web/static/assets/{NodeDesigner-40b647c9.js → NodeDesigner-d2b7ee2b.js} +171 -69
  45. flowfile/web/static/assets/{NumericInput-7100234c.js → NumericInput-1d789794.js} +2 -2
  46. flowfile/web/static/assets/{NumericInput.vue_vue_type_script_setup_true_lang-5130219f.js → NumericInput.vue_vue_type_script_setup_true_lang-7775f83e.js} +1 -1
  47. flowfile/web/static/assets/{Output-35e97000.css → Output-692dd25d.css} +10 -10
  48. flowfile/web/static/assets/{Output-f5efd2aa.js → Output-cefef801.js} +13 -12
  49. flowfile/web/static/assets/{Pivot-d981d23c.js → Pivot-bab1b75b.js} +10 -10
  50. flowfile/web/static/assets/{PivotValidation-63de1f73.js → PivotValidation-e7941f91.js} +1 -1
  51. flowfile/web/static/assets/{PivotValidation-39386e95.js → PivotValidation-fba09336.js} +1 -1
  52. flowfile/web/static/assets/{PolarsCode-f9d69217.js → PolarsCode-740e40fa.js} +7 -7
  53. flowfile/web/static/assets/{PopOver-b22f049e.js → PopOver-862d7e28.js} +1 -1
  54. flowfile/web/static/assets/{Read-aec2e377.js → Read-225cc63f.js} +15 -14
  55. flowfile/web/static/assets/{Read-36e7bd51.css → Read-90f366bc.css} +13 -13
  56. flowfile/web/static/assets/{RecordCount-78ed6845.js → RecordCount-ffc71eca.js} +6 -6
  57. flowfile/web/static/assets/{RecordId-2156e890.js → RecordId-a70bb8df.js} +9 -9
  58. flowfile/web/static/assets/{SQLQueryComponent-48c72f5b.js → SQLQueryComponent-15a421f5.js} +3 -3
  59. flowfile/web/static/assets/SQLQueryComponent-edb90b98.css +29 -0
  60. flowfile/web/static/assets/{Sample-1352ca74.js → Sample-6c26afc7.js} +6 -6
  61. flowfile/web/static/assets/{SecretSelector-22b5ff89.js → SecretSelector-ceed9496.js} +2 -2
  62. flowfile/web/static/assets/{SecretsView-17df66ee.js → SecretsView-214d255a.js} +2 -2
  63. flowfile/web/static/assets/{Select-0aee4c54.js → Select-8fc29999.js} +9 -9
  64. flowfile/web/static/assets/{SettingsSection-f2002a6d.js → SettingsSection-3f70e4c3.js} +1 -1
  65. flowfile/web/static/assets/{SettingsSection-0784e157.js → SettingsSection-83090218.js} +1 -1
  66. flowfile/web/static/assets/{SettingsSection-cd341bb6.js → SettingsSection-9f0d1725.js} +1 -1
  67. flowfile/web/static/assets/SetupView-3fa0aa03.js +160 -0
  68. flowfile/web/static/assets/SetupView-e2da3442.css +230 -0
  69. flowfile/web/static/assets/{SingleSelect-460cc0ea.js → SingleSelect-a4a568cb.js} +2 -2
  70. flowfile/web/static/assets/{SingleSelect.vue_vue_type_script_setup_true_lang-30741bb2.js → SingleSelect.vue_vue_type_script_setup_true_lang-c8ebdd33.js} +1 -1
  71. flowfile/web/static/assets/{SliderInput-5d926864.js → SliderInput-be533e71.js} +1 -1
  72. flowfile/web/static/assets/{Sort-3cdc971b.js → Sort-154dad81.js} +9 -9
  73. flowfile/web/static/assets/Sort-4abb7fae.css +9 -0
  74. flowfile/web/static/assets/{TextInput-a2d0bfbd.js → TextInput-454e2bda.js} +2 -2
  75. flowfile/web/static/assets/{TextInput.vue_vue_type_script_setup_true_lang-abad1ca2.js → TextInput.vue_vue_type_script_setup_true_lang-e86510d0.js} +1 -1
  76. flowfile/web/static/assets/{TextToRows-918945f7.js → TextToRows-ea73433d.js} +9 -9
  77. flowfile/web/static/assets/{ToggleSwitch-f0ef5196.js → ToggleSwitch-9d7b30f1.js} +2 -2
  78. flowfile/web/static/assets/{ToggleSwitch.vue_vue_type_script_setup_true_lang-5605c793.js → ToggleSwitch.vue_vue_type_script_setup_true_lang-00f2580e.js} +1 -1
  79. flowfile/web/static/assets/{UnavailableFields-54d2f518.css → UnavailableFields-394a1f78.css} +13 -13
  80. flowfile/web/static/assets/{UnavailableFields-bdad6144.js → UnavailableFields-b72a2c72.js} +4 -4
  81. flowfile/web/static/assets/{Union-e8ab8c86.js → Union-1e44f263.js} +6 -6
  82. flowfile/web/static/assets/Unique-2b705521.css +3 -0
  83. flowfile/web/static/assets/{Unique-8cd4f976.js → Unique-a3bc6d0a.js} +12 -12
  84. flowfile/web/static/assets/{Unpivot-710a2948.css → Unpivot-b6ad6427.css} +6 -6
  85. flowfile/web/static/assets/{Unpivot-8da14095.js → Unpivot-e27935fc.js} +11 -11
  86. flowfile/web/static/assets/{UnpivotValidation-6f7d89ff.js → UnpivotValidation-72497680.js} +1 -1
  87. flowfile/web/static/assets/{VueGraphicWalker-3fb312e1.js → VueGraphicWalker-d9ab70a3.js} +1 -1
  88. flowfile/web/static/assets/{api-24483f0d.js → api-a2102880.js} +1 -1
  89. flowfile/web/static/assets/{api-8b81fa73.js → api-f75042b0.js} +1 -1
  90. flowfile/web/static/assets/{dropDown-3d8dc5fa.css → dropDown-1d6acbd9.css} +26 -26
  91. flowfile/web/static/assets/{dropDown-ac0fda9d.js → dropDown-2798a109.js} +3 -3
  92. flowfile/web/static/assets/{fullEditor-5497a84a.js → fullEditor-cf7d7d93.js} +3 -3
  93. flowfile/web/static/assets/{fullEditor-a0be62b3.css → fullEditor-fe9f7e18.css} +3 -3
  94. flowfile/web/static/assets/{genericNodeSettings-99014e1d.js → genericNodeSettings-14eac1c3.js} +3 -3
  95. flowfile/web/static/assets/{index-fb6493ae.js → index-387a6f18.js} +175 -86
  96. flowfile/web/static/assets/{index-07dda503.js → index-6b367bb5.js} +1 -1
  97. flowfile/web/static/assets/{index-e6289dd0.css → index-e96ab018.css} +249 -10
  98. flowfile/web/static/assets/{index-3ba44389.js → index-f0a6e5a5.js} +2 -2
  99. flowfile/web/static/assets/nodeInput-ed2ae8d7.js +2 -0
  100. flowfile/web/static/assets/{outputCsv-8f8ba42d.js → outputCsv-3c1757e8.js} +1 -1
  101. flowfile/web/static/assets/{outputExcel-393f4fef.js → outputExcel-686e1f48.js} +1 -1
  102. flowfile/web/static/assets/{outputParquet-07c81f65.js → outputParquet-df28faa7.js} +1 -1
  103. flowfile/web/static/assets/{readCsv-07f6d9ad.js → readCsv-e37eee21.js} +1 -1
  104. flowfile/web/static/assets/{readExcel-ed69bc8f.js → readExcel-a13f14bb.js} +3 -3
  105. flowfile/web/static/assets/{readParquet-e3ed4528.js → readParquet-344cf746.js} +1 -1
  106. flowfile/web/static/assets/{secrets.api-002e7d7e.js → secrets.api-ae198c5c.js} +1 -1
  107. flowfile/web/static/assets/{selectDynamic-80b92899.js → selectDynamic-6b4b0767.js} +3 -3
  108. flowfile/web/static/assets/{vue-codemirror.esm-0965f39f.js → vue-codemirror.esm-31ba0e0b.js} +1 -1
  109. flowfile/web/static/assets/{vue-content-loader.es-c506ad97.js → vue-content-loader.es-4469c8ff.js} +1 -1
  110. flowfile/web/static/index.html +2 -2
  111. {flowfile-0.5.3.dist-info → flowfile-0.5.4.dist-info}/METADATA +2 -2
  112. {flowfile-0.5.3.dist-info → flowfile-0.5.4.dist-info}/RECORD +134 -129
  113. flowfile_core/auth/secrets.py +56 -13
  114. flowfile_core/fileExplorer/funcs.py +26 -4
  115. flowfile_core/flowfile/code_generator/__init__.py +11 -0
  116. flowfile_core/flowfile/code_generator/code_generator.py +347 -2
  117. flowfile_core/flowfile/flow_data_engine/flow_data_engine.py +13 -1
  118. flowfile_core/flowfile/flow_graph.py +2 -0
  119. flowfile_core/flowfile/flow_node/flow_node.py +52 -28
  120. flowfile_core/flowfile/node_designer/__init__.py +4 -0
  121. flowfile_core/flowfile/node_designer/ui_components.py +144 -1
  122. flowfile_core/routes/public.py +43 -1
  123. flowfile_core/schemas/cloud_storage_schemas.py +39 -15
  124. flowfile_core/secret_manager/secret_manager.py +107 -6
  125. flowfile_frame/__init__.py +11 -0
  126. flowfile_frame/database/__init__.py +36 -0
  127. flowfile_frame/database/connection_manager.py +205 -0
  128. flowfile_frame/database/frame_helpers.py +249 -0
  129. flowfile_worker/configs.py +31 -15
  130. flowfile_worker/secrets.py +105 -15
  131. flowfile_worker/spawner.py +10 -6
  132. flowfile/web/static/assets/ContextMenu-26d4dd27.css +0 -26
  133. flowfile/web/static/assets/ContextMenu-31ee57f0.js +0 -41
  134. flowfile/web/static/assets/ContextMenu-69a74055.js +0 -41
  135. flowfile/web/static/assets/ContextMenu-8e2051c6.js +0 -41
  136. flowfile/web/static/assets/ContextMenu-8ec1729e.css +0 -26
  137. flowfile/web/static/assets/ContextMenu-9b310c60.css +0 -26
  138. flowfile/web/static/assets/CustomNode-59e99a86.css +0 -32
  139. flowfile/web/static/assets/GroupBy-be7ac0bf.css +0 -51
  140. flowfile/web/static/assets/SQLQueryComponent-1c2f26b4.css +0 -27
  141. flowfile/web/static/assets/Sort-8a871341.css +0 -51
  142. flowfile/web/static/assets/Unique-9fb2f567.css +0 -51
  143. flowfile/web/static/assets/nodeInput-0eb13f1a.js +0 -2
  144. {flowfile-0.5.3.dist-info → flowfile-0.5.4.dist-info}/WHEEL +0 -0
  145. {flowfile-0.5.3.dist-info → flowfile-0.5.4.dist-info}/entry_points.txt +0 -0
  146. {flowfile-0.5.3.dist-info → flowfile-0.5.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,330 @@
1
+ import { d as defineComponent, r as ref, B as computed, C as watch, F as onMounted, l as onUnmounted, m as resolveComponent, o as openBlock, c as createElementBlock, a as createBaseVNode, t as toDisplayString, p as createVNode, q as withCtx, G as Fragment, H as renderList, y as createBlock, e as createCommentVNode, n as normalizeClass, w as withModifiers, a0 as normalizeStyle, x as unref, at as ElIcon, g as _export_sfc } from "./index-387a6f18.js";
2
+ import { d as delete_default } from "./DesignerView-f64749fb.js";
3
+ import "./PopOver-862d7e28.js";
4
+ import "./index-f0a6e5a5.js";
5
+ import "./vue-codemirror.esm-31ba0e0b.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, B as computed, m as resolveComponent, o as openBlock, c as createElementBlock, a as createBaseVNode, f as createTextVNode, t as toDisplayString, e as createCommentVNode, p as createVNode, q as withCtx, G as Fragment, H as renderList, y as createBlock, g as _export_sfc } from "./index-387a6f18.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-387a6f18.js";
2
+ import "./DesignerView-f64749fb.js";
3
+ import { _ as _sfc_main } from "./ContextMenu.vue_vue_type_script_setup_true_lang-a1bd6314.js";
4
+ import "./PopOver-862d7e28.js";
5
+ import "./index-f0a6e5a5.js";
6
+ import "./vue-codemirror.esm-31ba0e0b.js";
7
+ export {
8
+ _sfc_main as default
9
+ };
@@ -0,0 +1,9 @@
1
+ import "./index-387a6f18.js";
2
+ import "./DesignerView-f64749fb.js";
3
+ import { _ as _sfc_main } from "./ContextMenu.vue_vue_type_script_setup_true_lang-a1bd6314.js";
4
+ import "./PopOver-862d7e28.js";
5
+ import "./index-f0a6e5a5.js";
6
+ import "./vue-codemirror.esm-31ba0e0b.js";
7
+ export {
8
+ _sfc_main as default
9
+ };
@@ -0,0 +1,9 @@
1
+ import "./index-387a6f18.js";
2
+ import "./DesignerView-f64749fb.js";
3
+ import { _ as _sfc_main } from "./ContextMenu.vue_vue_type_script_setup_true_lang-a1bd6314.js";
4
+ import "./PopOver-862d7e28.js";
5
+ import "./index-f0a6e5a5.js";
6
+ import "./vue-codemirror.esm-31ba0e0b.js";
7
+ export {
8
+ _sfc_main as default
9
+ };
@@ -0,0 +1,59 @@
1
+ import { d as defineComponent, r as ref, F as onMounted, l as onUnmounted, o as openBlock, c as createElementBlock, a as createBaseVNode, G as Fragment, H as renderList, n as normalizeClass, t as toDisplayString, a0 as normalizeStyle } from "./index-387a6f18.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-4469c8ff.js";
2
+ import { u as useNodeStore } from "./PopOver-862d7e28.js";
3
+ import { d as defineComponent, r as ref, o as openBlock, c as createElementBlock, p as createVNode, q as withCtx, a as createBaseVNode, y as createBlock, x as unref, g as _export_sfc } from "./index-387a6f18.js";
4
+ import { s as selectDynamic } from "./selectDynamic-6b4b0767.js";
5
+ import { G as GenericNodeSettings } from "./genericNodeSettings-14eac1c3.js";
6
+ import "./UnavailableFields-b72a2c72.js";
7
+ import "./DesignerView-f64749fb.js";
8
+ import "./index-f0a6e5a5.js";
9
+ import "./vue-codemirror.esm-31ba0e0b.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, o as openBlock, c as createElementBlock, a as createBaseVNode, f as createTextVNode, t as toDisplayString, e as createCommentVNode, p as createVNode, q as withCtx, G as Fragment, H as renderList, i as withDirectives, ak as vShow, y as createBlock, g as _export_sfc } from "./index-387a6f18.js";
2
+ import { u as useNodeStore } from "./PopOver-862d7e28.js";
3
+ import { G as GenericNodeSettings } from "./genericNodeSettings-14eac1c3.js";
4
+ import { _ as _sfc_main$3 } from "./MultiSelect.vue_vue_type_script_setup_true_lang-83b3bbfd.js";
5
+ import { _ as _sfc_main$5 } from "./ToggleSwitch.vue_vue_type_script_setup_true_lang-00f2580e.js";
6
+ import { _ as _sfc_main$1 } from "./TextInput.vue_vue_type_script_setup_true_lang-e86510d0.js";
7
+ import { _ as _sfc_main$2 } from "./NumericInput.vue_vue_type_script_setup_true_lang-7775f83e.js";
8
+ import SliderInput from "./SliderInput-be533e71.js";
9
+ import { _ as _sfc_main$4 } from "./SingleSelect.vue_vue_type_script_setup_true_lang-c8ebdd33.js";
10
+ import ColumnSelector from "./ColumnSelector-e66b33da.js";
11
+ import SecretSelector from "./SecretSelector-ceed9496.js";
12
+ import ColumnActionInput from "./ColumnActionInput-f4189ae0.js";
13
+ import "./DesignerView-f64749fb.js";
14
+ import "./index-f0a6e5a5.js";
15
+ import "./vue-codemirror.esm-31ba0e0b.js";
16
+ import "./secrets.api-ae198c5c.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,73 +1,75 @@
1
1
 
2
- .connection-settings-container[data-v-3cfba70e] {
3
- border: 1px solid #e2e8f0;
2
+ .connection-settings-container[data-v-62ec37a1] {
3
+ border: 1px solid var(--color-border-primary);
4
4
  border-radius: 6px;
5
5
  margin-bottom: 1rem;
6
6
  overflow: hidden;
7
7
  }
8
- .connection-header[data-v-3cfba70e] {
8
+ .connection-header[data-v-62ec37a1] {
9
9
  display: flex;
10
10
  justify-content: space-between;
11
11
  align-items: center;
12
12
  padding: 0.75rem 1rem;
13
- background-color: #f8fafc;
13
+ background-color: var(--color-background-secondary);
14
14
  cursor: pointer;
15
15
  user-select: none;
16
- border-bottom: 1px solid #e2e8f0;
16
+ border-bottom: 1px solid var(--color-border-primary);
17
17
  }
18
- .connection-header[data-v-3cfba70e]:hover {
19
- background-color: #edf2f7;
18
+ .connection-header[data-v-62ec37a1]:hover {
19
+ background-color: var(--color-background-tertiary);
20
20
  }
21
- .connection-title[data-v-3cfba70e] {
21
+ .connection-title[data-v-62ec37a1] {
22
22
  margin: 0;
23
23
  font-size: 0.95rem;
24
24
  font-weight: 600;
25
- color: #4a5568;
25
+ color: var(--color-text-secondary);
26
26
  }
27
- .toggle-button[data-v-3cfba70e] {
27
+ .toggle-button[data-v-62ec37a1] {
28
28
  background: none;
29
29
  border: none;
30
- color: #718096;
30
+ color: var(--color-text-tertiary);
31
31
  font-size: 0.9rem;
32
32
  cursor: pointer;
33
33
  padding: 0;
34
34
  }
35
- .connection-content[data-v-3cfba70e] {
35
+ .connection-content[data-v-62ec37a1] {
36
36
  padding: 1rem;
37
37
  background-color: var(--color-background-primary);
38
38
  }
39
- .form-row[data-v-3cfba70e] {
39
+ .form-row[data-v-62ec37a1] {
40
40
  display: flex;
41
41
  gap: 0.75rem;
42
42
  margin-bottom: 0.75rem;
43
43
  width: 100%;
44
44
  box-sizing: border-box;
45
45
  }
46
- .half[data-v-3cfba70e] {
46
+ .half[data-v-62ec37a1] {
47
47
  flex: 1;
48
48
  min-width: 0; /* Allow fields to shrink below their content size */
49
49
  max-width: calc(50% - 0.375rem); /* Account for the gap between items */
50
50
  }
51
- .form-control[data-v-3cfba70e] {
51
+ .form-control[data-v-62ec37a1] {
52
52
  width: 100%;
53
53
  padding: 0.5rem;
54
- border: 1px solid #e2e8f0;
54
+ border: 1px solid var(--color-border-primary);
55
55
  border-radius: 4px;
56
56
  font-size: 0.875rem;
57
57
  box-sizing: border-box;
58
+ background-color: var(--color-background-primary);
59
+ color: var(--color-text-primary);
58
60
  }
59
- .form-group[data-v-3cfba70e] {
61
+ .form-group[data-v-62ec37a1] {
60
62
  margin-bottom: 0.75rem;
61
63
  width: 100%;
62
64
  }
63
- label[data-v-3cfba70e] {
65
+ label[data-v-62ec37a1] {
64
66
  display: block;
65
67
  margin-bottom: 0.25rem;
66
68
  font-size: 0.875rem;
67
69
  font-weight: 500;
68
- color: #4a5568;
70
+ color: var(--color-text-secondary);
69
71
  }
70
- select.form-control[data-v-3cfba70e] {
72
+ select.form-control[data-v-62ec37a1] {
71
73
  appearance: none;
72
74
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%234a5568' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
73
75
  background-repeat: no-repeat;