@gobolt/genesis 0.4.17 → 0.4.18

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.
@@ -13,5 +13,5 @@ export interface OverflowMenuProps {
13
13
  style?: React.CSSProperties;
14
14
  onItemClick?: (item: OverflowMenuItemProps) => void;
15
15
  }
16
- declare const OverflowMenu: React.FC<OverflowMenuProps>;
16
+ declare const OverflowMenu: React.ForwardRefExoticComponent<OverflowMenuProps & React.RefAttributes<HTMLDivElement>>;
17
17
  export default OverflowMenu;
@@ -1,3 +1,3 @@
1
1
  import { InfiniteScrollTableProps } from './types';
2
- declare const InfiniteScrollTable: <T>({ columns: initialColumns, fetchService, scrollHeight, scrollWidth, onChange, }: InfiniteScrollTableProps<T>) => import("react/jsx-runtime").JSX.Element;
2
+ declare const InfiniteScrollTable: <T>({ columns: initialColumns, fetchService, scrollHeight, scrollWidth, onChange, rowSelection, onRowClick, onRowSelectionChange, onDataChange, }: InfiniteScrollTableProps<T>) => import("react/jsx-runtime").JSX.Element;
3
3
  export default InfiniteScrollTable;
@@ -43,6 +43,8 @@ export interface TableProps<T extends Record<string, any>> {
43
43
  };
44
44
  onRowClick?: (record: T, index: number, event: React.MouseEvent) => void;
45
45
  onChange?: (pagination: TablePaginationConfig, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: any) => void;
46
+ onRowSelectionChange?: (setSelectedRowKeys: (keys: React.Key[]) => void) => void;
47
+ onDataChange?: (data: T[]) => void;
46
48
  loading?: boolean;
