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

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 (27) hide show
  1. package/cjs/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -1
  2. package/cjs/addons/Editables/DateEditableCell/DateEditableCell.js +1 -1
  3. package/cjs/addons/Editables/TextEditableCell/TextEditableCell.js +1 -1
  4. package/cjs/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -1
  5. package/cjs/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -1
  6. package/cjs/exported-related/FilterPopover.js +29 -27
  7. package/cjs/exported-related/RowRenderer/DefaultRowContentRenderer.js +8 -1
  8. package/cjs/exported-related/RowRenderer/useRowRendererHandlers.js +25 -7
  9. package/cjs/parts/Cells/Cell.js +3 -2
  10. package/cjs/parts/FilterBar/FiltersBar.js +1 -1
  11. package/cjs/parts/Filters/index.js +1 -1
  12. package/cjs/parts/Row.js +17 -1
  13. package/cjs/parts/RowVariants/index.js +1 -1
  14. package/esm/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -1
  15. package/esm/addons/Editables/DateEditableCell/DateEditableCell.js +1 -1
  16. package/esm/addons/Editables/TextEditableCell/TextEditableCell.js +1 -1
  17. package/esm/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -1
  18. package/esm/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -1
  19. package/esm/exported-related/FilterPopover.js +30 -28
  20. package/esm/exported-related/RowRenderer/DefaultRowContentRenderer.js +9 -2
  21. package/esm/exported-related/RowRenderer/useRowRendererHandlers.js +25 -7
  22. package/esm/parts/Cells/Cell.js +3 -2
  23. package/esm/parts/FilterBar/FiltersBar.js +1 -1
  24. package/esm/parts/Filters/index.js +1 -1
  25. package/esm/parts/Row.js +17 -1
  26. package/esm/parts/RowVariants/index.js +1 -1
  27. package/package.json +19 -19
@@ -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');
@@ -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,
@@ -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,
@@ -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');
@@ -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');
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');
@@ -14,7 +14,6 @@ import '@elliemae/ds-popperjs';
14
14
  import 'styled-components';
15
15
  import '../../../redux/reducers/index.js';
16
16
  import '../../../configs/constants.js';
17
- import 'react/jsx-runtime';
18
17
  import { EditableCell } from '../../../exported-related/EditableCell.js';
19
18
  import '@elliemae/ds-icons';
20
19
  import '@elliemae/ds-utilities';
@@ -23,6 +22,7 @@ import '../../../configs/useRowFlattenization.js';
23
22
  import 'core-js/modules/esnext.async-iterator.map.js';
24
23
  import 'core-js/modules/esnext.iterator.map.js';
25
24
  import '../../../styled.js';
25
+ import 'react/jsx-runtime';
26
26
  import '@elliemae/ds-form';
27
27
  import '../../../parts/TableContent.js';
28
28
  import '@elliemae/ds-grid';
@@ -11,7 +11,6 @@ import '@elliemae/ds-popperjs';
11
11
  import 'styled-components';
12
12
  import '../../../redux/reducers/index.js';
13
13
  import '../../../configs/constants.js';
14
- import 'react/jsx-runtime';
15
14
  import { EditableCell } from '../../../exported-related/EditableCell.js';
16
15
  import '@elliemae/ds-icons';
17
16
  import '@elliemae/ds-utilities';
@@ -22,6 +21,7 @@ import '../../../configs/useRowFlattenization.js';
22
21
  import 'core-js/modules/esnext.async-iterator.map.js';
23
22
  import 'core-js/modules/esnext.iterator.map.js';
24
23
  import '../../../styled.js';
24
+ import 'react/jsx-runtime';
25
25
  import '@elliemae/ds-form';
26
26
  import '../../../parts/TableContent.js';
27
27
  import '@elliemae/ds-grid';
@@ -11,7 +11,6 @@ import '@elliemae/ds-button';
11
11
  import '@elliemae/ds-popperjs';
12
12
  import '../../../redux/reducers/index.js';
13
13
  import '../../../configs/constants.js';
14
- import 'react/jsx-runtime';
15
14
  import { EditableCell } from '../../../exported-related/EditableCell.js';
16
15
  import '@elliemae/ds-icons';
