@elliemae/ds-data-table 2.4.2 → 2.4.3-rc.10

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.
Files changed (46) hide show
  1. package/cjs/DataTable.js +10 -1
  2. package/cjs/DataTableSchema.js +5 -0
  3. package/cjs/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -1
  4. package/cjs/addons/Editables/DateEditableCell/DateEditableCell.js +1 -1
  5. package/cjs/addons/Editables/TextEditableCell/TextEditableCell.js +1 -1
  6. package/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +6 -0
  7. package/cjs/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -1
  8. package/cjs/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -1
  9. package/cjs/configs/useDatatableConfig.js +5 -1
  10. package/cjs/exported-related/EditableCell.js +1 -2
  11. package/cjs/exported-related/FilterPopover.js +29 -27
  12. package/cjs/exported-related/RowRenderer/DefaultRowContentRenderer.js +8 -1
  13. package/cjs/exported-related/RowRenderer/useRowRendererHandlers.js +25 -7
  14. package/cjs/exported-related/Toolbar/Toolbar.js +3 -10
  15. package/cjs/parts/Cells/Cell.js +3 -2
  16. package/cjs/parts/FilterBar/FiltersBar.js +29 -2
  17. package/cjs/parts/Filters/index.js +1 -1
  18. package/cjs/parts/Headers/HeaderResizer.js +1 -1
  19. package/cjs/parts/Row.js +17 -1
  20. package/cjs/parts/RowVariants/index.js +1 -1
  21. package/cjs/parts/TableContent.js +1 -1
  22. package/cjs/styled.js +36 -39
  23. package/esm/DataTable.js +10 -1
  24. package/esm/DataTableSchema.js +5 -0
  25. package/esm/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -1
  26. package/esm/addons/Editables/DateEditableCell/DateEditableCell.js +1 -1
  27. package/esm/addons/Editables/TextEditableCell/TextEditableCell.js +1 -1
  28. package/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +6 -0
  29. package/esm/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -1
  30. package/esm/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -1
  31. package/esm/configs/useDatatableConfig.js +5 -1
  32. package/esm/exported-related/EditableCell.js +1 -2
  33. package/esm/exported-related/FilterPopover.js +30 -28
  34. package/esm/exported-related/RowRenderer/DefaultRowContentRenderer.js +9 -2
  35. package/esm/exported-related/RowRenderer/useRowRendererHandlers.js +25 -7
  36. package/esm/exported-related/Toolbar/Toolbar.js +3 -10
  37. package/esm/parts/Cells/Cell.js +3 -2
  38. package/esm/parts/FilterBar/FiltersBar.js +30 -3
  39. package/esm/parts/Filters/index.js +1 -1
  40. package/esm/parts/Headers/HeaderResizer.js +1 -1
  41. package/esm/parts/Row.js +17 -1
  42. package/esm/parts/RowVariants/index.js +1 -1
  43. package/esm/parts/TableContent.js +2 -2
  44. package/esm/styled.js +36 -40
  45. package/package.json +19 -19
  46. package/types/styled.d.ts +2 -1
package/cjs/DataTable.js CHANGED
@@ -21,6 +21,7 @@ var useDatatableConfig = require('./configs/useDatatableConfig.js');
21
21
  require('./configs/useRowFlattenization.js');
22
22
  var FiltersBar = require('./parts/FilterBar/FiltersBar.js');
23
23
  var DataTableSchema = require('./DataTableSchema.js');
24
+ var styled = require('./styled.js');
24
25
  var jsxRuntime = require('react/jsx-runtime');
25
26
 
