@svadmin/lite 0.3.6 → 0.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -13
- package/dist/components/LiteAlert.svelte +19 -0
- package/dist/components/LiteAlert.svelte.d.ts +11 -0
- package/dist/components/LiteArrayField.svelte +60 -0
- package/dist/components/LiteArrayField.svelte.d.ts +17 -0
- package/dist/components/LiteArrayItem.svelte +146 -0
- package/dist/components/LiteArrayItem.svelte.d.ts +13 -0
- package/dist/components/LiteAuditLog.svelte +104 -0
- package/dist/components/LiteAuditLog.svelte.d.ts +23 -0
- package/dist/components/LiteBreadcrumbs.svelte +39 -0
- package/dist/components/LiteBreadcrumbs.svelte.d.ts +16 -0
- package/dist/components/LiteChatDialog.svelte +101 -0
- package/dist/components/LiteChatDialog.svelte.d.ts +20 -0
- package/dist/components/LiteConfirmDialog.svelte +60 -0
- package/dist/components/LiteConfirmDialog.svelte.d.ts +22 -0
- package/dist/components/LiteEmptyState.svelte +39 -0
- package/dist/components/LiteEmptyState.svelte.d.ts +16 -0
- package/dist/components/LiteForm.svelte +165 -0
- package/dist/components/LiteForm.svelte.d.ts +26 -0
- package/dist/components/LiteLayout.svelte +147 -0
- package/dist/components/LiteLayout.svelte.d.ts +19 -0
- package/dist/components/LiteLogin.svelte +41 -0
- package/dist/components/LiteLogin.svelte.d.ts +8 -0
- package/dist/components/LitePagination.svelte +73 -0
- package/dist/components/LitePagination.svelte.d.ts +11 -0
- package/dist/components/LitePermissionMatrix.svelte +147 -0
- package/dist/components/LitePermissionMatrix.svelte.d.ts +32 -0
- package/dist/components/LiteSearch.svelte +41 -0
- package/dist/components/LiteSearch.svelte.d.ts +9 -0
- package/dist/components/LiteShow.svelte +61 -0
- package/dist/components/LiteShow.svelte.d.ts +14 -0
- package/dist/components/LiteShowField.svelte +62 -0
- package/dist/components/LiteShowField.svelte.d.ts +12 -0
- package/dist/components/LiteStatsCard.svelte +70 -0
- package/dist/components/LiteStatsCard.svelte.d.ts +24 -0
- package/dist/components/LiteTable.svelte +132 -0
- package/dist/components/LiteTable.svelte.d.ts +19 -0
- package/dist/components/LiteTabs.svelte +57 -0
- package/dist/components/LiteTabs.svelte.d.ts +16 -0
- package/dist/components/advanced/LiteAutoSaveIndicator.svelte +26 -0
- package/dist/components/advanced/LiteAutoSaveIndicator.svelte.d.ts +12 -0
- package/dist/components/advanced/LiteDraggableHeader.svelte +33 -0
- package/dist/components/advanced/LiteDraggableHeader.svelte.d.ts +15 -0
- package/dist/components/advanced/LiteDrawerForm.svelte +42 -0
- package/dist/components/advanced/LiteDrawerForm.svelte.d.ts +16 -0
- package/dist/components/advanced/LiteInlineEdit.svelte +32 -0
- package/dist/components/advanced/LiteInlineEdit.svelte.d.ts +15 -0
- package/dist/components/advanced/LiteModalForm.svelte +44 -0
- package/dist/components/advanced/LiteModalForm.svelte.d.ts +17 -0
- package/dist/components/advanced/LiteToast.svelte +34 -0
- package/dist/components/advanced/LiteToast.svelte.d.ts +14 -0
- package/dist/components/advanced/LiteUndoableNotification.svelte +25 -0
- package/dist/components/advanced/LiteUndoableNotification.svelte.d.ts +13 -0
- package/dist/components/advanced/LiteVirtualTable.svelte +44 -0
- package/dist/components/advanced/LiteVirtualTable.svelte.d.ts +20 -0
- package/dist/components/advanced/index.js +8 -0
- package/dist/components/buttons/LiteCloneButton.svelte +33 -0
- package/dist/components/buttons/LiteCloneButton.svelte.d.ts +11 -0
- package/dist/components/buttons/LiteCreateButton.svelte +31 -0
- package/dist/components/buttons/LiteCreateButton.svelte.d.ts +10 -0
- package/dist/components/buttons/LiteDeleteButton.svelte +57 -0
- package/dist/components/buttons/LiteDeleteButton.svelte.d.ts +12 -0
- package/dist/components/buttons/LiteEditButton.svelte +33 -0
- package/dist/components/buttons/LiteEditButton.svelte.d.ts +11 -0
- package/dist/components/buttons/LiteExportButton.svelte +31 -0
- package/dist/components/buttons/LiteExportButton.svelte.d.ts +10 -0
- package/dist/components/buttons/LiteImportButton.svelte +50 -0
- package/dist/components/buttons/LiteImportButton.svelte.d.ts +10 -0
- package/dist/components/buttons/LiteListButton.svelte +31 -0
- package/dist/components/buttons/LiteListButton.svelte.d.ts +10 -0
- package/dist/components/buttons/LiteRefreshButton.svelte +34 -0
- package/dist/components/buttons/LiteRefreshButton.svelte.d.ts +8 -0
- package/dist/components/buttons/LiteSaveButton.svelte +27 -0
- package/dist/components/buttons/LiteSaveButton.svelte.d.ts +8 -0
- package/dist/components/buttons/LiteShowButton.svelte +33 -0
- package/dist/components/buttons/LiteShowButton.svelte.d.ts +11 -0
- package/dist/components/buttons/index.js +10 -0
- package/dist/components/fields/LiteBooleanField.svelte +42 -0
- package/dist/components/fields/LiteBooleanField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteDateField.svelte +51 -0
- package/dist/components/fields/LiteDateField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteEmailField.svelte +41 -0
- package/dist/components/fields/LiteEmailField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteFileField.svelte +59 -0
- package/dist/components/fields/LiteFileField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteImageField.svelte +57 -0
- package/dist/components/fields/LiteImageField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteJsonField.svelte +43 -0
- package/dist/components/fields/LiteJsonField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteMarkdownField.svelte +33 -0
- package/dist/components/fields/LiteMarkdownField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteMultiSelectField.svelte +57 -0
- package/dist/components/fields/LiteMultiSelectField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteNumberField.svelte +35 -0
- package/dist/components/fields/LiteNumberField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteRelationField.svelte +67 -0
- package/dist/components/fields/LiteRelationField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteRichTextField.svelte +44 -0
- package/dist/components/fields/LiteRichTextField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteSelectField.svelte +47 -0
- package/dist/components/fields/LiteSelectField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteTagField.svelte +44 -0
- package/dist/components/fields/LiteTagField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteTextField.svelte +35 -0
- package/dist/components/fields/LiteTextField.svelte.d.ts +10 -0
- package/dist/components/fields/LiteUrlField.svelte +52 -0
- package/dist/components/fields/LiteUrlField.svelte.d.ts +10 -0
- package/dist/components/fields/index.js +15 -0
- package/dist/components/layout/LiteAuthenticated.svelte +23 -0
- package/dist/components/layout/LiteAuthenticated.svelte.d.ts +10 -0
- package/dist/components/layout/LiteCanAccess.svelte +27 -0
- package/dist/components/layout/LiteCanAccess.svelte.d.ts +10 -0
- package/dist/components/layout/LiteCatchAllNavigate.svelte +20 -0
- package/dist/components/layout/LiteCatchAllNavigate.svelte.d.ts +7 -0
- package/dist/components/layout/LiteErrorBoundary.svelte +20 -0
- package/dist/components/layout/LiteErrorBoundary.svelte.d.ts +13 -0
- package/dist/components/layout/LiteErrorComponent.svelte +37 -0
- package/dist/components/layout/LiteErrorComponent.svelte.d.ts +9 -0
- package/dist/components/layout/LiteHeader.svelte +19 -0
- package/dist/components/layout/LiteHeader.svelte.d.ts +8 -0
- package/dist/components/layout/LiteNavigateToResource.svelte +25 -0
- package/dist/components/layout/LiteNavigateToResource.svelte.d.ts +7 -0
- package/dist/components/layout/LiteSidebar.svelte +93 -0
- package/dist/components/layout/LiteSidebar.svelte.d.ts +12 -0
- package/dist/components/layout/index.js +8 -0
- package/dist/components/pages/LiteCreatePage.svelte +39 -0
- package/dist/components/pages/LiteCreatePage.svelte.d.ts +10 -0
- package/dist/components/pages/LiteEditPage.svelte +54 -0
- package/dist/components/pages/LiteEditPage.svelte.d.ts +12 -0
- package/dist/components/pages/LiteForgotPasswordPage.svelte +60 -0
- package/dist/components/pages/LiteForgotPasswordPage.svelte.d.ts +11 -0
- package/dist/components/pages/LiteListPage.svelte +81 -0
- package/dist/components/pages/LiteListPage.svelte.d.ts +20 -0
- package/dist/components/pages/LiteProfilePage.svelte +61 -0
- package/dist/components/pages/LiteProfilePage.svelte.d.ts +14 -0
- package/dist/components/pages/LiteRegisterPage.svelte +63 -0
- package/dist/components/pages/LiteRegisterPage.svelte.d.ts +10 -0
- package/dist/components/pages/LiteShowPage.svelte +61 -0
- package/dist/components/pages/LiteShowPage.svelte.d.ts +11 -0
- package/dist/components/pages/LiteUpdatePasswordPage.svelte +51 -0
- package/dist/components/pages/LiteUpdatePasswordPage.svelte.d.ts +9 -0
- package/dist/components/pages/index.js +8 -0
- package/dist/components/widgets/LiteAnomalyBadge.svelte +40 -0
- package/dist/components/widgets/LiteAnomalyBadge.svelte.d.ts +15 -0
- package/dist/components/widgets/LiteBarChart.svelte +45 -0
- package/dist/components/widgets/LiteBarChart.svelte.d.ts +17 -0
- package/dist/components/widgets/LiteInsightCard.svelte +31 -0
- package/dist/components/widgets/LiteInsightCard.svelte.d.ts +13 -0
- package/dist/components/widgets/LiteLineChart.svelte +48 -0
- package/dist/components/widgets/LiteLineChart.svelte.d.ts +17 -0
- package/dist/components/widgets/LitePieChart.svelte +44 -0
- package/dist/components/widgets/LitePieChart.svelte.d.ts +17 -0
- package/dist/components/widgets/index.js +5 -0
- package/dist/enhance.js +112 -0
- package/dist/index.d.ts +27 -0
- package/{src/index.ts → dist/index.js} +3 -26
- package/dist/lite.css +817 -0
- package/dist/schema-generator.d.ts +29 -0
- package/dist/schema-generator.js +226 -0
- package/dist/security.d.ts +14 -0
- package/dist/security.js +59 -0
- package/dist/server-adapter.d.ts +111 -0
- package/dist/server-adapter.js +422 -0
- package/package.json +55 -18
- package/src/schema-generator.ts +0 -147
- package/src/server-adapter.ts +0 -307
- /package/{src/components/advanced/index.ts → dist/components/advanced/index.d.ts} +0 -0
- /package/{src/components/buttons/index.ts → dist/components/buttons/index.d.ts} +0 -0
- /package/{src/components/fields/index.ts → dist/components/fields/index.d.ts} +0 -0
- /package/{src/components/layout/index.ts → dist/components/layout/index.d.ts} +0 -0
- /package/{src/components/pages/index.ts → dist/components/pages/index.d.ts} +0 -0
- /package/{src/components/widgets/index.ts → dist/components/widgets/index.d.ts} +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* SSR Error Boundary.
|
|
4
|
+
* Since native Svelte <svelte:boundary> relies on CSR to catch JS exceptions,
|
|
5
|
+
* this component delegates error handling upstream to the SvelteKit +error.svelte mechanism.
|
|
6
|
+
* In CSR disabled environments, returning just the slot is standard practice.
|
|
7
|
+
*/
|
|
8
|
+
import type { Snippet } from 'svelte';
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
children?: Snippet;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let { children }: Props = $props();
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<!-- The error interception must be handled by the backend SSR framework (e.g. SvelteKit) -->
|
|
18
|
+
{#if children}
|
|
19
|
+
{@render children()}
|
|
20
|
+
{/if}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSR Error Boundary.
|
|
3
|
+
* Since native Svelte <svelte:boundary> relies on CSR to catch JS exceptions,
|
|
4
|
+
* this component delegates error handling upstream to the SvelteKit +error.svelte mechanism.
|
|
5
|
+
* In CSR disabled environments, returning just the slot is standard practice.
|
|
6
|
+
*/
|
|
7
|
+
import type { Snippet } from 'svelte';
|
|
8
|
+
interface Props {
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
}
|
|
11
|
+
declare const LiteErrorBoundary: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type LiteErrorBoundary = ReturnType<typeof LiteErrorBoundary>;
|
|
13
|
+
export default LiteErrorBoundary;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { AlertTriangle } from '@lucide/svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
title?: string;
|
|
7
|
+
message?: string;
|
|
8
|
+
code?: string | number;
|
|
9
|
+
homeUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let {
|
|
13
|
+
title = 'An error occurred',
|
|
14
|
+
message = 'Something went wrong while processing your request.',
|
|
15
|
+
code = 500,
|
|
16
|
+
homeUrl = '/lite',
|
|
17
|
+
}: Props = $props();
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<div style="min-height: 50vh; display: flex; align-items: center; justify-content: center; padding: 20px;">
|
|
21
|
+
<div class="lite-card" style="max-width: 480px; width: 100%; text-align: center; padding: 40px;">
|
|
22
|
+
<AlertTriangle style="width: 48px; height: 48px; color: #ef4444; margin: 0 auto 16px;" />
|
|
23
|
+
|
|
24
|
+
<h1 style="font-size: 24px; font-weight: 600; color: #0f172a; margin: 0 0 8px;">
|
|
25
|
+
{#if code}
|
|
26
|
+
<span style="color: #ef4444; margin-right: 8px;">{code}</span>
|
|
27
|
+
{/if}
|
|
28
|
+
{title}
|
|
29
|
+
</h1>
|
|
30
|
+
|
|
31
|
+
<p style="color: #64748b; font-size: 15px; margin: 0 0 24px; line-height: 1.5;">{message}</p>
|
|
32
|
+
|
|
33
|
+
<a href={homeUrl} class="lite-btn lite-btn-primary" style="display: inline-block;">
|
|
34
|
+
{t('common.returnHome') || 'Return to Home'}
|
|
35
|
+
</a>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
title?: string;
|
|
3
|
+
message?: string;
|
|
4
|
+
code?: string | number;
|
|
5
|
+
homeUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const LiteErrorComponent: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type LiteErrorComponent = ReturnType<typeof LiteErrorComponent>;
|
|
9
|
+
export default LiteErrorComponent;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
title?: string;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { title = '', children }: Props = $props();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<header class="lite-header" style="padding: 16px 24px; background: white; border-bottom: 1px solid #e2e8f0; display: flex; justify-content: space-between; align-items: center;">
|
|
13
|
+
<h2 style="margin: 0; font-size: 18px; font-weight: 600; color: #0f172a;">{title}</h2>
|
|
14
|
+
<div style="display: flex; gap: 12px; align-items: center;">
|
|
15
|
+
{#if children}
|
|
16
|
+
{@render children()}
|
|
17
|
+
{/if}
|
|
18
|
+
</div>
|
|
19
|
+
</header>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* SSR redirection helper component
|
|
4
|
+
* Normally redirection is done via +page.server.ts load() function in SvelteKit.
|
|
5
|
+
* This component will do a client-side fallback redirect if rendered.
|
|
6
|
+
*/
|
|
7
|
+
import { onMount } from 'svelte';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
resource: string;
|
|
11
|
+
basePath?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let { resource, basePath = '/lite' }: Props = $props();
|
|
15
|
+
|
|
16
|
+
onMount(() => {
|
|
17
|
+
// Only fires if JS somehow runs, otherwise server should have redirected.
|
|
18
|
+
window.location.href = `${basePath}/${resource}`;
|
|
19
|
+
});
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<noscript>
|
|
23
|
+
<meta http-equiv="refresh" content={`0; url=${basePath}/${resource}`} />
|
|
24
|
+
</noscript>
|
|
25
|
+
<p>Redirecting to {resource}...</p>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ResourceDefinition, MenuItem } from '@svadmin/core';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
resources: ResourceDefinition[];
|
|
6
|
+
currentResource?: string;
|
|
7
|
+
brandName?: string;
|
|
8
|
+
userName?: string;
|
|
9
|
+
basePath?: string;
|
|
10
|
+
menu?: MenuItem[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
resources,
|
|
15
|
+
currentResource = '',
|
|
16
|
+
brandName = 'Admin',
|
|
17
|
+
userName = '',
|
|
18
|
+
basePath = '/lite',
|
|
19
|
+
menu,
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
|
|
22
|
+
const menuResources = $derived(
|
|
23
|
+
resources.filter((r: ResourceDefinition) => r.showInMenu !== false)
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
function isActive(href: string | undefined): boolean {
|
|
27
|
+
if (!href) return false;
|
|
28
|
+
return currentResource === href.replace(basePath + '/', '');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function hasActiveChild(children?: MenuItem[]): boolean {
|
|
32
|
+
if (!children) return false;
|
|
33
|
+
return children.some(c => isActive(c.href ?? `${basePath}/${c.name}`));
|
|
34
|
+
}
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<nav class="lite-sidebar">
|
|
38
|
+
<div class="lite-sidebar-brand">{brandName}</div>
|
|
39
|
+
{#if menu && menu.length > 0}
|
|
40
|
+
{#each menu as item, _i (_i)}
|
|
41
|
+
{#if item.children && item.children.length > 0}
|
|
42
|
+
<details class="lite-menu-group" open={hasActiveChild(item.children)}>
|
|
43
|
+
<summary class="lite-menu-parent">{item.label ?? item.name}</summary>
|
|
44
|
+
{#each item.children as child, _i (_i)}
|
|
45
|
+
{#if child.children && child.children.length > 0}
|
|
46
|
+
<details class="lite-menu-group" style="margin-left:12px" open={hasActiveChild(child.children)}>
|
|
47
|
+
<summary class="lite-menu-parent">{child.label ?? child.name}</summary>
|
|
48
|
+
{#each child.children as grandchild, _i (_i)}
|
|
49
|
+
<a
|
|
50
|
+
href={grandchild.href ?? `${basePath}/${grandchild.name}`}
|
|
51
|
+
class={isActive(grandchild.href ?? `${basePath}/${grandchild.name}`) ? 'active' : ''}
|
|
52
|
+
target={grandchild.target === '_blank' ? '_blank' : undefined}
|
|
53
|
+
style="padding-left:40px"
|
|
54
|
+
>{grandchild.label ?? grandchild.name}</a>
|
|
55
|
+
{/each}
|
|
56
|
+
</details>
|
|
57
|
+
{:else}
|
|
58
|
+
<a
|
|
59
|
+
href={child.href ?? `${basePath}/${child.name}`}
|
|
60
|
+
class={isActive(child.href ?? `${basePath}/${child.name}`) ? 'active' : ''}
|
|
61
|
+
target={child.target === '_blank' ? '_blank' : undefined}
|
|
62
|
+
style="padding-left:28px"
|
|
63
|
+
>{child.label ?? child.name}</a>
|
|
64
|
+
{/if}
|
|
65
|
+
{/each}
|
|
66
|
+
</details>
|
|
67
|
+
{:else}
|
|
68
|
+
<a
|
|
69
|
+
href={item.href ?? `${basePath}/${item.name}`}
|
|
70
|
+
class={isActive(item.href ?? `${basePath}/${item.name}`) ? 'active' : ''}
|
|
71
|
+
target={item.target === '_blank' ? '_blank' : undefined}
|
|
72
|
+
>{item.label ?? item.name}</a>
|
|
73
|
+
{/if}
|
|
74
|
+
{/each}
|
|
75
|
+
{:else}
|
|
76
|
+
{#each menuResources as res, _i (_i)}
|
|
77
|
+
<a
|
|
78
|
+
href={`${basePath}/${res.name}`}
|
|
79
|
+
class={res.name === currentResource ? 'active' : ''}
|
|
80
|
+
>
|
|
81
|
+
{res.label ?? res.name}
|
|
82
|
+
</a>
|
|
83
|
+
{/each}
|
|
84
|
+
{/if}
|
|
85
|
+
{#if userName}
|
|
86
|
+
<div style="position:absolute;bottom:0;left:0;right:0;padding:12px 16px;border-top:1px solid #334155;font-size:12px;color:#94a3b8;">
|
|
87
|
+
{userName}
|
|
88
|
+
<form method="POST" action={`${basePath}/login?/logout`} style="display:inline;margin-left:8px;">
|
|
89
|
+
<button type="submit" class="lite-btn lite-btn-sm" style="color:#94a3b8;border-color:#475569;background:transparent;padding:2px 8px;">Logout</button>
|
|
90
|
+
</form>
|
|
91
|
+
</div>
|
|
92
|
+
{/if}
|
|
93
|
+
</nav>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResourceDefinition, MenuItem } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
resources: ResourceDefinition[];
|
|
4
|
+
currentResource?: string;
|
|
5
|
+
brandName?: string;
|
|
6
|
+
userName?: string;
|
|
7
|
+
basePath?: string;
|
|
8
|
+
menu?: MenuItem[];
|
|
9
|
+
}
|
|
10
|
+
declare const LiteSidebar: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type LiteSidebar = ReturnType<typeof LiteSidebar>;
|
|
12
|
+
export default LiteSidebar;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as LiteSidebar } from './LiteSidebar.svelte';
|
|
2
|
+
export { default as LiteHeader } from './LiteHeader.svelte';
|
|
3
|
+
export { default as LiteNavigateToResource } from './LiteNavigateToResource.svelte';
|
|
4
|
+
export { default as LiteCatchAllNavigate } from './LiteCatchAllNavigate.svelte';
|
|
5
|
+
export { default as LiteCanAccess } from './LiteCanAccess.svelte';
|
|
6
|
+
export { default as LiteAuthenticated } from './LiteAuthenticated.svelte';
|
|
7
|
+
export { default as LiteErrorComponent } from './LiteErrorComponent.svelte';
|
|
8
|
+
export { default as LiteErrorBoundary } from './LiteErrorBoundary.svelte';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ResourceDefinition } from '@svadmin/core';
|
|
3
|
+
import { t } from '@svadmin/core/i18n';
|
|
4
|
+
import LiteForm from '../LiteForm.svelte';
|
|
5
|
+
import LiteListButton from '../buttons/LiteListButton.svelte';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
resource: ResourceDefinition;
|
|
9
|
+
errors?: Record<string, string[]>;
|
|
10
|
+
values?: Record<string, unknown>;
|
|
11
|
+
basePath?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
resource,
|
|
16
|
+
errors = {},
|
|
17
|
+
values = {},
|
|
18
|
+
basePath = '/lite',
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<div class="lite-page">
|
|
23
|
+
<div class="lite-page-header">
|
|
24
|
+
<h1 class="lite-page-title">{t('common.create') || 'Create'} {resource.label || resource.name}</h1>
|
|
25
|
+
<div class="lite-page-actions">
|
|
26
|
+
<LiteListButton resource={resource.name} {basePath} />
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<LiteForm
|
|
31
|
+
fields={resource.fields}
|
|
32
|
+
mode="create"
|
|
33
|
+
{resource}
|
|
34
|
+
{errors}
|
|
35
|
+
{values}
|
|
36
|
+
action="?/create"
|
|
37
|
+
cancelUrl={`${basePath}/${resource.name}`}
|
|
38
|
+
/>
|
|
39
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResourceDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
resource: ResourceDefinition;
|
|
4
|
+
errors?: Record<string, string[]>;
|
|
5
|
+
values?: Record<string, unknown>;
|
|
6
|
+
basePath?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const LiteCreatePage: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteCreatePage = ReturnType<typeof LiteCreatePage>;
|
|
10
|
+
export default LiteCreatePage;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ResourceDefinition } from '@svadmin/core';
|
|
3
|
+
import { t } from '@svadmin/core/i18n';
|
|
4
|
+
import LiteForm from '../LiteForm.svelte';
|
|
5
|
+
import LiteListButton from '../buttons/LiteListButton.svelte';
|
|
6
|
+
import LiteShowButton from '../buttons/LiteShowButton.svelte';
|
|
7
|
+
import LiteDeleteButton from '../buttons/LiteDeleteButton.svelte';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
resource: ResourceDefinition;
|
|
11
|
+
record: Record<string, unknown>;
|
|
12
|
+
errors?: Record<string, string[]>;
|
|
13
|
+
basePath?: string;
|
|
14
|
+
canDelete?: boolean;
|
|
15
|
+
canShow?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
resource,
|
|
20
|
+
record,
|
|
21
|
+
errors = {},
|
|
22
|
+
basePath = '/lite',
|
|
23
|
+
canDelete = true,
|
|
24
|
+
canShow = true,
|
|
25
|
+
}: Props = $props();
|
|
26
|
+
|
|
27
|
+
let pk = $derived(resource.primaryKey ?? 'id');
|
|
28
|
+
let idStr = $derived(String(record[pk]));
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<div class="lite-page">
|
|
32
|
+
<div class="lite-page-header">
|
|
33
|
+
<h1 class="lite-page-title">{t('common.edit') || 'Edit'} {resource.label || resource.name} #{idStr}</h1>
|
|
34
|
+
<div class="lite-page-actions">
|
|
35
|
+
{#if canShow}
|
|
36
|
+
<LiteShowButton resource={resource.name} recordItemId={idStr} {basePath} />
|
|
37
|
+
{/if}
|
|
38
|
+
<LiteListButton resource={resource.name} {basePath} />
|
|
39
|
+
{#if canDelete}
|
|
40
|
+
<LiteDeleteButton resource={resource.name} recordItemId={idStr} redirectUrl={`${basePath}/${resource.name}`} {basePath} />
|
|
41
|
+
{/if}
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<LiteForm
|
|
46
|
+
fields={resource.fields}
|
|
47
|
+
mode="edit"
|
|
48
|
+
{resource}
|
|
49
|
+
{errors}
|
|
50
|
+
values={record}
|
|
51
|
+
action="?/update"
|
|
52
|
+
cancelUrl={`${basePath}/${resource.name}`}
|
|
53
|
+
/>
|
|
54
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResourceDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
resource: ResourceDefinition;
|
|
4
|
+
record: Record<string, unknown>;
|
|
5
|
+
errors?: Record<string, string[]>;
|
|
6
|
+
basePath?: string;
|
|
7
|
+
canDelete?: boolean;
|
|
8
|
+
canShow?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare const LiteEditPage: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type LiteEditPage = ReturnType<typeof LiteEditPage>;
|
|
12
|
+
export default LiteEditPage;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
title?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
action?: string;
|
|
6
|
+
loginUrl?: string;
|
|
7
|
+
errors?: string[];
|
|
8
|
+
successMessage?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
title = 'Forgot Password',
|
|
13
|
+
description = 'Enter your email to receive a password reset link',
|
|
14
|
+
action = '?/forgot_password',
|
|
15
|
+
loginUrl = '/lite/login',
|
|
16
|
+
errors = [],
|
|
17
|
+
successMessage = '',
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<div style="min-height: 100vh; display: flex; align-items: center; justify-content: center; background: #f8fafc; padding: 20px;">
|
|
22
|
+
<div class="lite-card" style="width: 100%; max-width: 400px; padding: 32px;">
|
|
23
|
+
<div style="text-align: center; margin-bottom: 24px;">
|
|
24
|
+
<h1 style="font-size: 24px; font-weight: 600; color: #0f172a; margin: 0 0 8px;">{title}</h1>
|
|
25
|
+
<p style="font-size: 14px; color: #64748b; margin: 0;">{description}</p>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<!-- Native form action -->
|
|
29
|
+
<form method="POST" {action} style="display: flex; flex-direction: column; gap: 16px;">
|
|
30
|
+
<div class="lite-form-group">
|
|
31
|
+
<label for="email">Email</label>
|
|
32
|
+
<input type="email" id="email" name="email" class="lite-input" required />
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
{#if errors.length > 0}
|
|
36
|
+
<div style="padding: 12px; background: #fef2f2; border-radius: 6px; color: #ef4444; font-size: 13px;">
|
|
37
|
+
<ul style="margin: 0; padding-left: 20px;">
|
|
38
|
+
{#each errors as err, _i (_i)}
|
|
39
|
+
<li>{err}</li>
|
|
40
|
+
{/each}
|
|
41
|
+
</ul>
|
|
42
|
+
</div>
|
|
43
|
+
{/if}
|
|
44
|
+
|
|
45
|
+
{#if successMessage}
|
|
46
|
+
<div style="padding: 12px; background: #ecfdf5; border-radius: 6px; color: #10b981; font-size: 13px;">
|
|
47
|
+
{successMessage}
|
|
48
|
+
</div>
|
|
49
|
+
{/if}
|
|
50
|
+
|
|
51
|
+
<button type="submit" class="lite-btn lite-btn-primary" style="width: 100%; justify-content: center; padding: 10px;">
|
|
52
|
+
Send Reset Link
|
|
53
|
+
</button>
|
|
54
|
+
|
|
55
|
+
<div style="text-align: center; font-size: 13px; color: #64748b; margin-top: 8px;">
|
|
56
|
+
Remember your password? <a href={loginUrl} style="color: #2563eb; text-decoration: none;">Back to Login</a>
|
|
57
|
+
</div>
|
|
58
|
+
</form>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
title?: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
action?: string;
|
|
5
|
+
loginUrl?: string;
|
|
6
|
+
errors?: string[];
|
|
7
|
+
successMessage?: string;
|
|
8
|
+
}
|
|
9
|
+
declare const LiteForgotPasswordPage: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type LiteForgotPasswordPage = ReturnType<typeof LiteForgotPasswordPage>;
|
|
11
|
+
export default LiteForgotPasswordPage;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ResourceDefinition } from '@svadmin/core';
|
|
3
|
+
import { t } from '@svadmin/core/i18n';
|
|
4
|
+
import LiteTable from '../LiteTable.svelte';
|
|
5
|
+
import LitePagination from '../LitePagination.svelte';
|
|
6
|
+
import LiteSearch from '../LiteSearch.svelte';
|
|
7
|
+
import LiteCreateButton from '../buttons/LiteCreateButton.svelte';
|
|
8
|
+
import LiteRefreshButton from '../buttons/LiteRefreshButton.svelte';
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
resource: ResourceDefinition;
|
|
12
|
+
records: Record<string, unknown>[];
|
|
13
|
+
total: number;
|
|
14
|
+
pagination: { page: number; perPage: number };
|
|
15
|
+
currentSort?: string;
|
|
16
|
+
currentOrder?: 'asc' | 'desc';
|
|
17
|
+
currentSearch?: string;
|
|
18
|
+
basePath?: string;
|
|
19
|
+
canCreate?: boolean;
|
|
20
|
+
canEdit?: boolean;
|
|
21
|
+
canDelete?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
resource,
|
|
26
|
+
records,
|
|
27
|
+
total,
|
|
28
|
+
pagination,
|
|
29
|
+
currentSort,
|
|
30
|
+
currentOrder = 'asc',
|
|
31
|
+
currentSearch,
|
|
32
|
+
basePath = '/lite',
|
|
33
|
+
canCreate = true,
|
|
34
|
+
canEdit = true,
|
|
35
|
+
canDelete = true,
|
|
36
|
+
}: Props = $props();
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<div class="lite-page">
|
|
40
|
+
<div class="lite-page-header">
|
|
41
|
+
<h1 class="lite-page-title">{resource.label || resource.name} {t('common.list') || 'List'}</h1>
|
|
42
|
+
<div class="lite-page-actions">
|
|
43
|
+
{#if canCreate}
|
|
44
|
+
<LiteCreateButton resource={resource.name} {basePath} />
|
|
45
|
+
{/if}
|
|
46
|
+
<LiteRefreshButton hideText />
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div class="lite-card" style="margin-bottom: 20px;">
|
|
51
|
+
<div style="padding: 16px; border-bottom: 1px solid #e2e8f0; display: flex; justify-content: space-between; align-items: center;">
|
|
52
|
+
<LiteSearch value={currentSearch} placeholder={t('common.search') || 'Search...'} />
|
|
53
|
+
<span style="font-size: 13px; color: #64748b;">
|
|
54
|
+
{t('common.total') || 'Total'}: {total}
|
|
55
|
+
</span>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<LiteTable
|
|
59
|
+
{records}
|
|
60
|
+
{resource}
|
|
61
|
+
{currentSort}
|
|
62
|
+
{currentOrder}
|
|
63
|
+
{currentSearch}
|
|
64
|
+
{basePath}
|
|
65
|
+
{canEdit}
|
|
66
|
+
{canDelete}
|
|
67
|
+
/>
|
|
68
|
+
|
|
69
|
+
{#if total > pagination.perPage}
|
|
70
|
+
<LitePagination
|
|
71
|
+
page={pagination.page}
|
|
72
|
+
totalPages={Math.ceil(total / pagination.perPage)}
|
|
73
|
+
preserveParams={{
|
|
74
|
+
...(currentSort ? { sort: currentSort } : {}),
|
|
75
|
+
...(currentOrder ? { order: currentOrder } : {}),
|
|
76
|
+
...(currentSearch ? { q: currentSearch } : {})
|
|
77
|
+
}}
|
|
78
|
+
/>
|
|
79
|
+
{/if}
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ResourceDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
resource: ResourceDefinition;
|
|
4
|
+
records: Record<string, unknown>[];
|
|
5
|
+
total: number;
|
|
6
|
+
pagination: {
|
|
7
|
+
page: number;
|
|
8
|
+
perPage: number;
|
|
9
|
+
};
|
|
10
|
+
currentSort?: string;
|
|
11
|
+
currentOrder?: 'asc' | 'desc';
|
|
12
|
+
currentSearch?: string;
|
|
13
|
+
basePath?: string;
|
|
14
|
+
canCreate?: boolean;
|
|
15
|
+
canEdit?: boolean;
|
|
16
|
+
canDelete?: boolean;
|
|
17
|
+
}
|
|
18
|
+
declare const LiteListPage: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type LiteListPage = ReturnType<typeof LiteListPage>;
|
|
20
|
+
export default LiteListPage;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
user: { id?: string | number; name?: string; email?: string; [key: string]: unknown };
|
|
6
|
+
action?: string;
|
|
7
|
+
errors?: string[];
|
|
8
|
+
successMessage?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
user,
|
|
13
|
+
action = '?/update_profile',
|
|
14
|
+
errors = [],
|
|
15
|
+
successMessage = '',
|
|
16
|
+
}: Props = $props();
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<div class="lite-page">
|
|
20
|
+
<div class="lite-page-header">
|
|
21
|
+
<h1 class="lite-page-title">{t('common.profile') || 'User Profile'}</h1>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div class="lite-card" style="max-width: 600px; margin: 0 auto; padding: 24px;">
|
|
25
|
+
<form method="POST" {action} style="display: flex; flex-direction: column; gap: 16px;">
|
|
26
|
+
<div class="lite-form-group">
|
|
27
|
+
<label for="name">Name</label>
|
|
28
|
+
<input type="text" id="name" name="name" class="lite-input" value={user?.name ?? ''} />
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="lite-form-group">
|
|
32
|
+
<label for="email">Email</label>
|
|
33
|
+
<input type="email" id="email" name="email" class="lite-input" value={user?.email ?? ''} required />
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<!-- Password update fields can be added here or handled in a separate form -->
|
|
37
|
+
|
|
38
|
+
{#if errors.length > 0}
|
|
39
|
+
<div style="padding: 12px; background: #fef2f2; border-radius: 6px; color: #ef4444; font-size: 13px;">
|
|
40
|
+
<ul style="margin: 0; padding-left: 20px;">
|
|
41
|
+
{#each errors as err, _i (_i)}
|
|
42
|
+
<li>{err}</li>
|
|
43
|
+
{/each}
|
|
44
|
+
</ul>
|
|
45
|
+
</div>
|
|
46
|
+
{/if}
|
|
47
|
+
|
|
48
|
+
{#if successMessage}
|
|
49
|
+
<div style="padding: 12px; background: #ecfdf5; border-radius: 6px; color: #10b981; font-size: 13px;">
|
|
50
|
+
{successMessage}
|
|
51
|
+
</div>
|
|
52
|
+
{/if}
|
|
53
|
+
|
|
54
|
+
<div style="display: flex; justify-content: flex-end; margin-top: 8px;">
|
|
55
|
+
<button type="submit" class="lite-btn lite-btn-primary">
|
|
56
|
+
{t('common.save') || 'Save Profile'}
|
|
57
|
+
</button>
|
|
58
|
+
</div>
|
|
59
|
+
</form>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
user: {
|
|
3
|
+
id?: string | number;
|
|
4
|
+
name?: string;
|
|
5
|
+
email?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
};
|
|
8
|
+
action?: string;
|
|
9
|
+
errors?: string[];
|
|
10
|
+
successMessage?: string;
|
|
11
|
+
}
|
|
12
|
+
declare const LiteProfilePage: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type LiteProfilePage = ReturnType<typeof LiteProfilePage>;
|
|
14
|
+
export default LiteProfilePage;
|