@elliemae/ds-data-table 2.4.3-rc.8 → 2.4.4-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/cjs/addons/Columns/ColumnExpand/ColumnExpand.js +27 -13
  2. package/cjs/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -1
  3. package/cjs/addons/Editables/DateEditableCell/DateEditableCell.js +1 -1
  4. package/cjs/addons/Editables/TextEditableCell/TextEditableCell.js +1 -1
  5. package/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +8 -6
  6. package/cjs/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -1
  7. package/cjs/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -1
  8. package/cjs/exported-related/FilterPopover.js +29 -27
  9. package/cjs/exported-related/RowRenderer/DefaultRowContentRenderer.js +9 -2
  10. package/cjs/exported-related/RowRenderer/useRowRendererHandlers.js +25 -7
  11. package/cjs/parts/Cells/Cell.js +3 -2
  12. package/cjs/parts/FilterBar/FiltersBar.js +7 -7
  13. package/cjs/parts/Filters/index.js +1 -1
  14. package/cjs/parts/Headers/HeaderCellGroup.js +3 -2
  15. package/cjs/parts/Headers/HeaderResizer.js +1 -1
  16. package/cjs/parts/Row.js +17 -1
  17. package/cjs/parts/RowVariants/index.js +1 -1
  18. package/cjs/styled.js +16 -21
  19. package/esm/addons/Columns/ColumnExpand/ColumnExpand.js +28 -14
  20. package/esm/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -1
  21. package/esm/addons/Editables/DateEditableCell/DateEditableCell.js +1 -1
  22. package/esm/addons/Editables/TextEditableCell/TextEditableCell.js +1 -1
  23. package/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +8 -6
  24. package/esm/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -1
  25. package/esm/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -1
  26. package/esm/exported-related/FilterPopover.js +30 -28
  27. package/esm/exported-related/RowRenderer/DefaultRowContentRenderer.js +10 -3
  28. package/esm/exported-related/RowRenderer/useRowRendererHandlers.js +25 -7
  29. package/esm/parts/Cells/Cell.js +3 -2
  30. package/esm/parts/FilterBar/FiltersBar.js +7 -7
  31. package/esm/parts/Filters/index.js +1 -1
  32. package/esm/parts/Headers/HeaderCellGroup.js +3 -2
  33. package/esm/parts/Headers/HeaderResizer.js +1 -1
  34. package/esm/parts/Row.js +17 -1
  35. package/esm/parts/RowVariants/index.js +1 -1
  36. package/esm/styled.js +16 -21
  37. package/package.json +19 -19
  38. package/types/types/props.d.ts +1 -0
@@ -41,32 +41,44 @@ var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled$1);
41
41
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
42
42
 
43
43
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
44
+ const disabledCaret = /*#__PURE__*/styled$1.css(["cursor:not-allowed;svg{fill:", ";}"], _ref => {
45
+ let {
46
+ theme
47
+ } = _ref;
48
+ return theme.colors.neutral['400'];
49
+ });
44
50
  const StyledSpan = /*#__PURE__*/styled__default["default"].span.withConfig({
45
51
  componentId: "sc-1xp824d-0"
46
- })(["cursor:pointer;box-sizing:border-box;outline:none;display:flex;justify-content:center;align-items:center;"]);
52
+ })(["cursor:pointer;box-sizing:border-box;outline:none;display:flex;justify-content:center;align-items:center;", ""], _ref2 => {
53
+ let {
54
+ disabled
55
+ } = _ref2;
56
+ return disabled && disabledCaret;
57
+ });
47
58
  const expandRowColumn = {
48
59
  // Build our expander column
49
60
  id: 'expander',
50
61
  // Make sure it has an ID
51
62
  accessor: 'expandRowColumn',
52
- Header: _ref => {
63
+ Header: _ref3 => {
53
64
  let {
54
65
  ctx
55
- } = _ref;
66
+ } = _ref3;
56
67
  const {
57
68
  tableProps: {
58
69
  expandedRows,
59
- onRowExpand
70
+ onRowExpand,
71
+ disabledRows
60
72
  },
61
73
  allDataFlattened
62
74
  } = ctx;
63
75
  const allExpandable = React.useMemo(() => {
64
76
  const expandable = {};
65
77
  allDataFlattened.forEach(row => {
66
- if (row.original.subRows || row.original.tableRowDetails || row.original.dimsumHeaderValue) expandable[row.uid] = true;
78
+ if (!disabledRows[row.uid] && (row.original.subRows || row.original.tableRowDetails || row.original.dimsumHeaderValue)) expandable[row.uid] = true;
67
79
  });
68
80
  return expandable;
69
- }, [allDataFlattened]);
81
+ }, [allDataFlattened, disabledRows]);
70
82
  const isAllRowsExpanded = React.useMemo(() => Object.keys(allExpandable).length === Object.keys(expandedRows).length, [allExpandable, expandedRows]);