26
27
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -41,13 +42,21 @@ const DataTable = props => {
41
42
  const tableWrapperRef = React.useRef();
42
43
  const tableContentWrapperRef = React.useRef();
43
44
  const ctx = useDatatableConfig.useDatatableConfig(props);
45
+ const {
46
+ tableProps: {
47
+ height,
48
+ width
49
+ }
50
+ } = ctx;
44
51
  return /*#__PURE__*/_jsx__default["default"](reactRedux.Provider, {
45
52
  store: reduxStore
46
53
  }, void 0, /*#__PURE__*/_jsx__default["default"](DataTableContext["default"].Provider, {
47
54
  value: ctx
48
- }, void 0, /*#__PURE__*/jsxRuntime.jsxs("div", {
55
+ }, void 0, /*#__PURE__*/jsxRuntime.jsxs(styled.StyledDataTableWrapper, {
49
56
  ref: tableWrapperRef,
50
57
  "data-testid": constants.DATA_TESTID.DATA_TABLE_WRAPPER,
58
+ height: height,
59
+ width: width,
51
60
  children: [withFilterBar ? _FiltersBar || (_FiltersBar = /*#__PURE__*/_jsx__default["default"](FiltersBar.FiltersBar, {})) : null, /*#__PURE__*/jsxRuntime.jsx(TableContent, {
52
61
  ref: tableContentWrapperRef
53
62
  })]
@@ -57,6 +57,11 @@ const DataTableSchema = {
57
57
  withFilterBar: dsPropsHelpers.PropTypes.bool.description('Whether to display the filter bar'),
58
58
  filterBarProps: dsPropsHelpers.PropTypes.shape({
59
59
  customPillRenderer: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.func, dsPropsHelpers.PropTypes.element]).description('If you specify custom filters, you will need to render their pills here'),
60
+ isDropdownMenuOpen: dsPropsHelpers.PropTypes.bool.description('Wether the DropdownMenu is Open or not.'),
61
+ onDropdownMenuToggle: dsPropsHelpers.PropTypes.func.description('Callback to toggle the DropdownMenu.'),
62
+ onClearAllFiltersClick: dsPropsHelpers.PropTypes.func.description('Callback for Clear Al Filters option.'),
63
+ onDropdownMenuClickOutside: dsPropsHelpers.PropTypes.func.description('Callback triggered when clicking outside DropdownMenu.'),
64
+ onDropdownMenuTriggerClick: dsPropsHelpers.PropTypes.func.description('Callback triggered when clicking DropdownMenu ellipsis.'),
60
65
  extraOptions: dsPropsHelpers.PropTypes.arrayOf(dsPropsHelpers.PropTypes.shape({
61
66
  type: dsPropsHelpers.PropTypes.string,
62
67
  id: dsPropsHelpers.PropTypes.string,
@@ -18,7 +18,6 @@ require('@elliemae/ds-popperjs');
18
18
  require('styled-components');
19
19
  require('../../../redux/reducers/index.js');
20
20
  require('../../../configs/constants.js');
21
- require('react/jsx-runtime');
22
21
  var EditableCell = require('../../../exported-related/EditableCell.js');
23
22
  require('@elliemae/ds-icons');
24
23
  require('@elliemae/ds-utilities');
@@ -27,6 +26,7 @@ require('../../../configs/useRowFlattenization.js');
27
26
  require('core-js/modules/esnext.async-iterator.map.js');
28
27
  require('core-js/modules/esnext.iterator.map.js');
29
28
  require('../../../styled.js');
29
+ require('react/jsx-runtime');
30
30
  require('@elliemae/ds-form');
31
31
  require('../../../parts/TableContent.js');
32
32
  require('@elliemae/ds-grid');
@@ -15,7 +15,6 @@ require('@elliemae/ds-popperjs');
15
15
  require('styled-components');
16
16
  require('../../../redux/reducers/index.js');
17
17
  require('../../../configs/constants.js');
18
- require('react/jsx-runtime');
19
18
  var EditableCell = require('../../../exported-related/EditableCell.js');
20
19
  require('@elliemae/ds-icons');
21
20
  require('@elliemae/ds-utilities');
@@ -26,6 +25,7 @@ require('../../../configs/useRowFlattenization.js');
26
25
  require('core-js/modules/esnext.async-iterator.map.js');
27
26
  require('core-js/modules/esnext.iterator.map.js');
28
27
  require('../../../styled.js');
28
+ require('react/jsx-runtime');
29
29
  require('@elliemae/ds-form');
30
30
  require('../../../parts/TableContent.js');
31
31
  require('@elliemae/ds-grid');
@@ -15,7 +15,6 @@ require('@elliemae/ds-button');
15
15
  require('@elliemae/ds-popperjs');
16
16
  require('../../../redux/reducers/index.js');
17
17
  require('../../../configs/constants.js');
18
- require('react/jsx-runtime');
19
18
  var EditableCell = require('../../../exported-related/EditableCell.js');
20
19
  require('@elliemae/ds-icons');
21
20
  require('@elliemae/ds-utilities');
@@ -26,6 +25,7 @@ require('../../../configs/useRowFlattenization.js');
26
25
  require('core-js/modules/esnext.async-iterator.map.js');
27
26
  require('core-js/modules/esnext.iterator.map.js');
28
27
  require('../../../styled.js');
28
+ require('react/jsx-runtime');
29
29
  require('@elliemae/ds-form');
30
30
  require('../../../parts/TableContent.js');
31
31
  require('@elliemae/ds-grid');
@@ -55,6 +55,8 @@ require('../../../../exported-related/Filters/applyOutOfTheBoxFilters.js');
55
55
  require('moment');
56
56
  require('core-js/modules/esnext.async-iterator.some.js');
57
57
  require('core-js/modules/esnext.iterator.some.js');
58
+ require('../../../../redux/reducers/index.js');
59
+ var useDispatchHeadersActions = require('../../../../redux/reducers/headersReducers/useDispatchHeadersActions.js');
58
60
 
59
61
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
60
62
 
@@ -80,6 +82,9 @@ const BaseSelectFilter = props => {
80
82
  innerRef,
81
83
  onValueChange
82
84
  } = props;
85
+ const {
86
+ patchHeaderFilterButtonAndMenu
87
+ } = useDispatchHeadersActions.useDispatchHeadersActions();
83
88
  const filterOptions = React.useMemo(() => {
84
89
  // If the user didn't provide options, use the available ones
85
90
  if (!userFilterOptions) {
@@ -100,6 +105,7 @@ const BaseSelectFilter = props => {
100
105
 
101
106
  const handleOnChange = value => {
102
107
  onValueChange(type, value);
108
+ if (!isMulti) patchHeaderFilterButtonAndMenu(column.id, true);
103
109
  };
104
110
 
105
111
  const [filters, setFilteredOptions] = React.useState(filterOptions);
@@ -16,9 +16,9 @@ require('@elliemae/ds-popperjs');
16
16
  require('styled-components');
17
17
  require('../../../../redux/reducers/index.js');
18
18
  var constants = require('../../../../configs/constants.js');
19
- require('react/jsx-runtime');
20
19
  require('../../../../styled.js');
21
20
  require('../../../../DataTableContext.js');
21
+ require('react/jsx-runtime');
22
22
  require('@elliemae/ds-icons');
23
23
  require('@elliemae/ds-utilities');
24
24
  require('core-js/modules/esnext.async-iterator.reduce.js');
@@ -16,9 +16,9 @@ require('@elliemae/ds-popperjs');
16
16
  require('styled-components');
17
17
  require('../../../../redux/reducers/index.js');
18
18
  var constants = require('../../../../configs/constants.js');
19
- require('react/jsx-runtime');
20
19
  require('../../../../styled.js');
21
20
  require('../../../../DataTableContext.js');
21
+ require('react/jsx-runtime');
22
22
  require('@elliemae/ds-icons');
23
23
  require('@elliemae/ds-utilities');
24
24
  require('core-js/modules/esnext.async-iterator.reduce.js');
@@ -54,7 +54,11 @@ const useDatatableConfig = props => {
54
54
  // Layout config
55
55
  // ===========================================================================
56
56
 
57
- const [gridLayout, setGridLayout] = React.useState(columnsToGrid.columnsToGrid(visibleColumns, props.colsLayoutStyle));
57
+ const [gridLayout, setGridLayout] = React.useState(columnsToGrid.columnsToGrid(visibleColumns, props.colsLayoutStyle)); // We need to listen and update the state based on this props
58
+
59
+ React.useEffect(() => {
60
+ setGridLayout(columnsToGrid.columnsToGrid(visibleColumns, props.colsLayoutStyle));
61
+ }, [visibleColumns, props.colsLayoutStyle]);
58
62
  const totalColumnsWidth = React.useMemo(() => props.colsLayoutStyle === constants.ColsLayoutStyle.Fixed ? gridLayout.reduce((acc, cur) => acc + Number.parseInt(cur, 10), 0) : '100%', [props.colsLayoutStyle, gridLayout]);
59
63
  const layoutHelpers = React.useMemo(() => ({
60
64
  gridLayout,
@@ -18,8 +18,7 @@ const EditableCell = props => {
18
18
  StandardRender,
19
19
  EditableRenderer,
20
20
  cell,
21
- isRowSelected,
22
- setValue
21
+ isRowSelected
23
22
  } = props;
24
23
  const {
25
24
  virtualListHelpers
@@ -15,7 +15,6 @@ var dsPopperjs = require('@elliemae/ds-popperjs');
15
15
  var styled = require('styled-components');
16
16
  require('../redux/reducers/index.js');
17
17
  var constants = require('../configs/constants.js');
18
- var jsxRuntime = require('react/jsx-runtime');
19
18
  var useDispatchHeadersActions = require('../redux/reducers/headersReducers/useDispatchHeadersActions.js');
20
19
 
21
20
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -36,7 +35,22 @@ const Button = /*#__PURE__*/styled__default["default"](DSButton.DSButton).withCo
36
35
  const PopperContent = /*#__PURE__*/styled__default["default"].div.withConfig({
37
36
  componentId: "sc-16i88ut-2"
38
37
  })(["background-color:#fff;"]);
39
- const FilterPopover = _ref2 => {
38
+
39
+ const ButtonTrap = _ref2 => {
40
+ let {
41
+ cb
42
+ } = _ref2;
43
+ return /*#__PURE__*/_jsx__default["default"]("span", {
44
+ "aria-hidden": "true",
45
+ tabIndex: 0,
46
+ onFocus: e => {
47
+ e.stopPropagation();
48
+ cb();
49
+ }
50
+ });
51
+ };
52
+
53
+ const FilterPopover = _ref3 => {
40
54
  let {
41
55
  column,
42
56
  columnId,
@@ -48,7 +62,7 @@ const FilterPopover = _ref2 => {
48
62
  innerRef,
49
63
  ariaLabel,
50
64
  customStyles
51
- } = _ref2;
65
+ } = _ref3;
52
66
  const {
53
67
  hideFilterButton,
54
68
  hideFilterMenu
@@ -56,7 +70,6 @@ const FilterPopover = _ref2 => {
56
70
  hideFilterButton: true,
57
71
  hideFilterMenu: true
58
72
  };
59
- const popperRef = React.useRef(null);
60
73
  const {
61
74
  patchHeaderFilterButtonAndMenu,
62
75
  patchHeader
@@ -87,6 +100,13 @@ const FilterPopover = _ref2 => {
87
100
  };
88
101
 
89
102
  const [referenceElement, setReferenceElement] = React.useState(null);
103
+ const buttonTrapCallback = React.useCallback(() => {
104
+ patchHeader(columnId, {
105
+ hideFilterMenu: true,
106
+ hideFilterButton: false
107
+ });
108
+ referenceElement?.focus();
109
+ }, [columnId, patchHeader, referenceElement]);
90
110
  return /*#__PURE__*/_jsx__default["default"]("div", {
91
111
  // This is here to prevent propagation, and not trigger the sort functionality
92
112
  onClick: e => e.stopPropagation(),
@@ -109,11 +129,6 @@ const FilterPopover = _ref2 => {
109
129
  },
110
130
  style: {
111
131
  display: 'flex'
112
- },
113
- onBlur: e => {
114
- if (e.target !== referenceElement && !popperRef.current?.contains(e.relatedTarget)) {
115
- referenceElement?.focus();
116
- }
117
132
  }
118
133
  }, void 0, /*#__PURE__*/_jsx__default["default"](FilterButton, {
119
134
  hide: !isIconVisible,
@@ -145,24 +160,11 @@ const FilterPopover = _ref2 => {
145
160
  minWidth: column.ref?.current?.offsetWidth ?? '0px'
146
161
  }),
147
162
  placementOrderPreference: ['bottom-end']
148
- }, void 0, /*#__PURE__*/jsxRuntime.jsx(PopperContent, {
149
- onKeyDown: e => {
150
- if (e.code === 'Tab') {
151
- setTimeout(() => {
152
- if (!popperRef?.current?.contains(document.activeElement)) {
153
- patchHeader(columnId, {
154
- hideFilterMenu: true,
155
- hideFilterButton: false
156
- });
157
- e.preventDefault();
158
- referenceElement.focus();
159
- }
160
- });
161
- }
162
- },
163
- ref: popperRef,
164
- children: menuContent
165
- })));
163
+ }, void 0, /*#__PURE__*/_jsx__default["default"](PopperContent, {}, void 0, /*#__PURE__*/_jsx__default["default"](ButtonTrap, {
164
+ cb: buttonTrapCallback
165
+ }), menuContent, /*#__PURE__*/_jsx__default["default"](ButtonTrap, {
166
+ cb: buttonTrapCallback
167
+ }))));
166
168
  };
167
169
 
168
170
  exports.FilterPopover = FilterPopover;
@@ -100,12 +100,18 @@ const DefaultRowContentRenderer = props => {
100
100
 
101
101
  return padding;
102
102
  }, [row.depth, visibleColumns]);
103
+ const handleSelectDisableRow = React.useCallback(e => {
104
+ if (disabledRows[row.uid]) {
105
+ e.preventDefault();
106
+ e.stopPropagation();
107
+ }
108
+ }, [disabledRows, row.uid]);
103
109
  const PureRowContent = React.useMemo(() => {
104
110
  const DetailsView = row.original.tableRowDetails;
105
111
  return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
106
112
  children: [/*#__PURE__*/jsxRuntime.jsx(styled.StyledCellContainer, _objectSpread(_objectSpread({
107
113
  ref: rowRef,
108
- tabIndex: 0,
114
+ tabIndex: disabledRows[row.uid] ? -1 : 0,
109
115
  role: "row",
110
116
  "aria-rowindex": row.realIndex + 1,
111
117
  "aria-label": ariaLabelMessage(row, selection?.[row.uid] === true),
@@ -124,6 +130,7 @@ const DefaultRowContentRenderer = props => {
124
130
  selected: noSelectionColumn && selection?.[row.uid] === true,
125
131
  disabled: disabledRows[row.uid],
126
132
  "data-testid": constants.DATA_TESTID.DATA_TABLE_ROW_CONTENT,
133
+ onMouseDown: handleSelectDisableRow,
127
134
  children: /*#__PURE__*/_jsx__default["default"](index$1, {
128
135
  row: row,
129
136
  isRowSelected: selectedRowId === row.uid,
@@ -48,12 +48,26 @@ const useRowRendererHandlers = _ref => {
48
48
  const {
49
49
  tableProps: {
50
50
  onRowClick,
51
- onRowFocus
51
+ onRowFocus,
52
+ disabledRows
52
53
  },
53
54
  virtualListHelpers: {
54
55
  scrollToIndex
55
56
  }
56
57
  } = React.useContext(DataTableContext["default"]);
58
+
59
+ const isOptionFocuseable = opt => !disabledRows[opt.id];
60
+
61
+ const findInCircularList = function (list, from, criteria) {
62
+ let step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
63
+
64
+ for (let i = (from + step + list.length) % list.length; i !== from && from > -1; i = (i + step + list.length) % list.length) {
65
+ if (criteria(list[i])) return i;
66
+ }
67
+
68
+ return from; // return same item
69
+ };
70
+
57
71
  const {
58
72
  setSelectedRowId,
59
73
  setFocusedRowId
@@ -64,6 +78,7 @@ const useRowRendererHandlers = _ref => {
64
78
  uid
65
79
  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : row;
66
80
  // setSelectedRowId(null);
81
+ if (disabledRows[uid]) return;
67
82
  onRowClick(original, e, uid);
68
83
  onRowFocus({
69
84
  itemIndex,
@@ -75,7 +90,7 @@ const useRowRendererHandlers = _ref => {
75
90
  },
76
91
  original
77
92
  }, e);
78
- }, [row, onRowClick, onRowFocus, itemIndex, scrollToIndex]);
93
+ }, [row, disabledRows, onRowClick, onRowFocus, itemIndex, scrollToIndex]);
79
94
  const isActive = draggableProps && draggableProps.active;
80
95
  const handleKeyDown = React.useCallback(e => {
81
96
  if (isDragOverlay || isActive) {
@@ -102,24 +117,27 @@ const useRowRendererHandlers = _ref => {
102
117
 
103
118
  if (e.code === 'ArrowDown') {
104
119
  e.preventDefault();
105
- if (itemIndex + 1 < items.length) setFocusedRowId(items[itemIndex + 1].uid);
120
+ e.stopPropagation();
121
+ const next = findInCircularList(items, itemIndex, isOptionFocuseable);
122
+ setFocusedRowId(items[next].uid);
106
123
  }
107
124
 
108
125
  if (e.code === 'ArrowUp') {
109
126
  e.preventDefault();
110
- if (itemIndex - 1 >= 0) setFocusedRowId(items[itemIndex - 1].uid);
127
+ const prev = findInCircularList(items, itemIndex, isOptionFocuseable, -1);
128
+ setFocusedRowId(items[prev].uid);
111
129
  }
112
- }, [isDragOverlay, isActive, selectedRowId, row, setSelectedRowId, handleItemClick, itemIndex, items, setFocusedRowId]);
130
+ }, [isDragOverlay, isActive, selectedRowId, row, setSelectedRowId, handleItemClick, items, itemIndex, isOptionFocuseable, setFocusedRowId]);
113
131
  const handleOnBlur = React.useCallback(e => {
114
132
  if (e.relatedTarget?.getAttribute('data-testid') === 'data-table-row-content') {
115
133
  setSelectedRowId(null);
116
134
  }
117
135
  }, [setSelectedRowId]);
118
136
  const handleOnFocus = React.useCallback(e => {
119
- if (e.target && e.target.getAttribute('data-testid') === constants.DATA_TESTID.DATA_TABLE_ROW_CONTENT) {
137
+ if (!disabledRows[row.uid] && e.target && e.target.getAttribute('data-testid') === constants.DATA_TESTID.DATA_TABLE_ROW_CONTENT) {
120
138
  setFocusedRowId(row.uid);
121
139
  }
122
- }, [row.uid, setFocusedRowId]);
140
+ }, [row.uid, setFocusedRowId, disabledRows]);
123
141
  return {
124
142
  handleItemClick,
125
143
  handleKeyDown,
@@ -55,22 +55,15 @@ const Toolbar = _ref => {
55
55
  children
56
56
  } = _ref;
57
57
  const [show, setShow] = React.useState(false);
58
- const [clicked, setClicked] = React.useState(false);
59
58
  const toolbarRef = React.useRef(null);
60
- const handleOnClickOutside = React.useCallback(() => {
61
- setShow(false);
62
- setClicked(false);
63
- }, []);
64
- const handleOnClick = React.useCallback(() => {
65
- setShow(true);
66
- setClicked(true);
67
- }, []);
59
+ const handleOnClickOutside = React.useCallback(() => setShow(false), []);
60
+ const handleOnClick = React.useCallback(() => setShow(true), []);
68
61
  dsUtilities.useOnClickOutside(toolbarRef, handleOnClickOutside);
69
62
  return /*#__PURE__*/jsxRuntime.jsx(ToolbarPosition, {
70
63
  ref: toolbarRef,
71
64
  children: /*#__PURE__*/_jsx__default["default"](ToolbarWrapper, {
72
65
  onMouseEnter: () => setShow(true),
73
- onMouseLeave: () => setShow(clicked)
66
+ onMouseLeave: () => setShow(false)
74
67
  }, void 0, show && /*#__PURE__*/_jsx__default["default"](ToolbarBtns, {}, void 0, children), /*#__PURE__*/_jsx__default["default"](DSButton__default["default"], {
75
68
  buttonType: "text",
76
69
  className: "toolbar-trigger",
@@ -71,7 +71,8 @@ const Cell = _ref2 => {
71
71
  const ctx = React.useContext(DataTableContext["default"]);
72
72
  const {
73
73
  tableProps: {
74
- cellRendererProps
74
+ cellRendererProps,
75
+ disabledRows
75
76
  }
76
77
  } = ctx;
77
78
  const {
@@ -120,7 +121,7 @@ const Cell = _ref2 => {
120
121
  return null;
121
122
  }, [DefaultCellContentJSX, cellProps, column]);
122
123
  return /*#__PURE__*/jsxRuntime.jsx(PureStandardCell, _objectSpread(_objectSpread({}, cellProps), {}, {
123
- children: column.editable ? EditableContentJSX : DefaultCellContentJSX
124
+ children: column.editable && !disabledRows[row.id] ? EditableContentJSX : DefaultCellContentJSX
124
125
  }));
125
126
  };
126
127
 
@@ -20,9 +20,9 @@ require('@elliemae/ds-popperjs');
20
20
  require('styled-components');
21
21
  require('../../redux/reducers/index.js');
22
22
  var constants = require('../../configs/constants.js');
23
- require('react/jsx-runtime');
24
23
  require('../../styled.js');
25
24
  var DataTableContext = require('../../DataTableContext.js');
25
+ require('react/jsx-runtime');
26
26
  require('@elliemae/ds-utilities');
27
27
  require('core-js/modules/esnext.async-iterator.reduce.js');
28
28
  require('core-js/modules/esnext.iterator.reduce.js');
@@ -76,6 +76,7 @@ const FiltersBar = () => {
76
76
  },
77
77
  visibleColumns
78
78
  } = React.useContext(DataTableContext["default"]);
79
+ const [isOpen, setIsOpen] = React.useState(false);
79
80
  const pillGroupRefs = React.useMemo(() => {
80
81
  const refs = [];
81
82
 
@@ -86,7 +87,29 @@ const FiltersBar = () => {
86
87
  const dropdownMenuRef = React.useRef(null);
87
88
  const removeAllFilters = React.useCallback(() => {
88
89
  onFiltersChange([]);
89
- }, [onFiltersChange]);
90
+ filterBarProps?.onClearAllFiltersClick?.();
91
+ }, [onFiltersChange, filterBarProps.onClearAllFiltersClick]);
92
+ const onFilterBarClose = React.useCallback(() => {
93
+ filterBarProps?.onDropdownMenuToggle?.(false, 'onClose');
94
+ setIsOpen(false);
95
+ }, [filterBarProps.onDropdownMenuToggle]);
96
+ const onFilterBarOpen = React.useCallback(() => {
97
+ filterBarProps?.onDropdownMenuToggle?.(true, 'onOpen');
98
+ setIsOpen(true);
99
+ }, [filterBarProps.onDropdownMenuToggle]);
100
+ const onFilterBarOnClickOutside = React.useCallback(() => {
101
+ filterBarProps?.onDropdownMenuToggle?.(false, 'onClickOutside');
102
+ filterBarProps?.onDropdownMenuClickOutside?.();
103
+ setIsOpen(false);
104
+ }, [filterBarProps.onDropdownMenuToggle, filterBarProps.onDropdownMenuClickOutside]);
105
+ const onTriggerClick = React.useCallback(() => {
106
+ filterBarProps?.onDropdownMenuTriggerClick?.();
107
+ onFilterBarOpen();
108
+ }, [filterBarProps.onDropdownMenuTriggerClick]);
109
+ const finalIsOpen = React.useMemo(() => {
110
+ if (typeof filterBarProps?.isDropdownMenuOpen === 'boolean') return filterBarProps.isDropdownMenuOpen;
111
+ return isOpen;
112
+ }, [filterBarProps.isDropdownMenuOpen, isOpen]);
90
113
  return /*#__PURE__*/_jsx__default["default"](styled.StyledWrapper, {
91
114
  width: width,
92
115
  "aria-live": "polite",
@@ -122,6 +145,9 @@ const FiltersBar = () => {
122
145
  }, column);
123
146
  }), /*#__PURE__*/_jsx__default["default"](styled.StyledDropdownMenu, {
124
147
  preventOverflow: "scrollParent",
148
+ isOpen: finalIsOpen,
149
+ onClose: onFilterBarClose,
150
+ onClickOutsideMenu: onFilterBarOnClickOutside,
125
151
  options: [{
126
152
  id: '__internal__option__clear__filters',
127
153
  label: 'Clear Filters',
@@ -133,6 +159,7 @@ const FiltersBar = () => {
133
159
  },
134
160
  buttonType: "text",
135
161
  innerRef: dropdownMenuRef,
162
+ onClick: onTriggerClick,
136
163
  icon: _MoreOptionsVert || (_MoreOptionsVert = /*#__PURE__*/_jsx__default["default"](dsIcons.MoreOptionsVert, {}))
137
164
  })
138
165
  }));
@@ -25,9 +25,9 @@ require('@elliemae/ds-popperjs');
25
25
  require('styled-components');
26
26
  require('../../redux/reducers/index.js');
27
27
  require('../../configs/constants.js');
28
- var jsxRuntime = require('react/jsx-runtime');
29
28
  require('../../styled.js');
30
29
  require('../../DataTableContext.js');
30
+ var jsxRuntime = require('react/jsx-runtime');
31
31
  require('@elliemae/ds-icons');
32
32
  require('@elliemae/ds-utilities');
33
33
  require('core-js/modules/esnext.async-iterator.reduce.js');
@@ -79,9 +79,9 @@ const HeaderResizer = _ref => {
79
79
  e.stopPropagation();
80
80
  }, [column.id, nextWidth, visibleColumnsCopy]);
81
81
  const onResizeEnd = React.useCallback(() => {
82
- onColumnResize(column.id, nextWidth);
83
82
  setGridLayout(columnsToGrid.columnsToGrid(visibleColumns, constants.ColsLayoutStyle.Fixed));
84
83
  setIsResizing(false);
84
+ onColumnResize(column.id, nextWidth);
85
85
  }, [onColumnResize, column.id, nextWidth, setGridLayout, visibleColumns]);
86
86
  React.useEffect(() => {
87
87
  const debouncedResizeHandler = onResizeHandler;
package/cjs/parts/Row.js CHANGED
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var _jsx = require('@babel/runtime/helpers/jsx');
6
6
  var React = require('react');
7
7
  var reactRedux = require('react-redux');
8
+ var dsSystem = require('@elliemae/ds-system');
8
9
  var DataTableContext = require('../DataTableContext.js');
9
10
  require('core-js/modules/esnext.async-iterator.for-each.js');
10
11
  require('core-js/modules/esnext.iterator.constructor.js');
@@ -29,6 +30,15 @@ const setItemRefs = (measureRef, draggableRef, ref) => {
29
30
  refsHelpers.setMultipleRefs(...refsToSet)(ref);
30
31
  };
31
32
 
33
+ const StyledRow = dsSystem.styled('div')`
34
+ cursor: ${_ref => {
35
+ let {
36
+ disabled
37
+ } = _ref;
38
+ return disabled ? 'not-allowed' : 'normal';
39
+ }};
40
+ `;
41
+
32
42
  const RowComp = props => {
33
43
  const {
34
44
  row,
@@ -39,11 +49,17 @@ const RowComp = props => {
39
49
  selectedRowId
40
50
  } = props;
41
51
  const ctx = React.useContext(DataTableContext["default"]);
52
+ const {
53
+ tableProps: {
54
+ disabledRows
55
+ }
56
+ } = ctx;
42
57
  const {
43
58
  draggableProps
44
59
  } = React.useContext(SortableItemContext.SortableItemContext);
45
60
  const draggableRef = draggableProps && draggableProps.setNodeRef;
46
- return /*#__PURE__*/jsxRuntime.jsx("div", {
61
+ return /*#__PURE__*/jsxRuntime.jsx(StyledRow, {
62
+ disabled: disabledRows[row.id],
47
63
  style: !isDragOverlay ? itemWrapperStyle : {},
48
64
  ref: ref => setItemRefs(measureRef, draggableRef, ref),
49
65
  children: /*#__PURE__*/_jsx__default["default"](index.RowVariantMapItem, {
@@ -16,9 +16,9 @@ require('@elliemae/ds-popperjs');
16
16
  require('styled-components');
17
17
  require('../../redux/reducers/index.js');
18
18
  require('../../configs/constants.js');
19
- var jsxRuntime = require('react/jsx-runtime');
20
19
  require('../../styled.js');
21
20
  require('../../DataTableContext.js');
21
+ var jsxRuntime = require('react/jsx-runtime');
22
22
  require('@elliemae/ds-icons');
23
23
  require('@elliemae/ds-utilities');
24
24
  require('core-js/modules/esnext.async-iterator.reduce.js');
@@ -64,7 +64,7 @@ const TableContentComponent = props => {
64
64
  visibleColumns
65
65
  } = React.useContext(DataTableContext["default"]);
66
66
  const [shiftKeyPressed, setShiftKeyPressed] = React.useState(false);
67
- const PureTableContent = React.useMemo(() => /*#__PURE__*/jsxRuntime.jsxs(styled.StyledDataTableWrapper, {
67
+ const PureTableContent = React.useMemo(() => /*#__PURE__*/jsxRuntime.jsxs(styled.StyledDataTableContentWrapper, {
68
68
  "data-testid": constants.DATA_TESTID.DATA_TABLE_CONTENT_WRAPPER,
69
69
  height: height,
70
70
  width: width,