windmill-components 1.430.6 → 1.434.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 (37) hide show
  1. package/package/components/AppConnectInner.svelte +27 -2
  2. package/package/components/ConfirmButton.svelte +31 -0
  3. package/package/components/ConfirmButton.svelte.d.ts +20 -0
  4. package/package/components/DiffEditor.svelte +0 -6
  5. package/package/components/FlowStatusViewerInner.svelte +74 -49
  6. package/package/components/InstanceSettings.svelte +20 -1
  7. package/package/components/Login.svelte +31 -6
  8. package/package/components/ServiceLogsInner.svelte +365 -337
  9. package/package/components/apps/components/buttons/AppSchemaForm.svelte +1 -1
  10. package/package/components/apps/components/display/AppNavbarItem.svelte +1 -1
  11. package/package/components/apps/components/helpers/RunnableComponent.svelte +2 -2
  12. package/package/components/apps/components/inputs/AppS3FileInput.svelte +1 -1
  13. package/package/components/apps/editor/AppEditor.svelte +18 -8
  14. package/package/components/apps/editor/AppEditor.svelte.d.ts +5 -0
  15. package/package/components/apps/editor/AppEditorHeader.svelte +61 -61
  16. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +2 -0
  17. package/package/components/apps/editor/AppPreview.svelte +6 -1
  18. package/package/components/apps/editor/AppReportsDrawer.svelte +3 -613
  19. package/package/components/apps/editor/AppReportsDrawerInner.svelte +622 -0
  20. package/package/components/apps/editor/AppReportsDrawerInner.svelte.d.ts +17 -0
  21. package/package/components/apps/editor/component/components.d.ts +79 -79
  22. package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +1 -1
  23. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +1 -1
  24. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +1 -1
  25. package/package/components/apps/types.d.ts +1 -1
  26. package/package/components/graph/FlowGraphV2.svelte +11 -1
  27. package/package/components/graph/graphBuilder.js +1 -0
  28. package/package/components/splitPanes/SplitPanesOrColumnOnMobile.svelte +34 -0
  29. package/package/components/splitPanes/SplitPanesOrColumnOnMobile.svelte.d.ts +23 -0
  30. package/package/components/wizards/AppPicker.svelte +4 -4
  31. package/package/gen/core/OpenAPI.js +1 -1
  32. package/package/gen/schemas.gen.d.ts +2 -2
  33. package/package/gen/schemas.gen.js +2 -2
  34. package/package/gen/services.gen.d.ts +0 -1
  35. package/package/gen/services.gen.js +0 -2
  36. package/package/gen/types.gen.d.ts +2 -4
  37. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
  import IconedResourceType from './IconedResourceType.svelte';
3
3
  import { OauthService, ResourceService, VariableService } from '../gen';
4
4
  import { emptyString, truncateRev, urlize } from '../utils';
5
- import { createEventDispatcher } from 'svelte';
5
+ import { createEventDispatcher, onDestroy } from 'svelte';
6
6
  import Path from './Path.svelte';
7
7
  import { Button, Skeleton } from './common';
8
8
  import ApiConnectForm from './ApiConnectForm.svelte';
@@ -139,8 +139,32 @@ function popupListener(event) {
139
139
  return;
140
140
  }
141
141
  window.removeEventListener('message', popupListener);
