From 6933f06f1cd9383ccf483a61d5d4f320d93168be Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Sat, 22 Jun 2024 01:29:23 +0200 Subject: [PATCH] feat: add extra metadata to folders/resources/types + path prefix filtering for all + improve groups UI (#3936) * feat: add extra metadata to folders/schedules/resources/types * feat: add path prefix filter to api * chore: updatee ref * feat: improve groups UI * fix: nit * fix: nit --- ...b8849c74a9474777be61edf0ed43ddda07ef3.json | 12 ++ ...1526adcecdd8729f28c15e0db8cd28eaa8cf0.json | 22 ++- ...76992bfeb383d590e379244ad23703e536a4.json} | 5 +- ...8159555b652869a036b006f4a151e999b17b7.json | 14 +- ...d2ee3bef92e3fada73dcf519147964c0f4f4a.json | 14 -- ...fdc0ae5c89c556daf491f39e629951a912c6c.json | 16 +++ ...ef795049e60a823e8ce754a3f9d91ef1b6bb.json} | 8 +- ...7f5033b9c9afc344d9c3e385ba20a3ad2197a.json | 2 +- ...ddde0792e1861ea8761b4875677c3d0594a86.json | 14 -- ...b916987fc29b04b889544a064dc7cd5eab36f.json | 18 --- ...62a779528784ec8cf3f6dcce5545ab90bf234.json | 12 ++ ...268e8e15cc8b16770c20ec6be2a9e82ab93c9.json | 15 +++ ...54a2f1b768ec7ed1a419313f4842f26425e5d.json | 14 -- ...5a4ee50dea4b30093df2e0ceb684201ca4b0.json} | 24 +++- ...2a9cc4fee3473b3f6ea69f397d91e9356ba1.json} | 7 +- ...bc5f81eeb9e96622ad2557f810a8b91641b89.json | 15 +++ ...bc11779b1052b0948c410468a8aeba1d26d33.json | 12 ++ ...93cd7dbe267525d78cbfea87bb7c7cbf8ec4.json} | 4 +- ...76f1a32f5bc2323a28f640cf3301a299f1cf4.json | 16 +++ ...a986b9730eae9df26dd33c3ea21e35df62c4.json} | 5 +- ...00e4d0df0104b6c1dbdf6d0f68f5047a2ad5e.json | 19 +++ ...354577dc5f77169fd4573317454e47361d65.json} | 24 +++- ...96f44d93b344190a26c8393867b3a268b9aba.json | 15 +++ ...9740128d87fe5183f9b7b72f550a5502e1cbb.json | 16 +++ ...32d7d11b61acdab80dda24db4a9ba3e1f7e6.json} | 7 +- ...e2798f53d990b01b17bdbc044719d4908e3f4.json | 14 -- ...d578c31cf151ab3ef813f7aada76533761e12.json | 12 ++ ...759164e21a72ddc859304421ccb96233fa277.json | 15 +++ ...b37cc20d2f7a3749d21a1de5642e888b5f42.json} | 4 +- backend/ee-repo-ref.txt | 2 +- .../20240619165014_extra_metadata.down.sql | 1 + .../20240619165014_extra_metadata.up.sql | 4 + backend/windmill-api/openapi.yaml | 38 ++++++ backend/windmill-api/src/apps.rs | 8 ++ backend/windmill-api/src/flows.rs | 4 +- backend/windmill-api/src/folders.rs | 19 ++- backend/windmill-api/src/raw_apps.rs | 8 ++ backend/windmill-api/src/resources.rs | 30 ++++- backend/windmill-api/src/schedule.rs | 4 + backend/windmill-api/src/scripts.rs | 4 +- backend/windmill-api/src/variables.rs | 13 +- backend/windmill-api/src/workspaces.rs | 12 +- backend/windmill-common/src/apps.rs | 2 + backend/windmill-worker/src/common.rs | 9 +- frontend/src/lib/assets/app.css | 12 -- .../src/lib/components/FolderEditor.svelte | 27 ++++ .../src/lib/components/GroupEditor.svelte | 127 +++++------------- frontend/src/lib/components/GroupInfo.svelte | 2 +- frontend/src/lib/components/Path.svelte | 4 +- .../lib/components/ScheduleEditorInner.svelte | 77 ++++++----- .../src/lib/components/ScriptSchedules.svelte | 19 +-- .../flows/content/FlowSchedules.svelte | 19 +-- .../(root)/(logged)/folders/+page.svelte | 6 +- .../(root)/(logged)/groups/+page.svelte | 68 ++++++---- .../(root)/(logged)/schedules/+page.svelte | 9 +- 55 files changed, 585 insertions(+), 318 deletions(-) rename backend/.sqlx/{query-489a62b5943a7a21ce487aa7b72a63dfc6300dd93bc29f5ec4cb1bfc471ad0bf.json => query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json} (50%) delete mode 100644 backend/.sqlx/query-584cb984ea6528baac48c5c437ad2ee3bef92e3fada73dcf519147964c0f4f4a.json create mode 100644 backend/.sqlx/query-5eb1e072a6cc6ace25a5806b5adfdc0ae5c89c556daf491f39e629951a912c6c.json rename backend/.sqlx/{query-e33d0bec7e08c0bb4e6f26c93a636707714699e8984b9f537085e773849c8b43.json => query-5f3f1f1ca72b0392f227d22adef9ef795049e60a823e8ce754a3f9d91ef1b6bb.json} (55%) delete mode 100644 backend/.sqlx/query-6e6d781fe63602541f7cb4806d5ddde0792e1861ea8761b4875677c3d0594a86.json delete mode 100644 backend/.sqlx/query-726f77c2c1ef63eece7a1176bcbb916987fc29b04b889544a064dc7cd5eab36f.json create mode 100644 backend/.sqlx/query-7ded28aae42230da6e3aa6fa952268e8e15cc8b16770c20ec6be2a9e82ab93c9.json delete mode 100644 backend/.sqlx/query-98c8e2c58b38beedcb474251c2554a2f1b768ec7ed1a419313f4842f26425e5d.json rename backend/.sqlx/{query-8543f029d9784234e4c6a6dcd7b03e62d544b98be261334ee210594e0bb839f2.json => query-9c6d44ffae63b4050ef3a66cb05d5a4ee50dea4b30093df2e0ceb684201ca4b0.json} (60%) rename backend/.sqlx/{query-f2aee3ae39c90e40dd1835befc339e5381cc9104933cf8e90d840a9bf638ff52.json => query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json} (52%) create mode 100644 backend/.sqlx/query-b7ac3383a058ab3bbd7280300cebc5f81eeb9e96622ad2557f810a8b91641b89.json rename backend/.sqlx/{query-8c0131a9cc61f2daa258d49767242bcaab6bb34a977ff7fb0c18aa9202d11f47.json => query-be10033b37dc9cbc38cc56afa8ef93cd7dbe267525d78cbfea87bb7c7cbf8ec4.json} (52%) create mode 100644 backend/.sqlx/query-c2a6e8f38d2293c45ede26b89a976f1a32f5bc2323a28f640cf3301a299f1cf4.json rename backend/.sqlx/{query-ad9ccde8d831461f1f312d530867714577a825cd40d6655ed61b0b343b5d4482.json => query-c4ee16065fa021cf6443c2f29f1ca986b9730eae9df26dd33c3ea21e35df62c4.json} (51%) create mode 100644 backend/.sqlx/query-c69719d0a63b0ca434c3317529e00e4d0df0104b6c1dbdf6d0f68f5047a2ad5e.json rename backend/.sqlx/{query-3911bf3bbc82d87366a5297496fd2350a252bcd69f1c7c972bf566ee7eb28b0a.json => query-cb20f04352364f112ec564617722354577dc5f77169fd4573317454e47361d65.json} (60%) create mode 100644 backend/.sqlx/query-cccf9e216d84dfbb801b92d697496f44d93b344190a26c8393867b3a268b9aba.json create mode 100644 backend/.sqlx/query-d1b508e1d8496e5e7aee9db555f9740128d87fe5183f9b7b72f550a5502e1cbb.json rename backend/.sqlx/{query-5061c0d054bf4f028e7fe51a8f9389024c6ae4492755cadac0f7167e5300bda0.json => query-d249343a1d9fce2f7ca9e6e447eb32d7d11b61acdab80dda24db4a9ba3e1f7e6.json} (54%) delete mode 100644 backend/.sqlx/query-d956b7525f83e6d03beadc4bb3ee2798f53d990b01b17bdbc044719d4908e3f4.json create mode 100644 backend/.sqlx/query-f581f5ad5c386cef1037e3e8dcb759164e21a72ddc859304421ccb96233fa277.json rename backend/.sqlx/{query-8876fa929ffb175cd976a2bca1195704aa9fe7215013ae29e49ef15cb201ba57.json => query-fd790067c02d384aead5ff8f94efb37cc20d2f7a3749d21a1de5642e888b5f42.json} (51%) create mode 100644 backend/migrations/20240619165014_extra_metadata.down.sql create mode 100644 backend/migrations/20240619165014_extra_metadata.up.sql diff --git a/backend/.sqlx/query-03d63d2e64b012f624d2731b5bcb8849c74a9474777be61edf0ed43ddda07ef3.json b/backend/.sqlx/query-03d63d2e64b012f624d2731b5bcb8849c74a9474777be61edf0ed43ddda07ef3.json index 5c86e3b2f6..c501c6f1f8 100644 --- a/backend/.sqlx/query-03d63d2e64b012f624d2731b5bcb8849c74a9474777be61edf0ed43ddda07ef3.json +++ b/backend/.sqlx/query-03d63d2e64b012f624d2731b5bcb8849c74a9474777be61edf0ed43ddda07ef3.json @@ -22,6 +22,16 @@ "ordinal": 3, "name": "description", "type_info": "Text" + }, + { + "ordinal": 4, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "created_by", + "type_info": "Varchar" } ], "parameters": { @@ -34,6 +44,8 @@ false, false, true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-41f2c271514ee254739c3a097871526adcecdd8729f28c15e0db8cd28eaa8cf0.json b/backend/.sqlx/query-41f2c271514ee254739c3a097871526adcecdd8729f28c15e0db8cd28eaa8cf0.json index cacecd68f8..cf134912fb 100644 --- a/backend/.sqlx/query-41f2c271514ee254739c3a097871526adcecdd8729f28c15e0db8cd28eaa8cf0.json +++ b/backend/.sqlx/query-41f2c271514ee254739c3a097871526adcecdd8729f28c15e0db8cd28eaa8cf0.json @@ -35,31 +35,41 @@ }, { "ordinal": 6, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, + "name": "created_by", + "type_info": "Varchar" + }, + { + "ordinal": 8, "name": "is_expired", "type_info": "Bool" }, { - "ordinal": 7, + "ordinal": 9, "name": "is_refreshed", "type_info": "Bool" }, { - "ordinal": 8, + "ordinal": 10, "name": "refresh_error", "type_info": "Text" }, { - "ordinal": 9, + "ordinal": 11, "name": "is_linked", "type_info": "Bool" }, { - "ordinal": 10, + "ordinal": 12, "name": "is_oauth?", "type_info": "Bool" }, { - "ordinal": 11, + "ordinal": 13, "name": "account", "type_info": "Int4" } @@ -77,6 +87,8 @@ true, false, false, + true, + true, null, null, true, diff --git a/backend/.sqlx/query-489a62b5943a7a21ce487aa7b72a63dfc6300dd93bc29f5ec4cb1bfc471ad0bf.json b/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json similarity index 50% rename from backend/.sqlx/query-489a62b5943a7a21ce487aa7b72a63dfc6300dd93bc29f5ec4cb1bfc471ad0bf.json rename to backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json index fba1bdf631..695b4d2969 100644 --- a/backend/.sqlx/query-489a62b5943a7a21ce487aa7b72a63dfc6300dd93bc29f5ec4cb1bfc471ad0bf.json +++ b/backend/.sqlx/query-42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO resource\n (workspace_id, path, value, description, resource_type)\n VALUES ($1, $2, $3, $4, $5) ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3", + "query": "INSERT INTO resource\n (workspace_id, path, value, description, resource_type, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT (workspace_id, path) DO UPDATE SET value = $3, edited_at = now()", "describe": { "columns": [], "parameters": { @@ -9,10 +9,11 @@ "Varchar", "Jsonb", "Text", + "Varchar", "Varchar" ] }, "nullable": [] }, - "hash": "489a62b5943a7a21ce487aa7b72a63dfc6300dd93bc29f5ec4cb1bfc471ad0bf" + "hash": "42df4b40b3bbf14010f07e29892776992bfeb383d590e379244ad23703e536a4" } diff --git a/backend/.sqlx/query-45e4d13f5806122faecdb1d9ab18159555b652869a036b006f4a151e999b17b7.json b/backend/.sqlx/query-45e4d13f5806122faecdb1d9ab18159555b652869a036b006f4a151e999b17b7.json index 3f3bc5b933..259b328558 100644 --- a/backend/.sqlx/query-45e4d13f5806122faecdb1d9ab18159555b652869a036b006f4a151e999b17b7.json +++ b/backend/.sqlx/query-45e4d13f5806122faecdb1d9ab18159555b652869a036b006f4a151e999b17b7.json @@ -32,6 +32,16 @@ "ordinal": 5, "name": "extra_perms", "type_info": "Jsonb" + }, + { + "ordinal": 6, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 7, + "name": "created_by", + "type_info": "Varchar" } ], "parameters": { @@ -45,7 +55,9 @@ true, true, false, - false + false, + true, + true ] }, "hash": "45e4d13f5806122faecdb1d9ab18159555b652869a036b006f4a151e999b17b7" diff --git a/backend/.sqlx/query-584cb984ea6528baac48c5c437ad2ee3bef92e3fada73dcf519147964c0f4f4a.json b/backend/.sqlx/query-584cb984ea6528baac48c5c437ad2ee3bef92e3fada73dcf519147964c0f4f4a.json deleted file mode 100644 index c4d5eb1f75..0000000000 --- a/backend/.sqlx/query-584cb984ea6528baac48c5c437ad2ee3bef92e3fada73dcf519147964c0f4f4a.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, 'app_themes', 'App Themes', ARRAY[]::TEXT[], '{\"g/all\": false}') ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "584cb984ea6528baac48c5c437ad2ee3bef92e3fada73dcf519147964c0f4f4a" -} diff --git a/backend/.sqlx/query-5eb1e072a6cc6ace25a5806b5adfdc0ae5c89c556daf491f39e629951a912c6c.json b/backend/.sqlx/query-5eb1e072a6cc6ace25a5806b5adfdc0ae5c89c556daf491f39e629951a912c6c.json new file mode 100644 index 0000000000..2785225571 --- /dev/null +++ b/backend/.sqlx/query-5eb1e072a6cc6ace25a5806b5adfdc0ae5c89c556daf491f39e629951a912c6c.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE resource SET created_by = $1 WHERE created_by = $2 AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "5eb1e072a6cc6ace25a5806b5adfdc0ae5c89c556daf491f39e629951a912c6c" +} diff --git a/backend/.sqlx/query-e33d0bec7e08c0bb4e6f26c93a636707714699e8984b9f537085e773849c8b43.json b/backend/.sqlx/query-5f3f1f1ca72b0392f227d22adef9ef795049e60a823e8ce754a3f9d91ef1b6bb.json similarity index 55% rename from backend/.sqlx/query-e33d0bec7e08c0bb4e6f26c93a636707714699e8984b9f537085e773849c8b43.json rename to backend/.sqlx/query-5f3f1f1ca72b0392f227d22adef9ef795049e60a823e8ce754a3f9d91ef1b6bb.json index 6e57308d07..d099fc8b2a 100644 --- a/backend/.sqlx/query-e33d0bec7e08c0bb4e6f26c93a636707714699e8984b9f537085e773849c8b43.json +++ b/backend/.sqlx/query-5f3f1f1ca72b0392f227d22adef9ef795049e60a823e8ce754a3f9d91ef1b6bb.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, $2, $3, $4, $5)", + "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, summary, created_by, edited_at) VALUES ($1, $2, $3, $4, $5, $6, $7, now())", "describe": { "columns": [], "parameters": { @@ -9,10 +9,12 @@ "Varchar", "Varchar", "VarcharArray", - "Jsonb" + "Jsonb", + "Text", + "Varchar" ] }, "nullable": [] }, - "hash": "e33d0bec7e08c0bb4e6f26c93a636707714699e8984b9f537085e773849c8b43" + "hash": "5f3f1f1ca72b0392f227d22adef9ef795049e60a823e8ce754a3f9d91ef1b6bb" } diff --git a/backend/.sqlx/query-661f472ff3860983322162420457f5033b9c9afc344d9c3e385ba20a3ad2197a.json b/backend/.sqlx/query-661f472ff3860983322162420457f5033b9c9afc344d9c3e385ba20a3ad2197a.json index 75b8108281..1fa370e682 100644 --- a/backend/.sqlx/query-661f472ff3860983322162420457f5033b9c9afc344d9c3e385ba20a3ad2197a.json +++ b/backend/.sqlx/query-661f472ff3860983322162420457f5033b9c9afc344d9c3e385ba20a3ad2197a.json @@ -5,7 +5,7 @@ "columns": [ { "ordinal": 0, - "name": "?column?", + "name": "bool", "type_info": "Bool" } ], diff --git a/backend/.sqlx/query-6e6d781fe63602541f7cb4806d5ddde0792e1861ea8761b4875677c3d0594a86.json b/backend/.sqlx/query-6e6d781fe63602541f7cb4806d5ddde0792e1861ea8761b4875677c3d0594a86.json deleted file mode 100644 index bb5d27a985..0000000000 --- a/backend/.sqlx/query-6e6d781fe63602541f7cb4806d5ddde0792e1861ea8761b4875677c3d0594a86.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, 'app_groups', 'App Groups', ARRAY[]::TEXT[], '{\"g/all\": false}') ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "6e6d781fe63602541f7cb4806d5ddde0792e1861ea8761b4875677c3d0594a86" -} diff --git a/backend/.sqlx/query-726f77c2c1ef63eece7a1176bcbb916987fc29b04b889544a064dc7cd5eab36f.json b/backend/.sqlx/query-726f77c2c1ef63eece7a1176bcbb916987fc29b04b889544a064dc7cd5eab36f.json deleted file mode 100644 index 558bddc65e..0000000000 --- a/backend/.sqlx/query-726f77c2c1ef63eece7a1176bcbb916987fc29b04b889544a064dc7cd5eab36f.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO resource\n (workspace_id, path, value, description, resource_type)\n VALUES ($1, $2, $3, $4, $5) ON CONFLICT (workspace_id, path)\n DO UPDATE SET value = $3, description = $4, resource_type = $5", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar", - "Varchar", - "Jsonb", - "Text", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "726f77c2c1ef63eece7a1176bcbb916987fc29b04b889544a064dc7cd5eab36f" -} diff --git a/backend/.sqlx/query-7b1239ad6460e8f5fb41bfe12f662a779528784ec8cf3f6dcce5545ab90bf234.json b/backend/.sqlx/query-7b1239ad6460e8f5fb41bfe12f662a779528784ec8cf3f6dcce5545ab90bf234.json index d647fd398c..7bdf4f49a7 100644 --- a/backend/.sqlx/query-7b1239ad6460e8f5fb41bfe12f662a779528784ec8cf3f6dcce5545ab90bf234.json +++ b/backend/.sqlx/query-7b1239ad6460e8f5fb41bfe12f662a779528784ec8cf3f6dcce5545ab90bf234.json @@ -22,6 +22,16 @@ "ordinal": 3, "name": "description", "type_info": "Text" + }, + { + "ordinal": 4, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "created_by", + "type_info": "Varchar" } ], "parameters": { @@ -33,6 +43,8 @@ false, false, true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-7ded28aae42230da6e3aa6fa952268e8e15cc8b16770c20ec6be2a9e82ab93c9.json b/backend/.sqlx/query-7ded28aae42230da6e3aa6fa952268e8e15cc8b16770c20ec6be2a9e82ab93c9.json new file mode 100644 index 0000000000..d9185a5586 --- /dev/null +++ b/backend/.sqlx/query-7ded28aae42230da6e3aa6fa952268e8e15cc8b16770c20ec6be2a9e82ab93c9.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at) VALUES ($1, 'app_custom', 'App Custom Components', ARRAY[]::TEXT[], '{\"g/all\": false}', $2, now()) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "7ded28aae42230da6e3aa6fa952268e8e15cc8b16770c20ec6be2a9e82ab93c9" +} diff --git a/backend/.sqlx/query-98c8e2c58b38beedcb474251c2554a2f1b768ec7ed1a419313f4842f26425e5d.json b/backend/.sqlx/query-98c8e2c58b38beedcb474251c2554a2f1b768ec7ed1a419313f4842f26425e5d.json deleted file mode 100644 index dbbbc03a87..0000000000 --- a/backend/.sqlx/query-98c8e2c58b38beedcb474251c2554a2f1b768ec7ed1a419313f4842f26425e5d.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, 'app_custom', 'App Custom Components', ARRAY[]::TEXT[], '{\"g/all\": false}') ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "98c8e2c58b38beedcb474251c2554a2f1b768ec7ed1a419313f4842f26425e5d" -} diff --git a/backend/.sqlx/query-8543f029d9784234e4c6a6dcd7b03e62d544b98be261334ee210594e0bb839f2.json b/backend/.sqlx/query-9c6d44ffae63b4050ef3a66cb05d5a4ee50dea4b30093df2e0ceb684201ca4b0.json similarity index 60% rename from backend/.sqlx/query-8543f029d9784234e4c6a6dcd7b03e62d544b98be261334ee210594e0bb839f2.json rename to backend/.sqlx/query-9c6d44ffae63b4050ef3a66cb05d5a4ee50dea4b30093df2e0ceb684201ca4b0.json index d7b55a41cc..8c2c014662 100644 --- a/backend/.sqlx/query-8543f029d9784234e4c6a6dcd7b03e62d544b98be261334ee210594e0bb839f2.json +++ b/backend/.sqlx/query-9c6d44ffae63b4050ef3a66cb05d5a4ee50dea4b30093df2e0ceb684201ca4b0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT workspace_id, name, display_name, owners, extra_perms FROM folder WHERE workspace_id = $1 ORDER BY name desc LIMIT $2 OFFSET $3", + "query": "SELECT workspace_id, name, display_name, owners, extra_perms, summary, created_by, edited_at FROM folder WHERE workspace_id = $1 ORDER BY name desc LIMIT $2 OFFSET $3", "describe": { "columns": [ { @@ -27,6 +27,21 @@ "ordinal": 4, "name": "extra_perms", "type_info": "Jsonb" + }, + { + "ordinal": 5, + "name": "summary", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "created_by", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "edited_at", + "type_info": "Timestamptz" } ], "parameters": { @@ -41,8 +56,11 @@ false, false, false, - false + false, + true, + true, + true ] }, - "hash": "8543f029d9784234e4c6a6dcd7b03e62d544b98be261334ee210594e0bb839f2" + "hash": "9c6d44ffae63b4050ef3a66cb05d5a4ee50dea4b30093df2e0ceb684201ca4b0" } diff --git a/backend/.sqlx/query-f2aee3ae39c90e40dd1835befc339e5381cc9104933cf8e90d840a9bf638ff52.json b/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json similarity index 52% rename from backend/.sqlx/query-f2aee3ae39c90e40dd1835befc339e5381cc9104933cf8e90d840a9bf638ff52.json rename to backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json index db3e93c2ea..936365c8d0 100644 --- a/backend/.sqlx/query-f2aee3ae39c90e40dd1835befc339e5381cc9104933cf8e90d840a9bf638ff52.json +++ b/backend/.sqlx/query-ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO folder\n (workspace_id, name, display_name, owners, extra_perms)\n VALUES ($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING", + "query": "INSERT INTO folder\n (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT DO NOTHING", "describe": { "columns": [], "parameters": { @@ -9,10 +9,11 @@ "Varchar", "Varchar", "VarcharArray", - "Jsonb" + "Jsonb", + "Varchar" ] }, "nullable": [] }, - "hash": "f2aee3ae39c90e40dd1835befc339e5381cc9104933cf8e90d840a9bf638ff52" + "hash": "ad3b0176e3d41a0c1d79a8eb59da2a9cc4fee3473b3f6ea69f397d91e9356ba1" } diff --git a/backend/.sqlx/query-b7ac3383a058ab3bbd7280300cebc5f81eeb9e96622ad2557f810a8b91641b89.json b/backend/.sqlx/query-b7ac3383a058ab3bbd7280300cebc5f81eeb9e96622ad2557f810a8b91641b89.json new file mode 100644 index 0000000000..de7f98209c --- /dev/null +++ b/backend/.sqlx/query-b7ac3383a058ab3bbd7280300cebc5f81eeb9e96622ad2557f810a8b91641b89.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at) VALUES ($1, 'app_groups', 'App Groups', ARRAY[]::TEXT[], '{\"g/all\": false}', $2, now()) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "b7ac3383a058ab3bbd7280300cebc5f81eeb9e96622ad2557f810a8b91641b89" +} diff --git a/backend/.sqlx/query-b8d392ccfcccafe0c19511b3567bc11779b1052b0948c410468a8aeba1d26d33.json b/backend/.sqlx/query-b8d392ccfcccafe0c19511b3567bc11779b1052b0948c410468a8aeba1d26d33.json index ceee4a2069..fc91f7103d 100644 --- a/backend/.sqlx/query-b8d392ccfcccafe0c19511b3567bc11779b1052b0948c410468a8aeba1d26d33.json +++ b/backend/.sqlx/query-b8d392ccfcccafe0c19511b3567bc11779b1052b0948c410468a8aeba1d26d33.json @@ -22,6 +22,16 @@ "ordinal": 3, "name": "description", "type_info": "Text" + }, + { + "ordinal": 4, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "created_by", + "type_info": "Varchar" } ], "parameters": { @@ -33,6 +43,8 @@ false, false, true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-8c0131a9cc61f2daa258d49767242bcaab6bb34a977ff7fb0c18aa9202d11f47.json b/backend/.sqlx/query-be10033b37dc9cbc38cc56afa8ef93cd7dbe267525d78cbfea87bb7c7cbf8ec4.json similarity index 52% rename from backend/.sqlx/query-8c0131a9cc61f2daa258d49767242bcaab6bb34a977ff7fb0c18aa9202d11f47.json rename to backend/.sqlx/query-be10033b37dc9cbc38cc56afa8ef93cd7dbe267525d78cbfea87bb7c7cbf8ec4.json index 7a8fe90912..4f1c3ca161 100644 --- a/backend/.sqlx/query-8c0131a9cc61f2daa258d49767242bcaab6bb34a977ff7fb0c18aa9202d11f47.json +++ b/backend/.sqlx/query-be10033b37dc9cbc38cc56afa8ef93cd7dbe267525d78cbfea87bb7c7cbf8ec4.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE resource SET path = $1, value = $2 WHERE path = $3 AND workspace_id = $4", + "query": "UPDATE resource SET path = $1, value = $2, edited_at = now() WHERE path = $3 AND workspace_id = $4", "describe": { "columns": [], "parameters": { @@ -13,5 +13,5 @@ }, "nullable": [] }, - "hash": "8c0131a9cc61f2daa258d49767242bcaab6bb34a977ff7fb0c18aa9202d11f47" + "hash": "be10033b37dc9cbc38cc56afa8ef93cd7dbe267525d78cbfea87bb7c7cbf8ec4" } diff --git a/backend/.sqlx/query-c2a6e8f38d2293c45ede26b89a976f1a32f5bc2323a28f640cf3301a299f1cf4.json b/backend/.sqlx/query-c2a6e8f38d2293c45ede26b89a976f1a32f5bc2323a28f640cf3301a299f1cf4.json new file mode 100644 index 0000000000..64f691b86b --- /dev/null +++ b/backend/.sqlx/query-c2a6e8f38d2293c45ede26b89a976f1a32f5bc2323a28f640cf3301a299f1cf4.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE folder SET created_by = $1 WHERE created_by = $2 AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "c2a6e8f38d2293c45ede26b89a976f1a32f5bc2323a28f640cf3301a299f1cf4" +} diff --git a/backend/.sqlx/query-ad9ccde8d831461f1f312d530867714577a825cd40d6655ed61b0b343b5d4482.json b/backend/.sqlx/query-c4ee16065fa021cf6443c2f29f1ca986b9730eae9df26dd33c3ea21e35df62c4.json similarity index 51% rename from backend/.sqlx/query-ad9ccde8d831461f1f312d530867714577a825cd40d6655ed61b0b343b5d4482.json rename to backend/.sqlx/query-c4ee16065fa021cf6443c2f29f1ca986b9730eae9df26dd33c3ea21e35df62c4.json index 0a8ed659a4..ff71ffbe01 100644 --- a/backend/.sqlx/query-ad9ccde8d831461f1f312d530867714577a825cd40d6655ed61b0b343b5d4482.json +++ b/backend/.sqlx/query-c4ee16065fa021cf6443c2f29f1ca986b9730eae9df26dd33c3ea21e35df62c4.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO resource\n (workspace_id, path, value, resource_type)\n VALUES ($1, $2, $3, $4) ON CONFLICT (workspace_id, path)\n DO UPDATE SET value = $3", + "query": "INSERT INTO resource\n (workspace_id, path, value, resource_type, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, now()) ON CONFLICT (workspace_id, path)\n DO UPDATE SET value = $3, edited_at = now()", "describe": { "columns": [], "parameters": { @@ -8,10 +8,11 @@ "Varchar", "Varchar", "Jsonb", + "Varchar", "Varchar" ] }, "nullable": [] }, - "hash": "ad9ccde8d831461f1f312d530867714577a825cd40d6655ed61b0b343b5d4482" + "hash": "c4ee16065fa021cf6443c2f29f1ca986b9730eae9df26dd33c3ea21e35df62c4" } diff --git a/backend/.sqlx/query-c69719d0a63b0ca434c3317529e00e4d0df0104b6c1dbdf6d0f68f5047a2ad5e.json b/backend/.sqlx/query-c69719d0a63b0ca434c3317529e00e4d0df0104b6c1dbdf6d0f68f5047a2ad5e.json new file mode 100644 index 0000000000..d3634c6e96 --- /dev/null +++ b/backend/.sqlx/query-c69719d0a63b0ca434c3317529e00e4d0df0104b6c1dbdf6d0f68f5047a2ad5e.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO resource\n (workspace_id, path, value, description, resource_type, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT (workspace_id, path)\n DO UPDATE SET value = $3, description = $4, resource_type = $5, edited_at = now()", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar", + "Jsonb", + "Text", + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "c69719d0a63b0ca434c3317529e00e4d0df0104b6c1dbdf6d0f68f5047a2ad5e" +} diff --git a/backend/.sqlx/query-3911bf3bbc82d87366a5297496fd2350a252bcd69f1c7c972bf566ee7eb28b0a.json b/backend/.sqlx/query-cb20f04352364f112ec564617722354577dc5f77169fd4573317454e47361d65.json similarity index 60% rename from backend/.sqlx/query-3911bf3bbc82d87366a5297496fd2350a252bcd69f1c7c972bf566ee7eb28b0a.json rename to backend/.sqlx/query-cb20f04352364f112ec564617722354577dc5f77169fd4573317454e47361d65.json index c7befdcc9a..a33576931c 100644 --- a/backend/.sqlx/query-3911bf3bbc82d87366a5297496fd2350a252bcd69f1c7c972bf566ee7eb28b0a.json +++ b/backend/.sqlx/query-cb20f04352364f112ec564617722354577dc5f77169fd4573317454e47361d65.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT workspace_id, name, display_name, owners, extra_perms FROM folder WHERE name = $1 AND workspace_id = $2", + "query": "SELECT workspace_id, name, display_name, owners, extra_perms, summary, created_by, edited_at FROM folder WHERE name = $1 AND workspace_id = $2", "describe": { "columns": [ { @@ -27,6 +27,21 @@ "ordinal": 4, "name": "extra_perms", "type_info": "Jsonb" + }, + { + "ordinal": 5, + "name": "summary", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "created_by", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "edited_at", + "type_info": "Timestamptz" } ], "parameters": { @@ -40,8 +55,11 @@ false, false, false, - false + false, + true, + true, + true ] }, - "hash": "3911bf3bbc82d87366a5297496fd2350a252bcd69f1c7c972bf566ee7eb28b0a" + "hash": "cb20f04352364f112ec564617722354577dc5f77169fd4573317454e47361d65" } diff --git a/backend/.sqlx/query-cccf9e216d84dfbb801b92d697496f44d93b344190a26c8393867b3a268b9aba.json b/backend/.sqlx/query-cccf9e216d84dfbb801b92d697496f44d93b344190a26c8393867b3a268b9aba.json new file mode 100644 index 0000000000..4a34830b0e --- /dev/null +++ b/backend/.sqlx/query-cccf9e216d84dfbb801b92d697496f44d93b344190a26c8393867b3a268b9aba.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO resource (workspace_id, path, value, description, resource_type, created_by, edited_at) VALUES ($1, 'f/app_themes/theme_0', '{\"name\": \"Default Theme\", \"value\": \"\"}', 'The default app theme', 'app_theme', $2, now()) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "cccf9e216d84dfbb801b92d697496f44d93b344190a26c8393867b3a268b9aba" +} diff --git a/backend/.sqlx/query-d1b508e1d8496e5e7aee9db555f9740128d87fe5183f9b7b72f550a5502e1cbb.json b/backend/.sqlx/query-d1b508e1d8496e5e7aee9db555f9740128d87fe5183f9b7b72f550a5502e1cbb.json new file mode 100644 index 0000000000..1a96553b1f --- /dev/null +++ b/backend/.sqlx/query-d1b508e1d8496e5e7aee9db555f9740128d87fe5183f9b7b72f550a5502e1cbb.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE resource_type SET created_by = $1 WHERE created_by = $2 AND workspace_id = $3", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "d1b508e1d8496e5e7aee9db555f9740128d87fe5183f9b7b72f550a5502e1cbb" +} diff --git a/backend/.sqlx/query-5061c0d054bf4f028e7fe51a8f9389024c6ae4492755cadac0f7167e5300bda0.json b/backend/.sqlx/query-d249343a1d9fce2f7ca9e6e447eb32d7d11b61acdab80dda24db4a9ba3e1f7e6.json similarity index 54% rename from backend/.sqlx/query-5061c0d054bf4f028e7fe51a8f9389024c6ae4492755cadac0f7167e5300bda0.json rename to backend/.sqlx/query-d249343a1d9fce2f7ca9e6e447eb32d7d11b61acdab80dda24db4a9ba3e1f7e6.json index 70ea31405a..a3cd9e0c30 100644 --- a/backend/.sqlx/query-5061c0d054bf4f028e7fe51a8f9389024c6ae4492755cadac0f7167e5300bda0.json +++ b/backend/.sqlx/query-d249343a1d9fce2f7ca9e6e447eb32d7d11b61acdab80dda24db4a9ba3e1f7e6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO resource_type\n (workspace_id, name, schema, description)\n VALUES ($1, $2, $3, $4)", + "query": "INSERT INTO resource_type\n (workspace_id, name, schema, description, created_by, edited_at)\n VALUES ($1, $2, $3, $4, $5, now())", "describe": { "columns": [], "parameters": { @@ -8,10 +8,11 @@ "Varchar", "Varchar", "Jsonb", - "Text" + "Text", + "Varchar" ] }, "nullable": [] }, - "hash": "5061c0d054bf4f028e7fe51a8f9389024c6ae4492755cadac0f7167e5300bda0" + "hash": "d249343a1d9fce2f7ca9e6e447eb32d7d11b61acdab80dda24db4a9ba3e1f7e6" } diff --git a/backend/.sqlx/query-d956b7525f83e6d03beadc4bb3ee2798f53d990b01b17bdbc044719d4908e3f4.json b/backend/.sqlx/query-d956b7525f83e6d03beadc4bb3ee2798f53d990b01b17bdbc044719d4908e3f4.json deleted file mode 100644 index a1e9f97ed7..0000000000 --- a/backend/.sqlx/query-d956b7525f83e6d03beadc4bb3ee2798f53d990b01b17bdbc044719d4908e3f4.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO resource (workspace_id, path, value, description, resource_type) VALUES ($1, 'f/app_themes/theme_0', '{\"name\": \"Default Theme\", \"value\": \"\"}', 'The default app theme', 'app_theme') ON CONFLICT DO NOTHING", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "d956b7525f83e6d03beadc4bb3ee2798f53d990b01b17bdbc044719d4908e3f4" -} diff --git a/backend/.sqlx/query-eb1f7f01461f5a7540c273b37e5d578c31cf151ab3ef813f7aada76533761e12.json b/backend/.sqlx/query-eb1f7f01461f5a7540c273b37e5d578c31cf151ab3ef813f7aada76533761e12.json index 948e13e994..cd523b4c22 100644 --- a/backend/.sqlx/query-eb1f7f01461f5a7540c273b37e5d578c31cf151ab3ef813f7aada76533761e12.json +++ b/backend/.sqlx/query-eb1f7f01461f5a7540c273b37e5d578c31cf151ab3ef813f7aada76533761e12.json @@ -22,6 +22,16 @@ "ordinal": 3, "name": "description", "type_info": "Text" + }, + { + "ordinal": 4, + "name": "edited_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "created_by", + "type_info": "Varchar" } ], "parameters": { @@ -31,6 +41,8 @@ false, false, true, + true, + true, true ] }, diff --git a/backend/.sqlx/query-f581f5ad5c386cef1037e3e8dcb759164e21a72ddc859304421ccb96233fa277.json b/backend/.sqlx/query-f581f5ad5c386cef1037e3e8dcb759164e21a72ddc859304421ccb96233fa277.json new file mode 100644 index 0000000000..e953e1b725 --- /dev/null +++ b/backend/.sqlx/query-f581f5ad5c386cef1037e3e8dcb759164e21a72ddc859304421ccb96233fa277.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at) VALUES ($1, 'app_themes', 'App Themes', ARRAY[]::TEXT[], '{\"g/all\": false}', $2, now()) ON CONFLICT DO NOTHING", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "f581f5ad5c386cef1037e3e8dcb759164e21a72ddc859304421ccb96233fa277" +} diff --git a/backend/.sqlx/query-8876fa929ffb175cd976a2bca1195704aa9fe7215013ae29e49ef15cb201ba57.json b/backend/.sqlx/query-fd790067c02d384aead5ff8f94efb37cc20d2f7a3749d21a1de5642e888b5f42.json similarity index 51% rename from backend/.sqlx/query-8876fa929ffb175cd976a2bca1195704aa9fe7215013ae29e49ef15cb201ba57.json rename to backend/.sqlx/query-fd790067c02d384aead5ff8f94efb37cc20d2f7a3749d21a1de5642e888b5f42.json index e8e679fee7..a39ccd7796 100644 --- a/backend/.sqlx/query-8876fa929ffb175cd976a2bca1195704aa9fe7215013ae29e49ef15cb201ba57.json +++ b/backend/.sqlx/query-fd790067c02d384aead5ff8f94efb37cc20d2f7a3749d21a1de5642e888b5f42.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE resource SET value = $1 WHERE path = $2 AND workspace_id = $3", + "query": "UPDATE resource SET value = $1, edited_at = now() WHERE path = $2 AND workspace_id = $3", "describe": { "columns": [], "parameters": { @@ -12,5 +12,5 @@ }, "nullable": [] }, - "hash": "8876fa929ffb175cd976a2bca1195704aa9fe7215013ae29e49ef15cb201ba57" + "hash": "fd790067c02d384aead5ff8f94efb37cc20d2f7a3749d21a1de5642e888b5f42" } diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index a22de7defd..5e5f7e2af4 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -6aa8832322866e9f6ff90979db9b2b8f4bf6d4ce \ No newline at end of file +9ef2d9c4aebfee15935634274a2c7c685331a865 \ No newline at end of file diff --git a/backend/migrations/20240619165014_extra_metadata.down.sql b/backend/migrations/20240619165014_extra_metadata.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20240619165014_extra_metadata.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20240619165014_extra_metadata.up.sql b/backend/migrations/20240619165014_extra_metadata.up.sql new file mode 100644 index 0000000000..2024051db3 --- /dev/null +++ b/backend/migrations/20240619165014_extra_metadata.up.sql @@ -0,0 +1,4 @@ +-- Add up migration script here +alter table resource add column edited_at timestamptz, add column created_by varchar(50); +alter table resource_type add column edited_at timestamptz, add column created_by varchar(50); +alter table folder add column summary text, add column edited_at timestamptz, add column created_by varchar(50); \ No newline at end of file diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 99eeb9f917..bbe7da7022 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -2373,6 +2373,10 @@ paths: - variable parameters: - $ref: "#/components/parameters/WorkspaceId" + - name: path_start + in: query + schema: + type: string responses: "200": description: variable list @@ -2854,6 +2858,10 @@ paths: in: query schema: type: string + - name: path_start + in: query + schema: + type: string responses: "200": description: resource list @@ -6440,6 +6448,10 @@ paths: in: query schema: type: boolean + - name: path_start + in: query + schema: + type: string responses: "200": description: schedule list @@ -6917,6 +6929,8 @@ paths: properties: name: type: string + summary: + type: string owners: type: array items: @@ -6951,6 +6965,8 @@ paths: schema: type: object properties: + summary: + type: string owners: type: array items: @@ -9842,6 +9858,11 @@ components: type: object additionalProperties: type: boolean + created_by: + type: string + edited_at: + type: string + format: date-time required: - path - resource_type @@ -9875,6 +9896,11 @@ components: type: boolean account: type: number + created_by: + type: string + edited_at: + type: string + format: date-time required: - path - resource_type @@ -9892,6 +9918,11 @@ components: schema: {} description: type: string + created_by: + type: string + edited_at: + type: string + format: date-time required: - name @@ -10126,6 +10157,13 @@ components: type: object additionalProperties: type: boolean + summary: + type: string + created_by: + type: string + edited_at: + type: string + format: date-time required: - name - owners diff --git a/backend/windmill-api/src/apps.rs b/backend/windmill-api/src/apps.rs index 8601483fe6..522c16263b 100644 --- a/backend/windmill-api/src/apps.rs +++ b/backend/windmill-api/src/apps.rs @@ -279,6 +279,14 @@ async fn list_apps( sqlb.and_where_is_not_null("favorite.path"); } + if let Some(path_start) = &lq.path_start { + sqlb.and_where_like_left("app.path", path_start); + } + + if let Some(path_exact) = &lq.path_exact { + sqlb.and_where_eq("app.path", "?".bind(path_exact)); + } + let sql = sqlb.sql().map_err(|e| Error::InternalErr(e.to_string()))?; let mut tx = user_db.begin(&authed).await?; let rows = sqlx::query_as::<_, ListableApp>(&sql) diff --git a/backend/windmill-api/src/flows.rs b/backend/windmill-api/src/flows.rs index 1d666a786a..dd3cbb3cbd 100644 --- a/backend/windmill-api/src/flows.rs +++ b/backend/windmill-api/src/flows.rs @@ -143,10 +143,10 @@ async fn list_flows( sqlb.and_where_eq("archived", lq.show_archived.unwrap_or(false)); if let Some(ps) = &lq.path_start { - sqlb.and_where_like_left("path", "?".bind(ps)); + sqlb.and_where_like_left("o.path", ps); } if let Some(p) = &lq.path_exact { - sqlb.and_where_eq("path", "?".bind(p)); + sqlb.and_where_eq("o.path", "?".bind(p)); } if let Some(cb) = &lq.edited_by { sqlb.and_where_eq("edited_by", "?".bind(cb)); diff --git a/backend/windmill-api/src/folders.rs b/backend/windmill-api/src/folders.rs index 6b9f905ca4..fef5b7fe07 100644 --- a/backend/windmill-api/src/folders.rs +++ b/backend/windmill-api/src/folders.rs @@ -56,11 +56,15 @@ pub struct Folder { pub display_name: String, pub owners: Vec, pub extra_perms: serde_json::Value, + pub summary: Option, + pub created_by: Option, + pub edited_at: Option>, } #[derive(Deserialize)] pub struct NewFolder { pub name: String, + pub summary: Option, pub display_name: Option, pub owners: Option>, pub extra_perms: Option, @@ -68,6 +72,7 @@ pub struct NewFolder { #[derive(Deserialize)] pub struct UpdateFolder { + pub summary: Option, pub display_name: Option, pub owners: Option>, pub extra_perms: Option, @@ -90,7 +95,7 @@ async fn list_folders( let rows = sqlx::query_as!( Folder, - "SELECT workspace_id, name, display_name, owners, extra_perms FROM folder WHERE workspace_id = $1 ORDER BY name desc LIMIT $2 OFFSET $3", + "SELECT workspace_id, name, display_name, owners, extra_perms, summary, created_by, edited_at FROM folder WHERE workspace_id = $1 ORDER BY name desc LIMIT $2 OFFSET $3", w_id, per_page as i64, offset as i64 @@ -199,12 +204,14 @@ async fn create_folder( sqlx::query_as!( Folder, - "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, $2, $3, $4, $5)", + "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, summary, created_by, edited_at) VALUES ($1, $2, $3, $4, $5, $6, $7, now())", w_id, ng.name, ng.display_name.unwrap_or(ng.name.clone()), &owners, extra_perms, + ng.summary, + authed.username ) .execute(&mut *tx) .await?; @@ -283,6 +290,12 @@ async fn update_folder( sqlb.set("display_name", "?".bind(&display_name)); } + if let Some(summary) = ng.summary { + sqlb.set("summary", "?".bind(&summary)); + } + + sqlb.set("edited_at", "now()"); + if !authed.is_admin { let prefixed_username = format!("u/{}", authed.username); if ng.owners.as_ref().is_some_and(|x| { @@ -380,7 +393,7 @@ pub async fn get_folderopt<'c>( ) -> Result> { let folderopt = sqlx::query_as!( Folder, - "SELECT workspace_id, name, display_name, owners, extra_perms FROM folder WHERE name = $1 AND workspace_id = $2", + "SELECT workspace_id, name, display_name, owners, extra_perms, summary, created_by, edited_at FROM folder WHERE name = $1 AND workspace_id = $2", name, w_id ) diff --git a/backend/windmill-api/src/raw_apps.rs b/backend/windmill-api/src/raw_apps.rs index 35f3b9d708..20da51f3c7 100644 --- a/backend/windmill-api/src/raw_apps.rs +++ b/backend/windmill-api/src/raw_apps.rs @@ -102,6 +102,14 @@ async fn list_apps( sqlb.and_where_is_not_null("favorite.path"); } + if let Some(path_start) = &lq.path_start { + sqlb.and_where_like_left("app.path", path_start); + } + + if let Some(path_exact) = &lq.path_exact { + sqlb.and_where_eq("app.path", "?".bind(path_exact)); + } + let sql = sqlb.sql().map_err(|e| Error::InternalErr(e.to_string()))?; let mut tx = user_db.begin(&authed).await?; let rows = sqlx::query_as::<_, ListableApp>(&sql) diff --git a/backend/windmill-api/src/resources.rs b/backend/windmill-api/src/resources.rs index b2a1e76419..b8b03d0259 100644 --- a/backend/windmill-api/src/resources.rs +++ b/backend/windmill-api/src/resources.rs @@ -69,6 +69,8 @@ pub struct ResourceType { pub name: String, pub schema: Option, pub description: Option, + pub created_by: Option, + pub edited_at: Option>, } #[derive(Deserialize)] @@ -92,6 +94,8 @@ pub struct Resource { pub description: Option, pub resource_type: String, pub extra_perms: serde_json::Value, + pub created_by: Option, + pub edited_at: Option>, } #[derive(FromRow, Serialize, Deserialize)] @@ -102,6 +106,8 @@ pub struct ListableResource { pub description: Option, pub resource_type: String, pub extra_perms: serde_json::Value, + pub created_by: Option, + pub edited_at: Option>, pub is_linked: Option, pub is_refreshed: Option, pub is_oauth: Option, @@ -128,6 +134,7 @@ struct EditResource { pub struct ListResourceQuery { resource_type: Option, resource_type_exclude: Option, + path_start: Option, } #[derive(Serialize, FromRow)] @@ -209,6 +216,8 @@ async fn list_resources( "variable.is_oauth", "variable.account", "account.refresh_error", + "resource.created_by", + "resource.edited_at", ]) .left() .join("variable") @@ -241,6 +250,10 @@ async fn list_resources( } } + if let Some(path_start) = &lq.path_start { + sqlb.and_where_like_left("resource.path", path_start); + } + let sql = sqlb.sql().map_err(|e| Error::InternalErr(e.to_string()))?; let mut tx = user_db.begin(&authed).await?; let rows = sqlx::query_as::<_, ListableResource>(&sql) @@ -642,14 +655,15 @@ async fn create_resource( sqlx::query!( "INSERT INTO resource - (workspace_id, path, value, description, resource_type) - VALUES ($1, $2, $3, $4, $5) ON CONFLICT (workspace_id, path) - DO UPDATE SET value = $3, description = $4, resource_type = $5", + (workspace_id, path, value, description, resource_type, created_by, edited_at) + VALUES ($1, $2, $3, $4, $5, $6, now()) ON CONFLICT (workspace_id, path) + DO UPDATE SET value = $3, description = $4, resource_type = $5, edited_at = now()", w_id, resource.path, raw_json as sqlx::types::Json<&RawValue>, resource.description, resource.resource_type, + authed.username ) .execute(&mut *tx) .await?; @@ -772,6 +786,8 @@ async fn update_resource( sqlb.set_str("description", ndesc); } + sqlb.set_str("edited_at", "now()"); + sqlb.returning("path"); let authed = maybe_refresh_folders(path, &w_id, authed, &db).await; @@ -853,7 +869,7 @@ async fn update_resource_value( let mut tx = user_db.begin(&authed).await?; sqlx::query!( - "UPDATE resource SET value = $1 WHERE path = $2 AND workspace_id = $3", + "UPDATE resource SET value = $1, edited_at = now() WHERE path = $2 AND workspace_id = $3", nv.value, path, w_id @@ -979,12 +995,13 @@ async fn create_resource_type( sqlx::query!( "INSERT INTO resource_type - (workspace_id, name, schema, description) - VALUES ($1, $2, $3, $4)", + (workspace_id, name, schema, description, created_by, edited_at) + VALUES ($1, $2, $3, $4, $5, now())", w_id, resource_type.name, resource_type.schema, resource_type.description, + authed.username ) .execute(&mut *tx) .await?; @@ -1120,6 +1137,7 @@ async fn update_resource_type( if let Some(ndesc) = ns.description { sqlb.set_str("description", ndesc); } + sqlb.set_str("edited_at", "now()"); let sql = sqlb.sql().map_err(|e| Error::InternalErr(e.to_string()))?; let mut tx = user_db.begin(&authed).await?; diff --git a/backend/windmill-api/src/schedule.rs b/backend/windmill-api/src/schedule.rs index a62926c9e9..24a4d4e924 100644 --- a/backend/windmill-api/src/schedule.rs +++ b/backend/windmill-api/src/schedule.rs @@ -313,6 +313,7 @@ pub struct ListScheduleQuery { pub path: Option, pub is_flow: Option, pub args: Option, + pub path_start: Option, } async fn list_schedule( @@ -339,6 +340,9 @@ async fn list_schedule( if let Some(args) = &lsq.args { sqlb.and_where("args @> ?".bind(&args.replace("'", "''"))); } + if let Some(path_start) = &lsq.path_start { + sqlb.and_where_like_left("path", path_start); + } let sql = sqlb.sql().map_err(|e| Error::InternalErr(e.to_string()))?; let rows = sqlx::query_as::<_, Schedule>(&sql) .fetch_all(&mut *tx) diff --git a/backend/windmill-api/src/scripts.rs b/backend/windmill-api/src/scripts.rs index 1db7cdb7c7..c883359e24 100644 --- a/backend/windmill-api/src/scripts.rs +++ b/backend/windmill-api/src/scripts.rs @@ -242,10 +242,10 @@ async fn list_scripts( sqlb.and_where_eq("archived", false); } if let Some(ps) = &lq.path_start { - sqlb.and_where_like_left("path", "?".bind(ps)); + sqlb.and_where_like_left("o.path", ps); } if let Some(p) = &lq.path_exact { - sqlb.and_where_eq("path", "?".bind(p)); + sqlb.and_where_eq("o.path", "?".bind(p)); } if let Some(cb) = &lq.created_by { sqlb.and_where_eq("created_by", "?".bind(cb)); diff --git a/backend/windmill-api/src/variables.rs b/backend/windmill-api/src/variables.rs index a55ba71b81..f5907653e4 100644 --- a/backend/windmill-api/src/variables.rs +++ b/backend/windmill-api/src/variables.rs @@ -81,10 +81,16 @@ async fn list_contextual_variables( )) } +#[derive(Deserialize)] +struct ListVariableQuery { + path_start: Option, +} + async fn list_variables( authed: ApiAuthed, Extension(user_db): Extension, Path(w_id): Path, + Query(lq): Query, ) -> JsonResult> { let mut tx = user_db.begin(&authed).await?; @@ -97,10 +103,13 @@ async fn list_variables( from variable LEFT JOIN account ON variable.account = account.id AND account.workspace_id = $1 LEFT JOIN resource ON resource.path = variable.path AND resource.workspace_id = $1 - WHERE variable.workspace_id = $1 AND variable.path NOT LIKE 'u/' || $2 || '/secret_arg/%' ORDER BY path", + WHERE variable.workspace_id = $1 AND variable.path NOT LIKE 'u/' || $2 || '/secret_arg/%' + AND variable.path LIKE $3 || '%' + ORDER BY path", ) .bind(&w_id) .bind(&authed.username) + .bind(&lq.path_start.unwrap_or_default()) .fetch_all(&mut *tx) .await?; @@ -523,7 +532,7 @@ async fn update_variable( } sqlx::query!( - "UPDATE resource SET path = $1, value = $2 WHERE path = $3 AND workspace_id = $4", + "UPDATE resource SET path = $1, value = $2, edited_at = now() WHERE path = $3 AND workspace_id = $4", npath, v, path, diff --git a/backend/windmill-api/src/workspaces.rs b/backend/windmill-api/src/workspaces.rs index 5687c8a18b..0dff176ff5 100644 --- a/backend/windmill-api/src/workspaces.rs +++ b/backend/windmill-api/src/workspaces.rs @@ -1605,29 +1605,33 @@ async fn create_workspace( .await?; sqlx::query!( - "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, 'app_themes', 'App Themes', ARRAY[]::TEXT[], '{\"g/all\": false}') ON CONFLICT DO NOTHING", + "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at) VALUES ($1, 'app_themes', 'App Themes', ARRAY[]::TEXT[], '{\"g/all\": false}', $2, now()) ON CONFLICT DO NOTHING", nw.id, + username, ) .execute(&mut *tx) .await?; sqlx::query!( - "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, 'app_custom', 'App Custom Components', ARRAY[]::TEXT[], '{\"g/all\": false}') ON CONFLICT DO NOTHING", + "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at) VALUES ($1, 'app_custom', 'App Custom Components', ARRAY[]::TEXT[], '{\"g/all\": false}', $2, now()) ON CONFLICT DO NOTHING", nw.id, + username, ) .execute(&mut *tx) .await?; sqlx::query!( - "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms) VALUES ($1, 'app_groups', 'App Groups', ARRAY[]::TEXT[], '{\"g/all\": false}') ON CONFLICT DO NOTHING", + "INSERT INTO folder (workspace_id, name, display_name, owners, extra_perms, created_by, edited_at) VALUES ($1, 'app_groups', 'App Groups', ARRAY[]::TEXT[], '{\"g/all\": false}', $2, now()) ON CONFLICT DO NOTHING", nw.id, + username, ) .execute(&mut *tx) .await?; sqlx::query!( - "INSERT INTO resource (workspace_id, path, value, description, resource_type) VALUES ($1, 'f/app_themes/theme_0', '{\"name\": \"Default Theme\", \"value\": \"\"}', 'The default app theme', 'app_theme') ON CONFLICT DO NOTHING", + "INSERT INTO resource (workspace_id, path, value, description, resource_type, created_by, edited_at) VALUES ($1, 'f/app_themes/theme_0', '{\"name\": \"Default Theme\", \"value\": \"\"}', 'The default app theme', 'app_theme', $2, now()) ON CONFLICT DO NOTHING", nw.id, + username, ) .execute(&mut *tx) .await?; diff --git a/backend/windmill-common/src/apps.rs b/backend/windmill-common/src/apps.rs index 14d47dfdd4..26218c6c66 100644 --- a/backend/windmill-common/src/apps.rs +++ b/backend/windmill-common/src/apps.rs @@ -11,4 +11,6 @@ use serde::Deserialize; #[derive(Deserialize)] pub struct ListAppQuery { pub starred_only: Option, + pub path_exact: Option, + pub path_start: Option, } diff --git a/backend/windmill-worker/src/common.rs b/backend/windmill-worker/src/common.rs index 95f4759400..31322bfc92 100644 --- a/backend/windmill-worker/src/common.rs +++ b/backend/windmill-worker/src/common.rs @@ -1568,13 +1568,14 @@ pub async fn save_in_cache( if let Err(e) = sqlx::query!( "INSERT INTO resource - (workspace_id, path, value, resource_type) - VALUES ($1, $2, $3, $4) ON CONFLICT (workspace_id, path) - DO UPDATE SET value = $3", + (workspace_id, path, value, resource_type, created_by, edited_at) + VALUES ($1, $2, $3, $4, $5, now()) ON CONFLICT (workspace_id, path) + DO UPDATE SET value = $3, edited_at = now()", job.workspace_id, cached_path, raw_json as sqlx::types::Json, - "cache" + "cache", + job.created_by ) .execute(db) .await diff --git a/frontend/src/lib/assets/app.css b/frontend/src/lib/assets/app.css index 4a58b1c648..0744e287f6 100644 --- a/frontend/src/lib/assets/app.css +++ b/frontend/src/lib/assets/app.css @@ -94,18 +94,6 @@ .Template-editor span.mtk20 { color: black !important; } - - ::-webkit-scrollbar { - width: 9px; - height: 9px; - } - ::-webkit-scrollbar-track { - background: transparent; - } - ::-webkit-scrollbar-thumb { - background-color: rgba(155, 155, 155, 0.5); - border: transparent; - } } @layer components { diff --git a/frontend/src/lib/components/FolderEditor.svelte b/frontend/src/lib/components/FolderEditor.svelte index 13479f2356..ae18a29080 100644 --- a/frontend/src/lib/components/FolderEditor.svelte +++ b/frontend/src/lib/components/FolderEditor.svelte @@ -16,6 +16,9 @@ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' import Section from './Section.svelte' import { Eye, Plus } from 'lucide-svelte' + import Label from './Label.svelte' + import { sendUserToast } from '$lib/toast' + import { createEventDispatcher } from 'svelte' export let name: string let can_write = false @@ -67,6 +70,7 @@ async function loadFolder(): Promise { try { folder = await FolderService.getFolder({ workspace: $workspaceStore!, name }) + summary = folder.summary ?? '' can_write = $userStore != undefined && (folder?.owners.includes('u/' + $userStore.username) || @@ -108,6 +112,7 @@ let ownerKind: 'user' | 'group' = 'user' let groupCreated: string | undefined = undefined let newGroupName: string = '' + let summary: string = '' async function addGroup() { await GroupService.createGroup({ @@ -119,6 +124,19 @@ loadGroups() ownerItem = newGroupName } + + const dispatch = createEventDispatcher() + + async function updateFolder() { + await FolderService.updateFolder({ + workspace: $workspaceStore ?? '', + name, + requestBody: { summary } + }) + sendUserToast('Folder summary updated') + dispatch('update') + loadFolder() + } @@ -148,6 +166,15 @@ +
+ +
+
{#if can_write} diff --git a/frontend/src/lib/components/GroupEditor.svelte b/frontend/src/lib/components/GroupEditor.svelte index bef8712cb3..7b7c5f067c 100644 --- a/frontend/src/lib/components/GroupEditor.svelte +++ b/frontend/src/lib/components/GroupEditor.svelte @@ -9,7 +9,6 @@ import { userStore, workspaceStore } from '$lib/stores' import AutoComplete from 'simple-svelte-autocomplete' import { createEventDispatcher } from 'svelte' - import autosize from '$lib/autosize' import { Button } from './common' import Skeleton from './common/skeleton/Skeleton.svelte' import TableCustom from './TableCustom.svelte' @@ -17,6 +16,8 @@ import { canWrite } from '$lib/utils' import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte' import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte' + import Section from './Section.svelte' + import Label from './Label.svelte' export let name: string let can_write = false @@ -27,6 +28,7 @@ let members: { member_name: string; role: Role }[] | undefined = undefined let usernames: string[] | undefined = [] let username: string = '' + let summary = '' const dispatch = createEventDispatcher() @@ -78,9 +80,11 @@ role: getRole(x) } }) + summary = group.summary ?? '' } catch (e) { can_write = false members = [] + summary = '' group = { name } @@ -101,37 +105,28 @@ } -
-

{name}

- {#if group} -
-