@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.
Files changed (114) hide show
  1. package/dist/components/auth/SolidOTPVerify.d.ts +3 -0
  2. package/dist/components/auth/SolidOTPVerify.d.ts.map +1 -0
  3. package/dist/components/auth/SolidOTPVerify.js +67 -0
  4. package/dist/components/auth/SolidOTPVerify.js.map +1 -0
  5. package/dist/components/auth/SolidOTPVerify.tsx +133 -0
  6. package/dist/components/common/AuthBanner.js.map +1 -1
  7. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts +2 -0
  8. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts.map +1 -0
  9. package/dist/components/core/common/LoadDynamicJsxComponent.js +50 -0
  10. package/dist/components/core/common/LoadDynamicJsxComponent.js.map +1 -0
  11. package/dist/components/core/common/LoadDynamicJsxComponent.tsx +70 -0
  12. package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
  13. package/dist/components/core/form/fields/SolidMediaSingleField.js +22 -15
  14. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  15. package/dist/components/core/form/fields/SolidMediaSingleField.tsx +14 -2
  16. package/dist/nextAuth/authProviders.d.ts +4 -0
  17. package/dist/nextAuth/authProviders.d.ts.map +1 -0
  18. package/dist/nextAuth/authProviders.js +198 -0
  19. package/dist/nextAuth/authProviders.js.map +1 -0
  20. package/dist/nextAuth/authProviders.tsx +232 -0
  21. package/dist/nextAuth/handleLogout.d.ts +2 -0
  22. package/dist/nextAuth/handleLogout.d.ts.map +1 -0
  23. package/dist/nextAuth/handleLogout.js +36 -0
  24. package/dist/nextAuth/handleLogout.js.map +1 -0
  25. package/dist/nextAuth/handleLogout.tsx +39 -0
  26. package/dist/nextAuth/refreshAccessToken.d.ts +2 -0
  27. package/dist/nextAuth/refreshAccessToken.d.ts.map +1 -0
  28. package/dist/nextAuth/refreshAccessToken.js +24 -0
  29. package/dist/nextAuth/refreshAccessToken.js.map +1 -0
  30. package/dist/nextAuth/refreshAccessToken.tsx +28 -0
  31. package/dist/redux/features/settingsSlice.d.ts +20 -0
  32. package/dist/redux/features/settingsSlice.d.ts.map +1 -0
  33. package/dist/redux/features/settingsSlice.js +39 -0
  34. package/dist/redux/features/settingsSlice.js.map +1 -0
  35. package/dist/redux/features/settingsSlice.ts +60 -0
  36. package/package.json +1 -1
  37. package/dist/components/auth/AuthTabs.d.ts +0 -14
  38. package/dist/components/auth/AuthTabs.d.ts.map +0 -1
  39. package/dist/components/auth/AuthTabs.js +0 -19
  40. package/dist/components/auth/AuthTabs.js.map +0 -1
  41. package/dist/components/auth/AuthTabs.tsx +0 -38
  42. package/dist/components/common/SolidErrorStatePage.d.ts +0 -12
  43. package/dist/components/common/SolidErrorStatePage.d.ts.map +0 -1
  44. package/dist/components/common/SolidErrorStatePage.js +0 -16
  45. package/dist/components/common/SolidErrorStatePage.js.map +0 -1
  46. package/dist/components/common/SolidErrorStatePage.tsx +0 -55
  47. package/dist/components/core/list/PLAN.md +0 -92
  48. package/dist/components/core/list/SolidDataTable.d.ts +0 -58
  49. package/dist/components/core/list/SolidDataTable.d.ts.map +0 -1
  50. package/dist/components/core/list/SolidDataTable.js +0 -141
  51. package/dist/components/core/list/SolidDataTable.js.map +0 -1
  52. package/dist/components/core/list/SolidDataTable.tsx +0 -314
  53. package/dist/components/core/list/SolidDataTablePagination.d.ts +0 -15
  54. package/dist/components/core/list/SolidDataTablePagination.d.ts.map +0 -1
  55. package/dist/components/core/list/SolidDataTablePagination.js +0 -22
  56. package/dist/components/core/list/SolidDataTablePagination.js.map +0 -1
  57. package/dist/components/core/list/SolidDataTablePagination.tsx +0 -71
  58. package/dist/components/layout/AdminTopHeader.d.ts +0 -2
  59. package/dist/components/layout/AdminTopHeader.d.ts.map +0 -1
  60. package/dist/components/layout/AdminTopHeader.js +0 -68
  61. package/dist/components/layout/AdminTopHeader.js.map +0 -1
  62. package/dist/components/layout/AdminTopHeader.tsx +0 -135
  63. package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts +0 -24
  64. package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +0 -1
  65. package/dist/components/shad-cn-ui/SolidAutocomplete.js +0 -224
  66. package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +0 -1
  67. package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +0 -339
  68. package/dist/components/shad-cn-ui/SolidButton.d.ts +0 -14
  69. package/dist/components/shad-cn-ui/SolidButton.d.ts.map +0 -1
  70. package/dist/components/shad-cn-ui/SolidButton.js +0 -36
  71. package/dist/components/shad-cn-ui/SolidButton.js.map +0 -1
  72. package/dist/components/shad-cn-ui/SolidButton.tsx +0 -54
  73. package/dist/components/shad-cn-ui/SolidInput.d.ts +0 -5
  74. package/dist/components/shad-cn-ui/SolidInput.d.ts.map +0 -1
  75. package/dist/components/shad-cn-ui/SolidInput.js +0 -35
  76. package/dist/components/shad-cn-ui/SolidInput.js.map +0 -1
  77. package/dist/components/shad-cn-ui/SolidInput.tsx +0 -12
  78. package/dist/components/shad-cn-ui/SolidNumberInput.d.ts +0 -10
  79. package/dist/components/shad-cn-ui/SolidNumberInput.d.ts.map +0 -1
  80. package/dist/components/shad-cn-ui/SolidNumberInput.js +0 -33
  81. package/dist/components/shad-cn-ui/SolidNumberInput.js.map +0 -1
  82. package/dist/components/shad-cn-ui/SolidNumberInput.tsx +0 -24
  83. package/dist/components/shad-cn-ui/SolidSelect.d.ts +0 -16
  84. package/dist/components/shad-cn-ui/SolidSelect.d.ts.map +0 -1
  85. package/dist/components/shad-cn-ui/SolidSelect.js +0 -26
  86. package/dist/components/shad-cn-ui/SolidSelect.js.map +0 -1
  87. package/dist/components/shad-cn-ui/SolidSelect.tsx +0 -65
  88. package/dist/components/shad-cn-ui/SolidTabs.d.ts +0 -18
  89. package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +0 -1
  90. package/dist/components/shad-cn-ui/SolidTabs.js +0 -22
  91. package/dist/components/shad-cn-ui/SolidTabs.js.map +0 -1
  92. package/dist/components/shad-cn-ui/SolidTabs.tsx +0 -73
  93. package/dist/components/shad-cn-ui/index.d.ts +0 -7
  94. package/dist/components/shad-cn-ui/index.d.ts.map +0 -1
  95. package/dist/components/shad-cn-ui/index.js +0 -7
  96. package/dist/components/shad-cn-ui/index.js.map +0 -1
  97. package/dist/components/shad-cn-ui/index.ts +0 -6
  98. package/dist/components/solid-ui/SolidButton.d.ts +0 -14
  99. package/dist/components/solid-ui/SolidButton.d.ts.map +0 -1
  100. package/dist/components/solid-ui/SolidButton.js +0 -36
  101. package/dist/components/solid-ui/SolidButton.js.map +0 -1
  102. package/dist/components/solid-ui/SolidButton.tsx +0 -54
  103. package/dist/components/solid-ui/SolidTabs.d.ts +0 -18
  104. package/dist/components/solid-ui/SolidTabs.d.ts.map +0 -1
  105. package/dist/components/solid-ui/SolidTabs.js +0 -22
  106. package/dist/components/solid-ui/SolidTabs.js.map +0 -1
  107. package/dist/components/solid-ui/SolidTabs.tsx +0 -73
  108. package/dist/components/solid-ui/index.d.ts +0 -3
  109. package/dist/components/solid-ui/index.d.ts.map +0 -1
  110. package/dist/components/solid-ui/index.js +0 -3
  111. package/dist/components/solid-ui/index.js.map +0 -1
  112. package/dist/components/solid-ui/index.ts +0 -2
  113. package/dist/resources/images/errors/error-astronaut-404.png +0 -0
  114. 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,2 +0,0 @@
1
- export declare const AdminTopHeader: () => import("react/jsx-runtime").JSX.Element;
2
- //# sourceMappingURL=AdminTopHeader.d.ts.map
@@ -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"]}