@bigbinary/neeto-atoms 1.0.43 → 1.0.44

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.
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { useState, useCallback, useEffect, useMemo, useRef } from 'react';
3
+ import { useState, useCallback, useEffect, useMemo, useRef, useLayoutEffect } from 'react';
4
4
  import { TableRow, TableCell, Table, TableHeader, TableHead, TableBody } from './primitives/Table.js';
5
5
  import { c as cn } from './utils-BJnb9o5c.js';
6
6
  import { useTranslation } from 'react-i18next';
@@ -3226,6 +3226,24 @@ const writeToLocalStorage = (key, value) => {
3226
3226
  } catch {
3227
3227
  }
3228
3228
  };
3229
+ const getResizeColumnStyle = ({
3230
+ size,
3231
+ isSelectionCol,
3232
+ isLastDataCol,
3233
+ enableResize,
3234
+ pinned,
3235
+ pinnedStart,
3236
+ pinnedEnd
3237
+ }) => ({
3238
+ width: isSelectionCol ? 0 : isLastDataCol ? void 0 : size,
3239
+ ...enableResize && !isSelectionCol ? {
3240
+ minWidth: size,
3241
+ ...isLastDataCol ? {} : { maxWidth: size },
3242
+ overflow: "hidden"
3243
+ } : {},
3244
+ ...pinned === "left" ? { left: pinnedStart } : {},
3245
+ ...pinned === "right" ? { right: pinnedEnd } : {}
3246
+ });
3229
3247
  const getPageNumbers = (current, total) => {
3230
3248
  if (total <= 7) {
3231
3249
  return Array.from({ length: total }, (_, i) => i + 1);
@@ -3586,6 +3604,100 @@ const useColumnOrdering = ({
3586
3604
  };
3587
3605
  };
3588
3606
 
3607
+ const useColumnResize = ({
3608
+ enabled,
3609
+ table,
3610
+ columnVisibility,
3611
+ hasSelectionColumn,
3612
+ scrollContainerRef,
3613
+ columnSizing,
3614
+ setColumnSizing
3615
+ }) => {
3616
+ const [containerWidth, setContainerWidth] = useState(0);
3617
+ const userResizedColumnsRef = useRef(/* @__PURE__ */ new Set());
3618
+ const columns = table.options.columns;
3619
+ const clearUserResized = useCallback((columnId) => {
3620
+ userResizedColumnsRef.current.delete(columnId);
3621
+ }, []);
3622
+ const trackUserResize = useCallback(
3623
+ (updaterOrValue) => {
3624
+ setColumnSizing((prev) => {
3625
+ const next = typeof updaterOrValue === "function" ? updaterOrValue(prev) : updaterOrValue;
3626
+ for (const id of Object.keys(next)) {
3627
+ if (next[id] !== prev[id]) {
3628
+ userResizedColumnsRef.current.add(id);
3629
+ }
3630
+ }
3631
+ return next;
3632
+ });
3633
+ },
3634
+ [setColumnSizing]
3635
+ );
3636
+ useEffect(() => {
3637
+ const container = scrollContainerRef.current;
3638
+ if (!container || !enabled) return;
3639
+ let rafId;
3640
+ const observer = new ResizeObserver((entries) => {
3641
+ cancelAnimationFrame(rafId);
3642
+ rafId = requestAnimationFrame(() => {
3643
+ setContainerWidth(Math.round(entries[0].contentRect.width));
3644
+ });
3645
+ });
3646
+ observer.observe(container);
3647
+ return () => {
3648
+ cancelAnimationFrame(rafId);
3649
+ observer.disconnect();
3650
+ };
3651
+ }, [enabled, scrollContainerRef]);
3652
+ useLayoutEffect(() => {
3653
+ if (!enabled || containerWidth === 0) return;
3654
+ const leafColumns = table.getAllLeafColumns().filter((col) => col.id !== "_selection");
3655
+ let reservedWidth = 0;
3656
+ if (hasSelectionColumn) {
3657
+ const firstTh = scrollContainerRef.current?.querySelector("thead th");
3658
+ if (firstTh) {
3659
+ reservedWidth = firstTh.getBoundingClientRect().width;
3660
+ }
3661
+ }
3662
+ const availableWidth = containerWidth - reservedWidth;
3663
+ let userResizedTotal = 0;
3664
+ let autoDefaultTotal = 0;
3665
+ const visibleIds = new Set(leafColumns.map((col) => col.id));
3666
+ for (const id of userResizedColumnsRef.current) {
3667
+ if (!visibleIds.has(id)) userResizedColumnsRef.current.delete(id);
3668
+ }
3669
+ leafColumns.forEach((col) => {
3670
+ if (userResizedColumnsRef.current.has(col.id)) {
3671
+ userResizedTotal += columnSizing[col.id] ?? col.columnDef.size ?? 150;
3672
+ } else {
3673
+ autoDefaultTotal += col.columnDef.size ?? 150;
3674
+ }
3675
+ });
3676
+ if (autoDefaultTotal === 0) return;
3677
+ const autoAvailable = availableWidth - userResizedTotal;
3678
+ const scale = autoAvailable > 0 ? autoAvailable / autoDefaultTotal : 0;
3679
+ const newSizing = {};
3680
+ let changed = false;
3681
+ leafColumns.forEach((col) => {
3682
+ if (userResizedColumnsRef.current.has(col.id)) {
3683
+ newSizing[col.id] = columnSizing[col.id] ?? col.columnDef.size ?? 150;
3684
+ } else {
3685
+ const defaultSize = col.columnDef.size ?? 150;
3686
+ const newSize = scale > 0 ? Math.floor(defaultSize * scale) : defaultSize;
3687
+ if (newSize !== (columnSizing[col.id] ?? -1)) changed = true;
3688
+ newSizing[col.id] = newSize;
3689
+ }
3690
+ });
3691
+ if (changed) setColumnSizing((prev) => ({ ...prev, ...newSizing }));
3692
+ }, [containerWidth, enabled, columns, columnVisibility, hasSelectionColumn]);
3693
+ const lastDataColumnId = enabled ? (() => {
3694
+ const dataCols = table.getVisibleLeafColumns().filter((col) => col.id !== "_selection");
3695
+ const lastNonPinned = dataCols.filter((col) => !col.getIsPinned()).at(-1);
3696
+ return (lastNonPinned ?? dataCols.at(-1))?.id;
3697
+ })() : void 0;
3698
+ return { trackUserResize, lastDataColumnId, clearUserResized };
3699
+ };
3700
+
3589
3701
  const LoadingOverlay = () => /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-10 flex items-center justify-center bg-background/50", children: /* @__PURE__ */ jsx(Spinner, { className: "size-6" }) });
3590
3702
 
3591
3703
  const EmptyState = ({ colSpan, message }) => {
@@ -3612,14 +3724,20 @@ const SortIndicator = ({
3612
3724
  return null;
3613
3725
  };
3614
3726
 
3615
- const ResizeHandle = ({ header }) => {
3727
+ const ResizeHandle = ({
3728
+ header,
3729
+ onReset
3730
+ }) => {
3616
3731
  if (!header.column.getCanResize()) return null;
3617
3732
  return /* @__PURE__ */ jsx(
3618
3733
  "div",
3619
3734
  {
3620
3735
  onMouseDown: header.getResizeHandler(),
3621
3736
  onTouchStart: header.getResizeHandler(),
3622
- onDoubleClick: () => header.column.resetSize(),
3737
+ onDoubleClick: () => {
3738
+ header.column.resetSize();
3739
+ onReset?.(header.column.id);
3740
+ },
3623
3741
  className: cn(
3624
3742
  "absolute top-0 end-0 h-full w-1 cursor-col-resize select-none touch-none",
3625
3743
  header.column.getIsResizing() ? "bg-primary" : "bg-border opacity-0 group-hover/head:opacity-100"
@@ -3961,11 +4079,15 @@ const DataTable = ({
3961
4079
  });
3962
4080
  const showHeaderMenu = enableHeaderMenu ?? (enableColumnFreeze || enableAddColumn || !!onColumnHideProp || !!onColumnDelete || !!onColumnUpdate || !!onMoreActionClick);
3963
4081
  const allColumns = useMemo(() => {
4082
+ const cols = enableColumnResize ? columns.map((col) => ({
4083
+ ...col,
4084
+ minSize: col.minSize ?? col.size ?? 150
4085
+ })) : columns;
3964
4086
  if (selectionColumn) {
3965
- return [selectionColumn, ...columns];
4087
+ return [selectionColumn, ...cols];
3966
4088
  }
3967
- return columns;
3968
- }, [columns, selectionColumn]);
4089
+ return cols;
4090
+ }, [columns, selectionColumn, enableColumnResize]);
3969
4091
  const resolvedColumnOrder = useMemo(() => {
3970
4092
  if (columnOrder.length === 0) return [];
3971
4093
  if (selectionColumn && !columnOrder.includes("_selection")) {
@@ -3979,6 +4101,8 @@ const DataTable = ({
3979
4101
  if (left.includes("_selection")) return columnPinning;
3980
4102
  return { ...columnPinning, left: ["_selection", ...left] };
3981
4103
  }, [columnPinning, selectionColumn, enableColumnFreeze]);
4104
+ const scrollContainerRef = useRef(null);
4105
+ const [columnSizing, setColumnSizing] = useState({});
3982
4106
  const table = useReactTable({
3983
4107
  data,
3984
4108
  columns: allColumns,
@@ -3992,7 +4116,8 @@ const DataTable = ({
3992
4116
  rowSelection,
3993
4117
  columnPinning: resolvedColumnPinning,
3994
4118
  columnVisibility,
3995
- columnOrder: resolvedColumnOrder
4119
+ columnOrder: resolvedColumnOrder,
4120
+ columnSizing
3996
4121
  },
3997
4122
  onSortingChange,
3998
4123
  manualPagination: true,
@@ -4007,6 +4132,19 @@ const DataTable = ({
4007
4132
  onColumnVisibilityChange,
4008
4133
  onColumnOrderChange
4009
4134
  });
4135
+ const { trackUserResize, lastDataColumnId, clearUserResized } = useColumnResize({
4136
+ enabled: enableColumnResize,
4137
+ table,
4138
+ columnVisibility,
4139
+ hasSelectionColumn: !!selectionColumn,
4140
+ scrollContainerRef,
4141
+ columnSizing,
4142
+ setColumnSizing
4143
+ });
4144
+ table.setOptions((prev) => ({
4145
+ ...prev,
4146
+ onColumnSizingChange: trackUserResize
4147
+ }));
4010
4148
  const [bulkSelectedAllRows, setBulkSelectedAllRowsInternal] = useState(false);
4011
4149
  const isAutoSelectingRef = useRef(false);
4012
4150
  const bulkSelectedRef = useRef(false);
@@ -4033,7 +4171,6 @@ const DataTable = ({
4033
4171
  table.toggleAllPageRowsSelected(false);
4034
4172
  onRowSelect?.([], []);
4035
4173
  };
4036
- const scrollContainerRef = useRef(null);
4037
4174
  const [scrollState, setScrollState] = useState({
4038
4175
  scrolledStart: false,
4039
4176
  scrolledEnd: false
@@ -4093,10 +4230,6 @@ const DataTable = ({
4093
4230
  const dataHeaders = headerGroup.headers.filter(
4094
4231
  (header) => header.column.id !== "_selection"
4095
4232
  );
4096
- const totalDataSize = dataHeaders.reduce(
4097
- (sum, header) => sum + header.getSize(),
4098
- 0
4099
- );
4100
4233
  return /* @__PURE__ */ jsx(TableRow, { className: "hover:bg-muted", children: headerGroup.headers.map((header, headerIndex) => {
4101
4234
  const isPinned = header.column.getIsPinned();
4102
4235
  const isSelectionCol = header.column.id === "_selection";
@@ -4114,16 +4247,15 @@ const DataTable = ({
4114
4247
  isPinned === "left" && "after:pointer-events-none after:absolute after:inset-y-0 after:-right-2 after:w-2 after:bg-gradient-to-r after:from-black/6 after:to-transparent after:opacity-0 after:transition-opacity after:duration-200 after:content-[''] group-data-[scrolled-start]/scroll:after:opacity-100 dark:after:from-white/6",
4115
4248
  isPinned === "right" && "before:pointer-events-none before:absolute before:inset-y-0 before:-left-2 before:w-2 before:bg-gradient-to-l before:from-black/6 before:to-transparent before:opacity-0 before:transition-opacity before:duration-200 before:content-[''] group-data-[scrolled-end]/scroll:before:opacity-100 dark:before:from-white/6"
4116
4249
  ),
4117
- style: {
4118
- width: selectionColumn && isSelectionCol ? 0 : selectionColumn ? `${header.getSize() / totalDataSize * 100}%` : header.getSize(),
4119
- minWidth: enableColumnResize ? header.getSize() : void 0,
4120
- ...isPinned === "left" ? {
4121
- left: header.column.getStart("left")
4122
- } : {},
4123
- ...isPinned === "right" ? {
4124
- right: header.column.getAfter("right")
4125
- } : {}
4126
- },
4250
+ style: getResizeColumnStyle({
4251
+ size: header.getSize(),
4252
+ isSelectionCol,
4253
+ isLastDataCol: header.column.id === lastDataColumnId,
4254
+ enableResize: enableColumnResize,
4255
+ pinned: isPinned,
4256
+ pinnedStart: header.column.getStart("left"),
4257
+ pinnedEnd: header.column.getAfter("right")
4258
+ }),
4127
4259
  onClick: header.column.getCanSort() ? header.column.getToggleSortingHandler() : void 0,
4128
4260
  children: [
4129
4261
  header.isPlaceholder ? null : /* @__PURE__ */ jsxs("div", { className: "flex items-center", children: [
@@ -4154,7 +4286,13 @@ const DataTable = ({
4154
4286
  }
4155
4287
  )
4156
4288
  ] }),
4157
- enableColumnResize && /* @__PURE__ */ jsx(ResizeHandle, { header })
4289
+ enableColumnResize && /* @__PURE__ */ jsx(
4290
+ ResizeHandle,
4291
+ {
4292
+ header,
4293
+ onReset: clearUserResized
4294
+ }
4295
+ )
4158
4296
  ]
4159
4297
  },
4160
4298
  header.id
@@ -4182,16 +4320,15 @@ const DataTable = ({
4182
4320
  isPinned === "left" && "after:pointer-events-none after:absolute after:inset-y-0 after:-right-2 after:w-2 after:bg-gradient-to-r after:from-black/6 after:to-transparent after:opacity-0 after:transition-opacity after:duration-200 after:content-[''] group-data-[scrolled-start]/scroll:after:opacity-100 dark:after:from-white/6",
4183
4321
  isPinned === "right" && "before:pointer-events-none before:absolute before:inset-y-0 before:-left-2 before:w-2 before:bg-gradient-to-l before:from-black/6 before:to-transparent before:opacity-0 before:transition-opacity before:duration-200 before:content-[''] group-data-[scrolled-end]/scroll:before:opacity-100 dark:before:from-white/6"
4184
4322
  ),
4185
- style: {
4186
- width: selectionColumn && isSelCell ? 0 : cell.column.getSize(),
4187
- minWidth: enableColumnResize ? cell.column.getSize() : void 0,
4188
- ...isPinned === "left" ? {
4189
- left: cell.column.getStart("left")
4190
- } : {},
4191
- ...isPinned === "right" ? {
4192
- right: cell.column.getAfter("right")
4193
- } : {}
4194
- },
4323
+ style: getResizeColumnStyle({
4324
+ size: cell.column.getSize(),
4325
+ isSelectionCol: isSelCell,
4326
+ isLastDataCol: cell.column.id === lastDataColumnId,
4327
+ enableResize: enableColumnResize,
4328
+ pinned: isPinned,
4329
+ pinnedStart: cell.column.getStart("left"),
4330
+ pinnedEnd: cell.column.getAfter("right")
4331
+ }),
4195
4332
  children: flexRender(
4196
4333
  cell.column.columnDef.cell,
4197
4334
  cell.getContext()
@@ -4218,4 +4355,4 @@ const DataTable = ({
4218
4355
  };
4219
4356
 
4220
4357
  export { DataTable as D, useColumnPinning as a, useColumnVisibility as b, useTablePagination as c, useTableSelection as d, useTableSort as e, useColumnOrdering as u };
4221
- //# sourceMappingURL=DataTable-B6QeW254.js.map
4358
+ //# sourceMappingURL=DataTable-DZYQUYKJ.js.map