142
+ processPopupData(data);
143
+ }
144
+ function handleStorageEvent(event) {
145
+ if (event.key === 'oauth-callback') {
146
+ try {
147
+ processPopupData(JSON.parse(event.newValue));
148
+ console.log('OAuth from storage', event.newValue);
149
+ // Clean up
150
+ localStorage.removeItem('oauth-callback');
151
+ window.removeEventListener('storage', handleStorageEvent);
152
+ }
153
+ catch (e) {
154
+ console.error('Error processing oauth-callback', e);
155
+ }
156
+ }
157
+ else {
158
+ console.log('Storage event', event.key);
159
+ }
160
+ }
161
+ onDestroy(() => {
162
+ window.removeEventListener('message', popupListener);
163
+ window.removeEventListener('storage', handleStorageEvent);
164
+ });
165
+ function processPopupData(data) {
142
166
  if (data.type === 'error') {
143
- sendUserToast(event.data.error, true);
167
+ sendUserToast(data.error, true);
144
168
  step = 2;
145
169
  }
146
170
  else if (data.type === 'success') {
@@ -192,6 +216,7 @@ export async function next() {
192
216
  // window.location.href = url.toString()
193
217
  // } else {
194
218
  window.addEventListener('message', popupListener);
219
+ window.addEventListener('storage', handleStorageEvent);
195
220
  window.open(url.toString(), '_blank', 'popup=true');
196
221
  step += 1;
197
222
  // dispatch('close')
@@ -0,0 +1,31 @@
1
+ <script>import { Button } from './common';
2
+ import { Check, X } from 'lucide-svelte';
3
+ import { createEventDispatcher } from 'svelte';
4
+ export let confirmation = 'Are you sure?';
5
+ let firstClick = false;
6
+ const dispatch = createEventDispatcher();
7
+ </script>
8
+
9
+ <div class="p-2 flex flex-row w-full gap-2">
10
+ {#if !firstClick}
11
+ <Button
12
+ on:click={() => {
13
+ firstClick = true
14
+ }}><slot /></Button
15
+ >
16
+ {:else}
17
+ {confirmation}
18
+ <Button
19
+ color="red"
20
+ on:click={() => {
21
+ firstClick = false
22
+ dispatch('click')
23
+ }}><Check /></Button
24
+ >
25
+ <Button
26
+ on:click={() => {
27
+ firstClick = false
28
+ }}><X /></Button
29
+ >
30
+ {/if}
31
+ </div>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ confirmation?: string | undefined;
5
+ };
6
+ events: {
7
+ click: CustomEvent<any>;
8
+ } & {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {
12
+ default: {};
13
+ };
14
+ };
15
+ export type ConfirmButtonProps = typeof __propDef.props;
16
+ export type ConfirmButtonEvents = typeof __propDef.events;
17
+ export type ConfirmButtonSlots = typeof __propDef.slots;
18
+ export default class ConfirmButton extends SvelteComponent<ConfirmButtonProps, ConfirmButtonEvents, ConfirmButtonSlots> {
19
+ }
20
+ export {};
@@ -42,12 +42,8 @@ async function loadDiffEditor() {
42
42
  if (defaultOriginal !== undefined &&
43
43
  defaultModified !== undefined &&
44
44
  defaultLang !== undefined) {
45
- console.log('SETUP');
46
45
  setupModel(defaultLang, defaultOriginal, defaultModified, defaultModifiedLang);
47
46
  }
48
- else {
49
- console.log('NO SETUP', defaultOriginal, defaultModified, defaultLang);
50
- }
51
47
  }
52
48
  export function setupModel(lang, original, modified, modifiedLang) {
53
49
  diffEditor?.setModel({
@@ -62,7 +58,6 @@ export function setupModel(lang, original, modified, modifiedLang) {
62
58
  }
63
59
  }
64
60
  export function setOriginal(code) {
65
- console.log('setOriginal', code);
66
61
  diffEditor?.getModel()?.original?.setValue(code);
67
62
  defaultOriginal = code;
68
63
  }
@@ -77,7 +72,6 @@ export function getModified() {
77
72
  return diffEditor?.getModel()?.modified.getValue() ?? '';
78
73
  }
79
74
  export function show() {
80
- console.log('show');
81
75
  open = true;
82
76
  }
83
77
  export function hide() {
@@ -67,36 +67,42 @@ function onFlowModuleId() {
67
67
  }
68
68
  }
69
69
  function updateModuleStates(moduleState, key, newValue, keepType) {
70
- moduleState.update((x) => {
71
- if (newValue.selectedForloop != undefined &&
72
- x[key]?.selectedForloop != undefined &&
73
- newValue.selectedForloop != x[key].selectedForloop) {
74
- if (newValue.type == 'InProgress') {
75
- x[key].type = 'InProgress';
76
- }
77
- return x;
78
- }
79
- if (x[key]?.selectedForLoopSetManually) {
80
- if (newValue.selectedForloop != undefined &&
81
- x[key]?.selectedForloop != newValue.selectedForloop) {
82
- return x;
83
- }
84
- else {
85
- newValue.selectedForLoopSetManually = true;
86
- newValue.selectedForloopIndex = x[key]?.selectedForloopIndex;
87
- newValue.selectedForloop = x[key]?.selectedForloop;
88
- }
70
+ const state = get(moduleState);
71
+ if (newValue.selectedForloop != undefined &&
72
+ state[key]?.selectedForloop != undefined &&
73
+ newValue.selectedForloop != state[key].selectedForloop) {
74
+ if (newValue.type == 'InProgress' && state[key]?.type != 'InProgress') {
75
+ moduleState.update((state) => {
76
+ state[key].type = 'InProgress';
77
+ return state;
78
+ });
89
79
  }
90
- else if (x[key]?.selectedForloopIndex != undefined) {
91
- newValue.selectedForloopIndex = x[key]?.selectedForloopIndex;
92
- newValue.selectedForloop = x[key]?.selectedForloop;
80
+ return;
81
+ }
82
+ if (state[key]?.selectedForLoopSetManually) {
83
+ if (newValue.selectedForloop != undefined &&
84
+ state[key]?.selectedForloop != newValue.selectedForloop) {
85
+ return state;
93
86
  }
94
- if (keepType && (x[key]?.type == 'Success' || x[key]?.type == 'Failure')) {
95
- newValue.type = x[key].type;
87
+ else {
88
+ newValue.selectedForLoopSetManually = true;
89
+ newValue.selectedForloopIndex = state[key]?.selectedForloopIndex;
90
+ newValue.selectedForloop = state[key]?.selectedForloop;
96
91
  }
97
- x[key] = newValue;
98
- return x;
99
- });
92
+ }
93
+ else if (state[key]?.selectedForloopIndex != undefined) {
94
+ newValue.selectedForloopIndex = state[key]?.selectedForloopIndex;
95
+ newValue.selectedForloop = state[key]?.selectedForloop;
96
+ }
97
+ if (keepType && (state[key]?.type == 'Success' || state[key]?.type == 'Failure')) {
98
+ newValue.type = state[key].type;
99
+ }
100
+ if (!deepEqual(state[key], newValue)) {
101
+ moduleState.update((state) => {
102
+ state[key] = newValue;
103
+ return state;
104
+ });
105
+ }
100
106
  }
101
107
  function buildSubflowKey(key, prefix) {
102
108
  return prefix ? 'subflow:' + prefix + key : key;
@@ -146,10 +152,10 @@ async function refresh(clearLoop, rootJob) {
146
152
  }
147
153
  for (let [k, rec] of Object.entries(recursiveRefresh)) {
148
154
  if (rootJob != undefined && rootJob != k) {
149
- return;
155
+ continue;
150
156
  }
151
157
  await tick();
152
- await rec(clearLoop, false);
158
+ await rec(clearLoop, undefined);
153
159
  }
154
160
  }
155
161
  function updateRecursiveRefresh(jobId) {
@@ -469,28 +475,39 @@ function onJobsLoaded(mod, job, force) {
469
475
  }
470
476
  async function setIteration(j, id, clicked, modId, isForloop) {
471
477
  if (modId) {
472
- if (clicked) {
473
- await globalRefreshes?.[modId]?.(true, id);
478
+ let globalState = globalModuleStates?.[globalModuleStates?.length - 1];
479
+ let globalStateGet = globalState ? get(globalState) : undefined;
480
+ let state = globalStateGet?.[modId];
481
+ if (clicked && state?.selectedForloop) {
482
+ await globalRefreshes?.[modId]?.(true, state.selectedForloop);
474
483
  }
475
- globalModuleStates?.[globalModuleStates?.length - 1]?.update((topLevelModuleStates) => {
476
- let state = topLevelModuleStates?.[modId];
477
- if (state) {
478
- let manualOnce = state.selectedForLoopSetManually;
479
- if (clicked ||
480
- (!manualOnce &&
481
- (state == undefined || !isForloop || j >= (state.selectedForloopIndex ?? -1)))) {
482
- let setManually = clicked || manualOnce;
484
+ let manualOnce = state?.selectedForLoopSetManually;
485
+ if (clicked ||
486
+ (!manualOnce &&
487
+ (state == undefined || !isForloop || j >= (state.selectedForloopIndex ?? -1)))) {
488
+ let setManually = clicked || manualOnce;
489
+ let newState = {
490
+ ...(state ?? {}),
491
+ selectedForloop: id,
492
+ selectedForloopIndex: j,
493
+ selectedForLoopSetManually: setManually
494
+ };
495
+ const selectedNotEqual = id != state?.selectedForloop ||
496
+ j != state?.selectedForloopIndex ||
497
+ setManually != state?.selectedForLoopSetManually;
498
+ if (selectedNotEqual) {
499
+ console.log('not equal');
500
+ globalState?.update((topLevelModuleStates) => {
483
501
  topLevelModuleStates[modId] = {
484
- ...(topLevelModuleStates[modId] ?? {}),
485
- selectedForloop: id,
486
- selectedForloopIndex: j,
487
- selectedForLoopSetManually: setManually ?? false
502
+ type: 'WaitingForPriorSteps',
503
+ args: {},
504
+ ...newState
488
505
  };
506
+ return topLevelModuleStates;
489
507
  // clicked && callGlobRefresh(modId, {index: j, job: id, selectedManually: setManually ?? false})
490
- }
508
+ });
491
509
  }
492
- return topLevelModuleStates;
493
- });
510
+ }
494
511
  if (clicked) {
495
512
  await globalRefreshes?.[modId]?.(false, id);
496
513
  }
@@ -564,9 +581,12 @@ function innerJobLoaded(jobLoaded, j, clicked, force) {
564
581
  duration_ms: jobLoaded.duration_ms
565
582
  });
566
583
  }
567
- if (jobLoaded.job_kind == 'script' || jobLoaded.job_kind == 'flowscript' || jobLoaded.job_kind == 'preview') {
584
+ if (jobLoaded.job_kind == 'script' ||
585
+ jobLoaded.job_kind == 'flowscript' ||
586
+ jobLoaded.job_kind == 'preview') {
568
587
  let id = undefined;
569
- if ((innerModule?.type == 'forloopflow' || innerModule?.type == 'whileloopflow') && innerModule.modules.length == 1) {
588
+ if ((innerModule?.type == 'forloopflow' || innerModule?.type == 'whileloopflow') &&
589
+ innerModule.modules.length == 1) {
570
590
  id = innerModule?.modules?.[0]?.id;
571
591
  }
572
592
  if (id) {
@@ -1029,7 +1049,12 @@ function allModulesForTimeline(modules, expandedSubflows) {
1029
1049
  let detail = e.detail
1030
1050
  if (detail.manuallySet) {
1031
1051
  let rootJobId = detail.id
1032
- await globalRefreshes?.[detail.moduleId]?.(true, rootJobId)
1052
+ await tick()
1053
+
1054
+ let previousId = $localModuleStates[detail.moduleId]?.selectedForloop
1055
+ if (previousId) {
1056
+ await globalRefreshes?.[detail.moduleId]?.(true, previousId)
1057
+ }
1033
1058
 
1034
1059
  $localModuleStates[detail.moduleId] = {
1035
1060
  ...$localModuleStates[detail.moduleId],
@@ -1,6 +1,6 @@
1
1
  <script>import { settings, settingsKeys } from './instanceSettings';
2
2
  import { Button, Skeleton, Tab, TabContent, Tabs } from './common';
3
- import { SettingService, SettingsService } from '../gen';
3
+ import { IndexSearchService, SettingService, SettingsService } from '../gen';
4
4
  import Toggle from './Toggle.svelte';
5
5
  import SecondsInput from './common/seconds/SecondsInput.svelte';
6
6
  import Tooltip from './Tooltip.svelte';
@@ -28,6 +28,7 @@ import Popover from './Popover.svelte';
28
28
  import { base } from '../base';
29
29
  import { createEventDispatcher } from 'svelte';
30
30
  import { setLicense } from '../enterpriseUtils';
31
+ import ConfirmButton from './ConfirmButton.svelte';
31
32
  export let tab = 'Core';
32
33
  export let hideTabs = false;
33
34
  export let hideSave = false;
@@ -1066,6 +1067,24 @@ function setupSnowflakeUrls() {
1066
1067
  bind:value={values[setting.key].refresh_log_index_period}
1067
1068
  />
1068
1069
  </div>
1070
+ <h3>Reset Index</h3>
1071
+ This buttons will clear the whole index, and the service will start reindexing from scratch. Full text search might be down during this time.
1072
+ <div>
1073
+ <ConfirmButton
1074
+ on:click={async () => {
1075
+ let r = await IndexSearchService.clearIndex({idxName: "JobIndex"})
1076
+ console.log("asasd")
1077
+ sendUserToast(r)
1078
+ }}>Clear <b>Jobs</b> Index</ConfirmButton
1079
+ >
1080
+ <ConfirmButton
1081
+ on:click={async () => {
1082
+ let r = await IndexSearchService.clearIndex({idxName: "ServiceLogIndex"})
1083
+ console.log("asasd")
1084
+ sendUserToast(r)
1085
+ }}>Clear <b>Service Logs</b> Index</ConfirmButton
1086
+ >
1087
+ </div>
1069
1088
  {/if}
1070
1089
  </div>
1071
1090
  {:else if setting.fieldType == 'smtp_connect'}
@@ -13,7 +13,7 @@ import { Button, Skeleton } from './common';
13
13
  import { sendUserToast } from '../toast';
14
14
  import { isCloudHosted } from '../cloud';
15
15
  import { refreshSuperadmin } from '../refreshUser';
16
- import { createEventDispatcher, onMount } from 'svelte';
16
+ import { createEventDispatcher, onDestroy, onMount } from 'svelte';
17
17
  export let rd = undefined;
18
18
  export let email = undefined;
19
19
  export let password = undefined;
@@ -134,7 +134,7 @@ async function redirectUser() {
134
134
  }
135
135
  async function loadLogins() {
136
136
  const allLogins = await OauthService.listOauthLogins();
137
- logins = allLogins.oauth.map(login => ({
137
+ logins = allLogins.oauth.map((login) => ({
138
138
  type: login.type,
139
139
  displayName: login.display_name || login.type
140
140
  }));
@@ -163,14 +163,38 @@ function popupListener(event) {
163
163
  if (event.origin !== window.location.origin) {
164
164
  return;
165
165
  }
166
+ processPopupData(data);
167
+ window.removeEventListener('message', popupListener);
168
+ }
169
+ function processPopupData(data) {
166
170
  if (data.type === 'error') {
167
- sendUserToast(event.data.error, true);
171
+ sendUserToast(data.error, true);
168
172
  }
169
173
  else if (data.type === 'success') {
170
- window.removeEventListener('message', popupListener);
171
174
  dispatch('login');
172
175
  }
173
176
  }
177
+ function handleStorageEvent(event) {
178
+ if (event.key === 'oauth-success') {
179
+ try {
180
+ processPopupData(JSON.parse(event.newValue));
181
+ console.log('oauth-success from storage');
182
+ // Clean up
183
+ localStorage.removeItem('oauth-success');
184
+ window.removeEventListener('storage', handleStorageEvent);
185
+ }
186
+ catch (e) {
187
+ console.error('Could not process oauth-success from storage', e);
188
+ }
189
+ }
190
+ else {
191
+ console.log('Storage event', event.key);
192
+ }
193
+ }
194
+ onDestroy(() => {
195
+ window.removeEventListener('message', popupListener);
196
+ window.removeEventListener('storage', handleStorageEvent);
197
+ });
174
198
  function storeRedirect(provider) {
175
199
  if (rd) {
176
200
  try {
@@ -184,6 +208,7 @@ function storeRedirect(provider) {
184
208
  if (popup) {
185
209
  localStorage.setItem('closeUponLogin', 'true');
186
210
  window.addEventListener('message', popupListener);
211
+ window.addEventListener('storage', handleStorageEvent);
187
212
  window.open(url, '_blank', 'popup');
188
213
  }
189
214
  else {
@@ -202,14 +227,14 @@ $: error && sendUserToast(error, true);
202
227
  {/each}
203
228
  {:else}
204
229
  {#each providers as { type, icon }}
205
- {#if logins?.some(login => login.type === type)}
230
+ {#if logins?.some((login) => login.type === type)}
206
231
  <Button
207
232
  color="light"
208
233
  variant="border"
209
234
  startIcon={{ icon, classes: 'h-4' }}
210
235
  on:click={() => storeRedirect(type)}
211
236
  >
212
- {logins.find(login => login.type === type)?.displayName}
237
+ {logins.find((login) => login.type === type)?.displayName}
213
238
  </Button>
214
239
  {/if}
215
240
  {/each}