From 49923331a49cdcdf0be74ed386b1c42c5d98a517 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 5 Dec 2023 19:49:18 +0100 Subject: [PATCH] fix: add run_flow_sync to python client + few nits --- .../lib/components/AuthentikSetting.svelte | 94 +++++++++---------- frontend/src/lib/components/Password.svelte | 2 +- .../src/lib/components/home/ItemsList.svelte | 68 +++++++------- .../src/lib/components/home/TreeView.svelte | 13 +-- .../lib/components/home/TreeViewRoot.svelte | 57 +++++++++++ python-client/wmill/wmill/client.py | 36 ++++++- 6 files changed, 179 insertions(+), 91 deletions(-) create mode 100644 frontend/src/lib/components/home/TreeViewRoot.svelte diff --git a/frontend/src/lib/components/AuthentikSetting.svelte b/frontend/src/lib/components/AuthentikSetting.svelte index b5059c5677..6365982010 100644 --- a/frontend/src/lib/components/AuthentikSetting.svelte +++ b/frontend/src/lib/components/AuthentikSetting.svelte @@ -1,64 +1,64 @@
-
diff --git a/frontend/src/lib/components/Password.svelte b/frontend/src/lib/components/Password.svelte index ef10111f80..4f09d1d434 100644 --- a/frontend/src/lib/components/Password.svelte +++ b/frontend/src/lib/components/Password.svelte @@ -35,7 +35,7 @@
diff --git a/frontend/src/lib/components/home/ItemsList.svelte b/frontend/src/lib/components/home/ItemsList.svelte index 81aa46ee5a..503c2648f8 100644 --- a/frontend/src/lib/components/home/ItemsList.svelte +++ b/frontend/src/lib/components/home/ItemsList.svelte @@ -15,7 +15,6 @@ import { userStore, workspaceStore } from '$lib/stores' import type uFuzzy from '@leeoniya/ufuzzy' import { Code2, LayoutDashboard, SearchCode } from 'lucide-svelte' - import TreeView from './TreeView.svelte' export let filter = '' export let subtab: 'flow' | 'script' | 'app' = 'script' @@ -35,8 +34,8 @@ import Drawer from '../common/drawer/Drawer.svelte' import HighlightCode from '../HighlightCode.svelte' import DrawerContent from '../common/drawer/DrawerContent.svelte' - import { groupItems } from './treeViewUtils' import Item from './Item.svelte' + import TreeViewRoot from './TreeViewRoot.svelte' type TableItem = T & { canWrite: boolean @@ -246,8 +245,25 @@ $: items && resetScroll() let archived = false - let treeView = false + let treeView = getTreeView() + $: storeTreeView(treeView) + + function storeTreeView(treeView: boolean) { + if (treeView) { + localStorage.setItem('treeView', 'true') + } else { + localStorage.removeItem('treeView') + } + } + + function getTreeView() { + try { + return localStorage.getItem('treeView') == 'true' + } catch (e) { + return false + } + } let contentSearch: ContentSearch let viewCodeDrawer: Drawer @@ -262,7 +278,7 @@ }) } - let collapseAll = false + let collapseAll = true {:else if treeView} - {@const groupedItems = groupItems(items)} -
- {#each groupedItems.slice(0, nbDisplayed) as item (item['folderName'] ?? 'user__' + item['username'])} - {#if item} - { - loadScripts() - loadFlows() - loadApps() - loadRawApps() - }} - {showCode} - /> - {/if} - {/each} -
- {#if groupedItems.length > 30 && nbDisplayed < groupedItems.length} - {nbDisplayed} root nodes out of {groupedItems.length} - - {/if} + { + loadScripts() + loadFlows() + loadApps() + loadRawApps() + }} + {showCode} + /> {:else}
{#each (items ?? []).slice(0, nbDisplayed) as item (item.type + '/' + item.path)} diff --git a/frontend/src/lib/components/home/TreeView.svelte b/frontend/src/lib/components/home/TreeView.svelte index 7b3f91b369..ec2543c846 100644 --- a/frontend/src/lib/components/home/TreeView.svelte +++ b/frontend/src/lib/components/home/TreeView.svelte @@ -5,13 +5,13 @@ import Item from './Item.svelte' import type { FolderItem, ItemType, UserItem } from './treeViewUtils' import { twMerge } from 'tailwind-merge' - import { slide } from 'svelte/transition' import { pluralize } from '$lib/utils' export let item: ItemType | FolderItem | UserItem export let collapseAll: boolean export let depth: number = 0 + export let showCode: (path: string, summary: string) => void const isFolder = (i: any): i is FolderItem => i && 'folderName' in i const isUser = (i: any): i is UserItem => i && 'username' in i @@ -24,8 +24,6 @@ opened = !collapseAll } - export let showCode: (path: string, summary: string) => void - let showMax = 30 @@ -57,7 +55,7 @@
- {#if opened} -
+
{#each item.items.slice(0, showMax) as subItem ((subItem['path'] ? subItem['type'] + '__' + subItem['path'] : undefined) ?? 'folder__' + subItem['folderName'])} @@ -118,7 +115,7 @@ >
- {#if opened} -
+
{#each item.items.slice(0, showMax) as subItem ((subItem['path'] ? subItem['type'] + '__' + subItem['path'] : undefined) ?? 'folder__' + subItem['folderName'])} + import TreeView from './TreeView.svelte' + import { groupItems } from './treeViewUtils' + + export let collapseAll: boolean + export let showCode: (path: string, summary: string) => void + export let nbDisplayed: number + export let items: any[] | undefined + let treeLoading = false + + $: groupedItems = grpItems(items) + function grpItems(items: any[] | undefined): any[] { + treeLoading = true + let r + try { + r = groupItems(items) + } finally { + treeLoading = false + } + return r + } + + +{#if treeLoading} +
+
+
+{:else if groupedItems.length === 0} +
+
No items
+
+{:else} +
+ {#each groupedItems.slice(0, nbDisplayed) as item (item['folderName'] ?? 'user__' + item['username'])} + {#if item} + + {/if} + {/each} +
+ {#if groupedItems.length > 30 && nbDisplayed < groupedItems.length} + {nbDisplayed} root nodes out of {groupedItems.length} + + {/if} +{/if} diff --git a/python-client/wmill/wmill/client.py b/python-client/wmill/wmill/client.py index 126e6e97c8..1a883764e9 100644 --- a/python-client/wmill/wmill/client.py +++ b/python-client/wmill/wmill/client.py @@ -79,7 +79,7 @@ class Windmill: args: dict = None, scheduled_in_secs: int = None, ) -> str: - """Create a job and return its job id.""" + """Create a script job and return its job id.""" assert not (path and hash_), "path and hash_ are mutually exclusive" args = args or {} params = {"scheduled_in_secs": scheduled_in_secs} if scheduled_in_secs else {} @@ -91,6 +91,21 @@ class Windmill: raise Exception("path or hash_ must be provided") return self.post(endpoint, json=args, params=params).text + def run_flow_async( + self, + path: str, + args: dict = None, + scheduled_in_secs: int = None, + ) -> str: + """Create a flow job and return its job id.""" + args = args or {} + params = {"scheduled_in_secs": scheduled_in_secs} if scheduled_in_secs else {} + if path: + endpoint = f"/w/{self.workspace}/jobs/run/f/{path}" + else: + raise Exception("path must be provided") + return self.post(endpoint, json=args, params=params).text + def run_script( self, path: str = None, @@ -448,16 +463,31 @@ def get_version() -> str: @init_global_client def run_script_async( - hash: str, + hash_or_path: str, args: Dict[str, Any] = None, scheduled_in_secs: int = None, ) -> str: + is_path = "/" in hash_or_path + hash_ = None if is_path else hash_or_path + path = hash_or_path if is_path else None return _client.run_script_async( - hash_=hash, + hash_=hash_, + path=path, args=args, scheduled_in_secs=scheduled_in_secs, ) +@init_global_client +def run_flow_async( + path: str, + args: Dict[str, Any] = None, + scheduled_in_secs: int = None, +) -> str: + return _client.run_flow_async( + path=path, + args=args, + scheduled_in_secs=scheduled_in_secs, + ) @init_global_client def run_script_sync(