@sustaina/shared-ui 1.67.0 → 1.68.0

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/index.d.mts CHANGED
@@ -39,6 +39,7 @@ type AuditFooterProps = {
39
39
  updatedBy?: string | null;
40
40
  onDelete?: () => void;
41
41
  canDelete?: boolean;
42
+ canDeleteBehavior?: "hidden" | "disabled";
42
43
  emptyValue?: React__default.ReactNode;
43
44
  labels?: {
44
45
  createdOn?: string;
@@ -404,6 +405,15 @@ type DataTableComponentProps<TData> = {
404
405
  column: Column$1<TData>;
405
406
  table: Table$1<TData>;
406
407
  }) => React__default.ComponentProps<typeof TableCell>);
408
+ tableFooterProps?: React__default.ComponentProps<typeof TableFooter>;
409
+ tableFooterRowProps?: React__default.ComponentProps<typeof TableRow> | ((info: {
410
+ footerGroup: HeaderGroup<TData>;
411
+ table: Table$1<TData>;
412
+ }) => React__default.ComponentProps<typeof TableRow>);
413
+ tableFooterCellProps?: React__default.ComponentProps<typeof TableHead> | ((info: {
414
+ footer: Header<TData, unknown>;
415
+ table: Table$1<TData>;
416
+ }) => React__default.ComponentProps<typeof TableHead>);
407
417
  columnResizerProps?: Omit<ColumnResizerProps, "header">;
408
418
  columnSeparatorProps?: DataTableColumnSeparatorProps;
409
419
  };
@@ -466,6 +476,7 @@ declare module "@tanstack/react-table" {
466
476
  headerProps?: React.ComponentProps<"th">;
467
477
  cellProps?: React.ComponentProps<"td">;
468
478
  filterCellProps?: React.ComponentProps<"td">;
479
+ footerProps?: React.ComponentProps<"th">;
469
480
  useColumnSizing?: boolean;
470
481
  columnSeparatorProps?: ColumnSeparatorProps;
471
482
  renderColumnFilter?: (props: DataTableColumnFilterProps<TData>) => ReactNode;
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ type AuditFooterProps = {
39
39
  updatedBy?: string | null;
40
40
  onDelete?: () => void;
41
41
  canDelete?: boolean;
42
+ canDeleteBehavior?: "hidden" | "disabled";
42
43
  emptyValue?: React__default.ReactNode;
43
44
  labels?: {
44
45
  createdOn?: string;
@@ -404,6 +405,15 @@ type DataTableComponentProps<TData> = {
404
405
  column: Column$1<TData>;
405
406
  table: Table$1<TData>;
406
407
  }) => React__default.ComponentProps<typeof TableCell>);
408
+ tableFooterProps?: React__default.ComponentProps<typeof TableFooter>;
409
+ tableFooterRowProps?: React__default.ComponentProps<typeof TableRow> | ((info: {
410
+ footerGroup: HeaderGroup<TData>;
411
+ table: Table$1<TData>;
412
+ }) => React__default.ComponentProps<typeof TableRow>);
413
+ tableFooterCellProps?: React__default.ComponentProps<typeof TableHead> | ((info: {
414
+ footer: Header<TData, unknown>;
415
+ table: Table$1<TData>;
416
+ }) => React__default.ComponentProps<typeof TableHead>);
407
417
  columnResizerProps?: Omit<ColumnResizerProps, "header">;
408
418
  columnSeparatorProps?: DataTableColumnSeparatorProps;
409
419
  };
