Files
OSIT-AE-App-Svelte/src/routes/core/+layout.svelte
Scott Idem 34736c05a0 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 <noreply@anthropic.com>
2026-06-17 13:55:17 -04:00

102 lines
3.5 KiB
Svelte

<script lang="ts">
import { onMount } from 'svelte';
import { goto } from '$app/navigation';
import { ae_loc, ae_sess, ae_api, slct } from '$lib/stores/ae_stores';
import {
Building,
Database,
Globe,
History,
LayoutDashboard,
List,
Lock,
MapPin,
Phone,
ShieldCheck,
Users
} from '@lucide/svelte';
interface Props {
data: any;
children?: import('svelte').Snippet;
}
let { data, children }: Props = $props();
onMount(() => {
if (!$ae_loc.manager_access) {
// Wait for a second to see if the permissions load before redirecting.
setTimeout(() => {
if (!$ae_loc.manager_access) {
console.log('Access Denied to /core. Redirecting to home.');
goto('/');
}
}, 500);
}
});
</script>
<svelte:head>
<title>Core - {$ae_loc.title ?? 'Æ loading...'}</title>
</svelte:head>
<div
class="ae_core m-auto flex h-full max-h-full max-w-6xl flex-col gap-1 overflow-auto p-4">
{#if $ae_loc.manager_access}
<nav
class="border-surface-500/30 mb-6 flex flex-wrap gap-2 border-b pb-4">
<a href="/core" class="btn btn-sm preset-tonal-surface">
<LayoutDashboard size={14} class="mr-1" /> Dashboard
</a>
<a href="/core/accounts" class="btn btn-sm preset-tonal-primary">
<Building size={14} class="mr-1" /> Accounts
</a>
<a href="/core/sites" class="btn btn-sm preset-tonal-secondary">
<Globe size={14} class="mr-1" /> Sites
</a>
<a href="/core/users" class="btn btn-sm preset-tonal-error">
<ShieldCheck size={14} class="mr-1" /> Users
</a>
<a href="/core/people" class="btn btn-sm preset-tonal-warning">
<Users size={14} class="mr-1" /> People
</a>
<a
href="/core/activity_logs"
class="btn btn-sm preset-tonal-success">
<History size={14} class="mr-1" /> Logs
</a>
<a href="/core/addresses" class="btn btn-sm preset-tonal-surface">
<MapPin size={14} class="mr-1" /> Addresses
</a>
<a href="/core/contacts" class="btn btn-sm preset-tonal-surface">
<Phone size={14} class="mr-1" /> Contacts
</a>
<a href="/core/lookups" class="btn btn-sm preset-tonal-surface">
<List size={14} class="mr-1" /> Lookups
</a>
<a href="/core/data_stores" class="btn btn-sm preset-tonal-surface">
<Database size={14} class="mr-1" /> Data Stores
</a>
</nav>
<section class="main_content grow px-1 pb-28 md:px-2">
{@render children?.()}
</section>
{:else}
<section
class="flex grow flex-col items-center justify-center space-y-4 py-20 text-center">
<div class="bg-error-500/10 rounded-full p-6">
<Lock size={64} class="text-error-500" />
</div>
<h1 class="h1 font-black">Access Restricted</h1>
<p class="max-w-md opacity-70">
The area you are trying to access is reserved for system
managers. If you believe you should have access, please sign in
with an authorized account.
</p>
<div class="flex gap-4 pt-4">
<a href="/" class="btn preset-filled-primary font-bold"
>Return Home</a>
</div>
</section>
{/if}
</div>