windmill-components 1.383.8 → 1.389.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 (195) hide show
  1. package/package/assets/app.css +25 -1
  2. package/package/components/ArgInput.svelte +2 -1
  3. package/package/components/ChangeInstanceUsername.svelte +9 -108
  4. package/package/components/ChangeInstanceUsernameInner.svelte +112 -0
  5. package/package/components/ChangeInstanceUsernameInner.svelte.d.ts +21 -0
  6. package/package/components/DiffDrawer.svelte +27 -20
  7. package/package/components/DiffEditor.svelte +13 -1
  8. package/package/components/DisplayResult.svelte +39 -9
  9. package/package/components/DropdownV2.svelte +4 -26
  10. package/package/components/DropdownV2.svelte.d.ts +9 -1
  11. package/package/components/DropdownV2Inner.svelte +42 -0
  12. package/package/components/DropdownV2Inner.svelte.d.ts +40 -0
  13. package/package/components/Editor.svelte +142 -128
  14. package/package/components/Editor.svelte.d.ts +5 -4
  15. package/package/components/EditorBar.svelte +9 -11
  16. package/package/components/EditorSettings.svelte +44 -0
  17. package/package/components/EditorSettings.svelte.d.ts +17 -0
  18. package/package/components/EditorTheme.svelte +1 -1
  19. package/package/components/ErrorOrRecoveryHandler.svelte +27 -20
  20. package/package/components/FlowBuilder.svelte +17 -3
  21. package/package/components/FlowBuilder.svelte.d.ts +3 -0
  22. package/package/components/FlowGraphViewerStep.svelte +1 -1
  23. package/package/components/FlowStatusViewer.svelte +3 -1
  24. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  25. package/package/components/FlowStatusViewerInner.svelte +5 -2
  26. package/package/components/FlowViewerInner.svelte +3 -7
  27. package/package/components/FormatOnSave.svelte +12 -29
  28. package/package/components/GraphqlSchemaViewer.svelte +1 -1
  29. package/package/components/GraphqlSchemaViewer.svelte.d.ts +1 -1
  30. package/package/components/HighlightCode.svelte +3 -0
  31. package/package/components/InstanceNameEditor.svelte +64 -0
  32. package/package/components/InstanceNameEditor.svelte.d.ts +23 -0
  33. package/package/components/LightweightArgInput.svelte +6 -11
  34. package/package/components/LogViewer.svelte +37 -29
  35. package/package/components/LogViewer.svelte.d.ts +2 -0
  36. package/package/components/ObjectResourceInput.svelte +1 -1
  37. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  38. package/package/components/Path.svelte +3 -3
  39. package/package/components/QueueMetricsDrawer.svelte +6 -218
  40. package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -3
  41. package/package/components/QueueMetricsDrawerInner.svelte +211 -0
  42. package/package/components/QueueMetricsDrawerInner.svelte.d.ts +15 -0
  43. package/package/components/ResourceEditorDrawer.svelte +14 -11
  44. package/package/components/ResourceEditorDrawer.svelte.d.ts +1 -1
  45. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  46. package/package/components/S3FilePicker.svelte +20 -8
  47. package/package/components/ScheduleEditorInner.svelte +497 -469
  48. package/package/components/ScriptBuilder.svelte +12 -1
  49. package/package/components/ScriptBuilder.svelte.d.ts +3 -0
  50. package/package/components/ScriptEditor.svelte +2 -0
  51. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  52. package/package/components/ServiceLogsInner.svelte +511 -0
  53. package/package/components/ServiceLogsInner.svelte.d.ts +20 -0
  54. package/package/components/SimpleEditor.svelte +75 -37
  55. package/package/components/SimpleEditor.svelte.d.ts +9 -3
  56. package/package/components/Summary.svelte +33 -31
  57. package/package/components/Summary.svelte.d.ts +1 -0
  58. package/package/components/SuperadminSettings.svelte +28 -10
  59. package/package/components/TemplateEditor.svelte +1 -1
  60. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  61. package/package/components/VimMode.svelte +16 -0
  62. package/package/components/VimMode.svelte.d.ts +14 -0
  63. package/package/components/WorkerTagPicker.svelte +4 -1
  64. package/package/components/WorkspaceGroup.svelte +139 -68
  65. package/package/components/WorkspaceGroup.svelte.d.ts +3 -0
  66. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +19 -2
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  68. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +2 -1
  69. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +2 -0
  70. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +2 -1
  71. package/package/components/apps/components/display/table/AppAggridTable.svelte +45 -3
  72. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +2 -1
  73. package/package/components/apps/components/display/table/AppAggridTableEe.svelte +2 -0
  74. package/package/components/apps/components/display/table/AppAggridTableEe.svelte.d.ts +2 -1
  75. package/package/components/apps/editor/AppEditor.svelte +239 -92
  76. package/package/components/apps/editor/AppEditorBottomPanel.svelte +22 -0
  77. package/package/components/apps/editor/AppEditorBottomPanel.svelte.d.ts +24 -0
  78. package/package/components/apps/editor/AppEditorHeader.svelte +44 -2
  79. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +9 -0
  80. package/package/components/apps/editor/AppExportButton.svelte +1 -1
  81. package/package/components/apps/editor/AppPreview.svelte +4 -0
  82. package/package/components/apps/editor/DeploymentHistory.svelte +7 -3
  83. package/package/components/apps/editor/GridEditor.svelte +4 -13
  84. package/package/components/apps/editor/RunnableJobPanel.svelte +25 -58
  85. package/package/components/apps/editor/RunnableJobPanel.svelte.d.ts +10 -1
  86. package/package/components/apps/editor/RunnalbeJobPanelInner.svelte +56 -0
  87. package/package/components/apps/editor/RunnalbeJobPanelInner.svelte.d.ts +18 -0
  88. package/package/components/apps/editor/SubGridEditor.svelte +3 -1
  89. package/package/components/apps/editor/component/Component.svelte +26 -4
  90. package/package/components/apps/editor/component/Component.svelte.d.ts +1 -0
  91. package/package/components/apps/editor/component/components.d.ts +5 -0
  92. package/package/components/apps/editor/componentsPanel/CssProperty.svelte +2 -0
  93. package/package/components/apps/editor/componentsPanel/tailwindUtils.js +267 -1
  94. package/package/components/apps/editor/contextPanel/ContextPanel.svelte +9 -1
  95. package/package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +2 -0
  96. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -0
  97. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +4 -0
  98. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +7 -2
  99. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +5 -1
  100. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +14 -2
  101. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +1 -0
  102. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +25 -5
  103. package/package/components/apps/editor/settingsPanel/HideButton.svelte +47 -0
  104. package/package/components/apps/editor/settingsPanel/HideButton.svelte.d.ts +22 -0
  105. package/package/components/apps/editor/settingsPanel/TableActions.svelte +43 -4
  106. package/package/components/apps/editor/settingsPanel/TableActions.svelte.d.ts +2 -1
  107. package/package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte +2 -1
  108. package/package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte.d.ts +1 -0
  109. package/package/components/apps/svelte-grid/Grid.svelte +6 -2
  110. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +1 -0
  111. package/package/components/apps/svelte-grid/MoveResize.svelte +11 -3
  112. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +1 -0
  113. package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
  114. package/package/components/apps/svelte-grid/utils/item.js +11 -4
  115. package/package/components/build_workers.d.ts +1 -1
  116. package/package/components/build_workers.js +16 -122
  117. package/package/components/common/button/Button.svelte.d.ts +2 -2
  118. package/package/components/common/calendarPicker/CalendarPicker.svelte +6 -2
  119. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
  120. package/package/components/common/drawer/ConditionalPortal.svelte +2 -1
  121. package/package/components/common/drawer/ConditionalPortal.svelte.d.ts +1 -0
  122. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  123. package/package/components/common/popup/Popup.svelte +2 -1
  124. package/package/components/common/popup/Popup.svelte.d.ts +1 -0
  125. package/package/components/common/table/AppRow.svelte +11 -8
  126. package/package/components/common/table/AppRow.svelte.d.ts +1 -2
  127. package/package/components/common/table/FlowRow.svelte +3 -3
  128. package/package/components/common/table/FlowRow.svelte.d.ts +1 -2
  129. package/package/components/common/table/RawAppRow.svelte +3 -3
  130. package/package/components/common/table/RawAppRow.svelte.d.ts +1 -2
  131. package/package/components/common/table/ScriptRow.svelte +3 -3
  132. package/package/components/common/table/ScriptRow.svelte.d.ts +1 -2
  133. package/package/components/copilot/CodeCompletionStatus.svelte +21 -46
  134. package/package/components/copilot/StepGen.svelte +2 -1
  135. package/package/components/custom_ui.d.ts +4 -1
  136. package/package/components/flows/CreateActionsApp.svelte +11 -8
  137. package/package/components/flows/CreateActionsFlow.svelte +11 -8
  138. package/package/components/flows/FlowEditor.svelte +1 -2
  139. package/package/components/flows/FlowEditor.svelte.d.ts +0 -1
  140. package/package/components/flows/FlowHistory.svelte +6 -3
  141. package/package/components/flows/content/FlowModuleComponent.svelte +1 -0
  142. package/package/components/flows/content/FlowModuleScript.svelte +15 -11
  143. package/package/components/flows/content/FlowSettings.svelte +1 -4
  144. package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -0
  145. package/package/components/flows/header/FlowYamlEditor.svelte +55 -0
  146. package/package/components/flows/header/FlowYamlEditor.svelte.d.ts +17 -0
  147. package/package/components/flows/map/InsertTriggerButton.svelte +1 -1
  148. package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +1 -0
  149. package/package/components/flows/map/VirtualItem.svelte +1 -1
  150. package/package/components/flows/pickers/PickHubScript.svelte +1 -0
  151. package/package/components/flows/types.d.ts +7 -6
  152. package/package/components/flows/utils.d.ts +9 -0
  153. package/package/components/flows/utils.js +21 -0
  154. package/package/components/graph/graphBuilder.js +1 -0
  155. package/package/components/graph/model.d.ts +1 -0
  156. package/package/components/graph/renderers/edges/BaseEdge.svelte +16 -0
  157. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
  158. package/package/components/graph/renderers/nodes/NoBranchNode.svelte +5 -1
  159. package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +1 -0
  160. package/package/components/home/Item.svelte +0 -17
  161. package/package/components/home/deploy_ui.d.ts +2 -0
  162. package/package/components/home/deploy_ui.js +21 -0
  163. package/package/components/icons/RustIcon.svelte +70 -0
  164. package/package/components/icons/RustIcon.svelte.d.ts +25 -0
  165. package/package/components/icons/rust-logo.svg +1 -0
  166. package/package/components/instanceSettings.js +2 -2
  167. package/package/components/monaco_keybindings.d.ts +3 -0
  168. package/package/components/monaco_keybindings.js +9 -0
  169. package/package/components/preview/FlowPreviewStatus.svelte +6 -2
  170. package/package/components/runs/JobLoader.svelte +12 -3
  171. package/package/components/runs/JobLoader.svelte.d.ts +1 -1
  172. package/package/components/runs/ManuelDatePicker.svelte +31 -44
  173. package/package/components/runs/ManuelDatePicker.svelte.d.ts +6 -2
  174. package/package/components/runs/RunsFilter.svelte +4 -1
  175. package/package/components/runs/RunsFilter.svelte.d.ts +1 -0
  176. package/package/components/search/GlobalSearchModal.svelte +36 -25
  177. package/package/components/vscode.js +1 -1
  178. package/package/components/wizards/TableActionsWizard.svelte +84 -0
  179. package/package/components/wizards/TableActionsWizard.svelte.d.ts +22 -0
  180. package/package/editorUtils.js +2 -0
  181. package/package/gen/core/OpenAPI.js +1 -1
  182. package/package/gen/schemas.gen.d.ts +8 -8
  183. package/package/gen/schemas.gen.js +8 -8
  184. package/package/gen/services.gen.d.ts +4 -0
  185. package/package/gen/services.gen.js +16 -0
  186. package/package/gen/types.gen.d.ts +20 -8
  187. package/package/infer.d.ts +1 -1
  188. package/package/infer.js +48 -7
  189. package/package/script_helpers.d.ts +1 -0
  190. package/package/script_helpers.js +39 -1
  191. package/package/scripts.d.ts +1 -1
  192. package/package/scripts.js +12 -4
  193. package/package/stores.d.ts +5 -1
  194. package/package/stores.js +7 -2
  195. package/package.json +18 -9
