@elliemae/ds-data-table 2.0.0-alpha.6 → 2.0.0-next.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 (51) hide show
  1. package/cjs/DataTableSchema.js +9 -9
  2. package/cjs/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -0
  3. package/cjs/addons/Editables/DateEditableCell/DateEditableCell.js +1 -0
  4. package/cjs/addons/Editables/TextEditableCell/TextEditableCell.js +1 -0
  5. package/cjs/addons/Filters/Components/DateRangeFilter/index.js +2 -1
  6. package/cjs/addons/Filters/Components/NumberRangeFilter/index.js +1 -0
  7. package/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +1 -0
  8. package/cjs/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -0
  9. package/cjs/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -0
  10. package/cjs/addons/Filters/Components/SingleDateFilter/index.js +1 -0
  11. package/cjs/addons/Filters/Components/TextInputFilter/index.js +1 -0
  12. package/cjs/configs/constants.js +2 -1
  13. package/cjs/exported-related/EditableCell.js +2 -1
  14. package/cjs/exported-related/FilterPopover.js +6 -2
  15. package/cjs/exported-related/RowRenderer/useRowRendererHandlers.js +25 -2
  16. package/cjs/exported-related/RowRenderer/useRowStyle.js +5 -5
  17. package/cjs/exported-related/Toolbar/Toolbar.js +29 -14
  18. package/cjs/helpers/addCellData.js +1 -1
  19. package/cjs/parts/FilterBar/FiltersBar.js +5 -1
  20. package/cjs/parts/FilterBar/components/MultiSelectPill.js +3 -2
  21. package/cjs/parts/Filters/index.js +1 -0
  22. package/cjs/parts/Headers/HeaderCell.js +3 -1
  23. package/cjs/parts/RowVariants/index.js +1 -0
  24. package/cjs/styled.js +9 -2
  25. package/esm/DataTableSchema.js +9 -9
  26. package/esm/addons/Editables/ComboboxEditableCell/ComboboxEditableCell.js +1 -0
  27. package/esm/addons/Editables/DateEditableCell/DateEditableCell.js +1 -0
  28. package/esm/addons/Editables/TextEditableCell/TextEditableCell.js +1 -0
  29. package/esm/addons/Filters/Components/DateRangeFilter/index.js +2 -1
  30. package/esm/addons/Filters/Components/NumberRangeFilter/index.js +1 -0
  31. package/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +1 -0
  32. package/esm/addons/Filters/Components/SelectFilter/MultiSelectFilter.js +1 -0
  33. package/esm/addons/Filters/Components/SelectFilter/SingleSelectFilter.js +1 -0
  34. package/esm/addons/Filters/Components/SingleDateFilter/index.js +1 -0
  35. package/esm/addons/Filters/Components/TextInputFilter/index.js +1 -0
  36. package/esm/configs/constants.js +2 -1
  37. package/esm/exported-related/EditableCell.js +2 -1
  38. package/esm/exported-related/FilterPopover.js +6 -2
  39. package/esm/exported-related/RowRenderer/useRowRendererHandlers.js +25 -2
  40. package/esm/exported-related/RowRenderer/useRowStyle.js +5 -5
  41. package/esm/exported-related/Toolbar/Toolbar.js +30 -15
  42. package/esm/helpers/addCellData.js +1 -1
  43. package/esm/parts/FilterBar/FiltersBar.js +5 -1
  44. package/esm/parts/FilterBar/components/MultiSelectPill.js +3 -2
  45. package/esm/parts/Filters/index.js +1 -0
  46. package/esm/parts/Headers/HeaderCell.js +3 -1
  47. package/esm/parts/RowVariants/index.js +1 -0
  48. package/esm/styled.js +9 -2
  49. package/package.json +4 -4
  50. package/types/configs/constants.d.ts +1 -0
  51. package/types/exported-related/Toolbar/Toolbar.d.ts +2 -4
@@ -13,12 +13,12 @@ const columnPropTypes = {
13
13
  accessor: reactDesc.PropTypes.string.description('The entry of the data that this column will display'),
14
14
  id: reactDesc.PropTypes.string.description('The id of the column, will default to the Header or accessor if not present'),
15
15
  filter: outOfTheBoxFilterType.description('out-of-the-box filters'),
16
- Filter: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('The custom component to render as a filter'),
17
- Cell: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('The custom cell renderer component'),
16
+ Filter: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('The custom component to render as a filter'),
17
+ Cell: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('The custom cell renderer component'),
18
18
  editable: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.string, reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('The editable out-of-the-box or component to render'),
19
19
  disableDnD: reactDesc.PropTypes.bool.description('Whereas this column should be draggable'),
20
20
  canResize: reactDesc.PropTypes.bool.description('Whereas this column should be resizable'),
21
- width: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.string, reactDesc.PropTypes.number]).description('Width of this column'),
21
+ width: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.string, reactDesc.PropTypes.number]).description('Width of this column'),
22
22
  minWidth: reactDesc.PropTypes.number.description('Minimum width of this column, useful when resizing'),
23
23
  maxWidth: reactDesc.PropTypes.number.description('Maximum width of this column, useful when resizing'),
24
24
  canSort: reactDesc.PropTypes.bool.description('Whereas this column is sortable'),
@@ -31,7 +31,7 @@ const columnsPropTypes = reactDesc.PropTypes.shape(columnPropTypes).description(
31
31
  const rowPropTypes = {
32
32
  row_variant_type: rowVariantType.description('Which row variant to use, will default to primary'),
33
33
  row_variant_compact: reactDesc.PropTypes.bool.description('Whether to use the compact version of the row'),
34
- tableRowDetails: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('Component for row details'),
34
+ tableRowDetails: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('Component for row details'),
35
35
  dimsumHeaderValue: reactDesc.PropTypes.string.description('Header displayed on the header variant of the row')
36
36
  };
37
37
  const rowsPropTypes = reactDesc.PropTypes.shape(rowPropTypes).description('Rows props');
@@ -39,8 +39,8 @@ const DataTableSchema = {
39
39
  columns: reactDesc.PropTypes.arrayOf(columnsPropTypes).description('Array of columns').isRequired,
40
40
  data: reactDesc.PropTypes.arrayOf(rowsPropTypes).description('Array of rows'),
41
41
  height: reactDesc.PropTypes.number.description('Height of the datatable component'),
42
- width: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.string, reactDesc.PropTypes.number]).description('Width of the datatable component'),
43
- renderRowActions: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.object, reactDesc.PropTypes.bool]).description('The renderer to use for the action toolbar'),
42
+ width: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.string, reactDesc.PropTypes.number]).description('Width of the datatable component'),
43
+ renderRowActions: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.object, reactDesc.PropTypes.bool]).description('The renderer to use for the action toolbar'),
44
44
  isExpandable: reactDesc.PropTypes.bool.description('Whether the datatable is expandable').defaultValue(false),
45
45
  uniqueRowAccessor: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.string, reactDesc.PropTypes.arrayOf(reactDesc.PropTypes.string), reactDesc.PropTypes.func]).description('Column / Combination of columns / Function to call to produce a unique identifier for each row.' + ' This is necessary for the selectable and drag and drop features'),
46
46
  disabledRows: reactDesc.PropTypes.object.description('Object with the identifiers of the rows as keys, and booleans as values. Specifies if a row is disabled or not'),
@@ -59,7 +59,7 @@ const DataTableSchema = {
59
59
  })).description('Array of filter keys and values'),
60
60
  withFilterBar: reactDesc.PropTypes.bool.description('Whether to display the filter bar'),