17
16
  import '@elliemae/ds-utilities';
@@ -22,6 +21,7 @@ import '../../../configs/useRowFlattenization.js';
22
21
  import 'core-js/modules/esnext.async-iterator.map.js';
23
22
  import 'core-js/modules/esnext.iterator.map.js';
24
23
  import '../../../styled.js';
24
+ import 'react/jsx-runtime';
25
25
  import '@elliemae/ds-form';
26
26
  import '../../../parts/TableContent.js';
27
27
  import '@elliemae/ds-grid';
@@ -12,9 +12,9 @@ import '@elliemae/ds-popperjs';
12
12
  import 'styled-components';
13
13
  import '../../../../redux/reducers/index.js';
14
14
  import { DATA_TESTID } from '../../../../configs/constants.js';
15
- import 'react/jsx-runtime';
16
15
  import '../../../../styled.js';
17
16
  import '../../../../DataTableContext.js';
17
+ import 'react/jsx-runtime';
18
18
  import '@elliemae/ds-icons';
19
19
  import '@elliemae/ds-utilities';
20
20
  import 'core-js/modules/esnext.async-iterator.reduce.js';
@@ -12,9 +12,9 @@ import '@elliemae/ds-popperjs';
12
12
  import 'styled-components';
13
13
  import '../../../../redux/reducers/index.js';
14
14
  import { DATA_TESTID } from '../../../../configs/constants.js';
15
- import 'react/jsx-runtime';
16
15
  import '../../../../styled.js';
17
16
  import '../../../../DataTableContext.js';
17
+ import 'react/jsx-runtime';
18
18
  import '@elliemae/ds-icons';
19
19
  import '@elliemae/ds-utilities';
20
20
  import 'core-js/modules/esnext.async-iterator.reduce.js';
@@ -5,13 +5,12 @@ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
5
  import 'core-js/modules/esnext.iterator.for-each.js';
6
6
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
7
  import _jsx from '@babel/runtime/helpers/esm/jsx';
8
- import { useRef, useEffect, useState } from 'react';
8
+ import { useEffect, useState, useCallback } from 'react';
9
9
  import { DSButton } from '@elliemae/ds-button';
10
10
  import { DSPopperJS } from '@elliemae/ds-popperjs';
11
11
  import styled from 'styled-components';
12
12
  import '../redux/reducers/index.js';
13
13
  import { DATA_TESTID } from '../configs/constants.js';
14
- import { jsx } from 'react/jsx-runtime';
15
14
  import { useDispatchHeadersActions } from '../redux/reducers/headersReducers/useDispatchHeadersActions.js';
16
15
 
17
16
  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; }
