windmill-components 1.405.0 → 1.406.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/package/assets/app.css +20 -0
  2. package/package/components/AppConnectLightweightResourcePicker.svelte +66 -0
  3. package/package/components/AppConnectLightweightResourcePicker.svelte.d.ts +21 -0
  4. package/package/components/ArgInput.svelte +6 -2
  5. package/package/components/ArgInput.svelte.d.ts +1 -0
  6. package/package/components/CustomPopover.svelte +1 -1
  7. package/package/components/DisplayResult.svelte +1 -1
  8. package/package/components/FlowBuilder.svelte +2 -0
  9. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  10. package/package/components/FlowInputViewer.svelte +25 -0
  11. package/package/components/FlowInputViewer.svelte.d.ts +19 -0
  12. package/package/components/FlowJobResult.svelte +8 -1
  13. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  14. package/package/components/FlowMetadata.svelte +2 -2
  15. package/package/components/FlowPreviewContent.svelte +2 -1
  16. package/package/components/FlowStatusViewer.svelte +3 -1
  17. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  18. package/package/components/FlowStatusViewerInner.svelte +4 -1
  19. package/package/components/FlowViewer.svelte +2 -21
  20. package/package/components/LightweightResourcePicker.svelte +34 -30
  21. package/package/components/LogViewer.svelte +4 -3
  22. package/package/components/LogViewer.svelte.d.ts +1 -0
  23. package/package/components/ManualPopover.svelte +1 -1
  24. package/package/components/ObjectResourceInput.svelte +5 -2
  25. package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
  26. package/package/components/Popover.svelte +1 -1
  27. package/package/components/Portal.svelte +7 -8
  28. package/package/components/Portal.svelte.d.ts +3 -7
  29. package/package/components/QueueMetricsDrawer.svelte +368 -3
  30. package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -0
  31. package/package/components/ResourceEditor.svelte +4 -5
  32. package/package/components/ResourcePicker.svelte +14 -9
  33. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  34. package/package/components/RunForm.svelte +1 -1
  35. package/package/components/SavedInputs.svelte +2 -2
  36. package/package/components/ScriptVersionHistory.svelte +54 -59
  37. package/package/components/TestConnection.svelte +1 -0
  38. package/package/components/TimeAgo.svelte +5 -6
  39. package/package/components/TimeAgo.svelte.d.ts +1 -1
  40. package/package/components/apps/components/buttons/AppButton.svelte +1 -1
  41. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +1 -1
  42. package/package/components/apps/components/inputs/AppMultiSelect.svelte +1 -1
  43. package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +1 -1
  44. package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
  45. package/package/components/apps/components/layout/AppModal.svelte +1 -1
  46. package/package/components/apps/editor/AppEditor.svelte +11 -3
  47. package/package/components/apps/editor/GridEditor.svelte +57 -4
  48. package/package/components/apps/editor/GridEditor.svelte.d.ts +8 -0
  49. package/package/components/apps/editor/GridEditorMenu.svelte +1 -1
  50. package/package/components/apps/editor/SubGridEditor.svelte +82 -3
  51. package/package/components/apps/editor/SubGridEditor.svelte.d.ts +16 -0
  52. package/package/components/apps/editor/appUtils.d.ts +19 -2
  53. package/package/components/apps/editor/appUtils.js +103 -7
  54. package/package/components/apps/editor/component/Component.svelte +36 -8
  55. package/package/components/apps/editor/component/Component.svelte.d.ts +3 -1
  56. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +1 -1
  57. package/package/components/apps/svelte-grid/Grid.svelte +235 -12
  58. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +7 -7
  59. package/package/components/apps/svelte-grid/MoveResize.svelte +104 -11
  60. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +7 -0
  61. package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
  62. package/package/components/apps/svelte-grid/utils/item.js +2 -3
  63. package/package/components/apps/svelte-select/lib/ConditionalPortal.svelte +1 -1
  64. package/package/components/apps/svelte-select/lib/ConditionalPortalGlobal.svelte +1 -1
  65. package/package/components/common/button/ButtonDropdown.svelte +1 -1
  66. package/package/components/common/drawer/ConditionalPortal.svelte +1 -1
  67. package/package/components/common/menu/MenuV2.svelte +1 -1
  68. package/package/components/common/modal/AlwaysMountedModal.svelte +1 -1
  69. package/package/components/common/popup/PopupV2.svelte +1 -1
  70. package/package/components/copilot/StepGenQuick.svelte +3 -2
  71. package/package/components/copilot/StepGenQuick.svelte.d.ts +1 -0
  72. package/package/components/custom_ui.d.ts +1 -0
  73. package/package/components/details/Menu.svelte +1 -1
  74. package/package/components/flows/CreateActionsApp.svelte +1 -1
  75. package/package/components/flows/FlowEditor.svelte +2 -1
  76. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  77. package/package/components/flows/FlowHistory.svelte +10 -195
  78. package/package/components/flows/FlowHistory.svelte.d.ts +0 -1
  79. package/package/components/flows/FlowHistoryInner.svelte +200 -0
  80. package/package/components/flows/FlowHistoryInner.svelte.d.ts +19 -0
  81. package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
  82. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  83. package/package/components/flows/content/FlowInput.svelte +66 -58
  84. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  85. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  86. package/package/components/flows/header/FlowYamlEditor.svelte +6 -2
  87. package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
  88. package/package/components/flows/map/InsertModuleButton.svelte +1 -1
  89. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +1 -1
  90. package/package/components/graph/model.d.ts +1 -0
  91. package/package/components/icons/WindmillIcon.svelte +119 -105
  92. package/package/components/icons/store.d.ts +4 -0
  93. package/package/components/icons/store.js +1 -0
  94. package/package/components/multiselect/MultiSelectWrapper.svelte +1 -1
  95. package/package/components/propertyPicker/ObjectViewer.svelte +1 -1
  96. package/package/components/runs/RunRow.svelte +3 -7
  97. package/package/components/schema/FlowPropertyEditor.svelte +1 -0
  98. package/package/components/search/GlobalSearchModal.svelte +1 -1
  99. package/package/script_helpers.d.ts +37 -38
  100. package/package/script_helpers.js +100 -38
  101. package/package.json +23 -1
  102. package/package/init_scripts/python_failure_module.d.ts +0 -2
  103. package/package/init_scripts/python_failure_module.js +0 -8
  104. package/package/init_scripts/python_init_code.d.ts +0 -2
  105. package/package/init_scripts/python_init_code.js +0 -40
  106. package/package/init_scripts/python_init_code_clear.d.ts +0 -2
  107. package/package/init_scripts/python_init_code_clear.js +0 -5
  108. package/package/init_scripts/python_init_code_trigger.d.ts +0 -2
  109. package/package/init_scripts/python_init_code_trigger.js +0 -14
