From a6fc5720d427e38ee5017994fa398f3e22a3ba2d Mon Sep 17 00:00:00 2001 From: Chris Kruining Date: Mon, 21 Oct 2024 16:25:57 +0200 Subject: [PATCH] made a start on the logic for saving files --- bun.lockb | Bin 323006 -> 323364 bytes package.json | 1 + src/features/file/grid.tsx | 7 ++- src/routes/(editor)/edit.tsx | 111 +++++++++++++++++++++++++++++++---- src/utilities.ts | 23 +++++--- 5 files changed, 121 insertions(+), 21 deletions(-) diff --git a/bun.lockb b/bun.lockb index 5791086428adf0bacf238f1ccce35d207550aa2e..e30b90b9acfbf97417d2b35bfeec504dacb50ff5 100644 GIT binary patch delta 55858 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 { } type Rows = Map>; export interface GridContextType { + readonly rows: Accessor>>; readonly mutations: Accessor; readonly selection: Accessor; mutate(prop: string, lang: string, value: string): void; } export interface GridApi { + readonly rows: Accessor>>; readonly mutations: Accessor; selectAll(): void; clear(): void; @@ -37,6 +39,7 @@ const GridProvider: ParentComponent<{ rows: Rows }> = (props) => { }); const mutations = createMemo(() => deepDiff(state.snapshot, state.rows).toArray()); + const rows = createMemo(() => Object.fromEntries(Object.entries(state.rows).map(([key, row]) => [key, unwrap(row)] as const))); createEffect(() => { setState('rows', Object.fromEntries(deepCopy(props.rows).entries())); @@ -48,6 +51,7 @@ const GridProvider: ParentComponent<{ rows: Rows }> = (props) => { }); const ctx: GridContextType = { + rows, mutations, selection, @@ -105,6 +109,7 @@ const Api: Component<{ api: undefined | ((api: GridApi) => any) }> = (props) => const selectionContext = useSelection(); const api: GridApi = { + rows: gridContext.rows, mutations: gridContext.mutations, selectAll() { selectionContext.selectAll(); diff --git a/src/routes/(editor)/edit.tsx b/src/routes/(editor)/edit.tsx index e024112..c06189d 100644 --- a/src/routes/(editor)/edit.tsx +++ b/src/routes/(editor)/edit.tsx @@ -1,12 +1,13 @@ -import { Menu } from "~/features/menu"; +import { children, createEffect, createMemo, createResource, createSignal, onMount, ParentProps } from "solid-js"; +import { MutarionKind, splitAt } from "~/utilities"; import { Sidebar } from "~/components/sidebar"; -import { Component, createEffect, createMemo, createResource, createSignal, onMount, ParentComponent, ParentProps } from "solid-js"; +import { emptyFolder, FolderEntry, walk as fileTreeWalk, Tree, FileEntry, Entry } from "~/components/filetree"; +import { Menu } from "~/features/menu"; import { Grid, load, useFiles } from "~/features/file"; import { Command, Context, createCommand, Modifier, noop } from "~/features/command"; import { GridApi } from "~/features/file/grid"; -import { emptyFolder, FolderEntry, walk as fileTreeWalk, Tree, FileEntry } from "~/components/filetree"; import css from "./edit.module.css"; -import { splitAt } from "~/utilities"; +import { match } from "ts-pattern"; async function* walk(directory: FileSystemDirectoryHandle, path: string[] = []): AsyncGenerator<{ id: string, handle: FileSystemFileHandle, path: string[], lang: string, entries: Map }, void, never> { for await (const handle of directory.values()) { @@ -31,13 +32,31 @@ async function* walk(directory: FileSystemDirectoryHandle, path: string[] = []): } }; +function* breadthFirstTraverse(subject: FolderEntry): Generator<{ path: string[] } & Entry, void, unknown> { + const queue: ({ path: string[] } & Entry)[] = subject.entries.map(e => ({ path: [], ...e })); + + while (queue.length > 0) { + const entry = queue.shift()!; + + yield entry; + + if (entry.kind === 'folder') { + queue.push(...entry.entries.map(e => ({ path: [...entry.path, entry.name], ...e }))); + } + } +} + +const findFile = (folder: FolderEntry, id: string) => { + return breadthFirstTraverse(folder).find((entry): entry is { path: string[] } & FileEntry => entry.kind === 'file' && entry.id === id); +} + export default function Edit(props: ParentProps) { const filesContext = useFiles(); const [root, { mutate, refetch }] = createResource(() => filesContext?.get('root')); const [tree, setFiles] = createSignal(emptyFolder); const [columns, setColumns] = createSignal([]); const [rows, setRows] = createSignal>>(new Map); - const [entries, setEntries] = createSignal>>(new Map); + const [entries, setEntries] = createSignal>>(new Map); const [api, setApi] = createSignal(); const mutatedFiles = createMemo(() => { @@ -50,7 +69,7 @@ export default function Edit(props: ParentProps) { return files.get(key)?.[lang]?.id; }) - .filter(Boolean) + .filter(file => file !== undefined) ); }); @@ -88,10 +107,6 @@ export default function Edit(props: ParentProps) { } }); - createEffect(() => { - mutatedFiles() - }); - const commands = { open: createCommand('open', async () => { const [fileHandle] = await window.showOpenFilePicker({ @@ -118,7 +133,81 @@ export default function Edit(props: ParentProps) { mutate(directory); }), save: createCommand('save', () => { - console.log('save'); + const mutations = api()?.mutations() ?? []; + + if (mutations.length === 0) { + return; + } + + const rows = api()?.rows() ?? {}; + const _entries = entries(); + + // Cases we can encounter: + // | | file extsis | no existing file | + // |---------|---------------------------|----------------------! + // | created | insert new key into file | create new file | + // | updated | update value | create new file (*1) | + // | deleted | remove key from file (*3) | no-op/skip (*2)(*3) | + // + // 1) This can happen if the key already exists in another language (so when adding a new language for example). + // 2) The same as with 1, when you delete a key, and there are not files for each language, then this is a valid case. + // 3) When a file has 0 keys, we can remove it. + + for (const mutation of mutations) { + const [key, lang] = splitAt(mutation.key, mutation.key.lastIndexOf('.')); + const entry = _entries.get(key); + const localEntry = entry?.[lang]; + + console.log(entry, localEntry); + + // TODO :: this is not really a matrix, we should resolve the file when one does not exist + // + // happy path :: When we do have both an entry and localEntry and the localEntry has an id and that file is found + + // | | entry | localEntry | id | file | + // |---|-------!------------|----!------! + // | 1 | x | x | x | x | + // | 2 | x | x | x | | + // | 3 | x | x | | | + // | 4 | x | | | | + // | 5 | | | | | + + if (!localEntry) { + throw new Error('invalid edge case???'); + } + + const file = findFile(tree(), localEntry.id); + const fileExists = file !== undefined; + + console.log(key, file?.path.join('.')); + + const fileLocalKey = key.slice(file?.path.join('.')); + + const result = match([fileExists, mutation.kind]) + .with([true, MutarionKind.Create], () => ({ action: MutarionKind.Create, key, value: rows[key][lang], file: file?.meta })) + .with([false, MutarionKind.Create], () => '2') + .with([true, MutarionKind.Update], () => ({ action: MutarionKind.Update, key, value: rows[key][lang], file: file?.meta })) + .with([false, MutarionKind.Update], () => '4') + .with([true, MutarionKind.Delete], () => ({ action: MutarionKind.Delete, key, file: file?.meta })) + .with([false, MutarionKind.Delete], () => '6') + .exhaustive(); + + console.log(mutation, key, lang, entry, file, result); + } + + // for (const fileId of files) { + // const { path, meta } = findFile(tree(), fileId) ?? {}; + + // console.log(fileId, path, meta, entries()); + + // // TODO + // // - find file handle + // // - prepare data + // // -- clone entries map (so that order is preserved) + // // -- apply mutations + // // -- convert key to file local (ergo, remove the directory path prefix) + // // - write data to file + // } }, { key: 's', modifier: Modifier.Control }), saveAs: createCommand('save as', (handle?: FileSystemFileHandle) => { console.log('save as ...', handle); diff --git a/src/utilities.ts b/src/utilities.ts index 697fbc0..d0e988d 100644 --- a/src/utilities.ts +++ b/src/utilities.ts @@ -41,10 +41,15 @@ export const deepCopy = (original: T): T => { ) as T; } -type Added = { kind: 'added', value: any }; -type Updated = { kind: 'updated', value: any, original: any }; -type Removed = { kind: 'removed' }; -export type Mutation = { key: string } & (Added | Updated | Removed); +export enum MutarionKind { + Create = 'created', + Update = 'updated', + Delete = 'deleted', +} +type Created = { kind: MutarionKind.Create, value: any }; +type Updated = { kind: MutarionKind.Update, value: any, original: any }; +type Deleted = { kind: MutarionKind.Delete }; +export type Mutation = { key: string } & (Created | Updated | Deleted); export function* deepDiff(a: T1, b: T2, path: string[] = []): Generator { if (!isIterable(a) || !isIterable(b)) { @@ -59,14 +64,14 @@ export function* deepDiff(a: T1, b: T2, pa } if (!keyA && keyB) { - yield { key: path.concat(keyB.toString()).join('.'), kind: 'added', value: valueB }; + yield { key: path.concat(keyB.toString()).join('.'), kind: MutarionKind.Create, value: valueB }; continue; } if (keyA && !keyB) { // value was added - yield { key: path.concat(keyA.toString()).join('.'), kind: 'removed' }; + yield { key: path.concat(keyA.toString()).join('.'), kind: MutarionKind.Delete }; continue; } @@ -84,10 +89,10 @@ export function* deepDiff(a: T1, b: T2, pa const key = path.concat(keyA!.toString()).join('.'); yield ((): Mutation => { - if (valueA === null || valueA === undefined) return { key, kind: 'added', value: valueB }; - if (valueB === null || valueB === undefined) return { key, kind: 'removed' }; + if (valueA === null || valueA === undefined) return { key, kind: MutarionKind.Create, value: valueB }; + if (valueB === null || valueB === undefined) return { key, kind: MutarionKind.Delete }; - return { key, kind: 'updated', value: valueB, original: valueA }; + return { key, kind: MutarionKind.Update, value: valueB, original: valueA }; })(); } };