@@ -26,7 +25,22 @@ const Button = /*#__PURE__*/styled(DSButton).withConfig({
26
25
  const PopperContent = /*#__PURE__*/styled.div.withConfig({
27
26
  componentId: "sc-16i88ut-2"
28
27
  })(["background-color:#fff;"]);
29
- const FilterPopover = _ref2 => {
28
+
29
+ const ButtonTrap = _ref2 => {
30
+ let {
31
+ cb
32
+ } = _ref2;
33
+ return /*#__PURE__*/_jsx("span", {
34
+ "aria-hidden": "true",
35
+ tabIndex: 0,
36
+ onFocus: e => {
37
+ e.stopPropagation();
38
+ cb();
39
+ }
40
+ });
41
+ };
42
+
43
+ const FilterPopover = _ref3 => {
30
44
  let {
31
45
  column,
32
46
  columnId,
@@ -38,7 +52,7 @@ const FilterPopover = _ref2 => {
38
52
  innerRef,
39
53
  ariaLabel,
40
54
  customStyles
41
- } = _ref2;
55
+ } = _ref3;
42
56
  const {
43
57
  hideFilterButton,
44
58
  hideFilterMenu
@@ -46,7 +60,6 @@ const FilterPopover = _ref2 => {
46
60
  hideFilterButton: true,
47
61
  hideFilterMenu: true
48
62
  };
49
- const popperRef = useRef(null);
50
63
  const {
51
64
  patchHeaderFilterButtonAndMenu,
52
65
  patchHeader
@@ -77,6 +90,13 @@ const FilterPopover = _ref2 => {
77
90
  };
78
91
 
79
92
  const [referenceElement, setReferenceElement] = useState(null);
93
+ const buttonTrapCallback = useCallback(() => {
94
+ patchHeader(columnId, {
95
+ hideFilterMenu: true,
96
+ hideFilterButton: false
97
+ });
98
+ referenceElement?.focus();
99
+ }, [columnId, patchHeader, referenceElement]);
80
100
  return /*#__PURE__*/_jsx("div", {
81
101
  // This is here to prevent propagation, and not trigger the sort functionality
82
102
  onClick: e => e.stopPropagation(),
@@ -99,11 +119,6 @@ const FilterPopover = _ref2 => {
99
119
  },
100
120
  style: {
101
121
  display: 'flex'
102
- },
103
- onBlur: e => {
104
- if (e.target !== referenceElement && !popperRef.current?.contains(e.relatedTarget)) {
105
- referenceElement?.focus();
106
- }
107
122
  }
108
123
  }, void 0, /*#__PURE__*/_jsx(FilterButton, {
109
124
  hide: !isIconVisible,
@@ -135,24 +150,11 @@ const FilterPopover = _ref2 => {
135
150
  minWidth: column.ref?.current?.offsetWidth ?? '0px'
136
151
  }),
137
152
  placementOrderPreference: ['bottom-end']
138
- }, void 0, /*#__PURE__*/jsx(PopperContent, {
139
- onKeyDown: e => {
140
- if (e.code === 'Tab') {
141
- setTimeout(() => {
142
- if (!popperRef?.current?.contains(document.activeElement)) {
143
- patchHeader(columnId, {
144
- hideFilterMenu: true,
145
- hideFilterButton: false
146
- });
147
- e.preventDefault();
148
- referenceElement.focus();
149
- }
150
- });
151
- }
152
- },
153
- ref: popperRef,
154
- children: menuContent
155
- })));
153
+ }, void 0, /*#__PURE__*/_jsx(PopperContent, {}, void 0, /*#__PURE__*/_jsx(ButtonTrap, {
154
+ cb: buttonTrapCallback
155
+ }), menuContent, /*#__PURE__*/_jsx(ButtonTrap, {
156
+ cb: buttonTrapCallback
157
+ }))));
156
158
  };
157
159
 
158
160
  export { FilterPopover };
@@ -5,7 +5,7 @@ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
5
  import 'core-js/modules/esnext.iterator.for-each.js';
6
6
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
7
  import _jsx from '@babel/runtime/helpers/esm/jsx';
8
- import { useRef, useLayoutEffect, useMemo } from 'react';
8
+ import { useRef, useLayoutEffect, useMemo, useCallback } from 'react';
9
9
  import { INTERNAL_COLUMNS } from '../../addons/Columns/index.js';
10
10
  import { DATA_TESTID } from '../../configs/constants.js';
11
11
  import 'core-js/modules/esnext.async-iterator.reduce.js';
@@ -91,12 +91,18 @@ const DefaultRowContentRenderer = props => {
91
91
 
92
92
  return padding;
93
93
  }, [row.depth, visibleColumns]);