47
49
  pagination?: (TablePaginationConfig & {
48
50
  paginationStyle?: PaginationStyle;
@@ -79,5 +81,5 @@ export type SorterResult<T> = {
79
81
  field?: keyof T | string | React.Key | readonly React.Key[];
80
82
  columnKey?: React.Key;
81
83
  };
82
- declare function Table<T extends Record<string, any>>({ columns, dataSource, rowKey, size, onChange, rowSelection, onRowClick, pagination, isMainContentCell, isInfiniteScroll, infiniteScrollConfig, enableRowKeyValidation, onRowKeyError, ...rest }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
84
+ declare function Table<T extends Record<string, any>>({ columns, dataSource, rowKey, size, onChange, rowSelection, onRowClick, onRowSelectionChange, onDataChange, pagination, isMainContentCell, isInfiniteScroll, infiniteScrollConfig, enableRowKeyValidation, onRowKeyError, ...rest }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
83
85
  export default Table;
@@ -14,6 +14,8 @@ export interface TableWithControlsProps {
14
14
  infiniteScrollConfig?: InfiniteScrollConfig<Record<string, any>>;
15
15
  paginationStyle?: PaginationStyle;
16
16
  onRowClick?: (record: Record<string, any>, index: number, event: React.MouseEvent) => void;
17
+ onRowSelectionChange?: (setSelectedRowKeys: (keys: React.Key[]) => void) => void;
18
+ onDataChange?: (data: Record<string, any>[]) => void;
17
19
  }
18
- declare const TableWithControls: ({ tableData, tableControlsData, onChange, onRowClick, tableType, isInfiniteScroll, infiniteScrollConfig, paginationStyle, }: TableWithControlsProps) => import("react/jsx-runtime").JSX.Element;
20
+ declare const TableWithControls: ({ tableData, tableControlsData, onChange, onRowClick, onRowSelectionChange, onDataChange, tableType, isInfiniteScroll, infiniteScrollConfig, paginationStyle, }: TableWithControlsProps) => import("react/jsx-runtime").JSX.Element;
19
21
  export default TableWithControls;
package/dist/index.cjs CHANGED
@@ -80966,112 +80966,136 @@ const OverflowMenuItem = ({ children: children2, onClick }) => {
80966
80966
  const DefaultTrigger = () => {
80967
80967
  return /* @__PURE__ */ jsxRuntime.jsx(Button$1, { isIconButton: true, themeType: "secondary", size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(HiDotsHorizontal, {}) });
80968
80968
  };
80969
- const OverflowMenu = ({
80970
- items,
80971
- children: children2,
80972
- trigger = /* @__PURE__ */ jsxRuntime.jsx(DefaultTrigger, {}),
80973
- isOpen: controlledIsOpen,
80974
- onOpenChange,
80975
- placement = "bottom",
80976
- alignment = "left",
80977
- offset: offset2 = 8,
80978
- className,
80979
- style: style2,
80980
- onItemClick
80981
- }) => {
80982
- const [internalIsOpen, setInternalIsOpen] = React.useState(false);
80983
- const [isAnimating, setIsAnimating] = React.useState(false);
80984
- const triggerRef = React.useRef(null);
80985
- const menuRef = React.useRef(null);
80986
- const { theme } = useGenesis();
80987
- const isOpen = controlledIsOpen === void 0 ? internalIsOpen : controlledIsOpen;
80988
- const handleOpenChange = React.useCallback(
80989
- (open) => {
80990
- if (onOpenChange) {
80991
- onOpenChange(open);
80992
- } else {
80993
- setInternalIsOpen(open);
80994
- }
80995
- },
80996
- [onOpenChange]
80997
- );
80998
- const handleTriggerClick = () => {
80999
- handleOpenChange(!isOpen);
81000
- };
81001
- const handleClickOutside = React.useCallback(
81002
- (event) => {
81003
- if (triggerRef.current && menuRef.current && !triggerRef.current.contains(event.target) && !menuRef.current.contains(event.target)) {
81004
- handleOpenChange(false);
81005
- }
81006
- },
81007
- [handleOpenChange]
81008
- );
81009
- React.useEffect(() => {
81010
- if (isOpen) {
81011
- const timer2 = setTimeout(() => {
81012
- setIsAnimating(true);
81013
- }, 10);
81014
- document.addEventListener("mousedown", handleClickOutside);
81015
- return () => {
81016
- clearTimeout(timer2);
81017
- document.removeEventListener("mousedown", handleClickOutside);
81018
- };
81019
- } else {
81020
- setIsAnimating(false);
81021
- document.removeEventListener("mousedown", handleClickOutside);
81022
- }
81023
- }, [isOpen, handleClickOutside]);
81024
- const getMenuStyle = React.useMemo(() => {
81025
- const baseStyle = {
81026
- position: "absolute",
81027
- zIndex: 1e3,
81028
- ...style2
80969
+ const OverflowMenu = React.forwardRef(
80970
+ ({
80971
+ items,
80972
+ children: children2,
80973
+ trigger = /* @__PURE__ */ jsxRuntime.jsx(DefaultTrigger, {}),
80974
+ isOpen: controlledIsOpen,
80975
+ onOpenChange,
80976
+ placement = "bottom",
80977
+ alignment = "left",
80978
+ offset: offset2 = 8,
80979
+ className,
80980
+ style: style2,
80981
+ onItemClick
80982
+ }, ref) => {
80983
+ const [internalIsOpen, setInternalIsOpen] = React.useState(false);
80984
+ const [isAnimating, setIsAnimating] = React.useState(false);
80985
+ const triggerRef = React.useRef(null);
80986
+ const menuRef = React.useRef(null);
80987
+ const { theme } = useGenesis();
80988
+ const isOpen = controlledIsOpen === void 0 ? internalIsOpen : controlledIsOpen;
80989
+ const handleOpenChange = React.useCallback(
80990
+ (open) => {
80991
+ if (onOpenChange) {
80992
+ onOpenChange(open);
80993
+ } else {
80994
+ setInternalIsOpen(open);
80995
+ }
80996
+ },
80997
+ [onOpenChange]
80998
+ );
80999
+ const handleTriggerClick = () => {
81000
+ handleOpenChange(!isOpen);
81029
81001
  };
81030
- switch (placement) {
81031
- case "bottom": {
81032
- return {
81033
- ...baseStyle,
81034
- top: `calc(100% + ${offset2}px)`,
81035
- ...alignment === "right" ? { right: 0 } : { left: 0 }
81036
- };
81037
- }
81038
- case "top": {
81039
- return {
81040
- ...baseStyle,
81041
- bottom: `calc(100% + ${offset2}px)`,
81042
- ...alignment === "right" ? { right: 0 } : { left: 0 }
81043
- };
81044
- }
81045
- case "left": {
81046
- return {
81047
- ...baseStyle,
81048
- top: 0,
81049
- right: `calc(100% + ${offset2}px)`,
81050
- ...alignment === "right" ? { bottom: 0 } : {}
81051
- };
81052
- }
81053
- case "right": {
81054
- return {
81055
- ...baseStyle,
81056
- top: 0,
81057
- left: `calc(100% + ${offset2}px)`,
81058
- ...alignment === "right" ? { bottom: 0 } : {}
81002
+ const handleClickOutside = React.useCallback(
81003
+ (event) => {
81004
+ if (triggerRef.current && menuRef.current && !triggerRef.current.contains(event.target) && !menuRef.current.contains(event.target)) {
81005
+ handleOpenChange(false);
81006
+ }
81007
+ },
81008
+ [handleOpenChange]
81009
+ );
81010
+ React.useEffect(() => {
81011
+ if (isOpen) {
81012
+ const timer2 = setTimeout(() => {
81013
+ setIsAnimating(true);
81014
+ }, 10);
81015
+ document.addEventListener("mousedown", handleClickOutside);
81016
+ return () => {
81017
+ clearTimeout(timer2);
81018
+ document.removeEventListener("mousedown", handleClickOutside);
81059
81019
  };
81020
+ } else {
81021
+ setIsAnimating(false);
81022
+ document.removeEventListener("mousedown", handleClickOutside);
81060
81023
  }
81061
- default: {
81062
- return baseStyle;
81024
+ }, [isOpen, handleClickOutside]);
81025
+ const getMenuStyle = React.useMemo(() => {
81026
+ const baseStyle = {
81027
+ position: "absolute",
81028
+ zIndex: 1e3,
81029
+ ...style2
81030
+ };
81031
+ switch (placement) {
81032
+ case "bottom": {
81033
+ return {
81034
+ ...baseStyle,
81035
+ top: `calc(100% + ${offset2}px)`,
81036
+ ...alignment === "right" ? { right: 0 } : { left: 0 }
81037
+ };
81038
+ }
81039
+ case "top": {
81040
+ return {
81041
+ ...baseStyle,
81042
+ bottom: `calc(100% + ${offset2}px)`,
81043
+ ...alignment === "right" ? { right: 0 } : { left: 0 }
81044
+ };
81045
+ }
81046
+ case "left": {
81047
+ return {
81048
+ ...baseStyle,
81049
+ top: 0,
81050
+ right: `calc(100% + ${offset2}px)`,
81051
+ ...alignment === "right" ? { bottom: 0 } : {}
81052
+ };
81053
+ }
81054
+ case "right": {
81055
+ return {
81056
+ ...baseStyle,
81057
+ top: 0,
81058
+ left: `calc(100% + ${offset2}px)`,
81059
+ ...alignment === "right" ? { bottom: 0 } : {}
81060
+ };
81061
+ }
81062
+ default: {
81063
+ return baseStyle;
81064
+ }
81063
81065
  }
81066
+ }, [placement, alignment, offset2, style2]);
81067
+ const handleItemClick = React.useCallback(
81068
+ (item) => {
81069
+ onItemClick?.(item);
81070
+ handleOpenChange(false);
81071
+ },
81072
+ [onItemClick, handleOpenChange]
81073
+ );
81074
+ if (items && items.length > 0) {
81075
+ return /* @__PURE__ */ jsxRuntime.jsxs(OverflowMenuWrapper, { ref, children: [
81076
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: triggerRef, onClick: handleTriggerClick, children: trigger }),
81077
+ isOpen && /* @__PURE__ */ jsxRuntime.jsx(
81078
+ OverflowMenuContainer,
81079
+ {
81080
+ ref: menuRef,
81081
+ theme,
81082
+ className,
81083
+ style: getMenuStyle,
81084
+ $isAnimating: isAnimating,
81085
+ $placement: placement,
81086
+ children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
81087
+ OverflowMenuItem,
81088
+ {
81089
+ ...item,
81090
+ onClick: () => handleItemClick(item)
81091
+ },
81092
+ item.id
81093
+ ))
81094
+ }
81095
+ )
81096
+ ] });
81064
81097
  }
81065
- }, [placement, alignment, offset2, style2]);
81066
- const handleItemClick = React.useCallback(
81067
- (item) => {
81068
- onItemClick?.(item);
81069
- handleOpenChange(false);
81070
- },
81071
- [onItemClick, handleOpenChange]
81072
- );
81073
- if (items && items.length > 0) {
81074
- return /* @__PURE__ */ jsxRuntime.jsxs(OverflowMenuWrapper, { children: [
81098
+ return /* @__PURE__ */ jsxRuntime.jsxs(OverflowMenuWrapper, { ref, children: [
81075
81099
  /* @__PURE__ */ jsxRuntime.jsx("div", { ref: triggerRef, onClick: handleTriggerClick, children: trigger }),
81076
81100
  isOpen && /* @__PURE__ */ jsxRuntime.jsx(
81077
81101
  OverflowMenuContainer,
@@ -81082,34 +81106,13 @@ const OverflowMenu = ({
81082
81106
  style: getMenuStyle,
81083
81107
  $isAnimating: isAnimating,
81084
81108
  $placement: placement,
81085
- children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
81086
- OverflowMenuItem,
81087
- {
81088
- ...item,
81089
- onClick: () => handleItemClick(item)
81090
- },
81091
- item.id
81092
- ))
81109
+ children: children2
81093
81110
  }
81094
81111
  )
81095
81112
  ] });
81096
81113
  }
81097
- return /* @__PURE__ */ jsxRuntime.jsxs(OverflowMenuWrapper, { children: [
81098
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: triggerRef, onClick: handleTriggerClick, children: trigger }),
81099
- isOpen && /* @__PURE__ */ jsxRuntime.jsx(
81100
- OverflowMenuContainer,
81101
- {
81102
- ref: menuRef,
81103
- theme,
81104
- className,
81105
- style: getMenuStyle,
81106
- $isAnimating: isAnimating,
81107
- $placement: placement,
81108
- children: children2
81109
- }
81110
- )
81111
- ] });
81112
- };
81114
+ );
81115
+ OverflowMenu.displayName = "OverflowMenu";
81113
81116
  const getGenesisClass$6 = (theme) => ``;
81114
81117
  const Popover$1 = styled(Popconfirm)`
81115
81118
  ${({ theme }) => {
@@ -84482,12 +84485,37 @@ const InfiniteScrollTable = ({
84482
84485
  fetchService,
84483
84486
  scrollHeight = 600,
84484
84487
  scrollWidth = 1300,
84485
- onChange
84488
+ onChange,
84489
+ rowSelection,
84490
+ onRowClick,
84491
+ onRowSelectionChange,
84492
+ onDataChange
84486
84493
  }) => {
84487
84494
  const observer = React.useRef();
84488
84495
  const [scrollableNode, setScrollableNode] = React.useState(
84489
84496
  null
84490
84497
  );
84498
+ const [selectedRowKeys, setSelectedRowKeys] = React.useState([]);
84499
+ const [selectedRows, setSelectedRows] = React.useState([]);
84500
+ const handleRowSelection = React.useCallback(
84501
+ (newSelectedRowKeys, newSelectedRows) => {
84502
+ setSelectedRowKeys(newSelectedRowKeys);
84503
+ setSelectedRows(newSelectedRows);
84504
+ if (rowSelection?.onChange) {
84505
+ rowSelection.onChange(newSelectedRowKeys, newSelectedRows);
84506
+ }
84507
+ },
84508
+ [rowSelection]
84509
+ );
84510
+ const defaultRowSelection2 = {
84511
+ type: "checkbox",
84512
+ selectedRowKeys,
84513
+ onChange: handleRowSelection,
84514
+ getCheckboxProps: (record) => ({
84515
+ name: record.id || record.key || String(record)
84516
+ })
84517
+ };
84518
+ const finalRowSelection = rowSelection || defaultRowSelection2;
84491
84519
  const tableContainerRef = React.useCallback((node2) => {
84492
84520
  if (node2 !== null) {
84493
84521
  const scrollNode = node2.querySelector(".ant-table-body");
@@ -84540,6 +84568,21 @@ const InfiniteScrollTable = ({
84540
84568
  );
84541
84569
  const dataSource = data?.pages.flatMap((page) => page.docs) ?? [];
84542
84570
  const totalDocs = data?.pages?.[0]?.totalDocs ?? 0;
84571
+ React.useEffect(() => {
84572
+ if (onRowSelectionChange) {
84573
+ const wrappedSetSelectedRowKeys = (keys2) => {
84574
+ setSelectedRowKeys(keys2);
84575
+ };
84576
+ onRowSelectionChange(wrappedSetSelectedRowKeys);
84577
+ }
84578
+ }, [onRowSelectionChange]);
84579
+ const dataSentRef = React.useRef(false);
84580
+ React.useEffect(() => {
84581
+ if (onDataChange && dataSource.length > 0 && !dataSentRef.current) {
84582
+ onDataChange(dataSource);
84583
+ dataSentRef.current = true;
84584
+ }
84585
+ }, [dataSource, onDataChange]);
84543
84586
  React.useEffect(() => {
84544
84587
  if (onChange) {
84545
84588
  const dataChangeEvent = {
@@ -84571,79 +84614,73 @@ const InfiniteScrollTable = ({
84571
84614
  }
84572
84615
  );
84573
84616
  }
84574
- return /* @__PURE__ */ jsxRuntime.jsxs(
84575
- "div",
84576
- {
84577
- style: {
84578
- backgroundColor: "white",
84579
- padding: "24px",
84580
- borderRadius: "8px",
84581
- boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)",
84582
- marginBottom: "24px"
84583
- },
84584
- ref: tableContainerRef,
84585
- children: [
84586
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative" }, children: [
84587
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
84617
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: tableContainerRef, children: [
84618
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative" }, ref: tableContainerRef, children: [
84619
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
84588
84620
  .infinite-scroll-table .ant-pagination {
84589
84621
  display: none !important;
84590
84622
  }
84591
84623
  ` }),
84592
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "infinite-scroll-table", children: /* @__PURE__ */ jsxRuntime.jsx(
84593
- ForwardTable,
84594
- {
84595
- dataSource,
84596
- columns: resizableColumns,
84597
- components: { header: { cell: ResizableTitle } },
84598
- rowKey: "id",
84599
- pagination: false,
84600
- showSorterTooltip: false,
84601
- size: "small",
84602
- scroll: { y: scrollHeight, x: scrollWidth },
84603
- onChange: () => {
84604
- },
84605
- onRow: (record, index2) => {
84606
- if (index2 === dataSource.length - 1) {
84607
- return { ref: lastRowRef };
84608
- }
84609
- return {};
84610
- }
84624
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "infinite-scroll-table", children: /* @__PURE__ */ jsxRuntime.jsx(
84625
+ ForwardTable,
84626
+ {
84627
+ dataSource,
84628
+ columns: resizableColumns,
84629
+ components: { header: { cell: ResizableTitle } },
84630
+ rowKey: "id",
84631
+ pagination: false,
84632
+ showSorterTooltip: false,
84633
+ size: "small",
84634
+ scroll: { y: scrollHeight, x: scrollWidth },
84635
+ onChange: () => {
84636
+ },
84637
+ rowSelection: finalRowSelection,
84638
+ onRow: (record, index2) => {
84639
+ const rowProps = {};
84640
+ if (index2 === dataSource.length - 1) {
84641
+ rowProps.ref = lastRowRef;
84611
84642
  }
84612
- ) }),
84613
- isFetchingNextPage && /* @__PURE__ */ jsxRuntime.jsx(
84614
- "div",
84615
- {
84616
- style: {
84617
- position: "absolute",
84618
- bottom: 0,
84619
- left: 0,
84620
- width: "100%",
84621
- padding: "16px",
84622
- display: "flex",
84623
- justifyContent: "center",
84624
- alignItems: "center",
84625
- backgroundColor: "rgba(255, 255, 255, 0.7)",
84626
- backdropFilter: "blur(2px)",
84627
- zIndex: 10
84628
- },
84629
- children: /* @__PURE__ */ jsxRuntime.jsx(Spin, {})
84643
+ if (onRowClick && index2 !== void 0) {
84644
+ rowProps.onClick = (event) => {
84645
+ onRowClick(record, index2, event);
84646
+ };
84630
84647
  }
84631
- )
84632
- ] }),
84633
- !hasNextPage && /* @__PURE__ */ jsxRuntime.jsx(
84634
- "div",
84635
- {
84636
- style: {
84637
- textAlign: "center",
84638
- padding: "20px",
84639
- borderTop: "1px solid #f0f0f0"
84640
- },
84641
- children: /* @__PURE__ */ jsxRuntime.jsx(Typography$1.Text, { type: "secondary", children: "No more rows to load." })
84648
+ return rowProps;
84642
84649
  }
84643
- )
84644
- ]
84645
- }
84646
- );
84650
+ }
84651
+ ) }),
84652
+ isFetchingNextPage && /* @__PURE__ */ jsxRuntime.jsx(
84653
+ "div",
84654
+ {
84655
+ style: {
84656
+ position: "absolute",
84657
+ bottom: 0,
84658
+ left: 0,
84659
+ width: "100%",
84660
+ padding: "16px",
84661
+ display: "flex",
84662
+ justifyContent: "center",
84663
+ alignItems: "center",
84664
+ backgroundColor: "rgba(255, 255, 255, 0.7)",
84665
+ backdropFilter: "blur(2px)",
84666
+ zIndex: 10
84667
+ },
84668
+ children: /* @__PURE__ */ jsxRuntime.jsx(Spin, {})
84669
+ }
84670
+ )
84671
+ ] }),
84672
+ !hasNextPage && /* @__PURE__ */ jsxRuntime.jsx(
84673
+ "div",
84674
+ {
84675
+ style: {
84676
+ textAlign: "center",
84677
+ padding: "20px",
84678
+ borderTop: "1px solid #f0f0f0"
84679
+ },
84680
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography$1.Text, { type: "secondary", children: "No more rows to load." })
84681
+ }
84682
+ )
84683
+ ] });
84647
84684
  };
