windmill-components 1.504.5 → 1.510.1

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 (202) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +161 -29
  3. package/package/components/ArgInput.svelte +33 -103
  4. package/package/components/AuthSettings.svelte +45 -1
  5. package/package/components/Dev.svelte +31 -24
  6. package/package/components/DisplayResult.svelte +53 -26
  7. package/package/components/DisplayResult.svelte.d.ts +1 -1
  8. package/package/components/DynSelect.svelte +3 -3
  9. package/package/components/Editor.svelte +7 -4
  10. package/package/components/EditorBar.svelte +2 -2
  11. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  12. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  13. package/package/components/FlowBuilder.svelte +11 -2
  14. package/package/components/FlowJobResult.svelte +12 -17
  15. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  16. package/package/components/FlowPreviewContent.svelte +13 -10
  17. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  18. package/package/components/FlowPreviewResult.svelte +14 -6
  19. package/package/components/FlowStatusViewer.svelte +11 -24
  20. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  21. package/package/components/FlowStatusViewerInner.svelte +110 -131
  22. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  23. package/package/components/GitDiffPreview.svelte +55 -0
  24. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  25. package/package/components/HistoricInputs.svelte +2 -2
  26. package/package/components/InitGitRepoPopover.svelte +410 -0
  27. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  28. package/package/components/InstanceSetting.svelte +21 -9
  29. package/package/components/InstanceSettings.svelte +16 -3
  30. package/package/components/JobLoader.svelte +567 -0
  31. package/package/components/JobLoader.svelte.d.ts +53 -0
  32. package/package/components/JobLogs.svelte +6 -4
  33. package/package/components/JobLogs.svelte.d.ts +5 -18
  34. package/package/components/LightweightResourcePicker.svelte +18 -39
  35. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  36. package/package/components/LogViewer.svelte +35 -41
  37. package/package/components/LogViewer.svelte.d.ts +6 -20
  38. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  39. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  40. package/package/components/ModuleTest.svelte +16 -11
  41. package/package/components/PullGitRepoPopover.svelte +355 -0
  42. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  43. package/package/components/S3FilePicker.svelte +5 -3
  44. package/package/components/SavedInputs.svelte +2 -2
  45. package/package/components/ScriptBuilder.svelte +4 -3
  46. package/package/components/ScriptEditor.svelte +34 -31
  47. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  48. package/package/components/ServiceLogsInner.svelte +2 -1
  49. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  50. package/package/components/UserSettings.svelte +1 -1
  51. package/package/components/WorkerTagSelect.svelte +32 -3
  52. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  53. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  54. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  55. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  56. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  57. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  58. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  59. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  60. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  61. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  62. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  63. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  64. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  65. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  66. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  67. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  68. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  69. package/package/components/apps/editor/component/components.d.ts +12 -0
  70. package/package/components/apps/editor/component/components.js +19 -7
  71. package/package/components/assets/AssetButtons.svelte +38 -0
  72. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  73. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  74. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  75. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  76. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  77. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  78. package/package/components/assets/README_DEV.md +0 -0
  79. package/package/components/assets/lib.d.ts +9 -1
  80. package/package/components/assets/lib.js +48 -7
  81. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  82. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  83. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  84. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  85. package/package/components/common/table/ScriptRow.svelte +3 -1
  86. package/package/components/copilot/autocomplete/Autocompletor.js +23 -5
  87. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  88. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  89. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  90. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  91. package/package/components/copilot/chat/flow/core.js +2 -38
  92. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  93. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  94. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  95. package/package/components/copilot/chat/navigator/core.js +2 -1
  96. package/package/components/copilot/chat/script/core.d.ts +11 -2
  97. package/package/components/copilot/chat/script/core.js +135 -1
  98. package/package/components/copilot/chat/shared.d.ts +10 -0
  99. package/package/components/copilot/chat/shared.js +56 -0
  100. package/package/components/copilot/lib.d.ts +1 -0
  101. package/package/components/copilot/lib.js +27 -9
  102. package/package/components/custom_ui.d.ts +1 -0
  103. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  104. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  105. package/package/components/flows/content/FlowModuleComponent.svelte +16 -18
  106. package/package/components/flows/flowStore.d.ts +1 -1
  107. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  108. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  109. package/package/components/flows/scheduleUtils.js +1 -1
  110. package/package/components/flows/types.d.ts +2 -1
  111. package/package/components/graph/FlowGraphV2.svelte +8 -104
  112. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  113. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  114. package/package/components/graph/graphBuilder.svelte.js +35 -9
  115. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  116. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  117. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  118. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  119. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  120. package/package/components/graph/util.js +1 -1
  121. package/package/components/home/ItemsList.svelte +2 -0
  122. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  123. package/package/components/jobs/JobPreview.svelte +10 -6
  124. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  125. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  126. package/package/components/runs/JobPreview.svelte +26 -16
  127. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  128. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  129. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  130. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  131. package/package/components/schema/AddPropertyFormV2.svelte +42 -33
  132. package/package/components/schema/AddPropertyFormV2.svelte.d.ts +1 -0
  133. package/package/components/schema/AddPropertyV2.svelte +2 -1
  134. package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -0
  135. package/package/components/schema/EditableSchemaWrapper.svelte +3 -1
  136. package/package/components/schema/editable_schema_wrapper.d.ts +3 -0
  137. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  138. package/package/components/script_builder.d.ts +2 -2
  139. package/package/components/settings/CreateToken.svelte +76 -41
  140. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  141. package/package/components/settings/ScopeSelector.svelte +613 -0
  142. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  143. package/package/components/settings/TokenDisplay.svelte +103 -0
  144. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  145. package/package/components/settings/TokensTable.svelte +70 -349
  146. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  147. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  148. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  149. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  150. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  151. package/package/components/triggers/TriggersEditor.svelte +45 -3
  152. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  153. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +43 -2
  154. package/package/components/triggers/gcp/utils.js +9 -1
  155. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +1 -0
  156. package/package/components/triggers/http/RouteEditorInner.svelte +208 -164
  157. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  158. package/package/components/triggers/http/utils.js +9 -3
  159. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +43 -2
  160. package/package/components/triggers/kafka/utils.js +9 -1
  161. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  162. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  163. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +178 -9
  164. package/package/components/triggers/mqtt/utils.js +9 -1
  165. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +43 -2
  166. package/package/components/triggers/nats/utils.js +9 -1
  167. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  168. package/package/components/triggers/postgres/utils.js +9 -1
  169. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +34 -88
  170. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +43 -2
  171. package/package/components/triggers/sqs/utils.js +9 -1
  172. package/package/components/triggers/utils.js +12 -0
  173. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +43 -2
  174. package/package/components/triggers/websocket/utils.js +11 -1
  175. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  176. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  177. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  178. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  179. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  180. package/package/gen/core/OpenAPI.js +1 -1
  181. package/package/gen/schemas.gen.d.ts +305 -23
  182. package/package/gen/schemas.gen.js +305 -23
  183. package/package/gen/services.gen.d.ts +33 -1
  184. package/package/gen/services.gen.js +66 -2
  185. package/package/gen/types.gen.d.ts +216 -11
  186. package/package/history.svelte.js +0 -2
  187. package/package/hub.d.ts +1 -0
  188. package/package/hubPaths.json +5 -2
  189. package/package/infer.js +16 -10
  190. package/package/svelte5Utils.svelte.d.ts +1 -0
  191. package/package/svelte5Utils.svelte.js +25 -18
  192. package/package/toast.js +10 -0
  193. package/package/utils.d.ts +3 -2
  194. package/package/utils.js +20 -5
  195. package/package.json +11 -11
  196. package/package/components/ResultJobLoader.svelte +0 -219
  197. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  198. package/package/components/TestJobLoader.svelte +0 -274
  199. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  200. package/package/components/icons/AssetVarIcon.svelte +0 -31
  201. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  202. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -179,11 +179,17 @@ async function computeTriggerables() {
179
179
  .filter(Boolean);
180
180
  if (items.findIndex((x) => {
181
181
  const c = x.data;
182
- if (c.type === 'schemaformcomponent') {
183
- return (Object.values(c.componentInput?.value?.properties ?? {}).findIndex((p) => p?.type === 'object' && p?.format === 'resource-s3_object') !== -1);
184
- }
185
- else if (c.type === 'formbuttoncomponent' || c.type === 'formcomponent') {
186
- return (Object.values(c.componentInput?.fields ?? {}).findIndex((p) => p?.fieldType === 'object' && p?.format === 'resource-s3_object') !== -1);
182
+ if (c.type === 'schemaformcomponent' ||
183
+ c.type === 'formbuttoncomponent' ||
184
+ c.type === 'formcomponent') {
185
+ const props = c.type === 'schemaformcomponent'
186
+ ? c.componentInput?.value?.properties
187
+ : c.componentInput?.runnable?.type === 'runnableByName'
188
+ ? c.componentInput?.runnable?.inlineScript?.schema?.properties
189
+ : c.componentInput?.runnable?.schema?.properties;
190
+ return (Object.values(props ?? {}).findIndex((p) => (p?.type === 'object' && p?.format === 'resource-s3_object') ||
191
+ (p?.type === 'array' &&
192
+ (p?.items?.resourceType === 's3object' || p?.items?.resourceType === 's3_object'))) !== -1);
187
193
  }
188
194
  else {
189
195
  return false;
@@ -12,18 +12,18 @@ import { classNames, truncateRev, isFlowPreview } from '../../../utils';
12
12
  import PanelSection from './settingsPanel/common/PanelSection.svelte';
13
13
  import AppTimeline from './AppTimeline.svelte';
14
14
  import HighlightCode from '../../HighlightCode.svelte';
15
- import TestJobLoader from '../../TestJobLoader.svelte';
15
+ import JobLoader from '../../JobLoader.svelte';
16
16
  import { createEventDispatcher, untrack } from 'svelte';
17
17
  let { open = $bindable(false), jobs, jobsById, hasErrors = false, selectedJobId = $bindable(undefined), refreshComponents = undefined, errorByComponent = {} } = $props();
18
18
  const dispatch = createEventDispatcher();
19
- let testJobLoader = $state();
19
+ let jobLoader = $state();
20
20
  let job = $state(undefined);
21
21
  let testIsLoading = $state(false);
22
22
  let rightColumnSelect = $state('timeline');
23
23
  $effect(() => {
24
24
  selectedJobId &&
25
25
  !selectedJobId?.includes('Frontend') &&
26
- untrack(() => selectedJobId && testJobLoader?.watchJob(selectedJobId));
26
+ untrack(() => selectedJobId && jobLoader?.watchJob(selectedJobId));
27
27
  });
28
28
  $effect(() => {
29
29
  if (selectedJobId?.includes('Frontend') && selectedJobId) {
@@ -32,7 +32,7 @@ $effect(() => {
32
32
  });
33
33
  </script>
34
34
 
35
- <TestJobLoader bind:this={testJobLoader} bind:isLoading={testIsLoading} bind:job />
35
+ <JobLoader noCode={true} bind:this={jobLoader} bind:isLoading={testIsLoading} bind:job />
36
36
 
37
37
  <Drawer bind:open size="900px">
38
38
  <DrawerContent
@@ -149,7 +149,7 @@ $effect(() => {
149
149
  <Button
150
150
  color="red"
151
151
  variant="border"
152
- on:click={() => testJobLoader?.cancelJob()}
152
+ on:click={() => jobLoader?.cancelJob()}
153
153
  >
154
154
  <Loader2 size={14} class="animate-spin mr-2" />
155
155
 
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">import { getContext, untrack } from 'svelte';
2
- import TestJobLoader from '../../TestJobLoader.svelte';
2
+ import JobLoader from '../../JobLoader.svelte';
3
3
  import RunnableJobPanelInner from './RunnableJobPanelInner.svelte';
4
4
  let { float = true, hidden = false, testJob = $bindable(undefined), jobToWatch = $bindable(undefined), width = undefined } = $props();
5
5
  const { runnableJobEditorPanel, selectedComponentInEditor } = getContext('AppEditorContext');
6
6
  let testIsLoading = $state(false);
7
- let testJobLoader = $state();
7
+ let jobLoader = $state();
8
8
  function updateSelectedJob() {
9
9
  const selectedComponent = $selectedComponentInEditor;
10
10
  if (selectedComponent) {
@@ -17,7 +17,7 @@ function updateSelectedJob() {
17
17
  testJob = undefined;
18
18
  }
19
19
  jobToWatch = { componentId: selectedComponent, job: backendJob };
20
- testJobLoader?.watchJob(backendJob);
20
+ jobLoader?.watchJob(backendJob);
21
21
  }
22
22
  else {
23
23
  testJob = undefined;
@@ -38,7 +38,7 @@ $effect(() => {
38
38
  });
39
39
  </script>
40
40
 
41
- <TestJobLoader bind:this={testJobLoader} bind:isLoading={testIsLoading} bind:job={testJob} />
41
+ <JobLoader bind:this={jobLoader} bind:isLoading={testIsLoading} bind:job={testJob} />
42
42
 
43
43
  {#if ($runnableJobEditorPanel.focused && $selectedComponentInEditor) || logDrawerOpen || resultDrawerOpen || !float}
44
44
  {@const frontendJob = $runnableJobEditorPanel?.frontendJobs[$selectedComponentInEditor ?? '']}
@@ -2665,6 +2665,12 @@ export declare const components: {
2665
2665
  readonly componentInput: undefined;
2666
2666
  readonly configuration: {
2667
2667
  readonly items: StaticAppInput;
2668
+ readonly defaultValue: {
2669
+ readonly type: "static";
2670
+ readonly fieldType: "text";
2671
+ readonly value: undefined;
2672
+ readonly tooltip: "Format: $res:path/to/resource";
2673
+ };
2668
2674
  readonly placeholder: {
2669
2675
  readonly type: "static";
2670
2676
  readonly fieldType: "text";
@@ -2704,6 +2710,12 @@ export declare const components: {
2704
2710
  readonly fieldType: "text";
2705
2711
  readonly value: "postgresql";
2706
2712
  };
2713
+ readonly defaultValue: {
2714
+ readonly type: "static";
2715
+ readonly fieldType: "text";
2716
+ readonly value: undefined;
2717
+ readonly tooltip: "Format: $res:path/to/resource";
2718
+ };
2707
2719
  readonly expressOauthSetup: {
2708
2720
  readonly type: "static";
2709
2721
  readonly fieldType: "boolean";
@@ -1140,8 +1140,8 @@ export const components = {
1140
1140
  backgroundColor: ['#FF6384', '#4BC0C0', '#FFCE56']
1141
1141
  }
1142
1142
  ]
1143
- },
1144
- },
1143
+ }
1144
+ }
1145
1145
  }
1146
1146
  },
1147
1147
  chartjscomponentv2: {
@@ -1178,8 +1178,8 @@ export const components = {
1178
1178
  backgroundColor: ['#FF6384', '#4BC0C0', '#FFCE56']
1179
1179
  }
1180
1180
  ]
1181
- },
1182
- },
1181
+ }
1182
+ }
1183
1183
  }
1184
1184
  },
1185
1185
  barchartcomponent: {
@@ -1345,7 +1345,7 @@ This is a paragraph.
1345
1345
  width: 2.5
1346
1346
  }
1347
1347
  }
1348
- },
1348
+ }
1349
1349
  },
1350
1350
  configuration: {
1351
1351
  layout: {
@@ -1377,7 +1377,7 @@ This is a paragraph.
1377
1377
  width: 2.5
1378
1378
  }
1379
1379
  }
1380
- },
1380
+ }
1381
1381
  },
