windmill-components 1.394.7 → 1.405.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.
- package/package/ata/edgeCases.d.ts +0 -1
- package/package/ata/edgeCases.js +2 -8
- package/package/ata/index.js +4 -3
- package/package/common.d.ts +1 -1
- package/package/common.js +2 -2
- package/package/components/ApiConnectForm.svelte +33 -7
- package/package/components/ArgInput.svelte +4 -2
- package/package/components/CenteredModal.svelte +4 -1
- package/package/components/CenteredModal.svelte.d.ts +1 -0
- package/package/components/DateInput.svelte +2 -0
- package/package/components/DateInput.svelte.d.ts +1 -0
- package/package/components/DefaultScripts.svelte +8 -3
- package/package/components/DefaultScripts.svelte.d.ts +5 -1
- package/package/components/DefaultScriptsInner.svelte +16 -7
- package/package/components/DefaultScriptsInner.svelte.d.ts +3 -1
- package/package/components/Dev.svelte +68 -11
- package/package/components/DropdownV2.svelte.d.ts +3 -3
- package/package/components/DropdownV2Inner.svelte.d.ts +3 -3
- package/package/components/EditableSchemaForm.svelte +1 -0
- package/package/components/Editor.svelte +3 -2
- package/package/components/Editor.svelte.d.ts +1 -1
- package/package/components/ExecutionDuration.svelte +44 -0
- package/package/components/ExecutionDuration.svelte.d.ts +24 -0
- package/package/components/FlowBuilder.svelte +20 -12
- package/package/components/FlowGraphViewer.svelte +9 -2
- package/package/components/FlowGraphViewerStep.svelte +23 -10
- package/package/components/FlowJobResult.svelte +0 -1
- package/package/components/FlowStatusViewerInner.svelte +17 -4
- package/package/components/FlowTimeline.svelte +3 -3
- package/package/components/HighlightCode.svelte +3 -0
- package/package/components/IconedResourceType.svelte +17 -10
- package/package/components/IconedResourceType.svelte.d.ts +2 -0
- package/package/components/IdEditorInput.svelte +0 -1
- package/package/components/InstanceSettings.svelte +247 -129
- package/package/components/InstanceSettings.svelte.d.ts +2 -0
- package/package/components/JobArgs.svelte +3 -1
- package/package/components/LightweightArgInput.svelte +35 -10
- package/package/components/LightweightArgInput.svelte.d.ts +1 -0
- package/package/components/LightweightObjectResourceInput.svelte +2 -0
- package/package/components/LightweightObjectResourceInput.svelte.d.ts +1 -0
- package/package/components/LightweightSchemaForm.svelte +2 -0
- package/package/components/LightweightSchemaForm.svelte.d.ts +1 -0
- package/package/components/Login.svelte +10 -5
- package/package/components/Login.svelte.d.ts +1 -0
- package/package/components/ModulePreview.svelte +21 -2
- package/package/components/ModuleStatus.svelte +3 -0
- package/package/components/ModuleStatus.svelte.d.ts +1 -0
- package/package/components/OAuthSetting.svelte +40 -15
- package/package/components/ObjectStoreConfigSettings.svelte +78 -76
- package/package/components/ParqetCsvTableRenderer.svelte +25 -3
- package/package/components/Password.svelte.d.ts +1 -1
- package/package/components/Path.svelte +74 -54
- package/package/components/Path.svelte.d.ts +2 -1
- package/package/components/ResourceEditor.svelte +38 -9
- package/package/components/ResultJobLoader.svelte +6 -3
- package/package/components/ResultJobLoader.svelte.d.ts +1 -1
- package/package/components/ScheduleEditorInner.svelte +2 -2
- package/package/components/SchemaForm.svelte +6 -1
- package/package/components/ScriptBuilder.svelte +12 -5
- package/package/components/ScriptEditor.svelte +33 -3
- package/package/components/ScriptEditor.svelte.d.ts +1 -1
- package/package/components/Scrollable.svelte +47 -0
- package/package/components/Scrollable.svelte.d.ts +21 -0
- package/package/components/ShareModal.svelte.d.ts +2 -2
- package/package/components/SuperadminSettings.svelte +5 -7
- package/package/components/TestJobLoader.svelte +46 -5
- package/package/components/TestJobLoader.svelte.d.ts +2 -1
- package/package/components/ToggleHubWorkspaceQuick.svelte +14 -0
- package/package/components/ToggleHubWorkspaceQuick.svelte.d.ts +16 -0
- package/package/components/WorkspaceGroup.svelte +3 -2
- package/package/components/apps/components/helpers/DebouncedInput.svelte +9 -1
- package/package/components/apps/components/inputs/AppSelect.svelte +1 -1
- package/package/components/apps/editor/component/components.d.ts +79 -79
- package/package/components/apps/svelte-select/lib/Select.svelte +1 -1
- package/package/components/common/fileUpload/FileUpload.svelte +1 -1
- package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
- package/package/components/common/menu/Menu.svelte +2 -1
- package/package/components/common/menu/MenuV2.svelte +3 -1
- package/package/components/common/menu/MenuV2.svelte.d.ts +1 -0
- package/package/components/common/popup/Popup.svelte +22 -12
- package/package/components/common/popup/Popup.svelte.d.ts +2 -0
- package/package/components/common/popup/PopupV2.svelte +58 -0
- package/package/components/common/popup/PopupV2.svelte.d.ts +27 -0
- package/package/components/copilot/CronGen.svelte +1 -1
- package/package/components/copilot/RegexGen.svelte +4 -4
- package/package/components/copilot/StepGen.svelte +6 -6
- package/package/components/copilot/StepGenQuick.svelte +57 -0
- package/package/components/copilot/StepGenQuick.svelte.d.ts +23 -0
- package/package/components/copilot/flow.d.ts +2 -0
- package/package/components/copilot/flow.js +55 -0
- package/package/components/details/DetailPageDetailPanel.svelte +9 -1
- package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
- package/package/components/details/DetailPageLayout.svelte +2 -0
- package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
- package/package/components/details/utils.d.ts +0 -1
- package/package/components/details/utils.js +1 -12
- package/package/components/flows/FlowEditor.svelte +2 -1
- package/package/components/flows/FlowProgressBar.svelte +16 -1
- package/package/components/flows/FlowProgressBar.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowBranchesAllWrapper.svelte +8 -0
- package/package/components/flows/content/FlowBranchesAllWrapper.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowBranchesOneWrapper.svelte +8 -0
- package/package/components/flows/content/FlowBranchesOneWrapper.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowConstants.svelte +1 -1
- package/package/components/flows/content/FlowEditorPanel.svelte +3 -0
- package/package/components/flows/content/FlowInputs.svelte +7 -6
- package/package/components/flows/content/FlowInputs.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowInputsFlowQuick.svelte +65 -0
- package/package/components/flows/content/FlowInputsFlowQuick.svelte.d.ts +19 -0
- package/package/components/flows/content/FlowInputsQuick.svelte +419 -0
- package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +33 -0
- package/package/components/flows/content/FlowLoop.svelte +7 -1
- package/package/components/flows/content/FlowModuleComponent.svelte +12 -3
- package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowModuleSkip.svelte +69 -0
- package/package/components/flows/content/FlowModuleSkip.svelte.d.ts +20 -0
- package/package/components/flows/content/FlowModuleWrapper.svelte +17 -4
- package/package/components/flows/content/FlowPreprocessorModule.svelte +16 -0
- package/package/components/flows/content/FlowPreprocessorModule.svelte.d.ts +16 -0
- package/package/components/flows/content/FlowWhileLoop.svelte +9 -0
- package/package/components/flows/content/FlowWhileLoop.svelte.d.ts +1 -0
- package/package/components/flows/content/GenAiQuick.svelte +30 -0
- package/package/components/flows/content/GenAiQuick.svelte.d.ts +20 -0
- package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -2
- package/package/components/flows/flowInfers.js +1 -1
- package/package/components/flows/header/FlowPreviewButtons.svelte +1 -0
- package/package/components/flows/idUtils.js +3 -1
- package/package/components/flows/map/FlowCopilotButton.svelte +55 -0
- package/package/components/flows/map/FlowCopilotButton.svelte.d.ts +16 -0
- package/package/components/flows/map/FlowErrorHandlerItem.svelte +77 -47
- package/package/components/flows/map/FlowJobsMenu.svelte +1 -1
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +25 -12
- package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +61 -18
- package/package/components/flows/map/InsertModuleButton.svelte +161 -138
- package/package/components/flows/map/InsertModuleButton.svelte.d.ts +7 -4
- package/package/components/flows/map/MapItem.svelte +11 -0
- package/package/components/flows/map/MapItem.svelte.d.ts +1 -0
- package/package/components/flows/pickers/FlowScriptPickerQuick.svelte +48 -0
- package/package/components/flows/pickers/FlowScriptPickerQuick.svelte.d.ts +23 -0
- package/package/components/flows/pickers/FlowToplevelNode.svelte +19 -0
- package/package/components/flows/pickers/FlowToplevelNode.svelte.d.ts +19 -0
- package/package/components/flows/pickers/PickHubScriptQuick.svelte +138 -0
- package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +33 -0
- package/package/components/flows/pickers/TopLevelNode.svelte +58 -0
- package/package/components/flows/pickers/TopLevelNode.svelte.d.ts +21 -0
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +120 -0
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +35 -0
- package/package/components/flows/types.d.ts +1 -0
- package/package/components/graph/FlowGraphV2.svelte +93 -58
- package/package/components/graph/FlowGraphV2.svelte.d.ts +2 -1
- package/package/components/graph/graphBuilder.d.ts +2 -1
- package/package/components/graph/graphBuilder.js +345 -280
- package/package/components/graph/model.d.ts +1 -0
- package/package/components/graph/renderers/edges/BaseEdge.svelte +36 -14
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
- package/package/components/graph/renderers/nodes/InputNode.svelte +31 -51
- package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +6 -1
- package/package/components/graph/renderers/nodes/ModuleNode.svelte +2 -1
- package/package/components/graph/util.d.ts +1 -1
- package/package/components/graph/util.js +7 -2
- package/package/components/home/ListFiltersQuick.svelte +51 -0
- package/package/components/home/ListFiltersQuick.svelte.d.ts +23 -0
- package/package/components/icons/AnsibleIcon.svelte +42 -0
- package/package/components/icons/AnsibleIcon.svelte.d.ts +25 -0
- package/package/components/icons/WindmillIcon2.svelte +141 -0
- package/package/components/icons/WindmillIcon2.svelte.d.ts +20 -0
- package/package/components/icons/index.d.ts +2 -1
- package/package/components/icons/index.js +2 -1
- package/package/components/instanceSettings.d.ts +2 -2
- package/package/components/instanceSettings.js +25 -58
- package/package/components/jobs/JobProgressBar.svelte +52 -0
- package/package/components/jobs/JobProgressBar.svelte.d.ts +23 -0
- package/package/components/progressBar/ProgressBar.svelte +18 -1
- package/package/components/progressBar/ProgressBar.svelte.d.ts +3 -0
- package/package/components/runs/JobPreview.svelte +1 -0
- package/package/components/runs/PreprocessedArgsDisplay.svelte +71 -0
- package/package/components/runs/PreprocessedArgsDisplay.svelte.d.ts +16 -0
- package/package/components/schema/AddProperty.svelte +1 -0
- package/package/components/schema/EditableSchemaWrapper.svelte +142 -19
- package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +1 -0
- package/package/components/schema/FlowPropertyEditor.svelte +12 -0
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -0
- package/package/components/scriptEditor/LogPanel.svelte +1 -0
- package/package/components/scriptEditor/LogPanel.svelte.d.ts +3 -1
- package/package/components/search/GlobalSearchModal.svelte +2 -1
- package/package/components/sidebar/SidebarContent.svelte +69 -8
- package/package/components/sidebar/changelogs.js +10 -0
- package/package/components/triggers/RouteEditor.svelte +19 -0
- package/package/components/triggers/RouteEditor.svelte.d.ts +21 -0
- package/package/components/triggers/RouteEditorInner.svelte +327 -0
- package/package/components/triggers/RouteEditorInner.svelte.d.ts +21 -0
- package/package/components/triggers/RoutesPanel.svelte +74 -0
- package/package/components/triggers/RoutesPanel.svelte.d.ts +17 -0
- package/package/editorUtils.js +2 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +159 -8
- package/package/gen/schemas.gen.js +161 -8
- package/package/gen/services.gen.d.ts +139 -1
- package/package/gen/services.gen.js +282 -1
- package/package/gen/types.gen.d.ts +455 -12
- package/package/hubPaths.json +6 -8
- package/package/infer.d.ts +4 -2
- package/package/infer.js +25 -23
- package/package/inferArgSig.js +8 -2
- package/package/monaco_workers/build_workers.js +8 -13
- package/package/monaco_workers/graphql.worker.bundle.js +45440 -174
- package/package/relative_imports.d.ts +3 -0
- package/package/relative_imports.js +25 -0
- package/package/script_helpers.d.ts +7 -2
- package/package/script_helpers.js +151 -3
- package/package/scripts.d.ts +1 -1
- package/package/scripts.js +5 -1
- package/package/stores.d.ts +1 -0
- package/package/stores.js +1 -0
- package/package/utils.d.ts +1 -0
- package/package/utils.js +4 -0
- package/package.json +16 -7
- package/package/components/flows/map/InsertTriggerButton.svelte +0 -48
- package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +0 -24
- package/package/monaco_workers/cssWorker-es.js +0 -43763
- package/package/monaco_workers/editorWorker-es.d.ts +0 -2
- package/package/monaco_workers/editorWorker-es.js +0 -8066
- package/package/monaco_workers/htmlWorker-es.js +0 -21551
- package/package/monaco_workers/jsonWorker-es.js +0 -13523
- package/package/monaco_workers/tsWorker-es.d.ts +0 -103
- package/package/monaco_workers/tsWorker-es.js +0 -212193
|
@@ -25,6 +25,7 @@ export let password = false;
|
|
|
25
25
|
export let variableEditor = undefined;
|
|
26
26
|
export let itemPicker = undefined;
|
|
27
27
|
export let nullable = false;
|
|
28
|
+
export let disabled = false;
|
|
28
29
|
export let defaultValue = undefined;
|
|
29
30
|
export let propsNames = [];
|
|
30
31
|
export let showExpr = undefined;
|
|
@@ -302,6 +303,7 @@ let initialObjectSelected = Object.keys(schema?.properties ?? {}).length == 0 ?
|
|
|
302
303
|
{contentEncoding}
|
|
303
304
|
{format}
|
|
304
305
|
{extra}
|
|
306
|
+
{disabled}
|
|
305
307
|
/>
|
|
306
308
|
{:else}
|
|
307
309
|
<ArgInput
|
|
@@ -316,6 +318,7 @@ let initialObjectSelected = Object.keys(schema?.properties ?? {}).length == 0 ?
|
|
|
316
318
|
{contentEncoding}
|
|
317
319
|
{format}
|
|
318
320
|
{extra}
|
|
321
|
+
{disabled}
|
|
319
322
|
{nullable}
|
|
320
323
|
{variableEditor}
|
|
321
324
|
compact
|
|
@@ -352,6 +355,15 @@ let initialObjectSelected = Object.keys(schema?.properties ?? {}).length == 0 ?
|
|
|
352
355
|
disabled={required}
|
|
353
356
|
/>
|
|
354
357
|
{/if}
|
|
358
|
+
<Toggle
|
|
359
|
+
options={{
|
|
360
|
+
right: 'Disabled',
|
|
361
|
+
rightTooltip: 'Do not let user modify this field'
|
|
362
|
+
}}
|
|
363
|
+
lightMode
|
|
364
|
+
size="xs"
|
|
365
|
+
bind:checked={disabled}
|
|
366
|
+
/>
|
|
355
367
|
</div>
|
|
356
368
|
|
|
357
369
|
{#if displayWebhookWarning && !(type === 'object' && oneOf && oneOf.length >= 2)}
|
|
@@ -14,6 +14,7 @@ declare const __propDef: {
|
|
|
14
14
|
variableEditor?: VariableEditor | undefined;
|
|
15
15
|
itemPicker?: ItemPicker | undefined;
|
|
16
16
|
nullable?: boolean | undefined;
|
|
17
|
+
disabled?: boolean | undefined;
|
|
17
18
|
defaultValue?: any;
|
|
18
19
|
propsNames?: any;
|
|
19
20
|
showExpr?: string | undefined;
|
|
@@ -421,8 +421,9 @@ function maxModalHeight(tab) {
|
|
|
421
421
|
id="quickSearchInput"
|
|
422
422
|
bind:this={textInput}
|
|
423
423
|
type="text"
|
|
424
|
-
class="quick-search-input"
|
|
424
|
+
class="quick-search-input !bg-surface"
|
|
425
425
|
bind:value={searchTerm}
|
|
426
|
+
autocomplete="off"
|
|
426
427
|
/>
|
|
427
428
|
<label
|
|
428
429
|
for="quickSearchInput"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script>import MenuLink from './MenuLink.svelte';
|
|
2
|
-
import { superadmin, userStore, workspaceStore } from '../../stores';
|
|
2
|
+
import { superadmin, usedTriggerKinds, userStore, workspaceStore } from '../../stores';
|
|
3
3
|
import { SIDEBAR_SHOW_SCHEDULES } from '../../consts';
|
|
4
|
-
import { BookOpen, Bot, Boxes, Calendar, DollarSign, Eye, FolderCog, FolderOpen, Github, HelpCircle, Home, LogOut, Newspaper, Play, ServerCog, Settings, UserCog } from 'lucide-svelte';
|
|
4
|
+
import { BookOpen, Bot, Boxes, Calendar, DollarSign, Eye, FolderCog, FolderOpen, Github, HelpCircle, Home, LogOut, Newspaper, Play, Route, ServerCog, Settings, UserCog, Plus } from 'lucide-svelte';
|
|
5
5
|
import Menu from '../common/menu/MenuV2.svelte';
|
|
6
6
|
import MenuButton from './MenuButton.svelte';
|
|
7
7
|
import { MenuItem } from '@rgossiaux/svelte-headlessui';
|
|
@@ -16,6 +16,7 @@ import { twMerge } from 'tailwind-merge';
|
|
|
16
16
|
import { onMount } from 'svelte';
|
|
17
17
|
import { base } from '../../base';
|
|
18
18
|
import { changelogs } from './changelogs';
|
|
19
|
+
import { page } from '$app/stores';
|
|
19
20
|
$: mainMenuLinks = [
|
|
20
21
|
{ label: 'Home', href: `${base}/`, icon: Home },
|
|
21
22
|
{ label: 'Runs', href: `${base}/runs`, icon: Play },
|
|
@@ -25,13 +26,16 @@ $: mainMenuLinks = [
|
|
|
25
26
|
icon: DollarSign,
|
|
26
27
|
disabled: $userStore?.operator
|
|
27
28
|
},
|
|
28
|
-
{ label: 'Resources', href: `${base}/resources`, icon: Boxes, disabled: $userStore?.operator }
|
|
29
|
+
{ label: 'Resources', href: `${base}/resources`, icon: Boxes, disabled: $userStore?.operator }
|
|
30
|
+
];
|
|
31
|
+
$: triggerMenuLinks = [
|
|
29
32
|
{
|
|
30
33
|
label: 'Schedules',
|
|
31
34
|
href: `${base}/schedules`,
|
|
32
35
|
icon: Calendar,
|
|
33
36
|
disabled: !SIDEBAR_SHOW_SCHEDULES || $userStore?.operator
|
|
34
|
-
}
|
|
37
|
+
},
|
|
38
|
+
...defaultExtraTriggerLinks.filter((link) => $usedTriggerKinds.includes(link.kind) || $page.url.pathname.includes(link.href))
|
|
35
39
|
];
|
|
36
40
|
async function leaveWorkspace() {
|
|
37
41
|
await WorkspaceService.leaveWorkspace({ workspace: $workspaceStore ?? '' });
|
|
@@ -39,6 +43,18 @@ async function leaveWorkspace() {
|
|
|
39
43
|
clearStores();
|
|
40
44
|
goto('/user/workspaces');
|
|
41
45
|
}
|
|
46
|
+
const defaultExtraTriggerLinks = [
|
|
47
|
+
{
|
|
48
|
+
label: 'HTTP',
|
|
49
|
+
href: '/routes',
|
|
50
|
+
icon: Route,
|
|
51
|
+
disabled: $userStore?.operator,
|
|
52
|
+
kind: 'http'
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
$: extraTriggerLinks = defaultExtraTriggerLinks.filter((link) => {
|
|
56
|
+
return !$page.url.pathname.includes(link.href) && !$usedTriggerKinds.includes(link.kind);
|
|
57
|
+
});
|
|
42
58
|
$: secondaryMenuLinks = [
|
|
43
59
|
// {
|
|
44
60
|
// label: 'Workspace',
|
|
@@ -170,10 +186,55 @@ let leaveWorkspaceModal = false;
|
|
|
170
186
|
noGap ? 'gap-0' : 'gap-16'
|
|
171
187
|
)}
|
|
172
188
|
>
|
|
173
|
-
<div class={twMerge('
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
189
|
+
<div class={twMerge('pt-4 ', noGap ? 'md:mb-0 mb-0' : 'mb-6 md:mb-10')}>
|
|
190
|
+
<div class="space-y-1">
|
|
191
|
+
{#each mainMenuLinks as menuLink (menuLink.href ?? menuLink.label)}
|
|
192
|
+
<MenuLink class="!text-xs" {...menuLink} {isCollapsed} />
|
|
193
|
+
{/each}
|
|
194
|
+
</div>
|
|
195
|
+
<div class="pt-4">
|
|
196
|
+
<div
|
|
197
|
+
class="text-gray-400 text-[0.5rem] uppercase transition-opacity"
|
|
198
|
+
class:opacity-0={isCollapsed}>Triggers</div
|
|
199
|
+
>
|
|
200
|
+
<div class="space-y-1">
|
|
201
|
+
{#each triggerMenuLinks as menuLink (menuLink.href ?? menuLink.label)}
|
|
202
|
+
<MenuLink class="!text-xs" {...menuLink} {isCollapsed} />
|
|
203
|
+
{/each}
|
|
204
|
+
{#if extraTriggerLinks.length > 0 && !$userStore?.operator}
|
|
205
|
+
<Menu>
|
|
206
|
+
<div
|
|
207
|
+
slot="trigger"
|
|
208
|
+
class="w-full text-gray-400 text-2xs flex flex-row gap-1 py-1 items-center px-2 hover:bg-[#2A3648] dark:hover:bg-[#30404e] rounded"
|
|
209
|
+
>
|
|
210
|
+
<Plus size={14} />
|
|
211
|
+
</div>
|
|
212
|
+
{#each extraTriggerLinks as subItem (subItem.href ?? subItem.label)}
|
|
213
|
+
<MenuItem>
|
|
214
|
+
<div class="py-1" role="none">
|
|
215
|
+
<a
|
|
216
|
+
href={subItem.href}
|
|
217
|
+
class={twMerge(
|
|
218
|
+
'text-secondary block px-4 py-2 text-2xs hover:bg-surface-hover hover:text-primary'
|
|
219
|
+
)}
|
|
220
|
+
role="menuitem"
|
|
221
|
+
tabindex="-1"
|
|
222
|
+
>
|
|
223
|
+
<div class="flex flex-row items-center gap-2">
|
|
224
|
+
{#if subItem.icon}
|
|
225
|
+
<svelte:component this={subItem.icon} size={16} />
|
|
226
|
+
{/if}
|
|
227
|
+
|
|
228
|
+
{subItem.label}
|
|
229
|
+
</div>
|
|
230
|
+
</a>
|
|
231
|
+
</div>
|
|
232
|
+
</MenuItem>
|
|
233
|
+
{/each}
|
|
234
|
+
</Menu>
|
|
235
|
+
{/if}
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
177
238
|
</div>
|
|
178
239
|
<div class="flex flex-col h-full justify-end">
|
|
179
240
|
<div class={twMerge('space-y-0.5 mb-6 md:mb-10', noGap ? 'md:mb-0 mb-0' : 'mb-6 md:mb-10')}>
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
const changelogs = [
|
|
2
|
+
{
|
|
3
|
+
label: 'Custom HTTP routes',
|
|
4
|
+
href: 'https://www.windmill.dev/changelog/http-routing',
|
|
5
|
+
date: '2024-09-23'
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
label: 'Set/Get progress from code',
|
|
9
|
+
href: 'https://www.windmill.dev/changelog/explicit-progress',
|
|
10
|
+
date: '2024-09-18'
|
|
11
|
+
},
|
|
2
12
|
{
|
|
3
13
|
label: 'Directly edit flow YAML',
|
|
4
14
|
href: 'https://www.windmill.dev/changelog/flow-yaml-editor',
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script>import { tick } from 'svelte';
|
|
2
|
+
import RouteEditorInner from './RouteEditorInner.svelte';
|
|
3
|
+
let open = false;
|
|
4
|
+
export async function openEdit(ePath, isFlow) {
|
|
5
|
+
open = true;
|
|
6
|
+
await tick();
|
|
7
|
+
drawer?.openEdit(ePath, isFlow);
|
|
8
|
+
}
|
|
9
|
+
export async function openNew(is_flow, initial_script_path) {
|
|
10
|
+
open = true;
|
|
11
|
+
await tick();
|
|
12
|
+
drawer?.openNew(is_flow, initial_script_path);
|
|
13
|
+
}
|
|
14
|
+
let drawer;
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
{#if open}
|
|
18
|
+
<RouteEditorInner on:update bind:this={drawer} />
|
|
19
|
+
{/if}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
openEdit?: ((ePath: string, isFlow: boolean) => Promise<void>) | undefined;
|
|
5
|
+
openNew?: ((is_flow: boolean, initial_script_path?: string) => Promise<void>) | undefined;
|
|
6
|
+
};
|
|
7
|
+
events: {
|
|
8
|
+
update: CustomEvent<any>;
|
|
9
|
+
} & {
|
|
10
|
+
[evt: string]: CustomEvent<any>;
|
|
11
|
+
};
|
|
12
|
+
slots: {};
|
|
13
|
+
};
|
|
14
|
+
export type RouteEditorProps = typeof __propDef.props;
|
|
15
|
+
export type RouteEditorEvents = typeof __propDef.events;
|
|
16
|
+
export type RouteEditorSlots = typeof __propDef.slots;
|
|
17
|
+
export default class RouteEditor extends SvelteComponent<RouteEditorProps, RouteEditorEvents, RouteEditorSlots> {
|
|
18
|
+
get openEdit(): (ePath: string, isFlow: boolean) => Promise<void>;
|
|
19
|
+
get openNew(): (is_flow: boolean, initial_script_path?: string | undefined) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
<script>import { Alert, Badge, Button } from '../common';
|
|
2
|
+
import Drawer from '../common/drawer/Drawer.svelte';
|
|
3
|
+
import DrawerContent from '../common/drawer/DrawerContent.svelte';
|
|
4
|
+
import Path from '../Path.svelte';
|
|
5
|
+
import Required from '../Required.svelte';
|
|
6
|
+
import ScriptPicker from '../ScriptPicker.svelte';
|
|
7
|
+
import { HttpTriggerService } from '../../gen';
|
|
8
|
+
import { usedTriggerKinds, userStore, workspaceStore } from '../../stores';
|
|
9
|
+
import { canWrite, emptyString, sendUserToast } from '../../utils';
|
|
10
|
+
import { createEventDispatcher } from 'svelte';
|
|
11
|
+
import Section from '../Section.svelte';
|
|
12
|
+
import { Loader2, Save } from 'lucide-svelte';
|
|
13
|
+
import Label from '../Label.svelte';
|
|
14
|
+
import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
|
|
15
|
+
import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
16
|
+
import { page } from '$app/stores';
|
|
17
|
+
import { isCloudHosted } from '../../cloud';
|
|
18
|
+
import { base } from '../../base';
|
|
19
|
+
let is_flow = false;
|
|
20
|
+
let initialPath = '';
|
|
21
|
+
let edit = true;
|
|
22
|
+
let itemKind = 'script';
|
|
23
|
+
$: is_flow = itemKind === 'flow';
|
|
24
|
+
let script_path = '';
|
|
25
|
+
let initialScriptPath = '';
|
|
26
|
+
let fixedScriptPath = '';
|
|
27
|
+
let drawerLoading = true;
|
|
28
|
+
export async function openEdit(ePath, isFlow) {
|
|
29
|
+
drawerLoading = true;
|
|
30
|
+
try {
|
|
31
|
+
drawer?.openDrawer();
|
|
32
|
+
initialPath = ePath;
|
|
33
|
+
itemKind = isFlow ? 'flow' : 'script';
|
|
34
|
+
edit = true;
|
|
35
|
+
dirtyPath = false;
|
|
36
|
+
await loadTrigger();
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
sendUserToast(`Could not load route: ${err}`, true);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
drawerLoading = false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function openNew(nis_flow, fixedScriptPath_) {
|
|
46
|
+
drawerLoading = true;
|
|
47
|
+
try {
|
|
48
|
+
drawer?.openDrawer();
|
|
49
|
+
is_flow = nis_flow;
|
|
50
|
+
edit = false;
|
|
51
|
+
itemKind = nis_flow ? 'flow' : 'script';
|
|
52
|
+
is_async = false;
|
|
53
|
+
requires_auth = false;
|
|
54
|
+
initialRoutePath = '';
|
|
55
|
+
route_path = '';
|
|
56
|
+
http_method = 'post';
|
|
57
|
+
initialScriptPath = '';
|
|
58
|
+
fixedScriptPath = fixedScriptPath_ ?? '';
|
|
59
|
+
script_path = fixedScriptPath;
|
|
60
|
+
path = '';
|
|
61
|
+
initialPath = '';
|
|
62
|
+
dirtyPath = false;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
drawerLoading = false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
let path = '';
|
|
69
|
+
let pathError = '';
|
|
70
|
+
let routeError = '';
|
|
71
|
+
let is_async = false;
|
|
72
|
+
let requires_auth = false;
|
|
73
|
+
let initialRoutePath = '';
|
|
74
|
+
let route_path = '';
|
|
75
|
+
let http_method = 'post';
|
|
76
|
+
const dispatch = createEventDispatcher();
|
|
77
|
+
let can_write = true;
|
|
78
|
+
async function loadTrigger() {
|
|
79
|
+
const s = await HttpTriggerService.getHttpTrigger({
|
|
80
|
+
workspace: $workspaceStore,
|
|
81
|
+
path: initialPath
|
|
82
|
+
});
|
|
83
|
+
script_path = s.script_path;
|
|
84
|
+
initialScriptPath = s.script_path;
|
|
85
|
+
is_flow = s.is_flow;
|
|
86
|
+
path = s.path;
|
|
87
|
+
route_path = s.route_path;
|
|
88
|
+
initialRoutePath = s.route_path;
|
|
89
|
+
http_method = s.http_method ?? 'post';
|
|
90
|
+
is_async = s.is_async;
|
|
91
|
+
requires_auth = s.requires_auth;
|
|
92
|
+
can_write = canWrite(s.path, s.extra_perms, $userStore);
|
|
93
|
+
}
|
|
94
|
+
async function triggerScript() {
|
|
95
|
+
if (edit) {
|
|
96
|
+
await HttpTriggerService.updateHttpTrigger({
|
|
97
|
+
workspace: $workspaceStore,
|
|
98
|
+
path: initialPath,
|
|
99
|
+
requestBody: {
|
|
100
|
+
path,
|
|
101
|
+
script_path,
|
|
102
|
+
is_flow,
|
|
103
|
+
is_async,
|
|
104
|
+
requires_auth,
|
|
105
|
+
route_path: $userStore?.is_admin || $userStore?.is_super_admin ? route_path : undefined,
|
|
106
|
+
http_method
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
sendUserToast(`Route ${path} updated`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
await HttpTriggerService.createHttpTrigger({
|
|
113
|
+
workspace: $workspaceStore,
|
|
114
|
+
requestBody: {
|
|
115
|
+
path,
|
|
116
|
+
script_path,
|
|
117
|
+
is_flow,
|
|
118
|
+
is_async,
|
|
119
|
+
requires_auth,
|
|
120
|
+
route_path,
|
|
121
|
+
http_method
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
sendUserToast(`Route ${path} created`);
|
|
125
|
+
}
|
|
126
|
+
if (!$usedTriggerKinds.includes('http')) {
|
|
127
|
+
$usedTriggerKinds = [...$usedTriggerKinds, 'http'];
|
|
128
|
+
}
|
|
129
|
+
dispatch('update');
|
|
130
|
+
drawer.closeDrawer();
|
|
131
|
+
}
|
|
132
|
+
let drawer;
|
|
133
|
+
let dirtyPath = false;
|
|
134
|
+
$: fullRoute = `${$page.url.origin}${base}/api/r/${isCloudHosted() ? $workspaceStore + '/' : ''}${route_path}`;
|
|
135
|
+
async function routeExists(route_path, method) {
|
|
136
|
+
return await HttpTriggerService.existsRoute({
|
|
137
|
+
workspace: $workspaceStore,
|
|
138
|
+
requestBody: {
|
|
139
|
+
route_path,
|
|
140
|
+
http_method
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
let validateTimeout = undefined;
|
|
145
|
+
async function validateRoute(path, method) {
|
|
146
|
+
routeError = '';
|
|
147
|
+
if (validateTimeout) {
|
|
148
|
+
clearTimeout(validateTimeout);
|
|
149
|
+
}
|
|
150
|
+
validateTimeout = setTimeout(async () => {
|
|
151
|
+
if (!/^[\w-:]+(\/[\w-:]+)*$/.test(path)) {
|
|
152
|
+
routeError = 'Endpoint not valid';
|
|
153
|
+
}
|
|
154
|
+
else if (initialRoutePath !== path && (await routeExists(path, method))) {
|
|
155
|
+
routeError = 'Endpoint already taken';
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
routeError = '';
|
|
159
|
+
}
|
|
160
|
+
validateTimeout = undefined;
|
|
161
|
+
}, 500);
|
|
162
|
+
}
|
|
163
|
+
$: validateRoute(route_path, http_method);
|
|
164
|
+
</script>
|
|
165
|
+
|
|
166
|
+
<Drawer size="700px" bind:this={drawer}>
|
|
167
|
+
<DrawerContent
|
|
168
|
+
title={edit ? (can_write ? `Edit route ${initialPath}` : `Route ${initialPath}`) : 'New route'}
|
|
169
|
+
on:close={drawer.closeDrawer}
|
|
170
|
+
>
|
|
171
|
+
<svelte:fragment slot="actions">
|
|
172
|
+
{#if !drawerLoading && can_write}
|
|
173
|
+
<Button
|
|
174
|
+
startIcon={{ icon: Save }}
|
|
175
|
+
disabled={pathError != '' || routeError != '' || emptyString(script_path) || !can_write}
|
|
176
|
+
on:click={triggerScript}
|
|
177
|
+
>
|
|
178
|
+
Save
|
|
179
|
+
</Button>
|
|
180
|
+
{/if}
|
|
181
|
+
</svelte:fragment>
|
|
182
|
+
{#if drawerLoading}
|
|
183
|
+
<Loader2 class="animate-spin" />
|
|
184
|
+
{:else}
|
|
185
|
+
<div class="flex flex-col gap-12">
|
|
186
|
+
<div class="flex flex-col gap-4">
|
|
187
|
+
<Label label="Path">
|
|
188
|
+
<Path
|
|
189
|
+
bind:dirty={dirtyPath}
|
|
190
|
+
bind:error={pathError}
|
|
191
|
+
bind:path
|
|
192
|
+
{initialPath}
|
|
193
|
+
checkInitialPathExistence={!edit}
|
|
194
|
+
namePlaceholder="route"
|
|
195
|
+
kind="http_trigger"
|
|
196
|
+
hideUser
|
|
197
|
+
disabled={!can_write}
|
|
198
|
+
/>
|
|
199
|
+
</Label>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<Section label="HTTP">
|
|
203
|
+
{#if !($userStore?.is_admin || $userStore?.is_super_admin)}
|
|
204
|
+
<Alert type="info" title="Admin only" collapsible>
|
|
205
|
+
Route endpoints can only be edited by workspace admins
|
|
206
|
+
</Alert>
|
|
207
|
+
<div class="my-2" />
|
|
208
|
+
{/if}
|
|
209
|
+
<div class="flex flex-col w-full gap-4">
|
|
210
|
+
<label class="block grow w-full">
|
|
211
|
+
<div class="text-secondary text-sm flex items-center gap-1 w-full justify-between">
|
|
212
|
+
<div>
|
|
213
|
+
Path
|
|
214
|
+
<Required required={true} />
|
|
215
|
+
</div>
|
|
216
|
+
<div class="text-2xs text-tertiary"> ':myparam' for path params </div>
|
|
217
|
+
</div>
|
|
218
|
+
<!-- svelte-ignore a11y-autofocus -->
|
|
219
|
+
<input
|
|
220
|
+
type="text"
|
|
221
|
+
autocomplete="off"
|
|
222
|
+
bind:value={route_path}
|
|
223
|
+
disabled={!($userStore?.is_admin || $userStore?.is_super_admin) || !can_write}
|
|
224
|
+
class={routeError === ''
|
|
225
|
+
? ''
|
|
226
|
+
: 'border border-red-700 bg-red-100 border-opacity-30 focus:border-red-700 focus:border-opacity-30 focus-visible:ring-red-700 focus-visible:ring-opacity-25 focus-visible:border-red-700'}
|
|
227
|
+
/>
|
|
228
|
+
</label>
|
|
229
|
+
|
|
230
|
+
<ToggleButtonGroup
|
|
231
|
+
class="w-auto"
|
|
232
|
+
bind:selected={http_method}
|
|
233
|
+
disabled={!($userStore?.is_admin || $userStore?.is_super_admin) || !can_write}
|
|
234
|
+
>
|
|
235
|
+
<ToggleButton label="GET" value="get" />
|
|
236
|
+
<ToggleButton label="POST" value="post" />
|
|
237
|
+
<ToggleButton label="PUT" value="put" />
|
|
238
|
+
<ToggleButton label="PATCH" value="patch" />
|
|
239
|
+
<ToggleButton label="DELETE" value="delete" />
|
|
240
|
+
</ToggleButtonGroup>
|
|
241
|
+
<div class="flex flex-col w-full mt-2">
|
|
242
|
+
<div class="flex justify-start w-full">
|
|
243
|
+
<Badge
|
|
244
|
+
color="gray"
|
|
245
|
+
class="center-center !bg-surface-secondary !text-tertiary !w-[90px] !h-[24px] rounded-r-none border"
|
|
246
|
+
>
|
|
247
|
+
Full endpoint
|
|
248
|
+
</Badge>
|
|
249
|
+
<input
|
|
250
|
+
type="text"
|
|
251
|
+
readonly
|
|
252
|
+
value={fullRoute}
|
|
253
|
+
size={fullRoute.length || 50}
|
|
254
|
+
class="font-mono !text-xs max-w-[calc(100%-70px)] !w-auto !h-[24px] !py-0 !border-l-0 !rounded-l-none"
|
|
255
|
+
on:focus={({ currentTarget }) => {
|
|
256
|
+
currentTarget.select()
|
|
257
|
+
}}
|
|
258
|
+
/>
|
|
259
|
+
</div>
|
|
260
|
+
<div class="text-red-600 dark:text-red-400 text-2xs">{routeError}</div>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</Section>
|
|
264
|
+
|
|
265
|
+
<Section label="Runnable">
|
|
266
|
+
<p class="text-xs mb-1 text-tertiary">
|
|
267
|
+
Pick a script or flow to be triggered<Required required={true} /><br />
|
|
268
|
+
To handle headers, query or path parameters, add a preprocessor to your runnable.
|
|
269
|
+
</p>
|
|
270
|
+
<div class="flex flex-row mb-2">
|
|
271
|
+
<ScriptPicker
|
|
272
|
+
disabled={fixedScriptPath != '' || !can_write}
|
|
273
|
+
initialPath={fixedScriptPath || initialScriptPath}
|
|
274
|
+
kinds={['script']}
|
|
275
|
+
allowFlow={true}
|
|
276
|
+
bind:itemKind
|
|
277
|
+
bind:scriptPath={script_path}
|
|
278
|
+
allowRefresh
|
|
279
|
+
/>
|
|
280
|
+
|
|
281
|
+
{#if script_path === undefined}
|
|
282
|
+
<Button
|
|
283
|
+
btnClasses="ml-4 mt-2"
|
|
284
|
+
color="dark"
|
|
285
|
+
size="xs"
|
|
286
|
+
href={itemKind === 'flow'
|
|
287
|
+
? '/flows/add?hub=55'
|
|
288
|
+
: '/scripts/add?hub=hub%2F9088%2Fwindmill%2FHTTP%20route%20script%20with%20preprocessor%20template'}
|
|
289
|
+
target="_blank">Create from template</Button
|
|
290
|
+
>
|
|
291
|
+
{/if}
|
|
292
|
+
</div>
|
|
293
|
+
</Section>
|
|
294
|
+
<Section label="Settings">
|
|
295
|
+
<div class="flex flex-col gap-4">
|
|
296
|
+
<div class="flex flex-row justify-between">
|
|
297
|
+
<div class="text-sm font-semibold flex flex-row items-center">Request type</div>
|
|
298
|
+
<ToggleButtonGroup class="w-auto" bind:selected={is_async} disabled={!can_write}>
|
|
299
|
+
<ToggleButton
|
|
300
|
+
label="Async"
|
|
301
|
+
value={true}
|
|
302
|
+
tooltip="The returning value is the uuid of the job assigned to execute the job."
|
|
303
|
+
/>
|
|
304
|
+
<ToggleButton
|
|
305
|
+
label="Sync"
|
|
306
|
+
value={false}
|
|
307
|
+
tooltip="Triggers the execution, wait for the job to complete and return it as a response."
|
|
308
|
+
/>
|
|
309
|
+
</ToggleButtonGroup>
|
|
310
|
+
</div>
|
|
311
|
+
<div class="flex flex-row justify-between">
|
|
312
|
+
<div class="text-sm font-semibold flex flex-row items-center">Authentication</div>
|
|
313
|
+
<ToggleButtonGroup class="w-auto" bind:selected={requires_auth} disabled={!can_write}>
|
|
314
|
+
<ToggleButton label="None" value={false} />
|
|
315
|
+
<ToggleButton
|
|
316
|
+
label="Required"
|
|
317
|
+
value={true}
|
|
318
|
+
tooltip="Requires authentication with read access on the route"
|
|
319
|
+
/>
|
|
320
|
+
</ToggleButtonGroup>
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
</Section>
|
|
324
|
+
</div>
|
|
325
|
+
{/if}
|
|
326
|
+
</DrawerContent>
|
|
327
|
+
</Drawer>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
openEdit?: ((ePath: string, isFlow: boolean) => Promise<void>) | undefined;
|
|
5
|
+
openNew?: ((nis_flow: boolean, fixedScriptPath_?: string) => Promise<void>) | undefined;
|
|
6
|
+
};
|
|
7
|
+
events: {
|
|
8
|
+
update: CustomEvent<any>;
|
|
9
|
+
} & {
|
|
10
|
+
[evt: string]: CustomEvent<any>;
|
|
11
|
+
};
|
|
12
|
+
slots: {};
|
|
13
|
+
};
|
|
14
|
+
export type RouteEditorInnerProps = typeof __propDef.props;
|
|
15
|
+
export type RouteEditorInnerEvents = typeof __propDef.events;
|
|
16
|
+
export type RouteEditorInnerSlots = typeof __propDef.slots;
|
|
17
|
+
export default class RouteEditorInner extends SvelteComponent<RouteEditorInnerProps, RouteEditorInnerEvents, RouteEditorInnerSlots> {
|
|
18
|
+
get openEdit(): (ePath: string, isFlow: boolean) => Promise<void>;
|
|
19
|
+
get openNew(): (nis_flow: boolean, fixedScriptPath_?: string | undefined) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<script>import { Button } from '../common';
|
|
2
|
+
import { userStore, workspaceStore } from '../../stores';
|
|
3
|
+
import { HttpTriggerService } from '../../gen';
|
|
4
|
+
import { RouteIcon } from 'lucide-svelte';
|
|
5
|
+
import Skeleton from '../common/skeleton/Skeleton.svelte';
|
|
6
|
+
import RouteEditor from './RouteEditor.svelte';
|
|
7
|
+
import { canWrite } from '../../utils';
|
|
8
|
+
export let isFlow;
|
|
9
|
+
export let path;
|
|
10
|
+
let routeEditor;
|
|
11
|
+
let triggers = undefined;
|
|
12
|
+
$: path && loadTriggers();
|
|
13
|
+
async function loadTriggers() {
|
|
14
|
+
try {
|
|
15
|
+
triggers = (await HttpTriggerService.listHttpTriggers({
|
|
16
|
+
workspace: $workspaceStore ?? '',
|
|
17
|
+
path,
|
|
18
|
+
isFlow
|
|
19
|
+
})).map((x) => {
|
|
20
|
+
return { canWrite: canWrite(x.path, x.extra_perms, $userStore), ...x };
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
console.error('impossible to load http routes');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<RouteEditor
|
|
30
|
+
on:update={() => {
|
|
31
|
+
loadTriggers()
|
|
32
|
+
}}
|
|
33
|
+
bind:this={routeEditor}
|
|
34
|
+
/>
|
|
35
|
+
|
|
36
|
+
<div class="p-2 flex flex-col">
|
|
37
|
+
{#if $userStore?.is_admin || $userStore?.is_super_admin}
|
|
38
|
+
<Button
|
|
39
|
+
on:click={() => routeEditor?.openNew(isFlow, path)}
|
|
40
|
+
variant="border"
|
|
41
|
+
color="light"
|
|
42
|
+
size="xs"
|
|
43
|
+
startIcon={{ icon: RouteIcon }}
|
|
44
|
+
>
|
|
45
|
+
New Route
|
|
46
|
+
</Button>
|
|
47
|
+
{/if}
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
{#if triggers}
|
|
51
|
+
{#if triggers.length == 0}
|
|
52
|
+
<div class="text-xs text-secondary px-2"> No http routes </div>
|
|
53
|
+
{:else}
|
|
54
|
+
<div class="flex flex-col divide-y px-2 pt-2">
|
|
55
|
+
{#each triggers as trigger (trigger.path)}
|
|
56
|
+
<div class="grid grid-cols-5 text-2xs items-center py-2">
|
|
57
|
+
<div class="col-span-2 truncate">{trigger.path}</div>
|
|
58
|
+
<div class="col-span-2 truncate">
|
|
59
|
+
{trigger.http_method.toUpperCase()} /{trigger.route_path}
|
|
60
|
+
</div>
|
|
61
|
+
<button on:click={() => routeEditor?.openEdit(trigger.path, isFlow)}>
|
|
62
|
+
{#if trigger.canWrite}
|
|
63
|
+
Edit
|
|
64
|
+
{:else}
|
|
65
|
+
View
|
|
66
|
+
{/if}
|
|
67
|
+
</button>
|
|
68
|
+
</div>
|
|
69
|
+
{/each}
|
|
70
|
+
</div>
|
|
71
|
+
{/if}
|
|
72
|
+
{:else}
|
|
73
|
+
<Skeleton layout={[[8]]} />
|
|
74
|
+
{/if}
|