@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/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) state.page = parseInt(page, 10);
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) state.pageSize = parseInt(pageSize, 10);
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 (state.page && state.page > 1) params['page'] = String(state.page);
55
- else delete params['page'];
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 (state.pageSize && state.pageSize !== 10) params['pageSize'] = String(state.pageSize);
58
- else delete params['pageSize'];
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 (state.sortField) params['sort'] = state.sortField;
61
- else delete params['sort'];
64
+ if ('sortField' in state) {
65
+ if (state.sortField) params['sort'] = state.sortField;
66
+ else delete params['sort'];
67
+ }
62
68
 
63
- if (state.sortOrder) params['order'] = state.sortOrder;
64
- else delete params['order'];
69
+ if ('sortOrder' in state) {
70
+ if (state.sortOrder) params['order'] = state.sortOrder;
71
+ else delete params['order'];
72
+ }
65
73
 
66
- if (state.search) params['q'] = state.search;
67
- else delete params['q'];
74
+ if ('search' in state) {
75
+ if (state.search) params['q'] = state.search;
76
+ else delete params['q'];
77
+ }
68
78
 
69
- if (state.filters && state.filters.length > 0) {
70
- params['filters'] = JSON.stringify(state.filters);
71
- } else {
72
- delete params['filters'];
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({ queryKey: [formState.resource] });
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
- list.push({ label: res.label || res.name, link: `/${res.name}`, icon: res.icon });
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') });