@@ -466,6 +476,7 @@ declare module "@tanstack/react-table" {
466
476
  headerProps?: React.ComponentProps<"th">;
467
477
  cellProps?: React.ComponentProps<"td">;
468
478
  filterCellProps?: React.ComponentProps<"td">;
479
+ footerProps?: React.ComponentProps<"th">;
469
480
  useColumnSizing?: boolean;
470
481
  columnSeparatorProps?: ColumnSeparatorProps;
471
482
  renderColumnFilter?: (props: DataTableColumnFilterProps<TData>) => ReactNode;
package/dist/index.js CHANGED
@@ -3472,6 +3472,7 @@ var AuditFooter = ({
3472
3472
  updatedBy,
3473
3473
  onDelete,
3474
3474
  canDelete = true,
3475
+ canDeleteBehavior,
3475
3476
  emptyValue = "-",
3476
3477
  labels,
3477
3478
  classNames,
@@ -3492,6 +3493,9 @@ var AuditFooter = ({
3492
3493
  const timeFormatter = formatters?.time ?? ((value) => formatISODate(value, "H:i:s"));
3493
3494
  const userFormatter = formatters?.user ?? ((value) => value ?? emptyValue);
3494
3495
  const resolvedDeleteIcon = deleteIcon ?? /* @__PURE__ */ jsxRuntime.jsx(TrashIcon, { className: "w-5 h-5" });
3496
+ const resolvedCanDeleteBehavior = canDeleteBehavior ?? "hidden";
3497
+ const shouldShowDelete = canDelete || resolvedCanDeleteBehavior === "disabled";
3498
+ const deleteButtonClassName = canDelete ? cn("w-5 h-5 cursor-pointer text-red-500", classNames?.deleteButton) : cn("w-5 h-5 text-gray-300 cursor-not-allowed", classNames?.deleteButtonDisabled);
3495
3499
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex w-full h-14 mt-12 justify-between items-end px-3", classNames?.root), children: [
3496
3500
  /* @__PURE__ */ jsxRuntime.jsxs(
3497
3501
  "div",
@@ -3516,10 +3520,10 @@ var AuditFooter = ({
3516
3520
  ]
3517
3521
  }
3518
3522
  ),
3519
- onDelete && /* @__PURE__ */ jsxRuntime.jsx(
3523
+ shouldShowDelete && /* @__PURE__ */ jsxRuntime.jsx(
3520
3524
  "div",
3521
3525
  {
3522
- className: canDelete ? cn("w-5 h-5 cursor-pointer text-red-500", classNames?.deleteButton) : cn("w-5 h-5 text-gray-300 cursor-not-allowed", classNames?.deleteButtonDisabled),
3526
+ className: deleteButtonClassName,
3523
3527
  onClick: canDelete ? onDelete : void 0,
3524
3528
  "aria-label": deleteAriaLabel,
3525
3529
  role: "button",
@@ -9235,7 +9239,11 @@ var modelOptions = [
9235
9239
  "getVisibleLeafColumns",
9236
9240
  "getLeftVisibleLeafColumns",
9237
9241
  "getRightVisibleLeafColumns",
9238
- "getCenterVisibleLeafColumns"
9242
+ "getCenterVisibleLeafColumns",
9243
+ "getFooterGroups",
9244
+ "getLeftFooterGroups",
9245
+ "getRightFooterGroups",
9246
+ "getCenterFooterGroups"
9239
9247
  ];
9240
9248
  var DataTableDevTool = ({ table }) => {
9241
9249
  const [open, setOpen] = React.useState(false);
@@ -9665,7 +9673,7 @@ var TableHeaderRows = ({
9665
9673
  const { isLastLeftPinnedColumn } = getColumnPinningInfo(header.column);
9666
9674
  const { isFirstRightPinnedColumn } = getColumnPinningInfo(nextHeader.column);
9667
9675
  const headerGroupLength = header.headerGroup.headers.length;
9668
- const showSeparator = header.index !== headerGroupLength - 1 && !isLastLeftPinnedColumn && !isFirstRightPinnedColumn;
9676
+ const showSeparator = header.index !== headerGroupLength - 1 && !isLastLeftPinnedColumn && !isFirstRightPinnedColumn && (!header.isPlaceholder || !nextHeader.isPlaceholder);
9669
9677
  return /* @__PURE__ */ jsxRuntime.jsxs(
9670
9678
  TableHead,
9671
9679
  {
@@ -9680,7 +9688,7 @@ var TableHeaderRows = ({
9680
9688
  ),
9681
9689
  style: {
9682
9690
  ...style,
9683
- width: useColumnSizing ? header.column.getSize() : void 0,
9691
+ width: useColumnSizing ? `calc(var(--header-${header.id}-size, ${header.getSize()}) * 1px)` : void 0,
9684
9692
  minWidth: useColumnSizing ? header.column.columnDef.minSize : void 0,
9685
9693
  maxWidth: useColumnSizing ? header.column.columnDef.maxSize : void 0,
9686
9694
  ...tableHeadCellProps?.style,
@@ -9731,7 +9739,7 @@ var TableFilterRow = ({
9731
9739
  ),
9732
9740
  style: {
9733
9741
  ...style,
9734
- width: useColumnSizing ? column.getSize() : void 0,
9742
+ width: useColumnSizing ? `calc(var(--col-${column.id}-size, ${column.getSize()}) * 1px)` : void 0,
9735
9743
  minWidth: useColumnSizing ? column.columnDef.minSize : void 0,
9736
9744
  maxWidth: useColumnSizing ? column.columnDef.maxSize : void 0,
9737
9745
  ...tableFilterCellProps?.style,
@@ -9815,7 +9823,7 @@ var TableDataRows = ({
9815
9823
  ),
9816
9824
  style: {
9817
9825
  ...style,
9818
- width: useColumnSizing ? cell.column.getSize() : void 0,
9826
+ width: useColumnSizing ? `calc(var(--col-${cell.column.id}-size, ${cell.column.getSize()}) * 1px)` : void 0,
9819
9827
  minWidth: useColumnSizing ? cell.column.columnDef.minSize : void 0,
9820
9828
  maxWidth: useColumnSizing ? cell.column.columnDef.maxSize : void 0,
9821
9829
  ...tableDataCellProps?.style,
@@ -9838,6 +9846,67 @@ var TableDataRows = ({
9838
9846
  ) })
9839
9847
  ] });
9840
9848
  };
9849
+ var MemoizedTableDataRows = React__namespace.default.memo(
9850
+ TableDataRows,
9851
+ (prev, next) => prev.table.options.data === next.table.options.data
9852
+ );
9853
+ var TableFooterRows = ({
9854
+ table,
9855
+ columnResizing,
9856
+ components,
9857
+ virtual
9858
+ }) => {
9859
+ const hasAnyFooter = table.getAllColumns().some((col) => col.columnDef.footer != null);
9860
+ if (!hasAnyFooter) return null;
9861
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getFooterGroups().map((footerGroup) => {
9862
+ const tableFooterRowProps = typeof components?.tableFooterRowProps === "function" ? components.tableFooterRowProps({ footerGroup, table }) : components?.tableFooterRowProps;
9863
+ return /* @__PURE__ */ jsxRuntime.jsx(TableRow, { ...tableFooterRowProps, children: footerGroup.headers.map((footer) => {
9864
+ const { classes, style } = getColumnPinningStyles(footer.column);
9865
+ const useColumnSizing = footer.column.columnDef?.meta?.useColumnSizing ?? columnResizing?.enabled ?? virtual?.enabled ?? false;
9866
+ const tableFooterCellProps = typeof components?.tableFooterCellProps === "function" ? components.tableFooterCellProps({ footer, table }) : components?.tableFooterCellProps;
9867
+ const nextFooter = footerGroup.headers[footer.index + 1] ?? footer;
9868
+ const { isLastLeftPinnedColumn } = getColumnPinningInfo(footer.column);
9869
+ const { isFirstRightPinnedColumn } = getColumnPinningInfo(nextFooter.column);
9870
+ const footerGroupLength = footer.headerGroup.headers.length;
9871
+ const showSeparator = footer.index !== footerGroupLength - 1 && !isLastLeftPinnedColumn && !isFirstRightPinnedColumn && (!footer.isPlaceholder || !nextFooter.isPlaceholder);
9872
+ return /* @__PURE__ */ jsxRuntime.jsxs(
9873
+ TableHead,
9874
+ {
9875
+ "data-testid": `footer-cell-${footer.id}`,
9876
+ colSpan: footer.colSpan,
9877
+ ...tableFooterCellProps,
9878
+ ...footer.column.columnDef?.meta?.footerProps,
9879
+ className: cn(
9880
+ classes,
9881
+ tableFooterCellProps?.className,
9882
+ footer.column.columnDef?.meta?.footerProps?.className
9883
+ ),
9884
+ style: {
9885
+ ...style,
9886
+ width: useColumnSizing ? `calc(var(--col-${footer.column.id}-size, ${footer.column.getSize()}) * 1px)` : void 0,
9887
+ minWidth: useColumnSizing ? footer.column.columnDef.minSize : void 0,
9888
+ maxWidth: useColumnSizing ? footer.column.columnDef.maxSize : void 0,
9889
+ ...tableFooterCellProps?.style,
9890
+ ...footer.column.columnDef?.meta?.footerProps?.style
9891
+ },
9892
+ children: [
9893
+ footer.isPlaceholder ? null : reactTable.flexRender(footer.column.columnDef.footer, footer.getContext()),
9894
+ /* @__PURE__ */ jsxRuntime.jsx(
9895
+ ColumnSeparator_default,
9896
+ {
9897
+ ...components?.columnSeparatorProps?.headerCell,
9898
+ ...footer.column.columnDef?.meta?.columnSeparatorProps,
9899
+ show: footer.column.columnDef?.meta?.columnSeparatorProps?.show ?? components?.columnSeparatorProps?.headerCell?.show ?? showSeparator
9900
+ }
9901
+ ),
9902
+ !footer.isPlaceholder && /* @__PURE__ */ jsxRuntime.jsx(ColumnResizer_default, { header: footer, ...components?.columnResizerProps })
9903
+ ]
9904
+ },
9905
+ footer.id
9906
+ );
9907
+ }) }, footerGroup.id);
9908
+ }) });
9909
+ };
9841
9910
  var DataTable = ({
9842
9911
  tableRef,
9843
9912
  virtualizerRef,
@@ -9894,6 +9963,19 @@ var DataTable = ({
9894
9963
  activeStatusContent
9895
9964
  });
9896
9965
  const fetchMoreOnScrollReached = useScrollFetch({ scrollFetch, containerRef: tableContainerRef });
9966
+ const columnResizingEnabled = columnResizing?.enabled;
9967
+ const { columnSizing, columnSizingInfo } = table.getState();
9968
+ const columnSizeVars = React.useMemo(() => {
9969
+ if (!columnResizingEnabled && !virtualEnabled) return {};
9970
+ const headers = table.getFlatHeaders();
9971
+ const colSizes = {};
9972
+ for (const header of headers) {
9973
+ colSizes[`--header-${header.id}-size`] = header.getSize();
9974
+ colSizes[`--col-${header.column.id}-size`] = header.column.getSize();
9975
+ }
9976
+ return colSizes;
9977
+ }, [columnSizing, columnSizingInfo, columnResizingEnabled, virtualEnabled]);
9978
+ const isResizing = columnResizingEnabled && !!columnSizingInfo.isResizingColumn;
9897
9979
  useBindRef_default({ ref: tableRef, value: table });
9898
9980
  useBindRef_default({ ref: virtualizerRef, value: virtualizer });
9899
9981
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -9936,7 +10018,11 @@ var DataTable = ({
9936
10018
  Table,
9937
10019
  {
9938
10020
  ...components?.tableProps,
9939
- style: { tableLayout: virtualEnabled ? "fixed" : "auto", ...components?.tableProps?.style },
10021
+ style: {
10022
+ tableLayout: virtualEnabled ? "fixed" : "auto",
10023
+ ...components?.tableProps?.style,
10024
+ ...columnSizeVars
10025
+ },
9940
10026
  children: [
9941
10027
  /* @__PURE__ */ jsxRuntime.jsxs(
9942
10028
  TableHeader,
@@ -9967,7 +10053,23 @@ var DataTable = ({
9967
10053
  ]
9968
10054
  }
9969
10055
  ),
9970
- /* @__PURE__ */ jsxRuntime.jsx(TableBody, { ...components?.tableBodyProps, children: /* @__PURE__ */ jsxRuntime.jsx(
10056
+ /* @__PURE__ */ jsxRuntime.jsx(TableBody, { ...components?.tableBodyProps, children: isResizing ? /* @__PURE__ */ jsxRuntime.jsx(
10057
+ MemoizedTableDataRows,
10058
+ {
10059
+ table,
10060
+ rowModel,
10061
+ virtualEnabled,
10062
+ virtualItems,
10063
+ virtualizer,
10064
+ paddingTop,
10065
+ paddingBottom,
10066
+ visibleColumnCount,
10067
+ columnResizing,
10068
+ virtual,
10069
+ onRowClick,
10070
+ components
10071
+ }
10072
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
9971
10073
  TableDataRows,
9972
10074
  {
9973
10075
  table,
@@ -9983,7 +10085,23 @@ var DataTable = ({
9983
10085
  onRowClick,
9984
10086
  components
9985
10087
  }
9986
- ) })
10088
+ ) }),
10089
+ /* @__PURE__ */ jsxRuntime.jsx(
10090
+ TableFooter,
10091
+ {
10092
+ ...components?.tableFooterProps,
10093
+ className: cn("sticky bottom-0 z-10 bg-white", components?.tableFooterProps?.className),
10094
+ children: /* @__PURE__ */ jsxRuntime.jsx(
10095
+ TableFooterRows,
10096
+ {
10097
+ table,
10098
+ columnResizing,
10099
+ virtual,
10100
+ components
10101
+ }
10102
+ )
10103
+ }
10104
+ )
9987
10105
  ]
9988
10106
  }
9989
10107
  ),