UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

1,022 lines (1,014 loc) • 54.6 kB
/** * DevExtreme (ui/grid_core/ui.grid_core.adaptivity.js) * Version: 20.1.7 * Build date: Tue Aug 25 2020 * * Copyright (c) 2012 - 2020 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if ("function" === typeof Symbol && "symbol" === typeof Symbol.iterator) { _typeof = function(obj) { return typeof obj } } else { _typeof = function(obj) { return obj && "function" === typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj } } return _typeof(obj) } var _renderer = require("../../core/renderer"); var _renderer2 = _interopRequireDefault(_renderer); var _events_engine = require("../../events/core/events_engine"); var _events_engine2 = _interopRequireDefault(_events_engine); var _utils = require("../../events/utils"); var eventUtils = _interopRequireWildcard(_utils); var _click = require("../../events/click"); var _click2 = _interopRequireDefault(_click); var _type = require("../../core/utils/type"); var _type2 = _interopRequireDefault(_type); var _browser = require("../../core/utils/browser"); var _browser2 = _interopRequireDefault(_browser); var _guid = require("../../core/guid"); var _guid2 = _interopRequireDefault(_guid); var _uiGrid_core = require("./ui.grid_core.modules"); var _uiGrid_core2 = _interopRequireDefault(_uiGrid_core); var _form = require("../form"); var _form2 = _interopRequireDefault(_form); var _uiGrid_core3 = require("./ui.grid_core.utils"); var _uiGrid_core4 = _interopRequireDefault(_uiGrid_core3); var _themes = require("../themes"); var _themes2 = _interopRequireDefault(_themes); var _window = require("../../core/utils/window"); var _common = require("../../core/utils/common"); var _iterator = require("../../core/utils/iterator"); var _extend = require("../../core/utils/extend"); var _deferred = require("../../core/utils/deferred"); function _getRequireWildcardCache() { if ("function" !== typeof WeakMap) { return null } var cache = new WeakMap; _getRequireWildcardCache = function() { return cache }; return cache } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj } if (null === obj || "object" !== _typeof(obj) && "function" !== typeof obj) { return { "default": obj } } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj) } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc) } else { newObj[key] = obj[key] } } } newObj.default = obj; if (cache) { cache.set(obj, newObj) } return newObj } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj } } var COLUMN_HEADERS_VIEW = "columnHeadersView"; var ROWS_VIEW = "rowsView"; var FOOTER_VIEW = "footerView"; var COLUMN_VIEWS = [COLUMN_HEADERS_VIEW, ROWS_VIEW, FOOTER_VIEW]; var ADAPTIVE_NAMESPACE = "dxDataGridAdaptivity"; var HIDDEN_COLUMNS_WIDTH = "adaptiveHidden"; var ADAPTIVE_ROW_TYPE = "detailAdaptive"; var FORM_ITEM_CONTENT_CLASS = "dx-field-item-content"; var FORM_ITEM_MODIFIED = "dx-item-modified"; var HIDDEN_COLUMN_CLASS = "hidden-column"; var ADAPTIVE_COLUMN_BUTTON_CLASS = "adaptive-more"; var ADAPTIVE_COLUMN_NAME_CLASS = "dx-command-adaptive"; var COMMAND_ADAPTIVE_HIDDEN_CLASS = "dx-command-adaptive-hidden"; var ADAPTIVE_DETAIL_ROW_CLASS = "dx-adaptive-detail-row"; var ADAPTIVE_ITEM_TEXT_CLASS = "dx-adaptive-item-text"; var MASTER_DETAIL_CELL_CLASS = "dx-master-detail-cell"; var LAST_DATA_CELL_CLASS = "dx-last-data-cell"; var ADAPTIVE_COLUMN_NAME = "adaptive"; var EDIT_MODE_BATCH = "batch"; var EDIT_MODE_ROW = "row"; var EDIT_MODE_FORM = "form"; var EDIT_MODE_POPUP = "popup"; var REVERT_TOOLTIP_CLASS = "revert-tooltip"; var GROUP_CELL_CLASS = "dx-group-cell"; var GROUP_ROW_CLASS = "dx-group-row"; function getColumnId(that, column) { return that._columnsController.getColumnId(column) } function getDataCellElements($row) { return $row.find("td:not(.dx-datagrid-hidden-column):not([class*='dx-command-'])") } function adaptiveCellTemplate(container, options) { var $adaptiveColumnButton; var $container = (0, _renderer2.default)(container); var adaptiveColumnsController = options.component.getController("adaptiveColumns"); if ("data" === options.rowType) { $adaptiveColumnButton = (0, _renderer2.default)("<span>").addClass(adaptiveColumnsController.addWidgetPrefix(ADAPTIVE_COLUMN_BUTTON_CLASS)); _events_engine2.default.on($adaptiveColumnButton, eventUtils.addNamespace(_click2.default.name, ADAPTIVE_NAMESPACE), adaptiveColumnsController.createAction(function() { adaptiveColumnsController.toggleExpandAdaptiveDetailRow(options.key) })); $adaptiveColumnButton.appendTo($container) } else { _uiGrid_core4.default.setEmptyText($container) } } var AdaptiveColumnsController = _uiGrid_core2.default.ViewController.inherit({ _isRowEditMode: function() { var editMode = this._getEditMode(); return editMode === EDIT_MODE_ROW }, _isItemModified: function(item, cellOptions) { var columnIndex = this._columnsController.getVisibleIndex(item.column.index); var rowIndex = this._dataController.getRowIndexByKey(cellOptions.key); var row = this._dataController.items()[rowIndex + 1]; return row && row.modifiedValues && _type2.default.isDefined(row.modifiedValues[columnIndex]) }, _renderFormViewTemplate: function(item, cellOptions, $container) { var that = this; var column = item.column; var focusAction = that.createAction(function() { _events_engine2.default.trigger($container, _click2.default.name) }); var value = column.calculateCellValue(cellOptions.data); var displayValue = _uiGrid_core4.default.getDisplayValue(column, value, cellOptions.data, cellOptions.rowType); var text = _uiGrid_core4.default.formatValue(displayValue, column); var isCellOrBatchEditMode = this._editingController.isCellOrBatchEditMode(); var rowsView = that._rowsView; if (column.allowEditing && that.getController("keyboardNavigation").isKeyboardEnabled()) { $container.attr("tabIndex", that.option("tabIndex")); if (isCellOrBatchEditMode) { _events_engine2.default.off($container, "focus", focusAction); _events_engine2.default.on($container, "focus", focusAction) } } if (column.cellTemplate) { var templateOptions = (0, _extend.extend)({}, cellOptions, { value: value, displayValue: displayValue, text: text, column: column }); var isDomElement = !!$container.closest((0, _window.getWindow)().document).length; rowsView.renderTemplate($container, column.cellTemplate, templateOptions, isDomElement).done(function() { rowsView._cellPrepared($container, cellOptions) }) } else { var container = $container.get(0); if (column.encodeHtml) { container.textContent = text } else { container.innerHTML = text } $container.addClass(ADAPTIVE_ITEM_TEXT_CLASS); if (!_type2.default.isDefined(text) || "" === text) { $container.html("&nbsp;") } if (!that._isRowEditMode()) { if (that._isItemModified(item, cellOptions)) { $container.addClass(FORM_ITEM_MODIFIED) } } rowsView._cellPrepared($container, cellOptions) } }, _getTemplate: function(item, cellOptions) { var that = this; var column = item.column; var editingController = this.getController("editing"); return function(options, container) { var $container = (0, _renderer2.default)(container); var columnIndex = that._columnsController.getVisibleIndex(column.visibleIndex); var templateOptions = (0, _extend.extend)({}, cellOptions); var renderFormTemplate = function() { var isItemEdited = that._isItemEdited(item); templateOptions.value = cellOptions.row.values[columnIndex]; if (isItemEdited || column.showEditorAlways) { editingController.renderFormEditTemplate(templateOptions, item, options.component, $container, !isItemEdited) } else { templateOptions.column = column; templateOptions.columnIndex = columnIndex; that._renderFormViewTemplate(item, templateOptions, $container) } }; renderFormTemplate(); templateOptions.watch && templateOptions.watch(function() { return { isItemEdited: that._isItemEdited(item), value: cellOptions.row.values[columnIndex] } }, function() { $container.contents().remove(); $container.removeClass(ADAPTIVE_ITEM_TEXT_CLASS); renderFormTemplate() }) } }, _isVisibleColumnsValid: function(visibleColumns) { var getCommandColumnsCount = function() { var result = 0; for (var j = 0; j < visibleColumns.length; j++) { var visibleColumn = visibleColumns[j]; if (visibleColumn.command) { result++ } } return result }; if (visibleColumns < 2) { return false } if (visibleColumns.length - getCommandColumnsCount() <= 1) { return false } return true }, _calculatePercentWidths: function(widths, visibleColumns) { var that = this; var percentWidths = 0; visibleColumns.forEach(function(item, index) { if (widths[index] !== HIDDEN_COLUMNS_WIDTH) { percentWidths += that._getItemPercentWidth(item) } }); return percentWidths }, _isPercentWidth: function(width) { return _type2.default.isString(width) && "%" === width.slice(-1) }, _isColumnHidden: function(column) { return this._hiddenColumns.filter(function(hiddenColumn) { return hiddenColumn.index === column.index }).length > 0 }, _getAverageColumnsWidth: function(containerWidth, columns, columnsCanFit) { var that = this; var fixedColumnsWidth = 0; var columnsWithoutFixedWidthCount = 0; columns.forEach(function(column) { if (!that._isColumnHidden(column)) { var width = column.width; if (_type2.default.isDefined(width) && !isNaN(parseFloat(width))) { fixedColumnsWidth += that._isPercentWidth(width) ? that._calculatePercentWidth({ visibleIndex: column.visibleIndex, columnsCount: columns.length, columnsCanFit: columnsCanFit, bestFitWidth: column.bestFitWidth, columnWidth: width, containerWidth: containerWidth }) : parseFloat(width) } else { columnsWithoutFixedWidthCount++ } } }); return (containerWidth - fixedColumnsWidth) / columnsWithoutFixedWidthCount }, _calculateColumnWidth: function(column, containerWidth, contentColumns, columnsCanFit) { var columnId = getColumnId(this, column); var widthOption = this._columnsController.columnOption(columnId, "width"); var bestFitWidth = this._columnsController.columnOption(columnId, "bestFitWidth"); var columnsCount = contentColumns.length; var colWidth; if (widthOption && "auto" !== widthOption) { if (this._isPercentWidth(widthOption)) { colWidth = this._calculatePercentWidth({ visibleIndex: column.visibleIndex, columnsCount: columnsCount, columnsCanFit: columnsCanFit, bestFitWidth: bestFitWidth, columnWidth: widthOption, containerWidth: containerWidth }) } else { return widthOption } } else { var columnAutoWidth = this.option("columnAutoWidth"); colWidth = columnAutoWidth || !!column.command ? bestFitWidth : this._getAverageColumnsWidth(containerWidth, contentColumns, columnsCanFit) } return colWidth }, _calculatePercentWidth: function(options) { var columnFitted = options.visibleIndex < options.columnsCount - 1 && options.columnsCanFit; var partialWidth = options.containerWidth * parseFloat(options.columnWidth) / 100; var resultWidth = options.columnsCanFit && partialWidth < options.bestFitWidth ? options.bestFitWidth : partialWidth; return columnFitted ? options.containerWidth * parseFloat(options.columnWidth) / 100 : resultWidth }, _getNotTruncatedColumnWidth: function(column, containerWidth, contentColumns, columnsCanFit) { var columnId = getColumnId(this, column); var widthOption = this._columnsController.columnOption(columnId, "width"); var bestFitWidth = this._columnsController.columnOption(columnId, "bestFitWidth"); if (widthOption && "auto" !== widthOption && !this._isPercentWidth(widthOption)) { return parseFloat(widthOption) } var colWidth = this._calculateColumnWidth(column, containerWidth, contentColumns, columnsCanFit); return colWidth < bestFitWidth ? null : colWidth }, _getItemPercentWidth: function(item) { var result = 0; if (item.width && this._isPercentWidth(item.width)) { result = parseFloat(item.width) } return result }, _getCommandColumnsWidth: function() { var that = this; var columns = that._columnsController.getVisibleColumns(); var colWidth = 0; (0, _iterator.each)(columns, function(index, column) { if (column.index < 0 || column.command) { colWidth += that._columnsController.columnOption(getColumnId(that, column), "bestFitWidth") || 0 } }); return colWidth }, _isItemEdited: function(item) { if (this.isFormEditMode()) { return false } if (this._isRowEditMode()) { var editRowKey = this._editingController.getEditRowKey(); if ((0, _common.equalByValue)(editRowKey, this._dataController.adaptiveExpandedKey())) { return true } } else { var rowIndex = this._dataController.getRowIndexByKey(this._dataController.adaptiveExpandedKey()) + 1; var columnIndex = this._columnsController.getVisibleIndex(item.column.index); return this._editingController.isEditCell(rowIndex, columnIndex) } }, _getFormItemsByHiddenColumns: function(hiddenColumns) { var items = []; (0, _iterator.each)(hiddenColumns, function(_, column) { items.push({ column: column, name: column.name, dataField: column.dataField, visibleIndex: column.visibleIndex }) }); return items }, _getAdaptiveColumnVisibleIndex: function(visibleColumns) { for (var i = 0; i < visibleColumns.length; i++) { var column = visibleColumns[i]; if (column.command === ADAPTIVE_COLUMN_NAME) { return i } } }, _hideAdaptiveColumn: function(resultWidths, visibleColumns) { var visibleIndex = this._getAdaptiveColumnVisibleIndex(visibleColumns); if (_type2.default.isDefined(visibleIndex)) { resultWidths[visibleIndex] = HIDDEN_COLUMNS_WIDTH; this._hideVisibleColumn({ isCommandColumn: true, visibleIndex: visibleIndex }) } }, _showHiddenCellsInView: function(_ref) { var $cells = _ref.$cells, isCommandColumn = _ref.isCommandColumn; var cssClassNameToRemove = isCommandColumn ? COMMAND_ADAPTIVE_HIDDEN_CLASS : this.addWidgetPrefix(HIDDEN_COLUMN_CLASS); $cells.removeClass(cssClassNameToRemove) }, _showHiddenColumns: function() { for (var i = 0; i < COLUMN_VIEWS.length; i++) { var view = this.getView(COLUMN_VIEWS[i]); if (view && view.isVisible() && view.element()) { var viewName = view.name; var $hiddenCommandCells = view.element().find("." + COMMAND_ADAPTIVE_HIDDEN_CLASS); this._showHiddenCellsInView({ viewName: viewName, $cells: $hiddenCommandCells, isCommandColumn: true }); var $hiddenCells = view.element().find("." + this.addWidgetPrefix(HIDDEN_COLUMN_CLASS)); this._showHiddenCellsInView({ viewName: viewName, $cells: $hiddenCells }) } } }, _isCellValid: function($cell) { return $cell && $cell.length && !$cell.hasClass(MASTER_DETAIL_CELL_CLASS) && !$cell.hasClass(GROUP_CELL_CLASS) }, _hideVisibleColumn: function(_ref2) { var isCommandColumn = _ref2.isCommandColumn, visibleIndex = _ref2.visibleIndex; var that = this; COLUMN_VIEWS.forEach(function(viewName) { var view = that.getView(viewName); view && that._hideVisibleColumnInView({ view: view, isCommandColumn: isCommandColumn, visibleIndex: visibleIndex }) }) }, _hideVisibleColumnInView: function(_ref3) { var view = _ref3.view, isCommandColumn = _ref3.isCommandColumn, visibleIndex = _ref3.visibleIndex; var viewName = view.name; var $cellElement; var column = this._columnsController.getVisibleColumns()[visibleIndex]; var editFormRowIndex = this._editingController && this._editingController.getEditFormRowIndex(); if (view && view.isVisible() && column) { var rowsCount = view.getRowsCount(); var $rowElements = view._getRowElements(); for (var rowIndex = 0; rowIndex < rowsCount; rowIndex++) { var cancelClassAdding = rowIndex === editFormRowIndex && viewName === ROWS_VIEW && "popup" !== this.option("editing.mode"); if (!cancelClassAdding) { var currentVisibleIndex = viewName === COLUMN_HEADERS_VIEW ? this._columnsController.getVisibleIndex(column.index, rowIndex) : visibleIndex; if (currentVisibleIndex >= 0) { var $rowElement = $rowElements.eq(rowIndex); $cellElement = this._findCellElementInRow($rowElement, currentVisibleIndex); this._isCellValid($cellElement) && this._hideVisibleCellInView({ viewName: viewName, isCommandColumn: isCommandColumn, $cell: $cellElement }) } } } } }, _findCellElementInRow: function($rowElement, visibleColumnIndex) { var $rowCells = $rowElement.children(); var visibleIndex = visibleColumnIndex; var cellIsInsideGroup = false; if ($rowElement.hasClass(GROUP_ROW_CLASS)) { var $groupCell = $rowElement.find(".".concat(GROUP_CELL_CLASS)); var colSpan = $groupCell.attr("colspan"); if ($groupCell.length && _type2.default.isDefined(colSpan)) { var groupCellLength = parseInt(colSpan); var endGroupIndex = $groupCell.index() + groupCellLength - 1; if (visibleColumnIndex > endGroupIndex) { visibleIndex = visibleColumnIndex - groupCellLength + 1 } else { cellIsInsideGroup = true } } } var $cellElement = !cellIsInsideGroup ? $rowCells.eq(visibleIndex) : void 0; return $cellElement }, _hideVisibleCellInView: function(_ref4) { var $cell = _ref4.$cell, isCommandColumn = _ref4.isCommandColumn; var cssClassNameToAdd = isCommandColumn ? COMMAND_ADAPTIVE_HIDDEN_CLASS : this.addWidgetPrefix(HIDDEN_COLUMN_CLASS); $cell.addClass(cssClassNameToAdd) }, _getEditMode: function() { return this._editingController.getEditMode() }, isFormEditMode: function() { var editMode = this._getEditMode(); return editMode === EDIT_MODE_FORM || editMode === EDIT_MODE_POPUP }, hideRedundantColumns: function(resultWidths, visibleColumns, hiddenQueue) { var that = this; this._hiddenColumns = []; if (that._isVisibleColumnsValid(visibleColumns) && hiddenQueue.length) { var totalWidth = 0; var $rootElement = that.component.$element(); var rootElementWidth = $rootElement.width() - that._getCommandColumnsWidth(); var getVisibleContentColumns = function() { var _this = this; return visibleColumns.filter(function(item) { return !item.command && 0 === _this._hiddenColumns.filter(function(i) { return i.index === item.index }).length }) }.bind(this); var visibleContentColumns = getVisibleContentColumns(); var contentColumnsCount = visibleContentColumns.length; var i; var hasHiddenColumns; var needHideColumn; do { needHideColumn = false; totalWidth = 0; var percentWidths = that._calculatePercentWidths(resultWidths, visibleColumns); var columnsCanFit = percentWidths < 100 && 0 !== percentWidths; for (i = 0; i < visibleColumns.length; i++) { var visibleColumn = visibleColumns[i]; var columnWidth = that._getNotTruncatedColumnWidth(visibleColumn, rootElementWidth, visibleContentColumns, columnsCanFit); var columnId = getColumnId(that, visibleColumn); var widthOption = that._columnsController.columnOption(columnId, "width"); var minWidth = that._columnsController.columnOption(columnId, "minWidth"); var columnBestFitWidth = that._columnsController.columnOption(columnId, "bestFitWidth"); if (resultWidths[i] === HIDDEN_COLUMNS_WIDTH) { hasHiddenColumns = true; continue } if (!columnWidth && !visibleColumn.command && !visibleColumn.fixed) { needHideColumn = true; break } if (!widthOption || "auto" === widthOption) { columnWidth = Math.max(columnBestFitWidth || 0, minWidth || 0) } if (visibleColumn.command !== ADAPTIVE_COLUMN_NAME || hasHiddenColumns) { totalWidth += columnWidth } } needHideColumn = needHideColumn || totalWidth > $rootElement.width(); if (needHideColumn) { var column = hiddenQueue.pop(); var visibleIndex = that._columnsController.getVisibleIndex(column.index); rootElementWidth += that._calculateColumnWidth(column, rootElementWidth, visibleContentColumns, columnsCanFit); that._hideVisibleColumn({ visibleIndex: visibleIndex }); resultWidths[visibleIndex] = HIDDEN_COLUMNS_WIDTH; this._hiddenColumns.push(column); visibleContentColumns = getVisibleContentColumns() } } while (needHideColumn && visibleContentColumns.length > 1 && hiddenQueue.length); if (contentColumnsCount === visibleContentColumns.length) { that._hideAdaptiveColumn(resultWidths, visibleColumns) } } else { that._hideAdaptiveColumn(resultWidths, visibleColumns) } }, getItemContentByColumnIndex: function(visibleColumnIndex) { var $itemContent; for (var i = 0; i < this._$itemContents.length; i++) { $itemContent = this._$itemContents.eq(i); var item = $itemContent.data("dx-form-item"); if (item && item.column && this._columnsController.getVisibleIndex(item.column.index) === visibleColumnIndex) { return $itemContent } } }, toggleExpandAdaptiveDetailRow: function(key, alwaysExpanded) { if (!(this.isFormEditMode() && this._editingController.isEditing())) { this.getController("data").toggleExpandAdaptiveDetailRow(key, alwaysExpanded) } }, createFormByHiddenColumns: function(container, options) { var that = this; var $container = (0, _renderer2.default)(container); var userFormOptions = { items: that._getFormItemsByHiddenColumns(that._hiddenColumns), formID: "dx-" + new _guid2.default }; var defaultFormOptions = _themes2.default.isMaterial() ? { colCount: 2 } : {}; this.executeAction("onAdaptiveDetailRowPreparing", { formOptions: userFormOptions }); that._$itemContents = null; that._form = that._createComponent((0, _renderer2.default)("<div>").appendTo($container), _form2.default, (0, _extend.extend)(defaultFormOptions, userFormOptions, { customizeItem: function(item) { var column = item.column || that._columnsController.columnOption(item.name || item.dataField); if (column) { item.label = item.label || {}; item.label.text = item.label.text || column.caption; item.column = column; item.template = that._getTemplate(item, options, that.updateForm.bind(that)) } userFormOptions.customizeItem && userFormOptions.customizeItem.call(this, item) }, onContentReady: function(e) { userFormOptions.onContentReady && userFormOptions.onContentReady.call(this, e); that._$itemContents = $container.find("." + FORM_ITEM_CONTENT_CLASS) } })) }, hasAdaptiveDetailRowExpanded: function() { return _type2.default.isDefined(this._dataController.adaptiveExpandedKey()) }, updateForm: function(hiddenColumns) { if (this.hasAdaptiveDetailRowExpanded()) { if (this._form && _type2.default.isDefined(this._form._contentReadyAction)) { if (hiddenColumns && hiddenColumns.length) { this._form.option("items", this._getFormItemsByHiddenColumns(hiddenColumns)) } else { this._form.repaint() } } } }, updateHidingQueue: function(columns) { var that = this; var hideableColumns = columns.filter(function(column) { return column.visible && !column.type && !column.fixed && !(_type2.default.isDefined(column.groupIndex) && column.groupIndex >= 0) }); var columnsHasHidingPriority; var i; that._hidingColumnsQueue = []; if (that.option("allowColumnResizing") && "widget" === that.option("columnResizingMode")) { return that._hidingColumnsQueue } for (i = 0; i < hideableColumns.length; i++) { if (_type2.default.isDefined(hideableColumns[i].hidingPriority) && hideableColumns[i].hidingPriority >= 0) { columnsHasHidingPriority = true; that._hidingColumnsQueue[hideableColumns[i].hidingPriority] = hideableColumns[i] } } if (columnsHasHidingPriority) { that._hidingColumnsQueue.reverse() } else { if (that.option("columnHidingEnabled")) { for (i = 0; i < hideableColumns.length; i++) { var visibleIndex = that._columnsController.getVisibleIndex(hideableColumns[i].index); that._hidingColumnsQueue[visibleIndex] = hideableColumns[i] } } } that._hidingColumnsQueue = that._hidingColumnsQueue.filter(Object); return that._hidingColumnsQueue }, getHiddenColumns: function() { return this._hiddenColumns }, hasHiddenColumns: function() { return this._hiddenColumns.length > 0 }, getHidingColumnsQueue: function() { return this._hidingColumnsQueue }, init: function() { var that = this; that._columnsController = that.getController("columns"); that._dataController = that.getController("data"); that._rowsView = that.getView("rowsView"); that._columnsController.addCommandColumn({ type: ADAPTIVE_COLUMN_NAME, command: ADAPTIVE_COLUMN_NAME, visible: true, adaptiveHidden: true, cssClass: ADAPTIVE_COLUMN_NAME_CLASS, alignment: "center", width: "auto", cellTemplate: adaptiveCellTemplate, fixedPosition: "right" }); that._columnsController.columnsChanged.add(function() { var isAdaptiveVisible = !!that.updateHidingQueue(that._columnsController.getColumns()).length; that._columnsController.columnOption("command:adaptive", "adaptiveHidden", !isAdaptiveVisible, true) }); that._editingController = that.getController("editing"); that._hidingColumnsQueue = []; that._hiddenColumns = []; that.createAction("onAdaptiveDetailRowPreparing"); that.callBase() }, optionChanged: function(args) { if ("columnHidingEnabled" === args.name) { this._columnsController.columnOption("command:adaptive", "adaptiveHidden", !args.value) } this.callBase(args) }, publicMethods: function() { return ["isAdaptiveDetailRowExpanded", "expandAdaptiveDetailRow", "collapseAdaptiveDetailRow"] }, isAdaptiveDetailRowExpanded: function(key) { return this._dataController.adaptiveExpandedKey() && (0, _common.equalByValue)(this._dataController.adaptiveExpandedKey(), key) }, expandAdaptiveDetailRow: function(key) { if (!this.hasAdaptiveDetailRowExpanded()) { this.toggleExpandAdaptiveDetailRow(key) } }, collapseAdaptiveDetailRow: function() { if (this.hasAdaptiveDetailRowExpanded()) { this.toggleExpandAdaptiveDetailRow() } } }); module.exports = { defaultOptions: function() { return { columnHidingEnabled: false, onAdaptiveDetailRowPreparing: null } }, controllers: { adaptiveColumns: AdaptiveColumnsController }, extenders: { views: { rowsView: { _getCellTemplate: function(options) { var that = this; var column = options.column; if (options.rowType === ADAPTIVE_ROW_TYPE && "detail" === column.command) { return function(container, options) { that._adaptiveColumnsController.createFormByHiddenColumns((0, _renderer2.default)(container), options) } } return that.callBase(options) }, _createRow: function(row) { var $row = this.callBase(row); if (row && row.rowType === ADAPTIVE_ROW_TYPE && row.key === this._dataController.adaptiveExpandedKey()) { $row.addClass(ADAPTIVE_DETAIL_ROW_CLASS) } return $row }, _renderCells: function($row, options) { this.callBase($row, options); var hidingColumnsQueueLength = this._adaptiveColumnsController.getHidingColumnsQueue().length; var hiddenColumnsLength = this._adaptiveColumnsController.getHiddenColumns().length; if (hidingColumnsQueueLength && !hiddenColumnsLength) { getDataCellElements($row).last().addClass(LAST_DATA_CELL_CLASS) } }, _getColumnIndexByElementCore: function($element) { var $itemContent = $element.closest("." + FORM_ITEM_CONTENT_CLASS); if ($itemContent.length && $itemContent.closest(this.component.$element()).length) { var formItem = $itemContent.length ? $itemContent.first().data("dx-form-item") : null; return formItem && formItem.column && this._columnsController.getVisibleIndex(formItem.column.index) } else { return this.callBase($element) } }, _cellPrepared: function($cell, options) { this.callBase.apply(this, arguments); if (options.row.rowType !== ADAPTIVE_ROW_TYPE && options.column.visibleWidth === HIDDEN_COLUMNS_WIDTH) { $cell.addClass(this.addWidgetPrefix(HIDDEN_COLUMN_CLASS)) } }, _getCellElement: function(rowIndex, columnIdentifier) { var item = this._dataController.items()[rowIndex]; if (item && item.rowType === ADAPTIVE_ROW_TYPE) { return this._adaptiveColumnsController.getItemContentByColumnIndex(columnIdentifier) } else { return this.callBase(rowIndex, columnIdentifier) } }, getContextMenuItems: function(options) { if (options.row && "detailAdaptive" === options.row.rowType) { var view = this.component.getView("columnHeadersView"); var formItem = (0, _renderer2.default)(options.targetElement).closest(".dx-field-item-label").next().data("dx-form-item"); options.column = formItem ? formItem.column : options.column; return view.getContextMenuItems && view.getContextMenuItems(options) } return this.callBase && this.callBase(options) }, isClickableElement: function($target) { var isClickable = this.callBase ? this.callBase($target) : false; return isClickable || !!$target.closest("." + ADAPTIVE_COLUMN_NAME_CLASS).length }, init: function() { this.callBase(); this._adaptiveColumnsController = this.getController("adaptiveColumns") } } }, controllers: { "export": { _updateColumnWidth: function(column, width) { this.callBase(column, column.visibleWidth === HIDDEN_COLUMNS_WIDTH ? column.bestFitWidth : width) } }, columnsResizer: { _pointCreated: function(point, cellsLength, columns) { var result = this.callBase(point, cellsLength, columns); var currentColumn = columns[point.columnIndex] || {}; var nextColumnIndex = this._getNextColumnIndex(point.columnIndex); var nextColumn = columns[nextColumnIndex] || {}; var hasHiddenColumnsOnly = nextColumnIndex !== point.columnIndex + 1 && nextColumn.command; var hasAdaptiveHiddenWidth = currentColumn.visibleWidth === HIDDEN_COLUMNS_WIDTH || hasHiddenColumnsOnly; return result || hasAdaptiveHiddenWidth }, _getNextColumnIndex: function(currentColumnIndex) { var visibleColumns = this._columnsController.getVisibleColumns(); var index = this.callBase(currentColumnIndex); while (visibleColumns[index] && visibleColumns[index].visibleWidth === HIDDEN_COLUMNS_WIDTH) { index++ } return index } }, draggingHeader: { _pointCreated: function(point, columns, location, sourceColumn) { var result = this.callBase(point, columns, location, sourceColumn); var column = columns[point.columnIndex - 1] || {}; var hasAdaptiveHiddenWidth = column.visibleWidth === HIDDEN_COLUMNS_WIDTH; return result || hasAdaptiveHiddenWidth } }, editing: { _isRowEditMode: function() { return this.getEditMode() === EDIT_MODE_ROW }, _getFormEditItemTemplate: function(cellOptions, column) { if (this.getEditMode() !== EDIT_MODE_ROW && "detailAdaptive" === cellOptions.rowType) { cellOptions.columnIndex = this._columnsController.getVisibleIndex(column.index); return this.getColumnTemplate(cellOptions) } return this.callBase(cellOptions, column) }, _closeEditItem: function($targetElement) { var $itemContents = $targetElement.closest("." + FORM_ITEM_CONTENT_CLASS); var rowIndex = this._dataController.getRowIndexByKey(this._dataController.adaptiveExpandedKey()) + 1; var formItem = $itemContents.length ? $itemContents.first().data("dx-form-item") : null; var columnIndex = formItem && formItem.column && this._columnsController.getVisibleIndex(formItem.column.index); if (!this.isEditCell(rowIndex, columnIndex)) { this.callBase($targetElement) } }, _beforeUpdateItems: function(rowIndices, rowIndex) { if (!this._adaptiveController.isFormEditMode() && this._adaptiveController.hasHiddenColumns()) { var items = this._dataController.items(); var item = items[rowIndex]; var oldExpandRowIndex = _uiGrid_core4.default.getIndexByKey(this._dataController.adaptiveExpandedKey(), items); this._isForceRowAdaptiveExpand = !this._adaptiveController.hasAdaptiveDetailRowExpanded(); if (oldExpandRowIndex >= 0 && rowIndex > oldExpandRowIndex) { this._editRowIndex-- } if (oldExpandRowIndex >= 0) { rowIndices.push(oldExpandRowIndex + 1) } rowIndices.push(rowIndex + 1); this._dataController.adaptiveExpandedKey(item.key) } }, _afterInsertRow: function(options) { this.callBase(options); if (this._adaptiveController.hasHiddenColumns()) { this._adaptiveController.toggleExpandAdaptiveDetailRow(options.key, this.isRowEditMode()); this._isForceRowAdaptiveExpand = true } }, _collapseAdaptiveDetailRow: function() { if (this._isRowEditMode() && this._isForceRowAdaptiveExpand) { this._adaptiveController.collapseAdaptiveDetailRow(); this._isForceRowAdaptiveExpand = false } }, _cancelEditAdaptiveDetailRow: function() { if (this._adaptiveController.hasHiddenColumns()) { this._collapseAdaptiveDetailRow() } }, _afterSaveEditData: function() { var _this2 = this; this.callBase.apply(this, arguments); var deferred = new _deferred.Deferred; if (this._isRowEditMode() && this._adaptiveController.hasHiddenColumns()) { (0, _deferred.when)(this.getController("validating").validate(true)).done(function(isValid) { if (isValid) { _this2._cancelEditAdaptiveDetailRow() } deferred.resolve() }) } else { deferred.resolve() } return deferred.promise() }, _beforeCancelEditData: function() { this.callBase(); this._cancelEditAdaptiveDetailRow() }, _getRowIndicesForCascadeUpdating: function(row) { var rowIndices = this.callBase.apply(this, arguments); if (this._adaptiveController.isAdaptiveDetailRowExpanded(row.key)) { rowIndices.push(row.rowType === ADAPTIVE_ROW_TYPE ? row.rowIndex - 1 : row.rowIndex + 1) } return rowIndices }, _beforeCloseEditCellInBatchMode: function(rowIndices) { var expandedKey = this._dataController._adaptiveExpandedKey; if (expandedKey) { var rowIndex = _uiGrid_core4.default.getIndexByKey(expandedKey, this._dataController.items()); if (rowIndex > -1) { rowIndices.unshift(rowIndex) } } }, editRow: function(rowIndex) { if (this._adaptiveController.isFormEditMode()) { this._adaptiveController.collapseAdaptiveDetailRow() } this.callBase(rowIndex) }, deleteRow: function(rowIndex) { var rowKey = this._dataController.getKeyByRowIndex(rowIndex); if (this.getEditMode() === EDIT_MODE_BATCH && this._adaptiveController.isAdaptiveDetailRowExpanded(rowKey)) { this._adaptiveController.collapseAdaptiveDetailRow() } this.callBase(rowIndex) }, init: function() { this.callBase(); this._adaptiveController = this.getController("adaptiveColumns") } }, resizing: { _needBestFit: function() { return this.callBase() || !!this._adaptiveColumnsController.getHidingColumnsQueue().length }, _updateScrollableForIE: function() { var that = this; if (_browser2.default.msie && parseInt(_browser2.default.version) <= 11) { this._updateScrollableTimeoutID = setTimeout(function() { that.getView("rowsView")._updateScrollable() }) } }, _correctColumnWidths: function(resultWidths, visibleColumns) { var adaptiveController = this._adaptiveColumnsController; var columnAutoWidth = this.option("columnAutoWidth"); var oldHiddenColumns = adaptiveController.getHiddenColumns(); var hidingColumnsQueue = adaptiveController.updateHidingQueue(this._columnsController.getColumns()); adaptiveController.hideRedundantColumns(resultWidths, visibleColumns, hidingColumnsQueue); var hiddenColumns = adaptiveController.getHiddenColumns(); if (adaptiveController.hasAdaptiveDetailRowExpanded()) { if (oldHiddenColumns.length !== hiddenColumns.length) { adaptiveController.updateForm(hiddenColumns) } }!hiddenColumns.length && adaptiveController.collapseAdaptiveDetailRow(); if (columnAutoWidth && hidingColumnsQueue.length && !hiddenColumns.length) { this._updateScrollableForIE() } return this.callBase.apply(this, arguments) }, _toggleBestFitMode: function(isBestFit) { isBestFit && this._adaptiveColumnsController._showHiddenColumns(); this.callBase(isBestFit) }, _needStretch: function() { var adaptiveColumnsController = this._adaptiveColumnsController; return this.callBase.apply(this, arguments) || adaptiveColumnsController.getHidingColumnsQueue().length || adaptiveColumnsController.hasHiddenColumns() }, init: function() { this._adaptiveColumnsController = this.getController("adaptiveColumns"); this.callBase() }, dispose: function() { this.callBase.apply(this, arguments); clearTimeout(this._updateScrollableTimeoutID) } }, data: { _processItems: function(items, change) { var that = this; var changeType = change.changeType; items = that.callBase.apply(that, arguments); if ("loadingAll" === changeType || !_type2.default.isDefined(that._adaptiveExpandedKey)) { return items } var expandRowIndex = _uiGrid_core4.default.getIndexByKey(that._adaptiveExpandedKey, items); if (expandRowIndex >= 0) { var item = items[expandRowIndex]; items.splice(expandRowIndex + 1, 0, { visible: true, rowType: ADAPTIVE_ROW_TYPE, key: item.key, data: item.data, node: item.node, modifiedValues: item.modifiedValues, isNewRow: item.isNewRow, values: item.values }) } else { if ("refresh" === changeType) { that._adaptiveExpandedKey = void 0 } } return items }, _getRowIndicesForExpand: function(key) { var rowIndices = this.callBase.apply(this, arguments); if (this.getController("adaptiveColumns").isAdaptiveDetailRowExpanded(key)) { var lastRowIndex = rowIndices[rowIndices.length - 1]; rowIndices.push(lastRowIndex + 1) } return rowIndices