diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index 51b74c1c0e..c9cd1e1eea 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -48,16 +48,16 @@ export let app: App export let path: string - export let initialMode: EditorMode = 'dnd' export let policy: Policy export let summary: string export let fromHub: boolean = false + export let versions: number[] migrateApp(app) const appStore = writable(app) const selectedComponent = writable(undefined) - const mode = writable(initialMode) + const mode = writable('dnd') const breakpoint = writable('lg') const summaryStore = writable(summary) const connectingInput = writable({ @@ -205,9 +205,7 @@ {#if !$userStore?.operator} {#if $appStore} - {#if initialMode !== 'preview'} - - {/if} + {#if $mode === 'preview'} diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte index 60339f4a5e..fa8ac1161b 100644 --- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte @@ -17,7 +17,13 @@ import { AppService, DraftService, Job, Policy } from '$lib/gen' import { redo, undo } from '$lib/history' import { workspaceStore } from '$lib/stores' - import { faClipboard, faFileExport, faSave, faSlidersH } from '@fortawesome/free-solid-svg-icons' + import { + faClipboard, + faFileExport, + faHistory, + faSave, + faSlidersH + } from '@fortawesome/free-solid-svg-icons' import { AlignHorizontalSpaceAround, Bug, @@ -52,6 +58,7 @@ import Tooltip from '$lib/components/Tooltip.svelte' import { Sha256 } from '@aws-crypto/sha256-js' import { sendUserToast } from '$lib/toast' + import DeploymentHistory from './DeploymentHistory.svelte' async function hash(message) { try { @@ -72,6 +79,7 @@ export let policy: Policy export let fromHub: boolean = false + export let versions: number[] const { app, @@ -111,6 +119,7 @@ let saveDrawerOpen = false let jobsDrawerOpen = false let inputsDrawerOpen = fromHub + let historyBrowserDrawerOpen = false function closeSaveDrawer() { saveDrawerOpen = false @@ -514,6 +523,12 @@ + + historyBrowserDrawerOpen}> + + + + { + historyBrowserDrawerOpen = true + } + }, { displayName: 'JSON', icon: faFileExport, diff --git a/frontend/src/lib/components/apps/editor/AppPreview.svelte b/frontend/src/lib/components/apps/editor/AppPreview.svelte index d9f1822ddc..a81e1b549a 100644 --- a/frontend/src/lib/components/apps/editor/AppPreview.svelte +++ b/frontend/src/lib/components/apps/editor/AppPreview.svelte @@ -22,14 +22,15 @@ import { deepEqual } from 'fast-equals' import { dfs } from './appUtils' import { BG_PREFIX, migrateApp } from '../utils' + import { workspaceStore } from '$lib/stores' export let app: App - export let appPath: string - export let breakpoint: Writable - export let policy: Policy - export let summary: string - export let workspace: string - export let isEditor: boolean + export let appPath: string = '' + export let breakpoint: Writable = writable('lg') + export let policy: Policy = {} + export let summary: string = '' + export let workspace: string = $workspaceStore! + export let isEditor: boolean = false export let context: Record export let noBackend: boolean = false export let isLocked = false diff --git a/frontend/src/lib/components/apps/editor/DeploymentHistory.svelte b/frontend/src/lib/components/apps/editor/DeploymentHistory.svelte new file mode 100644 index 0000000000..692637081e --- /dev/null +++ b/frontend/src/lib/components/apps/editor/DeploymentHistory.svelte @@ -0,0 +1,78 @@ + + + + + +
+ {#if versions.length > 0} +
+ {#each reversedVersions ?? [] as version} + +
(selectedVersion = version)} + > + {version} +
+ {/each} +
+ {:else} +
No items
+ {/if} +
+
+
+ +
+ {#if selectedVersion} + {#if selected} +
+

Deployed {displayDate(selected.created_at)} by {selected.created_by}

+
+ + +
+
+ + {:else} + + {/if} + {:else} +
Select a deployment version to see its details
+ {/if} +
+
+
diff --git a/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte b/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte index 69cbab9dac..1145f8e18d 100644 --- a/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte @@ -14,6 +14,7 @@ let nodraft = $page.url.searchParams.get('nodraft') const hubId = $page.url.searchParams.get('hub') const templatePath = $page.url.searchParams.get('template') + const templateId = $page.url.searchParams.get('template_id') const importJson = $importStore if ($importStore) { @@ -63,6 +64,14 @@ value = template.value sendUserToast('App loaded from template') goto('?', { replaceState: true }) + } else if (templateId) { + const template = await AppService.getAppByVersion({ + workspace: $workspaceStore!, + id: parseInt(templateId) + }) + value = template.value + sendUserToast('App loaded from template') + goto('?', { replaceState: true }) } else if (hubId) { const hub = await AppService.getHubAppById({ id: Number(hubId) }) value = { @@ -99,7 +108,7 @@ {#if value}
{#key value} - + {/key}
{/if} diff --git a/frontend/src/routes/(root)/(logged)/apps/edit/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/apps/edit/[...path]/+page.svelte index 56053f748a..672b56dde6 100644 --- a/frontend/src/routes/(root)/(logged)/apps/edit/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/apps/edit/[...path]/+page.svelte @@ -77,7 +77,18 @@ {#key redraw} {#if app}
- + { + sendUserToast('App restored from previous deployment') + app = e.detail + redraw++ + }} + versions={app.versions} + summary={app.summary} + app={app.value} + path={app.path} + policy={app.policy} + />
{/if} {/key}