@solidxai/core-ui 0.1.5-beta.10 → 0.1.5-beta.11
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/auth/SolidOTPVerify.d.ts +3 -0
- package/dist/components/auth/SolidOTPVerify.d.ts.map +1 -0
- package/dist/components/auth/SolidOTPVerify.js +67 -0
- package/dist/components/auth/SolidOTPVerify.js.map +1 -0
- package/dist/components/auth/SolidOTPVerify.tsx +133 -0
- package/dist/components/common/AuthBanner.js.map +1 -1
- package/dist/components/core/common/LoadDynamicJsxComponent.d.ts +2 -0
- package/dist/components/core/common/LoadDynamicJsxComponent.d.ts.map +1 -0
- package/dist/components/core/common/LoadDynamicJsxComponent.js +50 -0
- package/dist/components/core/common/LoadDynamicJsxComponent.js.map +1 -0
- package/dist/components/core/common/LoadDynamicJsxComponent.tsx +70 -0
- package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.js +22 -15
- package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.tsx +14 -2
- package/dist/nextAuth/authProviders.d.ts +4 -0
- package/dist/nextAuth/authProviders.d.ts.map +1 -0
- package/dist/nextAuth/authProviders.js +198 -0
- package/dist/nextAuth/authProviders.js.map +1 -0
- package/dist/nextAuth/authProviders.tsx +232 -0
- package/dist/nextAuth/handleLogout.d.ts +2 -0
- package/dist/nextAuth/handleLogout.d.ts.map +1 -0
- package/dist/nextAuth/handleLogout.js +36 -0
- package/dist/nextAuth/handleLogout.js.map +1 -0
- package/dist/nextAuth/handleLogout.tsx +39 -0
- package/dist/nextAuth/refreshAccessToken.d.ts +2 -0
- package/dist/nextAuth/refreshAccessToken.d.ts.map +1 -0
- package/dist/nextAuth/refreshAccessToken.js +24 -0
- package/dist/nextAuth/refreshAccessToken.js.map +1 -0
- package/dist/nextAuth/refreshAccessToken.tsx +28 -0
- package/dist/redux/features/settingsSlice.d.ts +20 -0
- package/dist/redux/features/settingsSlice.d.ts.map +1 -0
- package/dist/redux/features/settingsSlice.js +39 -0
- package/dist/redux/features/settingsSlice.js.map +1 -0
- package/dist/redux/features/settingsSlice.ts +60 -0
- package/package.json +1 -1
- package/dist/components/auth/AuthTabs.d.ts +0 -14
- package/dist/components/auth/AuthTabs.d.ts.map +0 -1
- package/dist/components/auth/AuthTabs.js +0 -19
- package/dist/components/auth/AuthTabs.js.map +0 -1
- package/dist/components/auth/AuthTabs.tsx +0 -38
- package/dist/components/common/SolidErrorStatePage.d.ts +0 -12
- package/dist/components/common/SolidErrorStatePage.d.ts.map +0 -1
- package/dist/components/common/SolidErrorStatePage.js +0 -16
- package/dist/components/common/SolidErrorStatePage.js.map +0 -1
- package/dist/components/common/SolidErrorStatePage.tsx +0 -55
- package/dist/components/core/list/PLAN.md +0 -92
- package/dist/components/core/list/SolidDataTable.d.ts +0 -58
- package/dist/components/core/list/SolidDataTable.d.ts.map +0 -1
- package/dist/components/core/list/SolidDataTable.js +0 -141
- package/dist/components/core/list/SolidDataTable.js.map +0 -1
- package/dist/components/core/list/SolidDataTable.tsx +0 -314
- package/dist/components/core/list/SolidDataTablePagination.d.ts +0 -15
- package/dist/components/core/list/SolidDataTablePagination.d.ts.map +0 -1
- package/dist/components/core/list/SolidDataTablePagination.js +0 -22
- package/dist/components/core/list/SolidDataTablePagination.js.map +0 -1
- package/dist/components/core/list/SolidDataTablePagination.tsx +0 -71
- package/dist/components/layout/AdminTopHeader.d.ts +0 -2
- package/dist/components/layout/AdminTopHeader.d.ts.map +0 -1
- package/dist/components/layout/AdminTopHeader.js +0 -68
- package/dist/components/layout/AdminTopHeader.js.map +0 -1
- package/dist/components/layout/AdminTopHeader.tsx +0 -135
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts +0 -24
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +0 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.js +0 -224
- package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +0 -1
- package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +0 -339
- package/dist/components/shad-cn-ui/SolidButton.d.ts +0 -14
- package/dist/components/shad-cn-ui/SolidButton.d.ts.map +0 -1
- package/dist/components/shad-cn-ui/SolidButton.js +0 -36
- package/dist/components/shad-cn-ui/SolidButton.js.map +0 -1
- package/dist/components/shad-cn-ui/SolidButton.tsx +0 -54
- package/dist/components/shad-cn-ui/SolidInput.d.ts +0 -5
- package/dist/components/shad-cn-ui/SolidInput.d.ts.map +0 -1
- package/dist/components/shad-cn-ui/SolidInput.js +0 -35
- package/dist/components/shad-cn-ui/SolidInput.js.map +0 -1
- package/dist/components/shad-cn-ui/SolidInput.tsx +0 -12
- package/dist/components/shad-cn-ui/SolidNumberInput.d.ts +0 -10
- package/dist/components/shad-cn-ui/SolidNumberInput.d.ts.map +0 -1
- package/dist/components/shad-cn-ui/SolidNumberInput.js +0 -33
- package/dist/components/shad-cn-ui/SolidNumberInput.js.map +0 -1
- package/dist/components/shad-cn-ui/SolidNumberInput.tsx +0 -24
- package/dist/components/shad-cn-ui/SolidSelect.d.ts +0 -16
- package/dist/components/shad-cn-ui/SolidSelect.d.ts.map +0 -1
- package/dist/components/shad-cn-ui/SolidSelect.js +0 -26
- package/dist/components/shad-cn-ui/SolidSelect.js.map +0 -1
- package/dist/components/shad-cn-ui/SolidSelect.tsx +0 -65
- package/dist/components/shad-cn-ui/SolidTabs.d.ts +0 -18
- package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +0 -1
- package/dist/components/shad-cn-ui/SolidTabs.js +0 -22
- package/dist/components/shad-cn-ui/SolidTabs.js.map +0 -1
- package/dist/components/shad-cn-ui/SolidTabs.tsx +0 -73
- package/dist/components/shad-cn-ui/index.d.ts +0 -7
- package/dist/components/shad-cn-ui/index.d.ts.map +0 -1
- package/dist/components/shad-cn-ui/index.js +0 -7
- package/dist/components/shad-cn-ui/index.js.map +0 -1
- package/dist/components/shad-cn-ui/index.ts +0 -6
- package/dist/components/solid-ui/SolidButton.d.ts +0 -14
- package/dist/components/solid-ui/SolidButton.d.ts.map +0 -1
- package/dist/components/solid-ui/SolidButton.js +0 -36
- package/dist/components/solid-ui/SolidButton.js.map +0 -1
- package/dist/components/solid-ui/SolidButton.tsx +0 -54
- package/dist/components/solid-ui/SolidTabs.d.ts +0 -18
- package/dist/components/solid-ui/SolidTabs.d.ts.map +0 -1
- package/dist/components/solid-ui/SolidTabs.js +0 -22
- package/dist/components/solid-ui/SolidTabs.js.map +0 -1
- package/dist/components/solid-ui/SolidTabs.tsx +0 -73
- package/dist/components/solid-ui/index.d.ts +0 -3
- package/dist/components/solid-ui/index.d.ts.map +0 -1
- package/dist/components/solid-ui/index.js +0 -3
- package/dist/components/solid-ui/index.js.map +0 -1
- package/dist/components/solid-ui/index.ts +0 -2
- package/dist/resources/images/errors/error-astronaut-404.png +0 -0
- package/dist/resources/shadcn-base.css +0 -3200
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
export type DataTableStateEvent = {
|
|
4
|
-
sortField?: string;
|
|
5
|
-
sortOrder?: 1 | -1 | 0;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
type HeaderRenderer = React.ReactNode | (() => React.ReactNode);
|
|
9
|
-
type BodyRenderer = (rowData: any) => React.ReactNode;
|
|
10
|
-
|
|
11
|
-
export type SolidColumnProps = {
|
|
12
|
-
field?: string;
|
|
13
|
-
header?: HeaderRenderer;
|
|
14
|
-
body?: BodyRenderer;
|
|
15
|
-
sortable?: boolean;
|
|
16
|
-
selectionMode?: "multiple" | "single" | null;
|
|
17
|
-
headerStyle?: React.CSSProperties;
|
|
18
|
-
style?: React.CSSProperties;
|
|
19
|
-
className?: string;
|
|
20
|
-
headerClassName?: string;
|
|
21
|
-
frozen?: boolean;
|
|
22
|
-
alignFrozen?: "left" | "right";
|
|
23
|
-
[key: string]: any;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export function Column(_props: SolidColumnProps) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
type SolidDataTableProps = {
|
|
31
|
-
value: any[];
|
|
32
|
-
children: React.ReactNode;
|
|
33
|
-
size?: "small" | "normal" | "large";
|
|
34
|
-
viewportHeight?: string;
|
|
35
|
-
dataKey?: string;
|
|
36
|
-
emptyMessage?: React.ReactNode;
|
|
37
|
-
rows?: number;
|
|
38
|
-
first?: number;
|
|
39
|
-
totalRecords?: number;
|
|
40
|
-
rowsPerPageOptions?: number[];
|
|
41
|
-
onPage?: (event: { first: number; rows: number }) => void;
|
|
42
|
-
onSort?: (event: DataTableStateEvent) => void;
|
|
43
|
-
sortField?: string;
|
|
44
|
-
sortOrder?: 1 | -1 | 0;
|
|
45
|
-
removableSort?: boolean;
|
|
46
|
-
selection?: any[];
|
|
47
|
-
selectionMode?: "checkbox" | null;
|
|
48
|
-
onSelectionChange?: (event: { value: any[] }) => void;
|
|
49
|
-
onRowClick?: (event: { data: any }) => void;
|
|
50
|
-
rowClassName?: (rowData: any) => string;
|
|
51
|
-
tableClassName?: string;
|
|
52
|
-
paginatorClassName?: string;
|
|
53
|
-
currentPageReportTemplate?: string;
|
|
54
|
-
[key: string]: any;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(" ");
|
|
58
|
-
|
|
59
|
-
function renderHeaderNode(header?: HeaderRenderer) {
|
|
60
|
-
if (typeof header === "function") return header();
|
|
61
|
-
return header ?? null;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function normalizeColumns(children: React.ReactNode): React.ReactElement<SolidColumnProps>[] {
|
|
65
|
-
return React.Children.toArray(children).filter((child): child is React.ReactElement<SolidColumnProps> => {
|
|
66
|
-
return React.isValidElement(child);
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function resolveSortIcon(active: boolean, order: 1 | -1 | 0): string {
|
|
71
|
-
if (!active || order === 0) return "pi pi-sort-alt";
|
|
72
|
-
return order === 1 ? "pi pi-sort-amount-up-alt" : "pi pi-sort-amount-down";
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function nextSortOrder(active: boolean, order: 1 | -1 | 0, removableSort = true): 1 | -1 | 0 {
|
|
76
|
-
if (!active || order === 0) return 1;
|
|
77
|
-
if (order === 1) return -1;
|
|
78
|
-
return removableSort ? 0 : 1;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function SolidDataTable({
|
|
82
|
-
value,
|
|
83
|
-
children,
|
|
84
|
-
size = "normal",
|
|
85
|
-
viewportHeight,
|
|
86
|
-
dataKey = "id",
|
|
87
|
-
emptyMessage,
|
|
88
|
-
rows = 25,
|
|
89
|
-
first = 0,
|
|
90
|
-
totalRecords = 0,
|
|
91
|
-
rowsPerPageOptions = [10, 25, 50, 100],
|
|
92
|
-
onPage,
|
|
93
|
-
onSort,
|
|
94
|
-
sortField,
|
|
95
|
-
sortOrder = 0,
|
|
96
|
-
removableSort = true,
|
|
97
|
-
selection = [],
|
|
98
|
-
selectionMode,
|
|
99
|
-
onSelectionChange,
|
|
100
|
-
onRowClick,
|
|
101
|
-
rowClassName,
|
|
102
|
-
tableClassName,
|
|
103
|
-
paginatorClassName,
|
|
104
|
-
currentPageReportTemplate = "{first} - {last} of {totalRecords}",
|
|
105
|
-
}: SolidDataTableProps) {
|
|
106
|
-
const columns = normalizeColumns(children);
|
|
107
|
-
const pageRows = value ?? [];
|
|
108
|
-
|
|
109
|
-
const selectedKeys = new Set((selection || []).map((row: any) => String(row?.[dataKey])));
|
|
110
|
-
const allSelected = pageRows.length > 0 && pageRows.every((row: any) => selectedKeys.has(String(row?.[dataKey])));
|
|
111
|
-
|
|
112
|
-
const start = totalRecords === 0 ? 0 : first + 1;
|
|
113
|
-
const end = Math.min(first + rows, totalRecords);
|
|
114
|
-
const currentPage = rows > 0 ? Math.floor(first / rows) + 1 : 1;
|
|
115
|
-
const totalPages = rows > 0 ? Math.max(1, Math.ceil(totalRecords / rows)) : 1;
|
|
116
|
-
|
|
117
|
-
const report = currentPageReportTemplate
|
|
118
|
-
.replace("{first}", String(start))
|
|
119
|
-
.replace("{last}", String(end))
|
|
120
|
-
.replace("{totalRecords}", String(totalRecords));
|
|
121
|
-
|
|
122
|
-
const emitSelection = (nextSelection: any[]) => {
|
|
123
|
-
onSelectionChange?.({ value: nextSelection });
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
const toggleSelectAll = (checked: boolean) => {
|
|
127
|
-
if (!checked) {
|
|
128
|
-
const pageKeys = new Set(pageRows.map((row: any) => String(row?.[dataKey])));
|
|
129
|
-
emitSelection((selection || []).filter((row: any) => !pageKeys.has(String(row?.[dataKey]))));
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const merged = [...(selection || [])];
|
|
133
|
-
const mergedKeys = new Set(merged.map((row: any) => String(row?.[dataKey])));
|
|
134
|
-
pageRows.forEach((row: any) => {
|
|
135
|
-
const key = String(row?.[dataKey]);
|
|
136
|
-
if (!mergedKeys.has(key)) merged.push(row);
|
|
137
|
-
});
|
|
138
|
-
emitSelection(merged);
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
const toggleRowSelection = (rowData: any, checked: boolean) => {
|
|
142
|
-
const key = String(rowData?.[dataKey]);
|
|
143
|
-
if (!checked) {
|
|
144
|
-
emitSelection((selection || []).filter((row: any) => String(row?.[dataKey]) !== key));
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
emitSelection([...(selection || []), rowData]);
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
const densityClass =
|
|
151
|
-
size === "small"
|
|
152
|
-
? "solid-table-density-compact"
|
|
153
|
-
: size === "large"
|
|
154
|
-
? "solid-table-density-comfortable"
|
|
155
|
-
: "solid-table-density-cozy";
|
|
156
|
-
|
|
157
|
-
return (
|
|
158
|
-
<div
|
|
159
|
-
className={cx("solid-data-table-root w-full min-h-0", densityClass)}
|
|
160
|
-
style={{
|
|
161
|
-
height: viewportHeight || "100%",
|
|
162
|
-
maxHeight: viewportHeight || "100%",
|
|
163
|
-
}}
|
|
164
|
-
>
|
|
165
|
-
<div className="solid-data-table-viewport min-h-0 rounded-md border border-border/60 bg-background">
|
|
166
|
-
<table className={cx("w-full text-sm border-collapse", tableClassName)}>
|
|
167
|
-
<thead className="solid-data-table-head sticky top-0 z-2">
|
|
168
|
-
<tr>
|
|
169
|
-
{columns.map((column, index) => {
|
|
170
|
-
const props = column.props;
|
|
171
|
-
const isSelectionColumn = props.selectionMode === "multiple";
|
|
172
|
-
const isSortable = Boolean(props.sortable && props.field && !isSelectionColumn);
|
|
173
|
-
const isActiveSort = isSortable && sortField === props.field;
|
|
174
|
-
const iconClass = resolveSortIcon(Boolean(isActiveSort), sortOrder);
|
|
175
|
-
return (
|
|
176
|
-
<th
|
|
177
|
-
key={`header-${index}`}
|
|
178
|
-
className={cx(
|
|
179
|
-
"solid-data-table-th text-left text-foreground whitespace-nowrap",
|
|
180
|
-
isSelectionColumn ? "solid-data-table-selection-col" : undefined,
|
|
181
|
-
props.headerClassName
|
|
182
|
-
)}
|
|
183
|
-
style={{ ...props.style, ...props.headerStyle }}
|
|
184
|
-
>
|
|
185
|
-
{isSelectionColumn ? (
|
|
186
|
-
<input
|
|
187
|
-
type="checkbox"
|
|
188
|
-
checked={allSelected}
|
|
189
|
-
onChange={(e) => toggleSelectAll(e.currentTarget.checked)}
|
|
190
|
-
aria-label="Select all rows"
|
|
191
|
-
/>
|
|
192
|
-
) : (
|
|
193
|
-
<button
|
|
194
|
-
type="button"
|
|
195
|
-
className={cx("solid-table-header-button", isSortable ? "is-sortable" : undefined)}
|
|
196
|
-
onClick={() => {
|
|
197
|
-
if (!isSortable) return;
|
|
198
|
-
const nextOrder = nextSortOrder(Boolean(isActiveSort), sortOrder, removableSort);
|
|
199
|
-
onSort?.({
|
|
200
|
-
sortField: nextOrder === 0 ? undefined : props.field,
|
|
201
|
-
sortOrder: nextOrder,
|
|
202
|
-
});
|
|
203
|
-
}}
|
|
204
|
-
>
|
|
205
|
-
{renderHeaderNode(props.header)}
|
|
206
|
-
{isSortable ? <i className={iconClass} aria-hidden="true" /> : null}
|
|
207
|
-
</button>
|
|
208
|
-
)}
|
|
209
|
-
</th>
|
|
210
|
-
);
|
|
211
|
-
})}
|
|
212
|
-
</tr>
|
|
213
|
-
</thead>
|
|
214
|
-
<tbody>
|
|
215
|
-
{pageRows.length === 0 ? (
|
|
216
|
-
<tr>
|
|
217
|
-
<td className="px-3 py-6 text-center text-muted-foreground" colSpan={Math.max(columns.length, 1)}>
|
|
218
|
-
{emptyMessage || "No records found"}
|
|
219
|
-
</td>
|
|
220
|
-
</tr>
|
|
221
|
-
) : (
|
|
222
|
-
pageRows.map((rowData: any) => {
|
|
223
|
-
const key = String(rowData?.[dataKey]);
|
|
224
|
-
const rowSelected = selectedKeys.has(key);
|
|
225
|
-
return (
|
|
226
|
-
<tr
|
|
227
|
-
key={key}
|
|
228
|
-
className={cx("solid-data-table-row", rowClassName?.(rowData))}
|
|
229
|
-
onClick={(event) => {
|
|
230
|
-
const target = event.target as HTMLElement;
|
|
231
|
-
if (target.closest("button,a,input,label,[data-no-row-click='true']")) return;
|
|
232
|
-
onRowClick?.({ data: rowData });
|
|
233
|
-
}}
|
|
234
|
-
>
|
|
235
|
-
{columns.map((column, index) => {
|
|
236
|
-
const props = column.props;
|
|
237
|
-
const isSelectionColumn = props.selectionMode === "multiple";
|
|
238
|
-
const content = isSelectionColumn
|
|
239
|
-
? (
|
|
240
|
-
<input
|
|
241
|
-
type="checkbox"
|
|
242
|
-
checked={rowSelected}
|
|
243
|
-
onChange={(e) => toggleRowSelection(rowData, e.currentTarget.checked)}
|
|
244
|
-
onClick={(e) => e.stopPropagation()}
|
|
245
|
-
aria-label="Select row"
|
|
246
|
-
/>
|
|
247
|
-
)
|
|
248
|
-
: props.body
|
|
249
|
-
? props.body(rowData)
|
|
250
|
-
: props.field
|
|
251
|
-
? rowData?.[props.field]
|
|
252
|
-
: null;
|
|
253
|
-
return (
|
|
254
|
-
<td
|
|
255
|
-
key={`cell-${key}-${index}`}
|
|
256
|
-
className={cx(
|
|
257
|
-
"solid-data-table-td align-top text-foreground",
|
|
258
|
-
isSelectionColumn ? "solid-data-table-selection-col" : undefined,
|
|
259
|
-
props.className
|
|
260
|
-
)}
|
|
261
|
-
style={props.style}
|
|
262
|
-
>
|
|
263
|
-
{content}
|
|
264
|
-
</td>
|
|
265
|
-
);
|
|
266
|
-
})}
|
|
267
|
-
</tr>
|
|
268
|
-
);
|
|
269
|
-
})
|
|
270
|
-
)}
|
|
271
|
-
</tbody>
|
|
272
|
-
</table>
|
|
273
|
-
</div>
|
|
274
|
-
|
|
275
|
-
{typeof onPage === "function" ? (
|
|
276
|
-
<div
|
|
277
|
-
className={cx("w-full solid-table-paginator solid-table-paginator-align-end flex items-center justify-end gap-3 text-sm rounded-md border border-border/60 px-3 py-1.5 bg-background", paginatorClassName)}
|
|
278
|
-
>
|
|
279
|
-
<div className="solid-paginator-meta flex items-center gap-2 ml-auto">
|
|
280
|
-
<span className="solid-paginator-label">Rows</span>
|
|
281
|
-
<select
|
|
282
|
-
value={rows}
|
|
283
|
-
onChange={(e) => onPage({ first: 0, rows: Number(e.target.value) })}
|
|
284
|
-
className="solid-paginator-select"
|
|
285
|
-
>
|
|
286
|
-
{rowsPerPageOptions.map((option) => (
|
|
287
|
-
<option key={option} value={option}>{option}</option>
|
|
288
|
-
))}
|
|
289
|
-
</select>
|
|
290
|
-
<span className="solid-paginator-report">{report}</span>
|
|
291
|
-
</div>
|
|
292
|
-
<div className="solid-paginator-actions flex items-center gap-2">
|
|
293
|
-
<button
|
|
294
|
-
type="button"
|
|
295
|
-
className="solid-paginator-btn"
|
|
296
|
-
onClick={() => onPage({ first: Math.max(0, first - rows), rows })}
|
|
297
|
-
disabled={currentPage <= 1}
|
|
298
|
-
>
|
|
299
|
-
Previous
|
|
300
|
-
</button>
|
|
301
|
-
<button
|
|
302
|
-
type="button"
|
|
303
|
-
className="solid-paginator-btn"
|
|
304
|
-
onClick={() => onPage({ first: Math.min((totalPages - 1) * rows, first + rows), rows })}
|
|
305
|
-
disabled={currentPage >= totalPages}
|
|
306
|
-
>
|
|
307
|
-
Next
|
|
308
|
-
</button>
|
|
309
|
-
</div>
|
|
310
|
-
</div>
|
|
311
|
-
) : null}
|
|
312
|
-
</div>
|
|
313
|
-
);
|
|
314
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
type SolidDataTablePaginationProps = {
|
|
2
|
-
rows: number;
|
|
3
|
-
first: number;
|
|
4
|
-
totalRecords: number;
|
|
5
|
-
rowsPerPageOptions?: number[];
|
|
6
|
-
onPage: (event: {
|
|
7
|
-
first: number;
|
|
8
|
-
rows: number;
|
|
9
|
-
}) => void;
|
|
10
|
-
currentPageReportTemplate?: string;
|
|
11
|
-
className?: string;
|
|
12
|
-
};
|
|
13
|
-
export declare function SolidDataTablePagination({ rows, first, totalRecords, rowsPerPageOptions, onPage, currentPageReportTemplate, className, }: SolidDataTablePaginationProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=SolidDataTablePagination.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SolidDataTablePagination.d.ts","sourceRoot":"","sources":["../../../../src/components/core/list/SolidDataTablePagination.tsx"],"names":[],"mappings":"AAEA,KAAK,6BAA6B,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACzD,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,wBAAgB,wBAAwB,CAAC,EACvC,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,kBAAsC,EACtC,MAAM,EACN,yBAAgE,EAChE,SAAS,GACV,EAAE,6BAA6B,2CA+C/B"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
var cx = function () {
|
|
3
|
-
var parts = [];
|
|
4
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
5
|
-
parts[_i] = arguments[_i];
|
|
6
|
-
}
|
|
7
|
-
return parts.filter(Boolean).join(" ");
|
|
8
|
-
};
|
|
9
|
-
export function SolidDataTablePagination(_a) {
|
|
10
|
-
var rows = _a.rows, first = _a.first, totalRecords = _a.totalRecords, _b = _a.rowsPerPageOptions, rowsPerPageOptions = _b === void 0 ? [10, 25, 50, 100] : _b, onPage = _a.onPage, _c = _a.currentPageReportTemplate, currentPageReportTemplate = _c === void 0 ? "{first} - {last} of {totalRecords}" : _c, className = _a.className;
|
|
11
|
-
var safeRows = rows > 0 ? rows : 25;
|
|
12
|
-
var start = totalRecords === 0 ? 0 : first + 1;
|
|
13
|
-
var end = Math.min(first + safeRows, totalRecords);
|
|
14
|
-
var currentPage = Math.floor(first / safeRows) + 1;
|
|
15
|
-
var totalPages = Math.max(1, Math.ceil(totalRecords / safeRows));
|
|
16
|
-
var report = currentPageReportTemplate
|
|
17
|
-
.replace("{first}", String(start))
|
|
18
|
-
.replace("{last}", String(end))
|
|
19
|
-
.replace("{totalRecords}", String(totalRecords));
|
|
20
|
-
return (_jsxs("div", { className: cx("w-full solid-table-paginator flex items-center justify-end gap-3 text-sm rounded-md border border-border/60 px-3 py-1.5 bg-background", className), children: [_jsxs("div", { className: "solid-paginator-meta flex items-center gap-2 ml-auto", children: [_jsx("span", { className: "solid-paginator-label", children: "Rows" }), _jsx("select", { value: safeRows, onChange: function (e) { return onPage({ first: 0, rows: Number(e.target.value) }); }, className: "solid-paginator-select", children: rowsPerPageOptions.map(function (option) { return (_jsx("option", { value: option, children: option }, option)); }) }), _jsx("span", { className: "solid-paginator-report", children: report })] }), _jsxs("div", { className: "solid-paginator-actions flex items-center gap-2", children: [_jsx("button", { type: "button", className: "solid-paginator-btn", onClick: function () { return onPage({ first: Math.max(0, first - safeRows), rows: safeRows }); }, disabled: currentPage <= 1, children: "Previous" }), _jsx("button", { type: "button", className: "solid-paginator-btn", onClick: function () { return onPage({ first: Math.min((totalPages - 1) * safeRows, first + safeRows), rows: safeRows }); }, disabled: currentPage >= totalPages, children: "Next" })] })] }));
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=SolidDataTablePagination.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SolidDataTablePagination.js","sourceRoot":"","sources":["../../../../src/components/core/list/SolidDataTablePagination.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\n\ntype SolidDataTablePaginationProps = {\n rows: number;\n first: number;\n totalRecords: number;\n rowsPerPageOptions?: number[];\n onPage: (event: { first: number; rows: number }) => void;\n currentPageReportTemplate?: string;\n className?: string;\n};\n\nconst cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(\" \");\n\nexport function SolidDataTablePagination({\n rows,\n first,\n totalRecords,\n rowsPerPageOptions = [10, 25, 50, 100],\n onPage,\n currentPageReportTemplate = \"{first} - {last} of {totalRecords}\",\n className,\n}: SolidDataTablePaginationProps) {\n const safeRows = rows > 0 ? rows : 25;\n const start = totalRecords === 0 ? 0 : first + 1;\n const end = Math.min(first + safeRows, totalRecords);\n const currentPage = Math.floor(first / safeRows) + 1;\n const totalPages = Math.max(1, Math.ceil(totalRecords / safeRows));\n\n const report = currentPageReportTemplate\n .replace(\"{first}\", String(start))\n .replace(\"{last}\", String(end))\n .replace(\"{totalRecords}\", String(totalRecords));\n\n return (\n <div className={cx(\"w-full solid-table-paginator flex items-center justify-end gap-3 text-sm rounded-md border border-border/60 px-3 py-1.5 bg-background\", className)}>\n <div className=\"solid-paginator-meta flex items-center gap-2 ml-auto\">\n <span className=\"solid-paginator-label\">Rows</span>\n <select\n value={safeRows}\n onChange={(e) => onPage({ first: 0, rows: Number(e.target.value) })}\n className=\"solid-paginator-select\"\n >\n {rowsPerPageOptions.map((option) => (\n <option key={option} value={option}>{option}</option>\n ))}\n </select>\n <span className=\"solid-paginator-report\">{report}</span>\n </div>\n <div className=\"solid-paginator-actions flex items-center gap-2\">\n <button\n type=\"button\"\n className=\"solid-paginator-btn\"\n onClick={() => onPage({ first: Math.max(0, first - safeRows), rows: safeRows })}\n disabled={currentPage <= 1}\n >\n Previous\n </button>\n <button\n type=\"button\"\n className=\"solid-paginator-btn\"\n onClick={() => onPage({ first: Math.min((totalPages - 1) * safeRows, first + safeRows), rows: safeRows })}\n disabled={currentPage >= totalPages}\n >\n Next\n </button>\n </div>\n </div>\n );\n}\n\n"]}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
type SolidDataTablePaginationProps = {
|
|
4
|
-
rows: number;
|
|
5
|
-
first: number;
|
|
6
|
-
totalRecords: number;
|
|
7
|
-
rowsPerPageOptions?: number[];
|
|
8
|
-
onPage: (event: { first: number; rows: number }) => void;
|
|
9
|
-
currentPageReportTemplate?: string;
|
|
10
|
-
className?: string;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const cx = (...parts: Array<string | undefined | false>) => parts.filter(Boolean).join(" ");
|
|
14
|
-
|
|
15
|
-
export function SolidDataTablePagination({
|
|
16
|
-
rows,
|
|
17
|
-
first,
|
|
18
|
-
totalRecords,
|
|
19
|
-
rowsPerPageOptions = [10, 25, 50, 100],
|
|
20
|
-
onPage,
|
|
21
|
-
currentPageReportTemplate = "{first} - {last} of {totalRecords}",
|
|
22
|
-
className,
|
|
23
|
-
}: SolidDataTablePaginationProps) {
|
|
24
|
-
const safeRows = rows > 0 ? rows : 25;
|
|
25
|
-
const start = totalRecords === 0 ? 0 : first + 1;
|
|
26
|
-
const end = Math.min(first + safeRows, totalRecords);
|
|
27
|
-
const currentPage = Math.floor(first / safeRows) + 1;
|
|
28
|
-
const totalPages = Math.max(1, Math.ceil(totalRecords / safeRows));
|
|
29
|
-
|
|
30
|
-
const report = currentPageReportTemplate
|
|
31
|
-
.replace("{first}", String(start))
|
|
32
|
-
.replace("{last}", String(end))
|
|
33
|
-
.replace("{totalRecords}", String(totalRecords));
|
|
34
|
-
|
|
35
|
-
return (
|
|
36
|
-
<div className={cx("w-full solid-table-paginator flex items-center justify-end gap-3 text-sm rounded-md border border-border/60 px-3 py-1.5 bg-background", className)}>
|
|
37
|
-
<div className="solid-paginator-meta flex items-center gap-2 ml-auto">
|
|
38
|
-
<span className="solid-paginator-label">Rows</span>
|
|
39
|
-
<select
|
|
40
|
-
value={safeRows}
|
|
41
|
-
onChange={(e) => onPage({ first: 0, rows: Number(e.target.value) })}
|
|
42
|
-
className="solid-paginator-select"
|
|
43
|
-
>
|
|
44
|
-
{rowsPerPageOptions.map((option) => (
|
|
45
|
-
<option key={option} value={option}>{option}</option>
|
|
46
|
-
))}
|
|
47
|
-
</select>
|
|
48
|
-
<span className="solid-paginator-report">{report}</span>
|
|
49
|
-
</div>
|
|
50
|
-
<div className="solid-paginator-actions flex items-center gap-2">
|
|
51
|
-
<button
|
|
52
|
-
type="button"
|
|
53
|
-
className="solid-paginator-btn"
|
|
54
|
-
onClick={() => onPage({ first: Math.max(0, first - safeRows), rows: safeRows })}
|
|
55
|
-
disabled={currentPage <= 1}
|
|
56
|
-
>
|
|
57
|
-
Previous
|
|
58
|
-
</button>
|
|
59
|
-
<button
|
|
60
|
-
type="button"
|
|
61
|
-
className="solid-paginator-btn"
|
|
62
|
-
onClick={() => onPage({ first: Math.min((totalPages - 1) * safeRows, first + safeRows), rows: safeRows })}
|
|
63
|
-
disabled={currentPage >= totalPages}
|
|
64
|
-
>
|
|
65
|
-
Next
|
|
66
|
-
</button>
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminTopHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"AAcA,eAAO,MAAM,cAAc,+CAwH1B,CAAC"}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useContext, useMemo } from "react";
|
|
3
|
-
import { usePathname } from "../../hooks/usePathname";
|
|
4
|
-
import { useSearchParams } from "../../hooks/useSearchParams";
|
|
5
|
-
import { useRouter } from "../../hooks/useRouter";
|
|
6
|
-
import { useGetSolidActionByIdQuery } from "../../redux/api/solidActionApi";
|
|
7
|
-
import { LayoutContext } from "./context/layoutcontext";
|
|
8
|
-
var SIDEBAR_TOGGLE_EVENT = "solidx:sidebar-toggle";
|
|
9
|
-
var toLabel = function (value) {
|
|
10
|
-
return decodeURIComponent(value)
|
|
11
|
-
.replace(/[-_]/g, " ")
|
|
12
|
-
.replace(/\b\w/g, function (m) { return m.toUpperCase(); });
|
|
13
|
-
};
|
|
14
|
-
export var AdminTopHeader = function () {
|
|
15
|
-
var pathname = usePathname();
|
|
16
|
-
var searchParams = useSearchParams();
|
|
17
|
-
var router = useRouter();
|
|
18
|
-
var toggleThemeMode = useContext(LayoutContext).toggleThemeMode;
|
|
19
|
-
// We treat actionId as the source of truth for breadcrumb labels.
|
|
20
|
-
// If present, we resolve module/model/action via action-metadata API
|
|
21
|
-
// so breadcrumbs are consistent across list/form/tree/kanban pages.
|
|
22
|
-
var actionId = searchParams.get("actionId");
|
|
23
|
-
var actionResponse = useGetSolidActionByIdQuery(actionId, {
|
|
24
|
-
skip: !actionId,
|
|
25
|
-
}).data;
|
|
26
|
-
var crumbs = useMemo(function () {
|
|
27
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
28
|
-
// API response shapes vary by adapter layer, so normalize defensively.
|
|
29
|
-
var actionData = (_c = (_b = (_a = actionResponse === null || actionResponse === void 0 ? void 0 : actionResponse.data) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : actionResponse === null || actionResponse === void 0 ? void 0 : actionResponse.data) !== null && _c !== void 0 ? _c : actionResponse;
|
|
30
|
-
var moduleFromApi = ((_d = actionData === null || actionData === void 0 ? void 0 : actionData.module) === null || _d === void 0 ? void 0 : _d.displayName) || ((_e = actionData === null || actionData === void 0 ? void 0 : actionData.module) === null || _e === void 0 ? void 0 : _e.name);
|
|
31
|
-
var modelFromApi = ((_f = actionData === null || actionData === void 0 ? void 0 : actionData.model) === null || _f === void 0 ? void 0 : _f.displayName) || ((_g = actionData === null || actionData === void 0 ? void 0 : actionData.model) === null || _g === void 0 ? void 0 : _g.name);
|
|
32
|
-
var actionFromApi = (actionData === null || actionData === void 0 ? void 0 : actionData.displayName) || (actionData === null || actionData === void 0 ? void 0 : actionData.name);
|
|
33
|
-
var actionDataId = (actionData === null || actionData === void 0 ? void 0 : actionData.id) != null ? String(actionData.id) : null;
|
|
34
|
-
var hasMatchingActionData = Boolean(actionId) && actionDataId === actionId;
|
|
35
|
-
// Priority 1: exact business breadcrumb contract requested:
|
|
36
|
-
// <module> > <model> > <action>.
|
|
37
|
-
// We only trust API crumbs when they belong to the current URL's actionId.
|
|
38
|
-
// This avoids stale list breadcrumbs bleeding into form routes that do not
|
|
39
|
-
// carry actionId in their query string.
|
|
40
|
-
if (hasMatchingActionData && (moduleFromApi || modelFromApi || actionFromApi)) {
|
|
41
|
-
return [moduleFromApi, modelFromApi, actionFromApi].filter(Boolean);
|
|
42
|
-
}
|
|
43
|
-
var segments = pathname.split("/").filter(Boolean);
|
|
44
|
-
// Priority 2: derive from route segments when API data is unavailable.
|
|
45
|
-
// This is intentionally ahead of query fallback so form pages don't
|
|
46
|
-
// inherit stale list query labels after list -> form navigation.
|
|
47
|
-
if (segments[0] === "admin" && segments[1] === "core") {
|
|
48
|
-
var moduleName = segments[2];
|
|
49
|
-
var modelName = segments[3];
|
|
50
|
-
var viewName = segments[4];
|
|
51
|
-
var next = [moduleName, modelName, viewName].filter(Boolean).map(function (item) { return toLabel(item); });
|
|
52
|
-
return next.length ? next : ["Admin"];
|
|
53
|
-
}
|
|
54
|
-
var menuItemName = searchParams.get("menuItemName");
|
|
55
|
-
var actionName = searchParams.get("actionName");
|
|
56
|
-
// Priority 3: legacy URL-query fallback for older links/pages.
|
|
57
|
-
if (menuItemName || actionName) {
|
|
58
|
-
return [menuItemName, actionName].filter(Boolean).map(function (item) { return toLabel(item); });
|
|
59
|
-
}
|
|
60
|
-
return ["Admin"];
|
|
61
|
-
}, [actionId, actionResponse, pathname, searchParams]);
|
|
62
|
-
var showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
|
|
63
|
-
var triggerSidebar = function () {
|
|
64
|
-
window.dispatchEvent(new CustomEvent(SIDEBAR_TOGGLE_EVENT));
|
|
65
|
-
};
|
|
66
|
-
return (_jsx("header", { className: "solid-admin-header", children: _jsxs("div", { className: "solid-admin-header-inner", children: [_jsx("button", { type: "button", className: "solid-admin-sidebar-trigger", onClick: triggerSidebar, "aria-label": "Toggle sidebar", children: _jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "1.5", y: "2", width: "13", height: "12", rx: "2", stroke: "currentColor" }), _jsx("path", { d: "M5.5 2V14", stroke: "currentColor" }), _jsx("rect", { x: "8", y: "5.25", width: "4.5", height: "5.5", rx: "0.9", stroke: "currentColor" })] }) }), _jsx("div", { className: "solid-admin-header-sep" }), _jsx("nav", { className: "solid-admin-breadcrumbs", "aria-label": "Breadcrumb", children: crumbs.map(function (crumb, index) { return (_jsxs("span", { className: "solid-admin-crumb", children: [index > 0 && _jsx("span", { className: "solid-admin-crumb-sep", children: "\u203A" }), _jsx("span", { children: crumb })] }, "".concat(crumb, "-").concat(index))); }) }), _jsxs("div", { className: "solid-admin-header-actions", children: [_jsxs("button", { type: "button", className: "solid-admin-theme-toggle", onClick: toggleThemeMode, "aria-label": "Toggle theme", title: "Toggle theme", children: [_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 3l0 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 9l4.65 -4.65", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 14.3l7.37 -7.37", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 19.6l8.85 -8.85", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { className: "solid-sr-only", children: "Toggle theme" })] }), showBack && (_jsx("button", { type: "button", className: "solid-admin-back-btn", onClick: function () { return router.back(); }, "aria-label": "Go back", children: "Back" }))] })] }) }));
|
|
67
|
-
};
|
|
68
|
-
//# sourceMappingURL=AdminTopHeader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminTopHeader.js","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useMemo } from \"react\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useGetSolidActionByIdQuery } from \"../../redux/api/solidActionApi\";\nimport { LayoutContext } from \"./context/layoutcontext\";\n\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\n\nconst toLabel = (value: string) =>\n decodeURIComponent(value)\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n\nexport const AdminTopHeader = () => {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const router = useRouter();\n const { toggleThemeMode } = useContext(LayoutContext);\n\n // We treat actionId as the source of truth for breadcrumb labels.\n // If present, we resolve module/model/action via action-metadata API\n // so breadcrumbs are consistent across list/form/tree/kanban pages.\n const actionId = searchParams.get(\"actionId\");\n const { data: actionResponse } = useGetSolidActionByIdQuery(actionId as string, {\n skip: !actionId,\n });\n\n const crumbs = useMemo(() => {\n // API response shapes vary by adapter layer, so normalize defensively.\n const actionData = actionResponse?.data?.data ?? actionResponse?.data ?? actionResponse;\n const moduleFromApi = actionData?.module?.displayName || actionData?.module?.name;\n const modelFromApi = actionData?.model?.displayName || actionData?.model?.name;\n const actionFromApi = actionData?.displayName || actionData?.name;\n const actionDataId = actionData?.id != null ? String(actionData.id) : null;\n const hasMatchingActionData = Boolean(actionId) && actionDataId === actionId;\n\n // Priority 1: exact business breadcrumb contract requested:\n // <module> > <model> > <action>.\n // We only trust API crumbs when they belong to the current URL's actionId.\n // This avoids stale list breadcrumbs bleeding into form routes that do not\n // carry actionId in their query string.\n if (hasMatchingActionData && (moduleFromApi || modelFromApi || actionFromApi)) {\n return [moduleFromApi, modelFromApi, actionFromApi].filter(Boolean);\n }\n\n const segments = pathname.split(\"/\").filter(Boolean);\n // Priority 2: derive from route segments when API data is unavailable.\n // This is intentionally ahead of query fallback so form pages don't\n // inherit stale list query labels after list -> form navigation.\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const viewName = segments[4];\n const next = [moduleName, modelName, viewName].filter(Boolean).map((item) => toLabel(item!));\n return next.length ? next : [\"Admin\"];\n }\n\n const menuItemName = searchParams.get(\"menuItemName\");\n const actionName = searchParams.get(\"actionName\");\n\n // Priority 3: legacy URL-query fallback for older links/pages.\n if (menuItemName || actionName) {\n return [menuItemName, actionName].filter(Boolean).map((item) => toLabel(item!));\n }\n\n return [\"Admin\"];\n }, [actionId, actionResponse, pathname, searchParams]);\n\n const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const triggerSidebar = () => {\n window.dispatchEvent(new CustomEvent(SIDEBAR_TOGGLE_EVENT));\n };\n\n return (\n <header className=\"solid-admin-header\">\n <div className=\"solid-admin-header-inner\">\n <button\n type=\"button\"\n className=\"solid-admin-sidebar-trigger\"\n onClick={triggerSidebar}\n aria-label=\"Toggle sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2\" stroke=\"currentColor\" />\n <path d=\"M5.5 2V14\" stroke=\"currentColor\" />\n <rect x=\"8\" y=\"5.25\" width=\"4.5\" height=\"5.5\" rx=\"0.9\" stroke=\"currentColor\" />\n </svg>\n </button>\n\n <div className=\"solid-admin-header-sep\" />\n\n <nav className=\"solid-admin-breadcrumbs\" aria-label=\"Breadcrumb\">\n {crumbs.map((crumb, index) => (\n <span key={`${crumb}-${index}`} className=\"solid-admin-crumb\">\n {index > 0 && <span className=\"solid-admin-crumb-sep\">›</span>}\n <span>{crumb}</span>\n </span>\n ))}\n </nav>\n\n <div className=\"solid-admin-header-actions\">\n <button\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={toggleThemeMode}\n aria-label=\"Toggle theme\"\n title=\"Toggle theme\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"solid-sr-only\">Toggle theme</span>\n </button>\n\n {showBack && (\n <button\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={() => router.back()}\n aria-label=\"Go back\"\n >\n Back\n </button>\n )}\n </div>\n </div>\n </header>\n );\n};\n"]}
|