@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,33 @@
|
|
|
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
|
+
</script>
|
|
14
|
+
|
|
15
|
+
{#if mode === 'show'}
|
|
16
|
+
<pre style="white-space: pre-wrap; padding: 12px; background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 4px;">{String(value ?? '—')}</pre>
|
|
17
|
+
{:else}
|
|
18
|
+
<div>
|
|
19
|
+
<textarea
|
|
20
|
+
name={field.key}
|
|
21
|
+
id={field.key}
|
|
22
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
23
|
+
style="min-height: 200px; font-family: monospace;"
|
|
24
|
+
placeholder="Enter markdown..."
|
|
25
|
+
{...field.required ? { required: true } : {}}
|
|
26
|
+
>{String(value ?? '')}</textarea>
|
|
27
|
+
{#if hasError}
|
|
28
|
+
{#each error as err, _i (_i)}
|
|
29
|
+
<div class="lite-error-text">{err}</div>
|
|
30
|
+
{/each}
|
|
31
|
+
{/if}
|
|
32
|
+
</div>
|
|
33
|
+
{/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 LiteMarkdownField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteMarkdownField = ReturnType<typeof LiteMarkdownField>;
|
|
10
|
+
export default LiteMarkdownField;
|
|
@@ -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 displayOptions(valuesRaw: unknown): string[] {
|
|
15
|
+
if (!valuesRaw || !Array.isArray(valuesRaw)) return [];
|
|
16
|
+
return valuesRaw.map(v => {
|
|
17
|
+
const opt = field.options?.find(o => String(o.value) === String(v));
|
|
18
|
+
return opt?.label ?? String(v);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const valuesArray = $derived(Array.isArray(value) ? value.map(String) : []);
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
{#if mode === 'show'}
|
|
26
|
+
<div style="display:flex; gap: 4px; flex-wrap: wrap;">
|
|
27
|
+
{#each displayOptions(value) as opt, _i (_i)}
|
|
28
|
+
<span class="lite-badge">{opt}</span>
|
|
29
|
+
{:else}
|
|
30
|
+
<span>—</span>
|
|
31
|
+
{/each}
|
|
32
|
+
</div>
|
|
33
|
+
{:else}
|
|
34
|
+
<div>
|
|
35
|
+
<select
|
|
36
|
+
name={field.key}
|
|
37
|
+
id={field.key}
|
|
38
|
+
multiple
|
|
39
|
+
class="lite-select {hasError ? 'lite-input-error' : ''}"
|
|
40
|
+
style="height: 120px;"
|
|
41
|
+
{...field.required ? { required: true } : {}}
|
|
42
|
+
>
|
|
43
|
+
{#if field.options}
|
|
44
|
+
{#each field.options as opt, _i (_i)}
|
|
45
|
+
<option value={String(opt.value)} selected={valuesArray.includes(String(opt.value))}>
|
|
46
|
+
{opt.label}
|
|
47
|
+
</option>
|
|
48
|
+
{/each}
|
|
49
|
+
{/if}
|
|
50
|
+
</select>
|
|
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 LiteMultiSelectField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteMultiSelectField = ReturnType<typeof LiteMultiSelectField>;
|
|
10
|
+
export default LiteMultiSelectField;
|
|
@@ -0,0 +1,35 @@
|
|
|
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>{value == null ? '—' : Number(value).toLocaleString()}</span>
|
|
18
|
+
{:else}
|
|
19
|
+
<div>
|
|
20
|
+
<input
|
|
21
|
+
type="number"
|
|
22
|
+
name={field.key}
|
|
23
|
+
id={field.key}
|
|
24
|
+
value={value == null ? '' : Number(value)}
|
|
25
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
26
|
+
placeholder={(field as any).placeholder ?? field.label}
|
|
27
|
+
{...field.required ? { required: true } : {}}
|
|
28
|
+
/>
|
|
29
|
+
{#if hasError}
|
|
30
|
+
{#each error as err, _i (_i)}
|
|
31
|
+
<div class="lite-error-text">{err}</div>
|
|
32
|
+
{/each}
|
|
33
|
+
{/if}
|
|
34
|
+
</div>
|
|
35
|
+
{/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 LiteNumberField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteNumberField = ReturnType<typeof LiteNumberField>;
|
|
10
|
+
export default LiteNumberField;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
4
|
+
import { t } from '@svadmin/core/i18n';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
field: FieldDefinition;
|
|
8
|
+
value?: unknown;
|
|
9
|
+
error?: string[];
|
|
10
|
+
mode?: 'show' | 'edit' | 'create';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let { field, value, error = [], mode = 'show' }: Props = $props();
|
|
14
|
+
let hasError = $derived(error.length > 0);
|
|
15
|
+
|
|
16
|
+
// In Lite version, relations might need to be rendered via server-side joined data
|
|
17
|
+
// passed through options, or just standard inputs requesting ID.
|
|
18
|
+
function displayRelation(v: unknown): string {
|
|
19
|
+
if (v == null) return '—';
|
|
20
|
+
if (typeof v === 'object' && v !== null && 'id' in v) {
|
|
21
|
+
// It's a populated relation object
|
|
22
|
+
const labelField = (field as any).relation?.labelField || 'name';
|
|
23
|
+
return String((v as Record<string, unknown>)[labelField] || (v as Record<string, unknown>).id);
|
|
24
|
+
}
|
|
25
|
+
// Try options
|
|
26
|
+
const opt = field.options?.find(o => String(o.value) === String(v));
|
|
27
|
+
return opt?.label ?? String(v);
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
{#if mode === 'show'}
|
|
32
|
+
<span class="lite-badge">{displayRelation(value)}</span>
|
|
33
|
+
{:else}
|
|
34
|
+
<div>
|
|
35
|
+
{#if field.options && field.options.length > 0}
|
|
36
|
+
<!-- Render as select if options provided by loader -->
|
|
37
|
+
<select
|
|
38
|
+
name={field.key}
|
|
39
|
+
id={field.key}
|
|
40
|
+
class="lite-select {hasError ? 'lite-input-error' : ''}"
|
|
41
|
+
>
|
|
42
|
+
<option value="">-- {t('common.select') || 'Select'} Reference --</option>
|
|
43
|
+
{#each field.options as opt, _i (_i)}
|
|
44
|
+
<option value={String(opt.value)} selected={String(value) === String(opt.value)}>
|
|
45
|
+
{opt.label}
|
|
46
|
+
</option>
|
|
47
|
+
{/each}
|
|
48
|
+
</select>
|
|
49
|
+
{:else}
|
|
50
|
+
<!-- Fallback text input for target ID -->
|
|
51
|
+
<input
|
|
52
|
+
type="text"
|
|
53
|
+
name={field.key}
|
|
54
|
+
id={field.key}
|
|
55
|
+
value={typeof value === 'object' && value ? String((value as Record<string, unknown>).id || '') : String(value ?? '')}
|
|
56
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
57
|
+
placeholder="Enter reference ID"
|
|
58
|
+
{...field.required ? { required: true } : {}}
|
|
59
|
+
/>
|
|
60
|
+
{/if}
|
|
61
|
+
{#if hasError}
|
|
62
|
+
{#each error as err, _i (_i)}
|
|
63
|
+
<div class="lite-error-text">{err}</div>
|
|
64
|
+
{/each}
|
|
65
|
+
{/if}
|
|
66
|
+
</div>
|
|
67
|
+
{/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 LiteRelationField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteRelationField = ReturnType<typeof LiteRelationField>;
|
|
10
|
+
export default LiteRelationField;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
import { toSafeText } from '../../security.js';
|
|
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
|
+
const displayValue = $derived(toSafeText(value, '—'));
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
{#if mode === 'show'}
|
|
18
|
+
<!-- Lite mode intentionally renders rich content as text to keep SSR output safe without a sanitizer dependency. -->
|
|
19
|
+
<div style="padding: 16px; border: 1px solid #e2e8f0; border-radius: 6px; max-height: 500px; overflow-y: auto; background: #fff; white-space: pre-wrap;" class="prose">
|
|
20
|
+
{displayValue}
|
|
21
|
+
</div>
|
|
22
|
+
{:else}
|
|
23
|
+
<div class="lite-markdown-editor">
|
|
24
|
+
<div style="padding: 8px 12px; border: 1px solid #cbd5e1; border-bottom: none; border-radius: 6px 6px 0 0; background: #f8fafc; color: #64748b; font-size: 12px; display: flex; gap: 12px; font-weight: 500;">
|
|
25
|
+
<span>Markdown is supported</span>
|
|
26
|
+
<span style="color: #94a3b8;">**bold**</span>
|
|
27
|
+
<span style="color: #94a3b8; font-style: italic;">*italic*</span>
|
|
28
|
+
<span style="color: #94a3b8;"># heading</span>
|
|
29
|
+
</div>
|
|
30
|
+
<textarea
|
|
31
|
+
name={field.key}
|
|
32
|
+
id={field.key}
|
|
33
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
34
|
+
style="min-height: 280px; font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; font-size: 13px; line-height: 1.6; padding: 16px; border-radius: 0 0 6px 6px; resize: vertical;"
|
|
35
|
+
placeholder="Wait... Rich Text Editor is disabled in lite mode. You can write standard HTML or use Markdown syntax here. Content will be safely rendered on the server."
|
|
36
|
+
{...field.required ? { required: true } : {}}
|
|
37
|
+
>{toSafeText(value)}</textarea>
|
|
38
|
+
{#if hasError}
|
|
39
|
+
{#each error as err, _i (_i)}
|
|
40
|
+
<div class="lite-error-text">{err}</div>
|
|
41
|
+
{/each}
|
|
42
|
+
{/if}
|
|
43
|
+
</div>
|
|
44
|
+
{/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 LiteRichTextField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteRichTextField = ReturnType<typeof LiteRichTextField>;
|
|
10
|
+
export default LiteRichTextField;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
import { t } from '@svadmin/core/i18n';
|
|
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 displaySelect(v: unknown): string {
|
|
16
|
+
if (v == null) return '—';
|
|
17
|
+
const opt = field.options?.find(o => String(o.value) === String(v));
|
|
18
|
+
return opt?.label ?? String(v);
|
|
19
|
+
}
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
{#if mode === 'show'}
|
|
23
|
+
<span class="lite-badge">{displaySelect(value)}</span>
|
|
24
|
+
{:else}
|
|
25
|
+
<div>
|
|
26
|
+
<select
|
|
27
|
+
name={field.key}
|
|
28
|
+
id={field.key}
|
|
29
|
+
class="lite-select {hasError ? 'lite-input-error' : ''}"
|
|
30
|
+
{...field.required ? { required: true } : {}}
|
|
31
|
+
>
|
|
32
|
+
<option value="">-- {t('common.select') || 'Select'} --</option>
|
|
33
|
+
{#if field.options}
|
|
34
|
+
{#each field.options as opt, _i (_i)}
|
|
35
|
+
<option value={String(opt.value)} selected={String(value) === String(opt.value)}>
|
|
36
|
+
{opt.label}
|
|
37
|
+
</option>
|
|
38
|
+
{/each}
|
|
39
|
+
{/if}
|
|
40
|
+
</select>
|
|
41
|
+
{#if hasError}
|
|
42
|
+
{#each error as err, _i (_i)}
|
|
43
|
+
<div class="lite-error-text">{err}</div>
|
|
44
|
+
{/each}
|
|
45
|
+
{/if}
|
|
46
|
+
</div>
|
|
47
|
+
{/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 LiteSelectField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteSelectField = ReturnType<typeof LiteSelectField>;
|
|
10
|
+
export default LiteSelectField;
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
const tags = $derived(Array.isArray(value) ? value.map(String) : []);
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
{#if mode === 'show'}
|
|
17
|
+
<div style="display:flex; gap: 4px; flex-wrap: wrap;">
|
|
18
|
+
{#each tags as tag, _i (_i)}
|
|
19
|
+
<span class="lite-badge">{tag}</span>
|
|
20
|
+
{:else}
|
|
21
|
+
<span>—</span>
|
|
22
|
+
{/each}
|
|
23
|
+
</div>
|
|
24
|
+
{:else}
|
|
25
|
+
<div>
|
|
26
|
+
<!-- For SSR without JS, we just accept a comma-separated string -->
|
|
27
|
+
<input
|
|
28
|
+
type="text"
|
|
29
|
+
name={field.key}
|
|
30
|
+
id={field.key}
|
|
31
|
+
value={tags.join(', ')}
|
|
32
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
33
|
+
placeholder="Comma separated tags (e.g. admin, user, internal)"
|
|
34
|
+
/>
|
|
35
|
+
<span style="font-size: 11px; color: #6b7280; display: block; margin-top: 4px;">
|
|
36
|
+
Separate tags with commas.
|
|
37
|
+
</span>
|
|
38
|
+
{#if hasError}
|
|
39
|
+
{#each error as err, _i (_i)}
|
|
40
|
+
<div class="lite-error-text">{err}</div>
|
|
41
|
+
{/each}
|
|
42
|
+
{/if}
|
|
43
|
+
</div>
|
|
44
|
+
{/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 LiteTagField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteTagField = ReturnType<typeof LiteTagField>;
|
|
10
|
+
export default LiteTagField;
|
|
@@ -0,0 +1,35 @@
|
|
|
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>{value == null ? '—' : String(value)}</span>
|
|
18
|
+
{:else}
|
|
19
|
+
<div>
|
|
20
|
+
<input
|
|
21
|
+
type="text"
|
|
22
|
+
name={field.key}
|
|
23
|
+
id={field.key}
|
|
24
|
+
value={String(value ?? '')}
|
|
25
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
26
|
+
placeholder={(field as any).placeholder ?? field.label}
|
|
27
|
+
{...field.required ? { required: true } : {}}
|
|
28
|
+
/>
|
|
29
|
+
{#if hasError}
|
|
30
|
+
{#each error as err, _i (_i)}
|
|
31
|
+
<div class="lite-error-text">{err}</div>
|
|
32
|
+
{/each}
|
|
33
|
+
{/if}
|
|
34
|
+
</div>
|
|
35
|
+
{/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 LiteTextField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteTextField = ReturnType<typeof LiteTextField>;
|
|
10
|
+
export default LiteTextField;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
+
import { toSafeHref, toSafeText } 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
|
+
let displayValue = $derived(toSafeText(value));
|
|
15
|
+
let safeHref = $derived(toSafeHref(value));
|
|
16
|
+
const placeholder = $derived(
|
|
17
|
+
'placeholder' in field && typeof field.placeholder === 'string'
|
|
18
|
+
? field.placeholder
|
|
19
|
+
: field.label
|
|
20
|
+
);
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
{#if mode === 'show'}
|
|
24
|
+
<span>
|
|
25
|
+
{#if displayValue}
|
|
26
|
+
{#if safeHref}
|
|
27
|
+
<a href={safeHref} target="_blank" rel="noopener noreferrer">{displayValue}</a>
|
|
28
|
+
{:else}
|
|
29
|
+
{displayValue}
|
|
30
|
+
{/if}
|
|
31
|
+
{:else}
|
|
32
|
+
—
|
|
33
|
+
{/if}
|
|
34
|
+
</span>
|
|
35
|
+
{:else}
|
|
36
|
+
<div>
|
|
37
|
+
<input
|
|
38
|
+
type="url"
|
|
39
|
+
name={field.key}
|
|
40
|
+
id={field.key}
|
|
41
|
+
value={String(value ?? '')}
|
|
42
|
+
class="lite-input {hasError ? 'lite-input-error' : ''}"
|
|
43
|
+
{placeholder}
|
|
44
|
+
{...field.required ? { required: true } : {}}
|
|
45
|
+
/>
|
|
46
|
+
{#if hasError}
|
|
47
|
+
{#each error as err, _i (_i)}
|
|
48
|
+
<div class="lite-error-text">{err}</div>
|
|
49
|
+
{/each}
|
|
50
|
+
{/if}
|
|
51
|
+
</div>
|
|
52
|
+
{/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 LiteUrlField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteUrlField = ReturnType<typeof LiteUrlField>;
|
|
10
|
+
export default LiteUrlField;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { default as LiteTextField } from './LiteTextField.svelte';
|
|
2
|
+
export { default as LiteEmailField } from './LiteEmailField.svelte';
|
|
3
|
+
export { default as LiteUrlField } from './LiteUrlField.svelte';
|
|
4
|
+
export { default as LiteNumberField } from './LiteNumberField.svelte';
|
|
5
|
+
export { default as LiteDateField } from './LiteDateField.svelte';
|
|
6
|
+
export { default as LiteBooleanField } from './LiteBooleanField.svelte';
|
|
7
|
+
export { default as LiteSelectField } from './LiteSelectField.svelte';
|
|
8
|
+
export { default as LiteMultiSelectField } from './LiteMultiSelectField.svelte';
|
|
9
|
+
export { default as LiteTagField } from './LiteTagField.svelte';
|
|
10
|
+
export { default as LiteRelationField } from './LiteRelationField.svelte';
|
|
11
|
+
export { default as LiteImageField } from './LiteImageField.svelte';
|
|
12
|
+
export { default as LiteFileField } from './LiteFileField.svelte';
|
|
13
|
+
export { default as LiteRichTextField } from './LiteRichTextField.svelte';
|
|
14
|
+
export { default as LiteMarkdownField } from './LiteMarkdownField.svelte';
|
|
15
|
+
export { default as LiteJsonField } from './LiteJsonField.svelte';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** True if server layout load confirms authentication */
|
|
6
|
+
isAuthenticated?: boolean;
|
|
7
|
+
loginUrl?: string;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { isAuthenticated = false, loginUrl = '/lite/login', children }: Props = $props();
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
{#if isAuthenticated}
|
|
15
|
+
{#if children}
|
|
16
|
+
{@render children()}
|
|
17
|
+
{/if}
|
|
18
|
+
{:else}
|
|
19
|
+
<div style="padding: 40px; text-align: center; color: #475569;">
|
|
20
|
+
<h2>Authentication Required</h2>
|
|
21
|
+
<p>Please <a href={loginUrl} style="color: #2563eb;">login here</a> to access this page.</p>
|
|
22
|
+
</div>
|
|
23
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** True if server layout load confirms authentication */
|
|
4
|
+
isAuthenticated?: boolean;
|
|
5
|
+
loginUrl?: string;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
}
|
|
8
|
+
declare const LiteAuthenticated: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteAuthenticated = ReturnType<typeof LiteAuthenticated>;
|
|
10
|
+
export default LiteAuthenticated;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** Whether the user has access (computed from server load function) */
|
|
6
|
+
allowed: boolean;
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
fallback?: Snippet;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { allowed, children, fallback }: Props = $props();
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
{#if allowed}
|
|
15
|
+
{#if children}
|
|
16
|
+
{@render children()}
|
|
17
|
+
{/if}
|
|
18
|
+
{:else}
|
|
19
|
+
{#if fallback}
|
|
20
|
+
{@render fallback()}
|
|
21
|
+
{:else}
|
|
22
|
+
<div style="padding: 24px; background: #fff1f2; color: #be123c; border-radius: 6px; border: 1px solid #fecdd3;">
|
|
23
|
+
<h3>Access Denied</h3>
|
|
24
|
+
<p>You do not have permission to view this content.</p>
|
|
25
|
+
</div>
|
|
26
|
+
{/if}
|
|
27
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Whether the user has access (computed from server load function) */
|
|
4
|
+
allowed: boolean;
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
fallback?: Snippet;
|
|
7
|
+
}
|
|
8
|
+
declare const LiteCanAccess: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type LiteCanAccess = ReturnType<typeof LiteCanAccess>;
|
|
10
|
+
export default LiteCanAccess;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
basePath?: string;
|
|
6
|
+
defaultResource?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { basePath = '/lite', defaultResource = '' }: Props = $props();
|
|
10
|
+
const target = $derived(`${basePath}${defaultResource ? '/' + defaultResource : ''}`);
|
|
11
|
+
|
|
12
|
+
onMount(() => {
|
|
13
|
+
window.location.href = target;
|
|
14
|
+
});
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<noscript>
|
|
18
|
+
<meta http-equiv="refresh" content={`0; url=${target}`} />
|
|
19
|
+
</noscript>
|
|
20
|
+
<p>Redirecting...</p>
|