qbs-react-grid 2.0.11 → 2.0.13

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.
@@ -55,14 +55,16 @@ export var ActionCell = /*#__PURE__*/React.memo(function (_ref2) {
55
55
  actionProps = _ref2.actionProps,
56
56
  tableBodyRef = _ref2.tableBodyRef,
57
57
  rowIndex = _ref2.rowIndex,
58
- dropType = _ref2.dropType;
58
+ dropType = _ref2.dropType,
59
+ wheelWrapperRef = _ref2.wheelWrapperRef;
59
60
  return /*#__PURE__*/React.createElement("div", null, dropType == 'vertical' ? /*#__PURE__*/React.createElement(VerticalMenuDropdown, {
60
61
  tableBodyRef: tableBodyRef,
61
62
  actionDropDown: actionProps,
62
63
  rowData: rowData,
63
64
  dataTheme: dataTheme,
64
65
  rowIndex: rowIndex,
65
- handleMenuActions: handleMenuActions
66
+ handleMenuActions: handleMenuActions,
67
+ wheelWrapperRef: wheelWrapperRef
66
68
  }) : /*#__PURE__*/React.createElement(MenuDropDown, {
67
69
  tableBodyRef: tableBodyRef,
68
70
  actionDropDown: actionProps,
@@ -123,7 +123,9 @@ var QbsTable = function QbsTable(_ref) {
123
123
  setTableFullView = _ref.setTableFullView,
124
124
  setRowViewToggle = _ref.setRowViewToggle,
125
125
  _ref$dropType = _ref.dropType,
126
- dropType = _ref$dropType === void 0 ? 'horizondal' : _ref$dropType;
126
+ dropType = _ref$dropType === void 0 ? 'horizondal' : _ref$dropType,
127
+ rowHeight = _ref.rowHeight,
128
+ isFullScreen = _ref.isFullScreen;
127
129
  var _useState = useState(false),
128
130
  loading = _useState[0],
129
131
  setLoading = _useState[1];
@@ -290,7 +292,8 @@ var QbsTable = function QbsTable(_ref) {
290
292
  defaultRowView: defaultRowView,
291
293
  fullWidthView: fullWidthView,
292
294
  setTableFullView: setTableFullView,
293
- setRowViewToggle: setRowViewToggle
295
+ setRowViewToggle: setRowViewToggle,
296
+ isFullScreen: isFullScreen
294
297
  };
295
298
  var themeToggle = useMemo(function () {
296
299
  return document.getElementById('themeToggle');
@@ -587,7 +590,6 @@ var QbsTable = function QbsTable(_ref) {
587
590
  var scrollTop = wrapper.scrollTop,
588
591
  clientHeight = wrapper.clientHeight;
589
592
  var scrollHeight = Math.abs(scroll) + (height - headerHeight);
590
-
591
593
  // Trigger fetch when user scrolls within 100px of bottom
592
594
  if (scrollTop + clientHeight >= scrollHeight - 70) {
593
595
  loadMoreData === null || loadMoreData === void 0 ? void 0 : loadMoreData(); // fetch next page here
@@ -607,6 +609,7 @@ var QbsTable = function QbsTable(_ref) {
607
609
  dataTheme: dataTheme,
608
610
  wordWrap: wordWrap,
609
611
  wheelWrapperRef: wheelWrapperRef,
612
+ rowHeight: rowHeight,
610
613
  autoHeight: autoHeight,
611
614
  handleInfiniteScroll: handleInfiniteScroll,
612
615
  sortColumn: sortColumn,
@@ -751,6 +754,7 @@ var QbsTable = function QbsTable(_ref) {
751
754
  })), /*#__PURE__*/React.createElement(ActionCell, {
752
755
  tableBodyRef: tableBodyRef,
753
756
  dropType: dropType,
757
+ wheelWrapperRef: wheelWrapperRef,
754
758
  actionProps: actionProps,
755
759
  className: classes.cellClass + " " + classes.actionCellClass,
756
760
  handleMenuActions: handleMenuActions,
@@ -35,7 +35,9 @@ var ToolBar = function ToolBar(_ref) {
35
35
  _ref$fullWidthView = _ref.fullWidthView,
36
36
  fullWidthView = _ref$fullWidthView === void 0 ? false : _ref$fullWidthView,
37
37
  setTableFullView = _ref.setTableFullView,
38
- setRowViewToggle = _ref.setRowViewToggle;
38
+ setRowViewToggle = _ref.setRowViewToggle,
39
+ _ref$isFullScreen = _ref.isFullScreen,
40
+ isFullScreen = _ref$isFullScreen === void 0 ? false : _ref$isFullScreen;
39
41
  var debouncedOnSearch = useCallback(debounce(onSearch != null ? onSearch : function () {}, 1000), [onSearch]);
40
42
  var _useState = useState(searchValue),
41
43
  searchParam = _useState[0],
@@ -106,9 +108,9 @@ var ToolBar = function ToolBar(_ref) {
106
108
  d: "M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 0 1-.659 1.591l-5.432 5.432a2.25 2.25 0 0 0-.659 1.591v2.927a2.25 2.25 0 0 1-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 0 0-.659-1.591L3.659 7.409A2.25 2.25 0 0 1 3 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0 1 12 3Z"
107
109
  }))), tableHeaderActions, /*#__PURE__*/React.createElement("div", {
108
110
  className: " pr-1 cursor-pointer relative table_custom_ctions "
109
- }, rowViewToggle && /*#__PURE__*/React.createElement("div", {
111
+ }, (rowViewToggle || isFullScreen) && /*#__PURE__*/React.createElement("div", {
110
112
  className: "flex gap-2 qbs-row-switch-cntainer"
111
- }, /*#__PURE__*/React.createElement("div", {
113
+ }, rowViewToggle && /*#__PURE__*/React.createElement("div", {
112
114
  className: "flex gap-2 table_cell_style"
113
115
  }, /*#__PURE__*/React.createElement(TooltipComponent, {
114
116
  tableBodyRef: toolbarRef,
@@ -128,7 +130,7 @@ var ToolBar = function ToolBar(_ref) {
128
130
  }
129
131
  }, /*#__PURE__*/React.createElement(ContentView, {
130
132
  className: "" + (!defaultRowView ? 'active' : '')
131
- })))), /*#__PURE__*/React.createElement("div", {
133
+ })))), isFullScreen && /*#__PURE__*/React.createElement("div", {
132
134
  className: " table_full_width"
133
135
  }, /*#__PURE__*/React.createElement(TooltipComponent, {
134
136
  tableBodyRef: toolbarRef,
@@ -138,6 +138,8 @@ export interface QbsTableProps {
138
138
  setTableFullView?: (value: boolean) => void;
139
139
  setRowViewToggle?: (value: boolean) => void;
140
140
  dropType?: 'horizondal' | 'vertical';
141
+ rowHeight?: number;
142
+ isFullScreen?: boolean;
141
143
  }
142
144
  export interface QbsTableToolbarProps {
143
145
  title?: string;
@@ -178,5 +180,6 @@ export interface QbsTableToolbarProps {
178
180
  fullWidthView?: boolean;
179
181
  setTableFullView?: (value: boolean) => void;
180
182
  setRowViewToggle?: (value: boolean) => void;
183
+ isFullScreen?: boolean;
181
184
  }
182
185
  export {};
@@ -7,6 +7,7 @@ type Props = {
7
7
  dataTheme?: string;
8
8
  tableBodyRef: React.RefObject<HTMLDivElement>;
9
9
  rowIndex?: number;
10
+ wheelWrapperRef?: React.RefObject<HTMLDivElement>;
10
11
  };
11
12
  declare const VerticalMenuDropdown: React.FC<Props>;
12
13
  export default VerticalMenuDropdown;
@@ -1,3 +1,6 @@
1
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
2
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
3
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
1
4
  import React, { useEffect, useRef, useState } from 'react';
2
5
  import ReactDOM from 'react-dom';
3
6
  import { ThreeDotIcon } from './icons';
@@ -25,11 +28,40 @@ var VerticalMenuDropdown = function VerticalMenuDropdown(_ref) {
25
28
  setOpenMenu(false);
26
29
  }
27
30
  };
31
+ var handleScroll = function handleScroll() {
32
+ setOpenMenu(false);
33
+ };
28
34
  document.addEventListener('click', handleClickOutside);
35
+ window.addEventListener('scroll', handleScroll, true);
36
+ // Use capture phase to catch all scrolls
37
+
29
38
  return function () {
30
39
  document.removeEventListener('click', handleClickOutside);
40
+ window.removeEventListener('scroll', handleScroll, true);
31
41
  };
32
42
  }, []);
43
+ useEffect(function () {
44
+ var handleStyleChange = function handleStyleChange() {
45
+ setOpenMenu(false); // Close the dropdown
46
+ };
47
+ var scrollbarHandle = document.querySelector('.rs-table-scrollbar-handle');
48
+ if (!scrollbarHandle) return;
49
+ var observer = new MutationObserver(function (mutations) {
50
+ for (var _iterator = _createForOfIteratorHelperLoose(mutations), _step; !(_step = _iterator()).done;) {
51
+ var mutation = _step.value;
52
+ if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
53
+ handleStyleChange();
54
+ }
55
+ }
56
+ });
57
+ observer.observe(scrollbarHandle, {
58
+ attributes: true,
59
+ attributeFilter: ['style']
60
+ });
61
+ return function () {
62
+ observer.disconnect();
63
+ };
64
+ }, [openMenu]);
33
65
  var handleMenuItemClick = function handleMenuItemClick(slug) {
34
66
  var _slug$action;
35
67
  handleMenuActions === null || handleMenuActions === void 0 ? void 0 : handleMenuActions(slug, rowData);
@@ -63,14 +63,16 @@ var ActionCell = /*#__PURE__*/_react["default"].memo(function (_ref2) {
63
63
  actionProps = _ref2.actionProps,
64
64
  tableBodyRef = _ref2.tableBodyRef,
65
65
  rowIndex = _ref2.rowIndex,
66
- dropType = _ref2.dropType;
66
+ dropType = _ref2.dropType,
67
+ wheelWrapperRef = _ref2.wheelWrapperRef;
67
68
  return /*#__PURE__*/_react["default"].createElement("div", null, dropType == 'vertical' ? /*#__PURE__*/_react["default"].createElement(_VerticalDropDownMenu["default"], {
68
69
  tableBodyRef: tableBodyRef,
69
70
  actionDropDown: actionProps,
70
71
  rowData: rowData,
71
72
  dataTheme: dataTheme,
72
73
  rowIndex: rowIndex,
73
- handleMenuActions: handleMenuActions
74
+ handleMenuActions: handleMenuActions,
75
+ wheelWrapperRef: wheelWrapperRef
74
76
  }) : /*#__PURE__*/_react["default"].createElement(_menuDropDown["default"], {
75
77
  tableBodyRef: tableBodyRef,
76
78
  actionDropDown: actionProps,
@@ -129,7 +129,9 @@ var QbsTable = function QbsTable(_ref) {
129
129
  setTableFullView = _ref.setTableFullView,
130
130
  setRowViewToggle = _ref.setRowViewToggle,
131
131
  _ref$dropType = _ref.dropType,
132
- dropType = _ref$dropType === void 0 ? 'horizondal' : _ref$dropType;
132
+ dropType = _ref$dropType === void 0 ? 'horizondal' : _ref$dropType,
133
+ rowHeight = _ref.rowHeight,
134
+ isFullScreen = _ref.isFullScreen;
133
135
  var _useState = (0, _react.useState)(false),
134
136
  loading = _useState[0],
135
137
  setLoading = _useState[1];
@@ -296,7 +298,8 @@ var QbsTable = function QbsTable(_ref) {
296
298
  defaultRowView: defaultRowView,
297
299
  fullWidthView: fullWidthView,
298
300
  setTableFullView: setTableFullView,
299
- setRowViewToggle: setRowViewToggle
301
+ setRowViewToggle: setRowViewToggle,
302
+ isFullScreen: isFullScreen
300
303
  };
301
304
  var themeToggle = (0, _react.useMemo)(function () {
302
305
  return document.getElementById('themeToggle');
@@ -593,7 +596,6 @@ var QbsTable = function QbsTable(_ref) {
593
596
  var scrollTop = wrapper.scrollTop,
594
597
  clientHeight = wrapper.clientHeight;
595
598
  var scrollHeight = Math.abs(scroll) + (height - headerHeight);
596
-
597
599
  // Trigger fetch when user scrolls within 100px of bottom
598
600
  if (scrollTop + clientHeight >= scrollHeight - 70) {
599
601
  loadMoreData === null || loadMoreData === void 0 ? void 0 : loadMoreData(); // fetch next page here
@@ -613,6 +615,7 @@ var QbsTable = function QbsTable(_ref) {
613
615
  dataTheme: dataTheme,
614
616
  wordWrap: wordWrap,
615
617
  wheelWrapperRef: wheelWrapperRef,
618
+ rowHeight: rowHeight,
616
619
  autoHeight: autoHeight,
617
620
  handleInfiniteScroll: handleInfiniteScroll,
618
621
  sortColumn: sortColumn,
@@ -757,6 +760,7 @@ var QbsTable = function QbsTable(_ref) {
757
760
  })), /*#__PURE__*/_react["default"].createElement(_CustomTableCell.ActionCell, {
758
761
  tableBodyRef: tableBodyRef,
759
762
  dropType: dropType,
763
+ wheelWrapperRef: wheelWrapperRef,
760
764
  actionProps: actionProps,
761
765
  className: classes.cellClass + " " + classes.actionCellClass,
762
766
  handleMenuActions: handleMenuActions,
@@ -42,7 +42,9 @@ var ToolBar = function ToolBar(_ref) {
42
42
  _ref$fullWidthView = _ref.fullWidthView,
43
43
  fullWidthView = _ref$fullWidthView === void 0 ? false : _ref$fullWidthView,
44
44
  setTableFullView = _ref.setTableFullView,
45
- setRowViewToggle = _ref.setRowViewToggle;
45
+ setRowViewToggle = _ref.setRowViewToggle,
46
+ _ref$isFullScreen = _ref.isFullScreen,
47
+ isFullScreen = _ref$isFullScreen === void 0 ? false : _ref$isFullScreen;
46
48
  var debouncedOnSearch = (0, _react.useCallback)((0, _debounce["default"])(onSearch != null ? onSearch : function () {}, 1000), [onSearch]);
47
49
  var _useState = (0, _react.useState)(searchValue),
48
50
  searchParam = _useState[0],
@@ -113,9 +115,9 @@ var ToolBar = function ToolBar(_ref) {
113
115
  d: "M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 0 1-.659 1.591l-5.432 5.432a2.25 2.25 0 0 0-.659 1.591v2.927a2.25 2.25 0 0 1-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 0 0-.659-1.591L3.659 7.409A2.25 2.25 0 0 1 3 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0 1 12 3Z"
114
116
  }))), tableHeaderActions, /*#__PURE__*/_react["default"].createElement("div", {
115
117
  className: " pr-1 cursor-pointer relative table_custom_ctions "
116
- }, rowViewToggle && /*#__PURE__*/_react["default"].createElement("div", {
118
+ }, (rowViewToggle || isFullScreen) && /*#__PURE__*/_react["default"].createElement("div", {
117
119
  className: "flex gap-2 qbs-row-switch-cntainer"
118
- }, /*#__PURE__*/_react["default"].createElement("div", {
120
+ }, rowViewToggle && /*#__PURE__*/_react["default"].createElement("div", {
119
121
  className: "flex gap-2 table_cell_style"
120
122
  }, /*#__PURE__*/_react["default"].createElement(_ToolTip["default"], {
121
123
  tableBodyRef: toolbarRef,
@@ -135,7 +137,7 @@ var ToolBar = function ToolBar(_ref) {
135
137
  }
136
138
  }, /*#__PURE__*/_react["default"].createElement(_icons.ContentView, {
137
139
  className: "" + (!defaultRowView ? 'active' : '')
138
- })))), /*#__PURE__*/_react["default"].createElement("div", {
140
+ })))), isFullScreen && /*#__PURE__*/_react["default"].createElement("div", {
139
141
  className: " table_full_width"
140
142
  }, /*#__PURE__*/_react["default"].createElement(_ToolTip["default"], {
141
143
  tableBodyRef: toolbarRef,
@@ -138,6 +138,8 @@ export interface QbsTableProps {
138
138
  setTableFullView?: (value: boolean) => void;
139
139
  setRowViewToggle?: (value: boolean) => void;
140
140
  dropType?: 'horizondal' | 'vertical';
141
+ rowHeight?: number;
142
+ isFullScreen?: boolean;
141
143
  }
142
144
  export interface QbsTableToolbarProps {
143
145
  title?: string;
@@ -178,5 +180,6 @@ export interface QbsTableToolbarProps {
178
180
  fullWidthView?: boolean;
179
181
  setTableFullView?: (value: boolean) => void;
180
182
  setRowViewToggle?: (value: boolean) => void;
183
+ isFullScreen?: boolean;
181
184
  }
182
185
  export {};
@@ -7,6 +7,7 @@ type Props = {
7
7
  dataTheme?: string;
8
8
  tableBodyRef: React.RefObject<HTMLDivElement>;
9
9
  rowIndex?: number;
10
+ wheelWrapperRef?: React.RefObject<HTMLDivElement>;
10
11
  };
11
12
  declare const VerticalMenuDropdown: React.FC<Props>;
12
13
  export default VerticalMenuDropdown;
@@ -9,6 +9,9 @@ var _icons = require("./icons");
9
9
  var _ToolTip = _interopRequireDefault(require("./ToolTip"));
10
10
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
11
11
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
12
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
14
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
12
15
  var VerticalMenuDropdown = function VerticalMenuDropdown(_ref) {
13
16
  var actionDropDown = _ref.actionDropDown,
14
17
  handleMenuActions = _ref.handleMenuActions,
@@ -32,11 +35,40 @@ var VerticalMenuDropdown = function VerticalMenuDropdown(_ref) {
32
35
  setOpenMenu(false);
33
36
  }
34
37
  };
38
+ var handleScroll = function handleScroll() {
39
+ setOpenMenu(false);
40
+ };
35
41
  document.addEventListener('click', handleClickOutside);
42
+ window.addEventListener('scroll', handleScroll, true);
43
+ // Use capture phase to catch all scrolls
44
+
36
45
  return function () {
37
46
  document.removeEventListener('click', handleClickOutside);
47
+ window.removeEventListener('scroll', handleScroll, true);
38
48
  };
39
49
  }, []);
50
+ (0, _react.useEffect)(function () {
51
+ var handleStyleChange = function handleStyleChange() {
52
+ setOpenMenu(false); // Close the dropdown
53
+ };
54
+ var scrollbarHandle = document.querySelector('.rs-table-scrollbar-handle');
55
+ if (!scrollbarHandle) return;
56
+ var observer = new MutationObserver(function (mutations) {
57
+ for (var _iterator = _createForOfIteratorHelperLoose(mutations), _step; !(_step = _iterator()).done;) {
58
+ var mutation = _step.value;
59
+ if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
60
+ handleStyleChange();
61
+ }
62
+ }
63
+ });
64
+ observer.observe(scrollbarHandle, {
65
+ attributes: true,
66
+ attributeFilter: ['style']
67
+ });
68
+ return function () {
69
+ observer.disconnect();
70
+ };
71
+ }, [openMenu]);
40
72
  var handleMenuItemClick = function handleMenuItemClick(slug) {
41
73
  var _slug$action;
42
74
  handleMenuActions === null || handleMenuActions === void 0 ? void 0 : handleMenuActions(slug, rowData);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qbs-react-grid",
3
- "version": "2.0.11",
3
+ "version": "2.0.13",
4
4
  "description": "A React table component",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
package/src/Table.tsx CHANGED
@@ -3,17 +3,50 @@ import debounce from 'lodash/debounce';
3
3
  import flatten from 'lodash/flatten';
4
4
  import isFunction from 'lodash/isFunction';
5
5
  import PropTypes from 'prop-types';
6
- import React, { useCallback, useEffect, useImperativeHandle, useReducer, useRef, useState } from 'react';
6
+ import React, {
7
+ useCallback,
8
+ useEffect,
9
+ useImperativeHandle,
10
+ useReducer,
11
+ useRef,
12
+ useState
13
+ } from 'react';
7
14
 
8
15
  import CellGroup from './CellGroup';
9
- import { CELL_PADDING_HEIGHT, EXPANDED_KEY, ROW_HEADER_HEIGHT, ROW_HEIGHT, SCROLLBAR_WIDTH, SORT_TYPE, TREE_DEPTH } from './constants';
16
+ import {
17
+ CELL_PADDING_HEIGHT,
18
+ EXPANDED_KEY,
19
+ ROW_HEADER_HEIGHT,
20
+ ROW_HEIGHT,
21
+ SCROLLBAR_WIDTH,
22
+ SORT_TYPE,
23
+ TREE_DEPTH
24
+ } from './constants';
10
25
  import EmptyMessage from './EmptyMessage';
11
26
  import Loader from './Loader';
12
27
  import MouseArea from './MouseArea';
13
28
  import Row, { RowProps } from './Row';
14
29
  import Scrollbar, { ScrollbarInstance } from './Scrollbar';
15
30
  import TableContext from './TableContext';
16
- import { findAllParents, findRowKeys, flattenData, isRTL, isSupportTouchEvent, mergeCells, resetLeftForCells, shouldShowRowByExpanded, useAffix, useCellDescriptor, useClassNames, useControlled, usePosition, useScrollListener, useTableDimension, useTableRows, useUpdateEffect } from './utils';
31
+ import {
32
+ findAllParents,
33
+ findRowKeys,
34
+ flattenData,
35
+ isRTL,
36
+ isSupportTouchEvent,
37
+ mergeCells,
38
+ resetLeftForCells,
39
+ shouldShowRowByExpanded,
40
+ useAffix,
41
+ useCellDescriptor,
42
+ useClassNames,
43
+ useControlled,
44
+ usePosition,
45
+ useScrollListener,
46
+ useTableDimension,
47
+ useTableRows,
48
+ useUpdateEffect
49
+ } from './utils';
17
50
 
18
51
  import type {
19
52
  RowDataType,
@@ -314,7 +347,6 @@ const Table = React.forwardRef(<Row extends RowDataType, Key>(props: TableProps<
314
347
  wheelWrapperRef,
315
348
  ...rest
316
349
  } = props;
317
-
318
350
  const {
319
351
  withClassPrefix,
320
352
  merge: mergeCls,
@@ -38,7 +38,16 @@ export const CheckCell: React.FC<any> = React.memo(
38
38
  )
39
39
  );
40
40
  export const ActionCell: React.FC<any> = React.memo(
41
- ({ rowData, handleMenuActions, dataTheme, actionProps, tableBodyRef, rowIndex, dropType }) => {
41
+ ({
42
+ rowData,
43
+ handleMenuActions,
44
+ dataTheme,
45
+ actionProps,
46
+ tableBodyRef,
47
+ rowIndex,
48
+ dropType,
49
+ wheelWrapperRef
50
+ }) => {
42
51
  return (
43
52
  <div>
44
53
  {dropType == 'vertical' ? (
@@ -49,6 +58,7 @@ export const ActionCell: React.FC<any> = React.memo(
49
58
  dataTheme={dataTheme}
50
59
  rowIndex={rowIndex}
51
60
  handleMenuActions={handleMenuActions}
61
+ wheelWrapperRef={wheelWrapperRef}
52
62
  />
53
63
  ) : (
54
64
  <MenuDropDown
@@ -103,7 +103,9 @@ const QbsTable: React.FC<QbsTableProps> = ({
103
103
  fullWidthView = false,
104
104
  setTableFullView,
105
105
  setRowViewToggle,
106
- dropType='horizondal'
106
+ dropType = 'horizondal',
107
+ rowHeight,
108
+ isFullScreen
107
109
  }) => {
108
110
  const [loading, setLoading] = useState(false);
109
111
  const [columns, setColumns] = useState(propColumn);
@@ -269,7 +271,8 @@ const QbsTable: React.FC<QbsTableProps> = ({
269
271
  defaultRowView: defaultRowView,
270
272
  fullWidthView: fullWidthView,
271
273
  setTableFullView: setTableFullView,
272
- setRowViewToggle: setRowViewToggle
274
+ setRowViewToggle: setRowViewToggle,
275
+ isFullScreen: isFullScreen
273
276
  };
274
277
  const themeToggle = useMemo(() => document.getElementById('themeToggle') as HTMLInputElement, []);
275
278
 
@@ -598,7 +601,6 @@ const QbsTable: React.FC<QbsTableProps> = ({
598
601
 
599
602
  const { scrollTop, clientHeight } = wrapper;
600
603
  const scrollHeight = Math.abs(scroll) + (height - headerHeight);
601
-
602
604
  // Trigger fetch when user scrolls within 100px of bottom
603
605
  if (scrollTop + clientHeight >= scrollHeight - 70) {
604
606
  loadMoreData?.(); // fetch next page here
@@ -619,6 +621,7 @@ const QbsTable: React.FC<QbsTableProps> = ({
619
621
  dataTheme={dataTheme}
620
622
  wordWrap={wordWrap}
621
623
  wheelWrapperRef={wheelWrapperRef}
624
+ rowHeight={rowHeight}
622
625
  autoHeight={autoHeight}
623
626
  handleInfiniteScroll={handleInfiniteScroll}
624
627
  sortColumn={sortColumn}
@@ -789,6 +792,7 @@ const QbsTable: React.FC<QbsTableProps> = ({
789
792
  <ActionCell
790
793
  tableBodyRef={tableBodyRef}
791
794
  dropType={dropType}
795
+ wheelWrapperRef={wheelWrapperRef}
792
796
  actionProps={actionProps}
793
797
  className={`${classes.cellClass} ${classes.actionCellClass}`}
794
798
  handleMenuActions={handleMenuActions}
@@ -32,7 +32,8 @@ const ToolBar: React.FC<QbsTableToolbarProps> = ({
32
32
  defaultRowView = true,
33
33
  fullWidthView = false,
34
34
  setTableFullView,
35
- setRowViewToggle
35
+ setRowViewToggle,
36
+ isFullScreen = false
36
37
  }) => {
37
38
  const debouncedOnSearch = useCallback(debounce(onSearch ?? (() => {}), 1000), [onSearch]);
38
39
  const [searchParam, setSearchParam] = useState<string | undefined>(searchValue);
@@ -109,27 +110,31 @@ const ToolBar: React.FC<QbsTableToolbarProps> = ({
109
110
  )}
110
111
  {tableHeaderActions}
111
112
  <div className=" pr-1 cursor-pointer relative table_custom_ctions ">
112
- {rowViewToggle && (
113
+ {(rowViewToggle || isFullScreen) && (
113
114
  <div className="flex gap-2 qbs-row-switch-cntainer">
114
- <div className="flex gap-2 table_cell_style">
115
- <TooltipComponent tableBodyRef={toolbarRef} title={'Switch to Default View'}>
116
- <div onClick={() => setRowViewToggle?.(true)}>
117
- <DefaultView className={`${defaultRowView ? 'active' : ''}`} />
118
- </div>
119
- </TooltipComponent>
120
- <TooltipComponent tableBodyRef={toolbarRef} title={'Switch to Compact View'}>
121
- <div onClick={() => setRowViewToggle?.(false)}>
122
- <ContentView className={`${!defaultRowView ? 'active' : ''}`} />
123
- </div>
124
- </TooltipComponent>
125
- </div>
126
- <div className=" table_full_width">
127
- <TooltipComponent tableBodyRef={toolbarRef} title={'Switch to Full Screen'}>
128
- <div onClick={() => setTableFullView?.(!fullWidthView)}>
129
- <ExpandIcon className={`${fullWidthView ? 'active' : ''}`} />
130
- </div>
131
- </TooltipComponent>
132
- </div>
115
+ {rowViewToggle && (
116
+ <div className="flex gap-2 table_cell_style">
117
+ <TooltipComponent tableBodyRef={toolbarRef} title={'Switch to Default View'}>
118
+ <div onClick={() => setRowViewToggle?.(true)}>
119
+ <DefaultView className={`${defaultRowView ? 'active' : ''}`} />
120
+ </div>
121
+ </TooltipComponent>
122
+ <TooltipComponent tableBodyRef={toolbarRef} title={'Switch to Compact View'}>
123
+ <div onClick={() => setRowViewToggle?.(false)}>
124
+ <ContentView className={`${!defaultRowView ? 'active' : ''}`} />
125
+ </div>
126
+ </TooltipComponent>
127
+ </div>
128
+ )}
129
+ {isFullScreen && (
130
+ <div className=" table_full_width">
131
+ <TooltipComponent tableBodyRef={toolbarRef} title={'Switch to Full Screen'}>
132
+ <div onClick={() => setTableFullView?.(!fullWidthView)}>
133
+ <ExpandIcon className={`${fullWidthView ? 'active' : ''}`} />
134
+ </div>
135
+ </TooltipComponent>
136
+ </div>
137
+ )}
133
138
  </div>
134
139
  )}
135
140
 
@@ -140,8 +140,10 @@ export interface QbsTableProps {
140
140
  fullWidthView?: boolean;
141
141
  setTableFullView?: (value: boolean) => void;
142
142
  setRowViewToggle?: (value: boolean) => void;
143
- dropType?: 'horizondal' | 'vertical'
144
- }
143
+ dropType?: 'horizondal' | 'vertical';
144
+ rowHeight?: number;
145
+ isFullScreen?: boolean
146
+ }
145
147
 
146
148
  export interface QbsTableToolbarProps {
147
149
  title?: string;
@@ -182,4 +184,5 @@ export interface QbsTableToolbarProps {
182
184
  fullWidthView?: boolean;
183
185
  setTableFullView?: (value: boolean) => void;
184
186
  setRowViewToggle?: (value: boolean) => void;
187
+ isFullScreen?: boolean
185
188
  }
@@ -1,5 +1,6 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
2
  import ReactDOM from 'react-dom';
3
+
3
4
  import { ActionProps } from '../commontypes';
4
5
  import { ThreeDotIcon } from './icons';
5
6
  import TooltipComponent from './ToolTip';
@@ -11,6 +12,7 @@ type Props = {
11
12
  dataTheme?: string;
12
13
  tableBodyRef: React.RefObject<HTMLDivElement>;
13
14
  rowIndex?: number;
15
+ wheelWrapperRef?: React.RefObject<HTMLDivElement>;
14
16
  };
15
17
 
16
18
  const VerticalMenuDropdown: React.FC<Props> = ({
@@ -31,12 +33,44 @@ const VerticalMenuDropdown: React.FC<Props> = ({
31
33
  setOpenMenu(false);
32
34
  }
33
35
  };
36
+ const handleScroll = () => {
37
+ setOpenMenu(false);
38
+ };
34
39
 
35
40
  document.addEventListener('click', handleClickOutside);
41
+ window.addEventListener('scroll', handleScroll, true);
42
+ // Use capture phase to catch all scrolls
43
+
36
44
  return () => {
37
45
  document.removeEventListener('click', handleClickOutside);
46
+ window.removeEventListener('scroll', handleScroll, true);
38
47
  };
39
48
  }, []);
49
+ useEffect(() => {
50
+ const handleStyleChange = () => {
51
+ setOpenMenu(false); // Close the dropdown
52
+ };
53
+
54
+ const scrollbarHandle = document.querySelector('.rs-table-scrollbar-handle');
55
+ if (!scrollbarHandle) return;
56
+
57
+ const observer = new MutationObserver(mutations => {
58
+ for (const mutation of mutations) {
59
+ if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
60
+ handleStyleChange();
61
+ }
62
+ }
63
+ });
64
+
65
+ observer.observe(scrollbarHandle, {
66
+ attributes: true,
67
+ attributeFilter: ['style']
68
+ });
69
+
70
+ return () => {
71
+ observer.disconnect();
72
+ };
73
+ }, [openMenu]);
40
74
 
41
75
  const handleMenuItemClick = (slug: ActionProps) => {
42
76
  handleMenuActions?.(slug, rowData);