@svadmin/core 0.22.1 → 0.23.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/package.json +1 -1
- package/src/audit.ts +5 -0
- package/src/auth-hooks.svelte.ts +34 -24
- package/src/chatProvider.svelte.ts +8 -21
- package/src/context.svelte.ts +20 -0
- package/src/data-transfer.svelte.ts +13 -10
- package/src/form-hooks.svelte.ts +103 -43
- package/src/helpers-pure.ts +159 -0
- package/src/helpers.test.ts +177 -0
- package/src/helpers.ts +9 -118
- package/src/hook-utils.svelte.ts +27 -6
- package/src/hooks.svelte.ts +100 -17
- package/src/i18n.svelte.ts +23 -17
- package/src/index.ts +11 -4
- package/src/live.svelte.ts +35 -19
- package/src/mutation-hooks.svelte.ts +162 -73
- package/src/notification.svelte.ts +9 -5
- package/src/options.svelte.ts +42 -19
- package/src/permissions.ts +4 -0
- package/src/query-hooks.svelte.ts +70 -20
- package/src/router-provider.ts +3 -1
- package/src/router.ts +23 -2
- package/src/routing-hooks.svelte.ts +37 -12
- package/src/table-hooks.svelte.ts +61 -15
- package/src/table-state.svelte.ts +2 -1
- package/src/theme.svelte.ts +30 -24
- package/src/toast.svelte.ts +22 -11
- package/src/types.ts +3 -1
- package/src/url-sync.ts +28 -16
- package/src/utility-hooks.svelte.ts +14 -4
package/src/url-sync.ts
CHANGED
|
@@ -19,10 +19,10 @@ export function readURLState(): URLState {
|
|
|
19
19
|
const state: URLState = {};
|
|
20
20
|
|
|
21
21
|
const page = params['page'];
|
|
22
|
-
if (page)
|
|
22
|
+
if (page) { const n = parseInt(page, 10); if (!isNaN(n) && n > 0) state.page = n; }
|
|
23
23
|
|
|
24
24
|
const pageSize = params['pageSize'];
|
|
25
|
-
if (pageSize)
|
|
25
|
+
if (pageSize) { const n = parseInt(pageSize, 10); if (!isNaN(n) && n > 0) state.pageSize = n; }
|
|
26
26
|
|
|
27
27
|
const sortField = params['sort'];
|
|
28
28
|
if (sortField) state.sortField = sortField;
|
|
@@ -51,25 +51,37 @@ export function writeURLState(state: URLState): void {
|
|
|
51
51
|
const current = rp.parse();
|
|
52
52
|
const params: Record<string, string> = { ...current.params };
|
|
53
53
|
|
|
54
|
-
if (
|
|
55
|
-
|
|
54
|
+
if ('page' in state) {
|
|
55
|
+
if (state.page && state.page > 1) params['page'] = String(state.page);
|
|
56
|
+
else delete params['page'];
|
|
57
|
+
}
|
|
56
58
|
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
+
if ('pageSize' in state) {
|
|
60
|
+
if (state.pageSize && state.pageSize !== 10) params['pageSize'] = String(state.pageSize);
|
|
61
|
+
else delete params['pageSize'];
|
|
62
|
+
}
|
|
59
63
|
|
|
60
|
-
if (
|
|
61
|
-
|
|
64
|
+
if ('sortField' in state) {
|
|
65
|
+
if (state.sortField) params['sort'] = state.sortField;
|
|
66
|
+
else delete params['sort'];
|
|
67
|
+
}
|
|
62
68
|
|
|
63
|
-
if (
|
|
64
|
-
|
|
69
|
+
if ('sortOrder' in state) {
|
|
70
|
+
if (state.sortOrder) params['order'] = state.sortOrder;
|
|
71
|
+
else delete params['order'];
|
|
72
|
+
}
|
|
65
73
|
|
|
66
|
-
if (
|
|
67
|
-
|
|
74
|
+
if ('search' in state) {
|
|
75
|
+
if (state.search) params['q'] = state.search;
|
|
76
|
+
else delete params['q'];
|
|
77
|
+
}
|
|
68
78
|
|
|
69
|
-
if (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
79
|
+
if ('filters' in state) {
|
|
80
|
+
if (state.filters && state.filters.length > 0) {
|
|
81
|
+
params['filters'] = JSON.stringify(state.filters);
|
|
82
|
+
} else {
|
|
83
|
+
delete params['filters'];
|
|
84
|
+
}
|
|
73
85
|
}
|
|
74
86
|
|
|
75
87
|
// Prevent redundant navigation if nothing actually changed
|
|
@@ -56,7 +56,8 @@ export function useModalForm<
|
|
|
56
56
|
visible = false;
|
|
57
57
|
formState.reset();
|
|
58
58
|
if (options.autoSave?.invalidateOnClose) {
|
|
59
|
-
queryClient.invalidateQueries({
|
|
59
|
+
queryClient.invalidateQueries({ predicate: (q) => q.queryKey[1] === formState.resource && (q.queryKey[2] === 'list' || q.queryKey[2] === 'infiniteList' || q.queryKey[2] === 'select') });
|
|
60
|
+
queryClient.invalidateQueries({ predicate: (q) => q.queryKey[1] === formState.resource && q.queryKey[2] === 'many' });
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
|
|
@@ -83,11 +84,11 @@ export interface MenuConfig {
|
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
export function useMenu() {
|
|
86
|
-
const adminOptions = getAdminOptions();
|
|
87
|
-
const resources = getResources();
|
|
88
87
|
const parsed = useParsed();
|
|
89
88
|
|
|
90
89
|
const menuItems = $derived.by<MenuConfig[]>(() => {
|
|
90
|
+
const adminOptions = getAdminOptions();
|
|
91
|
+
const resources = getResources();
|
|
91
92
|
let items: MenuConfig[] = resources
|
|
92
93
|
.filter((r: ResourceDefinition) => r.showInMenu !== false)
|
|
93
94
|
.map((r: ResourceDefinition): MenuConfig => ({
|
|
@@ -127,7 +128,16 @@ export function useBreadcrumb() {
|
|
|
127
128
|
|
|
128
129
|
try {
|
|
129
130
|
const res = getResource(parsed.resource);
|
|
130
|
-
|
|
131
|
+
const chain: { label: string; link: string; icon?: string }[] = [];
|
|
132
|
+
let current: typeof res | undefined = res;
|
|
133
|
+
const visited = new Set<string>();
|
|
134
|
+
while (current) {
|
|
135
|
+
if (visited.has(current.name)) break;
|
|
136
|
+
visited.add(current.name);
|
|
137
|
+
chain.unshift({ label: current.label || current.name, link: `/${current.name}`, icon: current.icon });
|
|
138
|
+
current = current.parentName ? getResource(current.parentName) : undefined;
|
|
139
|
+
}
|
|
140
|
+
list.push(...chain);
|
|
131
141
|
|
|
132
142
|
if (parsed.action === 'create') {
|
|
133
143
|
list.push({ label: t('common.create') });
|