@svadmin/lite 0.3.7 → 0.3.12
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 +57 -20
- 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,31 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { Download } from '@lucide/svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
resource: string;
|
|
7
|
+
basePath?: string;
|
|
8
|
+
hideText?: boolean;
|
|
9
|
+
class?: string;
|
|
10
|
+
size?: 'sm' | 'default' | 'icon';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
resource,
|
|
15
|
+
basePath = '/lite',
|
|
16
|
+
hideText = false,
|
|
17
|
+
class: className = '',
|
|
18
|
+
size = 'default'
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<a
|
|
23
|
+
href={`${basePath}/${resource}?action=export`}
|
|
24
|
+
class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
|
|
25
|
+
title={t('common.export') || 'Export'}
|
|
26
|
+
>
|
|
27
|
+
<Download class="h-4 w-4" />
|
|
28
|
+
{#if !hideText}
|
|
29
|
+
<span style="marginLeft: 4px">{t('common.export') || 'Export'}</span>
|
|
30
|
+
{/if}
|
|
31
|
+
</a>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
resource: string;
|
|
3
|
+
basePath?: string;
|
|
4
|
+
hideText?: boolean;
|
|
5
|
+
class?: string;
|
|
6
|
+
size?: 'sm' | 'default' | 'icon';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteExportButton: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteExportButton = ReturnType<typeof LiteExportButton>;
|
|
10
|
+
export default LiteExportButton;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { Upload } from '@lucide/svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
resource: string;
|
|
7
|
+
basePath?: string;
|
|
8
|
+
hideText?: boolean;
|
|
9
|
+
class?: string;
|
|
10
|
+
size?: 'sm' | 'default' | 'icon';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
resource,
|
|
15
|
+
basePath = '/lite',
|
|
16
|
+
hideText = false,
|
|
17
|
+
class: className = '',
|
|
18
|
+
size = 'default'
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<details class="lite-confirm-details {className}">
|
|
23
|
+
<summary
|
|
24
|
+
class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''}"
|
|
25
|
+
title={t('common.import') || 'Import'}
|
|
26
|
+
>
|
|
27
|
+
<Upload class="h-4 w-4" />
|
|
28
|
+
{#if !hideText}
|
|
29
|
+
<span style="marginLeft: 4px">{t('common.import') || 'Import'}</span>
|
|
30
|
+
{/if}
|
|
31
|
+
</summary>
|
|
32
|
+
<div class="lite-confirm-panel">
|
|
33
|
+
<p style="margin: 0 0 8px; font-size: 13px;">{t('common.importData') || 'Import data (CSV/JSON)'}</p>
|
|
34
|
+
<form method="POST" action={`${basePath}/${resource}?/${resource}_import`} enctype="multipart/form-data" style="display:flex; flex-direction: column; gap: 8px;">
|
|
35
|
+
<input type="file" name="file" accept=".csv,.json" required style="font-size: 13px;" />
|
|
36
|
+
<div style="display:flex; gap: 8px; justify-content: flex-end;">
|
|
37
|
+
<button
|
|
38
|
+
type="button"
|
|
39
|
+
class="lite-btn lite-btn-sm"
|
|
40
|
+
onclick={(e) => (e.currentTarget as HTMLElement).closest('details')?.removeAttribute('open')}
|
|
41
|
+
>
|
|
42
|
+
{t('common.cancel') || 'Cancel'}
|
|
43
|
+
</button>
|
|
44
|
+
<button type="submit" class="lite-btn lite-btn-sm lite-btn-primary">
|
|
45
|
+
{t('common.upload') || 'Upload'}
|
|
46
|
+
</button>
|
|
47
|
+
</div>
|
|
48
|
+
</form>
|
|
49
|
+
</div>
|
|
50
|
+
</details>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
resource: string;
|
|
3
|
+
basePath?: string;
|
|
4
|
+
hideText?: boolean;
|
|
5
|
+
class?: string;
|
|
6
|
+
size?: 'sm' | 'default' | 'icon';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteImportButton: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteImportButton = ReturnType<typeof LiteImportButton>;
|
|
10
|
+
export default LiteImportButton;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { List } from '@lucide/svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
resource: string;
|
|
7
|
+
basePath?: string;
|
|
8
|
+
hideText?: boolean;
|
|
9
|
+
class?: string;
|
|
10
|
+
size?: 'sm' | 'default' | 'icon';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
resource,
|
|
15
|
+
basePath = '/lite',
|
|
16
|
+
hideText = false,
|
|
17
|
+
class: className = '',
|
|
18
|
+
size = 'default'
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<a
|
|
23
|
+
href={`${basePath}/${resource}`}
|
|
24
|
+
class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
|
|
25
|
+
title={t('common.list') || 'List'}
|
|
26
|
+
>
|
|
27
|
+
<List class="h-4 w-4" />
|
|
28
|
+
{#if !hideText}
|
|
29
|
+
<span style="marginLeft: 4px">{t('common.list') || 'List'}</span>
|
|
30
|
+
{/if}
|
|
31
|
+
</a>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
resource: string;
|
|
3
|
+
basePath?: string;
|
|
4
|
+
hideText?: boolean;
|
|
5
|
+
class?: string;
|
|
6
|
+
size?: 'sm' | 'default' | 'icon';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteListButton: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteListButton = ReturnType<typeof LiteListButton>;
|
|
10
|
+
export default LiteListButton;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { RefreshCw } from '@lucide/svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
hideText?: boolean;
|
|
7
|
+
class?: string;
|
|
8
|
+
size?: 'sm' | 'default' | 'icon';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
hideText = false,
|
|
13
|
+
class: className = '',
|
|
14
|
+
size = 'default'
|
|
15
|
+
}: Props = $props();
|
|
16
|
+
|
|
17
|
+
function refreshPage() {
|
|
18
|
+
if (typeof window !== 'undefined') {
|
|
19
|
+
window.location.reload();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<button
|
|
25
|
+
type="button"
|
|
26
|
+
class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
|
|
27
|
+
title={t('common.refresh') || 'Refresh'}
|
|
28
|
+
onclick={refreshPage}
|
|
29
|
+
>
|
|
30
|
+
<RefreshCw class="h-4 w-4" />
|
|
31
|
+
{#if !hideText}
|
|
32
|
+
<span style="marginLeft: 4px">{t('common.refresh') || 'Refresh'}</span>
|
|
33
|
+
{/if}
|
|
34
|
+
</button>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
hideText?: boolean;
|
|
3
|
+
class?: string;
|
|
4
|
+
size?: 'sm' | 'default' | 'icon';
|
|
5
|
+
}
|
|
6
|
+
declare const LiteRefreshButton: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type LiteRefreshButton = ReturnType<typeof LiteRefreshButton>;
|
|
8
|
+
export default LiteRefreshButton;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { Save } from '@lucide/svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
hideText?: boolean;
|
|
7
|
+
class?: string;
|
|
8
|
+
size?: 'sm' | 'default' | 'icon';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
hideText = false,
|
|
13
|
+
class: className = '',
|
|
14
|
+
size = 'default'
|
|
15
|
+
}: Props = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<button
|
|
19
|
+
type="submit"
|
|
20
|
+
class="lite-btn lite-btn-primary {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
|
|
21
|
+
title={t('common.save') || 'Save'}
|
|
22
|
+
>
|
|
23
|
+
<Save class="h-4 w-4" />
|
|
24
|
+
{#if !hideText}
|
|
25
|
+
<span style="marginLeft: 4px">{t('common.save') || 'Save'}</span>
|
|
26
|
+
{/if}
|
|
27
|
+
</button>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from '@svadmin/core/i18n';
|
|
3
|
+
import { Eye } from '@lucide/svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
resource: string;
|
|
7
|
+
recordItemId: string | number;
|
|
8
|
+
basePath?: string;
|
|
9
|
+
hideText?: boolean;
|
|
10
|
+
class?: string;
|
|
11
|
+
size?: 'sm' | 'default' | 'icon';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
resource,
|
|
16
|
+
recordItemId,
|
|
17
|
+
basePath = '/lite',
|
|
18
|
+
hideText = false,
|
|
19
|
+
class: className = '',
|
|
20
|
+
size = 'default'
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<a
|
|
25
|
+
href={`${basePath}/${resource}/show/${recordItemId}`}
|
|
26
|
+
class="lite-btn {size === 'sm' ? 'lite-btn-sm' : ''} {className}"
|
|
27
|
+
title={t('common.show') || 'Show'}
|
|
28
|
+
>
|
|
29
|
+
<Eye class="h-4 w-4" />
|
|
30
|
+
{#if !hideText}
|
|
31
|
+
<span style="marginLeft: 4px">{t('common.show') || 'Show'}</span>
|
|
32
|
+
{/if}
|
|
33
|
+
</a>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
resource: string;
|
|
3
|
+
recordItemId: string | number;
|
|
4
|
+
basePath?: string;
|
|
5
|
+
hideText?: boolean;
|
|
6
|
+
class?: string;
|
|
7
|
+
size?: 'sm' | 'default' | 'icon';
|
|
8
|
+
}
|
|
9
|
+
declare const LiteShowButton: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type LiteShowButton = ReturnType<typeof LiteShowButton>;
|
|
11
|
+
export default LiteShowButton;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { default as LiteCreateButton } from './LiteCreateButton.svelte';
|
|
2
|
+
export { default as LiteEditButton } from './LiteEditButton.svelte';
|
|
3
|
+
export { default as LiteShowButton } from './LiteShowButton.svelte';
|
|
4
|
+
export { default as LiteListButton } from './LiteListButton.svelte';
|
|
5
|
+
export { default as LiteDeleteButton } from './LiteDeleteButton.svelte';
|
|
6
|
+
export { default as LiteCloneButton } from './LiteCloneButton.svelte';
|
|
7
|
+
export { default as LiteExportButton } from './LiteExportButton.svelte';
|
|
8
|
+
export { default as LiteImportButton } from './LiteImportButton.svelte';
|
|
9
|
+
export { default as LiteRefreshButton } from './LiteRefreshButton.svelte';
|
|
10
|
+
export { default as LiteSaveButton } from './LiteSaveButton.svelte';
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
field: FieldDefinition;
|
|
7
|
+
value?: unknown;
|
|
8
|
+
error?: string[];
|
|
9
|
+
mode?: 'show' | 'edit' | 'create';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let { field, value, error = [], mode = 'show' }: Props = $props();
|
|
13
|
+
let hasError = $derived(error.length > 0);
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
{#if mode === 'show'}
|
|
17
|
+
<div>
|
|
18
|
+
<span class="lite-bool {value ? 'lite-bool-true' : ''}"></span>
|
|
19
|
+
{value ? '✓ Yes' : '✗ No'}
|
|
20
|
+
</div>
|
|
21
|
+
{:else}
|
|
22
|
+
<div class="lite-checkbox-group">
|
|
23
|
+
<input
|
|
24
|
+
type="checkbox"
|
|
25
|
+
name={field.key}
|
|
26
|
+
id={field.key}
|
|
27
|
+
checked={!!value}
|
|
28
|
+
value="true"
|
|
29
|
+
/>
|
|
30
|
+
<!-- Fallback hidden input so unchecked boxes submit "false" -->
|
|
31
|
+
<input type="hidden" name={field.key} value="false" />
|
|
32
|
+
|
|
33
|
+
<label for={field.key}>
|
|
34
|
+
{(field as any).placeholder ?? (field.label || 'Yes')}
|
|
35
|
+
</label>
|
|
36
|
+
{#if hasError}
|
|
37
|
+
{#each error as err, _i (_i)}
|
|
38
|
+
<div class="lite-error-text">{err}</div>
|
|
39
|
+
{/each}
|
|
40
|
+
{/if}
|
|
41
|
+
</div>
|
|
42
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: FieldDefinition;
|
|
4
|
+
value?: unknown;
|
|
5
|
+
error?: string[];
|
|
6
|
+
mode?: 'show' | 'edit' | 'create';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteBooleanField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteBooleanField = ReturnType<typeof LiteBooleanField>;
|
|
10
|
+
export default LiteBooleanField;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
field: FieldDefinition;
|
|
6
|
+
value?: unknown;
|
|
7
|
+
error?: string[];
|
|
8
|
+
mode?: 'show' | 'edit' | 'create';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { field, value, error = [], mode = 'show' }: Props = $props();
|
|
12
|
+
let hasError = $derived(error.length > 0);
|
|
13
|
+
|
|
14
|
+
function formatDate(v: unknown): string {
|
|
15
|
+
if (!v) return '';
|
|
16
|
+
try {
|
|
17
|
+
return new Date(v as string).toISOString().substring(0, 16); // Formats for html datetime-local
|
|
18
|
+
} catch {
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function displayDate(v: unknown): string {
|
|
24
|
+
if (!v) return '—';
|
|
25
|
+
try {
|
|
26
|
+
return new Date(v as string).toLocaleString();
|
|
27
|
+
} catch {
|
|
28
|
+
return String(v);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
{#if mode === 'show'}
|
|
34
|
+
<span>{displayDate(value)}</span>
|
|
35
|
+
{:else}
|
|
36
|
+
<div>
|
|
37
|
+
<input
|
|
38
|
+
type="datetime-local"
|
|
39
|
+
name={field.key}
|
|
40
|
+
id={field.key}
|
|
41
|
+
value={formatDate(value)}
|
|
42
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
43
|
+
{...field.required ? { required: true } : {}}
|
|
44
|
+
/>
|
|
45
|
+
{#if hasError}
|
|
46
|
+
{#each error as err, _i (_i)}
|
|
47
|
+
<div class="lite-error-text">{err}</div>
|
|
48
|
+
{/each}
|
|
49
|
+
{/if}
|
|
50
|
+
</div>
|
|
51
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: FieldDefinition;
|
|
4
|
+
value?: unknown;
|
|
5
|
+
error?: string[];
|
|
6
|
+
mode?: 'show' | 'edit' | 'create';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteDateField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteDateField = ReturnType<typeof LiteDateField>;
|
|
10
|
+
export default LiteDateField;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
field: FieldDefinition;
|
|
7
|
+
value?: unknown;
|
|
8
|
+
error?: string[];
|
|
9
|
+
mode?: 'show' | 'edit' | 'create';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let { field, value, error = [], mode = 'show' }: Props = $props();
|
|
13
|
+
let hasError = $derived(error.length > 0);
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
{#if mode === 'show'}
|
|
17
|
+
<span>
|
|
18
|
+
{#if value}
|
|
19
|
+
<a href="mailto:{value}">{value}</a>
|
|
20
|
+
{:else}
|
|
21
|
+
—
|
|
22
|
+
{/if}
|
|
23
|
+
</span>
|
|
24
|
+
{:else}
|
|
25
|
+
<div>
|
|
26
|
+
<input
|
|
27
|
+
type="email"
|
|
28
|
+
name={field.key}
|
|
29
|
+
id={field.key}
|
|
30
|
+
value={String(value ?? '')}
|
|
31
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
32
|
+
placeholder={(field as any).placeholder ?? field.label}
|
|
33
|
+
{...field.required ? { required: true } : {}}
|
|
34
|
+
/>
|
|
35
|
+
{#if hasError}
|
|
36
|
+
{#each error as err, _i (_i)}
|
|
37
|
+
<div class="lite-error-text">{err}</div>
|
|
38
|
+
{/each}
|
|
39
|
+
{/if}
|
|
40
|
+
</div>
|
|
41
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: FieldDefinition;
|
|
4
|
+
value?: unknown;
|
|
5
|
+
error?: string[];
|
|
6
|
+
mode?: 'show' | 'edit' | 'create';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteEmailField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteEmailField = ReturnType<typeof LiteEmailField>;
|
|
10
|
+
export default LiteEmailField;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
import { toSafeHref } from '../../security';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
field: FieldDefinition;
|
|
7
|
+
value?: unknown;
|
|
8
|
+
error?: string[];
|
|
9
|
+
mode?: 'show' | 'edit' | 'create';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let { field, value, error = [], mode = 'show' }: Props = $props();
|
|
13
|
+
let hasError = $derived(error.length > 0);
|
|
14
|
+
|
|
15
|
+
function getFiles(v: unknown): string[] {
|
|
16
|
+
if (!v) return [];
|
|
17
|
+
if (Array.isArray(v)) return v.map(String);
|
|
18
|
+
if (typeof v === 'string') return [v];
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
{#if mode === 'show'}
|
|
24
|
+
{@const files = getFiles(value)}
|
|
25
|
+
<div style="display:flex; flex-direction: column; gap: 4px;">
|
|
26
|
+
{#each files as f, _i (_i)}
|
|
27
|
+
{@const href = toSafeHref(f)}
|
|
28
|
+
{#if href}
|
|
29
|
+
<a {href} target="_blank" rel="noopener noreferrer">{f.split('/').pop() || 'Download'}</a>
|
|
30
|
+
{:else}
|
|
31
|
+
<span>{f}</span>
|
|
32
|
+
{/if}
|
|
33
|
+
{:else}
|
|
34
|
+
<span>—</span>
|
|
35
|
+
{/each}
|
|
36
|
+
</div>
|
|
37
|
+
{:else}
|
|
38
|
+
{@const files = getFiles(value)}
|
|
39
|
+
<div>
|
|
40
|
+
{#if files.length > 0 && mode === 'edit'}
|
|
41
|
+
<div style="margin-bottom: 8px;">
|
|
42
|
+
<span style="font-size: 12px;">Current files: {files.length}</span>
|
|
43
|
+
</div>
|
|
44
|
+
{/if}
|
|
45
|
+
<input
|
|
46
|
+
type="file"
|
|
47
|
+
name={field.key}
|
|
48
|
+
id={field.key}
|
|
49
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
50
|
+
{...(field.type as string) === 'files' ? { multiple: true } : {}}
|
|
51
|
+
{...field.required && !files.length ? { required: true } : {}}
|
|
52
|
+
/>
|
|
53
|
+
{#if hasError}
|
|
54
|
+
{#each error as err, _i (_i)}
|
|
55
|
+
<div class="lite-error-text">{err}</div>
|
|
56
|
+
{/each}
|
|
57
|
+
{/if}
|
|
58
|
+
</div>
|
|
59
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: FieldDefinition;
|
|
4
|
+
value?: unknown;
|
|
5
|
+
error?: string[];
|
|
6
|
+
mode?: 'show' | 'edit' | 'create';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteFileField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteFileField = ReturnType<typeof LiteFileField>;
|
|
10
|
+
export default LiteFileField;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
field: FieldDefinition;
|
|
6
|
+
value?: unknown;
|
|
7
|
+
error?: string[];
|
|
8
|
+
mode?: 'show' | 'edit' | 'create';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { field, value, error = [], mode = 'show' }: Props = $props();
|
|
12
|
+
let hasError = $derived(error.length > 0);
|
|
13
|
+
|
|
14
|
+
function getUrls(v: unknown): string[] {
|
|
15
|
+
if (!v) return [];
|
|
16
|
+
if (Array.isArray(v)) return v.map(String);
|
|
17
|
+
if (typeof v === 'string') return [v];
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
{#if mode === 'show'}
|
|
23
|
+
{@const urls = getUrls(value)}
|
|
24
|
+
<div style="display:flex; gap: 8px; flex-wrap: wrap;">
|
|
25
|
+
{#each urls as url, _i (_i)}
|
|
26
|
+
<img src={url} alt={field.label} style="max-height: 100px; border-radius: 4px; border: 1px solid #e5e7eb;" />
|
|
27
|
+
{:else}
|
|
28
|
+
<span>—</span>
|
|
29
|
+
{/each}
|
|
30
|
+
</div>
|
|
31
|
+
{:else}
|
|
32
|
+
{@const urls = getUrls(value)}
|
|
33
|
+
<div>
|
|
34
|
+
{#if urls.length > 0 && mode === 'edit'}
|
|
35
|
+
<div style="margin-bottom: 8px; display:flex; gap: 8px;">
|
|
36
|
+
{#each urls as url, _i (_i)}
|
|
37
|
+
<img src={url} alt="Current" style="height: 60px; border-radius: 4px; border: 1px solid #e5e7eb; opacity: 0.6;" />
|
|
38
|
+
{/each}
|
|
39
|
+
</div>
|
|
40
|
+
<p style="font-size: 11px; color:#6b7280; margin: 0 0 4px;">Uploading new ones will overwrite.</p>
|
|
41
|
+
{/if}
|
|
42
|
+
<input
|
|
43
|
+
type="file"
|
|
44
|
+
name={field.key}
|
|
45
|
+
id={field.key}
|
|
46
|
+
accept="image/*"
|
|
47
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
48
|
+
{...(field.type as string) === 'images' ? { multiple: true } : {}}
|
|
49
|
+
{...field.required && !urls.length ? { required: true } : {}}
|
|
50
|
+
/>
|
|
51
|
+
{#if hasError}
|
|
52
|
+
{#each error as err, _i (_i)}
|
|
53
|
+
<div class="lite-error-text">{err}</div>
|
|
54
|
+
{/each}
|
|
55
|
+
{/if}
|
|
56
|
+
</div>
|
|
57
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: FieldDefinition;
|
|
4
|
+
value?: unknown;
|
|
5
|
+
error?: string[];
|
|
6
|
+
mode?: 'show' | 'edit' | 'create';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteImageField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteImageField = ReturnType<typeof LiteImageField>;
|
|
10
|
+
export default LiteImageField;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
field: FieldDefinition;
|
|
6
|
+
value?: unknown;
|
|
7
|
+
error?: string[];
|
|
8
|
+
mode?: 'show' | 'edit' | 'create';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { field, value, error = [], mode = 'show' }: Props = $props();
|
|
12
|
+
let hasError = $derived(error.length > 0);
|
|
13
|
+
|
|
14
|
+
function getJsonString(v: unknown): string {
|
|
15
|
+
if (v == null) return '';
|
|
16
|
+
if (typeof v === 'string') return v;
|
|
17
|
+
try {
|
|
18
|
+
return JSON.stringify(v, null, 2);
|
|
19
|
+
} catch {
|
|
20
|
+
return String(v);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
{#if mode === 'show'}
|
|
26
|
+
<pre style="padding: 12px; background: #1e293b; color: #f8fafc; border-radius: 4px; overflow-x: auto; font-size: 13px;">{getJsonString(value)}</pre>
|
|
27
|
+
{:else}
|
|
28
|
+
<div>
|
|
29
|
+
<textarea
|
|
30
|
+
name={field.key}
|
|
31
|
+
id={field.key}
|
|
32
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
33
|
+
style="min-height: 150px; font-family: monospace;"
|
|
34
|
+
placeholder="{}"
|
|
35
|
+
{...field.required ? { required: true } : {}}
|
|
36
|
+
>{getJsonString(value)}</textarea>
|
|
37
|
+
{#if hasError}
|
|
38
|
+
{#each error as err, _i (_i)}
|
|
39
|
+
<div class="lite-error-text">{err}</div>
|
|
40
|
+
{/each}
|
|
41
|
+
{/if}
|
|
42
|
+
</div>
|
|
43
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: FieldDefinition;
|
|
4
|
+
value?: unknown;
|
|
5
|
+
error?: string[];
|
|
6
|
+
mode?: 'show' | 'edit' | 'create';
|
|
7
|
+
}
|
|
8
|
+
declare const LiteJsonField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteJsonField = ReturnType<typeof LiteJsonField>;
|
|
10
|
+
export default LiteJsonField;
|