@solidxai/core-ui 0.1.9-beta.1 → 0.1.9-beta.2

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.
@@ -1353,9 +1353,11 @@ const SolidFormView = (params: SolidFormViewProps) => {
1353
1353
  const formFieldOnXXX = async (event: ChangeEvent<HTMLInputElement>, eventType: string) => {
1354
1354
  // console.log("formFieldOnXXX", eventType, event);
1355
1355
 
1356
- // Invoke the formik change
1356
+ // Invoke the formik change
1357
1357
  if (eventType === 'onFieldChange') {
1358
1358
  formik.handleChange(event);
1359
+ } else if (eventType === 'onFieldBlur') {
1360
+ formik.handleBlur(event);
1359
1361
  }
1360
1362
 
1361
1363
  // get details from the form event
@@ -68,6 +68,6 @@ type SolidTreeTableProps = {
68
68
  };
69
69
  export declare function SolidTreeColumn(_props: SolidTreeColumnProps): null;
70
70
  export declare const Column: typeof SolidTreeColumn;
71
- export declare function SolidTreeTable({ value, children, loading, expandedKeys, onToggle, onExpand, tableClassName, tableStyle, emptyMessage, selectionMode, selectionKeys, onSelectionChange, sortField, sortOrder, removableSort, onSort, onRowClick, }: SolidTreeTableProps): import("react/jsx-runtime").JSX.Element;
71
+ export declare function SolidTreeTable({ value, children, expandedKeys, onToggle, onExpand, tableClassName, tableStyle, emptyMessage, selectionMode, selectionKeys, onSelectionChange, sortField, sortOrder, removableSort, onSort, onRowClick, }: SolidTreeTableProps): import("react/jsx-runtime").JSX.Element;
72
72
  export {};
73
73
  //# sourceMappingURL=SolidTreeTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SolidTreeTable.d.ts","sourceRoot":"","sources":["../../../../src/components/core/tree/SolidTreeTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SolidTreeTable.d.ts","sourceRoot":"","sources":["../../../../src/components/core/tree/SolidTreeTable.tsx"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
11
11
  };
12
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
13
  import React, { useMemo } from "react";
14
- import { ArrowDownWideNarrow, ArrowUpDown, ArrowUpWideNarrow, ChevronRight, Loader2, Minus } from "lucide-react";
14
+ import { ArrowDownWideNarrow, ArrowUpDown, ArrowUpWideNarrow, ChevronRight, Minus } from "lucide-react";
15
15
  function cx() {
16
16
  var parts = [];
17
17
  for (var _i = 0; _i < arguments.length; _i++) {
@@ -119,7 +119,7 @@ function parseWidthValue(value) {
119
119
  return Number.isFinite(parsed) ? parsed : null;
120
120
  }
121
121
  export function SolidTreeTable(_a) {
122
- var _b = _a.value, value = _b === void 0 ? [] : _b, children = _a.children, _c = _a.loading, loading = _c === void 0 ? false : _c, _d = _a.expandedKeys, expandedKeys = _d === void 0 ? {} : _d, onToggle = _a.onToggle, onExpand = _a.onExpand, tableClassName = _a.tableClassName, tableStyle = _a.tableStyle, emptyMessage = _a.emptyMessage, selectionMode = _a.selectionMode, _e = _a.selectionKeys, selectionKeys = _e === void 0 ? {} : _e, onSelectionChange = _a.onSelectionChange, sortField = _a.sortField, _f = _a.sortOrder, sortOrder = _f === void 0 ? 0 : _f, _g = _a.removableSort, removableSort = _g === void 0 ? true : _g, onSort = _a.onSort, onRowClick = _a.onRowClick;
122
+ var _b = _a.value, value = _b === void 0 ? [] : _b, children = _a.children, _c = _a.expandedKeys, expandedKeys = _c === void 0 ? {} : _c, onToggle = _a.onToggle, onExpand = _a.onExpand, tableClassName = _a.tableClassName, tableStyle = _a.tableStyle, emptyMessage = _a.emptyMessage, selectionMode = _a.selectionMode, _d = _a.selectionKeys, selectionKeys = _d === void 0 ? {} : _d, onSelectionChange = _a.onSelectionChange, sortField = _a.sortField, _e = _a.sortOrder, sortOrder = _e === void 0 ? 0 : _e, _f = _a.removableSort, removableSort = _f === void 0 ? true : _f, onSort = _a.onSort, onRowClick = _a.onRowClick;
123
123
  var columns = useMemo(function () { return normalizeColumns(children); }, [children]);
124
124
  var visibleRows = useMemo(function () { return flattenVisibleNodes(value, expandedKeys); }, [value, expandedKeys]);
125
125
  var selectionWidth = selectionMode === "checkbox" ? 48 : 0;
@@ -188,88 +188,88 @@ export function SolidTreeTable(_a) {
188
188
  }
189
189
  return {};
190
190
  };
191
- return (_jsx("div", { className: "solid-tree-table-root", children: _jsx("div", { className: "solid-data-table-viewport min-h-0 rounded-md border border-border/60 bg-background", children: _jsxs("div", { className: "relative min-h-full", children: [_jsxs("table", { className: cx("w-full text-sm border-collapse", tableClassName), style: tableStyle, children: [_jsx("thead", { className: "solid-data-table-head sticky top-0 z-2", children: _jsxs("tr", { children: [selectionMode === "checkbox" ? (_jsx("th", { className: "solid-data-table-th solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left", style: getStickyStyles("selection", null, "header"), children: _jsx("input", { type: "checkbox", checked: Boolean(allVisibleSelected), onChange: function (event) {
192
- var next = __assign({}, selectionKeys);
193
- visibleRows.forEach(function (_a) {
194
- var node = _a.node;
195
- updateSubtreeSelection(node, event.currentTarget.checked, next);
191
+ return (_jsx("div", { className: "solid-tree-table-root", children: _jsx("div", { className: "solid-data-table-viewport min-h-0 rounded-md border border-border/60 bg-background", children: _jsx("div", { className: "relative min-h-full", children: _jsxs("table", { className: cx("w-full text-sm border-collapse", tableClassName), style: tableStyle, children: [_jsx("thead", { className: "solid-data-table-head sticky top-0 z-2", children: _jsxs("tr", { children: [selectionMode === "checkbox" ? (_jsx("th", { className: "solid-data-table-th solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left", style: getStickyStyles("selection", null, "header"), children: _jsx("input", { type: "checkbox", checked: Boolean(allVisibleSelected), onChange: function (event) {
192
+ var next = __assign({}, selectionKeys);
193
+ visibleRows.forEach(function (_a) {
194
+ var node = _a.node;
195
+ updateSubtreeSelection(node, event.currentTarget.checked, next);
196
+ });
197
+ var reconciled = reconcileSelection(value, next);
198
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange({
199
+ value: reconciled,
200
+ originalEvent: event,
201
+ });
202
+ }, "aria-label": "Select visible rows" }) })) : null, columns.map(function (column, index) {
203
+ var _a, _b;
204
+ var props = column.props;
205
+ var isSortable = Boolean(props.sortable && props.field);
206
+ var isActiveSort = isSortable && sortField === props.field;
207
+ var iconNode = resolveSortIcon(Boolean(isActiveSort), sortOrder);
208
+ return (_jsx("th", { className: cx("solid-data-table-th text-left text-foreground whitespace-nowrap", props.frozen && ((_a = props.alignFrozen) !== null && _a !== void 0 ? _a : "left") === "left" && "solid-tree-sticky-cell solid-tree-sticky-cell-left", props.frozen && props.alignFrozen === "right" && "solid-tree-sticky-cell solid-tree-sticky-cell-right", props.headerClassName), style: __assign(__assign(__assign(__assign({}, props.style), props.headerStyle), { textAlign: normalizeTextAlign((_b = props.alignHeader) !== null && _b !== void 0 ? _b : props.align) }), getStickyStyles("column", index, "header")), children: _jsxs("button", { type: "button", className: cx("solid-table-header-button", isSortable ? "is-sortable" : undefined), onClick: function () {
209
+ if (!isSortable)
210
+ return;
211
+ var nextOrder = nextSortOrder(Boolean(isActiveSort), sortOrder, removableSort);
212
+ onSort === null || onSort === void 0 ? void 0 : onSort({
213
+ sortField: nextOrder === 0 ? undefined : props.field,
214
+ sortOrder: nextOrder,
196
215
  });
216
+ }, children: [renderHeaderNode(props.header), isSortable ? iconNode : null] }) }, "tree-header-".concat(index)));
217
+ })] }) }), _jsx("tbody", { children: visibleRows.length === 0 ? (_jsx("tr", { children: _jsx("td", { className: "px-3 py-10 text-center text-muted-foreground", colSpan: Math.max(columns.length + selectionColSpan, 1), children: emptyMessage || "No records found" }) })) : (visibleRows.map(function (_a, rowIndex) {
218
+ var _b, _c;
219
+ var node = _a.node, depth = _a.depth;
220
+ var key = String((_b = node.key) !== null && _b !== void 0 ? _b : rowIndex);
221
+ var isSelected = Boolean((_c = selectionKeys[key]) === null || _c === void 0 ? void 0 : _c.checked);
222
+ return (_jsxs("tr", { className: cx("solid-data-table-row solid-tree-table-row", isSelected && "is-selected"), onClick: function (event) {
223
+ var target = event.target;
224
+ if (target.closest("button,a,input,label,[data-no-row-click='true']"))
225
+ return;
226
+ onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick({ node: node, originalEvent: event });
227
+ }, children: [selectionMode === "checkbox" ? (_jsx("td", { className: "solid-data-table-td solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left", style: getStickyStyles("selection", null, "body"), children: _jsx("input", { type: "checkbox", checked: isSelected, ref: function (element) {
228
+ var _a;
229
+ if (element) {
230
+ element.indeterminate = Boolean((_a = selectionKeys[key]) === null || _a === void 0 ? void 0 : _a.partialChecked);
231
+ }
232
+ }, onChange: function (event) {
233
+ var next = __assign({}, selectionKeys);
234
+ updateSubtreeSelection(node, event.currentTarget.checked, next);
197
235
  var reconciled = reconcileSelection(value, next);
198
236
  onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange({
199
237
  value: reconciled,
200
238
  originalEvent: event,
201
239
  });
202
- }, "aria-label": "Select visible rows" }) })) : null, columns.map(function (column, index) {
203
- var _a, _b;
240
+ }, onClick: function (event) { return event.stopPropagation(); }, "aria-label": "Select row" }) })) : null, columns.map(function (column, columnIndex) {
241
+ var _a, _b, _c;
204
242
  var props = column.props;
205
- var isSortable = Boolean(props.sortable && props.field);
206
- var isActiveSort = isSortable && sortField === props.field;
207
- var iconNode = resolveSortIcon(Boolean(isActiveSort), sortOrder);
208
- return (_jsx("th", { className: cx("solid-data-table-th text-left text-foreground whitespace-nowrap", props.frozen && ((_a = props.alignFrozen) !== null && _a !== void 0 ? _a : "left") === "left" && "solid-tree-sticky-cell solid-tree-sticky-cell-left", props.frozen && props.alignFrozen === "right" && "solid-tree-sticky-cell solid-tree-sticky-cell-right", props.headerClassName), style: __assign(__assign(__assign(__assign({}, props.style), props.headerStyle), { textAlign: normalizeTextAlign((_b = props.alignHeader) !== null && _b !== void 0 ? _b : props.align) }), getStickyStyles("column", index, "header")), children: _jsxs("button", { type: "button", className: cx("solid-table-header-button", isSortable ? "is-sortable" : undefined), onClick: function () {
209
- if (!isSortable)
210
- return;
211
- var nextOrder = nextSortOrder(Boolean(isActiveSort), sortOrder, removableSort);
212
- onSort === null || onSort === void 0 ? void 0 : onSort({
213
- sortField: nextOrder === 0 ? undefined : props.field,
214
- sortOrder: nextOrder,
215
- });
216
- }, children: [renderHeaderNode(props.header), isSortable ? iconNode : null] }) }, "tree-header-".concat(index)));
217
- })] }) }), _jsx("tbody", { children: visibleRows.length === 0 ? (_jsx("tr", { children: _jsx("td", { className: "px-3 py-10 text-center text-muted-foreground", colSpan: Math.max(columns.length + selectionColSpan, 1), children: emptyMessage || "No records found" }) })) : (visibleRows.map(function (_a, rowIndex) {
218
- var _b, _c;
219
- var node = _a.node, depth = _a.depth;
220
- var key = String((_b = node.key) !== null && _b !== void 0 ? _b : rowIndex);
221
- var isSelected = Boolean((_c = selectionKeys[key]) === null || _c === void 0 ? void 0 : _c.checked);
222
- return (_jsxs("tr", { className: cx("solid-data-table-row solid-tree-table-row", isSelected && "is-selected"), onClick: function (event) {
223
- var target = event.target;
224
- if (target.closest("button,a,input,label,[data-no-row-click='true']"))
225
- return;
226
- onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick({ node: node, originalEvent: event });
227
- }, children: [selectionMode === "checkbox" ? (_jsx("td", { className: "solid-data-table-td solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left", style: getStickyStyles("selection", null, "body"), children: _jsx("input", { type: "checkbox", checked: isSelected, ref: function (element) {
228
- var _a;
229
- if (element) {
230
- element.indeterminate = Boolean((_a = selectionKeys[key]) === null || _a === void 0 ? void 0 : _a.partialChecked);
231
- }
232
- }, onChange: function (event) {
233
- var next = __assign({}, selectionKeys);
234
- updateSubtreeSelection(node, event.currentTarget.checked, next);
235
- var reconciled = reconcileSelection(value, next);
236
- onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange({
237
- value: reconciled,
238
- originalEvent: event,
239
- });
240
- }, onClick: function (event) { return event.stopPropagation(); }, "aria-label": "Select row" }) })) : null, columns.map(function (column, columnIndex) {
241
- var _a, _b, _c;
242
- var props = column.props;
243
- var canExpand = typeof props.expander === "function"
244
- ? props.expander(node)
245
- : Boolean(props.expander);
246
- var isExpanded = Boolean(expandedKeys[key]);
247
- var hasChildren = Boolean((_a = node.children) === null || _a === void 0 ? void 0 : _a.length);
248
- var showExpander = canExpand;
249
- var expanderDisabled = node.leaf === true;
250
- var content = props.body
251
- ? props.body(node, { depth: depth, rowIndex: rowIndex })
252
- : props.field
253
- ? (_b = node === null || node === void 0 ? void 0 : node.data) === null || _b === void 0 ? void 0 : _b[props.field]
254
- : null;
255
- var isExpanderColumn = showExpander && columnIndex === 0;
256
- return (_jsx("td", { className: cx("solid-data-table-td align-top text-foreground", props.frozen && ((_c = props.alignFrozen) !== null && _c !== void 0 ? _c : "left") === "left" && "solid-tree-sticky-cell solid-tree-sticky-cell-left", props.frozen && props.alignFrozen === "right" && "solid-tree-sticky-cell solid-tree-sticky-cell-right", props.className, props.bodyClassName), style: __assign(__assign(__assign({}, props.style), { textAlign: normalizeTextAlign(props.align) }), getStickyStyles("column", columnIndex, "body")), children: isExpanderColumn ? (_jsxs("div", { className: "solid-tree-cell", children: [_jsx("div", { className: "solid-tree-cell-indent", style: { width: "".concat(depth * 1.25, "rem") }, "aria-hidden": "true" }), _jsx("button", { type: "button", className: "solid-tree-expander", disabled: expanderDisabled, onClick: function (event) {
257
- event.stopPropagation();
258
- if (expanderDisabled)
259
- return;
260
- var nextExpanded = __assign({}, expandedKeys);
261
- if (nextExpanded[key]) {
262
- delete nextExpanded[key];
263
- }
264
- else {
265
- nextExpanded[key] = true;
266
- }
267
- onToggle === null || onToggle === void 0 ? void 0 : onToggle({ value: nextExpanded });
268
- if (!isExpanded) {
269
- onExpand === null || onExpand === void 0 ? void 0 : onExpand({ node: node });
270
- }
271
- }, "aria-label": isExpanded ? "Collapse row" : "Expand row", children: expanderDisabled ? (_jsx(Minus, { size: 14, "aria-hidden": "true" })) : (_jsx(ChevronRight, { size: 14, "aria-hidden": "true", className: cx("solid-tree-expander-icon", isExpanded && "is-expanded") })) }), _jsx("div", { className: "solid-tree-cell-content", children: content })] })) : (content) }, "tree-cell-".concat(key, "-").concat(columnIndex)));
272
- })] }, key));
273
- })) })] }), loading ? (_jsx("div", { className: "solid-tree-table-loading-overlay", "aria-live": "polite", "aria-busy": "true", children: _jsxs("div", { className: "solid-tree-table-loading-pill", children: [_jsx(Loader2, { size: 14, className: "animate-spin" }), _jsx("span", { children: "Loading tree\u2026" })] }) })) : null] }) }) }));
243
+ var canExpand = typeof props.expander === "function"
244
+ ? props.expander(node)
245
+ : Boolean(props.expander);
246
+ var isExpanded = Boolean(expandedKeys[key]);
247
+ var hasChildren = Boolean((_a = node.children) === null || _a === void 0 ? void 0 : _a.length);
248
+ var showExpander = canExpand;
249
+ var expanderDisabled = node.leaf === true;
250
+ var content = props.body
251
+ ? props.body(node, { depth: depth, rowIndex: rowIndex })
252
+ : props.field
253
+ ? (_b = node === null || node === void 0 ? void 0 : node.data) === null || _b === void 0 ? void 0 : _b[props.field]
254
+ : null;
255
+ var isExpanderColumn = showExpander && columnIndex === 0;
256
+ return (_jsx("td", { className: cx("solid-data-table-td align-top text-foreground", props.frozen && ((_c = props.alignFrozen) !== null && _c !== void 0 ? _c : "left") === "left" && "solid-tree-sticky-cell solid-tree-sticky-cell-left", props.frozen && props.alignFrozen === "right" && "solid-tree-sticky-cell solid-tree-sticky-cell-right", props.className, props.bodyClassName), style: __assign(__assign(__assign({}, props.style), { textAlign: normalizeTextAlign(props.align) }), getStickyStyles("column", columnIndex, "body")), children: isExpanderColumn ? (_jsxs("div", { className: "solid-tree-cell", children: [_jsx("div", { className: "solid-tree-cell-indent", style: { width: "".concat(depth * 1.25, "rem") }, "aria-hidden": "true" }), _jsx("button", { type: "button", className: "solid-tree-expander", disabled: expanderDisabled, onClick: function (event) {
257
+ event.stopPropagation();
258
+ if (expanderDisabled)
259
+ return;
260
+ var nextExpanded = __assign({}, expandedKeys);
261
+ if (nextExpanded[key]) {
262
+ delete nextExpanded[key];
263
+ }
264
+ else {
265
+ nextExpanded[key] = true;
266
+ }
267
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle({ value: nextExpanded });
268
+ if (!isExpanded) {
269
+ onExpand === null || onExpand === void 0 ? void 0 : onExpand({ node: node });
270
+ }
271
+ }, "aria-label": isExpanded ? "Collapse row" : "Expand row", children: expanderDisabled ? (_jsx(Minus, { size: 14, "aria-hidden": "true" })) : (_jsx(ChevronRight, { size: 14, "aria-hidden": "true", className: cx("solid-tree-expander-icon", isExpanded && "is-expanded") })) }), _jsx("div", { className: "solid-tree-cell-content", children: content })] })) : (content) }, "tree-cell-".concat(key, "-").concat(columnIndex)));
272
+ })] }, key));
273
+ })) })] }) }) }) }));
274
274
  }
275
275
  //# sourceMappingURL=SolidTreeTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SolidTreeTable.js","sourceRoot":"","sources":["../../../../src/components/core/tree/SolidTreeTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo } from \"react\";\nimport { ArrowDownWideNarrow, ArrowUpDown, ArrowUpWideNarrow, ChevronRight, Loader2, Minus } from \"lucide-react\";\n\nexport type SolidTreeNode = {\n key?: string | number;\n data?: any;\n children?: SolidTreeNode[];\n leaf?: boolean;\n [key: string]: any;\n};\n\nexport type SolidTreeSelectionKey = {\n checked?: boolean;\n partialChecked?: boolean;\n [key: string]: any;\n};\n\nexport type SolidTreeSelectionKeys = Record<string, SolidTreeSelectionKey>;\n\ntype HeaderRenderer = React.ReactNode | (() => React.ReactNode);\ntype BodyRenderer = (node: SolidTreeNode, options?: { depth: number; rowIndex: number }) => React.ReactNode;\n\nexport type SolidTreeColumnProps = {\n field?: string;\n header?: HeaderRenderer;\n body?: BodyRenderer;\n sortable?: boolean;\n headerStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n className?: string;\n headerClassName?: string;\n bodyClassName?: string;\n align?: \"left\" | \"center\" | \"right\";\n alignHeader?: \"left\" | \"center\" | \"right\";\n expander?: boolean | ((node: SolidTreeNode) => boolean);\n frozen?: boolean;\n alignFrozen?: \"left\" | \"right\";\n [key: string]: any;\n};\n\ntype SolidTreeTableProps = {\n value?: SolidTreeNode[];\n children: React.ReactNode;\n loading?: boolean;\n expandedKeys?: Record<string, boolean>;\n onToggle?: (event: { value: Record<string, boolean> }) => void;\n onExpand?: (event: { node: SolidTreeNode }) => void;\n tableClassName?: string;\n tableStyle?: React.CSSProperties;\n emptyMessage?: React.ReactNode;\n selectionMode?: \"checkbox\" | null;\n selectionKeys?: SolidTreeSelectionKeys;\n onSelectionChange?: (event: {\n value: SolidTreeSelectionKeys;\n originalEvent: React.MouseEvent<HTMLInputElement>;\n }) => void;\n sortField?: string;\n sortOrder?: 1 | -1 | 0;\n removableSort?: boolean;\n onSort?: (event: { sortField?: string; sortOrder?: 1 | -1 | 0 }) => void;\n onRowClick?: (event: { node: SolidTreeNode; originalEvent: React.MouseEvent<HTMLTableRowElement> }) => void;\n};\n\ntype FlattenedTreeRow = {\n node: SolidTreeNode;\n depth: number;\n};\n\nfunction cx(...parts: Array<string | false | null | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction renderHeaderNode(header?: HeaderRenderer) {\n if (typeof header === \"function\") return header();\n return header ?? null;\n}\n\nexport function SolidTreeColumn(_props: SolidTreeColumnProps) {\n return null;\n}\n\nexport const Column = SolidTreeColumn;\n\nfunction normalizeColumns(children: React.ReactNode): React.ReactElement<SolidTreeColumnProps>[] {\n return React.Children.toArray(children).filter((child): child is React.ReactElement<SolidTreeColumnProps> => {\n return React.isValidElement(child);\n });\n}\n\nfunction resolveSortIcon(active: boolean, order: 1 | -1 | 0): React.ReactNode {\n if (!active || order === 0) return <ArrowUpDown size={14} aria-hidden=\"true\" />;\n return order === 1\n ? <ArrowUpWideNarrow size={14} aria-hidden=\"true\" />\n : <ArrowDownWideNarrow size={14} aria-hidden=\"true\" />;\n}\n\nfunction nextSortOrder(active: boolean, order: 1 | -1 | 0, removableSort = true): 1 | -1 | 0 {\n if (!active || order === 0) return 1;\n if (order === 1) return -1;\n return removableSort ? 0 : 1;\n}\n\nfunction flattenVisibleNodes(\n nodes: SolidTreeNode[],\n expandedKeys: Record<string, boolean>,\n depth = 0\n): FlattenedTreeRow[] {\n return (nodes || []).flatMap((node) => {\n const key = String(node.key ?? \"\");\n const rows: FlattenedTreeRow[] = [{ node, depth }];\n if (expandedKeys[key] && node.children?.length) {\n rows.push(...flattenVisibleNodes(node.children, expandedKeys, depth + 1));\n }\n return rows;\n });\n}\n\nfunction updateSubtreeSelection(\n node: SolidTreeNode,\n selected: boolean,\n selection: SolidTreeSelectionKeys\n) {\n const key = String(node.key ?? \"\");\n if (!key) return;\n\n if (selected) {\n selection[key] = {\n ...selection[key],\n checked: true,\n partialChecked: false,\n };\n } else {\n delete selection[key];\n }\n\n node.children?.forEach((child) => updateSubtreeSelection(child, selected, selection));\n}\n\nfunction reconcileSelection(nodes: SolidTreeNode[], selection: SolidTreeSelectionKeys) {\n const next: SolidTreeSelectionKeys = {};\n\n const visit = (node: SolidTreeNode): { checked: boolean; partialChecked: boolean } => {\n const key = String(node.key ?? \"\");\n const existing = selection[key] || {};\n const childStates = (node.children || []).map(visit);\n\n let checked = Boolean(existing.checked);\n let partialChecked = Boolean(existing.partialChecked);\n\n if (childStates.length > 0) {\n const allChecked = childStates.every((state) => state.checked);\n const anySelected = childStates.some((state) => state.checked || state.partialChecked);\n\n checked = allChecked;\n partialChecked = !allChecked && anySelected;\n }\n\n if (checked || partialChecked) {\n next[key] = {\n ...existing,\n checked,\n partialChecked,\n };\n }\n\n return { checked, partialChecked };\n };\n\n nodes.forEach(visit);\n return next;\n}\n\nfunction normalizeTextAlign(value?: \"left\" | \"center\" | \"right\") {\n if (!value) return undefined;\n return value;\n}\n\nfunction parseWidthValue(value: unknown): number | null {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\") return null;\n\n const trimmed = value.trim();\n if (trimmed.endsWith(\"px\")) {\n const parsed = Number.parseFloat(trimmed.replace(\"px\", \"\"));\n return Number.isFinite(parsed) ? parsed : null;\n }\n if (trimmed.endsWith(\"rem\")) {\n const parsed = Number.parseFloat(trimmed.replace(\"rem\", \"\"));\n return Number.isFinite(parsed) ? parsed * 16 : null;\n }\n\n const parsed = Number.parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function SolidTreeTable({\n value = [],\n children,\n loading = false,\n expandedKeys = {},\n onToggle,\n onExpand,\n tableClassName,\n tableStyle,\n emptyMessage,\n selectionMode,\n selectionKeys = {},\n onSelectionChange,\n sortField,\n sortOrder = 0,\n removableSort = true,\n onSort,\n onRowClick,\n}: SolidTreeTableProps) {\n const columns = useMemo(() => normalizeColumns(children), [children]);\n const visibleRows = useMemo(() => flattenVisibleNodes(value, expandedKeys), [value, expandedKeys]);\n const selectionWidth = selectionMode === \"checkbox\" ? 48 : 0;\n\n const frozenColumnMeta = useMemo(() => {\n const getColumnWidth = (props: SolidTreeColumnProps) =>\n parseWidthValue(props.style?.width)\n ?? parseWidthValue(props.style?.minWidth)\n ?? parseWidthValue(props.headerStyle?.width)\n ?? parseWidthValue(props.headerStyle?.minWidth)\n ?? 160;\n\n const leftOffsets = new Map<number, number>();\n const rightOffsets = new Map<number, number>();\n\n let leftOffset = selectionWidth;\n columns.forEach((column, index) => {\n const props = column.props;\n if (props.frozen && (props.alignFrozen ?? \"left\") === \"left\") {\n leftOffsets.set(index, leftOffset);\n leftOffset += getColumnWidth(props);\n }\n });\n\n let rightOffset = 0;\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const props = columns[index].props;\n if (props.frozen && props.alignFrozen === \"right\") {\n rightOffsets.set(index, rightOffset);\n rightOffset += getColumnWidth(props);\n }\n }\n\n return { leftOffsets, rightOffsets };\n }, [columns, selectionWidth]);\n\n const selectionColSpan = selectionMode === \"checkbox\" ? 1 : 0;\n\n const selectedLeafRows = useMemo(() => {\n return visibleRows.filter(({ node }) => Boolean(selectionKeys[String(node.key ?? \"\")]?.checked));\n }, [visibleRows, selectionKeys]);\n\n const allVisibleSelected =\n selectionMode === \"checkbox\" &&\n visibleRows.length > 0 &&\n selectedLeafRows.length === visibleRows.length;\n\n const getStickyStyles = (\n kind: \"selection\" | \"column\",\n index: number | null,\n position: \"header\" | \"body\"\n ): React.CSSProperties => {\n if (kind === \"selection\") {\n return {\n position: \"sticky\",\n left: 0,\n zIndex: position === \"header\" ? 7 : 5,\n };\n }\n\n if (index === null) return {};\n\n const leftOffset = frozenColumnMeta.leftOffsets.get(index);\n if (leftOffset !== undefined) {\n return {\n position: \"sticky\",\n left: leftOffset,\n zIndex: position === \"header\" ? 6 : 4,\n };\n }\n\n const rightOffset = frozenColumnMeta.rightOffsets.get(index);\n if (rightOffset !== undefined) {\n return {\n position: \"sticky\",\n right: rightOffset,\n zIndex: position === \"header\" ? 6 : 4,\n };\n }\n\n return {};\n };\n\n return (\n <div className=\"solid-tree-table-root\">\n <div className=\"solid-data-table-viewport min-h-0 rounded-md border border-border/60 bg-background\">\n <div className=\"relative min-h-full\">\n <table className={cx(\"w-full text-sm border-collapse\", tableClassName)} style={tableStyle}>\n <thead className=\"solid-data-table-head sticky top-0 z-2\">\n <tr>\n {selectionMode === \"checkbox\" ? (\n <th\n className=\"solid-data-table-th solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left\"\n style={getStickyStyles(\"selection\", null, \"header\")}\n >\n <input\n type=\"checkbox\"\n checked={Boolean(allVisibleSelected)}\n onChange={(event) => {\n const next = { ...selectionKeys };\n visibleRows.forEach(({ node }) => {\n updateSubtreeSelection(node, event.currentTarget.checked, next);\n });\n const reconciled = reconcileSelection(value, next);\n onSelectionChange?.({\n value: reconciled,\n originalEvent: event as unknown as React.MouseEvent<HTMLInputElement>,\n });\n }}\n aria-label=\"Select visible rows\"\n />\n </th>\n ) : null}\n {columns.map((column, index) => {\n const props = column.props;\n const isSortable = Boolean(props.sortable && props.field);\n const isActiveSort = isSortable && sortField === props.field;\n const iconNode = resolveSortIcon(Boolean(isActiveSort), sortOrder);\n\n return (\n <th\n key={`tree-header-${index}`}\n className={cx(\n \"solid-data-table-th text-left text-foreground whitespace-nowrap\",\n props.frozen && (props.alignFrozen ?? \"left\") === \"left\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-left\",\n props.frozen && props.alignFrozen === \"right\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-right\",\n props.headerClassName\n )}\n style={{\n ...props.style,\n ...props.headerStyle,\n textAlign: normalizeTextAlign(props.alignHeader ?? props.align),\n ...getStickyStyles(\"column\", index, \"header\"),\n }}\n >\n <button\n type=\"button\"\n className={cx(\"solid-table-header-button\", isSortable ? \"is-sortable\" : undefined)}\n onClick={() => {\n if (!isSortable) return;\n const nextOrder = nextSortOrder(Boolean(isActiveSort), sortOrder, removableSort);\n onSort?.({\n sortField: nextOrder === 0 ? undefined : props.field,\n sortOrder: nextOrder,\n });\n }}\n >\n {renderHeaderNode(props.header)}\n {isSortable ? iconNode : null}\n </button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {visibleRows.length === 0 ? (\n <tr>\n <td\n className=\"px-3 py-10 text-center text-muted-foreground\"\n colSpan={Math.max(columns.length + selectionColSpan, 1)}\n >\n {emptyMessage || \"No records found\"}\n </td>\n </tr>\n ) : (\n visibleRows.map(({ node, depth }, rowIndex) => {\n const key = String(node.key ?? rowIndex);\n const isSelected = Boolean(selectionKeys[key]?.checked);\n\n return (\n <tr\n key={key}\n className={cx(\"solid-data-table-row solid-tree-table-row\", isSelected && \"is-selected\")}\n onClick={(event) => {\n const target = event.target as HTMLElement;\n if (target.closest(\"button,a,input,label,[data-no-row-click='true']\")) return;\n onRowClick?.({ node, originalEvent: event });\n }}\n >\n {selectionMode === \"checkbox\" ? (\n <td\n className=\"solid-data-table-td solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left\"\n style={getStickyStyles(\"selection\", null, \"body\")}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n ref={(element) => {\n if (element) {\n element.indeterminate = Boolean(selectionKeys[key]?.partialChecked);\n }\n }}\n onChange={(event) => {\n const next = { ...selectionKeys };\n updateSubtreeSelection(node, event.currentTarget.checked, next);\n const reconciled = reconcileSelection(value, next);\n onSelectionChange?.({\n value: reconciled,\n originalEvent: event as unknown as React.MouseEvent<HTMLInputElement>,\n });\n }}\n onClick={(event) => event.stopPropagation()}\n aria-label=\"Select row\"\n />\n </td>\n ) : null}\n {columns.map((column, columnIndex) => {\n const props = column.props;\n const canExpand =\n typeof props.expander === \"function\"\n ? props.expander(node)\n : Boolean(props.expander);\n const isExpanded = Boolean(expandedKeys[key]);\n const hasChildren = Boolean(node.children?.length);\n const showExpander = canExpand;\n const expanderDisabled = node.leaf === true;\n\n const content = props.body\n ? props.body(node, { depth, rowIndex })\n : props.field\n ? node?.data?.[props.field]\n : null;\n\n const isExpanderColumn = showExpander && columnIndex === 0;\n\n return (\n <td\n key={`tree-cell-${key}-${columnIndex}`}\n className={cx(\n \"solid-data-table-td align-top text-foreground\",\n props.frozen && (props.alignFrozen ?? \"left\") === \"left\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-left\",\n props.frozen && props.alignFrozen === \"right\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-right\",\n props.className,\n props.bodyClassName\n )}\n style={{\n ...props.style,\n textAlign: normalizeTextAlign(props.align),\n ...getStickyStyles(\"column\", columnIndex, \"body\"),\n }}\n >\n {isExpanderColumn ? (\n <div className=\"solid-tree-cell\">\n <div\n className=\"solid-tree-cell-indent\"\n style={{ width: `${depth * 1.25}rem` }}\n aria-hidden=\"true\"\n />\n <button\n type=\"button\"\n className=\"solid-tree-expander\"\n disabled={expanderDisabled}\n onClick={(event) => {\n event.stopPropagation();\n if (expanderDisabled) return;\n\n const nextExpanded = { ...expandedKeys };\n if (nextExpanded[key]) {\n delete nextExpanded[key];\n } else {\n nextExpanded[key] = true;\n }\n onToggle?.({ value: nextExpanded });\n if (!isExpanded) {\n onExpand?.({ node });\n }\n }}\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n >\n {expanderDisabled ? (\n <Minus size={14} aria-hidden=\"true\" />\n ) : (\n <ChevronRight\n size={14}\n aria-hidden=\"true\"\n className={cx(\"solid-tree-expander-icon\", isExpanded && \"is-expanded\")}\n />\n )}\n </button>\n <div className=\"solid-tree-cell-content\">{content}</div>\n </div>\n ) : (\n content\n )}\n </td>\n );\n })}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n\n {loading ? (\n <div className=\"solid-tree-table-loading-overlay\" aria-live=\"polite\" aria-busy=\"true\">\n <div className=\"solid-tree-table-loading-pill\">\n <Loader2 size={14} className=\"animate-spin\" />\n <span>Loading tree…</span>\n </div>\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"SolidTreeTable.js","sourceRoot":"","sources":["../../../../src/components/core/tree/SolidTreeTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo } from \"react\";\nimport { ArrowDownWideNarrow, ArrowUpDown, ArrowUpWideNarrow, ChevronRight, Minus } from \"lucide-react\";\n\nexport type SolidTreeNode = {\n key?: string | number;\n data?: any;\n children?: SolidTreeNode[];\n leaf?: boolean;\n [key: string]: any;\n};\n\nexport type SolidTreeSelectionKey = {\n checked?: boolean;\n partialChecked?: boolean;\n [key: string]: any;\n};\n\nexport type SolidTreeSelectionKeys = Record<string, SolidTreeSelectionKey>;\n\ntype HeaderRenderer = React.ReactNode | (() => React.ReactNode);\ntype BodyRenderer = (node: SolidTreeNode, options?: { depth: number; rowIndex: number }) => React.ReactNode;\n\nexport type SolidTreeColumnProps = {\n field?: string;\n header?: HeaderRenderer;\n body?: BodyRenderer;\n sortable?: boolean;\n headerStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n className?: string;\n headerClassName?: string;\n bodyClassName?: string;\n align?: \"left\" | \"center\" | \"right\";\n alignHeader?: \"left\" | \"center\" | \"right\";\n expander?: boolean | ((node: SolidTreeNode) => boolean);\n frozen?: boolean;\n alignFrozen?: \"left\" | \"right\";\n [key: string]: any;\n};\n\ntype SolidTreeTableProps = {\n value?: SolidTreeNode[];\n children: React.ReactNode;\n loading?: boolean;\n expandedKeys?: Record<string, boolean>;\n onToggle?: (event: { value: Record<string, boolean> }) => void;\n onExpand?: (event: { node: SolidTreeNode }) => void;\n tableClassName?: string;\n tableStyle?: React.CSSProperties;\n emptyMessage?: React.ReactNode;\n selectionMode?: \"checkbox\" | null;\n selectionKeys?: SolidTreeSelectionKeys;\n onSelectionChange?: (event: {\n value: SolidTreeSelectionKeys;\n originalEvent: React.MouseEvent<HTMLInputElement>;\n }) => void;\n sortField?: string;\n sortOrder?: 1 | -1 | 0;\n removableSort?: boolean;\n onSort?: (event: { sortField?: string; sortOrder?: 1 | -1 | 0 }) => void;\n onRowClick?: (event: { node: SolidTreeNode; originalEvent: React.MouseEvent<HTMLTableRowElement> }) => void;\n};\n\ntype FlattenedTreeRow = {\n node: SolidTreeNode;\n depth: number;\n};\n\nfunction cx(...parts: Array<string | false | null | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction renderHeaderNode(header?: HeaderRenderer) {\n if (typeof header === \"function\") return header();\n return header ?? null;\n}\n\nexport function SolidTreeColumn(_props: SolidTreeColumnProps) {\n return null;\n}\n\nexport const Column = SolidTreeColumn;\n\nfunction normalizeColumns(children: React.ReactNode): React.ReactElement<SolidTreeColumnProps>[] {\n return React.Children.toArray(children).filter((child): child is React.ReactElement<SolidTreeColumnProps> => {\n return React.isValidElement(child);\n });\n}\n\nfunction resolveSortIcon(active: boolean, order: 1 | -1 | 0): React.ReactNode {\n if (!active || order === 0) return <ArrowUpDown size={14} aria-hidden=\"true\" />;\n return order === 1\n ? <ArrowUpWideNarrow size={14} aria-hidden=\"true\" />\n : <ArrowDownWideNarrow size={14} aria-hidden=\"true\" />;\n}\n\nfunction nextSortOrder(active: boolean, order: 1 | -1 | 0, removableSort = true): 1 | -1 | 0 {\n if (!active || order === 0) return 1;\n if (order === 1) return -1;\n return removableSort ? 0 : 1;\n}\n\nfunction flattenVisibleNodes(\n nodes: SolidTreeNode[],\n expandedKeys: Record<string, boolean>,\n depth = 0\n): FlattenedTreeRow[] {\n return (nodes || []).flatMap((node) => {\n const key = String(node.key ?? \"\");\n const rows: FlattenedTreeRow[] = [{ node, depth }];\n if (expandedKeys[key] && node.children?.length) {\n rows.push(...flattenVisibleNodes(node.children, expandedKeys, depth + 1));\n }\n return rows;\n });\n}\n\nfunction updateSubtreeSelection(\n node: SolidTreeNode,\n selected: boolean,\n selection: SolidTreeSelectionKeys\n) {\n const key = String(node.key ?? \"\");\n if (!key) return;\n\n if (selected) {\n selection[key] = {\n ...selection[key],\n checked: true,\n partialChecked: false,\n };\n } else {\n delete selection[key];\n }\n\n node.children?.forEach((child) => updateSubtreeSelection(child, selected, selection));\n}\n\nfunction reconcileSelection(nodes: SolidTreeNode[], selection: SolidTreeSelectionKeys) {\n const next: SolidTreeSelectionKeys = {};\n\n const visit = (node: SolidTreeNode): { checked: boolean; partialChecked: boolean } => {\n const key = String(node.key ?? \"\");\n const existing = selection[key] || {};\n const childStates = (node.children || []).map(visit);\n\n let checked = Boolean(existing.checked);\n let partialChecked = Boolean(existing.partialChecked);\n\n if (childStates.length > 0) {\n const allChecked = childStates.every((state) => state.checked);\n const anySelected = childStates.some((state) => state.checked || state.partialChecked);\n\n checked = allChecked;\n partialChecked = !allChecked && anySelected;\n }\n\n if (checked || partialChecked) {\n next[key] = {\n ...existing,\n checked,\n partialChecked,\n };\n }\n\n return { checked, partialChecked };\n };\n\n nodes.forEach(visit);\n return next;\n}\n\nfunction normalizeTextAlign(value?: \"left\" | \"center\" | \"right\") {\n if (!value) return undefined;\n return value;\n}\n\nfunction parseWidthValue(value: unknown): number | null {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\") return null;\n\n const trimmed = value.trim();\n if (trimmed.endsWith(\"px\")) {\n const parsed = Number.parseFloat(trimmed.replace(\"px\", \"\"));\n return Number.isFinite(parsed) ? parsed : null;\n }\n if (trimmed.endsWith(\"rem\")) {\n const parsed = Number.parseFloat(trimmed.replace(\"rem\", \"\"));\n return Number.isFinite(parsed) ? parsed * 16 : null;\n }\n\n const parsed = Number.parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function SolidTreeTable({\n value = [],\n children,\n expandedKeys = {},\n onToggle,\n onExpand,\n tableClassName,\n tableStyle,\n emptyMessage,\n selectionMode,\n selectionKeys = {},\n onSelectionChange,\n sortField,\n sortOrder = 0,\n removableSort = true,\n onSort,\n onRowClick,\n}: SolidTreeTableProps) {\n const columns = useMemo(() => normalizeColumns(children), [children]);\n const visibleRows = useMemo(() => flattenVisibleNodes(value, expandedKeys), [value, expandedKeys]);\n const selectionWidth = selectionMode === \"checkbox\" ? 48 : 0;\n\n const frozenColumnMeta = useMemo(() => {\n const getColumnWidth = (props: SolidTreeColumnProps) =>\n parseWidthValue(props.style?.width)\n ?? parseWidthValue(props.style?.minWidth)\n ?? parseWidthValue(props.headerStyle?.width)\n ?? parseWidthValue(props.headerStyle?.minWidth)\n ?? 160;\n\n const leftOffsets = new Map<number, number>();\n const rightOffsets = new Map<number, number>();\n\n let leftOffset = selectionWidth;\n columns.forEach((column, index) => {\n const props = column.props;\n if (props.frozen && (props.alignFrozen ?? \"left\") === \"left\") {\n leftOffsets.set(index, leftOffset);\n leftOffset += getColumnWidth(props);\n }\n });\n\n let rightOffset = 0;\n for (let index = columns.length - 1; index >= 0; index -= 1) {\n const props = columns[index].props;\n if (props.frozen && props.alignFrozen === \"right\") {\n rightOffsets.set(index, rightOffset);\n rightOffset += getColumnWidth(props);\n }\n }\n\n return { leftOffsets, rightOffsets };\n }, [columns, selectionWidth]);\n\n const selectionColSpan = selectionMode === \"checkbox\" ? 1 : 0;\n\n const selectedLeafRows = useMemo(() => {\n return visibleRows.filter(({ node }) => Boolean(selectionKeys[String(node.key ?? \"\")]?.checked));\n }, [visibleRows, selectionKeys]);\n\n const allVisibleSelected =\n selectionMode === \"checkbox\" &&\n visibleRows.length > 0 &&\n selectedLeafRows.length === visibleRows.length;\n\n const getStickyStyles = (\n kind: \"selection\" | \"column\",\n index: number | null,\n position: \"header\" | \"body\"\n ): React.CSSProperties => {\n if (kind === \"selection\") {\n return {\n position: \"sticky\",\n left: 0,\n zIndex: position === \"header\" ? 7 : 5,\n };\n }\n\n if (index === null) return {};\n\n const leftOffset = frozenColumnMeta.leftOffsets.get(index);\n if (leftOffset !== undefined) {\n return {\n position: \"sticky\",\n left: leftOffset,\n zIndex: position === \"header\" ? 6 : 4,\n };\n }\n\n const rightOffset = frozenColumnMeta.rightOffsets.get(index);\n if (rightOffset !== undefined) {\n return {\n position: \"sticky\",\n right: rightOffset,\n zIndex: position === \"header\" ? 6 : 4,\n };\n }\n\n return {};\n };\n\n return (\n <div className=\"solid-tree-table-root\">\n <div className=\"solid-data-table-viewport min-h-0 rounded-md border border-border/60 bg-background\">\n <div className=\"relative min-h-full\">\n <table className={cx(\"w-full text-sm border-collapse\", tableClassName)} style={tableStyle}>\n <thead className=\"solid-data-table-head sticky top-0 z-2\">\n <tr>\n {selectionMode === \"checkbox\" ? (\n <th\n className=\"solid-data-table-th solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left\"\n style={getStickyStyles(\"selection\", null, \"header\")}\n >\n <input\n type=\"checkbox\"\n checked={Boolean(allVisibleSelected)}\n onChange={(event) => {\n const next = { ...selectionKeys };\n visibleRows.forEach(({ node }) => {\n updateSubtreeSelection(node, event.currentTarget.checked, next);\n });\n const reconciled = reconcileSelection(value, next);\n onSelectionChange?.({\n value: reconciled,\n originalEvent: event as unknown as React.MouseEvent<HTMLInputElement>,\n });\n }}\n aria-label=\"Select visible rows\"\n />\n </th>\n ) : null}\n {columns.map((column, index) => {\n const props = column.props;\n const isSortable = Boolean(props.sortable && props.field);\n const isActiveSort = isSortable && sortField === props.field;\n const iconNode = resolveSortIcon(Boolean(isActiveSort), sortOrder);\n\n return (\n <th\n key={`tree-header-${index}`}\n className={cx(\n \"solid-data-table-th text-left text-foreground whitespace-nowrap\",\n props.frozen && (props.alignFrozen ?? \"left\") === \"left\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-left\",\n props.frozen && props.alignFrozen === \"right\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-right\",\n props.headerClassName\n )}\n style={{\n ...props.style,\n ...props.headerStyle,\n textAlign: normalizeTextAlign(props.alignHeader ?? props.align),\n ...getStickyStyles(\"column\", index, \"header\"),\n }}\n >\n <button\n type=\"button\"\n className={cx(\"solid-table-header-button\", isSortable ? \"is-sortable\" : undefined)}\n onClick={() => {\n if (!isSortable) return;\n const nextOrder = nextSortOrder(Boolean(isActiveSort), sortOrder, removableSort);\n onSort?.({\n sortField: nextOrder === 0 ? undefined : props.field,\n sortOrder: nextOrder,\n });\n }}\n >\n {renderHeaderNode(props.header)}\n {isSortable ? iconNode : null}\n </button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {visibleRows.length === 0 ? (\n <tr>\n <td\n className=\"px-3 py-10 text-center text-muted-foreground\"\n colSpan={Math.max(columns.length + selectionColSpan, 1)}\n >\n {emptyMessage || \"No records found\"}\n </td>\n </tr>\n ) : (\n visibleRows.map(({ node, depth }, rowIndex) => {\n const key = String(node.key ?? rowIndex);\n const isSelected = Boolean(selectionKeys[key]?.checked);\n\n return (\n <tr\n key={key}\n className={cx(\"solid-data-table-row solid-tree-table-row\", isSelected && \"is-selected\")}\n onClick={(event) => {\n const target = event.target as HTMLElement;\n if (target.closest(\"button,a,input,label,[data-no-row-click='true']\")) return;\n onRowClick?.({ node, originalEvent: event });\n }}\n >\n {selectionMode === \"checkbox\" ? (\n <td\n className=\"solid-data-table-td solid-data-table-selection-col solid-tree-sticky-cell solid-tree-sticky-cell-left\"\n style={getStickyStyles(\"selection\", null, \"body\")}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n ref={(element) => {\n if (element) {\n element.indeterminate = Boolean(selectionKeys[key]?.partialChecked);\n }\n }}\n onChange={(event) => {\n const next = { ...selectionKeys };\n updateSubtreeSelection(node, event.currentTarget.checked, next);\n const reconciled = reconcileSelection(value, next);\n onSelectionChange?.({\n value: reconciled,\n originalEvent: event as unknown as React.MouseEvent<HTMLInputElement>,\n });\n }}\n onClick={(event) => event.stopPropagation()}\n aria-label=\"Select row\"\n />\n </td>\n ) : null}\n {columns.map((column, columnIndex) => {\n const props = column.props;\n const canExpand =\n typeof props.expander === \"function\"\n ? props.expander(node)\n : Boolean(props.expander);\n const isExpanded = Boolean(expandedKeys[key]);\n const hasChildren = Boolean(node.children?.length);\n const showExpander = canExpand;\n const expanderDisabled = node.leaf === true;\n\n const content = props.body\n ? props.body(node, { depth, rowIndex })\n : props.field\n ? node?.data?.[props.field]\n : null;\n\n const isExpanderColumn = showExpander && columnIndex === 0;\n\n return (\n <td\n key={`tree-cell-${key}-${columnIndex}`}\n className={cx(\n \"solid-data-table-td align-top text-foreground\",\n props.frozen && (props.alignFrozen ?? \"left\") === \"left\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-left\",\n props.frozen && props.alignFrozen === \"right\" && \"solid-tree-sticky-cell solid-tree-sticky-cell-right\",\n props.className,\n props.bodyClassName\n )}\n style={{\n ...props.style,\n textAlign: normalizeTextAlign(props.align),\n ...getStickyStyles(\"column\", columnIndex, \"body\"),\n }}\n >\n {isExpanderColumn ? (\n <div className=\"solid-tree-cell\">\n <div\n className=\"solid-tree-cell-indent\"\n style={{ width: `${depth * 1.25}rem` }}\n aria-hidden=\"true\"\n />\n <button\n type=\"button\"\n className=\"solid-tree-expander\"\n disabled={expanderDisabled}\n onClick={(event) => {\n event.stopPropagation();\n if (expanderDisabled) return;\n\n const nextExpanded = { ...expandedKeys };\n if (nextExpanded[key]) {\n delete nextExpanded[key];\n } else {\n nextExpanded[key] = true;\n }\n onToggle?.({ value: nextExpanded });\n if (!isExpanded) {\n onExpand?.({ node });\n }\n }}\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n >\n {expanderDisabled ? (\n <Minus size={14} aria-hidden=\"true\" />\n ) : (\n <ChevronRight\n size={14}\n aria-hidden=\"true\"\n className={cx(\"solid-tree-expander-icon\", isExpanded && \"is-expanded\")}\n />\n )}\n </button>\n <div className=\"solid-tree-cell-content\">{content}</div>\n </div>\n ) : (\n content\n )}\n </td>\n );\n })}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import React, { useMemo } from "react";
2
- import { ArrowDownWideNarrow, ArrowUpDown, ArrowUpWideNarrow, ChevronRight, Loader2, Minus } from "lucide-react";
2
+ import { ArrowDownWideNarrow, ArrowUpDown, ArrowUpWideNarrow, ChevronRight, Minus } from "lucide-react";
3
3
 
4
4
  export type SolidTreeNode = {
5
5
  key?: string | number;
@@ -196,7 +196,6 @@ function parseWidthValue(value: unknown): number | null {
196
196
  export function SolidTreeTable({
197
197
  value = [],
198
198
  children,
199
- loading = false,
200
199
  expandedKeys = {},
201
200
  onToggle,
202
201
  onExpand,
@@ -507,14 +506,6 @@ export function SolidTreeTable({
507
506
  </tbody>
508
507
  </table>
509
508
 
510
- {loading ? (
511
- <div className="solid-tree-table-loading-overlay" aria-live="polite" aria-busy="true">
512
- <div className="solid-tree-table-loading-pill">
513
- <Loader2 size={14} className="animate-spin" />
514
- <span>Loading tree…</span>
515
- </div>
516
- </div>
517
- ) : null}
518
509
  </div>
519
510
  </div>
520
511
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"StudioLandingPage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/studio/StudioLandingPage.tsx"],"names":[],"mappings":"AAgQA,wBAAgB,iBAAiB,4CA+DhC"}
1
+ {"version":3,"file":"StudioLandingPage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/studio/StudioLandingPage.tsx"],"names":[],"mappings":"AA+PA,wBAAgB,iBAAiB,4CAoGhC"}
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
+ import { useDispatch } from "react-redux";
3
4
  import { useNavigate } from "react-router-dom";
4
5
  import { useSolidLayoutRegistry } from "../../SolidLayoutRegistry";
5
6
  import { ChatIcon } from "../../../components/layout/SolidAiStudioLayout";
6
7
  import { env } from "../../../adapters/env";
8
+ import { showToast } from "../../../redux/features/toastSlice";
7
9
  // ── Icons ──────────────────────────────────────────────────────────────────────
8
10
  var ArrowIcon = function () { return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M2.5 7h9M8 3.5l3.5 3.5L8 10.5", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", strokeLinejoin: "round" }) })); };
9
11
  var LayoutPlaceholderIcon = function () { return (_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "1", y: "1", width: "16", height: "16", rx: "2.5", stroke: "currentColor", strokeWidth: "1.3" }), _jsx("path", { d: "M1 6h16", stroke: "currentColor", strokeWidth: "1.1" }), _jsx("path", { d: "M6 6v11", stroke: "currentColor", strokeWidth: "1.1" })] })); };