1382
1382
  configuration: {
1383
1383
  layout: {
@@ -1387,7 +1387,7 @@ This is a paragraph.
1387
1387
  tooltip: 'Layout options for the plot. See https://plotly.com/javascript/reference/layout/ for more information'
1388
1388
  }
1389
1389
  }
1390
- },
1390
+ }
1391
1391
  },
1392
1392
  timeseriescomponent: {
1393
1393
  name: 'Timeseries',
@@ -1891,6 +1891,12 @@ This is a paragraph.
1891
1891
  allowTypeChange: false,
1892
1892
  value: []
1893
1893
  },
1894
+ defaultValue: {
1895
+ type: 'static',
1896
+ fieldType: 'text',
1897
+ value: undefined,
1898
+ tooltip: 'Format: $res:path/to/resource'
1899
+ },
1894
1900
  placeholder: {
1895
1901
  type: 'static',
1896
1902
  fieldType: 'text',
@@ -1927,6 +1933,12 @@ This is a paragraph.
1927
1933
  fieldType: 'text',
1928
1934
  value: 'postgresql'
1929
1935
  },
1936
+ defaultValue: {
1937
+ type: 'static',
1938
+ fieldType: 'text',
1939
+ value: undefined,
1940
+ tooltip: 'Format: $res:path/to/resource'
1941
+ },
1930
1942
  expressOauthSetup: {
1931
1943
  type: 'static',
1932
1944
  fieldType: 'boolean',
@@ -0,0 +1,38 @@
1
+ <script lang="ts">import { AlertTriangle, Edit2 } from 'lucide-svelte';
2
+ import { Button } from '../common';
3
+ import { Tooltip } from '../meltComponents';
4
+ import ExploreAssetButton, { assetCanBeExplored } from '../ExploreAssetButton.svelte';
5
+ import S3FilePicker from '../S3FilePicker.svelte';
6
+ import DbManagerDrawer from '../DBManagerDrawer.svelte';
7
+ import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte';
8
+ let { s3FilePicker, dbManagerDrawer, resourceEditorDrawer, resourceDataCache, asset, onClick } = $props();
9
+ </script>
10
+
11
+ <div class="flex gap-2 items-center">
12
+ {#if asset.kind === 'resource' && resourceDataCache[asset.path] !== undefined}
13
+ <Button
14
+ startIcon={{ icon: Edit2 }}
15
+ size="xs"
16
+ variant="border"
17
+ spacingSize="xs2"
18
+ iconOnly
19
+ on:click={() => (resourceEditorDrawer?.initEdit(asset.path), onClick?.())}
20
+ />
21
+ {/if}
22
+ {#if asset.kind === 'resource' && resourceDataCache[asset.path] === undefined}
23
+ <Tooltip class="mr-2.5">
24
+ <AlertTriangle size={16} class="text-orange-600 dark:text-orange-500" />
25
+ <svelte:fragment slot="text">Could not find resource</svelte:fragment>
26
+ </Tooltip>
27
+ {/if}
28
+ {#if assetCanBeExplored(asset, { resource_type: resourceDataCache[asset.path] })}
29
+ <ExploreAssetButton
30
+ {asset}
31
+ {s3FilePicker}
32
+ {dbManagerDrawer}
33
+ onClick={() => onClick?.()}
34
+ noText
35
+ _resourceMetadata={{ resource_type: resourceDataCache[asset.path] }}
36
+ />
37
+ {/if}
38
+ </div>
@@ -0,0 +1,15 @@
1
+ import S3FilePicker from '../S3FilePicker.svelte';
2
+ import DbManagerDrawer from '../DBManagerDrawer.svelte';
3
+ import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte';
4
+ import type { Asset } from '../../gen';
5
+ type Props = {
6
+ s3FilePicker?: S3FilePicker | undefined;
7
+ dbManagerDrawer?: DbManagerDrawer | undefined;
8
+ resourceEditorDrawer?: ResourceEditorDrawer | undefined;
9
+ resourceDataCache: Record<string, string | undefined>;
10
+ asset: Asset;
11
+ onClick?: () => void;
12
+ };
13
+ declare const AssetButtons: import("svelte").Component<Props, {}, "">;
14
+ type AssetButtons = ReturnType<typeof AssetButtons>;
15
+ export default AssetButtons;
@@ -1,21 +1,20 @@
1
1
  <script lang="ts">import { clone, pluralize } from '../../utils';
2
- import { deepEqual } from 'fast-equals';
3
- import { AlertTriangle, Edit2, Pyramid } from 'lucide-svelte';
2
+ import { Pyramid } from 'lucide-svelte';
4
3
  import { twMerge } from 'tailwind-merge';
5
4
  import { Popover } from '../meltComponents';
6
5
  import S3FilePicker from '../S3FilePicker.svelte';
7
- import ExploreAssetButton, { assetCanBeExplored } from '../ExploreAssetButton.svelte';
8
- import { assetEq, formatAssetKind } from './lib';
6
+ import { assetsEq, formatAssetAccessType, formatAssetKind, getAccessType } from './lib';
9
7
  import DbManagerDrawer from '../DBManagerDrawer.svelte';
10
- import { tick, untrack } from 'svelte';
8
+ import { untrack } from 'svelte';
11
9
  import { ResourceService } from '../../gen';
12
10
  import { workspaceStore } from '../../stores';
13
- import Button from '../common/button/Button.svelte';
14
11
  import Tooltip from '../meltComponents/Tooltip.svelte';
12
+ import Tooltip2 from '../Tooltip.svelte';
15
13
  import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte';
14
+ import AssetButtons from './AssetButtons.svelte';
16
15
  import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
17
16
  import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
18
- let { assets, enableChangeAnimation = true, size = 'xs', noBtnText = false, popoverPlacement = 'bottom-end', disableLiTooltip = false, fallbackAccessTypes = $bindable(), onHoverLi, liSubtitle } = $props();
17
+ let { assets, enableChangeAnimation = true, size = 'xs', noBtnText = false, popoverPlacement = 'bottom-end', disableLiTooltip = false, onHoverLi, liSubtitle } = $props();
19
18
  let prevAssets = $state([]);
20
19
  let blueBgDiv = $state();
21
20
  let s3FilePicker = $state();
@@ -33,7 +32,7 @@ $effect(() => {
33
32
  $effect(() => {
34
33
  assets;
35
34
  untrack(() => {
36
- if (deepEqual(assets, prevAssets))
35
+ if (assetsEq(assets, prevAssets))
37
36
  return;
38
37
  prevAssets = clone(assets);
39
38
  // Replay animation
@@ -86,16 +85,52 @@ $effect(() => {
86
85
  <svelte:fragment slot="content">
87
86
  <ul class="divide-y rounded-md">
88
87
  {#each assets as asset}
89
- {@const fallbackAccessType = fallbackAccessTypes?.find((a) =>
90
- assetEq(a, asset)
91
- )?.access_type}
92
- {@const hasWarning = !asset.access_type && !fallbackAccessType}
93
88
  <li
94
- class="text-sm px-4 h-12 flex gap-4 items-center justify-between hover:bg-surface-hover"
89
+ class="text-sm px-3 h-12 flex gap-3 items-center hover:bg-surface-hover/25"
95
90
  onmouseenter={() => onHoverLi?.(asset, 'enter')}
96
91
  onmouseleave={() => onHoverLi?.(asset, 'leave')}
97
92
  >
98
- <div class="flex flex-col">
93
+ <Popover
94
+ contentClasses="py-2 px-4 flex flex-col gap-2"
95
+ disablePopup={!!asset.access_type}
96
+ >
97
+ <svelte:fragment slot="trigger">
98
+ <div
99
+ class={twMerge(
100
+ 'text-xs font-normal border text-tertiary w-10 p-1 text-center rounded-md',
101
+ !asset.access_type && !asset.alt_access_type
102
+ ? 'text-orange-500 !border-orange-500'
103
+ : '',
104
+ !asset.access_type ? 'hover:bg-surface active:opacity-80' : ''
105
+ )}
106
+ >
107
+ {formatAssetAccessType(getAccessType(asset))}
108
+ </div>
109
+ </svelte:fragment>
110
+ <svelte:fragment slot="content">
111
+ {#if !asset.access_type}
112
+ <span class="text-sm text-tertiary leading-4">
113
+ Could not infer automatically <br />
114
+ <span class="text-xs">Please select manually </span>
115
+ </span>
116
+ <div class="flex items-center gap-2">
117
+ <ToggleButtonGroup bind:selected={asset.alt_access_type} class="max-w-fit">
118
+ {#snippet children({ item })}
119
+ <ToggleButton value="r" label="Read" {item} />
120
+ <ToggleButton value="w" label="Write" {item} />
121
+ <ToggleButton value="rw" label="Read/Write" {item} />
122
+ {/snippet}
123
+ </ToggleButtonGroup>
124
+
125
+ <Tooltip2>
126
+ This is used to determine if the asset should be displayed as an input or an
127
+ output node in the flow editor
128
+ </Tooltip2>
129
+ </div>
130
+ {/if}
131
+ </svelte:fragment>
132
+ </Popover>
133
+ <div class="flex flex-col flex-1">
99
134
  <Tooltip class="select-none max-w-48 truncate" disablePopup={disableLiTooltip}>
100
135
  {asset.path}
101
136
  <svelte:fragment slot="text">
@@ -106,68 +141,21 @@ $effect(() => {
106
141
  {liSubtitle?.(asset) ??
107
142
  formatAssetKind({
108
143
  ...asset,
109
- metadata: { resource_type: resourceDataCache[asset.path] }
144
+ ...(asset.kind === 'resource'
145
+ ? { metadata: { resource_type: resourceDataCache[asset.path] } }
146
+ : {})
110
147
  })}
111
148
  </span>
112
149
  </div>
113
150
 
114
- <div class="flex gap-2 items-center">
115
- {#if asset.kind === 'resource' && resourceDataCache[asset.path] !== undefined}
116
- <Button
117
- startIcon={{ icon: Edit2 }}
118
- size="xs"
119
- variant="border"
120
- spacingSize="xs2"
121
- iconOnly
122
- on:click={() => (resourceEditorDrawer?.initEdit(asset.path), (isOpen = false))}
123
- />
124
- {/if}
125
- {#if asset.kind === 'resource' && resourceDataCache[asset.path] === undefined}
126
- <Tooltip class="mr-2.5">
127
- <AlertTriangle size={16} class="text-orange-600 dark:text-orange-500" />
128
- <svelte:fragment slot="text">Could not find resource</svelte:fragment>
129
- </Tooltip>
130
- {/if}
131
- {#if assetCanBeExplored(asset, { resource_type: resourceDataCache[asset.path] })}
132
- <ExploreAssetButton
133
- {asset}
134
- {s3FilePicker}
135
- {dbManagerDrawer}
136
- onClick={() => (isOpen = false)}
137
- noText
138
- _resourceMetadata={{ resource_type: resourceDataCache[asset.path] }}
139
- />
140
- {/if}
141
-
142
- <ToggleButtonGroup
143
- disabled={!!asset.access_type}
144
- tabListClass={hasWarning ? 'bg-red-200 dark:bg-red-300' : ''}
145
- bind:selected={
146
- () => asset.access_type ?? fallbackAccessType,
147
- async (access_type) => {
148
- fallbackAccessTypes ??= []
149
- await tick()
150
- let val = fallbackAccessTypes?.filter((a) => !assetEq(a, asset))
151
- val.push({ ...asset, access_type })
152
- fallbackAccessTypes = val
153
- }
154
- }
155
- >
156
- {#snippet children({ item })}
157
- {#each ['r', 'w', 'rw'] as v}
158
- <ToggleButton
159
- class={hasWarning
160
- ? 'bg-transparent hover:bg-red-100 dark:text-primary-inverse'
161
- : ''}
162
- value={v}
163
- label={v}
164
- {item}
165
- tooltip={'Could not infer access type from code, please select manually'}
166
- />
167
- {/each}
168
- {/snippet}
169
- </ToggleButtonGroup>
170
- </div>
151
+ <AssetButtons
152
+ onClick={() => (isOpen = false)}
153
+ {asset}
154
+ {resourceDataCache}
155
+ {dbManagerDrawer}
156
+ {resourceEditorDrawer}
157
+ {s3FilePicker}
158
+ />
171
159
  </li>
172
160
  {/each}
173
161
  </ul>
@@ -1,16 +1,15 @@
1
- import { type Asset, type AssetWithAccessType } from './lib';
1
+ import { type Asset, type AssetWithAltAccessType } from './lib';
2
2
  import type { Placement } from '@floating-ui/core';
3
3
  type $$ComponentProps = {
4
- assets: AssetWithAccessType[];
4
+ assets: AssetWithAltAccessType[];
5
5
  enableChangeAnimation?: boolean;
6
6
  size?: 'xs' | '3xs';
7
7
  noBtnText?: boolean;
8
8
  popoverPlacement?: Placement;
9
9
  disableLiTooltip?: boolean;
10
- fallbackAccessTypes?: AssetWithAccessType[];
11
10
  onHoverLi?: (asset: Asset, eventType: 'enter' | 'leave') => void;
12
11
  liSubtitle?: (asset: Asset) => string;
13
12
  };
14
- declare const AssetsDropdownButton: import("svelte").Component<$$ComponentProps, {}, "fallbackAccessTypes">;
13
+ declare const AssetsDropdownButton: import("svelte").Component<$$ComponentProps, {}, "">;
15
14
  type AssetsDropdownButton = ReturnType<typeof AssetsDropdownButton>;
16
15
  export default AssetsDropdownButton;
@@ -1,7 +1,7 @@
1
- <script lang="ts">import { Drawer, DrawerContent } from '../common';
1
+ <script lang="ts">import { twMerge } from 'tailwind-merge';
2
+ import { Drawer, DrawerContent } from '../common';
2
3
  import RowIcon from '../common/table/RowIcon.svelte';
3
- import { assetDisplaysAsInputInFlowGraph, assetDisplaysAsOutputInFlowGraph } from '../graph/renderers/nodes/AssetNode.svelte';
4
- import { getAssetUsagePageUri } from './lib';
4
+ import { formatAssetAccessType, getAssetUsagePageUri } from './lib';
5
5
  let usagesDrawerData = $state();
6
6
  export function open(data) {
7
7
  usagesDrawerData = data;
@@ -27,13 +27,13 @@ export function open(data) {
27
27
  <span class="font-semibold">{u.path}</span>
28
28
  <span class="text-xs text-tertiary">{u.kind}</span>
29
29
  </div>
30
- <div class="flex gap-2">
31
- {#if assetDisplaysAsInputInFlowGraph(u)}
32
- <div class="text-xs border text-tertiary max-w-fit p-1 rounded-md">Read</div>
33
- {/if}
34
- {#if assetDisplaysAsOutputInFlowGraph(u)}
35
- <div class="text-xs border text-tertiary max-w-fit p-1 rounded-md">Write</div>
36
- {/if}
30
+ <div
31
+ class={twMerge(
32
+ 'text-xs font-normal border text-tertiary w-10 p-1 text-center rounded-md',
33
+ !u.access_type ? 'hover:bg-surface active:opacity-80' : ''
34
+ )}
35
+ >
36
+ {formatAssetAccessType(u.access_type)}
37
37
  </div>
38
38
  </a>
39
39
  </li>
@@ -0,0 +1,79 @@
1
+ <script lang="ts">import { ResourceService } from '../../gen';
2
+ import { inferAssets } from '../../infer';
3
+ import { workspaceStore } from '../../stores';
4
+ import { usePromise } from '../../svelte5Utils.svelte';
5
+ import { pruneNullishArrayWithSet, uniqueBy } from '../../utils';
6
+ import DbManagerDrawer from '../DBManagerDrawer.svelte';
7
+ import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte';
8
+ import S3FilePicker from '../S3FilePicker.svelte';
9
+ import AssetButtons from './AssetButtons.svelte';
10
+ import { formatAssetKind, getFlowModuleAssets, parseInputArgsAssets } from './lib';
11
+ let { job } = $props();
12
+ async function extractAssets(job) {
13
+ if (job.job_kind === 'flow') {
14
+ const additionalAssetsMap = {
15
+ // TODO : Transitive assets
16
+ };
17
+ return uniqueBy(pruneNullishArrayWithSet([
18
+ ...(job.raw_flow?.modules.flatMap((m) => getFlowModuleAssets(m, additionalAssetsMap)) ??
19
+ []),
20
+ ...parseInputArgsAssets(job.args ?? {})
21
+ ]), (x) => x.kind + x.path);
22
+ }
23
+ if (job.job_kind === 'script') {
24
+ return [
25
+ ...(await inferAssets(job.language, job.raw_code ?? '')),
26
+ ...parseInputArgsAssets(job.args ?? {})
27
+ ];
28
+ }
29
+ return [];
30
+ }
31
+ let assets = usePromise(() => extractAssets(job), { loadInit: false });
32
+ $effect(() => {
33
+ job.id;
34
+ $workspaceStore;
35
+ assets.refresh();
36
+ });
37
+ let resourceDataCache = $state({});
38
+ $effect(() => {
39
+ for (const asset of assets.value ?? []) {
40
+ if (asset.kind !== 'resource' || asset.path in resourceDataCache)
41
+ continue;
42
+ ResourceService.getResource({ path: asset.path, workspace: $workspaceStore })
43
+ .then((resource) => (resourceDataCache[asset.path] = resource.resource_type))
44
+ .catch((err) => (resourceDataCache[asset.path] = undefined));
45
+ }
46
+ });
47
+ let s3FilePicker = $state();
48
+ let dbManagerDrawer = $state();
49
+ let resourceEditorDrawer = $state();
50
+ </script>
51
+
52
+ <ul class="flex flex-col divide-y mt-1">
53
+ {#each assets.value ?? [] as asset}
54
+ <li class="flex justify-between py-3 leading-4 text-sm pl-4">
55
+ <div class="flex flex-col flex-1 truncate">
56
+ {asset.path}
57
+ <span class="text-2xs text-tertiary">
58
+ {formatAssetKind({
59
+ ...asset,
60
+ ...(asset.kind === 'resource'
61
+ ? { metadata: { resource_type: resourceDataCache[asset.path] } }
62
+ : {})
63
+ })}
64
+ </span>
65
+ </div>
66
+ <AssetButtons
67
+ {asset}
68
+ {resourceDataCache}
69
+ {dbManagerDrawer}
70
+ {resourceEditorDrawer}
71
+ {s3FilePicker}
72
+ />
73
+ </li>
74
+ {/each}
75
+ </ul>
76
+
77
+ <S3FilePicker bind:this={s3FilePicker} readOnlyMode />
78
+ <DbManagerDrawer bind:this={dbManagerDrawer} />
79
+ <ResourceEditorDrawer bind:this={resourceEditorDrawer} />
@@ -0,0 +1,7 @@
1
+ import { type Job } from '../../gen';
2
+ type Props = {
3
+ job: Job;
4
+ };
5
+ declare const JobAssetsViewer: import("svelte").Component<Props, {}, "">;
6
+ type JobAssetsViewer = ReturnType<typeof JobAssetsViewer>;
7
+ export default JobAssetsViewer;
File without changes
@@ -1,12 +1,16 @@
1
- import type { AssetKind as _AssetKind, Asset as _Asset, ListAssetsResponse, AssetUsageAccessType } from '../../gen';
1
+ import type { AssetKind as _AssetKind, Asset as _Asset, ListAssetsResponse, AssetUsageAccessType, FlowModule, ScriptArgs } from '../../gen';
2
2
  export type Asset = _Asset;
3
3
  export type AssetKind = _AssetKind;
4
4
  export type AssetWithAccessType = Asset & {
5
5
  access_type?: AssetUsageAccessType;
6
6
  };
7
+ export type AssetWithAltAccessType = AssetWithAccessType & {
8
+ alt_access_type?: AssetUsageAccessType;
9
+ };
7
10
  export declare function formatAsset(asset: Asset): string;
8
11
  export declare function getAssetUsagePageUri(usage: ListAssetsResponse[number]['usages'][number]): string | undefined;
9
12
  export declare function assetEq(a: Asset | undefined, b: Asset | undefined): boolean;
13
+ export declare function assetsEq(a: Asset[], b: Asset[]): boolean;
10
14
  export declare function parseAssetFromString(s: string): Asset | undefined;
11
15
  export declare function formatAssetKind(asset: {
12
16
  kind: AssetKind;
@@ -14,3 +18,7 @@ export declare function formatAssetKind(asset: {
14
18
  resource_type?: string;
15
19
  };
16
20
  }): string;
21
+ export declare function formatAssetAccessType(accessType: AssetUsageAccessType | undefined): "?" | "Read" | "Write" | "R/W";
22
+ export declare function getAccessType(asset: AssetWithAltAccessType): AssetUsageAccessType | undefined;
23
+ export declare function getFlowModuleAssets(flowModuleValue: FlowModule, additionalAssetsMap?: Record<string, AssetWithAccessType[]>): AssetWithAccessType[] | undefined;
24
+ export declare function parseInputArgsAssets(args: ScriptArgs): AssetWithAccessType[];