2025-10-09 15:48:23 +02:00
|
|
|
<script lang="ts">
|
|
|
|
import EditWindow from "filesystem/edit_window/EditWindow.svelte";
|
|
|
|
import type { FSNavigator } from "filesystem/FSNavigator";
|
|
|
|
import Button from "layout/Button.svelte";
|
|
|
|
import Dialog from "layout/Dialog.svelte";
|
2025-10-10 00:12:14 +02:00
|
|
|
import { bookmark_add, bookmark_del, bookmarks_store, is_bookmark } from "lib/Bookmarks";
|
2025-10-14 00:03:48 +02:00
|
|
|
import { fs_delete, type FSNode } from "lib/FilesystemAPI.svelte";
|
2025-10-13 23:20:42 +02:00
|
|
|
import { loading_finish, loading_start } from "lib/Loading";
|
2025-10-09 15:48:23 +02:00
|
|
|
import { tick } from "svelte";
|
|
|
|
|
2025-10-13 16:05:50 +02:00
|
|
|
let {
|
|
|
|
nav,
|
|
|
|
edit_window
|
|
|
|
}: {
|
|
|
|
nav: FSNavigator;
|
|
|
|
edit_window: EditWindow;
|
|
|
|
} = $props();
|
|
|
|
|
|
|
|
let dialog: Dialog = $state()
|
|
|
|
let node: FSNode = $state(null)
|
2025-10-09 15:48:23 +02:00
|
|
|
|
|
|
|
export const open = async (n: FSNode, target: EventTarget) => {
|
|
|
|
node = n
|
2025-10-13 23:20:42 +02:00
|
|
|
let el: HTMLElement = (target as Element).closest("button")
|
|
|
|
if (el === null) {
|
|
|
|
el = (target as Element).closest("a")
|
|
|
|
}
|
2025-10-09 15:48:23 +02:00
|
|
|
|
|
|
|
// Wait for the view to update, so the dialog gets the proper measurements
|
|
|
|
await tick()
|
2025-10-13 23:20:42 +02:00
|
|
|
dialog.open(el.getBoundingClientRect())
|
|
|
|
}
|
|
|
|
|
|
|
|
const delete_node = async () => {
|
|
|
|
try {
|
|
|
|
loading_start()
|
|
|
|
await fs_delete(node.path)
|
|
|
|
nav.reload()
|
|
|
|
} catch (err) {
|
|
|
|
alert(JSON.stringify(err))
|
|
|
|
} finally {
|
|
|
|
loading_finish()
|
|
|
|
}
|
2025-10-09 15:48:23 +02:00
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<Dialog bind:this={dialog}>
|
|
|
|
<div class="menu">
|
2025-10-14 00:03:48 +02:00
|
|
|
<Button click={() => {dialog.close(); node.download()}} icon="save" label="Download"/>
|
2025-10-10 00:12:14 +02:00
|
|
|
{#if node !== null && is_bookmark($bookmarks_store, node.id)}
|
2025-10-09 15:48:23 +02:00
|
|
|
<Button click={() => {dialog.close(); bookmark_del(node.id)}} icon="bookmark_remove" label="Remove bookmark"/>
|
|
|
|
{:else}
|
2025-10-10 00:12:14 +02:00
|
|
|
<Button click={() => {dialog.close(); bookmark_add(node)}} icon="bookmark_add" label="Add bookmark"/>
|
2025-10-09 15:48:23 +02:00
|
|
|
{/if}
|
|
|
|
{#if $nav.permissions.write}
|
2025-10-13 23:20:42 +02:00
|
|
|
<Button click={() => {dialog.close(); delete_node()}} icon="delete" label="Delete"/>
|
2025-10-09 15:48:23 +02:00
|
|
|
<Button click={() => {dialog.close(); edit_window.edit(node, false, "file")}} icon="edit" label="Edit"/>
|
|
|
|
<Button click={() => {dialog.close(); edit_window.edit(node, false, "share")}} icon="share" label="Share"/>
|
|
|
|
<Button click={() => {dialog.close(); edit_window.edit(node, false, "branding")}} icon="palette" label="Branding"/>
|
|
|
|
{/if}
|
|
|
|
</div>
|
|
|
|
</Dialog>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.menu {
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
max-width: 20em;
|
|
|
|
}
|
|
|
|
</style>
|