@@ -55,12 +57,9 @@ function CardFooter(_a) {
55
57
  return _jsx("div", { className: "solid-studio-card-footer ".concat(className), children: children });
56
58
  }
57
59
  // ── Empty state ───────────────────────────────────────────────────────────────
58
- function EmptyState() {
59
- return (_jsx("div", { className: "solid-studio-landing-empty-container", children: _jsxs(Card, { className: "solid-studio-landing-empty-card", children: [_jsxs(CardHeader, { className: "solid-studio-landing-empty-header", children: [_jsx("div", { className: "solid-studio-home-badge", style: { marginBottom: '12px' }, children: "Frontend Studio" }), _jsx(CardTitle, { children: "Frontend layout will appear here" }), _jsx(CardDescription, { children: "Register your app layouts to explore and customize them in the Studio." })] }), _jsxs(CardContent, { className: "solid-studio-landing-empty-body", children: [_jsxs("div", { className: "solid-studio-landing-empty-primary-action", children: [_jsxs("p", { children: ["To get started, use the ", _jsx("strong", { children: "SolidX AI Agent" }), " to add a new custom layout."] }), _jsxs("button", { type: "button", className: "solid-studio-empty-cta-button", onClick: function () {
60
- var aiUrl = env("VITE_SOLIDX_AI_URL");
61
- if (aiUrl)
62
- window.open(aiUrl, "_blank");
63
- }, children: [_jsx(ChatIcon, {}), _jsx("span", { children: "Open AI Chat" })] })] }), _jsx("div", { className: "solid-studio-landing-empty-divider" }), _jsxs("div", { className: "solid-studio-landing-empty-details", children: [_jsxs("p", { className: "solid-studio-landing-empty-instruction", children: ["Any route with a ", _jsx("code", { children: "path" }), " and ", _jsx("code", { children: "children" }), " passed to", " ", _jsx("code", { children: "getSolidRoutes()" }), " will automatically appear as a card."] }), _jsx("div", { className: "solid-studio-landing-snippet", children: _jsx("pre", { children: _jsx("code", { children: "// AppRoutes.tsx\nconst extraRoutes = [\n {\n path: \"/my-layout\",\n element: <MyLayout />,\n children: [{ index: true, element: <MyPage /> }],\n },\n];\n\ngetSolidRoutes({ extraRoutes });" }) }) }), _jsxs("p", { className: "solid-studio-landing-hint", children: [_jsx("strong", { children: "Pro Tip:" }), " Add ", _jsxs("code", { children: ["handle: ", "{ title, description }"] }), " to a route to customize its appearance."] })] })] })] }) }));
60
+ function EmptyState(_a) {
61
+ var onOpenChat = _a.onOpenChat;
62
+ return (_jsx("div", { className: "solid-studio-landing-empty-container", children: _jsxs(Card, { className: "solid-studio-landing-empty-card", children: [_jsxs(CardHeader, { className: "solid-studio-landing-empty-header", children: [_jsx("div", { className: "solid-studio-home-badge", style: { marginBottom: '12px' }, children: "Frontend Studio" }), _jsx(CardTitle, { children: "Frontend layout will appear here" }), _jsx(CardDescription, { children: "Register your app layouts to explore and customize them in the Studio." })] }), _jsxs(CardContent, { className: "solid-studio-landing-empty-body", children: [_jsxs("div", { className: "solid-studio-landing-empty-primary-action", children: [_jsxs("p", { children: ["To get started, use the ", _jsx("strong", { children: "SolidX AI Agent" }), " to add a new custom layout."] }), _jsxs("button", { type: "button", className: "solid-studio-empty-cta-button", onClick: onOpenChat, children: [_jsx(ChatIcon, {}), _jsx("span", { children: "Open AI Chat" })] })] }), _jsx("div", { className: "solid-studio-landing-empty-divider" }), _jsxs("div", { className: "solid-studio-landing-empty-details", children: [_jsxs("p", { className: "solid-studio-landing-empty-instruction", children: ["Any route with a ", _jsx("code", { children: "path" }), " and ", _jsx("code", { children: "children" }), " passed to", " ", _jsx("code", { children: "getSolidRoutes()" }), " will automatically appear as a card."] }), _jsx("div", { className: "solid-studio-landing-snippet", children: _jsx("pre", { children: _jsx("code", { children: "// AppRoutes.tsx\nconst extraRoutes = [\n {\n path: \"/my-layout\",\n element: <MyLayout />,\n children: [{ index: true, element: <MyPage /> }],\n },\n];\n\ngetSolidRoutes({ extraRoutes });" }) }) }), _jsxs("p", { className: "solid-studio-landing-hint", children: [_jsx("strong", { children: "Pro Tip:" }), " Add ", _jsxs("code", { children: ["handle: ", "{ title, description }"] }), " to a route to customize its appearance."] })] })] })] }) }));
64
63
  }
65
64
  // ── Card ──────────────────────────────────────────────────────────────────────
66
65
  function LayoutCard(_a) {
@@ -71,8 +70,37 @@ function LayoutCard(_a) {
71
70
  }
72
71
  // ── Page ──────────────────────────────────────────────────────────────────────
73
72
  export function StudioLandingPage() {
73
+ var dispatch = useDispatch();
74
74
  var layouts = useSolidLayoutRegistry();
75
75
  var _a = useState(false), listView = _a[0], setListView = _a[1];
76
- return (_jsx("div", { className: "solid-studio-home ".concat(layouts.length > 0 ? "solid-studio-home--top" : ""), children: _jsxs("div", { className: "solid-studio-home-inner ".concat(layouts.length > 0 ? "solid-studio-home-inner--fluid" : ""), children: [_jsx("div", { className: "solid-studio-home-toolbar", children: layouts.length > 0 && (_jsxs("div", { className: "solid-studio-home-toolbar-right", children: [_jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(!listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(false); }, "aria-label": "Grid view", title: "Grid view", children: _jsx(GridViewIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(true); }, "aria-label": "List view", title: "List view", children: _jsx(ListViewIcon, {}) })] })) }), layouts.length === 0 ? (_jsx(EmptyState, {})) : listView ? (_jsx("div", { className: "solid-studio-home-cards--list", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: true }, entry.path)); }) })) : (_jsx("div", { className: "solid-studio-home-cards solid-studio-home-cards--fluid", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: false }, entry.path)); }) }))] }) }));
76
+ var handleOpenAiChat = function () {
77
+ var aiUrl = env("VITE_SOLIDX_AI_URL");
78
+ if (!aiUrl) {
79
+ dispatch(showToast({
80
+ severity: "error",
81
+ summary: "AI Chat unavailable",
82
+ detail: "VITE_SOLIDX_AI_URL is not configured.",
83
+ }));
84
+ return;
85
+ }
86
+ try {
87
+ var chatWindow = window.open(aiUrl, "_blank", "noopener,noreferrer");
88
+ if (!chatWindow) {
89
+ dispatch(showToast({
90
+ severity: "error",
91
+ summary: "AI Chat unavailable",
92
+ detail: "Unable to open chat window. Please allow pop-ups and try again.",
93
+ }));
94
+ }
95
+ }
96
+ catch (_a) {
97
+ dispatch(showToast({
98
+ severity: "error",
99
+ summary: "AI Chat unavailable",
100
+ detail: "Failed to open chat. Please check the configured URL.",
101
+ }));
102
+ }
103
+ };
104
+ return (_jsx("div", { className: "solid-studio-home ".concat(layouts.length > 0 ? "solid-studio-home--top" : ""), children: _jsxs("div", { className: "solid-studio-home-inner ".concat(layouts.length > 0 ? "solid-studio-home-inner--fluid" : ""), children: [_jsx("div", { className: "solid-studio-home-toolbar", children: layouts.length > 0 && (_jsxs("div", { className: "solid-studio-home-toolbar-right", children: [_jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(!listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(false); }, "aria-label": "Grid view", title: "Grid view", children: _jsx(GridViewIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(true); }, "aria-label": "List view", title: "List view", children: _jsx(ListViewIcon, {}) })] })) }), layouts.length === 0 ? (_jsx(EmptyState, { onOpenChat: handleOpenAiChat })) : listView ? (_jsx("div", { className: "solid-studio-home-cards--list", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: true }, entry.path)); }) })) : (_jsx("div", { className: "solid-studio-home-cards solid-studio-home-cards--fluid", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: false }, entry.path)); }) }))] }) }));
77
105
  }
78
106
  //# sourceMappingURL=StudioLandingPage.js.map