@@ -7,7 +7,7 @@ import { ConfigService, WorkspaceService } from '../gen';
7
7
  import ConfirmationModal from './common/confirmationModal/ConfirmationModal.svelte';
8
8
  import { createEventDispatcher } from 'svelte';
9
9
  import { sendUserToast } from '../toast';
10
- import { emptyString } from '../utils';
10
+ import { emptyString, pluralize } from '../utils';
11
11
  import { enterpriseLicense, superadmin } from '../stores';
12
12
  import Tooltip from './Tooltip.svelte';
13
13
  import Editor from './Editor.svelte';
@@ -16,10 +16,28 @@ import Section from './Section.svelte';
16
16
  import Label from './Label.svelte';
17
17
  import AutoComplete from 'simple-svelte-autocomplete';
18
18
  import YAML from 'yaml';
19
+ import Toggle from './Toggle.svelte';
19
20
  export let name;
20
21
  export let config;
21
22
  export let activeWorkers;
22
23
  export let customTags;
24
+ export let workers;
25
+ $: vcpus_memory = computeVCpuAndMemory(workers);
26
+ function computeVCpuAndMemory(workers) {
27
+ let vcpus = 0;
28
+ let memory = 0;
29
+ for (const [_, pings] of workers) {
30
+ for (const ping of pings) {
31
+ if (ping.vcpus) {
32
+ vcpus += ping.vcpus;
33
+ }
34
+ if (ping.memory) {
35
+ memory += ping.memory;
36
+ }
37
+ }
38
+ }
39
+ return { vcpus, memory };
40
+ }
23
41
  let nconfig = {};
