{ setTheme(priorDarkMode) }} /> {#if $appPath == ''} closeDraftDrawer()}> Choose a path to save the initial draft of the app.

Summary

{ if ($appPath == '' && $summary?.length > 0 && !dirtyPath) { path?.setName( $summary .toLowerCase() .replace(/[^a-z0-9_]/g, '_') .replace(/-+/g, '_') .replace(/^-|-$/g, '') ) } }} />
{/if} closeSaveDrawer()}> {#if !onLatest} By deploying, you may overwrite changes made by other users. Press 'Deploy' to see diff.
{/if} Summary
{ if ($appPath == '' && $summary?.length > 0 && !dirtyPath) { path?.setName( $summary .toLowerCase() .replace(/[^a-z0-9_]/g, '_') .replace(/-+/g, '_') .replace(/^-|-$/g, '') ) } }} />
Deployment message
Path
{#if $appPath == ''} Save this app once before you can publish it {:else} A viewer of the app will execute the runnables of the app on behalf of the publisher (you) It ensures that all required resources/runnable visible for publisher but not for viewer at time of creating the app would prevent the execution of the app. To guarantee tight security, a policy is computed at time of deployment of the app which only allow the scripts/flows referred to in the app to be called on behalf of. Furthermore, static parameters are not overridable. Hence, users will only be able to use the app as intended by the publisher without risk for leaking resources not used in the app.

Public URL

{ policy.execution_mode = e.detail ? 'anonymous' : 'publisher' setPublishState() }} />
Public URL
{#if secretUrl} {@const href = `${window.location.origin}${base}/public/${$workspaceStore}/${secretUrl}`} {:else} {/if}
Share this url directly or embed it using an iframe (if requiring login, top-level domain of embedding app must be the same as the one of Windmill)
{#if !$enterpriseLicense} Custom path is an enterprise only feature.
{:else if !($userStore?.is_admin || $userStore?.is_super_admin)} Custom path can only be set by workspace admins
{/if} { customPath = detail ? '' : undefined }} checked={customPath !== undefined} options={{ right: 'Use a custom URL' }} disabled={!$enterpriseLicense || !($userStore?.is_admin || $userStore?.is_super_admin)} /> {#if customPath !== undefined}
Custom path
{ dirtyCustomPath = true }} />
Custom public URL
{dirtyCustomPath ? customPathError : ''}
{/if}
You will still need to deploy the app to make visible the latest changes Embed this app in your own product to be used by your own users {/if} (inputsDrawerOpen = false)}> (historyBrowserDrawerOpen = false)}> (debugAppDrawerOpen = false)}> { $jobsDrawerOpen = false }} tooltip="Look at latests runs to spot potential bugs." documentationLink="https://www.windmill.dev/docs/apps/app_debugging" >
{#if $jobs.length > 0}
{#each $jobs ?? [] as id} {@const selectedJob = $jobsById[id]} {#if selectedJob}
{ selectedJobId = id rightColumnSelect = 'detail' }} > {truncateRev(selectedJob.job, 20)} {selectedJob.component}
{/if} {/each}
{:else}
No items
{/if}
Timeline Details
{#if rightColumnSelect == 'timeline'}
{:else if rightColumnSelect == 'detail'}
{#if selectedJobId} {#if selectedJobId?.includes('Frontend')} {@const jobResult = $jobsById[selectedJobId]} {#if jobResult?.error !== undefined}
{:else if jobResult !== undefined}
{:else} {/if} {:else}
{#if job?.['running']}
{/if} {#if job?.args}
{/if} {#if job?.raw_code}
{/if} {#if job?.job_kind !== 'flow' && job?.job_kind !== 'flowpreview'} {@const jobResult = $jobsById[selectedJobId]} {#if job != undefined && 'result' in job && job.result != undefined}
{:else if testIsLoading}
{:else if job != undefined && 'result' in job && job?.['result'] == undefined}
Result is undefined
{:else}
{/if}
{#if jobResult?.transformer}
Transformer results
{#if job != undefined && 'result' in job && job.result != undefined}
{:else if testIsLoading}
{:else if job != undefined && 'result' in job && job?.['result'] == undefined}
Result is undefined
{:else}
{/if}
{/if}
{:else}
{ job = detail }} />
{/if}
{/if} {:else}
Select a job to see its details
{/if}
{/if}
{#if hasErrors} {/if}
{ $app = undo(history, $app) }} on:redo={() => { $app = redo(history) }} /> {#if $app} {/if} {#if $app} { setTheme(e.detail) }} bind:selected={$app.darkMode} > {/if}
{#if $breakpoint === 'sm'} {/if}
{#if $mode !== 'preview'}
{/if} {#if $enterpriseLicense && $appPath != ''} {/if}
{#each moreItems as item}
{item.displayName}
{/each}