71
83
  const onExpandedAllHandler = React.useCallback(() => {
72
84
  if (isAllRowsExpanded) onRowExpand({}, 'All');else onRowExpand(_objectSpread({}, allExpandable), 'All');
@@ -114,19 +126,20 @@ const expandRowColumn = {
114
126
  }
115
127
  }, void 0, GlobalExpandIcon));
116
128
  },
117
- Cell: _ref2 => {
129
+ Cell: _ref4 => {
118
130
  let {
119
131
  cell,
120
132
  row,
121
133
  isRowSelected,
122
134
  ctx,
123
135
  draggableProps
124
- } = _ref2;
136
+ } = _ref4;
125
137
  const {
126
138
  tableProps: {
127
139
  dragAndDropRows,
128
140
  expandedRows,
129
- onRowExpand
141
+ onRowExpand,
142
+ disabledRows
130
143
  }
131
144
  } = ctx;
132
145
  const uniqueId = row.uid;
@@ -160,7 +173,7 @@ const expandRowColumn = {
160
173
  role: 'button',
161
174
  key: `${row.uid}-expand-button`,
162
175
  title: 'Toggle Row Expanded',
163
- onClick: onRowExpandHandler,
176
+ onClick: !disabledRows[row.uid] ? onRowExpandHandler : undefined,
164
177
  onKeyDown: e => {
165
178
  if (['Enter', 'Space'].includes(e.code)) {
166
179
  e.preventDefault();
@@ -168,11 +181,12 @@ const expandRowColumn = {
168
181
  }
169
182
  },
170
183
  ref: cell.ref,
171
- tabIndex: isRowSelected ? 0 : -1,
184
+ tabIndex: isRowSelected || disabledRows[row.uid] ? 0 : -1,
172
185
  'data-testid': 'data-table-row-expand-cell',
173
186
  'aria-expanded': isExpanded,
174
- isRightArrow: !isExpanded || isDragging || isDragOverlay
175
- }), [row.uid, onRowExpandHandler, cell.ref, isRowSelected, isExpanded, isDragging, isDragOverlay]);
187
+ isRightArrow: !isExpanded || isDragging || isDragOverlay,
188
+ disabled: disabledRows[row.uid]
189
+ }), [row.uid, disabledRows, onRowExpandHandler, cell.ref, isRowSelected, isExpanded, isDragging, isDragOverlay]);
176
190
  const PureCaretIcon = React.useMemo(() => isExpanded && !isDragging && !isDragOverlay ? /*#__PURE__*/_jsx__default["default"](dsIcons.ArrowheadDown, {
177
191
  "data-is-col-expanded": isExpanded,
178
192
  "data-role": "row-expander-col",
@@ -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');
@@ -21,6 +21,9 @@ require('core-js/modules/esnext.set.reduce.js');
21
21
  require('core-js/modules/esnext.set.some.js');
22
22
  require('core-js/modules/esnext.set.symmetric-difference.js');
23
23
  require('core-js/modules/esnext.set.union.js');
24
+ require('core-js/modules/esnext.async-iterator.filter.js');
25
+ require('core-js/modules/esnext.iterator.constructor.js');
26
+ require('core-js/modules/esnext.iterator.filter.js');
24
27
  var React = require('react');
25
28
  var Grid = require('@elliemae/ds-grid');
26
29
  var dsControlledForm = require('@elliemae/ds-controlled-form');
@@ -33,9 +36,6 @@ require('styled-components');
33
36
  require('@elliemae/ds-button');
34
37
  require('@elliemae/ds-utilities');
35
38
  var constants = require('../../../../configs/constants.js');
36
- require('core-js/modules/esnext.async-iterator.filter.js');
37
- require('core-js/modules/esnext.iterator.constructor.js');
38
- require('core-js/modules/esnext.iterator.filter.js');
39
39
  require('core-js/modules/esnext.async-iterator.reduce.js');
40
40
  require('core-js/modules/esnext.iterator.reduce.js');
41
41
  require('react-virtual');
@@ -71,7 +71,8 @@ const BaseSelectFilter = props => {
71
71
  type,
72
72
  column: {
73
73
  id,
74
- filterOptions: userFilterOptions
74
+ filterOptions: userFilterOptions,
75
+ filterMinWidth
75
76
  },
76
77
  ctx: {
77
78
  tableProps: {
@@ -88,7 +89,7 @@ const BaseSelectFilter = props => {
88
89
  const filterOptions = React.useMemo(() => {
89
90
  // If the user didn't provide options, use the available ones
90
91
  if (!userFilterOptions) {
91
- const automaticFilters = [...new Set(data.map(datum => datum[id].toString()))].map(item => ({
92
+ const automaticFilters = [...new Set(data.filter(datum => !!datum[id]).map(datum => datum[id].toString()))].map(item => ({
92
93
  type: 'option',
93
94
  dsId: item,
94
95
  value: item,
@@ -117,7 +118,8 @@ const BaseSelectFilter = props => {
117
118
  "data-testid": isMulti ? constants.DATA_TESTID.DATA_TABLE_MULTISELECT_CONTROLLER : constants.DATA_TESTID.DATA_TABLE_SINGLESELECT_CONTROLLER,
118
119
  style: {
119
120
  background: '#fff',
120
- position: 'relative'
121
+ position: 'relative',
122
+ width: filterMinWidth
121
123
  }
122
124
  }, void 0, /*#__PURE__*/_jsx__default["default"](dsControlledForm.DSComboBox, {
123
125
  inline: true,
@@ -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');
@@ -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,
@@ -134,7 +141,7 @@ const DefaultRowContentRenderer = props => {
134
141
  detailsIndent: detailsIndent
135
142
  }))]
136
143
  });
137
- }, [row, selection, isExpandable, expandedRows, disabledRows, gridTemplateColProps, backgroundColor, compact, dropIndicatorPosition, isDndActive, isDragging, isDragOverlay, noSelectionColumn, selectedRowId, detailsIndent]);
144
+ }, [row, disabledRows, selection, isExpandable, expandedRows, gridTemplateColProps, backgroundColor, compact, dropIndicatorPosition, isDndActive, isDragging, isDragOverlay, noSelectionColumn, handleSelectDisableRow, selectedRowId, detailsIndent]);
138
145
  return PureRowContent;
139
146
  };
140
147
 
@@ -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.uid];
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,
@@ -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.uid] ? 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');
@@ -88,28 +88,28 @@ const FiltersBar = () => {
88
88
  const removeAllFilters = React.useCallback(() => {
89
89
  onFiltersChange([]);
90
90
  filterBarProps?.onClearAllFiltersClick?.();
91
- }, [onFiltersChange, filterBarProps.onClearAllFiltersClick]);
91
+ }, [onFiltersChange, filterBarProps?.onClearAllFiltersClick]);
92
92
  const onFilterBarClose = React.useCallback(() => {
93
93
  filterBarProps?.onDropdownMenuToggle?.(false, 'onClose');
94
94
  setIsOpen(false);
95
- }, [filterBarProps.onDropdownMenuToggle]);
95
+ }, [filterBarProps?.onDropdownMenuToggle]);
96
96
  const onFilterBarOpen = React.useCallback(() => {
97
97
  filterBarProps?.onDropdownMenuToggle?.(true, 'onOpen');
98
98
  setIsOpen(true);
99
- }, [filterBarProps.onDropdownMenuToggle]);
99
+ }, [filterBarProps?.onDropdownMenuToggle]);
100
100
  const onFilterBarOnClickOutside = React.useCallback(() => {
101
101
  filterBarProps?.onDropdownMenuToggle?.(false, 'onClickOutside');
102
102
  filterBarProps?.onDropdownMenuClickOutside?.();
103
103
  setIsOpen(false);
104
- }, [filterBarProps.onDropdownMenuToggle, filterBarProps.onDropdownMenuClickOutside]);
104
+ }, [filterBarProps?.onDropdownMenuToggle, filterBarProps?.onDropdownMenuClickOutside]);
105
105
  const onTriggerClick = React.useCallback(() => {
106
106
  filterBarProps?.onDropdownMenuTriggerClick?.();
107
107
  onFilterBarOpen();
108
- }, [filterBarProps.onDropdownMenuTriggerClick]);
108
+ }, [filterBarProps?.onDropdownMenuTriggerClick]);
109
109
  const finalIsOpen = React.useMemo(() => {
110
110
  if (typeof filterBarProps?.isDropdownMenuOpen === 'boolean') return filterBarProps.isDropdownMenuOpen;
111
111
  return isOpen;
112
- }, [filterBarProps.isDropdownMenuOpen, isOpen]);
112
+ }, [filterBarProps?.isDropdownMenuOpen, isOpen]);
113
113
  return /*#__PURE__*/_jsx__default["default"](styled.StyledWrapper, {
114
114
  width: width,
115
115
  "aria-live": "polite",
@@ -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');
@@ -49,9 +49,10 @@ const StyledWrapper = /*#__PURE__*/styled__default["default"](Grid.Grid).withCon
49
49
  componentId: "sc-1dqaj8a-0"
50
50
  })(["position:relative;", " width:", ";grid-column:", ";background:", ";opacity:", ";box-shadow:0 2px 4px 0 ", ";border-left:", " solid ", ";"], _ref => {
51
51
  let {
52
- shouldDropOneLevel
52
+ shouldDropOneLevel,
53
+ isDragOverlay
53
54
  } = _ref;
54
- return shouldDropOneLevel ? `top: 50%; height: 50%;` : '';
55
+ return shouldDropOneLevel && !isDragOverlay ? `top: 50%; height: 50%;` : '';
55
56
  }, props => props.isDragOverlay ? 'fit-content' : '100%', props => props.gridColumn, props => props.isDragging ? props.theme.colors.neutral['080'] : 'white', props => props.isDragging ? 0.8 : 1, props => props.isDragOverlay ? 'rgba(0,0,0,0.5)' : 'transparent', _ref2 => {
56
57
  let {
57
58
  isFirst
@@ -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.uid],
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');