61
61
  filterBarProps: reactDesc.PropTypes.shape({
62
- customPillRenderer: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('If you specify custom filters, you will need to render their pills here'),
62
+ customPillRenderer: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('If you specify custom filters, you will need to render their pills here'),
63
63
  extraOptions: reactDesc.PropTypes.arrayOf(reactDesc.PropTypes.shape({
64
64
  type: reactDesc.PropTypes.string,
65
65
  id: reactDesc.PropTypes.string,
@@ -68,7 +68,7 @@ const DataTableSchema = {
68
68
  })).description('Any extra option you want in the dropdownmenu of the filter bar')
69
69
  }).description('Props for the filter bar'),
70
70
  onFiltersChange: reactDesc.PropTypes.func.description('Function invoked when filters change'),
71
- pagination: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.bool, reactDesc.PropTypes.shape({
71
+ pagination: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.bool, reactDesc.PropTypes.shape({
72
72
  pageIndex: reactDesc.PropTypes.number.description('Index of the current page, starting from 1'),
73
73
  canPreviousPage: reactDesc.PropTypes.bool.description('Whether the previous button is disabled or not'),
74
74
  canNextPage: reactDesc.PropTypes.bool.description('Whether the next button is disabled or not'),
@@ -90,7 +90,7 @@ const DataTableSchema = {
90
90
  noResultsMessage: reactDesc.PropTypes.string.description('Message to show when no more data is available'),
91
91
  noResultsSecondaryMessage: reactDesc.PropTypes.string.description('Secondary message to show when no more data is available'),
92
92
  noResultsButtonLabel: reactDesc.PropTypes.string.description('Label of the button when no more data is available'),
93
- noResultsPlaceholder: reactDesc.PropTypes.oneOf([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('Custom content to show when dataset is empty'),
93
+ noResultsPlaceholder: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.func, reactDesc.PropTypes.element]).description('Custom content to show when dataset is empty'),
94
94
  isLoading: reactDesc.PropTypes.bool.description('Whether to show a global loader in the datatable'),
95
95
  isLoadingAppended: reactDesc.PropTypes.bool.description('Whether to show an appended loader in the datatable'),
96
96
  // eslint-disable-next-line max-lines
@@ -30,6 +30,7 @@ require('@elliemae/ds-icons/GripperVertical');
30
30
  require('../../../parts/HoC/SortableItemContext.js');
31
31
  var EditableCell = require('../../../exported-related/EditableCell.js');
32
32
  require('@elliemae/ds-icons/MoreOptionsVert');
33
+ require('@elliemae/ds-utilities/hooks');
33
34
  require('uid');
34
35
  require('../../../exported-related/Filters/applyOutOfTheBoxFilters.js');
35
36
  require('moment');
@@ -29,6 +29,7 @@ require('@elliemae/ds-icons/GripperVertical');
29
29
  require('../../../parts/HoC/SortableItemContext.js');
30
30
  var EditableCell = require('../../../exported-related/EditableCell.js');
31
31
  require('@elliemae/ds-icons/MoreOptionsVert');
32
+ require('@elliemae/ds-utilities/hooks');
32
33
  require('uid');
33
34
  require('../../../exported-related/Filters/applyOutOfTheBoxFilters.js');
34
35
  require('moment');
@@ -29,6 +29,7 @@ require('@elliemae/ds-icons/GripperVertical');
29
29
  require('../../../parts/HoC/SortableItemContext.js');
30
30
  var EditableCell = require('../../../exported-related/EditableCell.js');
31
31
  require('@elliemae/ds-icons/MoreOptionsVert');
32
+ require('@elliemae/ds-utilities/hooks');
32
33
  require('uid');
33
34
  require('../../../exported-related/Filters/applyOutOfTheBoxFilters.js');
34
35
  require('moment');
@@ -14,6 +14,7 @@ require('react/jsx-runtime');
14
14
  require('styled-components');
15
15
  require('@elliemae/ds-button');
16
16
  require('@elliemae/ds-icons/MoreOptionsVert');
17
+ require('@elliemae/ds-utilities/hooks');
17
18
  var constants = require('../../../../configs/constants.js');
18
19
  require('react-virtual');
19
20
  require('../../../../configs/useRowFlattenization.js');
@@ -65,7 +66,7 @@ const DateRangeFilter = props => {
65
66
  setEndDate(dateRange.endDate || '');
66
67
  }, [dateRange]);
67
68
  React.useEffect(() => {
68
- if (!startDate.includes('_') && !endDate.includes('_')) {
69
+ if (startDate && endDate && !startDate.includes('_') && !endDate.includes('_')) {
69
70
  onValueChange(FilterTypes.FILTER_TYPES.DATE_RANGE, {
70
71
  startDate,
71
72
  endDate
@@ -15,6 +15,7 @@ require('react/jsx-runtime');
15
15
  require('styled-components');
16
16
  require('@elliemae/ds-button');
17
17
  require('@elliemae/ds-icons/MoreOptionsVert');
18
+ require('@elliemae/ds-utilities/hooks');
18
19
  var constants = require('../../../../configs/constants.js');
19
20
  require('react-virtual');
20
21
  require('../../../../configs/useRowFlattenization.js');
@@ -32,6 +32,7 @@ var jsxRuntime = require('react/jsx-runtime');
32
32
  require('styled-components');
33
33
  require('@elliemae/ds-button');
34
34
  require('@elliemae/ds-icons/MoreOptionsVert');
35
+ require('@elliemae/ds-utilities/hooks');
35
36
  var constants = require('../../../../configs/constants.js');
36
37
  require('../../../../configs/useRowFlattenization.js');
37
38
  require('@babel/runtime/helpers/defineProperty');
@@ -29,6 +29,7 @@ require('../../../../parts/Footer.js');
29
29
  require('@elliemae/ds-icons/GripperVertical');
30
30
  require('../../../../parts/HoC/SortableItemContext.js');
31
31
  require('@elliemae/ds-icons/MoreOptionsVert');
32
+ require('@elliemae/ds-utilities/hooks');
32
33
  require('uid');
33
34
  var FilterTypes = require('../../../../exported-related/FilterTypes.js');
34
35
  require('../../../../exported-related/Filters/applyOutOfTheBoxFilters.js');
@@ -29,6 +29,7 @@ require('../../../../parts/Footer.js');
29
29
  require('@elliemae/ds-icons/GripperVertical');
30
30
  require('../../../../parts/HoC/SortableItemContext.js');
31
31
  require('@elliemae/ds-icons/MoreOptionsVert');
32
+ require('@elliemae/ds-utilities/hooks');
32
33
  require('uid');
33
34
  var FilterTypes = require('../../../../exported-related/FilterTypes.js');
34
35
  require('../../../../exported-related/Filters/applyOutOfTheBoxFilters.js');
@@ -14,6 +14,7 @@ require('react/jsx-runtime');
14
14
  require('styled-components');
15
15
  require('@elliemae/ds-button');
16
16
  require('@elliemae/ds-icons/MoreOptionsVert');
17
+ require('@elliemae/ds-utilities/hooks');
17
18
  var constants = require('../../../../configs/constants.js');
18
19
  require('react-virtual');
19
20
  require('../../../../configs/useRowFlattenization.js');
@@ -12,6 +12,7 @@ require('react/jsx-runtime');
12
12
  require('styled-components');
13
13
  require('@elliemae/ds-button');
14
14
  require('@elliemae/ds-icons/MoreOptionsVert');
15
+ require('@elliemae/ds-utilities/hooks');
15
16
  require('../../../../configs/constants.js');
16
17
  require('react-virtual');
17
18
  require('../../../../configs/useRowFlattenization.js');
@@ -43,7 +43,8 @@ const DATA_TESTID = {
43
43
  DATA_TABLE_ROW_HEADER_CONTENT: 'data-table-row-header-content',
44
44
  DATA_TABLE_ROW_GROUP_HEADER: 'data-table-row-group-header',
45
45
  DATA_TABLE_COLUMN_DRAG_OVERLAY: 'data-table-drag-column-drag-overlay',
46
- DATA_TABLE_HEADER_CELL_TITLE: 'header-cell-title'
46
+ DATA_TABLE_HEADER_CELL_TITLE: 'header-cell-title',
47
+ DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON: 'filter-bar-ddmenu-button'
47
48
  };
48
49
 
49
50
  exports.DATA_TESTID = DATA_TESTID;
@@ -60,13 +60,14 @@ const EditableCell = props => {
60
60
  onKeyDown: handleOnKeyDown,
61
61
  onBlur: handleOnBlur,
62
62
  shouldDisplayEditIcon: cell.column.alwaysDisplayEditIcon,
63
+ role: "cell",
63
64
  "aria-describedby": isEditing ? undefined : cell.id,
64
65
  children: [!isEditing ? StandardRender : EditableRenderer, !isEditing && (_StyledPencilIcon || (_StyledPencilIcon = /*#__PURE__*/_jsx__default["default"](styled.StyledPencilIcon, {}))), /*#__PURE__*/_jsx__default["default"]("span", {
65
66
  id: cell.id,
66
67
  style: {
67
68
  display: 'none'
68
69
  },
69
- "aria-hidden": "false"
70
+ "aria-hidden": "true"
70
71
  }, void 0, "Editable cell. To edit the content's of this cell, press the Enter key")]
71
72
  });
72
73
  };
@@ -122,10 +122,14 @@ const FilterPopover = ({
122
122
  closeContextMenu: handleClickOutsideMenu,
123
123
  "data-testid": constants.DATA_TESTID.DATA_TABLE_FILTER_MENU_CONTENT,
124
124
  startPlacementPreference: "bottom-end",
125
- customOffset: [4, 4],
125
+ customOffset: [5, 4],
126
126
  withoutArrow: true,
127
127
  withoutPortal: true,
128
- zIndex: 10
128
+ zIndex: 10,
129
+ extraPopperStyles: {
130
+ minWidth: '100%'
131
+ },
132
+ placementOrderPreference: ['bottom-end']
129
133
  }, void 0, /*#__PURE__*/_jsx__default["default"]("div", {
130
134
  style: {
131
135
  backgroundColor: '#fff'
@@ -3,7 +3,28 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
+ var constants = require('../../configs/constants.js');
7
+ require('react-virtual');
8
+ require('../../configs/useRowFlattenization.js');
9
+ require('@babel/runtime/helpers/defineProperty');
10
+ require('@babel/runtime/helpers/jsx');
11
+ require('@elliemae/ds-icons');
12
+ require('styled-components');
13
+ require('../../styled.js');
14
+ require('react/jsx-runtime');
15
+ require('@elliemae/ds-form/Checkbox');
16
+ require('@elliemae/ds-form/Radio');
17
+ require('../../parts/TableContent.js');
18
+ require('@elliemae/ds-grid');
19
+ require('@elliemae/ds-circular-progress-indicator');
20
+ require('@elliemae/ds-icons/WarningTriangle');
21
+ require('@elliemae/ds-system');
22
+ require('@elliemae/ds-button');
6
23
  var DataTableContext = require('../../DataTableContext.js');
24
+ require('../../parts/Row.js');
25
+ require('../../parts/Footer.js');
26
+ require('@elliemae/ds-icons/GripperVertical');
27
+ require('../../parts/HoC/SortableItemContext.js');
7
28
  require('../../redux/reducers/index.js');
8
29
  var useDispatchRowsActions = require('../../redux/reducers/rowsReducers/useDispatchRowsActions.js');
9
30
 
@@ -83,8 +104,10 @@ const useRowRendererHandlers = ({
83
104
  setSelectedRowId(null);
84
105
  }
85
106
  }, [setSelectedRowId]);
86
- const handleOnFocus = React.useCallback(() => {
87
- setFocusedRowId(row.uid);
107
+ const handleOnFocus = React.useCallback(e => {
108
+ if (e.target && e.target.getAttribute('data-testid') === constants.DATA_TESTID.DATA_TABLE_ROW_CONTENT) {
109
+ setFocusedRowId(row.uid);
110
+ }
88
111
  }, [row.uid, setFocusedRowId]);
89
112
  return {
90
113
  handleItemClick,
@@ -18,22 +18,22 @@ const useRowStyle = row => {
18
18
 
19
19
  const [borderTop, borderBottom, shouldAppendDottedBorder] = React.useMemo(() => {
20
20
  if (row.original.dimsumHeaderValue) {
21
- return ['1px solid transparent', '1px solid transparent', false];
21
+ return ['none', 'none', false];
22
22
  }
23
23
 
24
24
  if (row.isExpanded && row.original.subRows && row.depth === 0) {
25
- return ['1px solid #EBEDF0', '1px solid transparent', true];
25
+ return ['1px solid #EBEDF0', 'none', true];
26
26
  }
27
27
 
28
28
  if (row.depth >= 1) {
29
29
  if (row.realIndex < flattenedData.length - 1 && flattenedData[row.realIndex + 1].depth === 0) {
30
- return ['1px solid transparent', '2px solid #EBEDF0', false];
30
+ return ['none', '2px solid #EBEDF0', false];
31
31
  }
32
32
 
33
- return ['1px solid transparent', '1px solid transparent', true];
33
+ return ['none', 'none', true];
34
34
  }
35
35
 
36
- return ['1px solid transparent', '1px solid #EBEDF0', false];
36
+ return ['none', '1px solid #EBEDF0', false];
37
37
  }, [row, flattenedData]);
38
38
  const rowStyle = React.useMemo(() => ({
39
39
  borderTop,
@@ -7,13 +7,14 @@ var React = require('react');
7
7
  var styled = require('styled-components');
8
8
  var DSButton = require('@elliemae/ds-button');
9
9
  var MoreOptionsVert = require('@elliemae/ds-icons/MoreOptionsVert');
10
+ var hooks = require('@elliemae/ds-utilities/hooks');
10
11
  var constants = require('../../configs/constants.js');
11
12
  require('react-virtual');
12
13
  require('../../configs/useRowFlattenization.js');
13
14
  require('@babel/runtime/helpers/defineProperty');
14
15
  require('@elliemae/ds-icons');
15
16
  require('../../styled.js');
16
- require('react/jsx-runtime');
17
+ var jsxRuntime = require('react/jsx-runtime');
17
18
  require('@elliemae/ds-form/Checkbox');
18
19
  require('@elliemae/ds-form/Radio');
19
20
  require('../../parts/TableContent.js');
@@ -43,24 +44,38 @@ const ToolbarWrapper = /*#__PURE__*/styled__default["default"].div.withConfig({
43
44
  })(["display:flex;align-items:center;height:36px;margin-right:1px;pointer-events:all;&:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,0.13),0 1px 2px 0 rgba(0,0,0,0.2);& > .toolbar-trigger{border:none;}}"]);
44
45
  const ToolbarPosition = /*#__PURE__*/styled__default["default"].div.withConfig({
45
46
  componentId: "sc-1ru2no0-2"
46
- })(["display:flex;justify-content:flex-end;align-items:center;pointer-events:none;background:white;height:", ";margin-top:", ";width:100%;height:100%;&:hover{z-index:1;}"], props => props.rowSize === 'normal' ? '36px' : '28px', props => props.rowSize === 'normal' ? '0' : '0'); // eslint-disable-next-line react/prop-types
47
+ })(["display:flex;justify-content:flex-end;align-items:center;pointer-events:none;background:white;height:28px;margin-top:4px;width:100%;padding-left:4px;&:hover{z-index:1;}:after{content:'';position:absolute;left:0px;top:4px;bottom:4px;width:1px;background-color:", ";z-index:7;}"], props => props.theme.colors.neutral['080']); // eslint-disable-next-line react/prop-types
47
48
 
48
49
  const Toolbar = ({
49
50
  children
50
51
  }) => {
51
52
  const [show, setShow] = React.useState(false);
52
- return /*#__PURE__*/_jsx__default["default"](ToolbarPosition, {}, void 0, /*#__PURE__*/_jsx__default["default"](ToolbarWrapper, {
53
- onMouseEnter: () => setShow(true),
54
- onMouseLeave: () => setShow(false)
55
- }, void 0, show && /*#__PURE__*/_jsx__default["default"](ToolbarBtns, {}, void 0, children), /*#__PURE__*/_jsx__default["default"](DSButton__default["default"], {
56
- buttonType: "text",
57
- className: "toolbar-trigger",
58
- "data-testid": constants.DATA_TESTID.DATA_TABLE_TOOLBAR_TRIGGER,
59
- icon: _MoreOptionsVert || (_MoreOptionsVert = /*#__PURE__*/_jsx__default["default"](MoreOptionsVert__default["default"], {})),
60
- onClick: () => setShow(true),
61
- onKeyDown: e => ['Enter', 'Space'].includes(e.code) && setShow(true),
62
- tabIndex: 0
63
- })));
53
+ const [clicked, setClicked] = React.useState(false);
54
+ const toolbarRef = React.useRef(null);
55
+ const handleOnClickOutside = React.useCallback(() => {
56
+ setShow(false);
57
+ setClicked(false);
58
+ }, []);
59
+ const handleOnClick = React.useCallback(() => {
60
+ setShow(true);
61
+ setClicked(true);
62
+ }, []);
63
+ hooks.useOnClickOutside(toolbarRef, handleOnClickOutside);
64
+ return /*#__PURE__*/jsxRuntime.jsx(ToolbarPosition, {
65
+ ref: toolbarRef,
66
+ children: /*#__PURE__*/_jsx__default["default"](ToolbarWrapper, {
67
+ onMouseEnter: () => setShow(true),
68
+ onMouseLeave: () => setShow(clicked)
69
+ }, void 0, show && /*#__PURE__*/_jsx__default["default"](ToolbarBtns, {}, void 0, children), /*#__PURE__*/_jsx__default["default"](DSButton__default["default"], {
70
+ buttonType: "text",
71
+ className: "toolbar-trigger",
72
+ "data-testid": constants.DATA_TESTID.DATA_TABLE_TOOLBAR_TRIGGER,
73
+ icon: _MoreOptionsVert || (_MoreOptionsVert = /*#__PURE__*/_jsx__default["default"](MoreOptionsVert__default["default"], {})),
74
+ onClick: handleOnClick,
75
+ onKeyDown: e => ['Enter', 'Space'].includes(e.code) && handleOnClick(),
76
+ tabIndex: 0
77
+ }))
78
+ });
64
79
  };
65
80
 
66
81
  exports.Toolbar = Toolbar;
@@ -22,7 +22,7 @@ const addColumnData = (datum, column) => {
22
22
  render: column.Cell || BasicCell,
23
23
  row: datum,
24
24
  ref: /*#__PURE__*/React__default["default"].createRef(),
25
- id: `${datum.uid}/${column.id}`
25
+ id: `${datum.uid}__${column.id}`
26
26
  });
27
27
  };
28
28
 
@@ -9,7 +9,7 @@ var MoreOptionsVert = require('@elliemae/ds-icons/MoreOptionsVert');
9
9
  require('@elliemae/ds-popperjs');
10
10
  require('styled-components');
11
11
  require('../../redux/reducers/index.js');
12
- require('../../configs/constants.js');
12
+ var constants = require('../../configs/constants.js');
13
13
  require('react-virtual');
14
14
  require('../../configs/useRowFlattenization.js');
15
15
  require('@babel/runtime/helpers/defineProperty');
@@ -28,6 +28,7 @@ require('../Row.js');
28
28
  require('../Footer.js');
29
29
  require('@elliemae/ds-icons/GripperVertical');
30
30
  require('../HoC/SortableItemContext.js');
31
+ require('@elliemae/ds-utilities/hooks');
31
32
  require('uid');
32
33
  var FilterTypes = require('../../exported-related/FilterTypes.js');
33
34
  require('../../exported-related/Filters/applyOutOfTheBoxFilters.js');
@@ -119,6 +120,9 @@ const FiltersBar = () => {
119
120
  onClick: removeAllFilters
120
121
  }, ...((filterBarProps === null || filterBarProps === void 0 ? void 0 : filterBarProps.extraOptions) || [])],
121
122
  triggerComponent: /*#__PURE__*/_jsx__default["default"](DSButton__default["default"], {
123
+ containerProps: {
124
+ 'data-testid': constants.DATA_TESTID.DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON
125
+ },
122
126
  buttonType: "text",
123
127
  innerRef: dropdownMenuRef,
124
128
  icon: _VerticalElipsis || (_VerticalElipsis = /*#__PURE__*/_jsx__default["default"](MoreOptionsVert__default["default"], {}))
@@ -27,6 +27,7 @@ const MultiSelectPill = ({
27
27
 
28
28
  if (newFilters[filterIndex].value.length === 0) {
29
29
  if (prevRef !== null && prevRef !== void 0 && prevRef.current) prevRef.current.focus();else nextRef.current.focus();
30
+ newFilters.splice(filterIndex, 1);
30
31
  }
31
32
 
32
33
  onFiltersChange(newFilters);
@@ -34,11 +35,11 @@ const MultiSelectPill = ({
34
35
  return value !== null && value !== void 0 && value.length ? /*#__PURE__*/_jsx__default["default"](dsPills.DSPillGroupV2, {}, void 0, /*#__PURE__*/_jsx__default["default"](dsPills.DSPillV2, {
35
36
  type: "label",
36
37
  label: columnHeader
37
- }), value.map(val => /*#__PURE__*/_jsx__default["default"](dsPills.DSPillV2, {
38
+ }), value.map((val, index) => /*#__PURE__*/_jsx__default["default"](dsPills.DSPillV2, {
38
39
  type: "removable",
39
40
  label: val,
40
41
  onRemove: () => handleOnRemove(val),
41
- innerRef: innerRef
42
+ innerRef: index === value.length - 1 ? innerRef : {}
42
43
  }, val))) : null;
43
44
  };
44
45
 
@@ -34,6 +34,7 @@ require('../Footer.js');
34
34
  require('@elliemae/ds-icons/GripperVertical');
35
35
  require('../HoC/SortableItemContext.js');
36
36
  require('@elliemae/ds-icons/MoreOptionsVert');
37
+ require('@elliemae/ds-utilities/hooks');
37
38
  require('uid');
38
39
  var FilterTypes = require('../../exported-related/FilterTypes.js');
39
40
  require('../../exported-related/Filters/applyOutOfTheBoxFilters.js');
@@ -88,7 +88,8 @@ const HeaderCellComp = props => {
88
88
  onFiltersChange,
89
89
  filters,
90
90
  textWrap
91
- }
91
+ },
92
+ flattenedData
92
93
  } = ctx;
93
94
  const {
94
95
  patchHeader
@@ -162,6 +163,7 @@ const HeaderCellComp = props => {
162
163
  ,
163
164
  "aria-sort": hasSortingCaret ? column.isSortedDesc ? 'descending' : 'ascending' : 'none',
164
165
  "data-testid": constants.DATA_TESTID.DATA_TABLE_HEADER,
166
+ isFirstRowGroup: !!flattenedData[0].original.dimsumHeaderValue,
165
167
  tabIndex: column.isFocuseable === false ? -1 : 0,
166
168
  isDragOverlay: isDragOverlay,
167
169
  isDraggingActive: draggableProps && draggableProps.active,
@@ -28,6 +28,7 @@ require('../Footer.js');
28
28
  require('@elliemae/ds-icons/GripperVertical');
29
29
  require('../HoC/SortableItemContext.js');
30
30
  require('@elliemae/ds-icons/MoreOptionsVert');
31
+ require('@elliemae/ds-utilities/hooks');
31
32
  require('uid');
32
33
  var RowVariants = require('../../exported-related/RowVariants.js');
33
34
  require('../../exported-related/Filters/applyOutOfTheBoxFilters.js');
package/cjs/styled.js CHANGED
@@ -115,9 +115,16 @@ const StyledHeadTr = /*#__PURE__*/styled__default["default"](Grid__default["defa
115
115
  isExpandable: props.isExpandable,
116
116
  colsLayoutStyle: props.colsLayoutStyle
117
117
  }));
118
+
119
+ const getStyledHeadTHBorderColor = props => {
120
+ if (props.dragOverlay) return 'transparent';
121
+ if (props.isFirstRowGroup) return 'transparent';
122
+ return props.theme.colors.neutral['080'];
123
+ };
124
+
118
125
  const StyledHeadTh = /*#__PURE__*/styled__default["default"].div.withConfig({
119
126
  componentId: "sc-38sgfo-7"
120
- })(["min-height:24px;line-height:normal;font-weight:600;text-transform:uppercase;font-size:0.923rem;text-align:left;", " color:#353c46;min-height:1.84615rem;position:relative;position:sticky;top:0;z-index:", ";display:flex;justify-content:space-between;box-sizing:border-box;border-right:1px solid ", ";border-bottom:1px solid ", ";outline:none;:focus{&:after{display:block;content:' ';position:absolute;top:0;left:0;right:-1px;bottom:-1px;border:2px solid ", ";pointer-events:none;z-index:", ";}}", ""], cellPadding.columnPadding, zIndexInternalConfig.ZIndexDataTable.HEADER_ROW, props => props.theme.colors.neutral['080'], props => props.isDragOverlay ? 'transparent' : props.theme.colors.neutral['080'], props => props.theme.colors.brand[700], zIndexInternalConfig.ZIndexDataTable.FOCUS_BORDER, props => props.isDraggingActive ? '' : `:hover {
127
+ })(["min-height:24px;line-height:normal;font-weight:600;text-transform:uppercase;font-size:0.923rem;text-align:left;", " color:#353c46;min-height:1.84615rem;position:relative;position:sticky;top:0;z-index:", ";display:flex;justify-content:space-between;box-sizing:border-box;border-right:1px solid ", ";border-bottom:1px solid ", ";outline:none;:focus{&:after{display:block;content:' ';position:absolute;top:0;left:0;right:-1px;bottom:-1px;border:2px solid ", ";pointer-events:none;z-index:", ";}}", ""], cellPadding.columnPadding, zIndexInternalConfig.ZIndexDataTable.HEADER_ROW, props => props.theme.colors.neutral['080'], getStyledHeadTHBorderColor, props => props.theme.colors.brand[700], zIndexInternalConfig.ZIndexDataTable.FOCUS_BORDER, props => props.isDraggingActive ? '' : `:hover {
121
128
  border-bottom: 1px solid ${props.isDragOverlay ? 'transparent' : props.theme.colors.brand[800]};
122
129
  cursor: pointer;
123
130
  }`);
@@ -152,7 +159,7 @@ const StyledFullsizeGrid = /*#__PURE__*/styled__default["default"](Grid__default
152
159
  })(["position:relative;z-index:", ";min-height:", ";height:", ";"], zIndexInternalConfig.ZIndexDataTable.ROW, props => props.minHeight || '36px', props => props.height || 'auto');
153
160
  const GroupHeaderContainer = /*#__PURE__*/styled__default["default"](Grid__default["default"]).withConfig({
154
161
  componentId: "sc-38sgfo-16"
155
- })(["background-color:", ";align-items:center;padding:0 ", ";border-top:solid 1px ", ";grid-template-columns:min-content 1fr;"], ({
162
+ })(["position:relative;background-color:", ";align-items:center;padding:0 ", ";border-top:1px solid ", ";grid-template-columns:min-content 1fr;"], ({
156
163
  theme
157
164
  }) => theme.colors.brand[200], props => props.padding, ({
158
165
  theme
@@ -9,12 +9,12 @@ const columnPropTypes = {
9
9
  accessor: PropTypes.string.description('The entry of the data that this column will display'),
10
10
  id: PropTypes.string.description('The id of the column, will default to the Header or accessor if not present'),
11
11
  filter: outOfTheBoxFilterType.description('out-of-the-box filters'),
12
- Filter: PropTypes.oneOf([PropTypes.func, PropTypes.element]).description('The custom component to render as a filter'),
13
- Cell: PropTypes.oneOf([PropTypes.func, PropTypes.element]).description('The custom cell renderer component'),
12
+ Filter: PropTypes.oneOfType([PropTypes.func, PropTypes.element]).description('The custom component to render as a filter'),
13
+ Cell: PropTypes.oneOfType([PropTypes.func, PropTypes.element]).description('The custom cell renderer component'),
14
14
  editable: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.element]).description('The editable out-of-the-box or component to render'),
15
15
  disableDnD: PropTypes.bool.description('Whereas this column should be draggable'),
16
16
  canResize: PropTypes.bool.description('Whereas this column should be resizable'),
17
- width: PropTypes.oneOf([PropTypes.string, PropTypes.number]).description('Width of this column'),
17
+ width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).description('Width of this column'),
18
18
  minWidth: PropTypes.number.description('Minimum width of this column, useful when resizing'),
19
19
  maxWidth: PropTypes.number.description('Maximum width of this column, useful when resizing'),
20
20
  canSort: PropTypes.bool.description('Whereas this column is sortable'),
@@ -27,7 +27,7 @@ const columnsPropTypes = PropTypes.shape(columnPropTypes).description('Columns p
27
27
  const rowPropTypes = {
28
28
  row_variant_type: rowVariantType.description('Which row variant to use, will default to primary'),
29
29
  row_variant_compact: PropTypes.bool.description('Whether to use the compact version of the row'),
30
- tableRowDetails: PropTypes.oneOf([PropTypes.func, PropTypes.element]).description('Component for row details'),
30
+ tableRowDetails: PropTypes.oneOfType([PropTypes.func, PropTypes.element]).description('Component for row details'),
31
31
  dimsumHeaderValue: PropTypes.string.description('Header displayed on the header variant of the row')
32
32
  };
33
33
  const rowsPropTypes = PropTypes.shape(rowPropTypes).description('Rows props');
@@ -35,8 +35,8 @@ const DataTableSchema = {
35
35
  columns: PropTypes.arrayOf(columnsPropTypes).description('Array of columns').isRequired,
36
36
  data: PropTypes.arrayOf(rowsPropTypes).description('Array of rows'),
37
37
  height: PropTypes.number.description('Height of the datatable component'),
38
- width: PropTypes.oneOf([PropTypes.string, PropTypes.number]).description('Width of the datatable component'),
39
- renderRowActions: PropTypes.oneOf([PropTypes.object, PropTypes.bool]).description('The renderer to use for the action toolbar'),
38
+ width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).description('Width of the datatable component'),
39
+ renderRowActions: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]).description('The renderer to use for the action toolbar'),
40
40
  isExpandable: PropTypes.bool.description('Whether the datatable is expandable').defaultValue(false),
41
41
  uniqueRowAccessor: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string), PropTypes.func]).description('Column / Combination of columns / Function to call to produce a unique identifier for each row.' + ' This is necessary for the selectable and drag and drop features'),
42
42
  disabledRows: PropTypes.object.description('Object with the identifiers of the rows as keys, and booleans as values. Specifies if a row is disabled or not'),
@@ -55,7 +55,7 @@ const DataTableSchema = {
55
55
  })).description('Array of filter keys and values'),
56
56
  withFilterBar: PropTypes.bool.description('Whether to display the filter bar'),
57
57
  filterBarProps: PropTypes.shape({
58
- customPillRenderer: PropTypes.oneOf([PropTypes.func, PropTypes.element]).description('If you specify custom filters, you will need to render their pills here'),
58
+ customPillRenderer: PropTypes.oneOfType([PropTypes.func, PropTypes.element]).description('If you specify custom filters, you will need to render their pills here'),
59
59
  extraOptions: PropTypes.arrayOf(PropTypes.shape({
60
60
  type: PropTypes.string,
61
61
  id: PropTypes.string,
@@ -64,7 +64,7 @@ const DataTableSchema = {
64
64
  })).description('Any extra option you want in the dropdownmenu of the filter bar')
65
65
  }).description('Props for the filter bar'),
66
66
  onFiltersChange: PropTypes.func.description('Function invoked when filters change'),
67
- pagination: PropTypes.oneOf([PropTypes.bool, PropTypes.shape({
67
+ pagination: PropTypes.oneOfType([PropTypes.bool, PropTypes.shape({
68
68
  pageIndex: PropTypes.number.description('Index of the current page, starting from 1'),
69
69
  canPreviousPage: PropTypes.bool.description('Whether the previous button is disabled or not'),
70
70
  canNextPage: PropTypes.bool.description('Whether the next button is disabled or not'),
@@ -86,7 +86,7 @@ const DataTableSchema = {
86
86
  noResultsMessage: PropTypes.string.description('Message to show when no more data is available'),
87
87
  noResultsSecondaryMessage: PropTypes.string.description('Secondary message to show when no more data is available'),
88
88
  noResultsButtonLabel: PropTypes.string.description('Label of the button when no more data is available'),
89
- noResultsPlaceholder: PropTypes.oneOf([PropTypes.func, PropTypes.element]).description('Custom content to show when dataset is empty'),
89
+ noResultsPlaceholder: PropTypes.oneOfType([PropTypes.func, PropTypes.element]).description('Custom content to show when dataset is empty'),
90
90
  isLoading: PropTypes.bool.description('Whether to show a global loader in the datatable'),
91
91
  isLoadingAppended: PropTypes.bool.description('Whether to show an appended loader in the datatable'),
92
92
  // eslint-disable-next-line max-lines
@@ -26,6 +26,7 @@ import '@elliemae/ds-icons/GripperVertical';
26
26
  import '../../../parts/HoC/SortableItemContext.js';
27
27
  import { EditableCell } from '../../../exported-related/EditableCell.js';
28
28
  import '@elliemae/ds-icons/MoreOptionsVert';
29
+ import '@elliemae/ds-utilities/hooks';
29
30
  import 'uid';
30
31
  import '../../../exported-related/Filters/applyOutOfTheBoxFilters.js';
31
32
  import 'moment';
@@ -25,6 +25,7 @@ import '@elliemae/ds-icons/GripperVertical';
25
25
  import '../../../parts/HoC/SortableItemContext.js';
26
26
  import { EditableCell } from '../../../exported-related/EditableCell.js';
27
27
  import '@elliemae/ds-icons/MoreOptionsVert';
28
+ import '@elliemae/ds-utilities/hooks';
28
29
  import 'uid';
29
30
  import '../../../exported-related/Filters/applyOutOfTheBoxFilters.js';
30
31
  import 'moment';
@@ -25,6 +25,7 @@ import '@elliemae/ds-icons/GripperVertical';
25
25
  import '../../../parts/HoC/SortableItemContext.js';
26
26
  import { EditableCell } from '../../../exported-related/EditableCell.js';
27
27
  import '@elliemae/ds-icons/MoreOptionsVert';
28
+ import '@elliemae/ds-utilities/hooks';
28
29
  import 'uid';
29
30
  import '../../../exported-related/Filters/applyOutOfTheBoxFilters.js';
30
31
  import 'moment';
@@ -10,6 +10,7 @@ import 'react/jsx-runtime';
10
10
  import 'styled-components';
11
11
  import '@elliemae/ds-button';
12
12
  import '@elliemae/ds-icons/MoreOptionsVert';
13
+ import '@elliemae/ds-utilities/hooks';
13
14
  import { DATA_TESTID } from '../../../../configs/constants.js';
14
15
  import 'react-virtual';
15
16
  import '../../../../configs/useRowFlattenization.js';
@@ -55,7 +56,7 @@ const DateRangeFilter = props => {
55
56
  setEndDate(dateRange.endDate || '');
56
57
  }, [dateRange]);
57
58
  useEffect(() => {
58
- if (!startDate.includes('_') && !endDate.includes('_')) {
59
+ if (startDate && endDate && !startDate.includes('_') && !endDate.includes('_')) {
59
60
  onValueChange(FILTER_TYPES.DATE_RANGE, {
60
61
  startDate,
61
62
  endDate
@@ -11,6 +11,7 @@ import 'react/jsx-runtime';
11
11
  import 'styled-components';
12
12
  import '@elliemae/ds-button';
13
13
  import '@elliemae/ds-icons/MoreOptionsVert';
14
+ import '@elliemae/ds-utilities/hooks';
14
15
  import { DATA_TESTID } from '../../../../configs/constants.js';
15
16
  import 'react-virtual';
16
17
  import '../../../../configs/useRowFlattenization.js';
@@ -28,6 +28,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
28
28
  import 'styled-components';
29
29
  import '@elliemae/ds-button';
30
30
  import '@elliemae/ds-icons/MoreOptionsVert';
31
+ import '@elliemae/ds-utilities/hooks';
31
32
  import { DATA_TESTID } from '../../../../configs/constants.js';
32
33
  import '../../../../configs/useRowFlattenization.js';
33
34
  import '@babel/runtime/helpers/esm/defineProperty';
@@ -25,6 +25,7 @@ import '../../../../parts/Footer.js';
25
25
  import '@elliemae/ds-icons/GripperVertical';
26
26
  import '../../../../parts/HoC/SortableItemContext.js';
27
27
  import '@elliemae/ds-icons/MoreOptionsVert';
28
+ import '@elliemae/ds-utilities/hooks';
28
29
  import 'uid';
29
30
  import { FILTER_TYPES } from '../../../../exported-related/FilterTypes.js';
30
31
  import '../../../../exported-related/Filters/applyOutOfTheBoxFilters.js';
@@ -25,6 +25,7 @@ import '../../../../parts/Footer.js';
25
25
  import '@elliemae/ds-icons/GripperVertical';
26
26
  import '../../../../parts/HoC/SortableItemContext.js';
27
27
  import '@elliemae/ds-icons/MoreOptionsVert';
28
+ import '@elliemae/ds-utilities/hooks';
28
29
  import 'uid';
29
30
  import { FILTER_TYPES } from '../../../../exported-related/FilterTypes.js';
30
31
  import '../../../../exported-related/Filters/applyOutOfTheBoxFilters.js';
@@ -10,6 +10,7 @@ import 'react/jsx-runtime';
10
10
  import 'styled-components';
11
11
  import '@elliemae/ds-button';
12
12
  import '@elliemae/ds-icons/MoreOptionsVert';
13
+ import '@elliemae/ds-utilities/hooks';
13
14
  import { DATA_TESTID } from '../../../../configs/constants.js';
14
15
  import 'react-virtual';
15
16
  import '../../../../configs/useRowFlattenization.js';
@@ -8,6 +8,7 @@ import 'react/jsx-runtime';
8
8
  import 'styled-components';
9
9
  import '@elliemae/ds-button';
10
10
  import '@elliemae/ds-icons/MoreOptionsVert';
11
+ import '@elliemae/ds-utilities/hooks';
11
12
  import '../../../../configs/constants.js';
12
13
  import 'react-virtual';
13
14
  import '../../../../configs/useRowFlattenization.js';
@@ -39,7 +39,8 @@ const DATA_TESTID = {
39
39
  DATA_TABLE_ROW_HEADER_CONTENT: 'data-table-row-header-content',
40
40
  DATA_TABLE_ROW_GROUP_HEADER: 'data-table-row-group-header',
41
41
  DATA_TABLE_COLUMN_DRAG_OVERLAY: 'data-table-drag-column-drag-overlay',
42
- DATA_TABLE_HEADER_CELL_TITLE: 'header-cell-title'
42
+ DATA_TABLE_HEADER_CELL_TITLE: 'header-cell-title',
43
+ DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON: 'filter-bar-ddmenu-button'
43
44
  };
44
45
 
45
46
  export { ColsLayoutStyle, DATA_TESTID, momentFormat };
@@ -52,13 +52,14 @@ const EditableCell = props => {
52
52
  onKeyDown: handleOnKeyDown,
53
53
  onBlur: handleOnBlur,
54
54
  shouldDisplayEditIcon: cell.column.alwaysDisplayEditIcon,
55
+ role: "cell",
55
56
  "aria-describedby": isEditing ? undefined : cell.id,
56
57
  children: [!isEditing ? StandardRender : EditableRenderer, !isEditing && (_StyledPencilIcon || (_StyledPencilIcon = /*#__PURE__*/_jsx(StyledPencilIcon, {}))), /*#__PURE__*/_jsx("span", {
57
58
  id: cell.id,
58
59
  style: {
59
60
  display: 'none'
60
61
  },
61
- "aria-hidden": "false"
62
+ "aria-hidden": "true"
62
63
  }, void 0, "Editable cell. To edit the content's of this cell, press the Enter key")]
63
64
  });
64
65
  };
@@ -112,10 +112,14 @@ const FilterPopover = ({
112
112
  closeContextMenu: handleClickOutsideMenu,
113
113
  "data-testid": DATA_TESTID.DATA_TABLE_FILTER_MENU_CONTENT,
114
114
  startPlacementPreference: "bottom-end",
115
- customOffset: [4, 4],
115
+ customOffset: [5, 4],
116
116
  withoutArrow: true,
117
117
  withoutPortal: true,
118
- zIndex: 10
118
+ zIndex: 10,
119
+ extraPopperStyles: {
120
+ minWidth: '100%'
121
+ },
122
+ placementOrderPreference: ['bottom-end']
119
123
  }, void 0, /*#__PURE__*/_jsx("div", {
120
124
  style: {
121
125
  backgroundColor: '#fff'
@@ -1,5 +1,26 @@
1
1
  import { useContext, useCallback } from 'react';
2
+ import { DATA_TESTID } from '../../configs/constants.js';
3
+ import 'react-virtual';
4
+ import '../../configs/useRowFlattenization.js';
5
+ import '@babel/runtime/helpers/esm/defineProperty';
6
+ import '@babel/runtime/helpers/esm/jsx';
7
+ import '@elliemae/ds-icons';
8
+ import 'styled-components';
9
+ import '../../styled.js';
10
+ import 'react/jsx-runtime';
11
+ import '@elliemae/ds-form/Checkbox';
12
+ import '@elliemae/ds-form/Radio';
13
+ import '../../parts/TableContent.js';
14
+ import '@elliemae/ds-grid';
15
+ import '@elliemae/ds-circular-progress-indicator';
16
+ import '@elliemae/ds-icons/WarningTriangle';
17
+ import '@elliemae/ds-system';
18
+ import '@elliemae/ds-button';
2
19
  import DataTableContext from '../../DataTableContext.js';
20
+ import '../../parts/Row.js';
21
+ import '../../parts/Footer.js';
22
+ import '@elliemae/ds-icons/GripperVertical';
23
+ import '../../parts/HoC/SortableItemContext.js';
3
24
  import '../../redux/reducers/index.js';
4
25
  import { useDispatchRowsActions } from '../../redux/reducers/rowsReducers/useDispatchRowsActions.js';
5
26
 
@@ -79,8 +100,10 @@ const useRowRendererHandlers = ({
79
100
  setSelectedRowId(null);
80
101
  }
81
102
  }, [setSelectedRowId]);
82
- const handleOnFocus = useCallback(() => {
83
- setFocusedRowId(row.uid);
103
+ const handleOnFocus = useCallback(e => {
104
+ if (e.target && e.target.getAttribute('data-testid') === DATA_TESTID.DATA_TABLE_ROW_CONTENT) {
105
+ setFocusedRowId(row.uid);
106
+ }
84
107
  }, [row.uid, setFocusedRowId]);
85
108
  return {
86
109
  handleItemClick,
@@ -14,22 +14,22 @@ const useRowStyle = row => {
14
14
 
15
15
  const [borderTop, borderBottom, shouldAppendDottedBorder] = useMemo(() => {
16
16
  if (row.original.dimsumHeaderValue) {
17
- return ['1px solid transparent', '1px solid transparent', false];
17
+ return ['none', 'none', false];
18
18
  }
19
19
 
20
20
  if (row.isExpanded && row.original.subRows && row.depth === 0) {
21
- return ['1px solid #EBEDF0', '1px solid transparent', true];
21
+ return ['1px solid #EBEDF0', 'none', true];
22
22
  }
23
23
 
24
24
  if (row.depth >= 1) {
25
25
  if (row.realIndex < flattenedData.length - 1 && flattenedData[row.realIndex + 1].depth === 0) {
26
- return ['1px solid transparent', '2px solid #EBEDF0', false];
26
+ return ['none', '2px solid #EBEDF0', false];
27
27
  }
28
28
 
29
- return ['1px solid transparent', '1px solid transparent', true];
29
+ return ['none', 'none', true];
30
30
  }
31
31
 
32
- return ['1px solid transparent', '1px solid #EBEDF0', false];
32
+ return ['none', '1px solid #EBEDF0', false];
33
33
  }, [row, flattenedData]);
34
34
  const rowStyle = useMemo(() => ({
35
35
  borderTop,
@@ -1,15 +1,16 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
- import { useState } from 'react';
2
+ import { useState, useRef, useCallback } from 'react';
3
3
  import styled from 'styled-components';
4
4
  import DSButton from '@elliemae/ds-button';
5
5
  import MoreOptionsVert from '@elliemae/ds-icons/MoreOptionsVert';
6
+ import { useOnClickOutside } from '@elliemae/ds-utilities/hooks';
6
7
  import { DATA_TESTID } from '../../configs/constants.js';
7
8
  import 'react-virtual';
8
9
  import '../../configs/useRowFlattenization.js';
9
10
  import '@babel/runtime/helpers/esm/defineProperty';
10
11
  import '@elliemae/ds-icons';
11
12
  import '../../styled.js';
12
- import 'react/jsx-runtime';
13
+ import { jsx } from 'react/jsx-runtime';
13
14
  import '@elliemae/ds-form/Checkbox';
14
15
  import '@elliemae/ds-form/Radio';
15
16
  import '../../parts/TableContent.js';
@@ -32,24 +33,38 @@ const ToolbarWrapper = /*#__PURE__*/styled.div.withConfig({
32
33
  })(["display:flex;align-items:center;height:36px;margin-right:1px;pointer-events:all;&:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,0.13),0 1px 2px 0 rgba(0,0,0,0.2);& > .toolbar-trigger{border:none;}}"]);
33
34
  const ToolbarPosition = /*#__PURE__*/styled.div.withConfig({
34
35
  componentId: "sc-1ru2no0-2"
35
- })(["display:flex;justify-content:flex-end;align-items:center;pointer-events:none;background:white;height:", ";margin-top:", ";width:100%;height:100%;&:hover{z-index:1;}"], props => props.rowSize === 'normal' ? '36px' : '28px', props => props.rowSize === 'normal' ? '0' : '0'); // eslint-disable-next-line react/prop-types
36
+ })(["display:flex;justify-content:flex-end;align-items:center;pointer-events:none;background:white;height:28px;margin-top:4px;width:100%;padding-left:4px;&:hover{z-index:1;}:after{content:'';position:absolute;left:0px;top:4px;bottom:4px;width:1px;background-color:", ";z-index:7;}"], props => props.theme.colors.neutral['080']); // eslint-disable-next-line react/prop-types
36
37
 
37
38
  const Toolbar = ({
38
39
  children
39
40
  }) => {
40
41
  const [show, setShow] = useState(false);
41
- return /*#__PURE__*/_jsx(ToolbarPosition, {}, void 0, /*#__PURE__*/_jsx(ToolbarWrapper, {
42
- onMouseEnter: () => setShow(true),
43
- onMouseLeave: () => setShow(false)
44
- }, void 0, show && /*#__PURE__*/_jsx(ToolbarBtns, {}, void 0, children), /*#__PURE__*/_jsx(DSButton, {
45
- buttonType: "text",
46
- className: "toolbar-trigger",
47
- "data-testid": DATA_TESTID.DATA_TABLE_TOOLBAR_TRIGGER,
48
- icon: _MoreOptionsVert || (_MoreOptionsVert = /*#__PURE__*/_jsx(MoreOptionsVert, {})),
49
- onClick: () => setShow(true),
50
- onKeyDown: e => ['Enter', 'Space'].includes(e.code) && setShow(true),
51
- tabIndex: 0
52
- })));
42
+ const [clicked, setClicked] = useState(false);
43
+ const toolbarRef = useRef(null);
44
+ const handleOnClickOutside = useCallback(() => {
45
+ setShow(false);
46
+ setClicked(false);
47
+ }, []);
48
+ const handleOnClick = useCallback(() => {
49
+ setShow(true);
50
+ setClicked(true);
51
+ }, []);
52
+ useOnClickOutside(toolbarRef, handleOnClickOutside);
53
+ return /*#__PURE__*/jsx(ToolbarPosition, {
54
+ ref: toolbarRef,
55
+ children: /*#__PURE__*/_jsx(ToolbarWrapper, {
56
+ onMouseEnter: () => setShow(true),
57
+ onMouseLeave: () => setShow(clicked)
58
+ }, void 0, show && /*#__PURE__*/_jsx(ToolbarBtns, {}, void 0, children), /*#__PURE__*/_jsx(DSButton, {
59
+ buttonType: "text",
60
+ className: "toolbar-trigger",
61
+ "data-testid": DATA_TESTID.DATA_TABLE_TOOLBAR_TRIGGER,
62
+ icon: _MoreOptionsVert || (_MoreOptionsVert = /*#__PURE__*/_jsx(MoreOptionsVert, {})),
63
+ onClick: handleOnClick,
64
+ onKeyDown: e => ['Enter', 'Space'].includes(e.code) && handleOnClick(),
65
+ tabIndex: 0
66
+ }))
67
+ });
53
68
  };
54
69
 
55
70
  export { Toolbar };
@@ -14,7 +14,7 @@ const addColumnData = (datum, column) => {
14
14
  render: column.Cell || BasicCell,
15
15
  row: datum,
16
16
  ref: /*#__PURE__*/React.createRef(),
17
- id: `${datum.uid}/${column.id}`
17
+ id: `${datum.uid}__${column.id}`
18
18
  });
19
19
  };
20
20
 
@@ -5,7 +5,7 @@ import MoreOptionsVert from '@elliemae/ds-icons/MoreOptionsVert';
5
5
  import '@elliemae/ds-popperjs';
6
6
  import 'styled-components';
7
7
  import '../../redux/reducers/index.js';
8
- import '../../configs/constants.js';
8
+ import { DATA_TESTID } from '../../configs/constants.js';
9
9
  import 'react-virtual';
10
10
  import '../../configs/useRowFlattenization.js';
11
11
  import '@babel/runtime/helpers/esm/defineProperty';
@@ -24,6 +24,7 @@ import '../Row.js';
24
24
  import '../Footer.js';
25
25
  import '@elliemae/ds-icons/GripperVertical';
26
26
  import '../HoC/SortableItemContext.js';
27
+ import '@elliemae/ds-utilities/hooks';
27
28
  import 'uid';
28
29
  import { FILTER_TYPES } from '../../exported-related/FilterTypes.js';
29
30
  import '../../exported-related/Filters/applyOutOfTheBoxFilters.js';
@@ -108,6 +109,9 @@ const FiltersBar = () => {
108
109
  onClick: removeAllFilters
109
110
  }, ...((filterBarProps === null || filterBarProps === void 0 ? void 0 : filterBarProps.extraOptions) || [])],
110
111
  triggerComponent: /*#__PURE__*/_jsx(DSButton, {
112
+ containerProps: {
113
+ 'data-testid': DATA_TESTID.DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON
114
+ },
111
115
  buttonType: "text",
112
116
  innerRef: dropdownMenuRef,
113
117
  icon: _VerticalElipsis || (_VerticalElipsis = /*#__PURE__*/_jsx(MoreOptionsVert, {}))
@@ -19,6 +19,7 @@ const MultiSelectPill = ({
19
19
 
20
20
  if (newFilters[filterIndex].value.length === 0) {
21
21
  if (prevRef !== null && prevRef !== void 0 && prevRef.current) prevRef.current.focus();else nextRef.current.focus();
22
+ newFilters.splice(filterIndex, 1);
22
23
  }
23
24
 
24
25
  onFiltersChange(newFilters);
@@ -26,11 +27,11 @@ const MultiSelectPill = ({
26
27
  return value !== null && value !== void 0 && value.length ? /*#__PURE__*/_jsx(DSPillGroupV2, {}, void 0, /*#__PURE__*/_jsx(DSPillV2, {
27
28
  type: "label",
28
29
  label: columnHeader
29
- }), value.map(val => /*#__PURE__*/_jsx(DSPillV2, {
30
+ }), value.map((val, index) => /*#__PURE__*/_jsx(DSPillV2, {
30
31
  type: "removable",
31
32
  label: val,
32
33
  onRemove: () => handleOnRemove(val),
33
- innerRef: innerRef
34
+ innerRef: index === value.length - 1 ? innerRef : {}
34
35
  }, val))) : null;
35
36
  };
36
37
 
@@ -30,6 +30,7 @@ import '../Footer.js';
30
30
  import '@elliemae/ds-icons/GripperVertical';
31
31
  import '../HoC/SortableItemContext.js';
32
32
  import '@elliemae/ds-icons/MoreOptionsVert';
33
+ import '@elliemae/ds-utilities/hooks';
33
34
  import 'uid';
34
35
  import { FILTER_TYPES } from '../../exported-related/FilterTypes.js';
35
36
  import '../../exported-related/Filters/applyOutOfTheBoxFilters.js';
@@ -78,7 +78,8 @@ const HeaderCellComp = props => {
78
78
  onFiltersChange,
79
79
  filters,
80
80
  textWrap
81
- }
81
+ },
82
+ flattenedData
82
83
  } = ctx;
83
84
  const {
84
85
  patchHeader
@@ -152,6 +153,7 @@ const HeaderCellComp = props => {
152
153
  ,
153
154
  "aria-sort": hasSortingCaret ? column.isSortedDesc ? 'descending' : 'ascending' : 'none',
154
155
  "data-testid": DATA_TESTID.DATA_TABLE_HEADER,
156
+ isFirstRowGroup: !!flattenedData[0].original.dimsumHeaderValue,
155
157
  tabIndex: column.isFocuseable === false ? -1 : 0,
156
158
  isDragOverlay: isDragOverlay,
157
159
  isDraggingActive: draggableProps && draggableProps.active,
@@ -24,6 +24,7 @@ import '../Footer.js';
24
24
  import '@elliemae/ds-icons/GripperVertical';
25
25
  import '../HoC/SortableItemContext.js';
26
26
  import '@elliemae/ds-icons/MoreOptionsVert';
27
+ import '@elliemae/ds-utilities/hooks';
27
28
  import 'uid';
28
29
  import { ROW_VARIANTS } from '../../exported-related/RowVariants.js';
29
30
  import '../../exported-related/Filters/applyOutOfTheBoxFilters.js';
package/esm/styled.js CHANGED
@@ -105,9 +105,16 @@ const StyledHeadTr = /*#__PURE__*/styled(Grid).withConfig({
105
105
  isExpandable: props.isExpandable,
106
106
  colsLayoutStyle: props.colsLayoutStyle
107
107
  }));
108
+
109
+ const getStyledHeadTHBorderColor = props => {
110
+ if (props.dragOverlay) return 'transparent';
111
+ if (props.isFirstRowGroup) return 'transparent';
112
+ return props.theme.colors.neutral['080'];
113
+ };
114
+
108
115
  const StyledHeadTh = /*#__PURE__*/styled.div.withConfig({
109
116
  componentId: "sc-38sgfo-7"
110
- })(["min-height:24px;line-height:normal;font-weight:600;text-transform:uppercase;font-size:0.923rem;text-align:left;", " color:#353c46;min-height:1.84615rem;position:relative;position:sticky;top:0;z-index:", ";display:flex;justify-content:space-between;box-sizing:border-box;border-right:1px solid ", ";border-bottom:1px solid ", ";outline:none;:focus{&:after{display:block;content:' ';position:absolute;top:0;left:0;right:-1px;bottom:-1px;border:2px solid ", ";pointer-events:none;z-index:", ";}}", ""], columnPadding, ZIndexDataTable.HEADER_ROW, props => props.theme.colors.neutral['080'], props => props.isDragOverlay ? 'transparent' : props.theme.colors.neutral['080'], props => props.theme.colors.brand[700], ZIndexDataTable.FOCUS_BORDER, props => props.isDraggingActive ? '' : `:hover {
117
+ })(["min-height:24px;line-height:normal;font-weight:600;text-transform:uppercase;font-size:0.923rem;text-align:left;", " color:#353c46;min-height:1.84615rem;position:relative;position:sticky;top:0;z-index:", ";display:flex;justify-content:space-between;box-sizing:border-box;border-right:1px solid ", ";border-bottom:1px solid ", ";outline:none;:focus{&:after{display:block;content:' ';position:absolute;top:0;left:0;right:-1px;bottom:-1px;border:2px solid ", ";pointer-events:none;z-index:", ";}}", ""], columnPadding, ZIndexDataTable.HEADER_ROW, props => props.theme.colors.neutral['080'], getStyledHeadTHBorderColor, props => props.theme.colors.brand[700], ZIndexDataTable.FOCUS_BORDER, props => props.isDraggingActive ? '' : `:hover {
111
118
  border-bottom: 1px solid ${props.isDragOverlay ? 'transparent' : props.theme.colors.brand[800]};
112
119
  cursor: pointer;
113
120
  }`);
@@ -142,7 +149,7 @@ const StyledFullsizeGrid = /*#__PURE__*/styled(Grid).withConfig({
142
149
  })(["position:relative;z-index:", ";min-height:", ";height:", ";"], ZIndexDataTable.ROW, props => props.minHeight || '36px', props => props.height || 'auto');
143
150
  const GroupHeaderContainer = /*#__PURE__*/styled(Grid).withConfig({
144
151
  componentId: "sc-38sgfo-16"
145
- })(["background-color:", ";align-items:center;padding:0 ", ";border-top:solid 1px ", ";grid-template-columns:min-content 1fr;"], ({
152
+ })(["position:relative;background-color:", ";align-items:center;padding:0 ", ";border-top:1px solid ", ";grid-template-columns:min-content 1fr;"], ({
146
153
  theme
147
154
  }) => theme.colors.brand[200], props => props.padding, ({
148
155
  theme
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elliemae/ds-data-table",
3
- "version": "2.0.0-alpha.6",
3
+ "version": "2.0.0-next.0",
4
4
  "license": "MIT",
5
5
  "description": "ICE MT - Dimsum - Data Table",
6
6
  "module": "./esm/index.js",
@@ -642,9 +642,9 @@
642
642
  "dependencies": {
643
643
  "@dnd-kit/core": "^3.0.4",
644
644
  "@dnd-kit/sortable": "^3.0.1",
645
- "@elliemae/ds-basic": "2.0.0-alpha.6",
646
- "@elliemae/ds-date-picker": "2.0.0-alpha.6",
647
- "@elliemae/ds-date-range-picker": "2.0.0-alpha.6",
645
+ "@elliemae/ds-basic": "2.0.0-next.0",
646
+ "@elliemae/ds-date-picker": "2.0.0-next.0",
647
+ "@elliemae/ds-date-range-picker": "2.0.0-next.0",
648
648
  "@popperjs/core": "^2.9.3",
649
649
  "@reduxjs/toolkit": "^1.5.1",
650
650
  "array-move": "^3.0.1",
@@ -37,4 +37,5 @@ export declare const DATA_TESTID: {
37
37
  DATA_TABLE_ROW_GROUP_HEADER: string;
38
38
  DATA_TABLE_COLUMN_DRAG_OVERLAY: string;
39
39
  DATA_TABLE_HEADER_CELL_TITLE: string;
40
+ DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON: string;
40
41
  };
@@ -1,4 +1,2 @@
1
- /// <reference types="react" />
2
- export declare const Toolbar: ({ children }: {
3
- children: any;
4
- }) => JSX.Element;
1
+ import React from 'react';
2
+ export declare const Toolbar: React.ComponentType;