hs-uix 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/datatable.js +39 -28
- package/dist/datatable.mjs +39 -28
- package/dist/form.js +204 -76
- package/dist/form.mjs +204 -76
- package/dist/index.js +243 -104
- package/dist/index.mjs +243 -104
- package/package.json +1 -1
package/dist/datatable.js
CHANGED
|
@@ -507,28 +507,33 @@ var DataTable = ({
|
|
|
507
507
|
return next;
|
|
508
508
|
});
|
|
509
509
|
}, []);
|
|
510
|
-
const
|
|
511
|
-
if (!groupedData) return
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
if (expandedGroups.has(group.key)) {
|
|
516
|
-
group.rows.forEach((row) => flat.push({ type: "data", row }));
|
|
517
|
-
}
|
|
518
|
-
});
|
|
519
|
-
return flat;
|
|
520
|
-
}, [groupedData, sortedData, data, serverSide, expandedGroups]);
|
|
521
|
-
const totalItems = serverSide ? totalCount || data.length : flatRows.length;
|
|
510
|
+
const datasetRows = (0, import_react.useMemo)(() => {
|
|
511
|
+
if (!groupedData) return serverSide ? data : sortedData;
|
|
512
|
+
return groupedData.flatMap((group) => group.rows);
|
|
513
|
+
}, [groupedData, sortedData, data, serverSide]);
|
|
514
|
+
const totalItems = serverSide ? totalCount || data.length : datasetRows.length;
|
|
522
515
|
const pageCount = Math.ceil(totalItems / pageSize);
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
} else {
|
|
527
|
-
displayRows = flatRows.slice(
|
|
516
|
+
const paginatedRows = (0, import_react.useMemo)(() => {
|
|
517
|
+
if (serverSide) return datasetRows;
|
|
518
|
+
return datasetRows.slice(
|
|
528
519
|
(activePage - 1) * pageSize,
|
|
529
520
|
activePage * pageSize
|
|
530
521
|
);
|
|
531
|
-
}
|
|
522
|
+
}, [serverSide, datasetRows, activePage, pageSize]);
|
|
523
|
+
const displayRows = (0, import_react.useMemo)(() => {
|
|
524
|
+
if (!groupedData) return paginatedRows.map((row) => ({ type: "data", row }));
|
|
525
|
+
const pageRows = new Set(paginatedRows);
|
|
526
|
+
const rows = [];
|
|
527
|
+
groupedData.forEach((group) => {
|
|
528
|
+
const groupPageRows = group.rows.filter((row) => pageRows.has(row));
|
|
529
|
+
if (groupPageRows.length === 0) return;
|
|
530
|
+
rows.push({ type: "group-header", group });
|
|
531
|
+
if (expandedGroups.has(group.key)) {
|
|
532
|
+
groupPageRows.forEach((row) => rows.push({ type: "data", row }));
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
return rows;
|
|
536
|
+
}, [groupedData, paginatedRows, expandedGroups]);
|
|
532
537
|
const footerData = serverSide ? data : filteredData;
|
|
533
538
|
const activeChips = (0, import_react.useMemo)(() => {
|
|
534
539
|
const chips = [];
|
|
@@ -639,8 +644,8 @@ var DataTable = ({
|
|
|
639
644
|
return displayRows.filter((r) => r.type === "data").map((r) => r.row[rowIdField]).filter((id) => id != null);
|
|
640
645
|
}, [serverSide, data, displayRows, rowIdField]);
|
|
641
646
|
const allRowIds = (0, import_react.useMemo)(
|
|
642
|
-
() =>
|
|
643
|
-
[
|
|
647
|
+
() => datasetRows.map((row) => row[rowIdField]).filter((id) => id != null),
|
|
648
|
+
[datasetRows, rowIdField]
|
|
644
649
|
);
|
|
645
650
|
const handleSelectRow = (0, import_react.useCallback)((rowId, checked) => {
|
|
646
651
|
const next = new Set(selectedIds);
|
|
@@ -687,19 +692,25 @@ var DataTable = ({
|
|
|
687
692
|
if (row) onEditStart(row, field, currentValue);
|
|
688
693
|
}
|
|
689
694
|
}, [onEditStart, data, rowIdField]);
|
|
690
|
-
const commitEdit = (0, import_react.useCallback)((row, field, value) => {
|
|
695
|
+
const commitEdit = (0, import_react.useCallback)((row, field, value, options = {}) => {
|
|
696
|
+
const { keepEditing = false } = options;
|
|
691
697
|
const col = columns.find((c) => c.field === field);
|
|
692
698
|
if (col == null ? void 0 : col.editValidate) {
|
|
693
699
|
const result = col.editValidate(value, row);
|
|
694
700
|
if (result !== true && result !== void 0 && result !== null) {
|
|
695
701
|
setEditError(typeof result === "string" ? result : "Invalid value");
|
|
696
|
-
return;
|
|
702
|
+
return false;
|
|
697
703
|
}
|
|
698
704
|
}
|
|
699
705
|
if (onRowEdit) onRowEdit(row, field, value);
|
|
700
|
-
|
|
701
|
-
|
|
706
|
+
if (!keepEditing) {
|
|
707
|
+
setEditingCell(null);
|
|
708
|
+
setEditValue(null);
|
|
709
|
+
} else {
|
|
710
|
+
setEditValue(value);
|
|
711
|
+
}
|
|
702
712
|
setEditError(null);
|
|
713
|
+
return true;
|
|
703
714
|
}, [onRowEdit, columns]);
|
|
704
715
|
const renderEditControl = (col, row) => {
|
|
705
716
|
const type = col.editType || "text";
|
|
@@ -758,12 +769,12 @@ var DataTable = ({
|
|
|
758
769
|
case "datetime":
|
|
759
770
|
return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.DateInput, { ...extra, name: `${fieldName}-date`, label: "", value: editValue == null ? void 0 : editValue.date, onChange: (val) => {
|
|
760
771
|
const next = { ...editValue, date: val };
|
|
761
|
-
|
|
762
|
-
|
|
772
|
+
handleInput(next);
|
|
773
|
+
commitEdit(row, col.field, next, { keepEditing: true });
|
|
763
774
|
}, onBlur: maybeExitDatetimeEdit }), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TimeInput, { ...extra.timeProps || {}, name: `${fieldName}-time`, label: "", value: editValue == null ? void 0 : editValue.time, onChange: (val) => {
|
|
764
775
|
const next = { ...editValue, time: val };
|
|
765
|
-
|
|
766
|
-
|
|
776
|
+
handleInput(next);
|
|
777
|
+
commitEdit(row, col.field, next, { keepEditing: true });
|
|
767
778
|
}, onBlur: maybeExitDatetimeEdit }));
|
|
768
779
|
case "toggle":
|
|
769
780
|
return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Toggle, { ...extra, name: fieldName, label: "", checked: !!editValue, onChange: commit });
|
package/dist/datatable.mjs
CHANGED
|
@@ -502,28 +502,33 @@ var DataTable = ({
|
|
|
502
502
|
return next;
|
|
503
503
|
});
|
|
504
504
|
}, []);
|
|
505
|
-
const
|
|
506
|
-
if (!groupedData) return
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
if (expandedGroups.has(group.key)) {
|
|
511
|
-
group.rows.forEach((row) => flat.push({ type: "data", row }));
|
|
512
|
-
}
|
|
513
|
-
});
|
|
514
|
-
return flat;
|
|
515
|
-
}, [groupedData, sortedData, data, serverSide, expandedGroups]);
|
|
516
|
-
const totalItems = serverSide ? totalCount || data.length : flatRows.length;
|
|
505
|
+
const datasetRows = useMemo(() => {
|
|
506
|
+
if (!groupedData) return serverSide ? data : sortedData;
|
|
507
|
+
return groupedData.flatMap((group) => group.rows);
|
|
508
|
+
}, [groupedData, sortedData, data, serverSide]);
|
|
509
|
+
const totalItems = serverSide ? totalCount || data.length : datasetRows.length;
|
|
517
510
|
const pageCount = Math.ceil(totalItems / pageSize);
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
} else {
|
|
522
|
-
displayRows = flatRows.slice(
|
|
511
|
+
const paginatedRows = useMemo(() => {
|
|
512
|
+
if (serverSide) return datasetRows;
|
|
513
|
+
return datasetRows.slice(
|
|
523
514
|
(activePage - 1) * pageSize,
|
|
524
515
|
activePage * pageSize
|
|
525
516
|
);
|
|
526
|
-
}
|
|
517
|
+
}, [serverSide, datasetRows, activePage, pageSize]);
|
|
518
|
+
const displayRows = useMemo(() => {
|
|
519
|
+
if (!groupedData) return paginatedRows.map((row) => ({ type: "data", row }));
|
|
520
|
+
const pageRows = new Set(paginatedRows);
|
|
521
|
+
const rows = [];
|
|
522
|
+
groupedData.forEach((group) => {
|
|
523
|
+
const groupPageRows = group.rows.filter((row) => pageRows.has(row));
|
|
524
|
+
if (groupPageRows.length === 0) return;
|
|
525
|
+
rows.push({ type: "group-header", group });
|
|
526
|
+
if (expandedGroups.has(group.key)) {
|
|
527
|
+
groupPageRows.forEach((row) => rows.push({ type: "data", row }));
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
return rows;
|
|
531
|
+
}, [groupedData, paginatedRows, expandedGroups]);
|
|
527
532
|
const footerData = serverSide ? data : filteredData;
|
|
528
533
|
const activeChips = useMemo(() => {
|
|
529
534
|
const chips = [];
|
|
@@ -634,8 +639,8 @@ var DataTable = ({
|
|
|
634
639
|
return displayRows.filter((r) => r.type === "data").map((r) => r.row[rowIdField]).filter((id) => id != null);
|
|
635
640
|
}, [serverSide, data, displayRows, rowIdField]);
|
|
636
641
|
const allRowIds = useMemo(
|
|
637
|
-
() =>
|
|
638
|
-
[
|
|
642
|
+
() => datasetRows.map((row) => row[rowIdField]).filter((id) => id != null),
|
|
643
|
+
[datasetRows, rowIdField]
|
|
639
644
|
);
|
|
640
645
|
const handleSelectRow = useCallback((rowId, checked) => {
|
|
641
646
|
const next = new Set(selectedIds);
|
|
@@ -682,19 +687,25 @@ var DataTable = ({
|
|
|
682
687
|
if (row) onEditStart(row, field, currentValue);
|
|
683
688
|
}
|
|
684
689
|
}, [onEditStart, data, rowIdField]);
|
|
685
|
-
const commitEdit = useCallback((row, field, value) => {
|
|
690
|
+
const commitEdit = useCallback((row, field, value, options = {}) => {
|
|
691
|
+
const { keepEditing = false } = options;
|
|
686
692
|
const col = columns.find((c) => c.field === field);
|
|
687
693
|
if (col == null ? void 0 : col.editValidate) {
|
|
688
694
|
const result = col.editValidate(value, row);
|
|
689
695
|
if (result !== true && result !== void 0 && result !== null) {
|
|
690
696
|
setEditError(typeof result === "string" ? result : "Invalid value");
|
|
691
|
-
return;
|
|
697
|
+
return false;
|
|
692
698
|
}
|
|
693
699
|
}
|
|
694
700
|
if (onRowEdit) onRowEdit(row, field, value);
|
|
695
|
-
|
|
696
|
-
|
|
701
|
+
if (!keepEditing) {
|
|
702
|
+
setEditingCell(null);
|
|
703
|
+
setEditValue(null);
|
|
704
|
+
} else {
|
|
705
|
+
setEditValue(value);
|
|
706
|
+
}
|
|
697
707
|
setEditError(null);
|
|
708
|
+
return true;
|
|
698
709
|
}, [onRowEdit, columns]);
|
|
699
710
|
const renderEditControl = (col, row) => {
|
|
700
711
|
const type = col.editType || "text";
|
|
@@ -753,12 +764,12 @@ var DataTable = ({
|
|
|
753
764
|
case "datetime":
|
|
754
765
|
return /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ React.createElement(DateInput, { ...extra, name: `${fieldName}-date`, label: "", value: editValue == null ? void 0 : editValue.date, onChange: (val) => {
|
|
755
766
|
const next = { ...editValue, date: val };
|
|
756
|
-
|
|
757
|
-
|
|
767
|
+
handleInput(next);
|
|
768
|
+
commitEdit(row, col.field, next, { keepEditing: true });
|
|
758
769
|
}, onBlur: maybeExitDatetimeEdit }), /* @__PURE__ */ React.createElement(TimeInput, { ...extra.timeProps || {}, name: `${fieldName}-time`, label: "", value: editValue == null ? void 0 : editValue.time, onChange: (val) => {
|
|
759
770
|
const next = { ...editValue, time: val };
|
|
760
|
-
|
|
761
|
-
|
|
771
|
+
handleInput(next);
|
|
772
|
+
commitEdit(row, col.field, next, { keepEditing: true });
|
|
762
773
|
}, onBlur: maybeExitDatetimeEdit }));
|
|
763
774
|
case "toggle":
|
|
764
775
|
return /* @__PURE__ */ React.createElement(Toggle, { ...extra, name: fieldName, label: "", checked: !!editValue, onChange: commit });
|