From 34736c05a078722e13a3fd08b3f966f1d7f43e58 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 17 Jun 2026 13:55:17 -0400 Subject: [PATCH] feat(core): add Data Stores management page at /core/data_stores Full CRUD for all data_store records: search by code, account_id, for_type, for_id; create/edit/delete via modal with type-aware content editor (CodeMirror / TipTap / textarea). Wired into core nav and dashboard. for_id shown read-only on edit (DB integer FK constraint). Co-Authored-By: Claude Sonnet 4.6 --- src/routes/core/+layout.svelte | 4 + src/routes/core/+page.svelte | 23 + src/routes/core/data_stores/+page.svelte | 735 +++++++++++++++++++++++ src/routes/core/data_stores/+page.ts | 5 + 4 files changed, 767 insertions(+) create mode 100644 src/routes/core/data_stores/+page.svelte create mode 100644 src/routes/core/data_stores/+page.ts diff --git a/src/routes/core/+layout.svelte b/src/routes/core/+layout.svelte index ca532283..a19faf91 100644 --- a/src/routes/core/+layout.svelte +++ b/src/routes/core/+layout.svelte @@ -4,6 +4,7 @@ import { goto } from '$app/navigation'; import { ae_loc, ae_sess, ae_api, slct } from '$lib/stores/ae_stores'; import { Building, + Database, Globe, History, LayoutDashboard, @@ -71,6 +72,9 @@ onMount(() => { Lookups + + Data Stores +
diff --git a/src/routes/core/+page.svelte b/src/routes/core/+page.svelte index 7f0a6fb8..5ddfbdec 100644 --- a/src/routes/core/+page.svelte +++ b/src/routes/core/+page.svelte @@ -1,6 +1,7 @@ + +
+ + +
+
+
+ +
+
+

Data Stores

+

Content & Configuration Storage

+
+
+ +
+ + +
+
+ Filters +
+ +
+
+ + e.key === 'Enter' && do_search()} /> +
+
+ + e.key === 'Enter' && do_search()} /> +
+
+ + e.key === 'Enter' && do_search()} /> +
+
+ + e.key === 'Enter' && do_search()} /> +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + + {#if results.length > 0} +
+ + +
+ + {results.length} record{results.length !== 1 ? 's' : ''} + {#if results.length === page_limit} + (may be more — increase per-page or paginate) + {/if} + +
+ {#if page_offset > 0} + + {/if} + {#if results.length === page_limit} + + {/if} + +
+
+ +
+ + + + + + + + + + + + + + + {#each results as ds (ds.id ?? ds.data_store_id)} + open_edit(ds)}> + + + + + + + + + + {/each} + +
CodeNameTypeAccountFor
+ {ds.code} + {#if !ds.enable} + off + {/if} + {#if ds.hide} + hidden + {/if} + {ds.name ?? '—'} + {ds.type ?? '?'} + + {#if ds.account_id} + {ds.account_id.slice(0, 8)}… + {:else} + global + {/if} + + {#if ds.for_type} + {ds.for_type} + {#if ds.for_id} + / {ds.for_id.slice(0, 6)}… + {/if} + {:else} + — + {/if} + + +
+
+
+ + {:else if searched && !loading} +
+ +

No data stores found

+

Try different filters, or create one above.

+
+ + {:else if !searched} +
+ +

Enter filters and press Search, or just press Search to list all.

+
+ {/if} + +
+ + + + +
{ e.preventDefault(); handle_save(); }}> + + +
+ + +
+ + +
+ + +
+ + +
+ +
+ + For ID + — random string ID of parent + + {#if is_new} + + {:else} + +
+ {#if editing_obj?.for_id} + {editing_obj.for_id} + {:else} + not set + {/if} +
+

+ For ID is set at creation time. To change it, use phpMyAdmin (DB stores the integer FK). +

+ {/if} +
+
+ + +
+ + + + + +
+ + + + + +
+
+ Content + {#if draft_type === 'html'} +
+ + +
+ {/if} +
+ + {#if draft_type === 'html'} + {#if html_edit_mode === 'source'} + + {:else} + + {/if} + {:else if draft_type === 'json' || draft_type === 'sql' || draft_type === 'md'} + + {:else} + + {/if} +
+ + +
+ {#if !is_new} + + {:else} +
+ {/if} + +
+ + +
+
+ +
diff --git a/src/routes/core/data_stores/+page.ts b/src/routes/core/data_stores/+page.ts new file mode 100644 index 00000000..6dea6ed4 --- /dev/null +++ b/src/routes/core/data_stores/+page.ts @@ -0,0 +1,5 @@ +import type { PageLoad } from './$types'; + +export const load: PageLoad = async () => { + return {}; +};