diff --git a/frontend/src/lib/cache.ts b/frontend/src/lib/cache.ts index 634e6aa..2fe0ab1 100644 --- a/frontend/src/lib/cache.ts +++ b/frontend/src/lib/cache.ts @@ -45,7 +45,7 @@ class AssetCache { * @param path The key to store the entry under * @param value The entry */ - async set(path: string, value: CacheEntry) { + set(path: string, value: CacheEntry) { // evict the least recently used item if necessary if (this.values.size >= this.maxEntries) { const keyToDelete = this.values.keys().next().value; @@ -55,6 +55,17 @@ class AssetCache { this.values.set(path, value); } + /** + * Remove the specified item from cache. + * + * This operation is **not write-through**, so changes + * are not synced to the backend. + * @param path + */ + delete(path: string) { + this.values.delete(path) + } + /** * Completely empty the cache of all entries. */ diff --git a/frontend/src/lib/components/ConfirmationDialogue.svelte b/frontend/src/lib/components/ConfirmationDialogue.svelte new file mode 100644 index 0000000..1e3bec5 --- /dev/null +++ b/frontend/src/lib/components/ConfirmationDialogue.svelte @@ -0,0 +1,87 @@ + + + +
+
+
+ +
+
+ + +
+
+ + diff --git a/frontend/src/lib/components/Editor.svelte b/frontend/src/lib/components/Editor.svelte index 6512852..4279cec 100644 --- a/frontend/src/lib/components/Editor.svelte +++ b/frontend/src/lib/components/Editor.svelte @@ -63,7 +63,9 @@ } currentFile.subscribe(async (v) => { - editorText = (await cache.get(v)) ?? ''; + if (v !== '') { + editorText = (await cache.get(v)) ?? ''; + } }); const unsubscribe = currentFile.subscribe(async (file) => { diff --git a/frontend/src/lib/components/FileNavigation.svelte b/frontend/src/lib/components/FileNavigation.svelte index 49f9446..1fc84d8 100644 --- a/frontend/src/lib/components/FileNavigation.svelte +++ b/frontend/src/lib/components/FileNavigation.svelte @@ -4,6 +4,7 @@ import { currentFile } from '$lib/main'; import { cache } from '$lib/cache'; import { get } from 'svelte/store'; + import ConfirmationDialogue from './ConfirmationDialogue.svelte'; interface INode { name: string; children: INode[]; @@ -13,12 +14,15 @@ export let children: INode[] = []; export let indent = 1; export let path = name; + export let siblings: INode[] | undefined = undefined; + let self: HTMLElement; let selected = false; let open = false; let showOptionsMenu = false; let optionsMenu: HTMLDivElement; let showNewFileInput = false; let newFileInput: HTMLInputElement; + let showDeleteFileDialogue = false; const dispatch = createEventDispatcher(); @@ -51,9 +55,28 @@ newFileInput.setSelectionRange(0, 0); newFileInput.focus(); } - - + async function deleteDocumentHandler() { + showOptionsMenu = false; + if (get(currentFile) === path) { + currentFile.set(''); + } + if (siblings !== undefined) { + // siblings.filter((n) => n.name !== name); + const entryToRemove = siblings.findIndex(n => n.name === name); + console.log(siblings.splice(entryToRemove, 1)); + } + // TODO: requisite backend work, eg create DELETE + // handler for documents. + + // While a re-render would happen when the directory + // is closed and re-opened, I nuke the current element here + // because I don't know how else to make it happen immediately + self.remove(); + console.log(`Document "${path}" would be deleted`); + } + + - {#if showNewFileInput} {#if children.length > 0} -