diff --git a/backend/.sqlx/query-1c472a4740a41ae8985f865e15b0c4edb4d5af2281c22955121cb794428c3cde.json b/backend/.sqlx/query-1c472a4740a41ae8985f865e15b0c4edb4d5af2281c22955121cb794428c3cde.json new file mode 100644 index 0000000000..4dbd7ef8da --- /dev/null +++ b/backend/.sqlx/query-1c472a4740a41ae8985f865e15b0c4edb4d5af2281c22955121cb794428c3cde.json @@ -0,0 +1,70 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n workspace.id AS \"id!\",\n workspace.name AS \"name!\",\n workspace.owner AS \"owner!\",\n workspace.deleted AS \"deleted!\",\n workspace.premium AS \"premium!\",\n workspace_settings.color AS \"color\",\n workspace.parent_workspace_id AS \"parent_workspace_id\",\n workspace.is_dev_workspace AS \"is_dev_workspace!\",\n workspace.dev_workspace_label AS \"dev_workspace_label\"\n FROM workspace\n LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id\n WHERE workspace.id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id!", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "name!", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "owner!", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "deleted!", + "type_info": "Bool" + }, + { + "ordinal": 4, + "name": "premium!", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "color", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "parent_workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "is_dev_workspace!", + "type_info": "Bool" + }, + { + "ordinal": 8, + "name": "dev_workspace_label", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + true, + false, + true + ] + }, + "hash": "1c472a4740a41ae8985f865e15b0c4edb4d5af2281c22955121cb794428c3cde" +} diff --git a/backend/.sqlx/query-4f266373d5acdbcedc81e8ed3eb1fb95861ef17ca5570ef06b9903f04e9adb5e.json b/backend/.sqlx/query-4f266373d5acdbcedc81e8ed3eb1fb95861ef17ca5570ef06b9903f04e9adb5e.json new file mode 100644 index 0000000000..922a187344 --- /dev/null +++ b/backend/.sqlx/query-4f266373d5acdbcedc81e8ed3eb1fb95861ef17ca5570ef06b9903f04e9adb5e.json @@ -0,0 +1,70 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT workspace.id, workspace.name, workspace.owner, workspace.deleted, workspace.premium, workspace_settings.color, workspace.parent_workspace_id, workspace.is_dev_workspace, workspace.dev_workspace_label\n FROM workspace\n LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id\n JOIN usr ON usr.workspace_id = workspace.id\n WHERE usr.email = $1 AND workspace.deleted = false", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "owner", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "deleted", + "type_info": "Bool" + }, + { + "ordinal": 4, + "name": "premium", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "color", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "parent_workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "is_dev_workspace", + "type_info": "Bool" + }, + { + "ordinal": 8, + "name": "dev_workspace_label", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + true, + false, + true + ] + }, + "hash": "4f266373d5acdbcedc81e8ed3eb1fb95861ef17ca5570ef06b9903f04e9adb5e" +} diff --git a/backend/.sqlx/query-8c33cbe3dc0a7539835fab61f981f5117da38c3410ad6e34ad67f5441deaf89e.json b/backend/.sqlx/query-8c33cbe3dc0a7539835fab61f981f5117da38c3410ad6e34ad67f5441deaf89e.json new file mode 100644 index 0000000000..ab72d4040a --- /dev/null +++ b/backend/.sqlx/query-8c33cbe3dc0a7539835fab61f981f5117da38c3410ad6e34ad67f5441deaf89e.json @@ -0,0 +1,71 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n workspace.id AS \"id!\",\n workspace.name AS \"name!\",\n workspace.owner AS \"owner!\",\n workspace.deleted AS \"deleted!\",\n workspace.premium AS \"premium!\",\n workspace_settings.color AS \"color\",\n workspace.parent_workspace_id AS \"parent_workspace_id\",\n workspace.is_dev_workspace AS \"is_dev_workspace!\",\n workspace.dev_workspace_label AS \"dev_workspace_label\"\n FROM workspace\n LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id\n LIMIT $1 OFFSET $2", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id!", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "name!", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "owner!", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "deleted!", + "type_info": "Bool" + }, + { + "ordinal": 4, + "name": "premium!", + "type_info": "Bool" + }, + { + "ordinal": 5, + "name": "color", + "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "parent_workspace_id", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "is_dev_workspace!", + "type_info": "Bool" + }, + { + "ordinal": 8, + "name": "dev_workspace_label", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [ + "Int8", + "Int8" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + true, + false, + true + ] + }, + "hash": "8c33cbe3dc0a7539835fab61f981f5117da38c3410ad6e34ad67f5441deaf89e" +} diff --git a/backend/windmill-api-workspaces/src/workspaces.rs b/backend/windmill-api-workspaces/src/workspaces.rs index 2af59a3eeb..3a1dbc5a1b 100644 --- a/backend/windmill-api-workspaces/src/workspaces.rs +++ b/backend/windmill-api-workspaces/src/workspaces.rs @@ -247,6 +247,8 @@ struct Workspace { premium: bool, color: Option, parent_workspace_id: Option, + is_dev_workspace: bool, + dev_workspace_label: Option, } #[derive(FromRow, Serialize, Debug)] @@ -749,7 +751,7 @@ async fn list_workspaces( let mut tx = user_db.begin(&authed).await?; let workspaces = sqlx::query_as!( Workspace, - "SELECT workspace.id, workspace.name, workspace.owner, workspace.deleted, workspace.premium, workspace_settings.color, workspace.parent_workspace_id + "SELECT workspace.id, workspace.name, workspace.owner, workspace.deleted, workspace.premium, workspace_settings.color, workspace.parent_workspace_id, workspace.is_dev_workspace, workspace.dev_workspace_label FROM workspace LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id JOIN usr ON usr.workspace_id = workspace.id @@ -4827,7 +4829,9 @@ async fn get_workspace_as_superadmin( workspace.deleted AS \"deleted!\", workspace.premium AS \"premium!\", workspace_settings.color AS \"color\", - workspace.parent_workspace_id AS \"parent_workspace_id\" + workspace.parent_workspace_id AS \"parent_workspace_id\", + workspace.is_dev_workspace AS \"is_dev_workspace!\", + workspace.dev_workspace_label AS \"dev_workspace_label\" FROM workspace LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id WHERE workspace.id = $1", @@ -4861,7 +4865,9 @@ async fn list_workspaces_as_super_admin( workspace.deleted AS \"deleted!\", workspace.premium AS \"premium!\", workspace_settings.color AS \"color\", - workspace.parent_workspace_id AS \"parent_workspace_id\" + workspace.parent_workspace_id AS \"parent_workspace_id\", + workspace.is_dev_workspace AS \"is_dev_workspace!\", + workspace.dev_workspace_label AS \"dev_workspace_label\" FROM workspace LEFT JOIN workspace_settings ON workspace.id = workspace_settings.workspace_id LIMIT $1 OFFSET $2", @@ -5966,7 +5972,14 @@ async fn clone_scripts( .execute(&mut **tx) .await?; - clear_orphaned_compat_address(tx, "script", "hash", source_workspace_id, target_workspace_id).await?; + clear_orphaned_compat_address( + tx, + "script", + "hash", + source_workspace_id, + target_workspace_id, + ) + .await?; Ok(()) } @@ -6204,7 +6217,8 @@ async fn clone_flows( .execute(&mut **tx) .await?; - clear_orphaned_compat_address(tx, "flow", "path", source_workspace_id, target_workspace_id).await?; + clear_orphaned_compat_address(tx, "flow", "path", source_workspace_id, target_workspace_id) + .await?; // Then clone flow versions let flow_versions = sqlx::query!( diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 532b765375..533f0fd54b 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -30923,6 +30923,15 @@ components: parent_workspace_id: type: string nullable: true + deleted: + type: boolean + description: "Archived (soft-deleted) workspace" + is_dev_workspace: + type: boolean + dev_workspace_label: + type: string + nullable: true + description: "Cosmetic display label of the dev workspace ('dev' | 'staging'); null defaults to 'dev'" required: - id - name diff --git a/frontend/src/lib/components/ForkWorkspaceBanner.svelte b/frontend/src/lib/components/ForkWorkspaceBanner.svelte index 4a74d97241..4484ba088f 100644 --- a/frontend/src/lib/components/ForkWorkspaceBanner.svelte +++ b/frontend/src/lib/components/ForkWorkspaceBanner.svelte @@ -167,15 +167,21 @@ stays aligned with it instead of bleeding to the viewport edges. -->
-
-
- -
+ +
+
+ +
{isDevWorkspace ? `${devLabelWord(currentWorkspaceData?.dev_workspace_label)} workspace of` : 'Fork of'} - {parentWorkspaceData?.name} ({parentWorkspaceId}) + {parentWorkspaceData?.name}{#if parentWorkspaceData?.name !== parentWorkspaceId} + ({parentWorkspaceId}){/if}
@@ -186,7 +192,7 @@ {error} {:else if comparison} -
+
{#if comparison.summary.total_diffs > 0} {forkAheadBehindMessage( @@ -194,9 +200,14 @@ comparison.summary.total_behind )} {parentWorkspaceId} over {comparison - .summary.total_diffs} items: + .summary.total_diffs} items -
+ +