24
42
  function loadNConfig() {
25
43
  nconfig = config
@@ -65,7 +83,8 @@ const defaultTags = [
65
83
  'flow',
66
84
  'other',
67
85
  'bun',
68
- 'php'
86
+ 'php',
87
+ 'rust'
69
88
  ];
70
89
  const nativeTags = [
71
90
  'nativets',
@@ -409,6 +428,42 @@ let createdTags = [];
409
428
  {/if}
410
429
  {/if}
411
430
  </Section>
431
+ {#if nconfig !== undefined}
432
+ <div class="mt-8" />
433
+ <Section label="Alerts" tooltip="Alert is sent to the configured critical error channels">
434
+ <Toggle
435
+ size="sm"
436
+ options={{
437
+ right: 'Send an alert when the number of alive workers falls below a given threshold'
438
+ }}
439
+ checked={nconfig?.min_alive_workers_alert_threshold !== undefined ?? false}
440
+ on:change={(ev) => {
441
+ if (nconfig !== undefined) {
442
+ nconfig.min_alive_workers_alert_threshold = ev.detail ? 1 : undefined
443
+ dirty = true
444
+ }
445
+ }}
446
+ disabled{!$enterpriseLicense}
447
+ />
448
+ {#if nconfig.min_alive_workers_alert_threshold !== undefined}
449
+ <div class="flex flex-row items-center justify-between">
450
+ <div class="flex flex-row items-center text-sm gap-2">
451
+ <p>Triggered when number of workers in group is lower than</p>
452
+ <input
453
+ type="number"
454
+ class="!w-14 text-center"
455
+ disabled={!$enterpriseLicense}
456
+ min="1"
457
+ bind:value={nconfig.min_alive_workers_alert_threshold}
458
+ on:change={(ev) => {
459
+ dirty = true
460
+ }}
461
+ />
462
+ </div>
463
+ </div>
464
+ {/if}
465
+ </Section>
466
+ {/if}
412
467
  {:else if selected == 'dedicated'}
413
468
  {#if nconfig?.dedicated_worker != undefined}
414
469
  <input
@@ -733,6 +788,13 @@ let createdTags = [];
733
788
  variant="contained"
734
789
  color="dark"
735
790
  on:click={async () => {
791
+ if (
792
+ nconfig?.min_alive_workers_alert_threshold &&
793
+ nconfig?.min_alive_workers_alert_threshold < 1
794
+ ) {
795
+ sendUserToast('Minimum alive workers alert threshold must be at least 1', true)
796
+ return
797
+ }
736
798
  customEnvVars.forEach((envvar) => {
737
799
  if (
738
800
  nconfig.env_vars_static !== undefined &&
@@ -764,81 +826,90 @@ let createdTags = [];
764
826
  </DrawerContent>
765
827
  </Drawer>
766
828
 
767
- <div class="flex gap-2 items-center justify-end flex-row my-2">
768
- {#if $superadmin}
769
- <Button
770
- color="light"
771
- size="xs"
772
- on:click={() => {
773
- dirty = false
774
- loadNConfig()
775
- drawer.openDrawer()
776
- }}
777
- startIcon={{ icon: config == undefined ? Plus : Settings }}
778
- >
779
- <div class="flex flex-row gap-1 items-center">
780
- {config == undefined ? 'Create' : 'Edit'} config
781
- </div>
782
- </Button>
829
+ <div class=" flex items-center justify-between pt-1">
830
+ <div class="text-xs"
831
+ >{pluralize(activeWorkers, 'worker')}
832
+ {#if vcpus_memory?.vcpus}
833
+ - {(vcpus_memory?.vcpus / 100000).toFixed(2)} vCPUs{/if}
834
+ {#if vcpus_memory?.memory}
835
+ - {((vcpus_memory?.memory * 1.0) / 1024 / 1024 / 1024).toFixed(2)} GB{/if}</div
836
+ >
837
+ <div class="flex gap-2 items-center justify-end flex-row my-2">
838
+ {#if $superadmin}
839
+ <Button
840
+ color="light"
841
+ size="xs"
842
+ on:click={() => {
843
+ dirty = false
844
+ loadNConfig()
845
+ drawer.openDrawer()
846
+ }}
847
+ startIcon={{ icon: config == undefined ? Plus : Settings }}
848
+ >
849
+ <div class="flex flex-row gap-1 items-center">
850
+ {config == undefined ? 'Create' : 'Edit'} config
851
+ </div>
852
+ </Button>
783
853
 
784
- <Button
785
- color="light"
786
- size="xs"
787
- on:click={() => {
788
- navigator.clipboard.writeText(
789
- YAML.stringify({
790
- name,
791
- ...config
792
- })
793
- )
794
- sendUserToast('Worker config copied to clipboard as YAML')
795
- }}
796
- startIcon={{ icon: Copy }}
797
- >
798
- Copy config
799
- </Button>
854
+ <Button
855
+ color="light"
856
+ size="xs"
857
+ on:click={() => {
858
+ navigator.clipboard.writeText(
859
+ YAML.stringify({
860
+ name,
861
+ ...config
862
+ })
863
+ )
864
+ sendUserToast('Worker config copied to clipboard as YAML')
865
+ }}
866
+ startIcon={{ icon: Copy }}
867
+ >
868
+ Copy config
869
+ </Button>
870
+
871
+ {#if config}
872
+ <Button
873
+ color="light"
874
+ size="xs"
875
+ on:click={() => {
876
+ if (!$enterpriseLicense) {
877
+ sendUserToast('Worker Management UI is an EE feature', true)
878
+ } else {
879
+ openDelete = true
880
+ }
881
+ }}
882
+ startIcon={{ icon: Trash }}
883
+ btnClasses="text-red-400"
884
+ >
885
+ Delete config
886
+ </Button>
887
+ {/if}
800
888
 
801
- {#if config}
802
889
  <Button
803
890
  color="light"
804
891
  size="xs"
805
892
  on:click={() => {
806
- if (!$enterpriseLicense) {
807
- sendUserToast('Worker Management UI is an EE feature', true)
808
- } else {
809
- openDelete = true
810
- }
893
+ loadNConfig()
894
+
895
+ openClean = true
811
896
  }}
812
- startIcon={{ icon: Trash }}
813
897
  btnClasses="text-red-400"
898
+ startIcon={{ icon: RefreshCcwIcon }}
814
899
  >
815
- Delete config
900
+ Clean cache
901
+ </Button>
902
+ {:else if config}
903
+ <Button
904
+ color="light"
905
+ size="xs"
906
+ on:click={() => {
907
+ loadNConfig()
908
+ drawer.openDrawer()
909
+ }}
910
+ >
911
+ <div class="flex flex-row gap-1 items-center"> config </div>
816
912
  </Button>
817
913
  {/if}
818
-
819
- <Button
820
- color="light"
821
- size="xs"
822
- on:click={() => {
823
- loadNConfig()
824
-
825
- openClean = true
826
- }}
827
- btnClasses="text-red-400"
828
- startIcon={{ icon: RefreshCcwIcon }}
829
- >
830
- Clean cache
831
- </Button>
832
- {:else if config}
833
- <Button
834
- color="light"
835
- size="xs"
836
- on:click={() => {
837
- loadNConfig()
838
- drawer.openDrawer()
839
- }}
840
- >
841
- <div class="flex flex-row gap-1 items-center"> config </div>
842
- </Button>
843
- {/if}
914
+ </div>
844
915
  </div>
@@ -1,4 +1,5 @@
1
1
  import { SvelteComponent } from "svelte";
2
+ import { type WorkerPing } from '../gen';
2
3
  declare const __propDef: {
3
4
  props: {
4
5
  name: string;
@@ -10,9 +11,11 @@ declare const __propDef: {
10
11
  init_bash?: string;
11
12
  additional_python_paths?: string[];
12
13
  pip_local_dependencies?: string[];
14
+ min_alive_workers_alert_threshold?: number;
13
15
  };
14
16
  activeWorkers: number;
15
17
  customTags: string[] | undefined;
18
+ workers: [string, WorkerPing[]][];
16
19
  defaultTagPerWorkspace?: boolean | undefined;
17
20
  };
18
21
  events: {
@@ -27,7 +27,7 @@ export let allowColumnDefsActions = true;
27
27
  let inputs = {};
28
28
  const context = getContext('AppViewerContext');
29
29
  const contextPanel = getContext('ContextPanel');
30
- const { app, selectedComponent, componentControl, darkMode } = context;
30
+ const { app, selectedComponent, componentControl, darkMode, mode } = context;
31
31
  let css = initCss($app.css?.aggridcomponent, customCss);
32
32
  let selectedRowIndex = -1;
33
33
  function toggleRow(row) {
@@ -382,7 +382,24 @@ function updateOptions() {
382
382
  class="ag-theme-alpine"
383
383
  class:ag-theme-alpine-dark={$darkMode}
384
384
  >
385
- <div bind:this={eGui} style:height="100%" />
385
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
386
+ <div
387
+ bind:this={eGui}
388
+ style:height="100%"
389
+ on:keydown={(e) => {
390
+ if ((e.ctrlKey || e.metaKey) && e.key === 'c' && $mode !== 'dnd') {
391
+ const selectedCell = api?.getFocusedCell()
392
+ if (selectedCell) {
393
+ const rowIndex = selectedCell.rowIndex
394
+ const colId = selectedCell.column?.getId()
395
+ const rowNode = api?.getDisplayedRowAtIndex(rowIndex)
396
+ const selectedValue = rowNode?.data?.[colId]
397
+ navigator.clipboard.writeText(selectedValue)
398
+ sendUserToast('Copied cell value to clipboard', false)
399
+ }
400
+ }
401
+ }}
402
+ />
386
403
  </div>
387
404
  {#if resolvedConfig && 'footer' in resolvedConfig && resolvedConfig.footer}
388
405
  <div class="flex gap-1 w-full justify-between items-center text-xs text-primary p-2">
@@ -19,6 +19,7 @@ export let initializing = undefined;
19
19
  export let render;
20
20
  export let customCss = undefined;
21
21
  export let actions = undefined;
22
+ export let actionsOrder = undefined;
22
23
  let runnableComponent = undefined;
23
24
  function clear() {
24
25
  setTimeout(() => {
@@ -1,6 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { AppInput } from '../../../inputType';
3
- import type { ComponentCustomCSS, RichConfigurations } from '../../../types';
3
+ import type { ComponentCustomCSS, RichConfiguration, RichConfigurations } from '../../../types';
4
4
  import { type TableAction } from '../../../editor/component';
5
5
  import 'ag-grid-community/styles/ag-grid.css';
6
6
  import './theme/windmill-theme.css';
@@ -13,6 +13,7 @@ declare const __propDef: {
13
13
  render: boolean;
14
14
  customCss?: ComponentCustomCSS<'aggridinfinitecomponent'> | undefined;
15
15
  actions?: TableAction[] | undefined;
16
+ actionsOrder?: RichConfiguration | undefined;
16
17
  };
17
18
  events: {
18
19
  [evt: string]: CustomEvent<any>;
@@ -13,6 +13,7 @@ export let initializing = undefined;
13
13
  export let render;
14
14
  export let customCss = undefined;
15
15
  export let actions = [];
16
+ export let actionsOrder = undefined;
16
17
  let loaded = false;
17
18
  async function load() {
18
19
  await import('ag-grid-enterprise');
@@ -32,6 +33,7 @@ load();
32
33
  {render}
33
34
  {customCss}
34
35
  {actions}
36
+ {actionsOrder}
35
37
  />
36
38
  {:else}
37
39
  <Loader2 class="animate-spin" />
@@ -1,6 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { AppInput } from '../../../inputType';
3
- import type { ComponentCustomCSS, RichConfigurations } from '../../../types';
3
+ import type { ComponentCustomCSS, RichConfiguration, RichConfigurations } from '../../../types';
4
4
  import 'ag-grid-community/styles/ag-grid.css';
5
5
  import 'ag-grid-community/styles/ag-theme-alpine.css';
6
6
  import type { TableAction } from '../../../editor/component';
@@ -14,6 +14,7 @@ declare const __propDef: {
14
14
  render: boolean;
15
15
  customCss?: ComponentCustomCSS<'aggridinfinitecomponentee'> | undefined;
16
16
  actions?: TableAction[] | undefined;
17
+ actionsOrder?: RichConfiguration | undefined;
17
18
  };
18
19
  events: {
19
20
  [evt: string]: CustomEvent<any>;
@@ -18,6 +18,7 @@ import AppAggridTableActions from './AppAggridTableActions.svelte';
18
18
  import { cellRendererFactory, defaultCellRenderer } from './utils';
19
19
  import Popover from '../../../../Popover.svelte';
20
20
  import { Button } from '../../../../common';
21
+ import InputValue from '../../helpers/InputValue.svelte';
21
22
  // import 'ag-grid-community/dist/styles/ag-theme-alpine-dark.css'
22
23
  export let id;
23
24
  export let componentInput;
@@ -26,11 +27,12 @@ export let initializing = undefined;
26
27
  export let render;
27
28
  export let customCss = undefined;
28
29
  export let actions = undefined;
30
+ export let actionsOrder = undefined;
29
31
  const context = getContext('AppViewerContext');
30
32
  const contextPanel = getContext('ContextPanel');
31
33
  const iterContext = getContext('ListWrapperContext');
32
34
  const listInputs = getContext('ListInputs');
33
- const { app, worldStore, selectedComponent, componentControl, darkMode } = context;
35
+ const { app, worldStore, selectedComponent, componentControl, darkMode, mode } = context;
34
36
  const rowHeights = {
35
37
  normal: 40,
36
38
  compact: 30,
@@ -139,6 +141,19 @@ function refreshActions(actions) {
139
141
  }
140
142
  let lastActions = undefined;
141
143
  $: actions && refreshActions(actions);
144
+ let lastActionsOrder = undefined;
145
+ $: computedOrder && refreshActionsOrder(computedOrder);
146
+ function clearActionOrder() {
147
+ computedOrder = undefined;
148
+ updateOptions();
149
+ }
150
+ $: computedOrder && computedOrder.length > 0 && actionsOrder === undefined && clearActionOrder();
151
+ function refreshActionsOrder(actionsOrder) {
152
+ if (Array.isArray(actionsOrder) && !deepEqual(actionsOrder, lastActionsOrder)) {
153
+ lastActionsOrder = [...actionsOrder];
154
+ updateOptions();
155
+ }
156
+ }
142
157
  let inputs = {};
143
158
  const tableActionsFactory = cellRendererFactory((c, p) => {
144
159
  const rowIndex = p.node.rowIndex ?? 0;
@@ -147,12 +162,17 @@ const tableActionsFactory = cellRendererFactory((c, p) => {
147
162
  ['AppViewerContext', context],
148
163
  ['ContextPanel', contextPanel]
149
164
  ]);
165
+ const sortedActions = computedOrder
166
+ ? computedOrder
167
+ .map((key) => actions?.find((a) => a.id === key))
168
+ .filter(Boolean)
169
+ : actions;
150
170
  let ta = new AppAggridTableActions({
151
171
  target: c.eGui,
152
172
  props: {
153
173
  p,
154
174
  id: id,
155
- actions,
175
+ actions: sortedActions,
156
176
  rowIndex,
157
177
  row,
158
178
  render,
@@ -381,8 +401,13 @@ function updateOptions() {
381
401
  let loading = false;
382
402
  let refreshCount = 0;
383
403
  let footerRenderCount = 0;
404
+ let computedOrder = undefined;
384
405
  </script>
385
406
 
407
+ {#if actionsOrder}
408
+ <InputValue key="actionsOrder" {id} input={actionsOrder} bind:value={computedOrder} />
409
+ {/if}
410
+
386
411
  {#each Object.keys(components['aggridcomponent'].initialData.configuration) as key (key)}
387
412
  <ResolveConfig
388
413
  {id}
@@ -440,7 +465,24 @@ let footerRenderCount = 0;
440
465
  >
441
466
  {#key resolvedConfig?.pagination}
442
467
  {#if loaded}
443
- <div bind:this={eGui} style:height="100%" />
468
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
469
+ <div
470
+ bind:this={eGui}
471
+ style:height="100%"
472
+ on:keydown={(e) => {
473
+ if ((e.ctrlKey || e.metaKey) && e.key === 'c' && $mode !== 'dnd') {
474
+ const selectedCell = api?.getFocusedCell()
475
+ if (selectedCell) {
476
+ const rowIndex = selectedCell.rowIndex
477
+ const colId = selectedCell.column?.getId()
478
+ const rowNode = api?.getDisplayedRowAtIndex(rowIndex)
479
+ const selectedValue = rowNode?.data?.[colId]
480
+ navigator.clipboard.writeText(selectedValue)
481
+ sendUserToast('Copied cell value to clipboard', false)
482
+ }
483
+ }
484
+ }}
485
+ />
444
486
  {:else}
445
487
  <Loader2 class="animate-spin" />
446
488
  {/if}
@@ -1,6 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { AppInput } from '../../../inputType';
3
- import type { ComponentCustomCSS, RichConfigurations } from '../../../types';
3
+ import type { ComponentCustomCSS, RichConfiguration, RichConfigurations } from '../../../types';
4
4
  import { type TableAction } from '../../../editor/component';
5
5
  import 'ag-grid-community/styles/ag-grid.css';
6
6
  import './theme/windmill-theme.css';
@@ -13,6 +13,7 @@ declare const __propDef: {
13
13
  render: boolean;
14
14
  customCss?: ComponentCustomCSS<'aggridcomponent'> | undefined;
15
15
  actions?: TableAction[] | undefined;
16
+ actionsOrder?: RichConfiguration | undefined;
16
17
  };
17
18
  events: {
18
19
  [evt: string]: CustomEvent<any>;
@@ -13,6 +13,7 @@ export let initializing = undefined;
13
13
  export let render;
14
14
  export let customCss = undefined;
15
15
  export let actions = [];
16
+ export let actionsOrder = undefined;
16
17
  let loaded = false;
17
18
  async function load() {
18
19
  await import('ag-grid-enterprise');
@@ -32,6 +33,7 @@ load();
32
33
  {render}
33
34
  {customCss}
34
35
  {actions}
36
+ {actionsOrder}
35
37
  />
36
38
  {:else}
37
39
  <Loader2 class="animate-spin" />
@@ -1,6 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { AppInput } from '../../../inputType';
3
- import type { ComponentCustomCSS, RichConfigurations } from '../../../types';
3
+ import type { ComponentCustomCSS, RichConfiguration, RichConfigurations } from '../../../types';
4
4
  import 'ag-grid-community/styles/ag-grid.css';
5
5
  import 'ag-grid-community/styles/ag-theme-alpine.css';
6
6
  import type { TableAction } from '../../../editor/component';
@@ -14,6 +14,7 @@ declare const __propDef: {
14
14
  render: boolean;
15
15
  customCss?: ComponentCustomCSS<'aggridcomponent'> | undefined;
16
16
  actions?: TableAction[] | undefined;
17
+ actionsOrder?: RichConfiguration | undefined;
17
18
  };
18
19
  events: {
19
20
  [evt: string]: CustomEvent<any>;