From 91d4664aaa944a7b1ec22af0e95ccc8f635d0a86 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 9 Jul 2023 22:35:33 +0200 Subject: [PATCH] improve schedule section of run page --- backend/sqlx-data.json | 272 +++++++++--------- backend/windmill-api/openapi.yaml | 9 + backend/windmill-api/src/schedule.rs | 32 ++- backend/windmill-api/src/scripts.rs | 17 +- frontend/src/lib/components/Path.svelte | 2 +- frontend/src/lib/components/RunForm.svelte | 2 +- .../lib/components/RunPageSchedules.svelte | 174 +++++++++++ .../src/lib/components/ScheduleEditor.svelte | 2 - .../details/DetailPageHeader.svelte | 2 +- .../details/DetailPageLayout.svelte | 2 +- .../(logged)/flows/get/[...path]/+page.svelte | 117 +------- .../scripts/get/[...hash]/+page.svelte | 17 +- 12 files changed, 372 insertions(+), 276 deletions(-) create mode 100644 frontend/src/lib/components/RunPageSchedules.svelte diff --git a/backend/sqlx-data.json b/backend/sqlx-data.json index 1239af4798..6d04ebcb37 100644 --- a/backend/sqlx-data.json +++ b/backend/sqlx-data.json @@ -1230,6 +1230,7 @@ "bash", "postgresql", "nativets", + "Nativets", "bun" ] }, @@ -2116,6 +2117,7 @@ "bash", "postgresql", "nativets", + "Nativets", "bun" ] }, @@ -2792,6 +2794,7 @@ "bash", "postgresql", "nativets", + "Nativets", "bun" ] }, @@ -3902,6 +3905,7 @@ "bash", "postgresql", "nativets", + "Nativets", "bun" ] }, @@ -4019,106 +4023,6 @@ }, "query": "SELECT EXISTS(SELECT 1 FROM usr WHERE workspace_id = $1 AND email = $2)" }, - "8caa01546506f42740b7973a3a45e40093a06714b8524570c5143b77af4a8e19": { - "describe": { - "columns": [ - { - "name": "workspace_id", - "ordinal": 0, - "type_info": "Varchar" - }, - { - "name": "path", - "ordinal": 1, - "type_info": "Varchar" - }, - { - "name": "edited_by", - "ordinal": 2, - "type_info": "Varchar" - }, - { - "name": "edited_at", - "ordinal": 3, - "type_info": "Timestamptz" - }, - { - "name": "schedule", - "ordinal": 4, - "type_info": "Varchar" - }, - { - "name": "enabled", - "ordinal": 5, - "type_info": "Bool" - }, - { - "name": "script_path", - "ordinal": 6, - "type_info": "Varchar" - }, - { - "name": "args", - "ordinal": 7, - "type_info": "Jsonb" - }, - { - "name": "extra_perms", - "ordinal": 8, - "type_info": "Jsonb" - }, - { - "name": "is_flow", - "ordinal": 9, - "type_info": "Bool" - }, - { - "name": "email", - "ordinal": 10, - "type_info": "Varchar" - }, - { - "name": "error", - "ordinal": 11, - "type_info": "Text" - }, - { - "name": "timezone", - "ordinal": 12, - "type_info": "Varchar" - }, - { - "name": "on_failure", - "ordinal": 13, - "type_info": "Varchar" - } - ], - "nullable": [ - false, - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true - ], - "parameters": { - "Left": [ - "Text", - "Int8", - "Int8" - ] - } - }, - "query": "SELECT * FROM schedule WHERE workspace_id = $1 ORDER BY edited_at desc LIMIT $2 OFFSET $3" - }, "8cc4fa257cb8053d27eb7a555d6e1b993e4a74b063eac632df8da24f6b87130e": { "describe": { "columns": [ @@ -5544,7 +5448,39 @@ }, "query": "DELETE FROM resource WHERE path = $1 AND workspace_id = $2" }, - "bfc760c2f3f1477b177a7c570ddadda818dd3f57142165f381c1db01c26cf1bf": { + "c0635f65d561c1a6b183b8fea45320482375d0bb5e617a9dd236a631a7b9ff05": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Text" + ] + } + }, + "query": "UPDATE workspace_settings SET error_handler = NULL WHERE workspace_id = $1" + }, + "c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc": { + "describe": { + "columns": [ + { + "name": "customer_id", + "ordinal": 0, + "type_info": "Varchar" + } + ], + "nullable": [ + true + ], + "parameters": { + "Left": [ + "Text" + ] + } + }, + "query": "SELECT customer_id FROM workspace_settings WHERE workspace_id = $1" + }, + "c10348d26e3e3dc9e345d9044db35db9906617eb9c98aaf58a55d9681ffb85e3": { "describe": { "columns": [ { @@ -5642,39 +5578,7 @@ ] } }, - "query": "UPDATE schedule SET script_path = $1 WHERE script_path = $2 AND workspace_id = $3 AND is_flow IS false RETURNING *" - }, - "c0635f65d561c1a6b183b8fea45320482375d0bb5e617a9dd236a631a7b9ff05": { - "describe": { - "columns": [], - "nullable": [], - "parameters": { - "Left": [ - "Text" - ] - } - }, - "query": "UPDATE workspace_settings SET error_handler = NULL WHERE workspace_id = $1" - }, - "c07c9276945663d062cf0ff5b3323be681a0e2cb07a457ea9aede2daeff551cc": { - "describe": { - "columns": [ - { - "name": "customer_id", - "ordinal": 0, - "type_info": "Varchar" - } - ], - "nullable": [ - true - ], - "parameters": { - "Left": [ - "Text" - ] - } - }, - "query": "SELECT customer_id FROM workspace_settings WHERE workspace_id = $1" + "query": "UPDATE schedule SET script_path = $1 WHERE script_path = $2 AND path != $2 AND workspace_id = $3 AND is_flow IS false RETURNING *" }, "c1149f74ef0cca4a48be80f523d339d78e8e20e2bfacac9ad1b6b75c5ae370fb": { "describe": { @@ -6460,6 +6364,106 @@ }, "query": "UPDATE app SET versions = array_append(versions, $1) WHERE path = $2 AND workspace_id = $3" }, + "dd74fa9468b5fe8c8ad657ded06076c11a78d0206af2af20685c691d4d9520bb": { + "describe": { + "columns": [ + { + "name": "workspace_id", + "ordinal": 0, + "type_info": "Varchar" + }, + { + "name": "path", + "ordinal": 1, + "type_info": "Varchar" + }, + { + "name": "edited_by", + "ordinal": 2, + "type_info": "Varchar" + }, + { + "name": "edited_at", + "ordinal": 3, + "type_info": "Timestamptz" + }, + { + "name": "schedule", + "ordinal": 4, + "type_info": "Varchar" + }, + { + "name": "enabled", + "ordinal": 5, + "type_info": "Bool" + }, + { + "name": "script_path", + "ordinal": 6, + "type_info": "Varchar" + }, + { + "name": "args", + "ordinal": 7, + "type_info": "Jsonb" + }, + { + "name": "extra_perms", + "ordinal": 8, + "type_info": "Jsonb" + }, + { + "name": "is_flow", + "ordinal": 9, + "type_info": "Bool" + }, + { + "name": "email", + "ordinal": 10, + "type_info": "Varchar" + }, + { + "name": "error", + "ordinal": 11, + "type_info": "Text" + }, + { + "name": "timezone", + "ordinal": 12, + "type_info": "Varchar" + }, + { + "name": "on_failure", + "ordinal": 13, + "type_info": "Varchar" + } + ], + "nullable": [ + false, + false, + false, + false, + false, + false, + false, + true, + false, + false, + false, + true, + false, + true + ], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + } + }, + "query": "UPDATE schedule SET path = $1, script_path = $1 WHERE path = $2 AND workspace_id = $3 AND is_flow IS false RETURNING *" + }, "dd7940ec390357b268d616e1880516ecc08d506db2109efcce840f096d7a594e": { "describe": { "columns": [ diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index b842b201e2..bba0fea78a 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -4439,6 +4439,15 @@ paths: - $ref: "#/components/parameters/WorkspaceId" - $ref: "#/components/parameters/Page" - $ref: "#/components/parameters/PerPage" + - name: path + description: filter by path + in: query + schema: + type: string + - name: is_flow + in: query + schema: + type: boolean responses: "200": description: schedule list diff --git a/backend/windmill-api/src/schedule.rs b/backend/windmill-api/src/schedule.rs index 63ba795127..ae3670847d 100644 --- a/backend/windmill-api/src/schedule.rs +++ b/backend/windmill-api/src/schedule.rs @@ -17,6 +17,7 @@ use axum::{ }; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; +use sql_builder::{prelude::Bind, SqlBuilder}; use sqlx::{Postgres, Transaction}; use std::str::FromStr; use windmill_audit::{audit_log, ActionKind}; @@ -211,6 +212,14 @@ async fn edit_schedule( Ok(path.to_string()) } +#[derive(Deserialize)] +pub struct ListScheduleQuery { + pub page: Option, + pub per_page: Option, + pub path: Option, + pub is_flow: Option, +} + async fn list_schedule( authed: Authed, Extension(user_db): Extension, @@ -218,16 +227,19 @@ async fn list_schedule( Query(pagination): Query, ) -> JsonResult> { let mut tx = user_db.begin(&authed).await?; - let (per_page, offset) = paginate(pagination); - let rows = sqlx::query_as!( - Schedule, - "SELECT * FROM schedule WHERE workspace_id = $1 ORDER BY edited_at desc LIMIT $2 OFFSET $3", - w_id, - per_page as i64, - offset as i64 - ) - .fetch_all(&mut tx) - .await?; + let (per_page, offset) = + paginate(Pagination { per_page: pagination.per_page, page: pagination.page }); + let sqlb = SqlBuilder::select_from("schedule") + .field("*") + .order_by("edited_at", true) + .and_where("workspace_id = ?".bind(&w_id)) + .offset(offset) + .limit(per_page) + .clone(); + let sql = sqlb.sql().map_err(|e| Error::InternalErr(e.to_string()))?; + let rows = sqlx::query_as::<_, Schedule>(&sql) + .fetch_all(&mut tx) + .await?; tx.commit().await?; Ok(Json(rows)) } diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index 491baab510..8fd40c464d 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -399,9 +399,9 @@ async fn create_script( .execute(&mut tx) .await?; - let schedulables = sqlx::query_as!( + let mut schedulables = sqlx::query_as!( Schedule, - "UPDATE schedule SET script_path = $1 WHERE script_path = $2 AND workspace_id = $3 AND is_flow IS false RETURNING *", + "UPDATE schedule SET script_path = $1 WHERE script_path = $2 AND path != $2 AND workspace_id = $3 AND is_flow IS false RETURNING *", ns.path, p_path, w_id, @@ -409,6 +409,19 @@ async fn create_script( .fetch_all(&mut tx) .await?; + let schedule = sqlx::query_as!(Schedule, + "UPDATE schedule SET path = $1, script_path = $1 WHERE path = $2 AND workspace_id = $3 AND is_flow IS false RETURNING *", + ns.path, + p_path, + w_id, + ) + .fetch_optional(&mut tx) + .await?; + + if let Some(schedule) = schedule { + schedulables.push(schedule); + } + for schedule in schedulables { clear_schedule(tx.transaction_mut(), &schedule.path, false).await?; diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte index ae94538527..f787a396c0 100644 --- a/frontend/src/lib/components/Path.svelte +++ b/frontend/src/lib/components/Path.svelte @@ -210,6 +210,7 @@ function initPath() { if (path != undefined && path != '') { meta = pathToMeta(path) + onMetaChange() return } if (initialPath == undefined || initialPath == '') { @@ -287,7 +288,6 @@ const kind = e.detail if (meta) { if (kind === 'folder') { - console.log($userStore?.folders) meta.owner = folders?.[0]?.name ?? '' } else if (kind === 'group') { meta.owner = 'all' diff --git a/frontend/src/lib/components/RunForm.svelte b/frontend/src/lib/components/RunForm.svelte index 02e8b0c68d..cc13254796 100644 --- a/frontend/src/lib/components/RunForm.svelte +++ b/frontend/src/lib/components/RunForm.svelte @@ -152,7 +152,7 @@ {#if schedulable}
-
+
+
+ +{#if schedule} +
+
+
+ + Primary schedule Share the same path as the script or flow it is attached to and its path get renamed + whenever the source path is renamed +
+
+ { + if (can_write) { + setScheduleEnabled(path, e.detail) + } else { + sendUserToast('not enough permission', true) + } + }} + options={{ + right: 'On' + }} + size="xs" + /> + + +
+
+ {#if Object.keys(schedule?.args ?? {}).length > 0} +
+ +
+ {:else} +
No arguments
+ {/if} +
+{:else} + +{/if} + +

Other schedules

+ +{#if schedules} + {#if schedules.length == 0} +
No other schedules
+ {:else} +
+ {#each schedules as schedule} +
{schedule.path}
{schedule.schedule}
+
{schedule.enabled ? 'on' : 'off'}
+ +
+ {/each} +
+ {/if} +{:else} + +{/if} diff --git a/frontend/src/lib/components/ScheduleEditor.svelte b/frontend/src/lib/components/ScheduleEditor.svelte index d773ebe403..781d95744d 100644 --- a/frontend/src/lib/components/ScheduleEditor.svelte +++ b/frontend/src/lib/components/ScheduleEditor.svelte @@ -251,8 +251,6 @@ /> {/if}
- Arguments - {#if runnable} {#if runnable?.schema && runnable.schema.properties && Object.keys(runnable.schema.properties).length > 0} diff --git a/frontend/src/lib/components/details/DetailPageHeader.svelte b/frontend/src/lib/components/details/DetailPageHeader.svelte index f4757001b6..0561bd7008 100644 --- a/frontend/src/lib/components/details/DetailPageHeader.svelte +++ b/frontend/src/lib/components/details/DetailPageHeader.svelte @@ -27,7 +27,7 @@
-
+
{title}
diff --git a/frontend/src/lib/components/details/DetailPageLayout.svelte b/frontend/src/lib/components/details/DetailPageLayout.svelte index e7b44928d6..7189463063 100644 --- a/frontend/src/lib/components/details/DetailPageLayout.svelte +++ b/frontend/src/lib/components/details/DetailPageLayout.svelte @@ -46,7 +46,7 @@ - Schedule + Schedules 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 42b8e6f4b6..bb5716b11d 100644 --- a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte @@ -1,6 +1,6 @@