| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- /**
- * @license
- * Copyright 2019 Google Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
- import { __assign, __awaiter, __extends, __generator } from "tslib";
- import { MDCFoundation } from '@material/base/foundation';
- import { cssClasses, SortValue, attributes } from './constants';
- /**
- * The Foundation of data table component containing pure business logic, any
- * logic requiring DOM manipulation are delegated to adapter methods.
- */
- var MDCDataTableFoundation = /** @class */ (function (_super) {
- __extends(MDCDataTableFoundation, _super);
- function MDCDataTableFoundation(adapter) {
- return _super.call(this, __assign(__assign({}, MDCDataTableFoundation.defaultAdapter), adapter)) || this;
- }
- Object.defineProperty(MDCDataTableFoundation, "defaultAdapter", {
- get: function () {
- return {
- addClass: function () { return undefined; },
- addClassAtRowIndex: function () { return undefined; },
- getAttributeByHeaderCellIndex: function () { return ''; },
- getHeaderCellCount: function () { return 0; },
- getHeaderCellElements: function () { return []; },
- getRowCount: function () { return 0; },
- getRowElements: function () { return []; },
- getRowIdAtIndex: function () { return ''; },
- getRowIndexByChildElement: function () { return 0; },
- getSelectedRowCount: function () { return 0; },
- getTableContainerHeight: function () { return 0; },
- getTableHeaderHeight: function () { return 0; },
- isCheckboxAtRowIndexChecked: function () { return false; },
- isHeaderRowCheckboxChecked: function () { return false; },
- isRowsSelectable: function () { return false; },
- notifyRowSelectionChanged: function () { return undefined; },
- notifySelectedAll: function () { return undefined; },
- notifySortAction: function () { return undefined; },
- notifyUnselectedAll: function () { return undefined; },
- notifyRowClick: function () { return undefined; },
- registerHeaderRowCheckbox: function () { return undefined; },
- registerRowCheckboxes: function () { return undefined; },
- removeClass: function () { return undefined; },
- removeClassAtRowIndex: function () { return undefined; },
- removeClassNameByHeaderCellIndex: function () { return undefined; },
- setAttributeAtRowIndex: function () { return undefined; },
- setAttributeByHeaderCellIndex: function () { return undefined; },
- setClassNameByHeaderCellIndex: function () { return undefined; },
- setHeaderRowCheckboxChecked: function () { return undefined; },
- setHeaderRowCheckboxIndeterminate: function () { return undefined; },
- setProgressIndicatorStyles: function () { return undefined; },
- setRowCheckboxCheckedAtIndex: function () { return undefined; },
- setSortStatusLabelByHeaderCellIndex: function () { return undefined; },
- };
- },
- enumerable: false,
- configurable: true
- });
- /**
- * Re-initializes header row checkbox and row checkboxes when selectable rows
- * are added or removed from table. Use this if registering checkbox is
- * synchronous.
- */
- MDCDataTableFoundation.prototype.layout = function () {
- if (this.adapter.isRowsSelectable()) {
- this.adapter.registerHeaderRowCheckbox();
- this.adapter.registerRowCheckboxes();
- this.setHeaderRowCheckboxState();
- }
- };
- /**
- * Re-initializes header row checkbox and row checkboxes when selectable rows
- * are added or removed from table. Use this if registering checkbox is
- * asynchronous.
- */
- MDCDataTableFoundation.prototype.layoutAsync = function () {
- return __awaiter(this, void 0, void 0, function () {
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- if (!this.adapter.isRowsSelectable()) return [3 /*break*/, 3];
- return [4 /*yield*/, this.adapter.registerHeaderRowCheckbox()];
- case 1:
- _a.sent();
- return [4 /*yield*/, this.adapter.registerRowCheckboxes()];
- case 2:
- _a.sent();
- this.setHeaderRowCheckboxState();
- _a.label = 3;
- case 3: return [2 /*return*/];
- }
- });
- });
- };
- /**
- * @return Returns array of row elements.
- */
- MDCDataTableFoundation.prototype.getRows = function () {
- return this.adapter.getRowElements();
- };
- /**
- * @return Array of header cell elements.
- */
- MDCDataTableFoundation.prototype.getHeaderCells = function () {
- return this.adapter.getHeaderCellElements();
- };
- /**
- * Sets selected row ids. Overwrites previously selected rows.
- * @param rowIds Array of row ids that needs to be selected.
- */
- MDCDataTableFoundation.prototype.setSelectedRowIds = function (rowIds) {
- for (var rowIndex = 0; rowIndex < this.adapter.getRowCount(); rowIndex++) {
- var rowId = this.adapter.getRowIdAtIndex(rowIndex);
- var isSelected = false;
- if (rowId && rowIds.indexOf(rowId) >= 0) {
- isSelected = true;
- }
- this.adapter.setRowCheckboxCheckedAtIndex(rowIndex, isSelected);
- this.selectRowAtIndex(rowIndex, isSelected);
- }
- this.setHeaderRowCheckboxState();
- };
- /**
- * @return Returns array of all row ids.
- */
- MDCDataTableFoundation.prototype.getRowIds = function () {
- var rowIds = [];
- for (var rowIndex = 0; rowIndex < this.adapter.getRowCount(); rowIndex++) {
- rowIds.push(this.adapter.getRowIdAtIndex(rowIndex));
- }
- return rowIds;
- };
- /**
- * @return Returns array of selected row ids.
- */
- MDCDataTableFoundation.prototype.getSelectedRowIds = function () {
- var selectedRowIds = [];
- for (var rowIndex = 0; rowIndex < this.adapter.getRowCount(); rowIndex++) {
- if (this.adapter.isCheckboxAtRowIndexChecked(rowIndex)) {
- selectedRowIds.push(this.adapter.getRowIdAtIndex(rowIndex));
- }
- }
- return selectedRowIds;
- };
- /**
- * Handles header row checkbox change event.
- */
- MDCDataTableFoundation.prototype.handleHeaderRowCheckboxChange = function () {
- var isHeaderChecked = this.adapter.isHeaderRowCheckboxChecked();
- for (var rowIndex = 0; rowIndex < this.adapter.getRowCount(); rowIndex++) {
- this.adapter.setRowCheckboxCheckedAtIndex(rowIndex, isHeaderChecked);
- this.selectRowAtIndex(rowIndex, isHeaderChecked);
- }
- if (isHeaderChecked) {
- this.adapter.notifySelectedAll();
- }
- else {
- this.adapter.notifyUnselectedAll();
- }
- };
- /**
- * Handles change event originated from row checkboxes.
- */
- MDCDataTableFoundation.prototype.handleRowCheckboxChange = function (event) {
- var rowIndex = this.adapter.getRowIndexByChildElement(event.target);
- if (rowIndex === -1) {
- return;
- }
- var selected = this.adapter.isCheckboxAtRowIndexChecked(rowIndex);
- this.selectRowAtIndex(rowIndex, selected);
- this.setHeaderRowCheckboxState();
- var rowId = this.adapter.getRowIdAtIndex(rowIndex);
- this.adapter.notifyRowSelectionChanged({ rowId: rowId, rowIndex: rowIndex, selected: selected });
- };
- /**
- * Handles sort action on sortable header cell.
- */
- MDCDataTableFoundation.prototype.handleSortAction = function (eventData) {
- var columnId = eventData.columnId, columnIndex = eventData.columnIndex, headerCell = eventData.headerCell;
- // Reset sort attributes / classes on other header cells.
- for (var index = 0; index < this.adapter.getHeaderCellCount(); index++) {
- if (index === columnIndex) {
- continue;
- }
- this.adapter.removeClassNameByHeaderCellIndex(index, cssClasses.HEADER_CELL_SORTED);
- this.adapter.removeClassNameByHeaderCellIndex(index, cssClasses.HEADER_CELL_SORTED_DESCENDING);
- this.adapter.setAttributeByHeaderCellIndex(index, attributes.ARIA_SORT, SortValue.NONE);
- this.adapter.setSortStatusLabelByHeaderCellIndex(index, SortValue.NONE);
- }
- // Set appropriate sort attributes / classes on target header cell.
- this.adapter.setClassNameByHeaderCellIndex(columnIndex, cssClasses.HEADER_CELL_SORTED);
- var currentSortValue = this.adapter.getAttributeByHeaderCellIndex(columnIndex, attributes.ARIA_SORT);
- var sortValue = SortValue.NONE;
- // Set to descending if sorted on ascending order.
- if (currentSortValue === SortValue.ASCENDING) {
- this.adapter.setClassNameByHeaderCellIndex(columnIndex, cssClasses.HEADER_CELL_SORTED_DESCENDING);
- this.adapter.setAttributeByHeaderCellIndex(columnIndex, attributes.ARIA_SORT, SortValue.DESCENDING);
- sortValue = SortValue.DESCENDING;
- // Set to ascending if sorted on descending order.
- }
- else if (currentSortValue === SortValue.DESCENDING) {
- this.adapter.removeClassNameByHeaderCellIndex(columnIndex, cssClasses.HEADER_CELL_SORTED_DESCENDING);
- this.adapter.setAttributeByHeaderCellIndex(columnIndex, attributes.ARIA_SORT, SortValue.ASCENDING);
- sortValue = SortValue.ASCENDING;
- }
- else {
- // Set to ascending by default when not sorted.
- this.adapter.setAttributeByHeaderCellIndex(columnIndex, attributes.ARIA_SORT, SortValue.ASCENDING);
- sortValue = SortValue.ASCENDING;
- }
- this.adapter.setSortStatusLabelByHeaderCellIndex(columnIndex, sortValue);
- this.adapter.notifySortAction({
- columnId: columnId,
- columnIndex: columnIndex,
- headerCell: headerCell,
- sortValue: sortValue,
- });
- };
- /**
- * Handles data table row click event.
- */
- MDCDataTableFoundation.prototype.handleRowClick = function (_a) {
- var rowId = _a.rowId, row = _a.row, altKey = _a.altKey, ctrlKey = _a.ctrlKey, metaKey = _a.metaKey, shiftKey = _a.shiftKey;
- this.adapter.notifyRowClick({
- rowId: rowId,
- row: row,
- altKey: altKey,
- ctrlKey: ctrlKey,
- metaKey: metaKey,
- shiftKey: shiftKey,
- });
- };
- /**
- * Shows progress indicator blocking only the table body content when in
- * loading state.
- */
- MDCDataTableFoundation.prototype.showProgress = function () {
- var tableHeaderHeight = this.adapter.getTableHeaderHeight();
- // Calculate the height of table content (Not scroll content) excluding
- // header row height.
- var height = this.adapter.getTableContainerHeight() - tableHeaderHeight;
- var top = tableHeaderHeight;
- this.adapter.setProgressIndicatorStyles({
- height: height + "px",
- top: top + "px",
- });
- this.adapter.addClass(cssClasses.IN_PROGRESS);
- };
- /**
- * Hides progress indicator when data table is finished loading.
- */
- MDCDataTableFoundation.prototype.hideProgress = function () {
- this.adapter.removeClass(cssClasses.IN_PROGRESS);
- };
- /**
- * Updates header row checkbox state based on number of rows selected.
- */
- MDCDataTableFoundation.prototype.setHeaderRowCheckboxState = function () {
- if (this.adapter.getSelectedRowCount() === 0) {
- this.adapter.setHeaderRowCheckboxChecked(false);
- this.adapter.setHeaderRowCheckboxIndeterminate(false);
- }
- else if (this.adapter.getSelectedRowCount() === this.adapter.getRowCount()) {
- this.adapter.setHeaderRowCheckboxChecked(true);
- this.adapter.setHeaderRowCheckboxIndeterminate(false);
- }
- else {
- this.adapter.setHeaderRowCheckboxIndeterminate(true);
- this.adapter.setHeaderRowCheckboxChecked(false);
- }
- };
- /**
- * Sets the attributes of row element based on selection state.
- */
- MDCDataTableFoundation.prototype.selectRowAtIndex = function (rowIndex, selected) {
- if (selected) {
- this.adapter.addClassAtRowIndex(rowIndex, cssClasses.ROW_SELECTED);
- this.adapter.setAttributeAtRowIndex(rowIndex, attributes.ARIA_SELECTED, 'true');
- }
- else {
- this.adapter.removeClassAtRowIndex(rowIndex, cssClasses.ROW_SELECTED);
- this.adapter.setAttributeAtRowIndex(rowIndex, attributes.ARIA_SELECTED, 'false');
- }
- };
- return MDCDataTableFoundation;
- }(MDCFoundation));
- export { MDCDataTableFoundation };
- //# sourceMappingURL=foundation.js.map
|