84648
84685
  const getRowKey = (record, rowKey, index2, enableValidation = true) => {
84649
84686
  try {
@@ -84695,6 +84732,8 @@ function Table({
84695
84732
  onChange,
84696
84733
  rowSelection,
84697
84734
  onRowClick,
84735
+ onRowSelectionChange,
84736
+ onDataChange,
84698
84737
  pagination,
84699
84738
  isMainContentCell = false,
84700
84739
  isInfiniteScroll = false,
@@ -84749,7 +84788,9 @@ function Table({
84749
84788
  fetchService: infiniteScrollConfig.fetchService,
84750
84789
  title: infiniteScrollConfig.title,
84751
84790
  scrollHeight: infiniteScrollConfig.scrollHeight,
84752
- scrollWidth: infiniteScrollConfig.scrollWidth
84791
+ scrollWidth: infiniteScrollConfig.scrollWidth,
84792
+ onRowSelectionChange,
84793
+ onDataChange
84753
84794
  }
84754
84795
  );
84755
84796
  }
@@ -85370,9 +85411,10 @@ const TableWithControls = ({
85370
85411
  tableControlsData: tableControlsData2,
85371
85412
  onChange,
85372
85413
  onRowClick,
85414
+ onRowSelectionChange,
85415
+ onDataChange,
85373
85416
  tableType = "table",
85374
85417
  isInfiniteScroll,
85375
- // Deprecated: use tableType instead
85376
85418
  infiniteScrollConfig,
85377
85419
  paginationStyle
85378
85420
  }) => {
@@ -85383,7 +85425,14 @@ const TableWithControls = ({
85383
85425
  totalResults: 0
85384
85426
  });
85385
85427
  const { primaryTableRowData, secondaryTableRowData } = tableControlsData2;
85386
- const { dataSource, columns, rowSelection, hasSettings, hasFilter } = tableData;
85428
+ const {
85429
+ dataSource,
85430
+ columns,
85431
+ rowSelection,
85432
+ hasSettings,
85433
+ hasFilter,
85434
+ onRowClick: tableOnRowClick
85435
+ } = tableData;
85387
85436
  const actualTableType = isInfiniteScroll ? "infiniteScroll" : tableType;
85388
85437
  const onTableControlsChange = (event) => {
85389
85438
  onChange(event);
@@ -85423,7 +85472,11 @@ const TableWithControls = ({
85423
85472
  title: infiniteScrollConfig.title,
85424
85473
  scrollHeight: infiniteScrollConfig.scrollHeight,
85425
85474
  scrollWidth: infiniteScrollConfig.scrollWidth,
85426
- onChange: onInfiniteScrollTableChange
85475
+ onChange: onInfiniteScrollTableChange,
85476
+ rowSelection,
85477
+ onRowClick: tableOnRowClick || onRowClick,
85478
+ onRowSelectionChange,
85479
+ onDataChange
85427
85480
  }
85428
85481
  );
85429
85482
  }
@@ -85449,7 +85502,8 @@ const TableWithControls = ({
85449
85502
  columns,
85450
85503
  rowSelection,
85451
85504
  onChange: onTableChange,
85452
- onRowClick
85505
+ onRowClick,
85506
+ onRowSelectionChange
85453
85507
  }
85454
85508
  );
85455
85509
  }
package/dist/index.js CHANGED
@@ -80948,112 +80948,136 @@ const OverflowMenuItem = ({ children: children2, onClick }) => {
80948
80948
  const DefaultTrigger = () => {
80949
80949
  return /* @__PURE__ */ jsx(Button$1, { isIconButton: true, themeType: "secondary", size: "small", children: /* @__PURE__ */ jsx(HiDotsHorizontal, {}) });
80950
80950
  };
80951
- const OverflowMenu = ({
80952
- items,
80953
- children: children2,
80954
- trigger = /* @__PURE__ */ jsx(DefaultTrigger, {}),
80955
- isOpen: controlledIsOpen,
80956
- onOpenChange,
80957
- placement = "bottom",
80958
- alignment = "left",
80959
- offset: offset2 = 8,
80960
- className,
80961
- style: style2,
80962
- onItemClick
80963
- }) => {
80964
- const [internalIsOpen, setInternalIsOpen] = useState(false);
80965
- const [isAnimating, setIsAnimating] = useState(false);
80966
- const triggerRef = useRef(null);
80967
- const menuRef = useRef(null);
80968
- const { theme } = useGenesis();
80969
- const isOpen = controlledIsOpen === void 0 ? internalIsOpen : controlledIsOpen;
80970
- const handleOpenChange = useCallback(
80971
- (open) => {
80972
- if (onOpenChange) {
80973
- onOpenChange(open);
80974
- } else {
80975
- setInternalIsOpen(open);
80976
- }
80977
- },
80978
- [onOpenChange]
80979
- );
80980
- const handleTriggerClick = () => {
80981
- handleOpenChange(!isOpen);
80982
- };
80983
- const handleClickOutside = useCallback(
80984
- (event) => {
80985
- if (triggerRef.current && menuRef.current && !triggerRef.current.contains(event.target) && !menuRef.current.contains(event.target)) {
80986
- handleOpenChange(false);
80987
- }
80988
- },
80989
- [handleOpenChange]
80990
- );
80991
- useEffect(() => {
80992
- if (isOpen) {
80993
- const timer2 = setTimeout(() => {
80994
- setIsAnimating(true);
80995
- }, 10);
80996
- document.addEventListener("mousedown", handleClickOutside);
80997
- return () => {
80998
- clearTimeout(timer2);
80999
- document.removeEventListener("mousedown", handleClickOutside);
81000
- };
81001
- } else {
81002
- setIsAnimating(false);
81003
- document.removeEventListener("mousedown", handleClickOutside);
81004
- }
81005
- }, [isOpen, handleClickOutside]);
81006
- const getMenuStyle = useMemo$1(() => {
81007
- const baseStyle = {
81008
- position: "absolute",
81009
- zIndex: 1e3,
81010
- ...style2
80951
+ const OverflowMenu = forwardRef(
80952
+ ({
80953
+ items,
80954
+ children: children2,
80955
+ trigger = /* @__PURE__ */ jsx(DefaultTrigger, {}),
80956
+ isOpen: controlledIsOpen,
80957
+ onOpenChange,
80958
+ placement = "bottom",
80959
+ alignment = "left",
80960
+ offset: offset2 = 8,
80961
+ className,
80962
+ style: style2,
80963
+ onItemClick
80964
+ }, ref) => {
80965
+ const [internalIsOpen, setInternalIsOpen] = useState(false);
80966
+ const [isAnimating, setIsAnimating] = useState(false);
80967
+ const triggerRef = useRef(null);
80968
+ const menuRef = useRef(null);
80969
+ const { theme } = useGenesis();
80970
+ const isOpen = controlledIsOpen === void 0 ? internalIsOpen : controlledIsOpen;
80971
+ const handleOpenChange = useCallback(
80972
+ (open) => {
80973
+ if (onOpenChange) {
80974
+ onOpenChange(open);
80975
+ } else {
80976
+ setInternalIsOpen(open);
80977
+ }
80978
+ },
80979
+ [onOpenChange]
80980
+ );
80981
+ const handleTriggerClick = () => {
80982
+ handleOpenChange(!isOpen);
81011
80983
  };
81012
- switch (placement) {
81013
- case "bottom": {
81014
- return {
81015
- ...baseStyle,
81016
- top: `calc(100% + ${offset2}px)`,
81017
- ...alignment === "right" ? { right: 0 } : { left: 0 }
81018
- };
81019
- }
81020
- case "top": {
81021
- return {
81022
- ...baseStyle,
81023
- bottom: `calc(100% + ${offset2}px)`,
81024
- ...alignment === "right" ? { right: 0 } : { left: 0 }
81025
- };
81026
- }
81027
- case "left": {
81028
- return {
81029
- ...baseStyle,
81030
- top: 0,
81031
- right: `calc(100% + ${offset2}px)`,
81032
- ...alignment === "right" ? { bottom: 0 } : {}
81033
- };
81034
- }
81035
- case "right": {
81036
- return {
81037
- ...baseStyle,
81038
- top: 0,
81039
- left: `calc(100% + ${offset2}px)`,
81040
- ...alignment === "right" ? { bottom: 0 } : {}
80984
+ const handleClickOutside = useCallback(
80985
+ (event) => {
80986
+ if (triggerRef.current && menuRef.current && !triggerRef.current.contains(event.target) && !menuRef.current.contains(event.target)) {
80987
+ handleOpenChange(false);
80988
+ }
80989
+ },
80990
+ [handleOpenChange]
80991
+ );
80992
+ useEffect(() => {
80993
+ if (isOpen) {
80994
+ const timer2 = setTimeout(() => {
80995
+ setIsAnimating(true);
80996
+ }, 10);
80997
+ document.addEventListener("mousedown", handleClickOutside);
80998
+ return () => {
80999
+ clearTimeout(timer2);
81000
+ document.removeEventListener("mousedown", handleClickOutside);
81041
81001
  };
81002
+ } else {
81003
+ setIsAnimating(false);
81004
+ document.removeEventListener("mousedown", handleClickOutside);
81042
81005
  }
81043
- default: {
81044
- return baseStyle;
81006
+ }, [isOpen, handleClickOutside]);
81007
+ const getMenuStyle = useMemo$1(() => {
81008
+ const baseStyle = {
81009
+ position: "absolute",
81010
+ zIndex: 1e3,
81011
+ ...style2
81012
+ };
81013
+ switch (placement) {
81014
+ case "bottom": {
81015
+ return {
81016
+ ...baseStyle,
81017
+ top: `calc(100% + ${offset2}px)`,
81018
+ ...alignment === "right" ? { right: 0 } : { left: 0 }
81019
+ };
81020
+ }
81021
+ case "top": {
81022
+ return {
81023
+ ...baseStyle,
81024
+ bottom: `calc(100% + ${offset2}px)`,
81025
+ ...alignment === "right" ? { right: 0 } : { left: 0 }
81026
+ };
81027
+ }
81028
+ case "left": {
81029
+ return {
81030
+ ...baseStyle,
81031
+ top: 0,
81032
+ right: `calc(100% + ${offset2}px)`,
81033
+ ...alignment === "right" ? { bottom: 0 } : {}
81034
+ };
81035
+ }
81036
+ case "right": {
81037
+ return {
81038
+ ...baseStyle,
81039
+ top: 0,
81040
+ left: `calc(100% + ${offset2}px)`,
81041
+ ...alignment === "right" ? { bottom: 0 } : {}
81042
+ };
81043
+ }
81044
+ default: {
81045
+ return baseStyle;
81046
+ }
81045
81047
  }
81048
+ }, [placement, alignment, offset2, style2]);
81049
+ const handleItemClick = useCallback(
81050
+ (item) => {
81051
+ onItemClick?.(item);
81052
+ handleOpenChange(false);
81053
+ },
81054
+ [onItemClick, handleOpenChange]
81055
+ );
81056
+ if (items && items.length > 0) {
81057
+ return /* @__PURE__ */ jsxs(OverflowMenuWrapper, { ref, children: [
81058
+ /* @__PURE__ */ jsx("div", { ref: triggerRef, onClick: handleTriggerClick, children: trigger }),
81059
+ isOpen && /* @__PURE__ */ jsx(
81060
+ OverflowMenuContainer,
81061
+ {
81062
+ ref: menuRef,
81063
+ theme,
81064
+ className,
81065
+ style: getMenuStyle,
81066
+ $isAnimating: isAnimating,
81067
+ $placement: placement,
81068
+ children: items.map((item) => /* @__PURE__ */ jsx(
81069
+ OverflowMenuItem,
81070
+ {
81071
+ ...item,
81072
+ onClick: () => handleItemClick(item)
81073
+ },
81074
+ item.id
81075
+ ))
81076
+ }
81077
+ )
81078
+ ] });
81046
81079
  }
81047
- }, [placement, alignment, offset2, style2]);
81048
- const handleItemClick = useCallback(
81049
- (item) => {
81050
- onItemClick?.(item);
81051
- handleOpenChange(false);
81052
- },
81053
- [onItemClick, handleOpenChange]
81054
- );
81055
- if (items && items.length > 0) {
81056
- return /* @__PURE__ */ jsxs(OverflowMenuWrapper, { children: [
81080
+ return /* @__PURE__ */ jsxs(OverflowMenuWrapper, { ref, children: [
81057
81081
  /* @__PURE__ */ jsx("div", { ref: triggerRef, onClick: handleTriggerClick, children: trigger }),
81058
81082
  isOpen && /* @__PURE__ */ jsx(
81059
81083
  OverflowMenuContainer,
@@ -81064,34 +81088,13 @@ const OverflowMenu = ({
81064
81088
  style: getMenuStyle,
81065
81089
  $isAnimating: isAnimating,
81066
81090
  $placement: placement,
81067
- children: items.map((item) => /* @__PURE__ */ jsx(
81068
- OverflowMenuItem,
81069
- {
81070
- ...item,
81071
- onClick: () => handleItemClick(item)
81072
- },
81073
- item.id
81074
- ))
81091
+ children: children2
81075
81092
  }
81076
81093
  )
81077
81094
  ] });
81078
81095
  }
81079
- return /* @__PURE__ */ jsxs(OverflowMenuWrapper, { children: [
81080
- /* @__PURE__ */ jsx("div", { ref: triggerRef, onClick: handleTriggerClick, children: trigger }),
81081
- isOpen && /* @__PURE__ */ jsx(
81082
- OverflowMenuContainer,
81083
- {
81084
- ref: menuRef,
81085
- theme,
81086
- className,
81087
- style: getMenuStyle,
81088
- $isAnimating: isAnimating,
81089
- $placement: placement,
81090
- children: children2
81091
- }
81092
- )
81093
- ] });
81094
- };
81096
+ );
81097
+ OverflowMenu.displayName = "OverflowMenu";
81095
81098
  const getGenesisClass$6 = (theme) => ``;
81096
81099
  const Popover$1 = styled(Popconfirm)`
81097
81100
  ${({ theme }) => {
@@ -84464,12 +84467,37 @@ const InfiniteScrollTable = ({
84464
84467
  fetchService,
84465
84468
  scrollHeight = 600,
84466
84469
  scrollWidth = 1300,
84467
- onChange
84470
+ onChange,
84471
+ rowSelection,
84472
+ onRowClick,
84473
+ onRowSelectionChange,
84474
+ onDataChange
84468
84475
  }) => {
84469
84476
  const observer = useRef();
84470
84477
  const [scrollableNode, setScrollableNode] = useState(
84471
84478
  null
84472
84479
  );
84480
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
84481
+ const [selectedRows, setSelectedRows] = useState([]);
84482
+ const handleRowSelection = useCallback(
84483
+ (newSelectedRowKeys, newSelectedRows) => {
84484
+ setSelectedRowKeys(newSelectedRowKeys);
84485
+ setSelectedRows(newSelectedRows);
84486
+ if (rowSelection?.onChange) {
84487
+ rowSelection.onChange(newSelectedRowKeys, newSelectedRows);
84488
+ }
84489
+ },
84490
+ [rowSelection]
84491
+ );
84492
+ const defaultRowSelection2 = {
84493
+ type: "checkbox",
84494
+ selectedRowKeys,
84495
+ onChange: handleRowSelection,
84496
+ getCheckboxProps: (record) => ({
84497
+ name: record.id || record.key || String(record)
84498
+ })
84499
+ };
84500
+ const finalRowSelection = rowSelection || defaultRowSelection2;
84473
84501
  const tableContainerRef = useCallback((node2) => {
84474
84502
  if (node2 !== null) {
84475
84503
  const scrollNode = node2.querySelector(".ant-table-body");
@@ -84522,6 +84550,21 @@ const InfiniteScrollTable = ({
84522
84550
  );
84523
84551
  const dataSource = data?.pages.flatMap((page) => page.docs) ?? [];
84524
84552
  const totalDocs = data?.pages?.[0]?.totalDocs ?? 0;
84553
+ useEffect(() => {
84554
+ if (onRowSelectionChange) {
84555
+ const wrappedSetSelectedRowKeys = (keys2) => {
84556
+ setSelectedRowKeys(keys2);
84557
+ };
84558
+ onRowSelectionChange(wrappedSetSelectedRowKeys);
84559
+ }
84560
+ }, [onRowSelectionChange]);
84561
+ const dataSentRef = useRef(false);
84562
+ useEffect(() => {
84563
+ if (onDataChange && dataSource.length > 0 && !dataSentRef.current) {
84564
+ onDataChange(dataSource);
84565
+ dataSentRef.current = true;
84566
+ }
84567
+ }, [dataSource, onDataChange]);
84525
84568
  useEffect(() => {
84526
84569
  if (onChange) {
84527
84570
  const dataChangeEvent = {
@@ -84553,79 +84596,73 @@ const InfiniteScrollTable = ({
84553
84596
  }
84554
84597
  );
84555
84598
  }
84556
- return /* @__PURE__ */ jsxs(
84557
- "div",
84558
- {
84559
- style: {
84560
- backgroundColor: "white",
84561
- padding: "24px",
84562
- borderRadius: "8px",
84563
- boxShadow: "0 2px 8px rgba(0, 0, 0, 0.1)",
84564
- marginBottom: "24px"
84565
- },
84566
- ref: tableContainerRef,
84567
- children: [
84568
- /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
84569
- /* @__PURE__ */ jsx("style", { children: `
84599
+ return /* @__PURE__ */ jsxs("div", { ref: tableContainerRef, children: [
84600
+ /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, ref: tableContainerRef, children: [
84601
+ /* @__PURE__ */ jsx("style", { children: `
84570
84602
  .infinite-scroll-table .ant-pagination {
84571
84603
  display: none !important;
84572
84604
  }
84573
84605
  ` }),
84574
- /* @__PURE__ */ jsx("div", { className: "infinite-scroll-table", children: /* @__PURE__ */ jsx(
84575
- ForwardTable,
84576
- {
84577
- dataSource,
84578
- columns: resizableColumns,
84579
- components: { header: { cell: ResizableTitle } },
84580
- rowKey: "id",
84581
- pagination: false,
84582
- showSorterTooltip: false,
84583
- size: "small",
84584
- scroll: { y: scrollHeight, x: scrollWidth },
84585
- onChange: () => {
84586
- },
84587
- onRow: (record, index2) => {
84588
- if (index2 === dataSource.length - 1) {
84589
- return { ref: lastRowRef };
84590
- }
84591
- return {};
84592
- }
84606
+ /* @__PURE__ */ jsx("div", { className: "infinite-scroll-table", children: /* @__PURE__ */ jsx(
84607
+ ForwardTable,
84608
+ {
84609
+ dataSource,
84610
+ columns: resizableColumns,
84611
+ components: { header: { cell: ResizableTitle } },
84612
+ rowKey: "id",
84613
+ pagination: false,
84614
+ showSorterTooltip: false,
84615
+ size: "small",
84616
+ scroll: { y: scrollHeight, x: scrollWidth },
84617
+ onChange: () => {
84618
+ },
84619
+ rowSelection: finalRowSelection,
84620
+ onRow: (record, index2) => {
84621
+ const rowProps = {};
84622
+ if (index2 === dataSource.length - 1) {
84623
+ rowProps.ref = lastRowRef;
84593
84624
  }
84594
- ) }),
84595
- isFetchingNextPage && /* @__PURE__ */ jsx(
84596
- "div",
84597
- {
84598
- style: {
84599
- position: "absolute",
84600
- bottom: 0,
84601
- left: 0,
84602
- width: "100%",
84603
- padding: "16px",
84604
- display: "flex",
84605
- justifyContent: "center",
84606
- alignItems: "center",
84607
- backgroundColor: "rgba(255, 255, 255, 0.7)",
84608
- backdropFilter: "blur(2px)",
84609
- zIndex: 10
84610
- },
84611
- children: /* @__PURE__ */ jsx(Spin, {})
84625
+ if (onRowClick && index2 !== void 0) {
84626
+ rowProps.onClick = (event) => {
84627
+ onRowClick(record, index2, event);
84628
+ };
84612
84629
  }
84613
- )
84614
- ] }),
84615
- !hasNextPage && /* @__PURE__ */ jsx(
84616
- "div",
84617
- {
84618
- style: {
84619
- textAlign: "center",
84620
- padding: "20px",
84621
- borderTop: "1px solid #f0f0f0"
84622
- },
84623
- children: /* @__PURE__ */ jsx(Typography$1.Text, { type: "secondary", children: "No more rows to load." })
84630
+ return rowProps;
84624
84631
  }
84625
- )
84626
- ]
84627
- }
84628
- );
84632
+ }
84633
+ ) }),
84634
+ isFetchingNextPage && /* @__PURE__ */ jsx(
84635
+ "div",
84636
+ {
84637
+ style: {
84638
+ position: "absolute",
84639
+ bottom: 0,
84640
+ left: 0,
84641
+ width: "100%",
84642
+ padding: "16px",
84643
+ display: "flex",
84644
+ justifyContent: "center",
84645
+ alignItems: "center",
84646
+ backgroundColor: "rgba(255, 255, 255, 0.7)",
84647
+ backdropFilter: "blur(2px)",
84648
+ zIndex: 10
84649
+ },
84650
+ children: /* @__PURE__ */ jsx(Spin, {})
84651
+ }
84652
+ )
84653
+ ] }),
84654
+ !hasNextPage && /* @__PURE__ */ jsx(
84655
+ "div",
84656
+ {
84657
+ style: {
84658
+ textAlign: "center",
84659
+ padding: "20px",
84660
+ borderTop: "1px solid #f0f0f0"
84661
+ },
84662
+ children: /* @__PURE__ */ jsx(Typography$1.Text, { type: "secondary", children: "No more rows to load." })
84663
+ }
84664
+ )
84665
+ ] });
84629
84666
  };
84630
84667
  const getRowKey = (record, rowKey, index2, enableValidation = true) => {
84631
84668
  try {
@@ -84677,6 +84714,8 @@ function Table({
84677
84714
  onChange,
84678
84715
  rowSelection,
84679
84716
  onRowClick,
84717
+ onRowSelectionChange,
84718
+ onDataChange,
84680
84719
  pagination,
84681
84720
  isMainContentCell = false,
84682
84721
  isInfiniteScroll = false,
@@ -84731,7 +84770,9 @@ function Table({
84731
84770
  fetchService: infiniteScrollConfig.fetchService,
84732
84771
  title: infiniteScrollConfig.title,
84733
84772
  scrollHeight: infiniteScrollConfig.scrollHeight,
84734
- scrollWidth: infiniteScrollConfig.scrollWidth
84773
+ scrollWidth: infiniteScrollConfig.scrollWidth,
84774
+ onRowSelectionChange,
84775
+ onDataChange
84735
84776
  }
84736
84777
  );
84737
84778
  }
@@ -85352,9 +85393,10 @@ const TableWithControls = ({
85352
85393
  tableControlsData: tableControlsData2,
85353
85394
  onChange,
85354
85395
  onRowClick,
85396
+ onRowSelectionChange,
85397
+ onDataChange,
85355
85398
  tableType = "table",
85356
85399
  isInfiniteScroll,
85357
- // Deprecated: use tableType instead
85358
85400
  infiniteScrollConfig,
85359
85401
  paginationStyle
85360
85402
  }) => {
@@ -85365,7 +85407,14 @@ const TableWithControls = ({
85365
85407
  totalResults: 0
85366
85408
  });
85367
85409
  const { primaryTableRowData, secondaryTableRowData } = tableControlsData2;
85368
- const { dataSource, columns, rowSelection, hasSettings, hasFilter } = tableData;
85410
+ const {
85411
+ dataSource,
85412
+ columns,
85413
+ rowSelection,
85414
+ hasSettings,
85415
+ hasFilter,
85416
+ onRowClick: tableOnRowClick
85417
+ } = tableData;
85369
85418
  const actualTableType = isInfiniteScroll ? "infiniteScroll" : tableType;
85370
85419
  const onTableControlsChange = (event) => {
85371
85420
  onChange(event);
@@ -85405,7 +85454,11 @@ const TableWithControls = ({
85405
85454
  title: infiniteScrollConfig.title,
85406
85455
  scrollHeight: infiniteScrollConfig.scrollHeight,
85407
85456
  scrollWidth: infiniteScrollConfig.scrollWidth,
85408
- onChange: onInfiniteScrollTableChange
85457
+ onChange: onInfiniteScrollTableChange,
85458
+ rowSelection,
85459
+ onRowClick: tableOnRowClick || onRowClick,
85460
+ onRowSelectionChange,
85461
+ onDataChange
85409
85462
  }
85410
85463
  );
85411
85464
  }
@@ -85431,7 +85484,8 @@ const TableWithControls = ({
85431
85484
  columns,
85432
85485
  rowSelection,
85433
85486
  onChange: onTableChange,
85434
- onRowClick
85487
+ onRowClick,
85488
+ onRowSelectionChange
85435
85489
  }
85436
85490
  );
85437
85491
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobolt/genesis",
3
- "version": "0.4.17",
3
+ "version": "0.4.18",
4
4
  "description": "genesis design system",
5
5
  "author": "gobolt",
6
6
  "license": "MIT",