@@ -145,3 +145,23 @@ svelte-virtual-list-contents > * + * {
145
145
  rgba(255, 69, 58, 0.2) 20px
146
146
  );
147
147
  }
148
+
149
+ .bg-draggedover {
150
+ background-image: repeating-linear-gradient(
151
+ -45deg,
152
+ rgba(0, 0, 128, 0.2),
153
+ rgba(0, 0, 192, 0.2) 10px,
154
+ rgba(0, 0, 128, 0.2) 10px,
155
+ rgba(0, 0, 192, 0.2) 20px
156
+ );
157
+ }
158
+
159
+ .bg-draggedover-dark {
160
+ background-image: repeating-linear-gradient(
161
+ -45deg,
162
+ rgba(0, 0, 128, 0.6),
163
+ rgba(0, 0, 192, 0.6) 10px,
164
+ rgba(0, 0, 128, 0.6) 10px,
165
+ rgba(0, 0, 192, 0.6) 20px
166
+ );
167
+ }
@@ -0,0 +1,66 @@
1
+ <script>import { base } from '$app/paths';
2
+ import AppConnectInner from './AppConnectInner.svelte';
3
+ import DarkModeObserver from './DarkModeObserver.svelte';
4
+ import { Button } from './common';
5
+ import { workspaceStore } from '../stores';
6
+ import { onMount } from 'svelte';
7
+ export let resourceType = undefined;
8
+ export let workspace;
9
+ export let express = false;
10
+ let step = 1;
11
+ let disabled = false;
12
+ let isGoogleSignin = false;
13
+ let manual = true;
14
+ let appConnect = undefined;
15
+ let darkMode = false;
16
+ if (workspace) {
17
+ $workspaceStore = workspace;
18
+ }
19
+ onMount(async () => {
20
+ if (resourceType) {
21
+ appConnect?.open(resourceType, express);
22
+ }
23
+ });
24
+ </script>
25
+
26
+ <DarkModeObserver bind:darkMode />
27
+
28
+ <div>
29
+ <div class="flex flex-row-reverse w-full">
30
+ <div class="flex gap-2">
31
+ {#if step > 2}
32
+ <Button variant="border" on:click={appConnect?.back}>Back</Button>
33
+ {/if}
34
+
35
+ {#if isGoogleSignin}
36
+ <button {disabled} on:click={appConnect?.next}>
37
+ <img
38
+ class="h-10 w-auto object-contain"
39
+ src={darkMode ? base + '/google_signin_dark.png' : base + '/google_signin_light.png'}
40
+ alt="Google sign-in"
41
+ />
42
+ </button>
43
+ {:else}
44
+ <Button {disabled} on:click={appConnect?.next}>
45
+ {#if step == 2 && !manual}
46
+ Connect
47
+ {:else if step == 1}
48
+ Next
49
+ {:else}
50
+ Save
51
+ {/if}
52
+ </Button>
53
+ {/if}
54
+ </div>
55
+ </div>
56
+ <AppConnectInner
57
+ bind:this={appConnect}
58
+ bind:step
59
+ bind:resourceType
60
+ bind:isGoogleSignin
61
+ bind:disabled
62
+ bind:manual
63
+ on:error
64
+ on:refresh
65
+ />
66
+ </div>
@@ -0,0 +1,21 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ resourceType?: string | undefined;
5
+ workspace: string;
6
+ express?: boolean | undefined;
7
+ };
8
+ events: {
9
+ error: CustomEvent<any>;
10
+ refresh: CustomEvent<any>;
11
+ } & {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {};
15
+ };
16
+ export type AppConnectLightweightResourcePickerProps = typeof __propDef.props;
17
+ export type AppConnectLightweightResourcePickerEvents = typeof __propDef.events;
18
+ export type AppConnectLightweightResourcePickerSlots = typeof __propDef.slots;
19
+ export default class AppConnectLightweightResourcePicker extends SvelteComponent<AppConnectLightweightResourcePickerProps, AppConnectLightweightResourcePickerEvents, AppConnectLightweightResourcePickerSlots> {
20
+ }
21
+ export {};
@@ -67,6 +67,7 @@ export let order = undefined;
67
67
  export let editor = undefined;
68
68
  export let orderEditable = false;
69
69
  export let shouldDispatchChanges = false;
70
+ export let noDefaultOnSelectFirst = false;
70
71
  export let helperScript = undefined;
71
72
  export let otherArgs = {};
72
73
  let oneOfSelected = undefined;
@@ -495,11 +496,14 @@ $: shouldDispatchChanges && debounced(value);
495
496
  {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format.split('-').length > 1 && resourceTypes.includes(format.substring('resource-'.length))))}
