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 CHANGED
@@ -507,28 +507,33 @@ var DataTable = ({
507
507
  return next;
508
508
  });
509
509
  }, []);
510
- const flatRows = (0, import_react.useMemo)(() => {
511
- if (!groupedData) return (serverSide ? data : sortedData).map((row) => ({ type: "data", row }));
512
- const flat = [];
513
- groupedData.forEach((group) => {
514
- flat.push({ type: "group-header", group });
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
- let displayRows;
524
- if (serverSide) {
525
- displayRows = groupBy ? flatRows : data.map((row) => ({ type: "data", row }));
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
- () => flatRows.filter((r) => r.type === "data").map((r) => r.row[rowIdField]).filter((id) => id != null),
643
- [flatRows, rowIdField]
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
- setEditingCell(null);
701
- setEditValue(null);
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
- setEditValue(next);
762
- if (onRowEdit) onRowEdit(row, col.field, next);
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
- setEditValue(next);
766
- if (onRowEdit) onRowEdit(row, col.field, next);
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 });
@@ -502,28 +502,33 @@ var DataTable = ({
502
502
  return next;
503
503
  });
504
504
  }, []);
505
- const flatRows = useMemo(() => {
506
- if (!groupedData) return (serverSide ? data : sortedData).map((row) => ({ type: "data", row }));
507
- const flat = [];
508
- groupedData.forEach((group) => {
509
- flat.push({ type: "group-header", group });
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
- let displayRows;
519
- if (serverSide) {
520
- displayRows = groupBy ? flatRows : data.map((row) => ({ type: "data", row }));
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
- () => flatRows.filter((r) => r.type === "data").map((r) => r.row[rowIdField]).filter((id) => id != null),
638
- [flatRows, rowIdField]
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
- setEditingCell(null);
696
- setEditValue(null);
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
- setEditValue(next);
757
- if (onRowEdit) onRowEdit(row, col.field, next);
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
- setEditValue(next);
761
- if (onRowEdit) onRowEdit(row, col.field, next);
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 });