windmill-components 1.542.5 → 1.550.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 (188) hide show
  1. package/package/common.d.ts +4 -1
  2. package/package/components/AIAgentLogViewer.svelte +1 -1
  3. package/package/components/ArgEnum.svelte +14 -5
  4. package/package/components/ArgInput.svelte +23 -15
  5. package/package/components/ArgInput.svelte.d.ts +1 -1
  6. package/package/components/ChannelSelector.svelte +92 -18
  7. package/package/components/ChannelSelector.svelte.d.ts +2 -0
  8. package/package/components/ConnectionSection.svelte +12 -1
  9. package/package/components/Dev.svelte +18 -5
  10. package/package/components/Dev.svelte.d.ts +23 -1
  11. package/package/components/DisplayResult.svelte +36 -23
  12. package/package/components/DropdownV2.svelte +8 -2
  13. package/package/components/DropdownV2.svelte.d.ts +1 -0
  14. package/package/components/DynamicInput.svelte +10 -10
  15. package/package/components/EditableSchemaForm.svelte +21 -7
  16. package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
  17. package/package/components/FlowHistoryJobPicker.svelte +3 -0
  18. package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
  19. package/package/components/FlowJobResult.svelte +5 -5
  20. package/package/components/FlowLogRow.svelte +2 -2
  21. package/package/components/FlowLogViewer.svelte +228 -57
  22. package/package/components/FlowLogViewer.svelte.d.ts +16 -5
  23. package/package/components/FlowLogViewerWrapper.svelte +56 -3
  24. package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
  25. package/package/components/FlowLoopIterationPreview.svelte +4 -4
  26. package/package/components/FlowMetadata.svelte +3 -4
  27. package/package/components/FlowMetadata.svelte.d.ts +4 -18
  28. package/package/components/FlowPreviewContent.svelte +9 -3
  29. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  30. package/package/components/FlowStatusViewer.svelte +62 -59
  31. package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
  32. package/package/components/FlowStatusViewerInner.svelte +186 -94
  33. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
  34. package/package/components/FlowTimeline.svelte +110 -131
  35. package/package/components/FlowTimeline.svelte.d.ts +13 -4
  36. package/package/components/FlowTimelineBar.svelte +227 -0
  37. package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
  38. package/package/components/InputTransformForm.svelte +119 -3
  39. package/package/components/InputTransformForm.svelte.d.ts +3 -0
  40. package/package/components/InputTransformSchemaForm.svelte +5 -1
  41. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  42. package/package/components/InstanceSetting.svelte +17 -42
  43. package/package/components/InstanceSettings.svelte +12 -21
  44. package/package/components/JobArgs.svelte +15 -16
  45. package/package/components/JobArgs.svelte.d.ts +4 -18
  46. package/package/components/JobLoader.svelte +23 -42
  47. package/package/components/JobLoader.svelte.d.ts +2 -0
  48. package/package/components/JobStatus.svelte +1 -1
  49. package/package/components/JobStatus.svelte.d.ts +4 -18
  50. package/package/components/ModulePreviewResultViewer.svelte +1 -7
  51. package/package/components/NextcloudSetting.svelte +6 -1
  52. package/package/components/Password.svelte +7 -11
  53. package/package/components/Password.svelte.d.ts +5 -20
  54. package/package/components/PasswordArgInput.svelte +35 -15
  55. package/package/components/PasswordArgInput.svelte.d.ts +4 -18
  56. package/package/components/QueuePosition.svelte +6 -2
  57. package/package/components/RunForm.svelte +5 -14
  58. package/package/components/S3ArrayHelperButton.svelte +12 -0
  59. package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
  60. package/package/components/ScriptEditor.svelte +5 -6
  61. package/package/components/StringTypeNarrowing.svelte +39 -24
  62. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  63. package/package/components/TeamSelector.svelte +83 -37
  64. package/package/components/TeamSelector.svelte.d.ts +0 -1
  65. package/package/components/apps/components/buttons/AppButton.svelte +11 -1
  66. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
  67. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
  68. package/package/components/apps/components/display/table/utils.js +1 -1
  69. package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
  70. package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
  71. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  72. package/package/components/apps/components/layout/AppTabs.svelte +116 -71
  73. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  74. package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
  75. package/package/components/apps/editor/component/components.d.ts +16 -1
  76. package/package/components/apps/editor/component/components.js +22 -2
  77. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
  78. package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
  79. package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
  80. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
  81. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
  82. package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
  83. package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
  84. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  85. package/package/components/common/CloseButton.svelte +2 -2
  86. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  87. package/package/components/common/layout/List.svelte +3 -7
  88. package/package/components/common/layout/List.svelte.d.ts +7 -29
  89. package/package/components/common/popup/PopupV2.svelte +8 -25
  90. package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
  91. package/package/components/common/table/ScriptRow.svelte +22 -2
  92. package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
  93. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
  94. package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
  95. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
  96. package/package/components/copilot/chat/script/core.d.ts +4 -4
  97. package/package/components/copilot/chat/script/core.js +93 -34
  98. package/package/components/copilot/lib.d.ts +1 -0
  99. package/package/components/copilot/lib.js +6 -3
  100. package/package/components/custom_ui.d.ts +1 -0
  101. package/package/components/flows/FlowProgressBar.svelte +16 -16
  102. package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
  103. package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
  104. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
  105. package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
  106. package/package/components/flows/flowInfers.js +34 -8
  107. package/package/components/flows/flowStore.d.ts +4 -1
  108. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  109. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
  110. package/package/components/flows/map/InsertModuleButton.svelte +4 -14
  111. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
  112. package/package/components/flows/map/InsertModuleInner.svelte +17 -20
  113. package/package/components/flows/map/MapItem.svelte +1 -1
  114. package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
  115. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
  116. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
  117. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
  118. package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
  119. package/package/components/git_sync/DetectionFlow.svelte +33 -44
  120. package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
  121. package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
  122. package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
  123. package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
  124. package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
  125. package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
  126. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
  127. package/package/components/git_sync/GitSyncSection.svelte +134 -14
  128. package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
  129. package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
  130. package/package/components/graph/model.d.ts +5 -5
  131. package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
  132. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
  133. package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
  134. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
  135. package/package/components/home/ItemsList.svelte +1 -1
  136. package/package/components/jobs/JobProgressBar.svelte +27 -21
  137. package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
  138. package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
  139. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
  140. package/package/components/meltComponents/Popover.svelte +3 -2
  141. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  142. package/package/components/meltComponents/Tooltip.svelte +1 -1
  143. package/package/components/progressBar/ProgressBar.svelte +39 -53
  144. package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
  145. package/package/components/runs/JobsLoader.svelte +1 -1
  146. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  147. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
  148. package/package/components/schema/AddPropertyV2.svelte +7 -4
  149. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  150. package/package/components/select/MultiSelect.svelte +2 -2
  151. package/package/components/select/MultiSelect.svelte.d.ts +1 -0
  152. package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
  153. package/package/components/sidebar/MenuLink.svelte +2 -1
  154. package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
  155. package/package/components/sidebar/SidebarContent.svelte +27 -27
  156. package/package/components/table/Cell.svelte +7 -14
  157. package/package/components/table/Cell.svelte.d.ts +13 -35
  158. package/package/components/triggers/AddTriggersButton.svelte +1 -0
  159. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  160. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  161. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
  162. package/package/components/triggers/gcp/utils.js +1 -0
  163. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
  164. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
  165. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
  166. package/package/components/triggers/websocket/utils.js +1 -0
  167. package/package/components/workspaceSettings/AISettings.svelte +8 -2
  168. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  169. package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
  170. package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
  171. package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
  172. package/package/gen/core/OpenAPI.js +1 -1
  173. package/package/gen/schemas.gen.d.ts +141 -16
  174. package/package/gen/schemas.gen.js +144 -16
  175. package/package/gen/services.gen.d.ts +62 -42
  176. package/package/gen/services.gen.js +131 -82
  177. package/package/gen/types.gen.d.ts +218 -144
  178. package/package/hubPaths.json +2 -1
  179. package/package/services/JobManager.js +10 -7
  180. package/package/stores.d.ts +1 -0
  181. package/package/stores.js +6 -3
  182. package/package/timelineCompute.svelte.d.ts +21 -0
  183. package/package/timelineCompute.svelte.js +113 -0
  184. package/package/utils.d.ts +15 -8
  185. package/package/utils.js +62 -12
  186. package/package/workspace_settings.d.ts +13 -8
  187. package/package/workspace_settings.js +46 -11
  188. package/package.json +2 -2
