@svadmin/ui 0.30.0 → 0.30.1
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/dist/components/AdminApp.svelte +5 -0
- package/dist/components/AppearanceSettings.svelte +4 -4
- package/dist/components/AutoTable.svelte +3 -3
- package/dist/components/DraggableHeader.svelte +2 -2
- package/dist/components/TooltipButton.svelte +7 -1
- package/dist/components/TooltipButton.svelte.d.ts +3 -0
- package/dist/router-state.svelte.js +2 -0
- package/package.json +4 -5
|
@@ -191,6 +191,11 @@
|
|
|
191
191
|
{@const Comp = getComponentRegistry().ShowPage}
|
|
192
192
|
<Comp resourceName={params.resource} id={params.id} />
|
|
193
193
|
{/key}
|
|
194
|
+
{:else if route === '/:resource/clone/:id'}
|
|
195
|
+
{#key `${params.resource}-clone-${params.id}`}
|
|
196
|
+
{@const Comp = getComponentRegistry().AutoForm}
|
|
197
|
+
<Comp resourceName={params.resource} mode="create" id={params.id} />
|
|
198
|
+
{/key}
|
|
194
199
|
{/if}
|
|
195
200
|
</div>
|
|
196
201
|
{/key}
|
|
@@ -22,24 +22,24 @@
|
|
|
22
22
|
// Sidebar density
|
|
23
23
|
const DENSITY_KEY = 'svadmin-sidebar-density';
|
|
24
24
|
let density = $state<'compact' | 'standard'>(
|
|
25
|
-
(typeof
|
|
25
|
+
(typeof window !== 'undefined' ? localStorage.getItem(DENSITY_KEY) : null) as 'compact' | 'standard' ?? 'standard'
|
|
26
26
|
);
|
|
27
27
|
|
|
28
28
|
function setDensity(d: 'compact' | 'standard') {
|
|
29
29
|
density = d;
|
|
30
|
-
if (typeof
|
|
30
|
+
if (typeof window !== 'undefined') localStorage.setItem(DENSITY_KEY, d);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
// Page size
|
|
34
34
|
const PAGE_SIZE_KEY = 'svadmin-default-page-size';
|
|
35
35
|
const pageSizeOptions = [10, 20, 50];
|
|
36
36
|
let pageSize = $state<number>(
|
|
37
|
-
typeof
|
|
37
|
+
typeof window !== 'undefined' ? parseInt(localStorage.getItem(PAGE_SIZE_KEY) ?? '10', 10) : 10
|
|
38
38
|
);
|
|
39
39
|
|
|
40
40
|
function setPageSize(size: number) {
|
|
41
41
|
pageSize = size;
|
|
42
|
-
if (typeof
|
|
42
|
+
if (typeof window !== 'undefined') localStorage.setItem(PAGE_SIZE_KEY, String(size));
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
// Locale display names
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
const urlState = readURLState();
|
|
85
85
|
|
|
86
86
|
// Snapshot resource values for initial state (untrack to avoid reactive tracking)
|
|
87
|
-
const storedPageSize = typeof
|
|
87
|
+
const storedPageSize = typeof window !== 'undefined' ? parseInt(localStorage.getItem('svadmin-default-page-size') ?? '', 10) : NaN;
|
|
88
88
|
const initPageSize = untrack(() => resource.pageSize ?? (isNaN(storedPageSize) ? 10 : storedPageSize));
|
|
89
89
|
const initDefaultSort = untrack(() => resource.defaultSort);
|
|
90
90
|
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
let columnVisibility = $state<VisibilityState>((() => {
|
|
172
172
|
// Try to restore from localStorage first
|
|
173
173
|
const storageKey = `svadmin-columns-${resourceName}`;
|
|
174
|
-
if (typeof
|
|
174
|
+
if (typeof window !== 'undefined') {
|
|
175
175
|
try {
|
|
176
176
|
const stored = localStorage.getItem(storageKey);
|
|
177
177
|
if (stored) return JSON.parse(stored);
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
// Persist column visibility to localStorage
|
|
192
192
|
$effect(() => {
|
|
193
193
|
const storageKey = `svadmin-columns-${resourceName}`;
|
|
194
|
-
if (typeof
|
|
194
|
+
if (typeof window !== 'undefined') {
|
|
195
195
|
try {
|
|
196
196
|
localStorage.setItem(storageKey, JSON.stringify(columnVisibility));
|
|
197
197
|
} catch { /* ignore quota errors */ }
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
// Restore saved order from localStorage
|
|
33
33
|
$effect(() => {
|
|
34
34
|
const storageKey = `svadmin-colorder-${resourceName}`;
|
|
35
|
-
if (typeof
|
|
35
|
+
if (typeof window === 'undefined') return;
|
|
36
36
|
try {
|
|
37
37
|
const saved = localStorage.getItem(storageKey);
|
|
38
38
|
if (saved) {
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
|
|
80
80
|
// Persist to localStorage
|
|
81
81
|
const storageKey = `svadmin-colorder-${resourceName}`;
|
|
82
|
-
if (typeof
|
|
82
|
+
if (typeof window !== 'undefined') {
|
|
83
83
|
try {
|
|
84
84
|
localStorage.setItem(storageKey, JSON.stringify(newColumns.map(c => c.id)));
|
|
85
85
|
} catch { /* ignore */ }
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
interface Props extends Omit<HTMLButtonAttributes, 'class' | 'children'> {
|
|
8
8
|
tooltip: string;
|
|
9
|
+
href?: string;
|
|
10
|
+
target?: string;
|
|
11
|
+
rel?: string;
|
|
9
12
|
variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
|
|
10
13
|
size?: 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm';
|
|
11
14
|
side?: 'top' | 'right' | 'bottom' | 'left';
|
|
@@ -24,6 +27,9 @@
|
|
|
24
27
|
disabled = false,
|
|
25
28
|
type = 'button',
|
|
26
29
|
tabindex,
|
|
30
|
+
href,
|
|
31
|
+
target,
|
|
32
|
+
rel,
|
|
27
33
|
children,
|
|
28
34
|
...restProps
|
|
29
35
|
}: Props = $props();
|
|
@@ -32,7 +38,7 @@
|
|
|
32
38
|
<Tooltip.Root>
|
|
33
39
|
<Tooltip.Trigger>
|
|
34
40
|
{#snippet child({ props })}
|
|
35
|
-
{@const buttonProps = { ...props, ...restProps, variant, size, type, class: className, 'aria-label': restProps['aria-label'] ?? tooltip, onclick, disabled, tabindex } as any}
|
|
41
|
+
{@const buttonProps = { ...props, ...restProps, href, target, rel, variant, size, type, class: className, 'aria-label': restProps['aria-label'] ?? tooltip, onclick, disabled, tabindex } as any}
|
|
36
42
|
<Button {...buttonProps}>
|
|
37
43
|
{@render children()}
|
|
38
44
|
</Button>
|
|
@@ -2,6 +2,9 @@ import type { Snippet } from 'svelte';
|
|
|
2
2
|
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
3
3
|
interface Props extends Omit<HTMLButtonAttributes, 'class' | 'children'> {
|
|
4
4
|
tooltip: string;
|
|
5
|
+
href?: string;
|
|
6
|
+
target?: string;
|
|
7
|
+
rel?: string;
|
|
5
8
|
variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
|
|
6
9
|
size?: 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm';
|
|
7
10
|
side?: 'top' | 'right' | 'bottom' | 'left';
|
|
@@ -14,10 +14,12 @@ const ROUTES = [
|
|
|
14
14
|
'/:resource/create',
|
|
15
15
|
'/:resource/edit/:id',
|
|
16
16
|
'/:resource/show/:id',
|
|
17
|
+
'/:resource/clone/:id',
|
|
17
18
|
'/:parent/:parentId/:resource',
|
|
18
19
|
'/:parent/:parentId/:resource/create',
|
|
19
20
|
'/:parent/:parentId/:resource/edit/:id',
|
|
20
21
|
'/:parent/:parentId/:resource/show/:id',
|
|
22
|
+
'/:parent/:parentId/:resource/clone/:id',
|
|
21
23
|
];
|
|
22
24
|
function sync() {
|
|
23
25
|
let path;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@svadmin/ui",
|
|
3
|
-
"version": "0.30.
|
|
3
|
+
"version": "0.30.1",
|
|
4
4
|
"description": "Pre-built admin UI components — AdminApp, AutoTable, AutoForm, Sidebar, Layout",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"./components/*": "./dist/components/*"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@svadmin/core": "^0.21.
|
|
28
|
+
"@svadmin/core": "^0.21.1",
|
|
29
29
|
"@tanstack/svelte-query": "^6.0.0",
|
|
30
30
|
"highlight.js": "^11.11.1",
|
|
31
31
|
"isomorphic-dompurify": "^3.7.1",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@lucide/svelte": "^1.7.0",
|
|
55
55
|
"@tanstack/svelte-table": "^9.0.0-alpha.10",
|
|
56
|
+
"@tanstack/table-core": "^9.0.0-alpha.10",
|
|
56
57
|
"bits-ui": "^2.17.1",
|
|
57
58
|
"clsx": "^2.1.1",
|
|
58
59
|
"cmdk-sv": "^0.0.19",
|
|
@@ -71,9 +72,7 @@
|
|
|
71
72
|
"bugs": {
|
|
72
73
|
"url": "https://github.com/zuohuadong/svadmin/issues"
|
|
73
74
|
},
|
|
74
|
-
"devDependencies": {
|
|
75
|
-
"@tanstack/table-core": "8.21.3"
|
|
76
|
-
},
|
|
75
|
+
"devDependencies": {},
|
|
77
76
|
"scripts": {
|
|
78
77
|
"build": "svelte-package -i src -o dist"
|
|
79
78
|
}
|