diff --git a/backend/migrations/20230617055441_add_deployment_workspace.down.sql b/backend/migrations/20230617055441_add_deployment_workspace.down.sql new file mode 100644 index 0000000000..2c49fa2ab9 --- /dev/null +++ b/backend/migrations/20230617055441_add_deployment_workspace.down.sql @@ -0,0 +1,2 @@ +-- Add down migration script here +ALTER TABLE workspace_settings DROP COLUMN deploy_to; diff --git a/backend/migrations/20230617055441_add_deployment_workspace.up.sql b/backend/migrations/20230617055441_add_deployment_workspace.up.sql new file mode 100644 index 0000000000..46db31a4ad --- /dev/null +++ b/backend/migrations/20230617055441_add_deployment_workspace.up.sql @@ -0,0 +1,2 @@ +-- Add up migration script here +ALTER TABLE workspace_settings ADD COLUMN deploy_to VARCHAR(255); diff --git a/backend/sqlx-data.json b/backend/sqlx-data.json index 8436ec7266..55657a34b9 100644 --- a/backend/sqlx-data.json +++ b/backend/sqlx-data.json @@ -677,6 +677,11 @@ "name": "webhook", "ordinal": 9, "type_info": "Text" + }, + { + "name": "deploy_to", + "ordinal": 10, + "type_info": "Varchar" } ], "nullable": [ @@ -689,6 +694,7 @@ true, true, true, + true, true ], "parameters": { @@ -2369,6 +2375,11 @@ "name": "webhook", "ordinal": 9, "type_info": "Text" + }, + { + "name": "deploy_to", + "ordinal": 10, + "type_info": "Varchar" } ], "nullable": [ @@ -2381,6 +2392,7 @@ true, true, true, + true, true ], "parameters": { @@ -6950,6 +6962,26 @@ }, "query": "SELECT distinct(path) FROM script WHERE workspace_id = $1" }, + "f2f42aded6f1a400c84e2575abb551dfcd9260714eef333a85b1e5d7d5c9f67e": { + "describe": { + "columns": [ + { + "name": "deploy_to", + "ordinal": 0, + "type_info": "Varchar" + } + ], + "nullable": [ + true + ], + "parameters": { + "Left": [ + "Text" + ] + } + }, + "query": "SELECT deploy_to FROM workspace_settings WHERE workspace_id = $1" + }, "f325a1262084bd3468e12dc8bcc289a96536f172b679af54dd0fbc82d4d7c987": { "describe": { "columns": [], @@ -7275,5 +7307,18 @@ } }, "query": "UPDATE variable SET value = $1 WHERE workspace_id = $2 AND path = $3" + }, + "ff89e9f0941507d5cbfbb27e7c3b1ebad6b2b0a836334a5e20f151711fc11370": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Varchar", + "Text" + ] + } + }, + "query": "UPDATE workspace_settings SET deploy_to = $1 WHERE workspace_id = $2" } } \ No newline at end of file diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index fcb21ddcbb..e7e87e7907 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -935,6 +935,28 @@ paths: type: string webhook: type: string + deploy_to: + type: string + + /w/{workspace}/workspaces/get_deploy_to: + get: + summary: get deploy to + operationId: getDeployTo + tags: + - workspace + parameters: + - $ref: "#/components/parameters/WorkspaceId" + + responses: + "200": + description: status + content: + application/json: + schema: + type: object + properties: + deploy_to: + type: string /w/{workspace}/workspaces/premium_info: get: @@ -987,6 +1009,32 @@ paths: schema: type: string + /w/{workspace}/workspaces/edit_deploy_to: + post: + summary: edit deploy to + operationId: editDeployTo + tags: + - workspace + parameters: + - $ref: "#/components/parameters/WorkspaceId" + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + deploy_to: + type: string + + responses: + "200": + description: status + content: + text/plain: + schema: + type: string + /w/{workspace}/workspaces/edit_auto_invite: post: summary: edit auto invite diff --git a/backend/windmill-api/src/workspaces.rs b/backend/windmill-api/src/workspaces.rs index 2f3f5606fe..f16f2b4c57 100644 --- a/backend/windmill-api/src/workspaces.rs +++ b/backend/windmill-api/src/workspaces.rs @@ -59,9 +59,11 @@ pub fn workspaced_service() -> Router { .route("/add_user", post(add_user)) .route("/delete_invite", post(delete_invite)) .route("/get_settings", get(get_settings)) + .route("/get_deploy_to", get(get_deploy_to)) .route("/edit_slack_command", post(edit_slack_command)) .route("/edit_webhook", post(edit_webhook)) .route("/edit_auto_invite", post(edit_auto_invite)) + .route("/edit_deploy_to", post(edit_deploy_to)) .route("/tarball", get(tarball_workspace)) .route("/premium_info", get(premium_info)); @@ -109,6 +111,7 @@ pub struct WorkspaceSettings { pub customer_id: Option, pub plan: Option, pub webhook: Option, + pub deploy_to: Option, } #[derive(FromRow, Serialize, Debug)] @@ -131,6 +134,11 @@ struct EditCommandScript { slack_command_script: Option, } +#[derive(Deserialize)] +struct EditDeployTo { + deploy_to: Option, +} + #[derive(Deserialize)] struct EditAutoInvite { operator: Option, @@ -407,6 +415,29 @@ async fn get_settings( Ok(Json(settings)) } +#[derive(Serialize)] +struct DeployTo { + deploy_to: Option, +} +async fn get_deploy_to( + authed: Authed, + Path(w_id): Path, + Extension(user_db): Extension, +) -> JsonResult { + let mut tx = user_db.begin(&authed).await?; + let settings = sqlx::query_as!( + DeployTo, + "SELECT deploy_to FROM workspace_settings WHERE workspace_id = $1", + &w_id + ) + .fetch_one(&mut tx) + .await + .map_err(|e| Error::InternalErr(format!("getting deploy_to: {e}")))?; + + tx.commit().await?; + Ok(Json(settings)) +} + async fn edit_slack_command( authed: Authed, Extension(db): Extension, @@ -447,6 +478,51 @@ async fn edit_slack_command( Ok(format!("Edit command script {}", &w_id)) } +async fn edit_deploy_to( + authed: Authed, + Extension(db): Extension, + Path(w_id): Path, + Authed { is_admin, username, .. }: Authed, + Json(es): Json, +) -> Result { + require_admin(is_admin, &username)?; + #[cfg(not(feature = "enterprise"))] + { + return Err(Error::BadRequest( + "Deploy to is only available on enterprise".to_string(), + )); + } + + let mut tx = db.begin().await?; + sqlx::query!( + "UPDATE workspace_settings SET deploy_to = $1 WHERE workspace_id = $2", + es.deploy_to, + &w_id + ) + .execute(&mut tx) + .await?; + + audit_log( + &mut tx, + &authed.username, + "workspaces.edit_deploy_to", + ActionKind::Update, + &w_id, + Some(&authed.email), + Some( + [( + "script", + es.deploy_to.unwrap_or("NO_DEPLOY_TO".to_string()).as_str(), + )] + .into(), + ), + ) + .await?; + tx.commit().await?; + + Ok(format!("Edit deploy to for {}", &w_id)) +} + const BANNED_DOMAINS: &str = include_str!("../banned_domains.txt"); async fn is_allowed_auto_domain(Authed { email, .. }: Authed) -> JsonResult { diff --git a/backend/windmill-worker/src/worker.rs b/backend/windmill-worker/src/worker.rs index 8542ff56b4..554ca78dba 100644 --- a/backend/windmill-worker/src/worker.rs +++ b/backend/windmill-worker/src/worker.rs @@ -1927,7 +1927,7 @@ pub async fn get_reserved_variables( job.script_path.clone(), job.parent_job.map(|x| x.to_string()), flow_path, - job.schedule_path.clone(), + job.schedule_path.clone() ); Ok(variables .into_iter() diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ee7cb7ae7b..2e1ff7f85d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -22,6 +22,7 @@ "chartjs-plugin-zoom": "^2.0.0", "d3-zoom": "^3.0.0", "date-fns": "^2.30.0", + "diff": "^5.1.0", "esm-env": "^1.0.0", "fast-equals": "^5.0.1", "highlight.js": "^11.8.0", @@ -2799,6 +2800,14 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -10089,6 +10098,11 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 2d2c4423c3..8149ce1f2f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -82,6 +82,7 @@ "chartjs-plugin-zoom": "^2.0.0", "d3-zoom": "^3.0.0", "date-fns": "^2.30.0", + "diff": "^5.1.0", "esm-env": "^1.0.0", "fast-equals": "^5.0.1", "highlight.js": "^11.8.0", diff --git a/frontend/src/lib/components/ArgInfo.svelte b/frontend/src/lib/components/ArgInfo.svelte index 261b834d1e..c171c79d39 100644 --- a/frontend/src/lib/components/ArgInfo.svelte +++ b/frontend/src/lib/components/ArgInfo.svelte @@ -23,7 +23,7 @@ - + + {/if} +
+ {#if deploymentStatus[statusPath]} + {#if deploymentStatus[statusPath].status == 'loading'} + + {:else if deploymentStatus[statusPath].status == 'deployed'} + Deployed + {:else if deploymentStatus[statusPath].status == 'failed'} + Failed + {deploymentStatus[statusPath].error} + {/if} + {:else} + + {/if} +
+ {/each} + + + {#if !hideButton} +
+ {/if} + {:else} +
+ Ask a permissioned user to deploy this item using the shareable link or get the proper + permissions on the target workspace + {/if} +{/if} diff --git a/frontend/src/lib/components/DeployWorkspaceDrawer.svelte b/frontend/src/lib/components/DeployWorkspaceDrawer.svelte new file mode 100644 index 0000000000..4c24aaafb7 --- /dev/null +++ b/frontend/src/lib/components/DeployWorkspaceDrawer.svelte @@ -0,0 +1,40 @@ + + + + + {#if kind != undefined && initialPath != undefined} + + {/if} + + + + + + diff --git a/frontend/src/lib/components/MoveDrawer.svelte b/frontend/src/lib/components/MoveDrawer.svelte index 18a6b01894..26eceaffc0 100644 --- a/frontend/src/lib/components/MoveDrawer.svelte +++ b/frontend/src/lib/components/MoveDrawer.svelte @@ -111,9 +111,9 @@

Path

-
- -
+ + + diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte index d9ffad870a..afd26c1f40 100644 --- a/frontend/src/lib/components/Path.svelte +++ b/frontend/src/lib/components/Path.svelte @@ -21,12 +21,13 @@ import { writable } from 'svelte/store' import { Button, Drawer, DrawerContent } from './common' import Badge from './common/badge/Badge.svelte' - import ToggleButton from './common/toggleButton/ToggleButton.svelte' - import ToggleButtonGroup from './common/toggleButton/ToggleButtonGroup.svelte' + import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' + import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' import FolderEditor from './FolderEditor.svelte' import { random_adj } from './random_positive_adjetive' import Required from './Required.svelte' import Tooltip from './Tooltip.svelte' + import { Folder, User } from 'lucide-svelte' type PathKind = 'resource' | 'script' | 'variable' | 'flow' | 'schedule' | 'app' | 'raw_app' let meta: Meta | undefined = undefined @@ -277,7 +278,7 @@
{#if meta.ownerKind === 'user'} @@ -308,7 +326,7 @@ type="text" bind:value={meta.owner} placeholder={$userStore?.username ?? ''} - disabled={!($superadmin || ($userStore?.is_admin ?? false))} + disabled={disabled || !($superadmin || ($userStore?.is_admin ?? false))} /> {:else if meta.ownerKind === 'folder'} @@ -334,6 +352,7 @@ title="View folder" btnClasses="!p-1.5" variant="border" + color="light" size="xs" disabled={!meta.owner || meta.owner == ''} on:click={viewFolder.openDrawer} @@ -344,6 +363,7 @@ title="New folder" btnClasses="!p-1.5" variant="border" + color="light" size="xs" {disabled} on:click={newFolder.openDrawer} diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index f7faa346f4..34015884f5 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -409,7 +409,7 @@ {#if !isCloudHosted()}

Custom env variablesAdditional static custom env variables to pass to the script.

@@ -463,7 +463,7 @@
-
+
{/if} -
+
@@ -563,7 +563,7 @@ Script kind   Tag this script's purpose within flows such that it is available as the corresponding - action. + action.
@@ -599,6 +599,7 @@ + { @@ -69,10 +71,14 @@ -
+
{#if options.length > 1} -
- +
+ + {#each options as [label, value, icon]} + + {/each} +
{/if} diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte index b8c19ab71a..3473a6a767 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte @@ -91,7 +91,9 @@ } } - $: value = (result ?? []).map((x, i) => ({ ...x, __index: i.toString() })) + $: value = Array.isArray(result) + ? result.map((x, i) => ({ ...x, __index: i.toString() })) + : [{ error: 'input was not an array' }] {#each Object.keys(components['aggridcomponent'].initialData.configuration) as key (key)} diff --git a/frontend/src/lib/components/common/table/AppRow.svelte b/frontend/src/lib/components/common/table/AppRow.svelte index d9fa35a142..373e231dc7 100644 --- a/frontend/src/lib/components/common/table/AppRow.svelte +++ b/frontend/src/lib/components/common/table/AppRow.svelte @@ -23,12 +23,14 @@ import { Eye } from 'lucide-svelte' import { goto } from '$app/navigation' import { page } from '$app/stores' + import type DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' export let app: ListableApp & { has_draft?: boolean; draft_only?: boolean; canWrite: boolean } export let marked: string | undefined export let starred: boolean export let shareModal: ShareModal export let moveDrawer: MoveDrawer + export let deploymentDrawer: DeployWorkspaceDrawer export let deleteConfirmedCallback: (() => void) | undefined let { @@ -157,6 +159,13 @@ }, disabled: !canWrite }, + { + displayName: 'Deploy to staging/prod', + icon: faFileExport, + action: () => { + deploymentDrawer.openDrawer(path, 'app') + } + }, { displayName: canWrite ? 'Share' : 'See Permissions', icon: faShare, diff --git a/frontend/src/lib/components/common/table/FlowRow.svelte b/frontend/src/lib/components/common/table/FlowRow.svelte index 071113889a..afb3a0096f 100644 --- a/frontend/src/lib/components/common/table/FlowRow.svelte +++ b/frontend/src/lib/components/common/table/FlowRow.svelte @@ -26,6 +26,7 @@ import DraftBadge from '$lib/components/DraftBadge.svelte' import { sendUserToast } from '$lib/toast' import { isOwner } from '$lib/utils' + import type DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' export let flow: Flow & { has_draft?: boolean; draft_only?: boolean; canWrite: boolean } export let marked: string | undefined @@ -33,6 +34,7 @@ export let shareModal: ShareModal export let moveDrawer: MoveDrawer export let deleteConfirmedCallback: (() => void) | undefined + export let deploymentDrawer: DeployWorkspaceDrawer let { summary, path, extra_perms, canWrite, workspace_id, archived, draft_only, has_draft } = flow @@ -190,6 +192,14 @@ }, disabled: !owner || archived }, + { + displayName: 'Deploy to staging/prod', + icon: faFileExport, + action: () => { + deploymentDrawer.openDrawer(path, 'flow') + }, + disabled: archived + }, { displayName: 'Schedule', icon: faCalendarAlt, diff --git a/frontend/src/lib/components/common/table/RawAppRow.svelte b/frontend/src/lib/components/common/table/RawAppRow.svelte index 15c4600e00..932912d94d 100644 --- a/frontend/src/lib/components/common/table/RawAppRow.svelte +++ b/frontend/src/lib/components/common/table/RawAppRow.svelte @@ -19,6 +19,7 @@ import DrawerContent from '../drawer/DrawerContent.svelte' import FileInput from '../fileInput/FileInput.svelte' import { goto } from '$app/navigation' + import type DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' export let app: ListableRawApp & { canWrite: boolean } export let marked: string | undefined @@ -26,6 +27,7 @@ export let shareModal: ShareModal export let moveDrawer: MoveDrawer export let deleteConfirmedCallback: (() => void) | undefined + export let deploymentDrawer: DeployWorkspaceDrawer let updateAppDrawer: Drawer @@ -112,6 +114,21 @@ }, disabled: !canWrite }, + { + displayName: 'Move/Rename', + icon: faFileExport, + action: () => { + moveDrawer.openDrawer(path, summary, 'raw_app') + }, + disabled: !canWrite + }, + { + displayName: 'Deploy to prod/staging', + icon: faFileExport, + action: () => { + deploymentDrawer.openDrawer(path, 'raw_app') + } + }, { displayName: canWrite ? 'Share' : 'See Permissions', icon: faShare, diff --git a/frontend/src/lib/components/common/table/ScriptRow.svelte b/frontend/src/lib/components/common/table/ScriptRow.svelte index 7416bc4037..385c75bf5b 100644 --- a/frontend/src/lib/components/common/table/ScriptRow.svelte +++ b/frontend/src/lib/components/common/table/ScriptRow.svelte @@ -28,12 +28,14 @@ import DraftBadge from '$lib/components/DraftBadge.svelte' import { sendUserToast } from '$lib/toast' import { isOwner } from '$lib/utils' + import type DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' export let script: Script & { canWrite: boolean } export let marked: string | undefined export let starred: boolean export let shareModal: ShareModal export let moveDrawer: MoveDrawer + export let deploymentDrawer: DeployWorkspaceDrawer export let deleteConfirmedCallback: (() => void) | undefined let { @@ -209,6 +211,14 @@ }, disabled: !owner || archived }, + { + displayName: 'Deploy to staging/prod', + icon: faFileExport, + action: () => { + deploymentDrawer.openDrawer(path, 'script') + }, + disabled: archived + }, { displayName: 'View runs', icon: faList, diff --git a/frontend/src/lib/components/common/tabs/Tabs.svelte b/frontend/src/lib/components/common/tabs/Tabs.svelte index 734b81d645..090b449bf9 100644 --- a/frontend/src/lib/components/common/tabs/Tabs.svelte +++ b/frontend/src/lib/components/common/tabs/Tabs.svelte @@ -20,7 +20,6 @@ export let wrapperClass = '' export let style = '' export let hashNavigation = false - export let dflt: string | undefined = undefined export let values: string[] | undefined = undefined $: selected && updateSelected() diff --git a/frontend/src/lib/components/home/ItemsList.svelte b/frontend/src/lib/components/home/ItemsList.svelte index 28b2d2ebaa..65cde95bea 100644 --- a/frontend/src/lib/components/home/ItemsList.svelte +++ b/frontend/src/lib/components/home/ItemsList.svelte @@ -37,6 +37,7 @@ import { canWrite } from '$lib/utils' import { page } from '$app/stores' import { setQuery } from '$lib/navigation' + import DeployWorkspaceDrawer from '../DeployWorkspaceDrawer.svelte' type TableItem = T & { canWrite: boolean @@ -62,6 +63,7 @@ let shareModal: ShareModal let moveDrawer: MoveDrawer + let deploymentDrawer: DeployWorkspaceDrawer let loading = true @@ -270,6 +272,7 @@ }} /> + { @@ -376,6 +379,7 @@ script={item} {shareModal} {moveDrawer} + {deploymentDrawer} /> {:else if item.type == 'flow'} {:else if item.type == 'app'} {:else if item.type == 'raw_app'} {/if} {/key} diff --git a/frontend/src/routes/(root)/(logged)/+page.svelte b/frontend/src/routes/(root)/(logged)/+page.svelte index 9f636fe8af..d491611d47 100644 --- a/frontend/src/routes/(root)/(logged)/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/+page.svelte @@ -201,7 +201,7 @@ {#if !$userStore?.operator}
- +
diff --git a/frontend/src/routes/(root)/(logged)/deploy/[kind]/[...path]/+page.js b/frontend/src/routes/(root)/(logged)/deploy/[kind]/[...path]/+page.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frontend/src/routes/(root)/(logged)/deploy/[kind]/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/deploy/[kind]/[...path]/+page.svelte new file mode 100644 index 0000000000..d651318b96 --- /dev/null +++ b/frontend/src/routes/(root)/(logged)/deploy/[kind]/[...path]/+page.svelte @@ -0,0 +1,18 @@ + + + +

Deploy {$page.params.kind} {$page.params.path}

+ +
diff --git a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte index e4bd0a3b3c..94acdb8402 100644 --- a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte @@ -17,6 +17,7 @@ faClipboard, faCodeFork, faEdit, + faFileExport, faList, faPlay, faShare, @@ -41,6 +42,7 @@ import { slide } from 'svelte/transition' import { sendUserToast } from '$lib/toast' import Urlize from '$lib/components/Urlize.svelte' + import DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte' let userSettings: UserSettings @@ -147,6 +149,7 @@ let webhook: HTMLHeadElement let moveDrawer: MoveDrawer + let deploymentDrawer: DeployWorkspaceDrawer loadSchedule()} bind:this={scheduleEditor} /> @@ -159,6 +162,8 @@ layout={[0.75, [2, 0, 2], 2.25, [{ h: 1.5, w: 40 }], 0.2, [{ h: 1, w: 30 }]]} /> + + { @@ -286,6 +291,15 @@ > Move/Rename + +
{:else} - +
+ +
{/if}

Script or flow to run on /windmill command diff --git a/react-sdk/package-lock.json b/react-sdk/package-lock.json index 8297a2497c..b0eaa447d3 100644 --- a/react-sdk/package-lock.json +++ b/react-sdk/package-lock.json @@ -30,16 +30,16 @@ }, "../frontend": { "name": "windmill", - "version": "1.109.0", + "version": "1.114.2", "license": "AGPL-3.0", "dependencies": { "@aws-crypto/sha256-js": "^4.0.0", "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.1", - "@leeoniya/ufuzzy": "^1.0.6", + "@leeoniya/ufuzzy": "^1.0.7", "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", - "@tanstack/svelte-table": "^8.9.1", + "@tanstack/svelte-table": "^8.9.2", "ag-grid-svelte": "^0.1.4", "chart.js": "^4.3.0", "chartjs-adapter-date-fns": "^3.0.0", @@ -50,8 +50,9 @@ "fast-equals": "^5.0.1", "highlight.js": "^11.8.0", "lodash": "^4.17.21", - "lucide-svelte": "^0.224.0", - "monaco-languageclient": "~6.0.1", + "lucide-svelte": "^0.242.0", + "monaco-languageclient": "~6.0.3", + "quill": "^1.3.7", "svelte-autosize": "^1.0.1", "svelte-chartjs": "^3.1.0", "svelte-dnd-action": "^0.9.22", @@ -60,33 +61,34 @@ "svelte-timezone-picker": "^2.0.3", "tailwind-merge": "^1.12.0", "vscode-ws-jsonrpc": "3.0.0", + "windmill-parser-wasm": "file:../backend/parsers/windmill-parser-wasm/pkg", "y-monaco": "^0.1.4", "y-websocket": "^1.5.0", - "yjs": "^13.6.1" + "yjs": "^13.6.2" }, "devDependencies": { "@playwright/test": "^1.34.3", "@rgossiaux/svelte-headlessui": "^1.0.2", "@sveltejs/adapter-static": "^2.0.2", - "@sveltejs/kit": "^1.18.0", + "@sveltejs/kit": "^1.20.1", "@sveltejs/package": "^2.0.0", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.8", "@types/d3": "^7.4.0", - "@types/d3-zoom": "^3.0.2", + "@types/d3-zoom": "^3.0.3", "@types/lodash": "^4.14.195", - "@types/node": "^20.2.5", - "@types/vscode": "~1.78.0", + "@types/node": "^20.3.0", + "@types/vscode": "~1.78.1", "@typescript-eslint/eslint-plugin": "^5.59.8", "@typescript-eslint/parser": "^5.59.7", "@zerodevx/svelte-toast": "^0.9.3", "autoprefixer": "^10.4.13", "cssnano": "^6.0.1", "d3-dag": "^0.11.5", - "eslint": "^8.40.0", + "eslint": "^8.42.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-svelte3": "^4.0.0", - "monaco-editor-workers": "~0.37.0", + "monaco-editor-workers": "~0.38.0", "ol": "^7.2.2", "openapi-typescript-codegen": "^0.24.0", "path-browserify": "^1.0.1", @@ -101,23 +103,23 @@ "svelte": "^3.59.1", "svelte-awesome": "^3.2.0", "svelte-awesome-color-picker": "^2.4.3", - "svelte-check": "^3.3.2", + "svelte-check": "^3.4.3", "svelte-highlight": "^7.3.0", "svelte-multiselect": "^8.6.2", "svelte-overlay": "^1.4.1", "svelte-popperjs": "^1.3.2", "svelte-preprocess": "^5.0.1", "svelte-range-slider-pips": "^2.1.1", - "svelte-splitpanes": "^0.7.3", + "svelte-splitpanes": "^0.7.14", "svelte2tsx": "^0.6.14", "tailwindcss": "^3.3.2", "tslib": "^2.5.2", - "typescript": "^5.0.4", + "typescript": "^5.1.3", "vite": "^4.3.3", "yootils": "^0.3.1" }, "peerDependencies": { - "@sveltejs/kit": "^1.18.0", + "@sveltejs/kit": "^1.20.1", "svelte": "^3.59.1" } }, @@ -4122,22 +4124,22 @@ "@aws-crypto/sha256-js": "^4.0.0", "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.1", - "@leeoniya/ufuzzy": "^1.0.6", + "@leeoniya/ufuzzy": "^1.0.7", "@playwright/test": "^1.34.3", "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", "@rgossiaux/svelte-headlessui": "^1.0.2", "@sveltejs/adapter-static": "^2.0.2", - "@sveltejs/kit": "^1.18.0", + "@sveltejs/kit": "^1.20.1", "@sveltejs/package": "^2.0.0", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.8", - "@tanstack/svelte-table": "^8.9.1", + "@tanstack/svelte-table": "^8.9.2", "@types/d3": "^7.4.0", - "@types/d3-zoom": "^3.0.2", + "@types/d3-zoom": "^3.0.3", "@types/lodash": "^4.14.195", - "@types/node": "^20.2.5", - "@types/vscode": "~1.78.0", + "@types/node": "^20.3.0", + "@types/vscode": "~1.78.1", "@typescript-eslint/eslint-plugin": "^5.59.8", "@typescript-eslint/parser": "^5.59.7", "@zerodevx/svelte-toast": "^0.9.3", @@ -4150,16 +4152,16 @@ "d3-dag": "^0.11.5", "d3-zoom": "^3.0.0", "date-fns": "^2.30.0", - "eslint": "^8.40.0", + "eslint": "^8.42.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-svelte3": "^4.0.0", "esm-env": "^1.0.0", "fast-equals": "^5.0.1", "highlight.js": "^11.8.0", "lodash": "^4.17.21", - "lucide-svelte": "^0.224.0", - "monaco-editor-workers": "~0.37.0", - "monaco-languageclient": "~6.0.1", + "lucide-svelte": "^0.242.0", + "monaco-editor-workers": "~0.38.0", + "monaco-languageclient": "~6.0.3", "ol": "^7.2.2", "openapi-typescript-codegen": "^0.24.0", "path-browserify": "^1.0.1", @@ -4168,6 +4170,7 @@ "postcss-load-config": "^4.0.1", "prettier": "^2.8.8", "prettier-plugin-svelte": "^2.10.1", + "quill": "^1.3.7", "simple-svelte-autocomplete": "^2.5.1", "style-to-object": "^0.4.1", "stylelint-config-recommended": "^12.0.0", @@ -4176,7 +4179,7 @@ "svelte-awesome": "^3.2.0", "svelte-awesome-color-picker": "^2.4.3", "svelte-chartjs": "^3.1.0", - "svelte-check": "^3.3.2", + "svelte-check": "^3.4.3", "svelte-dnd-action": "^0.9.22", "svelte-highlight": "^7.3.0", "svelte-multiselect": "^8.6.2", @@ -4186,18 +4189,19 @@ "svelte-preprocess": "^5.0.1", "svelte-range-slider-pips": "^2.1.1", "svelte-select": "^5.6.1", - "svelte-splitpanes": "^0.7.3", + "svelte-splitpanes": "^0.7.14", "svelte-timezone-picker": "^2.0.3", "svelte2tsx": "^0.6.14", "tailwind-merge": "^1.12.0", "tailwindcss": "^3.3.2", "tslib": "^2.5.2", - "typescript": "^5.0.4", + "typescript": "^5.1.3", "vite": "^4.3.3", "vscode-ws-jsonrpc": "3.0.0", + "windmill-parser-wasm": "file:../backend/parsers/windmill-parser-wasm/pkg", "y-monaco": "^0.1.4", "y-websocket": "^1.5.0", - "yjs": "^13.6.1", + "yjs": "^13.6.2", "yootils": "^0.3.1" } },