496
497
  <ObjectResourceInput
497
498
  {defaultValue}
498
- selectFirst
499
+ selectFirst={!noDefaultOnSelectFirst}
499
500
  {disablePortal}
500
501
  {format}
501
502
  bind:value
502
503
  bind:editor
504
+ on:clear={() => {
505
+ defaultValue = null
506
+ }}
503
507
  {showSchemaExplorer}
504
508
  />
505
509
  {:else if inputCat == 'resource-object' && format.split('-').length > 1 && format
@@ -765,7 +769,7 @@ $: shouldDispatchChanges && debounced(value);
765
769
  </div>
766
770
  {:else if inputCat == 'resource-string'}
767
771
  <ResourcePicker
768
- selectFirst
772
+ selectFirst={noDefaultOnSelectFirst}
769
773
  {disablePortal}
770
774
  bind:value
771
775
  initialValue={defaultValue}
@@ -57,6 +57,7 @@ declare const __propDef: {
57
57
  editor?: SimpleEditor | undefined;
58
58
  orderEditable?: boolean | undefined;
59
59
  shouldDispatchChanges?: boolean | undefined;
60
+ noDefaultOnSelectFirst?: boolean | undefined;
60
61
  helperScript?: {
61
62
  type: 'inline';
62
63
  path?: string | undefined;
@@ -59,7 +59,7 @@ $: focusEl && focusEl?.focus();
59
59
  </button>
60
60
  {/if}
61
61
  {#if showTooltip && !disablePopup}
62
- <Portal>
62
+ <Portal name="custom-popover">
63
63
  <!-- svelte-ignore a11y-no-static-element-interactions -->
64
64
  <div
65
65
  use:popperContent={popperOptions}
@@ -774,7 +774,7 @@ let seeS3PreviewFileFromList = '';
774
774
  </DrawerContent>
775
775
  </Drawer>
776
776
 
777
- <Portal>
777
+ <Portal name="s3filepicker">
778
778
  <S3FilePicker bind:this={s3FileViewer} readOnlyMode={true} />
779
779
  </Portal>
780
780
  {/if}
@@ -48,6 +48,7 @@ export let savedFlow = undefined;
48
48
  export let diffDrawer = undefined;
49
49
  export let customUi = {};
50
50
  export let disableAi = false;
51
+ export let disabledFlowInputs = false;
51
52
  $: setContext('customUi', customUi);
52
53
  const dispatch = createEventDispatcher();
53
54
  async function createSchedule(path) {
@@ -1134,6 +1135,7 @@ let msgInput = undefined;
1134
1135
  <!-- metadata -->
1135
1136
  {#if $flowStateStore}
1136
1137
  <FlowEditor
1138
+ {disabledFlowInputs}
1137
1139
  disableAi={disableAi || customUi?.stepInputs?.ai == false}
1138
1140
  disableSettings={customUi?.settingsPanel === false}
1139
1141
  {loading}
@@ -20,6 +20,7 @@ declare const __propDef: {
20
20
  diffDrawer?: DiffDrawer | undefined;
21
21
  customUi?: FlowBuilderWhitelabelCustomUi | undefined;
22
22
  disableAi?: boolean | undefined;
23
+ disabledFlowInputs?: boolean | undefined;
23
24
  computeUnlockedSteps?: ((flow: Flow) => {
24
25
  [k: string]: string;
25
26
  }) | undefined;
@@ -0,0 +1,25 @@
1
+ <script>import FieldHeader from './FieldHeader.svelte';
2
+ export let schema;
3
+ </script>
4
+
5
+ <ul class="my-2">
6
+ {#if schema == undefined}
7
+ <li class="text-secondary text-xs italic mb-4">No inputs</li>
8
+ {:else}
9
+ {#each Object.entries(schema.properties ?? {}) as [inp, v]}
10
+ <li class="list-disc flex flex-row items-center">
11
+ <FieldHeader
12
+ label={inp}
13
+ required={Array.isArray(schema.required) && schema.required?.includes(inp)}
14
+ type={v?.type}
15
+ contentEncoding={v?.contentEncoding}
16
+ format={v?.format}
17
+ /><span class="ml-4 mt-1 text-xs"
18
+ >{v?.default != undefined && v?.default != ''
19
+ ? 'default: ' + JSON.stringify(v?.default)
20
+ : ''}</span
21
+ >
22
+ </li>
23
+ {/each}
24
+ {/if}
25
+ </ul>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { Schema } from '../common';
3
+ declare const __propDef: {
4
+ props: {
5
+ schema: Schema | {
6
+ [key: string]: unknown;
7
+ } | undefined;
8
+ };
9
+ events: {
10
+ [evt: string]: CustomEvent<any>;
11
+ };
12
+ slots: {};
13
+ };
14
+ export type FlowInputViewerProps = typeof __propDef.props;
15
+ export type FlowInputViewerEvents = typeof __propDef.events;
16
+ export type FlowInputViewerSlots = typeof __propDef.slots;
17
+ export default class FlowInputViewer extends SvelteComponent<FlowInputViewerProps, FlowInputViewerEvents, FlowInputViewerSlots> {
18
+ }
19
+ export {};
@@ -18,6 +18,7 @@ export let tag = undefined;
18
18
  export let workspaceId = undefined;
19
19
  export let refreshLog = false;
20
20
  export let durationStates;
21
+ export let downloadLogs = true;
21
22
  let lastJobId = undefined;
22
23
  let drawer = undefined;
23
24
  $: jobId != lastJobId && diffJobId();
@@ -76,6 +77,12 @@ async function getLogs() {
76
77
  <div class="absolute z-40 text-xs top-0 left-1"
77
78
  ><button class="" on:click={drawer.openDrawer}>explore all steps' logs</button></div
78
79
  >
79
- <LogViewer content={logs ?? ''} {jobId} isLoading={waitingForExecutor} {tag} />
80
+ <LogViewer
81
+ download={downloadLogs}
82
+ content={logs ?? ''}
83
+ {jobId}
84
+ isLoading={waitingForExecutor}
85
+ {tag}
86
+ />
80
87
  </div>
81
88
  </div>
@@ -15,6 +15,7 @@ declare const __propDef: {
15
15
  workspaceId?: string | undefined;
16
16
  refreshLog?: boolean | undefined;
17
17
  durationStates: Writable<Record<string, DurationStatus>> | undefined;
18
+ downloadLogs?: boolean | undefined;
18
19
  };
19
20
  events: {
20
21
  [evt: string]: CustomEvent<any>;
@@ -24,7 +24,7 @@ export let scheduleEditor;
24
24
  {#if job['success'] != undefined}
25
25
  Received job: {displayDate(job.created_at ?? '')}
26
26
  {:else}
27
- Received job <TimeAgo withDate date={job.created_at ?? ''} />
27
+ Received job <TimeAgo date={job.created_at ?? ''} />
28
28
  {/if}
29
29
  <Tooltip small>{job?.created_at}</Tooltip>
30
30
  </span>
@@ -33,7 +33,7 @@ export let scheduleEditor;
33
33
  <div class="flex flex-row gap-2 items-center text-sm">
34
34
  <Clock size={SMALL_ICON_SIZE} class="text-secondary min-w-3.5" />
35
35
  <span class="whitespace-nowrap">
36
- Started <TimeAgo withDate agoOnlyIfRecent date={job.started_at ?? ''} />
36
+ Started <TimeAgo agoOnlyIfRecent date={job.started_at ?? ''} />
37
37
  <Tooltip small>{job?.started_at}</Tooltip>
38
38
  </span>
39
39
  </div>
@@ -28,7 +28,7 @@ let jobProgressReset;
28
28
  export function test() {
29
29
  runPreview($previewArgs, undefined);
30
30
  }
31
- const { selectedId, previewArgs, flowStateStore, flowStore, pathStore, initialPath } = getContext('FlowEditorContext');
31
+ const { selectedId, previewArgs, flowStateStore, flowStore, pathStore, initialPath, customUi } = getContext('FlowEditorContext');
32
32
  const dispatch = createEventDispatcher();
33
33
  function extractFlow(previewMode) {
34
34
  if (previewMode === 'whole') {
@@ -310,6 +310,7 @@ let renderCount = 0;
310
310
  <div class="pt-4 flex flex-col grow">
311
311
  {#if jobId}
312
312
  <FlowStatusViewer
313
+ hideDownloadInGraph={customUi?.downloadLogs === false}
313
314
  wideResults
314
315
  {flowStateStore}
315
316
  {jobId}
@@ -13,6 +13,7 @@ export let hideTimeline = false;
13
13
  export let hideDownloadInGraph = false;
14
14
  export let hideNodeDefinition = false;
15
15
  export let hideJobId = false;
16
+ export let hideDownloadLogs = false;
16
17
  export let isOwner = false;
17
18
  export let wideResults = false;
18
19
  let lastJobId = jobId;
@@ -25,7 +26,8 @@ setContext('FlowStatusViewer', {
25
26
  hideDownloadInGraph,
26
27
  hideNodeDefinition,
27
28
  hideTimeline,
28
- hideJobId
29
+ hideJobId,
30
+ hideDownloadLogs
29
31
  });
30
32
  function loadOwner(path) {
31
33
  isOwner = loadIsOwner(path, $userStore, workspaceId ?? $workspaceStore);
@@ -14,6 +14,7 @@ declare const __propDef: {
14
14
  hideDownloadInGraph?: boolean | undefined;
15
15
  hideNodeDefinition?: boolean | undefined;
16
16
  hideJobId?: boolean | undefined;
17
+ hideDownloadLogs?: boolean | undefined;
17
18
  isOwner?: boolean | undefined;
18
19
  wideResults?: boolean | undefined;
19
20
  };
@@ -22,7 +22,7 @@ import Alert from './common/alert/Alert.svelte';
22
22
  import FlowGraphViewerStep from './FlowGraphViewerStep.svelte';
23
23
  import FlowGraphV2 from './graph/FlowGraphV2.svelte';
24
24
  const dispatch = createEventDispatcher();
25
- let { flowStateStore, retryStatus, suspendStatus, hideDownloadInGraph, hideTimeline, hideNodeDefinition } = getContext('FlowStatusViewer');
25
+ let { flowStateStore, retryStatus, suspendStatus, hideDownloadInGraph, hideTimeline, hideNodeDefinition, hideDownloadLogs } = getContext('FlowStatusViewer');
26
26
  export let jobId;
27
27
  export let initialJob = undefined;
28
28
  export let workspaceId = undefined;
@@ -540,6 +540,7 @@ let wrapperHeight = 0;
540
540
  result={job.result}
541
541
  logs={job.logs}
542
542
  durationStates={localDurationStatuses}
543
+ downloadLogs={!hideDownloadLogs}
543
544
  />
544
545
  </div>
545
546
  {/if}
@@ -897,6 +898,7 @@ let wrapperHeight = 0;
897
898
  result={job['result']}
898
899
  logs={job.logs ?? ''}
899
900
  durationStates={localDurationStatuses}
901
+ downloadLogs={!hideDownloadLogs}
900
902
  />
901
903
  {:else if selectedNode == 'start'}
902
904
  {#if job.args}
@@ -972,6 +974,7 @@ let wrapperHeight = 0;
972
974
  tag={node.tag}
973
975
  logs={node.logs}
974
976
  durationStates={localDurationStatuses}
977
+ downloadLogs={!hideDownloadLogs}
975
978
  />
976
979
  {:else}
977
980
  <p class="p-2 text-tertiary italic"
@@ -1,9 +1,9 @@
1
1
  <script>import { Tab, Tabs, TabContent } from './common';
2
2
  import SchemaViewer from './SchemaViewer.svelte';
3
- import FieldHeader from './FieldHeader.svelte';
4
3
  import FlowGraphViewer from './FlowGraphViewer.svelte';
5
4
  import HighlightTheme from './HighlightTheme.svelte';
6
5
  import FlowViewerInner from './FlowViewerInner.svelte';
6
+ import FlowInputViewer from './FlowInputViewer.svelte';
7
7
  export let flow;
8
8
  export let initialOpen = undefined;
9
9
  export let noSide = false;
@@ -15,9 +15,6 @@ let open = {};
15
15
  if (initialOpen) {
16
16
  open[initialOpen] = true;
17
17
  }
18
- function toAny(x) {
19
- return x;
20
- }
21
18
  </script>
22
19
 
23
20
  <HighlightTheme />
@@ -41,23 +38,7 @@ function toAny(x) {
41
38
  <span>Flow Input</span>
42
39
  </p>
43
40
  {#if flow.schema && flow.schema.properties && Object.keys(flow.schema.properties).length > 0 && flow.schema}
44
- <ul class="my-2">
45
- {#each Object.entries(flow.schema.properties) as [inp, v]}
46
- <li class="list-disc flex flex-row">
47
- <FieldHeader
48
- label={inp}
49
- required={flow.schema.required?.includes(inp)}
50
- type={toAny(v)?.type}
51
- contentEncoding={toAny(v)?.contentEncoding}
52
- format={toAny(v)?.format}
53
- /><span class="ml-4 mt-2 text-xs"
54
- >{toAny(v)?.default != undefined
55
- ? 'default: ' + JSON.stringify(toAny(v)?.default)
56
- : ''}</span
57
- >
58
- </li>
59
- {/each}
60
- </ul>
41
+ <FlowInputViewer schema={flow.schema} />
61
42
  {:else}
62
43
  <div class="text-secondary text-xs italic mb-4">No inputs</div>
63
44
  {/if}
@@ -1,12 +1,11 @@
1
1
  <script>import { ResourceService } from '../gen';
2
- import { base } from '../base';
3
2
  import { workspaceStore } from '../stores';
4
3
  import { createEventDispatcher, getContext } from 'svelte';
5
4
  import Select from './apps/svelte-select/lib/index';
6
5
  import { SELECT_INPUT_DEFAULT_STYLE } from '../defaults';
7
6
  import DarkModeObserver from './DarkModeObserver.svelte';
8
7
  import { Button, Drawer, DrawerContent } from './common';
9
- import { Plus } from 'lucide-svelte';
8
+ import { Plus, Loader2 } from 'lucide-svelte';
10
9
  import { sendUserToast } from '../toast';
11
10
  const dispatch = createEventDispatcher();
12
11
  export let initialValue = undefined;
@@ -47,21 +46,6 @@ export function askNewResource() {
47
46
  refreshCount += 1;
48
47
  open = true;
49
48
  }
50
- function processEvent(event) {
51
- if (event.origin !== window.location.origin) {
52
- return;
53
- }
54
- if (event.data.type === 'error') {
55
- sendUserToast(event.data.error, true);
56
- }
57
- if (event.data.type === 'refresh') {
58
- window.removeEventListener('message', processEvent);
59
- value = event.data.detail;
60
- valueSelect = { value, label: value };
61
- drawer?.closeDrawer?.();
62
- open = false;
63
- }
64
- }
65
49
  </script>
66
50
 
67
51
  <DarkModeObserver bind:darkMode />
@@ -69,12 +53,15 @@ function processEvent(event) {
69
53
  {#if expressOAuthSetup}
70
54
  {#if open}
71
55
  {#key refreshCount}
72
- <iframe
73
- title="App connection"
74
- class="w-full h-full hidden"
75
- src="{base}/embed_connect?resource_type={resourceType}&workspace={appViewerContext?.workspace ??
76
- $workspaceStore}&express=true"
77
- />
56
+ {#await import('./AppConnectLightweightResourcePicker.svelte')}
57
+ <Loader2 class="animate-spin" />
58
+ {:then Module}
59
+ <Module.default
60
+ workspace={appViewerContext?.workspace ?? $workspaceStore}
61
+ {resourceType}
62
+ express={true}
63
+ />
64
+ {/await}
78
65
  {/key}
79
66
  {/if}
80
67
  {:else}
@@ -85,12 +72,31 @@ function processEvent(event) {
85
72
  tooltip="Resources represent connections to third party systems. Learn more on how to integrate external APIs."
86
73
  documentationLink="https://www.windmill.dev/docs/integrations/integrations_on_windmill"
87
74
  >
88
- <iframe
75
+ {#await import('./AppConnectLightweightResourcePicker.svelte')}
76
+ <Loader2 class="animate-spin" />
77
+ {:then Module}
78
+ <Module.default
79
+ workspace={appViewerContext?.workspace ?? $workspaceStore}
80
+ {resourceType}
81
+ express={false}
82
+ on:error={(e) => {
83
+ sendUserToast(e.detail, true)
84
+ }}
85
+ on:refresh={(e) => {
86
+ value = e.detail
87
+ valueSelect = { value, label: value }
88
+ drawer?.closeDrawer?.()
89
+ open = false
90
+ }}
91
+ />
92
+ {/await}
93
+
94
+ <!-- <iframe
89
95
  title="App connection"
90
96
  class="w-full h-full"
91
97
  src="{base}/embed_connect?resource_type={resourceType}&workspace={appViewerContext?.workspace ??
92
98
  $workspaceStore}&express=false"
93
- />
99
+ /> -->
94
100
  </DrawerContent>
95
101
  </Drawer>
96
102
  {/if}
@@ -122,13 +128,11 @@ function processEvent(event) {
122
128
  <Button
123
129
  {disabled}
124
130
  color="light"
125
- variant="border"
126
- size="xs"
131
+ variant="contained"
132
+ btnClasses="w-8 px-0.5 py-1.5"
133
+ size="sm"
127
134
  on:click={() => {
128
135
  open = true
129
- window.removeEventListener('message', processEvent)
130
- window.addEventListener('message', processEvent)
131
-
132
136
  drawer?.openDrawer?.()
133
137
  }}
134
138
  startIcon={{ icon: Plus }}
@@ -26,6 +26,7 @@ export let small = false;
26
26
  export let drawerOpen = false;
27
27
  export let noMaxH = false;
28
28
  export let noAutoScroll = false;
29
+ export let download = true;
29
30
  // @ts-ignore
30
31
  const ansi_up = new AnsiUp();
31
32
  ansi_up.use_classes = true;
@@ -75,7 +76,7 @@ $: truncatedContent = truncateContent(content, loadedFromObjectStore, LOG_LIMIT)
75
76
  $: prefixIndex = findPrefixIndex(truncatedContent);
76
77
  $: downloadStartUrl = findStartUrl(truncatedContent, prefixIndex);
77
78
  function truncateContent(jobContent, loadedFromObjectStore, limit) {
78
- let content = loadedFromObjectStore + jobContent ?? '';
79
+ let content = loadedFromObjectStore + (jobContent ?? '');
79
80
  if (content.length > limit) {
80
81
  return content.substring(content.length - limit);
81
82
  }
@@ -121,7 +122,7 @@ function showMoreTruncate(len) {
121
122
  <Drawer bind:this={logViewer} bind:open={drawerOpen} size="900px">
122
123
  <DrawerContent title="Expanded Logs" on:close={logViewer.closeDrawer}>
123
124
  <svelte:fragment slot="actions">
124
- {#if jobId}
125
+ {#if jobId && download}
125
126
  <Button
126
127
  href="{base}/api/w/{$workspaceStore}/jobs_u/get_logs/{jobId}"
127
128
  download="windmill_logs_{jobId}.txt"
@@ -169,7 +170,7 @@ function showMoreTruncate(len) {
169
170
  >
170
171
  <div class="sticky z-10 top-0 right-0 w-full flex flex-row-reverse justify-between text-sm">
171
172
  <div class="flex gap-2 pl-0.5 bg-surface-secondary">
172
- {#if jobId}
173
+ {#if jobId && download}
173
174
  <div class="flex items-center">
174
175
  <a
175
176
  class="text-primary pb-0.5"
@@ -12,6 +12,7 @@ declare const __propDef: {
12
12
  drawerOpen?: boolean | undefined;
13
13
  noMaxH?: boolean | undefined;
14
14
  noAutoScroll?: boolean | undefined;
15
+ download?: boolean | undefined;
15
16
  scrollToBottom?: (() => void) | undefined;
16
17
  };
17
18
  events: {
@@ -20,7 +20,7 @@ export function close() {
20
20
  <slot />
21
21
  </fragment>
22
22
  {#if showTooltip}
23
- <Portal>
23
+ <Portal name="manual-popover">
24
24
  <div
25
25
  use:popperContent
26
26
  class={twMerge('z-[901] rounded-lg shadow-md border p-4 bg-surface', $$props.class)}
@@ -14,7 +14,7 @@ function isString(value) {
14
14
  }
15
15
  export let path = '';
16
16
  function resourceToValue() {
17
- if (path) {
17
+ if (path && path != '') {
18
18
  value = `$res:${path}`;
19
19
  }
20
20
  else {
@@ -43,8 +43,11 @@ $: value && valueToPath();
43
43
  path = e.detail
44
44
  resourceToValue()
45
45
  }}
46
+ on:clear
46
47
  bind:value={path}
47
- initialValue={defaultValue}
48
+ initialValue={typeof defaultValue == 'string' && defaultValue.startsWith('$res:')
49
+ ? defaultValue.substr('$res:'.length)
50
+ : defaultValue}
48
51
  resourceType={format.split('-').length > 1 ? format.substring('resource-'.length) : undefined}
49
52
  {showSchemaExplorer}
50
53
  />
@@ -12,6 +12,8 @@ declare const __propDef: {
12
12
  path?: string | undefined;
13
13
  };
14
14
  events: {
15
+ clear: CustomEvent<any>;
16
+ } & {
15
17
  [evt: string]: CustomEvent<any>;
16
18
  };
17
19
  slots: {};
@@ -60,7 +60,7 @@ function close() {
60
60
  </button>
61
61
  {/if}
62
62
  {#if showTooltip && !disablePopup}
63
- <Portal>
63
+ <Portal name="popover">
64
64
  <!-- svelte-ignore a11y-no-static-element-interactions -->
65
65
  <div
66
66
  use:popperContent={popperOptions}
@@ -1,13 +1,8 @@
1
1
  <script context="module">
2
2
  import { tick } from 'svelte'
3
3
 
4
- /**
5
- * Usage: <div use:portal={'css selector'}> or <div use:portal={document.body}>
6
- *
7
- * @param {HTMLElement} el
8
- * @param {HTMLElement|string} target DOM Element or CSS Selector
9
- */
10
- export function portal(el, target = 'body') {
4
+ export function portal(el, options) {
5
+ let { target, name } = options
11
6
  let targetEl
12
7
  async function update(newTarget) {
13
8
  target = newTarget
@@ -32,6 +27,9 @@
32
27
  if (!el.classList.contains('windmill-app')) {
33
28
  el.classList.add('windmill-app')
34
29
  }
30
+ if (name && !el.classList.contains(name)) {
31
+ el.classList.add(name)
32
+ }
35
33
  targetEl.appendChild(el)
36
34
  el.hidden = false
37
35
  }
@@ -56,8 +54,9 @@
56
54
  * @type { HTMLElement|string}
57
55
  */
58
56
  export let target = 'body'
57
+ export let name = undefined
59
58
  </script>
60
59
 
61
- <div use:portal={target} hidden>
60
+ <div use:portal={{ target, name }} hidden>
62
61
  <slot />
63
62
  </div>