windmill-components 1.383.9 → 1.389.2
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.
- package/package/assets/app.css +25 -1
- package/package/components/ArgInput.svelte +2 -1
- package/package/components/ChangeInstanceUsername.svelte +9 -108
- package/package/components/ChangeInstanceUsernameInner.svelte +112 -0
- package/package/components/ChangeInstanceUsernameInner.svelte.d.ts +21 -0
- package/package/components/DiffDrawer.svelte +27 -20
- package/package/components/DiffEditor.svelte +5 -1
- package/package/components/DisplayResult.svelte +39 -9
- package/package/components/DropdownV2.svelte +4 -26
- package/package/components/DropdownV2.svelte.d.ts +9 -1
- package/package/components/DropdownV2Inner.svelte +42 -0
- package/package/components/DropdownV2Inner.svelte.d.ts +40 -0
- package/package/components/Editor.svelte +24 -4
- package/package/components/Editor.svelte.d.ts +5 -4
- package/package/components/EditorBar.svelte +9 -11
- package/package/components/EditorSettings.svelte +44 -0
- package/package/components/EditorSettings.svelte.d.ts +17 -0
- package/package/components/EditorTheme.svelte +1 -1
- package/package/components/ErrorOrRecoveryHandler.svelte +27 -20
- package/package/components/FlowBuilder.svelte +17 -3
- package/package/components/FlowBuilder.svelte.d.ts +3 -0
- package/package/components/FlowGraphViewerStep.svelte +1 -1
- package/package/components/FlowStatusViewer.svelte +3 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
- package/package/components/FlowStatusViewerInner.svelte +5 -2
- package/package/components/FlowViewerInner.svelte +3 -7
- package/package/components/FormatOnSave.svelte +12 -29
- package/package/components/GraphqlSchemaViewer.svelte +1 -1
- package/package/components/GraphqlSchemaViewer.svelte.d.ts +1 -1
- package/package/components/HighlightCode.svelte +3 -0
- package/package/components/InstanceNameEditor.svelte +64 -0
- package/package/components/InstanceNameEditor.svelte.d.ts +23 -0
- package/package/components/LightweightArgInput.svelte +6 -11
- package/package/components/LogViewer.svelte +37 -29
- package/package/components/LogViewer.svelte.d.ts +2 -0
- package/package/components/ObjectResourceInput.svelte +1 -1
- package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
- package/package/components/Path.svelte +3 -3
- package/package/components/QueueMetricsDrawer.svelte +6 -218
- package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -3
- package/package/components/QueueMetricsDrawerInner.svelte +211 -0
- package/package/components/QueueMetricsDrawerInner.svelte.d.ts +15 -0
- package/package/components/ResourceEditorDrawer.svelte +14 -11
- package/package/components/ResourceEditorDrawer.svelte.d.ts +1 -1
- package/package/components/ResultJobLoader.svelte.d.ts +1 -1
- package/package/components/S3FilePicker.svelte +20 -8
- package/package/components/ScheduleEditorInner.svelte +497 -469
- package/package/components/ScriptBuilder.svelte +37 -24
- package/package/components/ScriptBuilder.svelte.d.ts +3 -0
- package/package/components/ScriptEditor.svelte +1 -0
- package/package/components/ScriptEditor.svelte.d.ts +2 -1
- package/package/components/ServiceLogsInner.svelte +511 -0
- package/package/components/ServiceLogsInner.svelte.d.ts +20 -0
- package/package/components/SimpleEditor.svelte +27 -2
- package/package/components/SimpleEditor.svelte.d.ts +5 -3
- package/package/components/Summary.svelte +33 -31
- package/package/components/Summary.svelte.d.ts +1 -0
- package/package/components/SuperadminSettings.svelte +28 -10
- package/package/components/TemplateEditor.svelte +1 -1
- package/package/components/TestJobLoader.svelte.d.ts +1 -1
- package/package/components/VimMode.svelte +16 -0
- package/package/components/VimMode.svelte.d.ts +14 -0
- package/package/components/WorkerTagPicker.svelte +4 -1
- package/package/components/WorkspaceGroup.svelte +139 -68
- package/package/components/WorkspaceGroup.svelte.d.ts +3 -0
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +19 -2
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +2 -1
- package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +2 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +2 -1
- package/package/components/apps/components/display/table/AppAggridTable.svelte +45 -3
- package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +2 -1
- package/package/components/apps/components/display/table/AppAggridTableEe.svelte +2 -0
- package/package/components/apps/components/display/table/AppAggridTableEe.svelte.d.ts +2 -1
- package/package/components/apps/editor/AppEditor.svelte +239 -92
- package/package/components/apps/editor/AppEditorBottomPanel.svelte +22 -0
- package/package/components/apps/editor/AppEditorBottomPanel.svelte.d.ts +24 -0
- package/package/components/apps/editor/AppEditorHeader.svelte +44 -2
- package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +9 -0
- package/package/components/apps/editor/AppExportButton.svelte +1 -1
- package/package/components/apps/editor/AppPreview.svelte +4 -0
- package/package/components/apps/editor/DeploymentHistory.svelte +7 -3
- package/package/components/apps/editor/GridEditor.svelte +4 -13
- package/package/components/apps/editor/RunnableJobPanel.svelte +25 -58
- package/package/components/apps/editor/RunnableJobPanel.svelte.d.ts +10 -1
- package/package/components/apps/editor/RunnalbeJobPanelInner.svelte +56 -0
- package/package/components/apps/editor/RunnalbeJobPanelInner.svelte.d.ts +18 -0
- package/package/components/apps/editor/SubGridEditor.svelte +3 -1
- package/package/components/apps/editor/component/Component.svelte +26 -4
- package/package/components/apps/editor/component/Component.svelte.d.ts +1 -0
- package/package/components/apps/editor/component/components.d.ts +5 -0
- package/package/components/apps/editor/componentsPanel/CssProperty.svelte +2 -0
- package/package/components/apps/editor/componentsPanel/tailwindUtils.js +267 -1
- package/package/components/apps/editor/contextPanel/ContextPanel.svelte +9 -1
- package/package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +2 -0
- package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -0
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +3 -0
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +7 -2
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +5 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +14 -2
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +25 -5
- package/package/components/apps/editor/settingsPanel/HideButton.svelte +47 -0
- package/package/components/apps/editor/settingsPanel/HideButton.svelte.d.ts +22 -0
- package/package/components/apps/editor/settingsPanel/TableActions.svelte +43 -4
- package/package/components/apps/editor/settingsPanel/TableActions.svelte.d.ts +2 -1
- package/package/components/apps/svelte-grid/Grid.svelte +6 -2
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +1 -0
- package/package/components/apps/svelte-grid/MoveResize.svelte +11 -3
- package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +1 -0
- package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
- package/package/components/apps/svelte-grid/utils/item.js +11 -4
- package/package/components/common/button/Button.svelte.d.ts +2 -2
- package/package/components/common/calendarPicker/CalendarPicker.svelte +6 -2
- package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
- package/package/components/common/drawer/ConditionalPortal.svelte +2 -1
- package/package/components/common/drawer/ConditionalPortal.svelte.d.ts +1 -0
- package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
- package/package/components/common/popup/Popup.svelte +2 -1
- package/package/components/common/popup/Popup.svelte.d.ts +1 -0
- package/package/components/common/table/AppRow.svelte +11 -8
- package/package/components/common/table/AppRow.svelte.d.ts +1 -2
- package/package/components/common/table/FlowRow.svelte +3 -3
- package/package/components/common/table/FlowRow.svelte.d.ts +1 -2
- package/package/components/common/table/RawAppRow.svelte +3 -3
- package/package/components/common/table/RawAppRow.svelte.d.ts +1 -2
- package/package/components/common/table/ScriptRow.svelte +3 -3
- package/package/components/common/table/ScriptRow.svelte.d.ts +1 -2
- package/package/components/copilot/CodeCompletionStatus.svelte +21 -46
- package/package/components/copilot/StepGen.svelte +2 -1
- package/package/components/custom_ui.d.ts +5 -1
- package/package/components/flows/CreateActionsApp.svelte +11 -8
- package/package/components/flows/CreateActionsFlow.svelte +11 -8
- package/package/components/flows/FlowEditor.svelte +1 -2
- package/package/components/flows/FlowEditor.svelte.d.ts +0 -1
- package/package/components/flows/FlowHistory.svelte +6 -3
- package/package/components/flows/content/FlowModuleScript.svelte +15 -11
- package/package/components/flows/content/FlowSettings.svelte +1 -4
- package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -0
- package/package/components/flows/header/FlowYamlEditor.svelte +55 -0
- package/package/components/flows/header/FlowYamlEditor.svelte.d.ts +17 -0
- package/package/components/flows/map/InsertTriggerButton.svelte +1 -1
- package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +1 -0
- package/package/components/flows/map/VirtualItem.svelte +1 -1
- package/package/components/flows/pickers/PickHubScript.svelte +1 -0
- package/package/components/flows/types.d.ts +7 -6
- package/package/components/flows/utils.d.ts +9 -0
- package/package/components/flows/utils.js +21 -0
- package/package/components/graph/graphBuilder.js +1 -0
- package/package/components/graph/model.d.ts +1 -0
- package/package/components/graph/renderers/edges/BaseEdge.svelte +16 -0
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte +5 -1
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +1 -0
- package/package/components/home/Item.svelte +0 -17
- package/package/components/home/deploy_ui.d.ts +2 -0
- package/package/components/home/deploy_ui.js +21 -0
- package/package/components/icons/RustIcon.svelte +70 -0
- package/package/components/icons/RustIcon.svelte.d.ts +25 -0
- package/package/components/icons/rust-logo.svg +1 -0
- package/package/components/instanceSettings.js +2 -2
- package/package/components/monaco_keybindings.d.ts +3 -0
- package/package/components/monaco_keybindings.js +9 -0
- package/package/components/preview/FlowPreviewStatus.svelte +6 -2
- package/package/components/runs/JobLoader.svelte +12 -3
- package/package/components/runs/JobLoader.svelte.d.ts +1 -1
- package/package/components/runs/ManuelDatePicker.svelte +31 -44
- package/package/components/runs/ManuelDatePicker.svelte.d.ts +6 -2
- package/package/components/runs/RunsFilter.svelte +4 -1
- package/package/components/runs/RunsFilter.svelte.d.ts +1 -0
- package/package/components/search/GlobalSearchModal.svelte +36 -25
- package/package/components/wizards/TableActionsWizard.svelte +84 -0
- package/package/components/wizards/TableActionsWizard.svelte.d.ts +22 -0
- package/package/editorUtils.js +2 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +8 -8
- package/package/gen/schemas.gen.js +8 -8
- package/package/gen/services.gen.d.ts +4 -0
- package/package/gen/services.gen.js +16 -0
- package/package/gen/types.gen.d.ts +20 -8
- package/package/infer.d.ts +1 -1
- package/package/infer.js +48 -7
- package/package/script_helpers.d.ts +1 -0
- package/package/script_helpers.js +39 -1
- package/package/scripts.d.ts +1 -1
- package/package/scripts.js +11 -3
- package/package/stores.d.ts +5 -1
- package/package/stores.js +7 -2
- package/package.json +13 -7
|
@@ -42,8 +42,9 @@ import domContent from '../dom.d.ts.txt?raw';
|
|
|
42
42
|
import { buildWorkerDefinition } from './build_workers';
|
|
43
43
|
import { initializeVscode } from './vscode';
|
|
44
44
|
import EditorTheme from './EditorTheme.svelte';
|
|
45
|
-
import { tailwindClasses } from './apps/editor/componentsPanel/tailwindUtils';
|
|
46
45
|
import { writable } from 'svelte/store';
|
|
46
|
+
import { vimMode } from '../stores';
|
|
47
|
+
import { initVim } from './monaco_keybindings';
|
|
47
48
|
// import { createConfiguredEditor } from 'vscode/monaco'
|
|
48
49
|
// import type { IStandaloneCodeEditor } from 'vscode/vscode/vs/editor/standalone/browser/standaloneCodeEditor'
|
|
49
50
|
let divEl = null;
|
|
@@ -62,6 +63,8 @@ export let fixedOverflowWidgets = true;
|
|
|
62
63
|
export let small = false;
|
|
63
64
|
export let domLib = false;
|
|
64
65
|
export let autofocus = false;
|
|
66
|
+
export let allowVim = false;
|
|
67
|
+
export let tailwindClasses = [];
|
|
65
68
|
const dispatch = createEventDispatcher();
|
|
66
69
|
const uri = `file:///${hash}.${langToExt(lang)}`;
|
|
67
70
|
buildWorkerDefinition('../../../workers', import.meta.url);
|
|
@@ -125,6 +128,20 @@ let width = 0;
|
|
|
125
128
|
let initialized = false;
|
|
126
129
|
let disableTabCond;
|
|
127
130
|
$: disableTabCond?.set(!code && !!suggestion);
|
|
131
|
+
let statusDiv = null;
|
|
132
|
+
let vimDisposable = undefined;
|
|
133
|
+
$: allowVim && editor && $vimMode && statusDiv && onVimMode();
|
|
134
|
+
$: !$vimMode && vimDisposable && onVimDisable();
|
|
135
|
+
function onVimDisable() {
|
|
136
|
+
vimDisposable?.dispose();
|
|
137
|
+
}
|
|
138
|
+
function onVimMode() {
|
|
139
|
+
if (editor && statusDiv) {
|
|
140
|
+
vimDisposable = initVim(editor, statusDiv, () => {
|
|
141
|
+
console.log('vim save not possible for simple editor');
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
128
145
|
async function loadMonaco() {
|
|
129
146
|
await initializeVscode();
|
|
130
147
|
initialized = true;
|
|
@@ -321,6 +338,7 @@ onMount(async () => {
|
|
|
321
338
|
$: mounted && extraLib && initialized && loadExtraLib();
|
|
322
339
|
onDestroy(() => {
|
|
323
340
|
try {
|
|
341
|
+
vimDisposable?.dispose();
|
|
324
342
|
model && model.dispose();
|
|
325
343
|
editor && editor.dispose();
|
|
326
344
|
}
|
|
@@ -338,7 +356,14 @@ onDestroy(() => {
|
|
|
338
356
|
{suggestion}
|
|
339
357
|
</div>
|
|
340
358
|
{/if}
|
|
341
|
-
<div
|
|
359
|
+
<div
|
|
360
|
+
bind:this={divEl}
|
|
361
|
+
class="{$$props.class ?? ''} editor simple-editor {!allowVim ? 'nonmain-editor' : ''}"
|
|
362
|
+
bind:clientWidth={width}
|
|
363
|
+
/>
|
|
364
|
+
{#if allowVim && $vimMode}
|
|
365
|
+
<div class="fixed bottom-0 z-30" bind:this={statusDiv} />
|
|
366
|
+
{/if}
|
|
342
367
|
|
|
343
368
|
<style>
|
|
344
369
|
.editor {
|
|
@@ -3,7 +3,7 @@ import '@codingame/monaco-vscode-standalone-languages';
|
|
|
3
3
|
import '@codingame/monaco-vscode-standalone-json-language-features';
|
|
4
4
|
import '@codingame/monaco-vscode-standalone-css-language-features';
|
|
5
5
|
import '@codingame/monaco-vscode-standalone-typescript-language-features';
|
|
6
|
-
import { editor as meditor } from 'monaco-editor';
|
|
6
|
+
import { editor as meditor, type IDisposable } from 'monaco-editor';
|
|
7
7
|
import '@codingame/monaco-vscode-standalone-languages';
|
|
8
8
|
import '@codingame/monaco-vscode-standalone-json-language-features';
|
|
9
9
|
import '@codingame/monaco-vscode-standalone-css-language-features';
|
|
@@ -24,13 +24,15 @@ declare const __propDef: {
|
|
|
24
24
|
small?: boolean | undefined;
|
|
25
25
|
domLib?: boolean | undefined;
|
|
26
26
|
autofocus?: boolean | undefined;
|
|
27
|
+
allowVim?: boolean | undefined;
|
|
28
|
+
tailwindClasses?: string[] | undefined;
|
|
27
29
|
getCode?: (() => string) | undefined;
|
|
28
30
|
insertAtCursor?: ((code: string) => void) | undefined;
|
|
29
31
|
setCode?: ((ncode: string) => void) | undefined;
|
|
30
32
|
format?: (() => void) | undefined;
|
|
31
33
|
focus?: (() => void) | undefined;
|
|
32
34
|
getSelectedLines?: (() => string | undefined) | undefined;
|
|
33
|
-
onDidChangeCursorSelection?: ((f: (e: meditor.ICursorSelectionChangedEvent) => void) =>
|
|
35
|
+
onDidChangeCursorSelection?: ((f: (e: meditor.ICursorSelectionChangedEvent) => void) => IDisposable | undefined) | undefined;
|
|
34
36
|
show?: (() => void) | undefined;
|
|
35
37
|
hide?: (() => void) | undefined;
|
|
36
38
|
setSuggestion?: ((value: string) => void) | undefined;
|
|
@@ -54,7 +56,7 @@ export default class SimpleEditor extends SvelteComponent<SimpleEditorProps, Sim
|
|
|
54
56
|
get format(): () => void;
|
|
55
57
|
get focus(): () => void;
|
|
56
58
|
get getSelectedLines(): () => string | undefined;
|
|
57
|
-
get onDidChangeCursorSelection(): (f: (e: meditor.ICursorSelectionChangedEvent) => void) =>
|
|
59
|
+
get onDidChangeCursorSelection(): (f: (e: meditor.ICursorSelectionChangedEvent) => void) => IDisposable | undefined;
|
|
58
60
|
get show(): () => void;
|
|
59
61
|
get hide(): () => void;
|
|
60
62
|
get setSuggestion(): (value: string) => void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script>import { Pen } from 'lucide-svelte';
|
|
2
2
|
export let value;
|
|
3
|
+
export let disabled = false;
|
|
3
4
|
function blur(e) {
|
|
4
5
|
e.key === 'Enter' && e?.target?.blur();
|
|
5
6
|
}
|
|
@@ -13,51 +14,52 @@ function blur(e) {
|
|
|
13
14
|
placeholder="Untitled"
|
|
14
15
|
class="windmillapp app-title text-sm w-full font-semibold"
|
|
15
16
|
bind:value
|
|
17
|
+
{disabled}
|
|
16
18
|
on:keydown={blur}
|
|
17
19
|
/>
|
|
18
|
-
|
|
20
|
+
{#if !disabled}
|
|
21
|
+
<Pen class="absolute top-2 right-2 pen-icon -z-10 opacity-60" size={14} />
|
|
22
|
+
{/if}
|
|
19
23
|
</div>
|
|
20
24
|
</div>
|
|
21
25
|
|
|
22
26
|
<style global>
|
|
23
27
|
:global(.app-title) {
|
|
24
|
-
display: block;
|
|
25
|
-
width: 100
|
|
26
|
-
border-radius: 0.25rem;
|
|
27
|
-
border-width: 0px;
|
|
28
|
-
padding: 0.25rem;
|
|
29
|
-
padding-left: 0.5rem;
|
|
30
|
-
padding-right: 0.5rem;
|
|
31
|
-
font-size: 0.875rem;
|
|
32
|
-
line-height: 1.25rem;
|
|
33
|
-
font-weight: 600
|
|
28
|
+
display: block !important;
|
|
29
|
+
width: 100% !important;
|
|
30
|
+
border-radius: 0.25rem !important;
|
|
31
|
+
border-width: 0px !important;
|
|
32
|
+
padding: 0.25rem !important;
|
|
33
|
+
padding-left: 0.5rem !important;
|
|
34
|
+
padding-right: 0.5rem !important;
|
|
35
|
+
font-size: 0.875rem !important;
|
|
36
|
+
line-height: 1.25rem !important;
|
|
37
|
+
font-weight: 600 !important
|
|
34
38
|
}
|
|
35
39
|
|
|
36
40
|
:global(.app-title:hover) {
|
|
37
|
-
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
|
|
38
|
-
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
|
|
39
|
-
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
|
|
40
|
-
--tw-ring-opacity: 1;
|
|
41
|
-
--tw-ring-color: rgb(234 238 244 / var(--tw-ring-opacity));
|
|
42
|
-
--tw-ring-offset-width: 0px
|
|
41
|
+
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;
|
|
42
|
+
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;
|
|
43
|
+
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000) !important;
|
|
44
|
+
--tw-ring-opacity: 1 !important;
|
|
45
|
+
--tw-ring-color: rgb(234 238 244 / var(--tw-ring-opacity)) !important;
|
|
46
|
+
--tw-ring-offset-width: 0px !important
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
:global(.app-title:focus) {
|
|
46
|
-
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
|
|
47
|
-
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
|
|
48
|
-
--tw-ring-opacity: 1;
|
|
49
|
-
--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
|
|
50
|
-
--tw-ring-offset-width: 0px;
|
|
50
|
+
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;
|
|
51
|
+
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;
|
|
52
|
+
--tw-ring-opacity: 1 !important;
|
|
53
|
+
--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)) !important;
|
|
54
|
+
--tw-ring-offset-width: 0px !important;
|
|
51
55
|
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000)
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
:global(.dark) :global(.app-title) {
|
|
55
|
-
--tw-border-opacity: 1;
|
|
56
|
-
border-color: rgb(75 85 99 / var(--tw-border-opacity));
|
|
57
|
-
--tw-
|
|
58
|
-
|
|
59
|
-
--tw-text-opacity: 1;
|
|
60
|
-
color: rgb(var(--color-text-secondary) / var(--tw-text-opacity))
|
|
59
|
+
--tw-border-opacity: 1 !important;
|
|
60
|
+
border-color: rgb(75 85 99 / var(--tw-border-opacity)) !important;
|
|
61
|
+
--tw-text-opacity: 1 !important;
|
|
62
|
+
color: rgb(var(--color-text-secondary) / var(--tw-text-opacity)) !important
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
:global(.dark) :global(.app-title:focus) {
|
|
@@ -66,9 +68,9 @@ function blur(e) {
|
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
:global(.dark) :global(.app-title:hover) {
|
|
69
|
-
--tw-ring-opacity: 1;
|
|
70
|
-
--tw-ring-color: rgb(54 77 110 / var(--tw-ring-opacity))
|
|
71
|
+
--tw-ring-opacity: 1 !important;
|
|
72
|
+
--tw-ring-color: rgb(54 77 110 / var(--tw-ring-opacity)) !important
|
|
71
73
|
}
|
|
72
74
|
:global(.app-title:focus) + :global(.pen-icon) {
|
|
73
|
-
display: none
|
|
75
|
+
display: none !important
|
|
74
76
|
}</style>
|
|
@@ -21,6 +21,7 @@ import ConfirmationModal from './common/confirmationModal/ConfirmationModal.svel
|
|
|
21
21
|
import ChangeInstanceUsername from './ChangeInstanceUsername.svelte';
|
|
22
22
|
import Tooltip from './Tooltip.svelte';
|
|
23
23
|
import { isCloudHosted } from '../cloud';
|
|
24
|
+
import InstanceNameEditor from './InstanceNameEditor.svelte';
|
|
24
25
|
let drawer;
|
|
25
26
|
let filter = '';
|
|
26
27
|
export function openDrawer() {
|
|
@@ -63,6 +64,21 @@ async function enableAutomateUsernameCreationSetting() {
|
|
|
63
64
|
sendUserToast('Automatic username creation enabled');
|
|
64
65
|
listUsers();
|
|
65
66
|
}
|
|
67
|
+
async function updateName(name, email) {
|
|
68
|
+
try {
|
|
69
|
+
await UserService.globalUserUpdate({
|
|
70
|
+
email,
|
|
71
|
+
requestBody: {
|
|
72
|
+
name
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
sendUserToast('User updated');
|
|
76
|
+
listUsers();
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
sendUserToast('Error updating user', true);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
66
82
|
</script>
|
|
67
83
|
|
|
68
84
|
<SearchItems
|
|
@@ -213,15 +229,18 @@ async function enableAutomateUsernameCreationSetting() {
|
|
|
213
229
|
</td>
|
|
214
230
|
<td>
|
|
215
231
|
<div class="flex flex-row gap-x-1 justify-end">
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
232
|
+
<InstanceNameEditor
|
|
233
|
+
value={name}
|
|
234
|
+
{username}
|
|
235
|
+
{email}
|
|
236
|
+
on:save={(e) => {
|
|
237
|
+
updateName(e.detail, email)
|
|
238
|
+
}}
|
|
239
|
+
on:renamed={() => {
|
|
240
|
+
listUsers()
|
|
241
|
+
}}
|
|
242
|
+
{automateUsernameCreation}
|
|
243
|
+
/>
|
|
225
244
|
<Button
|
|
226
245
|
color="light"
|
|
227
246
|
variant="contained"
|
|
@@ -230,7 +249,6 @@ async function enableAutomateUsernameCreationSetting() {
|
|
|
230
249
|
btnClasses="text-red-500"
|
|
231
250
|
on:click={() => {
|
|
232
251
|
deleteConfirmedCallback = async () => {
|
|
233
|
-
console.log(email)
|
|
234
252
|
await UserService.globalUserDelete({ email })
|
|
235
253
|
sendUserToast(`User ${email} removed`)
|
|
236
254
|
listUsers()
|
|
@@ -536,7 +536,7 @@ onDestroy(() => {
|
|
|
536
536
|
<div
|
|
537
537
|
bind:this={divEl}
|
|
538
538
|
style="height: 18px;"
|
|
539
|
-
class="{$$props.class ?? ''} border template rounded min-h-4 mx-0.5 overflow-clip"
|
|
539
|
+
class="{$$props.class ?? ''} border template nonmain-editor rounded min-h-4 mx-0.5 overflow-clip"
|
|
540
540
|
bind:clientWidth={width}
|
|
541
541
|
/>
|
|
542
542
|
|
|
@@ -51,7 +51,7 @@ export default class TestJobLoader extends SvelteComponent<TestJobLoaderProps, T
|
|
|
51
51
|
get runScriptByPath(): (path: string | undefined, args: Record<string, any>) => Promise<string>;
|
|
52
52
|
get runFlowByPath(): (path: string | undefined, args: Record<string, any>) => Promise<string>;
|
|
53
53
|
get getLogs(): () => Promise<void>;
|
|
54
|
-
get runPreview(): (path: string | undefined, code: string, lang: "python3" | "deno" | "go" | "bash" | "powershell" | "postgresql" | "mysql" | "bigquery" | "snowflake" | "mssql" | "graphql" | "nativets" | "bun" | "php" | undefined, args: Record<string, any>, tag: string | undefined, lock?: string | undefined) => Promise<string>;
|
|
54
|
+
get runPreview(): (path: string | undefined, code: string, lang: "python3" | "deno" | "go" | "bash" | "powershell" | "postgresql" | "mysql" | "bigquery" | "snowflake" | "mssql" | "graphql" | "nativets" | "bun" | "php" | "rust" | undefined, args: Record<string, any>, tag: string | undefined, lock?: string | undefined) => Promise<string>;
|
|
55
55
|
get cancelJob(): () => Promise<void>;
|
|
56
56
|
get clearCurrentJob(): () => Promise<void>;
|
|
57
57
|
get watchJob(): (testId: string) => Promise<void>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script>import { VIM_MODE_SETTING_NAME, vimMode } from '../stores';
|
|
2
|
+
import { storeLocalSetting } from '../utils';
|
|
3
|
+
import Toggle from './Toggle.svelte';
|
|
4
|
+
function storeSetting() {
|
|
5
|
+
storeLocalSetting(VIM_MODE_SETTING_NAME, $vimMode.toString());
|
|
6
|
+
}
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<Toggle
|
|
10
|
+
size="xs"
|
|
11
|
+
bind:checked={$vimMode}
|
|
12
|
+
on:change={() => {
|
|
13
|
+
storeSetting()
|
|
14
|
+
}}
|
|
15
|
+
options={{ right: 'vim mode' }}
|
|
16
|
+
/>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: Record<string, never>;
|
|
4
|
+
events: {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
};
|
|
7
|
+
slots: {};
|
|
8
|
+
};
|
|
9
|
+
export type VimModeProps = typeof __propDef.props;
|
|
10
|
+
export type VimModeEvents = typeof __propDef.events;
|
|
11
|
+
export type VimModeSlots = typeof __propDef.slots;
|
|
12
|
+
export default class VimMode extends SvelteComponent<VimModeProps, VimModeEvents, VimModeSlots> {
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -15,7 +15,7 @@ async function loadWorkerGroups() {
|
|
|
15
15
|
|
|
16
16
|
<div class="flex gap-2 items-center">
|
|
17
17
|
<div class="max-w-sm grow">
|
|
18
|
-
{#if workerTags}
|
|
18
|
+
{#if $workerTags}
|
|
19
19
|
{#if $workerTags?.length ?? 0 > 0}
|
|
20
20
|
<select
|
|
21
21
|
value={tag}
|
|
@@ -32,6 +32,9 @@ async function loadWorkerGroups() {
|
|
|
32
32
|
{:else}
|
|
33
33
|
<option value="" disabled selected>Worker Group Tag</option>
|
|
34
34
|
{/if}
|
|
35
|
+
{#if tag && tag != '' && !($workerTags ?? []).includes(tag)}
|
|
36
|
+
<option value={tag} selected>{tag}</option>
|
|
37
|
+
{/if}
|
|
35
38
|
{#each $workerTags ?? [] as tag (tag)}
|
|
36
39
|
<option value={tag}>{tag}</option>
|
|
37
40
|
{/each}
|
|
@@ -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
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
{
|
|
781
|
-
|
|
782
|
-
|
|
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
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
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
|
-
|
|
807
|
-
|
|
808
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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">
|