@@ -6,7 +6,7 @@ const activePopover = writable({
6
6
  </script>
7
7
 
8
8
  <script lang="ts">import { createPopover, createSync, melt } from '@melt-ui/svelte';
9
- import { fade } from 'svelte/transition';
9
+ import { fly } from 'svelte/transition';
10
10
  import { X, Minimize2, Maximize2 } from 'lucide-svelte';
11
11
  import { debounce, pointerDownOutside } from '../../utils';
12
12
  import { twMerge } from 'tailwind-merge';
@@ -32,6 +32,7 @@ export let disabled = false;
32
32
  export let documentationLink = undefined;
33
33
  export let disableFocusTrap = false;
34
34
  export let escapeBehavior = 'close';
35
+ export let enableFlyTransition = false;
35
36
  let fullScreen = false;
36
37
  const dispatch = createEventDispatcher();
37
38
  function clearTimers() {
@@ -142,7 +143,7 @@ let { debounced: debounceClose, clearDebounce: clearDebounceClose } = debounce((
142
143
  }}
143
144
  on:mouseleave={debounceClose}
144
145
  {...$content} use:$content.action
145
- transition:fade={{ duration: 0 }}
146
+ transition:fly={{ duration: enableFlyTransition ? 100 : 0, y: -16 }}
146
147
  class={twMerge(
147
148
  'relative border rounded-md bg-surface shadow-lg',
148
149
  fullScreen
@@ -35,6 +35,7 @@ declare const Popover: $$__sveltets_2_IsomorphicComponent<{
35
35
  documentationLink?: string | undefined | undefined;
36
36
  disableFocusTrap?: boolean | undefined;
37
37
  escapeBehavior?: EscapeBehaviorType | undefined;
38
+ enableFlyTransition?: boolean | undefined;
38
39
  isOpen?: boolean | undefined;
39
40
  close?: (() => void) | undefined;
40
41
  open?: (() => void) | undefined;
@@ -23,7 +23,7 @@ const { elements: { trigger, content }, states: { open } } = createTooltip({
23
23
  });
24
24
  </script>
25
25
 
26
- <span class={$$props.class} {...$trigger} use:$trigger.action>
26
+ <span class={$$props.class} style={$$props.style} {...$trigger} use:$trigger.action>
27
27
  <slot />
28
28
  </span>
29
29
  {#if !$$slots.default}
@@ -1,65 +1,49 @@
1
- <script lang="ts">import { tweened } from 'svelte/motion';
1
+ <script lang="ts">import { Tween } from 'svelte/motion';
2
2
  import { linear } from 'svelte/easing';
3
3
  import { twMerge } from 'tailwind-merge';
4
- function getTween(initialValue = 0, duration = 200) {
5
- return tweened(initialValue, {
6
- duration,
7
- easing: linear
8
- });
9
- }
10
- export let error = undefined;
11
- export let index;
12
- export let subIndex;
13
- export let subLength;
14
- export let nextInProgress = false;
15
- // Used for displaying progress of subjob of flow
16
- export let subIndexIsPercent = false;
17
- // Remove padding/margin, border radius and titles
18
- // Used in individual job test runs
19
- export let compact = false;
20
- // Removes `Step 1` and replaces it with `Running`
21
- export let hideStepTitle = false;
22
- export let length;
4
+ let { error = undefined, index, subIndex, subLength, nextInProgress = false, subIndexIsPercent = false, compact = false, hideStepTitle = false, length, class: className = '' } = $props();
23
5
  let duration = 200;
24
- let percent = getTween(0, duration);
6
+ let percent = new Tween(0, { duration, easing: linear });
25
7
  export function resetP() {
26
- percent = getTween(0, duration);
8
+ percent.set(0, { duration: 0 });
27
9
  }
28
- $: percent.set((length
29
- ? index / length + (subIndex && subLength ? subIndex / (subLength ?? 1) / length : 0)
30
- : 0) * 100);
10
+ $effect(() => {
11
+ percent.set((length
12
+ ? index / length + (subIndex && subLength ? subIndex / (subLength ?? 1) / length : 0)
13
+ : 0) * 100);
14
+ });
31
15
  function getPercent(partIndex, _pct) {
32
16
  if (!length) {
33
17
  return 0;
34
18
  }
35
- const res = Math.min(($percent - (partIndex / length) * 100) * length, 100);
19
+ const res = Math.min((percent.current - (partIndex / length) * 100) * length, 100);
36
20
  return res;
37
21
  }
38
- $: finished = index == length;
22
+ let finished = $derived(index == length);
39
23
  </script>
40
24
 
41
- <div class={$$props.class}>
25
+ <div class={className}>
42
26
  {#if !compact}
43
- <div
44
- class="flex justify-between items-end font-medium mb-1 {error != undefined
45
- ? 'text-red-700 dark:text-red-200'
46
- : 'text-blue-700 dark:text-blue-200'}"
47
- >
48
- <span class="text-base">
49
- {error != undefined
50
- ? 'Error occured'
51
- : finished
52
- ? 'Done'
53
- : hideStepTitle
54
- ? `Running`
55
- : subIndexIsPercent
56
- ? `Step ${index + 1} (${subIndex !== undefined ? `${subIndex}%)` : ''}`
57
- : `Step ${index + 1}${subIndex !== undefined ? `.${subIndex + 1}` : ''}`}
58
- </span>
59
- <span class="text-sm">
60
- {$percent.toFixed(0)}%
61
- </span>
62
- </div>
27
+ <div
28
+ class="flex justify-between items-end font-medium mb-1 {error != undefined
29
+ ? 'text-red-700 dark:text-red-200'
30
+ : 'text-blue-700 dark:text-blue-200'}"
31
+ >
32
+ <span class="text-base">
33
+ {error != undefined
34
+ ? 'Error occured'
35
+ : finished
36
+ ? 'Done'
37
+ : hideStepTitle
38
+ ? `Running`
39
+ : subIndexIsPercent
40
+ ? `Step ${index + 1} (${subIndex !== undefined ? `${subIndex}%)` : ''}`
41
+ : `Step ${index + 1}${subIndex !== undefined ? `.${subIndex + 1}` : ''}`}
42
+ </span>
43
+ <span class="text-sm">
44
+ {percent.current.toFixed(0)}%
45
+ </span>
46
+ </div>
63
47
  {/if}
64
48
  <!-- {#each state as step, index}
65
49
  {index} {JSON.stringify(step)}
@@ -70,10 +54,12 @@ $: finished = index == length;
70
54
  {getPercent(index)}
71
55
  |
72
56
  {/each} -->
73
- <div class={twMerge(
74
- "flex w-full bg-gray-200 overflow-hidden",
75
- (compact) ? "rounded-none h-3" : "rounded-full h-4",
76
- )}>
57
+ <div
58
+ class={twMerge(
59
+ 'flex w-full bg-gray-200 overflow-hidden',
60
+ compact ? 'rounded-none h-3' : 'rounded-full h-4'
61
+ )}
62
+ >
77
63
  {#each new Array(length) as _, partIndex (partIndex)}
78
64
  <div class="h-full relative border-white {partIndex === 0 ? '' : 'border-l'} w-full">
79
65
  {#if partIndex == index && nextInProgress}
@@ -89,7 +75,7 @@ $: finished = index == length;
89
75
  class="absolute left-0 bottom-0 h-full {error == partIndex
90
76
  ? 'bg-red-400'
91
77
  : 'bg-blue-400'}"
92
- style="width: {getPercent(partIndex, $percent)}%"
78
+ style="width: {getPercent(partIndex, percent.current)}%"
93
79
  ></div>
94
80
  {/if}
95
81
  </div>
@@ -1,32 +1,17 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const ProgressBar: $$__sveltets_2_IsomorphicComponent<{
15
- [x: string]: any;
16
- error?: number | undefined | undefined;
1
+ interface Props {
2
+ error?: number | undefined;
17
3
  index: number;
18
4
  subIndex: number | undefined;
19
5
  subLength: number | undefined;
20
- nextInProgress?: boolean | undefined;
21
- subIndexIsPercent?: boolean | undefined;
22
- compact?: boolean | undefined;
23
- hideStepTitle?: boolean | undefined;
6
+ nextInProgress?: boolean;
7
+ subIndexIsPercent?: boolean;
8
+ compact?: boolean;
9
+ hideStepTitle?: boolean;
24
10
  length: number;
25
- resetP?: (() => void) | undefined;
26
- }, {
27
- [evt: string]: CustomEvent<any>;
28
- }, {}, {
11
+ class?: string;
12
+ }
13
+ declare const ProgressBar: import("svelte").Component<Props, {
29
14
  resetP: () => void;
30
- }, string>;
31
- type ProgressBar = InstanceType<typeof ProgressBar>;
15
+ }, "">;
16
+ type ProgressBar = ReturnType<typeof ProgressBar>;
32
17
  export default ProgressBar;
@@ -4,7 +4,7 @@ import { sendUserToast } from '../../toast';
4
4
  import { workspaceStore } from '../../stores';
5
5
  import { tweened } from 'svelte/motion';
6
6
  import { subtractDaysFromDateString } from '../../utils';
7
- let { jobs = $bindable(), user, label = null, worker = null, folder, path, success = undefined, isSkipped = false, showSchedules = true, showFutureJobs = true, argFilter, resultFilter = undefined, schedulePath = undefined, jobKindsCat = undefined, minTs = $bindable(undefined), maxTs = $bindable(undefined), jobKinds = $bindable(''), queue_count = $bindable(undefined), suspended_count = $bindable(undefined), autoRefresh = true, completedJobs = $bindable(undefined), externalJobs = $bindable(undefined), concurrencyKey, tag, extendedJobs = $bindable(undefined), argError = '', resultError = '', loading = $bindable(false), refreshRate = 5000, syncQueuedRunsCount = true, allWorkspaces = false, computeMinAndMax, lookback = 0, perPage = undefined, allowWildcards = false } = $props();
7
+ let { jobs = $bindable(), user, label = null, worker = null, folder, path, success = undefined, isSkipped = false, showSchedules = true, showFutureJobs = true, argFilter, resultFilter = undefined, schedulePath = undefined, jobKindsCat = undefined, minTs = $bindable(undefined), maxTs = $bindable(undefined), jobKinds = $bindable(undefined), queue_count = $bindable(undefined), suspended_count = $bindable(undefined), autoRefresh = true, completedJobs = $bindable(undefined), externalJobs = $bindable(undefined), concurrencyKey, tag, extendedJobs = $bindable(undefined), argError = '', resultError = '', loading = $bindable(false), refreshRate = 5000, syncQueuedRunsCount = true, allWorkspaces = false, computeMinAndMax, lookback = 0, perPage = undefined, allowWildcards = false } = $props();
8
8
  let intervalId = $state();
9
9
  let sync = true;
10
10
  function onParamChanges() {
@@ -7,9 +7,9 @@ let noWorkerWithTag = $state(false);
7
7
  let timeout = undefined;
8
8
  let visible = true;
9
9
  let customTag = $derived.by(() => {
10
- if (tag.includes('$workspace') || tag.includes('$args'))
10
+ if (tag?.includes('$workspace') || tag?.includes('$args'))
11
11
  return;
12
- if (tag.includes('(')) {
12
+ if (tag?.includes('(')) {
13
13
  return tag.split('(')[0];
14
14
  }
15
15
  return tag;
@@ -34,7 +34,7 @@ async function lookForTag() {
34
34
  }
35
35
  $effect(() => {
36
36
  customTag;
37
- untrack(() => lookForTag());
37
+ untrack(() => timeout && setTimeout(() => lookForTag(), 2500));
38
38
  });
39
39
  onDestroy(() => {
40
40
  visible = false;
@@ -1,5 +1,5 @@
1
1
  interface Props {
2
- tag: string;
2
+ tag: string | undefined;
3
3
  tagLabel?: string;
4
4
  }
5
5
  declare const NoWorkerWithTagWarning: import("svelte").Component<Props, {}, "">;
@@ -1,16 +1,19 @@
1
1
  <script lang="ts">import { modalToSchema } from '../../common';
2
2
  import { emptySchema, sendUserToast } from '../../utils';
3
+ import { untrack } from 'svelte';
3
4
  import AddPropertyFormV2 from './AddPropertyFormV2.svelte';
4
- let { schema = $bindable(emptySchema()), trigger, noPopover, onAddNew } = $props();
5
+ let { schema = $bindable(undefined), trigger, noPopover, onAddNew } = $props();
5
6
  export const DEFAULT_PROPERTY = {
6
7
  selectedType: 'string',
7
8
  description: '',
8
9
  name: '',
9
10
  required: false
10
11
  };
11
- if (!schema) {
12
- schema = emptySchema();
13
- }
12
+ $effect.pre(() => {
13
+ if (!schema) {
14
+ untrack(() => (schema = emptySchema()));
15
+ }
16
+ });
14
17
  // Internal state: bound to args builder modal
15
18
  let argError = '';
16
19
  let editing = false;
@@ -46,6 +46,6 @@ declare const PropertyEditor: $$__sveltets_2_IsomorphicComponent<Props, {
46
46
  [evt: string]: CustomEvent<any>;
47
47
  }, {}, {
48
48
  focus: () => void;
49
- }, "description" | "title" | "properties" | "placeholder" | "pattern" | "extra" | "oneOf" | "format" | "order" | "enum_" | "contentEncoding" | "customErrorMessage" | "itemsType">;
49
+ }, "description" | "title" | "pattern" | "properties" | "placeholder" | "extra" | "oneOf" | "format" | "order" | "enum_" | "contentEncoding" | "customErrorMessage" | "itemsType">;
50
50
  type PropertyEditor = InstanceType<typeof PropertyEditor>;
51
51
  export default PropertyEditor;
@@ -6,7 +6,7 @@ import CloseButton from '../common/CloseButton.svelte';
6
6
  import DraggableTags from './DraggableTags.svelte';
7
7
  import { Search } from 'lucide-svelte';
8
8
  import { twMerge } from 'tailwind-merge';
9
- let { items, placeholder = 'Select items', value = $bindable(), class: className = '', style, listAutoWidth = true, disabled = false, disablePortal = false, createText, reorderable = true, noItemsMsg, selectedUlClass = '', placeholderClass = '', allowClear = true, onOpen, groupBy, sortBy, onCreateItem } = $props();
9
+ let { items, placeholder = 'Select items', value = $bindable(), class: className = '', style, listAutoWidth = true, disabled = false, disablePortal = false, createText, reorderable = true, noItemsMsg, selectedUlClass = '', placeholderClass = '', allowClear = true, hideMainClearBtn = false, onOpen, groupBy, sortBy, onCreateItem } = $props();
10
10
  let filterText = $state('');
11
11
  let open = $state(false);
12
12
  let wrapperEl = $state();
@@ -79,7 +79,7 @@ function clearValue() {
79
79
  />
80
80
  </ul>
81
81
  {/if}
82
- {#if allowClear}
82
+ {#if allowClear && !hideMainClearBtn}
83
83
  <CloseButton
84
84
  noBg
85
85
  class="mr-1 remove-all"
@@ -20,6 +20,7 @@ declare function $$render<Item extends {
20
20
  selectedUlClass?: string;
21
21
  placeholderClass?: string;
22
22
  allowClear?: boolean;
23
+ hideMainClearBtn?: boolean;
23
24
  groupBy?: (item: Item) => string;
24
25
  sortBy?: (a: Item, b: Item) => number;
25
26
  onOpen?: () => void;
@@ -54,6 +54,22 @@ let sortedUsers = $derived(() => {
54
54
  });
55
55
  });
56
56
  let hasNonManualUsers = $derived((filteredUsers || users || []).some((user) => user.added_via?.source === 'instance_group' || user.added_via?.source === 'domain'));
57
+ // Function to check if a manual user can be converted to a group user
58
+ function canConvertToGroup(user) {
59
+ // User must be manually added (not via instance group or domain)
60
+ if (user.added_via?.source === 'instance_group' || user.added_via?.source === 'domain') {
61
+ return false;
62
+ }
63
+ // Check if user's email is in any configured instance group
64
+ const userEmail = user.email;
65
+ for (const groupName of autoAddInstanceGroups) {
66
+ const group = instanceGroups.find(g => g.name === groupName);
67
+ if (group && group.emails && group.emails.includes(userEmail)) {
68
+ return true;
69
+ }
70
+ }
71
+ return false;
72
+ }
57
73
  async function loadSettings() {
58
74
  const settings = await WorkspaceService.getSettings({ workspace: $workspaceStore });
59
75
  auto_invite_domain = settings.auto_invite_domain;
@@ -165,6 +181,20 @@ async function updateGroupRole(groupName, role) {
165
181
  sendUserToast('Failed to update role', true);
166
182
  }
167
183
  }
184
+ async function convertUserToGroup(username) {
185
+ try {
186
+ await UserService.convertUserToGroup({
187
+ workspace: $workspaceStore ?? '',
188
+ username
189
+ });
190
+ sendUserToast('User converted to group user');
191
+ listUsers();
192
+ }
193
+ catch (e) {
194
+ console.error('Failed to convert user:', e);
195
+ sendUserToast('Failed to convert user', true);
196
+ }
197
+ }
168
198
  let domain = $derived($userStore?.email.split('@')[1]);
169
199
  $effect(() => {
170
200
  if ($workspaceStore) {
@@ -188,6 +218,7 @@ onDestroy(() => {
188
218
  });
189
219
  let deleteConfirmedCallback = $state(undefined);
190
220
  let removeInstanceGroupConfirmedCallback = $state(undefined);
221
+ let convertConfirmedCallback = $state(undefined);
191
222
  async function removeAllInvitesFromDomain() {
192
223
  await Promise.all(invites
193
224
  .filter((x) => isCloudHosted() ? x.email.endsWith('@' + (auto_invite_domain ?? '')) : true)
@@ -593,7 +624,8 @@ $effect(() => {
593
624
  </Head>
594
625
  <tbody class="divide-y bg-surface">
595
626
  {#if filteredUsers}
596
- {#each sortedUsers().slice(0, nbDisplayed) as { email, username, is_admin, operator, disabled, added_via }, index (email)}
627
+ {#each sortedUsers().slice(0, nbDisplayed) as user, index (user.email)}
628
+ {@const { email, username, is_admin, operator, disabled, added_via } = user}
597
629
  <!-- Add separator between manual users and instance group users -->
598
630
  {#if hasNonManualUsers && index > 0 && sortedUsers()[index - 1]?.added_via?.source !== 'instance_group' && added_via?.source === 'instance_group'}
599
631
  <tr class="bg-surface-secondary">
@@ -733,6 +765,40 @@ $effect(() => {
733
765
  </Button>
734
766
  <Tooltip>Cannot remove users synced from instance groups. Either disable the user or remove them from the SCIM group.</Tooltip>
735
767
  </div>
768
+ {:else if canConvertToGroup(user)}
769
+ <Button
770
+ color="light"
771
+ variant="contained"
772
+ btnClasses="text-blue-500"
773
+ size="xs"
774
+ spacingSize="xs2"
775
+ on:click={() => {
776
+ convertConfirmedCallback = async () => {
777
+ await convertUserToGroup(username)
778
+ }
779
+ }}
780
+ >
781
+ Convert
782
+ </Button>
783
+ <Button
784
+ color="light"
785
+ variant="contained"
786
+ btnClasses="text-red-500"
787
+ size="xs"
788
+ spacingSize="xs2"
789
+ on:click={() => {
790
+ deleteConfirmedCallback = async () => {
791
+ await UserService.deleteUser({
792
+ workspace: $workspaceStore ?? '',
793
+ username
794
+ })
795
+ sendUserToast('User removed')
796
+ listUsers()
797
+ }
798
+ }}
799
+ >
800
+ Remove
801
+ </Button>
736
802
  {:else}
737
803
  <Button
738
804
  color="light"
@@ -922,3 +988,28 @@ $effect(() => {
922
988
  </div>
923
989
  </ConfirmationModal>
924
990
  </div>
991
+
992
+ <ConfirmationModal
993
+ open={Boolean(convertConfirmedCallback)}
994
+ title="Convert to Group User"
995
+ confirmationText="Convert"
996
+ on:canceled={() => {
997
+ convertConfirmedCallback = undefined
998
+ }}
999
+ on:confirmed={() => {
1000
+ if (convertConfirmedCallback) {
1001
+ convertConfirmedCallback()
1002
+ }
1003
+ convertConfirmedCallback = undefined
1004
+ }}
1005
+ >
1006
+ <div class="flex flex-col w-full space-y-4">
1007
+ <span>Are you sure you want to convert this user to a group user?</span>
1008
+ <span class="text-sm text-secondary">This will:</span>
1009
+ <ul class="text-sm text-secondary list-disc ml-4 space-y-1">
1010
+ <li>Change the user's role based on their instance group configuration</li>
1011
+ <li>Make their role managed through the instance group settings</li>
1012
+ <li>Prevent manual role changes for this user</li>
1013
+ </ul>
1014
+ </div>
1015
+ </ConfirmationModal>
@@ -5,7 +5,7 @@ import { base } from '$app/paths';
5
5
  import { triggerableByAI } from '../../actions/triggerableByAI.svelte';
6
6
  import { goto } from '$app/navigation';
7
7
  import { twMerge } from 'tailwind-merge';
8
- let { aiId = undefined, aiDescription = undefined, label, href, icon = undefined, isCollapsed, disabled = false, lightMode = false, item = undefined, class: classNames = '' } = $props();
8
+ let { aiId = undefined, aiDescription = undefined, label, href, icon = undefined, isCollapsed, disabled = false, lightMode = false, item = undefined, class: classNames = '', onclick = undefined } = $props();
9
9
  let isSelected = $state(false);
10
10
  navigating.subscribe(() => {
11
11
  if (href === `${base}/`) {
@@ -28,6 +28,7 @@ navigating.subscribe(() => {
28
28
  goto(href)
29
29
  }
30
30
  }}
31
+ {onclick}
31
32
  class={twMerge(
32
33
  'group flex items-center px-2 py-2 text-sm font-light rounded-md h-8 gap-3',
33
34
  isSelected
@@ -10,6 +10,7 @@ interface Props {
10
10
  lightMode?: boolean;
11
11
  item?: MenubarMenuElements['item'] | undefined;
12
12
  class?: string;
13
+ onclick?: (ev: MouseEvent) => any;
13
14
  }
14
15
  declare const MenuLink: import("svelte").Component<Props, {}, "">;
15
16
  type MenuLink = ReturnType<typeof MenuLink>;
@@ -113,7 +113,12 @@ let mainMenuLinks = $derived([
113
113
  href: `${base}/runs`,
114
114
  icon: Play,
115
115
  aiId: 'sidebar-menu-link-runs',
116
- aiDescription: 'Button to navigate to runs'
116
+ aiDescription: 'Button to navigate to runs',
117
+ onclick: () => {
118
+ setTimeout(() => {
119
+ window.dispatchEvent(new Event('popstate'));
120
+ }, 100);
121
+ }
117
122
  },
118
123
  {
119
124
  label: 'Variables',
@@ -295,7 +300,7 @@ let secondaryMenuLinks = $derived([
295
300
  }
296
301
  ]
297
302
  : []),
298
- ...($workspaceStore?.startsWith("wm-fork")
303
+ ...($workspaceStore?.startsWith('wm-fork')
299
304
  ? [
300
305
  {
301
306
  label: 'Delete Forked Workspace',
@@ -306,7 +311,7 @@ let secondaryMenuLinks = $derived([
306
311
  faIcon: undefined
307
312
  }
308
313
  ]
309
- : []),
314
+ : [])
310
315
  ],
311
316
  disabled: $userStore?.operator
312
317
  },
@@ -508,14 +513,9 @@ let secondaryMenuLinks = $derived([
508
513
  {/snippet}
509
514
  </Menu>
510
515
  {:else}
511
- <MenuSingleItem {createMenu}>
512
- {#snippet triggr({ trigger })}
513
- <div class="w-full">
514
- <MenuButton class="!text-2xs" {...menuLink} {isCollapsed} {trigger} />
515
- </div>
516
- {/snippet}
517
- {#snippet children({ item })}
518
- <MenuLink class="!text-2xs" {...menuLink} {isCollapsed} {item} />
516
+ <MenuSingleItem>
517
+ {#snippet children({})}
518
+ <MenuLink class="!text-2xs" {...menuLink} {isCollapsed} />
519
519
  {/snippet}
520
520
  </MenuSingleItem>
521
521
  {/if}
@@ -601,20 +601,20 @@ let secondaryMenuLinks = $derived([
601
601
  </div>
602
602
  </ConfirmationModal>
603
603
 
604
- {#if $workspaceStore?.startsWith("wm-fork-")}
605
- <ConfirmationModal
606
- open={deleteWorkspaceForkModal}
607
- title="Delete forked workspace"
608
- confirmationText="Remove"
609
- on:canceled={() => {
610
- deleteWorkspaceForkModal = false
611
- }}
612
- on:confirmed={() => {
613
- deleteFork()
614
- }}
615
- >
616
- <div class="flex flex-col w-full space-y-4">
617
- <span>Are you sure you want to delete this workspace fork? (deleting {$workspaceStore})</span>
618
- </div>
619
- </ConfirmationModal>
604
+ {#if $workspaceStore?.startsWith('wm-fork-')}
605
+ <ConfirmationModal
606
+ open={deleteWorkspaceForkModal}
607
+ title="Delete forked workspace"
608
+ confirmationText="Remove"
609
+ on:canceled={() => {
610
+ deleteWorkspaceForkModal = false
611
+ }}
612
+ on:confirmed={() => {
613
+ deleteFork()
614
+ }}
615
+ >
616
+ <div class="flex flex-col w-full space-y-4">
617
+ <span>Are you sure you want to delete this workspace fork? (deleting {$workspaceStore})</span>
618
+ </div>
619
+ </ConfirmationModal>
620
620
  {/if}
@@ -1,22 +1,15 @@
1
1
  <script lang="ts">import { getContext } from 'svelte';
2
2
  import { twMerge } from 'tailwind-merge';
3
- export let first = false;
4
- export let last = false;
5
- export let numeric = false;
6
- export let head = false;
7
- export let shouldStopPropagation = false;
8
- export let selected = false;
9
- export let sticky = false;
10
- export let wrap = false;
3
+ let { first = false, last = false, numeric = false, head = false, shouldStopPropagation = false, selected = false, sticky = false, wrap = false, children, ...rest } = $props();
11
4
  let Tag = head ? 'th' : 'td';
12
5
  const { size } = getContext('datatable');
13
6
  </script>
14
7
 
15
- <!-- svelte-ignore a11y-no-static-element-interactions -->
8
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
16
9
  <svelte:element
17
10
  this={Tag}
18
- {...$$restProps}
19
- on:click={(e) => {
11
+ {...rest}
12
+ onclick={(e) => {
20
13
  if (shouldStopPropagation) e.stopPropagation()
21
14
  }}
22
15
  class={twMerge(
@@ -36,14 +29,14 @@ const { size } = getContext('datatable');
36
29
  size === 'xs' ? 'px-1 py-1.5' : '',
37
30
  selected ? 'bg-blue-50 dark:bg-blue-900/50' : '',
38
31
  'transition-all',
39
- $$restProps.class
32
+ rest.class
40
33
  )}
41
34
  >
42
35
  {#if sticky}
43
36
  <div class={twMerge(first ? 'border-r' : ' border-l ')}>
44
- <slot />
37
+ {@render children?.()}
45
38
  </div>
46
39
  {:else}
47
- <slot />
40
+ {@render children?.()}
48
41
  {/if}
49
42
  </svelte:element>
@@ -1,37 +1,15 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
1
+ interface Props {
2
+ first?: boolean;
3
+ last?: boolean;
4
+ numeric?: boolean;
5
+ head?: boolean;
6
+ shouldStopPropagation?: boolean;
7
+ selected?: boolean;
8
+ sticky?: boolean;
9
+ wrap?: boolean;
10
+ children?: import('svelte').Snippet;
11
+ [key: string]: any;
13
12
  }
14
- type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
15
- default: any;
16
- } ? Props extends Record<string, never> ? any : {
17
- children?: any;
18
- } : {});
19
- declare const Cell: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
20
- [x: string]: any;
21
- first?: boolean | undefined;
22
- last?: boolean | undefined;
23
- numeric?: boolean | undefined;
24
- head?: boolean | undefined;
25
- shouldStopPropagation?: boolean | undefined;
26
- selected?: boolean | undefined;
27
- sticky?: boolean | undefined;
28
- wrap?: boolean | undefined;
29
- }, {
30
- default: {};
31
- }>, {
32
- [evt: string]: CustomEvent<any>;
33
- }, {
34
- default: {};
35
- }, {}, string>;
36
- type Cell = InstanceType<typeof Cell>;
13
+ declare const Cell: import("svelte").Component<Props, {}, "">;
14
+ type Cell = ReturnType<typeof Cell>;
37
15
  export default Cell;