diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml
index 2fd1cbe946..b59bcc74ea 100644
--- a/backend/windmill-api/openapi.yaml
+++ b/backend/windmill-api/openapi.yaml
@@ -3947,7 +3947,7 @@ paths:
required: true
schema:
type: string
- enum: [script, group_, resource, schedule, variable, flow, folder]
+ enum: [script, group_, resource, schedule, variable, flow, folder, app]
responses:
"200":
description: acls
@@ -3972,7 +3972,7 @@ paths:
required: true
schema:
type: string
- enum: [script, group_, resource, schedule, variable, flow, folder]
+ enum: [script, group_, resource, schedule, variable, flow, folder, app]
requestBody:
description: acl to add
required: true
@@ -4008,7 +4008,7 @@ paths:
required: true
schema:
type: string
- enum: [script, group_, resource, schedule, variable, flow, folder]
+ enum: [script, group_, resource, schedule, variable, flow, folder, app]
requestBody:
description: acl to add
required: true
diff --git a/backend/windmill-api/src/apps.rs b/backend/windmill-api/src/apps.rs
index c3164bd456..8efe00370a 100644
--- a/backend/windmill-api/src/apps.rs
+++ b/backend/windmill-api/src/apps.rs
@@ -37,7 +37,7 @@ pub fn workspaced_service() -> Router {
.route("/list", get(list_apps))
.route("/get/p/*path", get(get_app))
.route("/get/v/*id", get(get_app_by_id))
- .route("/exists/*path", post(exists_app))
+ .route("/exists/*path", get(exists_app))
.route("/update/*path", post(update_app))
.route("/delete/*path", delete(delete_app))
.route("/create", post(create_app))
diff --git a/frontend/src/lib/components/MoveDrawer.svelte b/frontend/src/lib/components/MoveDrawer.svelte
index 75b0e2511d..d56d679696 100644
--- a/frontend/src/lib/components/MoveDrawer.svelte
+++ b/frontend/src/lib/components/MoveDrawer.svelte
@@ -5,7 +5,7 @@
import { Alert, Button, Drawer } from './common'
import DrawerContent from './common/drawer/DrawerContent.svelte'
import Path from './Path.svelte'
- import { FlowService, ScriptService } from '$lib/gen'
+ import { AppService, FlowService, ScriptService } from '$lib/gen'
const dispatch = createEventDispatcher()
@@ -25,7 +25,6 @@
drawer.openDrawer()
}
-
async function loadOwner() {
own = await isOwner(path, $userStore!, $workspaceStore!)
}
@@ -61,6 +60,14 @@
path
}
})
+ } else if (kind == 'app') {
+ await AppService.updateApp({
+ workspace: $workspaceStore!,
+ path: initialPath,
+ requestBody: {
+ path
+ }
+ })
}
dispatch('update', path)
drawer.closeDrawer()
diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte
index 98f6585824..4376b4710a 100644
--- a/frontend/src/lib/components/Path.svelte
+++ b/frontend/src/lib/components/Path.svelte
@@ -2,6 +2,7 @@
import { type Meta, pathToMeta } from '$lib/common'
import {
+ AppService,
FlowService,
FolderService,
GroupService,
@@ -151,6 +152,8 @@
})
} else if (kind == 'schedule') {
return await ScheduleService.existsSchedule({ workspace: $workspaceStore!, path: path })
+ } else if (kind == 'app') {
+ return await AppService.existsApp({ workspace: $workspaceStore!, path: path })
} else {
return false
}
@@ -237,7 +240,7 @@
>
-
diff --git a/frontend/src/lib/components/ShareModal.svelte b/frontend/src/lib/components/ShareModal.svelte
index 9ae96f78f0..3e551ad71a 100644
--- a/frontend/src/lib/components/ShareModal.svelte
+++ b/frontend/src/lib/components/ShareModal.svelte
@@ -13,7 +13,7 @@
const dispatch = createEventDispatcher()
- type Kind = 'script' | 'group_' | 'resource' | 'schedule' | 'variable' | 'flow'
+ type Kind = 'script' | 'group_' | 'resource' | 'schedule' | 'variable' | 'flow' | 'app'
let kind: Kind
let path: string = ''
diff --git a/frontend/src/lib/components/apps/CreateApp.svelte b/frontend/src/lib/components/apps/CreateApp.svelte
index 3a4d5e9f44..b44fafb9ab 100644
--- a/frontend/src/lib/components/apps/CreateApp.svelte
+++ b/frontend/src/lib/components/apps/CreateApp.svelte
@@ -51,7 +51,7 @@
- closeDrawer()}>
+ closeDrawer()}>
App permissions depend on their path. Select the group
all
diff --git a/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte b/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte
index 41b6729b8c..aaa4ec0611 100644
--- a/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte
+++ b/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte
@@ -25,7 +25,7 @@
diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte
index 2b04a2ab4d..07648ac333 100644
--- a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte
+++ b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte
@@ -33,6 +33,7 @@
await executeComponent()
}
}
+ executeComponent()
})
let pagePath = $page.params.path
diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
index 4b7ca5259d..26c9e7e36a 100644
--- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
+++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
@@ -12,6 +12,7 @@
faHand,
faMobileAlt
} from '@fortawesome/free-solid-svg-icons'
+ import { Eye, Laptop2, Pencil, PenTool, Smartphone } from 'lucide-svelte'
import { getContext } from 'svelte'
import { Icon } from 'svelte-awesome'
import { sendUserToast } from '../../../utils'
@@ -55,40 +56,37 @@
-
+
-
- Editor
+
-
- Preview
-
+ Preview
-
-
+
+
+
+
-
+ sendUserToast('Publishing apps publically at secret urls is coming soon')}
+ color="dark"
+ size="xs"
+ variant="border"
+ startIcon={{ icon: faExternalLink }}
+ >
Publish
Save
diff --git a/frontend/src/lib/components/apps/editor/GridEditor.svelte b/frontend/src/lib/components/apps/editor/GridEditor.svelte
index 6922ad0d53..2d4d00d0af 100644
--- a/frontend/src/lib/components/apps/editor/GridEditor.svelte
+++ b/frontend/src/lib/components/apps/editor/GridEditor.svelte
@@ -100,57 +100,52 @@
}
-
+
{$app.title}
{policy.execution_mode} mode {policy.on_behalf_of
- ? `on behalf of ${policy.on_behalf_of}`
- : ''}
{policy.on_behalf_of ? `on behalf of ${policy.on_behalf_of}` : ''}
-
selectComponent(detail.id)}
- gap={[4, 2]}
- >
- {#each $lazyGrid as gridComponent (gridComponent.id)}
- {#if gridComponent.data.id === dataItem.data.id}
-
-
- removeGridElement(gridComponent.data)}
- on:lock={() => {
- let fComponent = $app.grid.find((c) => c.id === gridComponent.id)
- if (fComponent) {
- fComponent = toggleFixed(fComponent)
- }
- }}
- />
-
- {/if}
- {/each}
-
+
+
selectComponent(detail.id)}
+ gap={[4, 2]}
+ >
+ {#each $lazyGrid as gridComponent (gridComponent.id)}
+ {#if gridComponent.data.id === dataItem.data.id}
+
+
+ removeGridElement(gridComponent.data)}
+ on:lock={() => {
+ let fComponent = $app.grid.find((c) => c.id === gridComponent.id)
+ if (fComponent) {
+ fComponent = toggleFixed(fComponent)
+ }
+ }}
+ />
+
+ {/if}
+ {/each}
+
+