UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

964 lines (906 loc) 39.2 kB
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /* eslint-disable max-lines */ import React from 'react'; import ReactDOM from 'react-dom'; import TestUtils from 'react-dom/test-utils'; import chai, { expect } from 'chai'; import { keyObjects } from '../../../utilities/key-code'; import Dropdown from '../../menu-dropdown'; import DataTable from '../../data-table'; import DataTableColumn from '../../data-table/column'; import DataTableRowActions from '../../data-table/row-actions'; import DataTableHighlightCell from '../../data-table/highlight-cell'; import IconSettings from '../../icon-settings'; import { mountComponent, unmountComponent } from '../../../tests/enzyme-helpers'; chai.should(); var Simulate = TestUtils.Simulate; describe('DataTable: ', function describeFunction() { var items = [{ id: '8IKZHZZV80', name: 'Cloudhub', count: 100976, lastModified: 'Yesterday' }, { id: '5GJOOOPWU7', name: 'Cloudhub + Anypoint Connectors', count: 54976, lastModified: 'Today' }, { id: 'Q8Z71ZUCEZ', name: 'Cloud City', count: 101280, lastModified: 'Today' }, { id: '2FSH2DP0LY', name: 'IoT', count: 976, lastModified: 'Yesterday' }, { id: '8NE888QKV1', name: 'IoT + Anypoint Connectors', count: 54976, lastModified: 'Today' }, { id: 'M4D37GW83H', name: 'Salesforce Tower', count: 101280, lastModified: 'Today' }]; var itemsWithHeaderRows = [{ id: 'K6R34GW73J', type: 'header-row', name: 'Address', count: 101210, lastModified: 'Today' }].concat(items, [{ id: 'KA78KJAY76', type: 'header-row', name: 'Company', count: 101318, lastModified: 'Today' }]); var columns = [{ label: 'Name', property: 'name', truncate: true }, { label: 'Count', property: 'count', sortable: true }]; var defaultProps = { id: 'DataTableExample-default', items: items, selectRows: true }; var defaultPropsWithHeaderRows = _objectSpread(_objectSpread({}, defaultProps), {}, { items: itemsWithHeaderRows }); var renderTable = function renderTable(instance) { return function renderTableFunction() { this.dom = document.createElement('div'); document.body.appendChild(this.dom); /* deepscan-disable REACT_ASYNC_RENDER_RETURN_VALUE */ // eslint-disable-next-line react/no-render-return-value this.component = ReactDOM.render( /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(IconSettings, { iconPath: "/assets/icons" }, instance)), this.dom); /* deepscan-enable REACT_ASYNC_RENDER_RETURN_VALUE */ }; }; function removeTable() { ReactDOM.unmountComponentAtNode(this.dom); document.body.removeChild(this.dom); } var getTable = function getTable(dom) { return dom.querySelector('.slds-table'); }; var getRow = function getRow(dom, row) { var tbody = getTable(dom).querySelectorAll('tbody')[0]; return tbody.querySelectorAll('tr')[row - 1]; }; var getCell = function getCell(dom, row, column) { var tr = getRow(dom, row); return tr.querySelectorAll('td')[column]; }; var getMenu = function getMenu(dom) { return dom.querySelector('.slds-dropdown'); }; describe('Structure', function describeFunction2() { beforeEach(renderTable( /*#__PURE__*/React.createElement(DataTable, defaultProps, columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); })))); afterEach(removeTable); it('has a header', function () { var thead = getTable(this.dom).querySelectorAll('thead'); thead.should.have.length(1); thead[0].querySelectorAll('th').should.have.length(3); }); it('has a row for each item', function () { var tbody = getTable(this.dom).querySelectorAll('tbody'); tbody.should.have.length(1); tbody[0].querySelectorAll('tr').should.have.length(6); }); it('renders the correct contents in each cell', function () { var firstName = getCell(this.dom, 1, 1); firstName.innerHTML.should.equal('<div class="" title="Cloudhub">Cloudhub</div>'); var secondCount = getCell(this.dom, 2, 2); secondCount.innerHTML.should.equal('<div class="" title="54976">54976</div>'); }); it('has checkboxes when selectRows is true or "checkbox"', function () { var checkboxes = getTable(this.dom).querySelectorAll('.slds-checkbox'); checkboxes.should.have.length(7); removeTable.call(this); renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selectRows: false }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); checkboxes = getTable(this.dom).querySelectorAll('.slds-checkbox'); checkboxes.should.have.length(0); removeTable.call(this); renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selectRows: "checkbox" }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); checkboxes = getTable(this.dom).querySelectorAll('.slds-checkbox'); checkboxes.should.have.length(7); }); it('has radios only when selectRows is "radio"', function () { var checkboxes = getTable(this.dom).querySelectorAll('.slds-checkbox'); checkboxes.should.have.length(7); removeTable.call(this); renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selectRows: "radio" }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var radios = getTable(this.dom).querySelectorAll('.slds-radio'); radios.should.have.length(6); }); }); describe('Selectable - Checkbox', function describeFunction2() { var defaultSelection = [{ id: '8IKZHZZV80', name: 'Cloudhub', count: 100976, lastModified: 'Yesterday' }]; afterEach(removeTable); it('can start with a row selected', function () { renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: defaultSelection }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var tbody = getTable(this.dom).querySelectorAll('tbody')[0]; var selectedRows = tbody.querySelectorAll('tr.slds-is-selected'); selectedRows.should.have.length(1); var checkedBoxes = tbody.querySelectorAll('.slds-checkbox input:checked'); checkedBoxes.should.have.length(1); }); it('can start with a row disabled', function () { var onChangeHandler = sinon.spy(); renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: [], disabledSelection: defaultSelection, onRowChange: onChangeHandler }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var tbody = getTable(this.dom).querySelectorAll('tbody')[0]; var disabledRows = tbody.querySelectorAll('.slds-checkbox input:disabled'); disabledRows.should.have.length(1); var checkbox = disabledRows[0]; Simulate.change(checkbox, { target: { checked: true } }); expect(onChangeHandler.callCount).to.equal(0); }); it('can deselect a row', function (done) { this.onRowChange = function (event, _ref) { var selection = _ref.selection; selection.should.have.length(0); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: defaultSelection, onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var tbody = getTable(this.dom).querySelectorAll('tbody')[0]; var selectedRow = tbody.querySelectorAll('tr.slds-is-selected')[0]; var checkbox = selectedRow.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkbox, { target: { checked: false } }); }); it('can select a row', function (done) { this.onRowChange = function (event, _ref2) { var selection = _ref2.selection; selection.should.have.length(2); selection[1].id.should.equal('5GJOOOPWU7'); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: defaultSelection, onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var secondRow = getRow(this.dom, 2); var checkbox = secondRow.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkbox, { target: { checked: true } }); }); it('can select all rows', function (done) { this.onRowChange = function (event, _ref3) { var selection = _ref3.selection; selection.should.have.length(6); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var checkAll = thead.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkAll, { target: { checked: true } }); }); it('can select all rows excluding disabled rows', function (done) { this.onRowChange = function (event, _ref4) { var selection = _ref4.selection; selection.should.have.length(5); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: [items[0]], disabledSelection: [items[0], items[1]], onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var checkAll = thead.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkAll, { target: { checked: true } }); }); it('can deselect all rows', function (done) { this.onRowChange = function (event, _ref5) { var selection = _ref5.selection; selection.should.have.length(0); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: items, onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var checkAll = thead.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkAll, { target: { checked: false } }); }); it('can deselect all rows excluding disabled rows', function (done) { this.onRowChange = function (event, _ref6) { var selection = _ref6.selection; selection.should.have.length(2); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: items, disabledSelection: [items[0], items[1]], onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var checkAll = thead.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkAll, { target: { checked: false } }); }); it('can select all rows with header-rows present', function (done) { this.onRowChange = function (event, _ref7) { var selection = _ref7.selection; selection.should.have.length(6); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultPropsWithHeaderRows, { onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var checkAll = thead.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkAll, { target: { checked: true } }); }); it('can deselect all rows with header-rows present', function (done) { this.onRowChange = function (event, _ref8) { var selection = _ref8.selection; selection.should.have.length(0); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultPropsWithHeaderRows, { selection: items, onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var checkAll = thead.querySelectorAll('.slds-checkbox input')[0]; Simulate.change(checkAll, { target: { checked: false } }); }); }); describe('Selectable - Radio', function describeFunction2() { var defaultSelection = [{ id: '8IKZHZZV80', name: 'Cloudhub', count: 100976, lastModified: 'Yesterday' }]; afterEach(removeTable); it('can start with a row selected', function () { renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: defaultSelection, selectRows: "radio" }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var tbody = getTable(this.dom).querySelectorAll('tbody')[0]; var selectedRows = tbody.querySelectorAll('tr.slds-is-selected'); selectedRows.should.have.length(1); var radios = tbody.querySelectorAll('.slds-radio input:checked'); radios.should.have.length(1); }); it('can start with a row disabled', function () { var onChangeHandler = sinon.spy(); renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: [], disabledSelection: defaultSelection, onRowChange: onChangeHandler, selectRows: "radio" }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var tbody = getTable(this.dom).querySelectorAll('tbody')[0]; var radios = tbody.querySelectorAll('.slds-radio input:disabled'); radios.should.have.length(1); Simulate.change(radios[0], { target: { checked: true } }); expect(onChangeHandler.callCount).to.equal(0); }); it('can select a row', function (done) { this.onRowChange = function (event, _ref9) { var selection = _ref9.selection; selection.should.have.length(1); selection[0].id.should.equal('5GJOOOPWU7'); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { selection: defaultSelection, selectRows: "radio", onRowChange: this.onRowChange }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var secondRow = getRow(this.dom, 2); var radio = secondRow.querySelectorAll('.slds-radio input')[0]; Simulate.change(radio, { target: { checked: true } }); }); }); describe('Sortable', function describeFunction2() { afterEach(removeTable); it('first clicked on sortable column header should result in ascending sort by default', function (done) { this.onSort = function (data) { data.property.should.equal('count'); data.sortDirection.should.equal('asc'); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedLayout: true, onSort: this.onSort }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var sortButton = thead.querySelectorAll('a')[0]; Simulate.click(sortButton, {}); }); it('if isDefaultSortDescending is true, first click on sortable column header should result in descending order', function (done) { this.onSort = function (data) { data.property.should.equal('count'); data.sortDirection.should.equal('desc'); done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedLayout: true, onSort: this.onSort }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { isDefaultSortDescending: true, key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var sortButton = thead.querySelectorAll('a')[0]; Simulate.click(sortButton, {}); }); it('does not call onSort when a non-sortable column is clicked', function (done) { this.onSort = function () { done('sort called'); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { onSort: this.onSort }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var thead = getTable(this.dom).querySelectorAll('thead')[0]; var secondColumn = thead.querySelectorAll('th')[1]; Simulate.click(secondColumn, {}); setTimeout(done, 0); }); }); describe('w/ RowActions', function describeFunction2() { afterEach(removeTable); it('renders the RowActions and uses dropdown override property', function () { renderTable( /*#__PURE__*/React.createElement(DataTable, defaultProps, columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }), /*#__PURE__*/React.createElement(DataTableRowActions, { dropdown: /*#__PURE__*/React.createElement(Dropdown, { options: [{ id: 0, label: 'Add to Group', value: '1' }, { id: 1, label: 'Publish', value: '2' }] }) }))).call(this); var rowActionMenus = _toConsumableArray(this.component.getElementsByTagName('button')).filter(function (button) { return button.textContent === 'Actions'; }); rowActionMenus.should.have.length(6); }); it('calls onAction & onSelect when an action is clicked', function (done) { var expectedCalbacks = 2; this.onAction = function (item, action) { item.id.should.equal('8IKZHZZV80'); action.value.should.equal('1'); // eslint-disable-next-line no-plusplus if (! --expectedCalbacks) done(); }; this.onSelect = function (action) { action.value.should.equal('1'); // eslint-disable-next-line no-plusplus if (! --expectedCalbacks) done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, defaultProps, columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }), /*#__PURE__*/React.createElement(DataTableRowActions, { onAction: this.onAction, options: [{ id: 0, label: 'Add to Group', value: '1' }, { id: 1, label: 'Publish', value: '2' }], dropdown: /*#__PURE__*/React.createElement(Dropdown, { onSelect: this.onSelect }) }))).call(this); var trigger = _toConsumableArray(this.component.getElementsByTagName('button')).filter(function (button) { return button.textContent === 'Actions'; })[0]; Simulate.click(trigger, {}); setTimeout(function () { var menu = getMenu(document.body); var firstAction = menu.querySelectorAll('.slds-dropdown__item')[0]; Simulate.click(firstAction.querySelector('a'), {}); }, 0); }); }); describe('w/ HighlightCell', function describeFunction2() { afterEach(removeTable); it('marks the appropriate text in a cell', function () { renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { search: "Cloud" }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property }), /*#__PURE__*/React.createElement(DataTableHighlightCell, null)); }))).call(this); var secondRow = getRow(this.dom, 2); var markedText = secondRow.querySelectorAll('mark')[0]; markedText.innerHTML.should.equal('Cloud'); }); }); describe('w/ Fixed Headers', function describeFunction2() { afterEach(removeTable); it('Renders a fixedHeader table as expected', function () { renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedHeader: true, fixedLayout: true, id: "DataTable-FixedHeader-Test", onFixedHeaderResize: function onFixedHeaderResize(event, data) { expect(Array.isArray(data.headerRefs)).to.eql(true); expect(data.headerRefs.length).to.eql(4); data.headerRefs.forEach(function (ref) { expect(_typeof(ref)).to.eql('object'); }); expect(_typeof(data.scrollerRef)).to.eql('object'); expect(data.scrollerRef.className.search('slds-table_header-fixed_scroller') >= 0).to.eql(true); }, onToggleFixedHeaderListeners: function onToggleFixedHeaderListeners(event, data) { expect(_typeof(data.attach)).to.eql('boolean'); expect(_typeof(data.resizeHandler)).to.eql('function'); expect(_typeof(data.scrollerRef)).to.eql('object'); expect(data.scrollerRef.className.search('slds-table_header-fixed_scroller') >= 0).to.eql(true); }, selectRows: "checkbox" }), /*#__PURE__*/React.createElement(DataTableColumn, { isSorted: true, label: "Name", primaryColumn: true, property: "name", sortable: true, sortDirection: "asc" }), /*#__PURE__*/React.createElement(DataTableColumn, { label: "Count", property: "count" }), /*#__PURE__*/React.createElement(DataTableRowActions, { options: [{ id: 0, label: 'Add to Group', value: '1' }, { id: 1, label: 'Publish', value: '2' }], onAction: function onAction() {}, dropdown: /*#__PURE__*/React.createElement(Dropdown, { length: "5" }) }))).call(this); expect(this.dom.querySelectorAll('.slds-table_header-fixed_container').length).to.eql(1); expect(this.dom.querySelectorAll('.slds-table_header-fixed_scroller').length).to.eql(1); expect(this.dom.querySelector('table.slds-table').className.search('slds-table_header-fixed') >= 0).to.eql(true); expect(this.dom.querySelectorAll('thead .slds-cell-fixed').length).to.eql(4); }); it('Renders a fixedHeader table with column resizing functionality as expected', function () { renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedHeader: true, fixedLayout: true, resizable: true, id: "DataTable-resizable-cols-Test" }), /*#__PURE__*/React.createElement(DataTableColumn, { isSorted: true, label: "Name", primaryColumn: true, property: "name", sortable: true, sortDirection: "asc" }), /*#__PURE__*/React.createElement(DataTableColumn, { label: "Count", property: "count" }), /*#__PURE__*/React.createElement(DataTableRowActions, { options: [{ id: 0, label: 'Add to Group', value: '1' }, { id: 1, label: 'Publish', value: '2' }], onAction: function onAction() {}, dropdown: /*#__PURE__*/React.createElement(Dropdown, { length: "5" }) }))).call(this); // actions column is not resizable expect(this.dom.querySelectorAll('.grip-resizable').length).to.eql(4); expect(this.dom.querySelectorAll('.grip-container').length).to.eql(1); }); }); describe('Column resizing', function describeFunction2() { beforeEach(mountComponent( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedLayout: true, keyboardNavigation: true, resizable: true, resizableOptions: { resizeMode: 'overflow', onResize: function onResize() {} } }), [].concat(_toConsumableArray(columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); })), [/*#__PURE__*/React.createElement(DataTableRowActions, { key: "actions", options: [{ id: 0, label: 'Add to Group', value: '1' }, { id: 1, label: 'Publish', value: '2' }], onAction: function onAction() {}, dropdown: /*#__PURE__*/React.createElement(Dropdown, { length: "5" }) })])))); afterEach(unmountComponent); it('Resize functionality should work with left key', function () { var initial = this.dom.querySelectorAll('th')[0].style.width; var cell = this.wrapper.find('td').first(); cell.simulate('focus'); expect(this.wrapper.find('td').first().prop('tabIndex')).to.equal('0'); cell.simulate('keyDown', keyObjects.UP); cell = this.wrapper.find('th').at(0); expect(this.wrapper.find('th').first().prop('tabIndex')).to.equal('0'); cell.simulate('keyDown', keyObjects.ENTER); cell.simulate('keyDown', keyObjects.LEFT); cell.simulate('keyDown', keyObjects.LEFT); cell.simulate('keyDown', keyObjects.LEFT); cell.simulate('keyDown', keyObjects.ESCAPE); expect("".concat(parseInt(initial, 10) - 30, "px")).to.equal(this.dom.querySelectorAll('th')[0].style.width); }); it('Resize functionality should work with right key', function () { var initial = this.dom.querySelectorAll('th')[0].style.width; var cell = this.wrapper.find('td').first(); cell.simulate('focus'); expect(this.wrapper.find('td').first().prop('tabIndex')).to.equal('0'); cell.simulate('keyDown', keyObjects.UP); cell = this.wrapper.find('th').at(0); expect(this.wrapper.find('th').first().prop('tabIndex')).to.equal('0'); cell.simulate('keyDown', keyObjects.ENTER); cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.ESCAPE); expect("".concat(parseInt(initial, 10) + 60, "px")).to.equal(this.dom.querySelectorAll('th')[0].style.width); }); }); describe('w/ Infinite Scrolling', function describeFunction2() { afterEach(removeTable); it('renders a spinner as expected', function () { renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedHeader: true, fixedLayout: true, hasMore: true }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); expect(this.dom.querySelectorAll('.slds-spinner').length).to.eql(1); }); it('onLoadMore callback is called when scroller is scrolled', function (done) { var expectedCalbacks = 1; this.onLoadMore = function () { // eslint-disable-next-line no-plusplus if (! --expectedCalbacks) done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedHeader: true, fixedLayout: true, hasMore: true, onLoadMore: this.onLoadMore }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); var scroller = this.dom.querySelector('.slds-table_header-fixed_scroller'); scroller.dispatchEvent(new Event('scroll')); }); it('onLoadMore callback is called when window is resized', function (done) { var expectedCalbacks = 1; this.onLoadMore = function () { // eslint-disable-next-line no-plusplus if (! --expectedCalbacks) done(); }; renderTable( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedHeader: true, fixedLayout: true, hasMore: true, onLoadMore: this.onLoadMore }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); window.dispatchEvent(new Event('resize')); }); it('onLoadMore callback is called when the component is updated', function (done) { var expectedCallbacks = 1; this.onLoadMore = function () { // eslint-disable-next-line no-plusplus if (! --expectedCallbacks) done(); }; mountComponent( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { items: [], fixedHeader: true, fixedLayout: true, hasMore: true, onLoadMore: this.onLoadMore }), columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); }))).call(this); // Simulate the first page loading this.wrapper.setProps({ items: [items[0]] }); }); }); describe('Keyboard Navigation', function describeFunction2() { beforeEach(mountComponent( /*#__PURE__*/React.createElement(DataTable, _extends({}, defaultProps, { fixedLayout: true, keyboardNavigation: true }), [].concat(_toConsumableArray(columns.map(function (columnProps) { return /*#__PURE__*/React.createElement(DataTableColumn, _extends({}, columnProps, { key: columnProps.property })); })), [/*#__PURE__*/React.createElement(DataTableRowActions, { key: "actions", options: [{ id: 0, label: 'Add to Group', value: '1' }, { id: 1, label: 'Publish', value: '2' }], onAction: function onAction() {}, dropdown: /*#__PURE__*/React.createElement(Dropdown, { length: "5" }) })])))); afterEach(unmountComponent); it('moves selection when using keyboard up/down/left/right keys', function () { // Focus the first cell var cell = this.wrapper.find('td').first(); cell.simulate('focus'); expect(this.wrapper.find('td').first().prop('tabIndex')).to.equal('0'); // Press Right cell.simulate('keyDown', keyObjects.RIGHT); cell = this.wrapper.find('td').at(1); expect(cell.prop('tabIndex')).to.equal('0'); // Press Down cell.simulate('keyDown', keyObjects.DOWN); cell = this.wrapper.find('td').at(5); expect(cell.prop('tabIndex')).to.equal('0'); // Press Left cell.simulate('keyDown', keyObjects.LEFT); cell = this.wrapper.find('td').at(4); expect(cell.prop('tabIndex')).to.equal('0'); // Press Up cell.simulate('keyDown', keyObjects.UP); cell = this.wrapper.find('td').at(0); expect(cell.prop('tabIndex')).to.equal('0'); }); it('enters actionable mode when using keyboard enter key; and enters navigation mode when using keyboard escape key', function () { // Focus the first cell var cell = this.wrapper.find('td').first(); cell.simulate('focus'); expect(this.wrapper.find('td').first().prop('tabIndex')).to.equal('0'); // Press Enter cell.simulate('keyDown', keyObjects.ENTER); cell = this.wrapper.find('td').first(); expect(cell.prop('tabIndex')).to.be.undefined; var checkbox = this.wrapper.find('td').first().find('input[type="checkbox"]'); expect(checkbox.prop('tabIndex')).to.equal('0'); // Press Escape cell.simulate('keyDown', keyObjects.ESCAPE); cell = this.wrapper.find('td').first(); expect(cell.prop('tabIndex')).to.equal('0'); checkbox = this.wrapper.find('td').first().find('input[type="checkbox"]'); expect(checkbox.prop('tabIndex')).to.equal('-1'); // Navigate to Dropdown cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.RIGHT); cell.simulate('keyDown', keyObjects.RIGHT); // Press Enter cell.simulate('keyDown', keyObjects.ENTER); var dropdownTrigger = this.wrapper.find('td').at(3).find('.slds-dropdown-trigger button'); expect(dropdownTrigger.prop('tabIndex')).to.equal('0'); // Press Escape cell.simulate('keyDown', keyObjects.ESCAPE); dropdownTrigger = this.wrapper.find('td').at(3).find('.slds-dropdown-trigger button'); expect(dropdownTrigger.prop('tabIndex')).to.equal('-1'); }); }); }); //# sourceMappingURL=data-table.browser-test.js.map