94
+ const handleSelectDisableRow = useCallback(e => {
95
+ if (disabledRows[row.uid]) {
96
+ e.preventDefault();
97
+ e.stopPropagation();
98
+ }
99
+ }, [disabledRows, row.uid]);
94
100
  const PureRowContent = useMemo(() => {
95
101
  const DetailsView = row.original.tableRowDetails;
96
102
  return /*#__PURE__*/jsxs(Fragment, {
97
103
  children: [/*#__PURE__*/jsx(StyledCellContainer, _objectSpread(_objectSpread({
98
104
  ref: rowRef,
99
- tabIndex: 0,
105
+ tabIndex: disabledRows[row.uid] ? -1 : 0,
100
106
  role: "row",
101
107
  "aria-rowindex": row.realIndex + 1,
102
108
  "aria-label": ariaLabelMessage(row, selection?.[row.uid] === true),
@@ -115,6 +121,7 @@ const DefaultRowContentRenderer = props => {
115
121
  selected: noSelectionColumn && selection?.[row.uid] === true,
116
122
  disabled: disabledRows[row.uid],
117
123
  "data-testid": DATA_TESTID.DATA_TABLE_ROW_CONTENT,
124
+ onMouseDown: handleSelectDisableRow,
118
125
  children: /*#__PURE__*/_jsx(Cells, {
119
126
  row: row,
120
127
  isRowSelected: selectedRowId === row.uid,
@@ -44,12 +44,26 @@ const useRowRendererHandlers = _ref => {
44
44
  const {
45
45
  tableProps: {
46
46
  onRowClick,
47
- onRowFocus
47
+ onRowFocus,
48
+ disabledRows
48
49
  },
49
50
  virtualListHelpers: {
50
51
  scrollToIndex
51
52
  }
52
53
  } = useContext(DataTableContext);
54
+
55
+ const isOptionFocuseable = opt => !disabledRows[opt.id];
56
+
57
+ const findInCircularList = function (list, from, criteria) {
58
+ let step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
59
+
60
+ for (let i = (from + step + list.length) % list.length; i !== from && from > -1; i = (i + step + list.length) % list.length) {
61
+ if (criteria(list[i])) return i;
62
+ }
63
+
64
+ return from; // return same item
65
+ };
66
+
53
67
  const {
54
68
  setSelectedRowId,
55
69
  setFocusedRowId
@@ -60,6 +74,7 @@ const useRowRendererHandlers = _ref => {
60
74
  uid
61
75
  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : row;
62
76
  // setSelectedRowId(null);
77
+ if (disabledRows[uid]) return;
63
78
  onRowClick(original, e, uid);
64
79
  onRowFocus({
65
80
  itemIndex,
@@ -71,7 +86,7 @@ const useRowRendererHandlers = _ref => {
71
86
  },
72
87
  original
73
88
  }, e);
74
- }, [row, onRowClick, onRowFocus, itemIndex, scrollToIndex]);
89
+ }, [row, disabledRows, onRowClick, onRowFocus, itemIndex, scrollToIndex]);
75
90
  const isActive = draggableProps && draggableProps.active;
76
91
  const handleKeyDown = useCallback(e => {
77
92
  if (isDragOverlay || isActive) {
@@ -98,24 +113,27 @@ const useRowRendererHandlers = _ref => {
98
113
 
99
114
  if (e.code === 'ArrowDown') {
100
115
  e.preventDefault();
101
- if (itemIndex + 1 < items.length) setFocusedRowId(items[itemIndex + 1].uid);
116
+ e.stopPropagation();
117
+ const next = findInCircularList(items, itemIndex, isOptionFocuseable);
118
+ setFocusedRowId(items[next].uid);
102
119
  }
103
120
 
104
121
  if (e.code === 'ArrowUp') {
105
122
  e.preventDefault();
106
- if (itemIndex - 1 >= 0) setFocusedRowId(items[itemIndex - 1].uid);
123
+ const prev = findInCircularList(items, itemIndex, isOptionFocuseable, -1);
124
+ setFocusedRowId(items[prev].uid);
107
125
  }
108
- }, [isDragOverlay, isActive, selectedRowId, row, setSelectedRowId, handleItemClick, itemIndex, items, setFocusedRowId]);
126
+ }, [isDragOverlay, isActive, selectedRowId, row, setSelectedRowId, handleItemClick, items, itemIndex, isOptionFocuseable, setFocusedRowId]);
109
127
  const handleOnBlur = useCallback(e => {
110
128
  if (e.relatedTarget?.getAttribute('data-testid') === 'data-table-row-content') {
111
129
  setSelectedRowId(null);
112
130
  }
113
131
  }, [setSelectedRowId]);
114
132
  const handleOnFocus = useCallback(e => {
115
- if (e.target && e.target.getAttribute('data-testid') === DATA_TESTID.DATA_TABLE_ROW_CONTENT) {
133
+ if (!disabledRows[row.uid] && e.target && e.target.getAttribute('data-testid') === DATA_TESTID.DATA_TABLE_ROW_CONTENT) {
116
134
  setFocusedRowId(row.uid);
117
135
  }
118
- }, [row.uid, setFocusedRowId]);
136
+ }, [row.uid, setFocusedRowId, disabledRows]);
119
137
  return {
120
138
  handleItemClick,
121
139
  handleKeyDown,
@@ -63,7 +63,8 @@ const Cell = _ref2 => {
63
63
  const ctx = useContext(DataTableContext);
64
64
  const {
65
65
  tableProps: {
66
- cellRendererProps
66
+ cellRendererProps,
67
+ disabledRows
67
68
  }
68
69
  } = ctx;
69
70
  const {
@@ -112,7 +113,7 @@ const Cell = _ref2 => {
112
113
  return null;
113
114
  }, [DefaultCellContentJSX, cellProps, column]);
114
115
  return /*#__PURE__*/jsx(PureStandardCell, _objectSpread(_objectSpread({}, cellProps), {}, {
115
- children: column.editable ? EditableContentJSX : DefaultCellContentJSX
116
+ children: column.editable && !disabledRows[row.id] ? EditableContentJSX : DefaultCellContentJSX
116
117
  }));
117
118
  };
118
119
 
@@ -16,9 +16,9 @@ import '@elliemae/ds-popperjs';
16
16
  import 'styled-components';
17
17
  import '../../redux/reducers/index.js';
18
18
  import { DATA_TESTID } from '../../configs/constants.js';
19
- import 'react/jsx-runtime';
20
19
  import '../../styled.js';
21
20
  import DataTableContext from '../../DataTableContext.js';
21
+ import 'react/jsx-runtime';
22
22
  import '@elliemae/ds-utilities';
23
23
  import 'core-js/modules/esnext.async-iterator.reduce.js';
24
24
  import 'core-js/modules/esnext.iterator.reduce.js';
@@ -21,9 +21,9 @@ import '@elliemae/ds-popperjs';
21
21
  import 'styled-components';
22
22
  import '../../redux/reducers/index.js';
23
23
  import '../../configs/constants.js';
24
- import { jsx } from 'react/jsx-runtime';
25
24
  import '../../styled.js';
26
25
  import '../../DataTableContext.js';
26
+ import { jsx } from 'react/jsx-runtime';
27
27
  import '@elliemae/ds-icons';
28
28
  import '@elliemae/ds-utilities';
29
29
  import 'core-js/modules/esnext.async-iterator.reduce.js';
package/esm/parts/Row.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
2
  import { useContext } from 'react';
3
3
  import { connect } from 'react-redux';
4
+ import { styled } from '@elliemae/ds-system';
4
5
  import DataTableContext from '../DataTableContext.js';
5
6
  import 'core-js/modules/esnext.async-iterator.for-each.js';
6
7
  import 'core-js/modules/esnext.iterator.constructor.js';
@@ -21,6 +22,15 @@ const setItemRefs = (measureRef, draggableRef, ref) => {
21
22
  setMultipleRefs(...refsToSet)(ref);
22
23
  };
23
24
 
25
+ const StyledRow = styled('div')`
26
+ cursor: ${_ref => {
27
+ let {
28
+ disabled
29
+ } = _ref;
30
+ return disabled ? 'not-allowed' : 'normal';
31
+ }};
32
+ `;
33
+
24
34
  const RowComp = props => {
25
35
  const {
26
36
  row,
@@ -31,11 +41,17 @@ const RowComp = props => {
31
41
  selectedRowId
32
42
  } = props;
33
43
  const ctx = useContext(DataTableContext);
44
+ const {
45
+ tableProps: {
46
+ disabledRows
47
+ }
48
+ } = ctx;
34
49
  const {
35
50
  draggableProps
36
51
  } = useContext(SortableItemContext);
37
52
  const draggableRef = draggableProps && draggableProps.setNodeRef;
38
- return /*#__PURE__*/jsx("div", {
53
+ return /*#__PURE__*/jsx(StyledRow, {
54
+ disabled: disabledRows[row.id],
39
55
  style: !isDragOverlay ? itemWrapperStyle : {},
40
56
  ref: ref => setItemRefs(measureRef, draggableRef, ref),
41
57
  children: /*#__PURE__*/_jsx(RowVariantMapItem, {
@@ -12,9 +12,9 @@ import '@elliemae/ds-popperjs';
12
12
  import 'styled-components';
13
13
  import '../../redux/reducers/index.js';
14
14
  import '../../configs/constants.js';
15
- import { jsx } from 'react/jsx-runtime';
16
15
  import '../../styled.js';
17
16
  import '../../DataTableContext.js';
17
+ import { jsx } from 'react/jsx-runtime';
18
18
  import '@elliemae/ds-icons';
19
19
  import '@elliemae/ds-utilities';
20
20
  import 'core-js/modules/esnext.async-iterator.reduce.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elliemae/ds-data-table",
3
- "version": "2.4.3-rc.8",
3
+ "version": "2.4.3-rc.9",
4
4
  "license": "MIT",
5
5
  "description": "ICE MT - Dimsum - Data Table",
6
6
  "module": "./esm/index.js",
@@ -570,24 +570,24 @@
570
570
  "dependencies": {
571
571
  "@dnd-kit/core": "~4.0.1",
572
572
  "@dnd-kit/sortable": "~5.0.0",
573
- "@elliemae/ds-button": "2.4.3-rc.8",
574
- "@elliemae/ds-circular-progress-indicator": "2.4.3-rc.8",
575
- "@elliemae/ds-controlled-form": "2.4.3-rc.8",
576
- "@elliemae/ds-drag-and-drop": "2.4.3-rc.8",
577
- "@elliemae/ds-dropdownmenu": "2.4.3-rc.8",
578
- "@elliemae/ds-form": "2.4.3-rc.8",
579
- "@elliemae/ds-form-layout-blocks": "2.4.3-rc.8",
580
- "@elliemae/ds-grid": "2.4.3-rc.8",
581
- "@elliemae/ds-icons": "2.4.3-rc.8",
582
- "@elliemae/ds-indeterminate-progress-indicator": "2.4.3-rc.8",
583
- "@elliemae/ds-pagination": "2.4.3-rc.8",
584
- "@elliemae/ds-pills": "2.4.3-rc.8",
585
- "@elliemae/ds-popperjs": "2.4.3-rc.8",
586
- "@elliemae/ds-props-helpers": "2.4.3-rc.8",
587
- "@elliemae/ds-system": "2.4.3-rc.8",
588
- "@elliemae/ds-toolbar": "2.4.3-rc.8",
589
- "@elliemae/ds-truncated-tooltip-text": "2.4.3-rc.8",
590
- "@elliemae/ds-utilities": "2.4.3-rc.8",
573
+ "@elliemae/ds-button": "2.4.3-rc.9",
574
+ "@elliemae/ds-circular-progress-indicator": "2.4.3-rc.9",
575
+ "@elliemae/ds-controlled-form": "2.4.3-rc.9",
576
+ "@elliemae/ds-drag-and-drop": "2.4.3-rc.9",
577
+ "@elliemae/ds-dropdownmenu": "2.4.3-rc.9",
578
+ "@elliemae/ds-form": "2.4.3-rc.9",
579
+ "@elliemae/ds-form-layout-blocks": "2.4.3-rc.9",
580
+ "@elliemae/ds-grid": "2.4.3-rc.9",
581
+ "@elliemae/ds-icons": "2.4.3-rc.9",
582
+ "@elliemae/ds-indeterminate-progress-indicator": "2.4.3-rc.9",
583
+ "@elliemae/ds-pagination": "2.4.3-rc.9",
584
+ "@elliemae/ds-pills": "2.4.3-rc.9",
585
+ "@elliemae/ds-popperjs": "2.4.3-rc.9",
586
+ "@elliemae/ds-props-helpers": "2.4.3-rc.9",
587
+ "@elliemae/ds-system": "2.4.3-rc.9",
588
+ "@elliemae/ds-toolbar": "2.4.3-rc.9",
589
+ "@elliemae/ds-truncated-tooltip-text": "2.4.3-rc.9",
590
+ "@elliemae/ds-utilities": "2.4.3-rc.9",
591
591
  "@reduxjs/toolkit": "~1.6.2",
592
592
  "csstype": "~3.0.9",
593
593
  "moment": "~2.29.1",