Files
windmill/frontend/src/lib/components/common/table/RawAppRow.svelte
Henri Courdent d9fc36e58e Deploy UI warning update (#4601)
* Deploy UI warning update

* Harmonization icons

---------

Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
2024-11-03 02:53:40 +01:00

148 lines
4.1 KiB
Svelte

<script lang="ts">
import { base } from '$lib/base'
import Dropdown from '$lib/components/DropdownV2.svelte'
import type MoveDrawer from '$lib/components/MoveDrawer.svelte'
import SharedBadge from '$lib/components/SharedBadge.svelte'
import type ShareModal from '$lib/components/ShareModal.svelte'
import { RawAppService, type ListableRawApp } from '$lib/gen'
import { userStore, workspaceStore } from '$lib/stores'
import { createEventDispatcher } from 'svelte'
import Button from '../button/Button.svelte'
import Row from './Row.svelte'
import Drawer from '../drawer/Drawer.svelte'
import DrawerContent from '../drawer/DrawerContent.svelte'
import FileInput from '../fileInput/FileInput.svelte'
import { goto } from '$lib/navigation'
import type DeployWorkspaceDrawer from '$lib/components/DeployWorkspaceDrawer.svelte'
import { FolderOpen, Globe, Pen, Share, Trash } from 'lucide-svelte'
import { isDeployable } from '$lib/utils_deployable'
import { getDeployUiSettings } from '$lib/components/home/deploy_ui'
export let app: ListableRawApp & { canWrite: boolean }
export let marked: string | undefined
export let starred: boolean
export let shareModal: ShareModal
export let moveDrawer: MoveDrawer
export let deleteConfirmedCallback: (() => void) | undefined
export let deploymentDrawer: DeployWorkspaceDrawer
export let depth: number = 0
export let menuOpen: boolean = false
let updateAppDrawer: Drawer
const dispatch = createEventDispatcher()
</script>
{#if menuOpen}
<Drawer bind:this={updateAppDrawer} size="800px">
<DrawerContent title="Update app" on:close={() => updateAppDrawer?.toggleDrawer?.()}>
<FileInput
accept={'.js'}
multiple={false}
convertTo={'text'}
iconSize={24}
class="text-sm py-4"
on:change={async ({ detail }) => {
await RawAppService.updateRawApp({
workspace: $workspaceStore ?? '',
path: app.path,
requestBody: { value: detail?.[0] }
})
goto(`/apps/get_raw/${app.version + 1}/${app.path}`)
}}
/>
</DrawerContent>
</Drawer>
{/if}
<Row
href="{base}/apps/get_raw/{app.version}/{app.path}"
kind="raw_app"
{marked}
path={app.path}
summary={app.summary}
workspaceId={app.workspace_id ?? $workspaceStore ?? ''}
{starred}
on:change
canFavorite={true}
{depth}
>
<svelte:fragment slot="badges">
<SharedBadge canWrite={app.canWrite} extraPerms={app.extra_perms} />
</svelte:fragment>
<svelte:fragment slot="actions">
<span class="hidden md:inline-flex gap-x-1">
{#if !$userStore?.operator}
{#if app.canWrite}
<div>
<Button
color="light"
size="xs"
variant="border"
startIcon={{ icon: Pen }}
on:click={() => updateAppDrawer?.toggleDrawer?.()}
>
Edit
</Button>
</div>
{/if}
{/if}
</span>
<Dropdown
items={async () => {
let { summary, path, canWrite } = app
return [
{
displayName: 'Move/Rename',
icon: FolderOpen,
action: () => {
moveDrawer.openDrawer(path, summary, 'raw_app')
},
disabled: !canWrite
},
...(isDeployable('app', path, await getDeployUiSettings())
? [
{
displayName: 'Deploy to prod/staging',
icon: Globe,
action: () => {
deploymentDrawer.openDrawer(path, 'raw_app')
}
}
]
: []),
{
displayName: canWrite ? 'Share' : 'See Permissions',
icon: Share,
action: () => {
shareModal.openDrawer && shareModal.openDrawer(path, 'raw_app')
}
},
{
displayName: 'Delete',
icon: Trash,
action: async (event) => {
// TODO
// @ts-ignore
if (event?.shiftKey) {
await RawAppService.deleteRawApp({ workspace: $workspaceStore ?? '', path })
dispatch('change')
} else {
deleteConfirmedCallback = async () => {
await RawAppService.deleteRawApp({ workspace: $workspaceStore ?? '', path })
dispatch('change')
}
}
},
type: 'delete',
disabled: !canWrite
}
]
}}
on:open={() => {
menuOpen = true
}}
/>
</svelte:fragment>
</Row>