%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/components/bitrix/main.ui.grid/templates/.default/ |
Current File : //home/bitrix/www/bitrix/components/bitrix/main.ui.grid/templates/.default/script.js |
;(function() { "use strict"; BX.namespace('BX.Main'); /** * @event Grid::ready * @event Grid::columnMoved * @event Grid::rowMoved * @event Grid::pageSizeChanged * @event Grid::optionsUpdated * @event Grid::dataSorted * @event Grid::thereSelectedRows * @event Grid::allRowsSelected * @event Grid::allRowsUnselected * @event Grid::noSelectedRows * @event Grid::updated * @event Grid::headerPinned * @event Grid::headerUnpinned * @event Grid::beforeRequest * @param {string} containerId * @param {object} arParams * @param {boolean} arParams.ALLOW_COLUMNS_SORT * @param {boolean} arParams.ALLOW_ROWS_SORT * @param {boolean} arParams.ALLOW_COLUMNS_RESIZE * @param {boolean} arParams.SHOW_ROW_CHECKBOXES * @param {boolean} arParams.ALLOW_HORIZONTAL_SCROLL * @param {boolean} arParams.ALLOW_PIN_HEADER * @param {boolean} arParams.SHOW_ACTION_PANEL * @param {boolean} arParams.PRESERVE_HISTORY * @param {boolean} arParams.BACKEND_URL * @param {boolean} arParams.ALLOW_CONTEXT_MENU * @param {object} arParams.DEFAULT_COLUMNS * @param {boolean} arParams.ENABLE_COLLAPSIBLE_ROWS * @param {object} arParams.EDITABLE_DATA * @param {string} arParams.SETTINGS_TITLE * @param {string} arParams.APPLY_SETTINGS * @param {string} arParams.CANCEL_SETTINGS * @param {string} arParams.CONFIRM_APPLY * @param {string} arParams.CONFIRM_CANCEL * @param {string} arParams.CONFIRM_MESSAGE * @param {string} arParams.CONFIRM_FOR_ALL_MESSAGE * @param {string} arParams.CONFIRM_RESET_MESSAGE * @param {string} arParams.RESET_DEFAULT * @param {object} userOptions * @param {object} userOptionsActions * @param {object} userOptionsHandlerUrl * @param {object} panelActions * @param {object} panelTypes * @param {object} editorTypes * @param {object} messageTypes * @constructor */ BX.Main.grid = function( containerId, arParams, userOptions, userOptionsActions, userOptionsHandlerUrl, panelActions, panelTypes, editorTypes, messageTypes ) { this.settings = null; this.containerId = ''; this.container = null; this.wrapper = null; this.fadeContainer = null; this.scrollContainer = null; this.pagination = null; this.moreButton = null; this.table = null; this.rows = null; this.history = false; this.userOptions = null; this.checkAll = null; this.sortable = null; this.updater = null; this.data = null; this.fader = null; this.editor = null; this.isEditMode = null; this.pinHeader = null; this.pinPanel = null; this.arParams = null; this.resize = null; this.init( containerId, arParams, userOptions, userOptionsActions, userOptionsHandlerUrl, panelActions, panelTypes, editorTypes, messageTypes ); }; BX.Main.grid.isNeedResourcesReady = function(container) { return BX.hasClass(container, 'main-grid-load-animation'); }; BX.Main.grid.prototype = { init: function(containerId, arParams, userOptions, userOptionsActions, userOptionsHandlerUrl, panelActions, panelTypes, editorTypes, messageTypes) { this.baseUrl = window.location.pathname + window.location.search; this.container = BX(containerId); if (!BX.type.isNotEmptyString(containerId)) { throw 'BX.Main.grid.init: parameter containerId is empty'; } if (BX.type.isPlainObject(arParams)) { this.arParams = arParams; } else { throw new Error('BX.Main.grid.init: arParams isn\'t object'); } this.settings = new BX.Grid.Settings(); this.containerId = containerId; this.userOptions = new BX.Grid.UserOptions(this, userOptions, userOptionsActions, userOptionsHandlerUrl); this.gridSettings = new BX.Grid.SettingsWindow(this); this.messages = new BX.Grid.Message(this, messageTypes); if (this.getParam('ALLOW_PIN_HEADER')) { this.pinHeader = new BX.Grid.PinHeader(this); BX.addCustomEvent(window, 'Grid::headerUpdated', BX.proxy(this.bindOnCheckAll, this)); } this.bindOnCheckAll(); if (this.getParam('ALLOW_HORIZONTAL_SCROLL')) { this.fader = new BX.Grid.Fader(this); } this.pageSize = new BX.Grid.Pagesize(this); this.editor = new BX.Grid.InlineEditor(this, editorTypes); if (this.getParam('SHOW_ACTION_PANEL')) { this.actionPanel = new BX.Grid.ActionPanel(this, panelActions, panelTypes); this.pinPanel = new BX.Grid.PinPanel(this); } this.isEditMode = false; if (!BX.type.isDomNode(this.getContainer())) { throw 'BX.Main.grid.init: Failed to find container with id ' + this.getContainerId(); } if (!BX.type.isDomNode(this.getTable())) { throw 'BX.Main.grid.init: Failed to find table'; } this.bindOnRowEvents(); if (this.getParam('ALLOW_COLUMNS_RESIZE')) { this.resize = new BX.Grid.Resize(this); } this.bindOnMoreButtonEvents(); this.bindOnClickPaginationLinks(); this.bindOnClickHeader(); if (this.getParam('ALLOW_ROWS_SORT')) { this.initRowsDragAndDrop(); } if (this.getParam('ALLOW_COLUMNS_SORT')) { this.initColsDragAndDrop(); } this.getRows().initSelected(); this.adjustEmptyTable(this.getRows().getSourceBodyChild()); BX.onCustomEvent(this.getContainer(), 'Grid::ready', [this]); BX.addCustomEvent(window, 'Grid::unselectRow', BX.proxy(this._onUnselectRows, this)); BX.addCustomEvent(window, 'Grid::unselectRows', BX.proxy(this._onUnselectRows, this)); BX.addCustomEvent(window, 'Grid::allRowsUnselected', BX.proxy(this._onUnselectRows, this)); BX.addCustomEvent(window, 'Grid::updated', BX.proxy(this._onGridUpdated, this)); window.frames[this.getFrameId()].onresize = BX.throttle(this._onFrameResize, 20, this); this.initStickedColumns(); }, destroy: function() { BX.removeCustomEvent(window, 'Grid::unselectRow', BX.proxy(this._onUnselectRows, this)); BX.removeCustomEvent(window, 'Grid::unselectRows', BX.proxy(this._onUnselectRows, this)); BX.removeCustomEvent(window, 'Grid::allRowsUnselected', BX.proxy(this._onUnselectRows, this)); BX.removeCustomEvent(window, 'Grid::headerPinned', BX.proxy(this.bindOnCheckAll, this)); this.getPinHeader() && this.getPinHeader().destroy(); this.getFader() && this.getFader().destroy(); this.getResize() && this.getResize().destroy(); this.getColsSortable() && this.getColsSortable().destroy(); this.getRowsSortable() && this.getRowsSortable().destroy(); this.getSettingsWindow() && this.getSettingsWindow().destroy(); }, _onFrameResize: function() { BX.onCustomEvent(window, 'Grid::resize', [this]); }, _onGridUpdated: function() { this.initStickedColumns(); this.adjustFadePosition(this.getFadeOffset()); }, /** * @private * @return {string} */ getFrameId: function() { return "main-grid-tmp-frame-"+this.getContainerId(); }, enableActionsPanel: function() { if (this.getParam('SHOW_ACTION_PANEL')) { var panel = this.getActionsPanel().getPanel(); if (BX.type.isDomNode(panel)) { BX.removeClass(panel, this.settings.get('classDisable')); } } }, disableActionsPanel: function() { if (this.getParam('SHOW_ACTION_PANEL')) { var panel = this.getActionsPanel().getPanel(); if (BX.type.isDomNode(panel)) { BX.addClass(panel, this.settings.get('classDisable')); } } }, getSettingsWindow: function() { return this.gridSettings; }, _onUnselectRows: function() { var panel = this.getActionsPanel(); var checkbox; if (panel instanceof BX.Grid.ActionPanel) { checkbox = panel.getForAllCheckbox(); if (BX.type.isDomNode(checkbox)) { checkbox.checked = null; this.disableForAllCounter(); } } }, /** * @return {boolean} */ isIE: function() { if (!BX.type.isBoolean(this.ie)) { this.ie = BX.hasClass(document.documentElement, 'bx-ie'); } return this.ie; }, /** * @return {boolean} */ isTouch: function() { if (!BX.type.isBoolean(this.touch)) { this.touch = BX.hasClass(document.documentElement, 'bx-touch'); } return this.touch; }, /** * @param {string} paramName * @param {*} [defaultValue] * @return {*} */ getParam: function(paramName, defaultValue) { if(defaultValue === undefined) { defaultValue = null; } return (this.arParams.hasOwnProperty(paramName) ? this.arParams[paramName] : defaultValue); }, /** * @return {HTMLElement[]} */ getCounterTotal: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classCounterTotal'), true); }, getActionKey: function() { return ('action_button_' + this.getId()); }, /** * @return {?BX.Grid.PinHeader} */ getPinHeader: function() { if (this.getParam('ALLOW_PIN_HEADER')) { this.pinHeader = this.pinHeader || new BX.Grid.PinHeader(this); } return this.pinHeader; }, /** * @return {BX.Grid.Resize} */ getResize: function() { if (!(this.resize instanceof BX.Grid.Resize) && this.getParam('ALLOW_COLUMNS_RESIZE')) { this.resize = new BX.Grid.Resize(this); } return this.resize; }, confirmForAll: function(container) { var checkbox; var self = this; if (BX.type.isDomNode(container)) { checkbox = BX.Grid.Utils.getByTag(container, 'input', true); } if (checkbox.checked) { this.getActionsPanel().confirmDialog( {CONFIRM: true, CONFIRM_MESSAGE: this.arParams.CONFIRM_FOR_ALL_MESSAGE}, function() { if (BX.type.isDomNode(checkbox)) { checkbox.checked = true; } self.selectAllCheckAllCheckboxes(); self.getRows().selectAll(); self.enableForAllCounter(); self.updateCounterDisplayed(); self.updateCounterSelected(); self.enableActionsPanel(); BX.onCustomEvent(window, 'Grid::allRowsSelected', []); }, function() { if (BX.type.isDomNode(checkbox)) { checkbox.checked = null; self.disableForAllCounter(); self.updateCounterDisplayed(); self.updateCounterSelected(); } } ); } else { this.unselectAllCheckAllCheckboxes(); this.getRows().unselectAll(); this.disableForAllCounter(); this.updateCounterDisplayed(); this.updateCounterSelected(); this.disableActionsPanel(); BX.onCustomEvent(window, 'Grid::allRowsUnselected', []); } }, editSelected: function() { this.getRows().editSelected(); }, editSelectedSave: function() { var data = {'FIELDS': this.getRows().getEditSelectedValues()}; if (this.getParam("ALLOW_VALIDATE")) { this.tableFade(); data[this.getActionKey()] = 'validate'; this.getData().request('', 'POST', data, 'validate', function(res) { res = JSON.parse(res); if (res.messages.length) { this.arParams['MESSAGES'] = res.messages; this.messages.show(); var editButton = this.getActionsPanel().getButtons() .find(function(button) { return button.id === "grid_edit_button_control"; }); this.tableUnfade(); BX.fireEvent(editButton, 'click'); } else { data[this.getActionKey()] = 'edit'; this.reloadTable('POST', data); } }.bind(this)); return; } data[this.getActionKey()] = 'edit'; this.reloadTable('POST', data); }, getForAllKey: function() { return 'action_all_rows_' + this.getId(); }, updateRow: function(id, data, url, callback) { var row = this.getRows().getById(id); if (row instanceof BX.Grid.Row) { row.update(data, url, callback); } }, removeRow: function(id, data, url, callback) { var row = this.getRows().getById(id); if (row instanceof BX.Grid.Row) { row.remove(data, url, callback); } }, addRow: function(data, url, callback) { var action = this.getUserOptions().getAction('GRID_ADD_ROW'); var rowData = {action: action, data: data}; var self = this; this.tableFade(); this.getData().request(url, 'POST', rowData, null, function() { var bodyRows = this.getBodyRows(); self.getUpdater().updateBodyRows(bodyRows); self.tableUnfade(); self.getRows().reset(); self.getUpdater().updateFootRows(this.getFootRows()); self.getUpdater().updatePagination(this.getPagination()); self.getUpdater().updateMoreButton(this.getMoreButton()); self.getUpdater().updateCounterTotal(this.getCounterTotal()); self.bindOnRowEvents(); self.adjustEmptyTable(bodyRows); self.bindOnMoreButtonEvents(); self.bindOnClickPaginationLinks(); self.updateCounterDisplayed(); self.updateCounterSelected(); if (self.getParam('ALLOW_COLUMNS_SORT')) { self.colsSortable.reinit(); } if (self.getParam('ALLOW_ROWS_SORT')) { self.rowsSortable.reinit(); } BX.onCustomEvent(window, 'Grid::rowAdded', [{data: data, grid: self, response: this}]); BX.onCustomEvent(window, 'Grid::updated', [self]); if (BX.type.isFunction(callback)) { callback({data: data, grid: self, response: this}); } }); }, editSelectedCancel: function() { this.getRows().editSelectedCancel(); }, removeSelected: function() { var data = { 'ID': this.getRows().getSelectedIds() }; var values = this.getActionsPanel().getValues(); data[this.getActionKey()] = 'delete'; data[this.getForAllKey()] = this.getForAllKey() in values ? values[this.getForAllKey()] : 'N'; this.reloadTable('POST', data); }, sendSelected: function() { var values = this.getActionsPanel().getValues(); var selectedRows = this.getRows().getSelectedIds(); var data = { rows: selectedRows, controls: values }; this.reloadTable('POST', data); }, /** * @return {?BX.Grid.ActionPanel} */ getActionsPanel: function() { return this.actionPanel; }, getApplyButton: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classPanelButton'), true); }, getEditor: function() { return this.editor; }, reload: function(url) { this.reloadTable("GET", {}, null, url); }, getPanels: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classPanels'), true); }, getEmptyBlock: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classEmptyBlock'), true); }, adjustEmptyTable: function(rows) { requestAnimationFrame(function() { function adjustEmptyBlockPosition(event) { var target = event.currentTarget; BX.Grid.Utils.requestAnimationFrame(function() { BX.style(emptyBlock, 'transform', 'translate3d(' + BX.scrollLeft(target) + 'px, 0px, 0'); }); } if (!BX.hasClass(document.documentElement, 'bx-ie') && BX.type.isArray(rows) && rows.length === 1 && BX.hasClass(rows[0], this.settings.get('classEmptyRows'))) { var gridRect = BX.pos(this.getContainer()); var scrollBottom = BX.scrollTop(window) + BX.height(window); var diff = gridRect.bottom - scrollBottom; var panelsHeight = BX.height(this.getPanels()); var emptyBlock = this.getEmptyBlock(); var containerWidth = BX.width(this.getContainer()); if (containerWidth) { BX.width(emptyBlock, containerWidth); } BX.style(emptyBlock, 'transform', 'translate3d(' + BX.scrollLeft(this.getScrollContainer()) + 'px, 0px, 0'); BX.unbind(this.getScrollContainer(), 'scroll', adjustEmptyBlockPosition); BX.bind(this.getScrollContainer(), 'scroll', adjustEmptyBlockPosition); var parent = this.getContainer(); var paddingOffset = 0; while (parent = parent.parentElement) { var parentPaddingTop = parseFloat(BX.style(parent, "padding-top")); var parentPaddingBottom = parseFloat(BX.style(parent, "padding-bottom")); if (!isNaN(parentPaddingTop)) { paddingOffset += parentPaddingTop; } if (!isNaN(parentPaddingBottom)) { paddingOffset += parentPaddingBottom; } } if (diff > 0) { BX.style(this.getTable(), 'min-height', (gridRect.height - diff - panelsHeight - paddingOffset) + 'px'); } else { BX.style(this.getTable(), 'min-height', (gridRect.height + Math.abs(diff) - panelsHeight - paddingOffset) + 'px'); } } else { BX.style(this.getTable(), 'min-height', ''); } }.bind(this)); }, reloadTable: function(method, data, callback, url) { var bodyRows; if(!BX.type.isNotEmptyString(method)) { method = "GET"; } if(!BX.type.isPlainObject(data)) { data = {}; } var self = this; this.tableFade(); if(!BX.type.isString(url)) { url = ""; } this.getData().request(url, method, data, '', function() { self.getRows().reset(); bodyRows = this.getBodyRows(); self.getUpdater().updateHeadRows(this.getHeadRows()); self.getUpdater().updateBodyRows(bodyRows); self.getUpdater().updateFootRows(this.getFootRows()); self.getUpdater().updatePagination(this.getPagination()); self.getUpdater().updateMoreButton(this.getMoreButton()); self.getUpdater().updateCounterTotal(this.getCounterTotal()); self.adjustEmptyTable(bodyRows); self.bindOnRowEvents(); self.bindOnMoreButtonEvents(); self.bindOnClickPaginationLinks(); self.bindOnClickHeader(); self.bindOnCheckAll(); self.updateCounterDisplayed(); self.updateCounterSelected(); self.disableActionsPanel(); self.disableForAllCounter(); if (self.getParam('SHOW_ACTION_PANEL')) { self.getUpdater().updateGroupActions(this.getActionPanel()); } if (self.getParam('ALLOW_COLUMNS_SORT')) { self.colsSortable.reinit(); } if (self.getParam('ALLOW_ROWS_SORT')) { self.rowsSortable.reinit(); } self.tableUnfade(); BX.onCustomEvent(window, 'Grid::updated', [self]); if (BX.type.isFunction(callback)) { callback(); } }); }, getGroupEditButton: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classGroupEditButton'), true); }, getGroupDeleteButton: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classGroupDeleteButton'), true); }, enableGroupActions: function() { var editButton = this.getGroupEditButton(); var deleteButton = this.getGroupDeleteButton(); if (BX.type.isDomNode(editButton)) { BX.removeClass(editButton, this.settings.get('classGroupActionsDisabled')); } if (BX.type.isDomNode(deleteButton)) { BX.removeClass(deleteButton, this.settings.get('classGroupActionsDisabled')); } }, disableGroupActions: function() { var editButton = this.getGroupEditButton(); var deleteButton = this.getGroupDeleteButton(); if (BX.type.isDomNode(editButton)) { BX.addClass(editButton, this.settings.get('classGroupActionsDisabled')); } if (BX.type.isDomNode(deleteButton)) { BX.addClass(deleteButton, this.settings.get('classGroupActionsDisabled')); } }, closeActionsMenu: function() { var rows = this.getRows().getRows(); for(var i = 0, l = rows.length; i < l; i++) { rows[i].closeActionsMenu(); } }, getPageSize: function() { return this.pageSize; }, /** * @return {?BX.Grid.Fader} */ getFader: function() { return this.fader; }, /** * @return {BX.Grid.Data} */ getData: function() { this.data = this.data || new BX.Grid.Data(this); return this.data; }, /** * @return {BX.Grid.Updater} */ getUpdater: function() { this.updater = this.updater || new BX.Grid.Updater(this); return this.updater; }, isSortableHeader: function(item) { return ( BX.hasClass(item, this.settings.get('classHeaderSortable')) ); }, isNoSortableHeader: function(item) { return ( BX.hasClass(item, this.settings.get('classHeaderNoSortable')) ); }, bindOnClickHeader: function() { var self = this; var cell; BX.bind(this.getContainer(), 'click', function(event) { cell = BX.findParent(event.target, {tag: 'th'}, true, false); if (cell && self.isSortableHeader(cell) && !self.preventSortableClick) { self.preventSortableClick = false; self._clickOnSortableHeader(cell, event); } }); }, enableEditMode: function() { this.isEditMode = true; }, disableEditMode: function() { this.isEditMode = false; }, isEditMode: function() { return this.isEditMode; }, getColumnHeaderCellByName: function(name) { return BX.Grid.Utils.getBySelector( this.getContainer(), '#'+this.getId()+' th[data-name="'+name+'"]', true ); }, getColumnByName: function(name) { var columns = this.getParam('DEFAULT_COLUMNS'); return !!name && name in columns ? columns[name] : null; }, adjustIndex: function(index) { var fixedCells = this.getAllRows()[0] .querySelectorAll('.main-grid-fixed-column').length; return (index + fixedCells); }, getColumnByIndex: function(index) { index = this.adjustIndex(index); return this.getAllRows() .reduce(function(accumulator, row) { if (!row.classList.contains('main-grid-row-custom') && !row.classList.contains('main-grid-row-empty')) { accumulator.push(row.children[index]); } return accumulator; }, []); }, getAllRows: function() { var rows = [].slice.call(this.getTable().rows); var fixedTable = this.getContainer().parentElement.querySelector(".main-grid-fixed-bar table"); if (fixedTable) { rows.push(fixedTable.rows[0]); } return rows; }, initStickedColumns: function() { [].slice.call(this.getAllRows()[0].children).forEach(function(cell, index) { if (cell.classList.contains('main-grid-sticked-column')) { this.stickyColumnByIndex(index); } }, this); this.getResize().destroy(); this.getResize().init(this); }, stickyColumnByIndex: function(index) { var column = this.getColumnByIndex(index); var cellWidth = column[0].clientWidth; var heights = column.map(function(cell) { return BX.height(cell); }); column.forEach(function(cell, cellIndex) { var clone = BX.clone(cell); cell.style.minWidth = cellWidth + 'px'; cell.style.width = cellWidth + 'px'; cell.style.minHeight = heights[cellIndex] + 'px'; var lastStickyCell = this.getLastStickyCellFromRowByIndex(cellIndex); if (lastStickyCell) { var lastStickyCellLeft = parseInt(BX.style(lastStickyCell, 'left')); var lastStickyCellWidth = parseInt(BX.style(lastStickyCell, 'width')); lastStickyCellLeft = isNaN(lastStickyCellLeft) ? 0 : lastStickyCellLeft; lastStickyCellWidth = isNaN(lastStickyCellWidth) ? 0 : lastStickyCellWidth; cell.style.left = (lastStickyCellLeft + lastStickyCellWidth) + 'px'; } cell.classList.add('main-grid-fixed-column'); cell.classList.add('main-grid-cell-static'); clone.classList.add('main-grid-cell-static'); if (this.getColsSortable()) { this.getColsSortable().unregister(cell); this.getColsSortable().unregister(clone); } BX.insertAfter(clone, cell); }, this); this.adjustFadePosition(this.getFadeOffset()); }, adjustFixedColumnsPosition: function() { var fixedCells = this.getAllRows()[0] .querySelectorAll('.main-grid-fixed-column').length; var columnsPosition = [].slice.call(this.getAllRows()[0].children) .reduce(function(accumulator, cell, index, columns) { var cellLeft; var cellWidth; if (columns[index-1] && columns[index-1].classList.contains('main-grid-fixed-column')) { cellLeft = parseInt(BX.style(columns[index-1], 'left')); cellWidth = parseInt(BX.style(columns[index-1], 'width')); cellLeft = isNaN(cellLeft) ? 0 : cellLeft; cellWidth = isNaN(cellWidth) ? 0 : cellWidth; accumulator.push({index: index+1, left: (cellLeft + cellWidth)}); } return accumulator; }, []); columnsPosition .forEach(function(item) { var column = this.getColumnByIndex(item.index - fixedCells); column.forEach(function(cell) { if (item.index !== columnsPosition[columnsPosition.length-1].index) { cell.style.left = item.left + 'px'; } }); }, this); this.getAllRows() .forEach(function(row) { var height = BX.height(row); var cells = [].slice.call(row.children); cells.forEach(function(cell) { cell.style.minHeight = height + 'px'; }); }); }, getLastStickyCellFromRowByIndex: function(index) { return [].slice.call(this.getAllRows()[index].children) .reduceRight(function(accumulator, cell) { if (!accumulator && cell.classList.contains('main-grid-fixed-column')) { accumulator = cell; } return accumulator; }, null); }, getFadeOffset: function() { var fadeOffset = 0; var lastStickyCell = this.getLastStickyCellFromRowByIndex(0); if (lastStickyCell) { var lastStickyCellLeft = parseInt(BX.style(lastStickyCell, 'left')); var lastStickyCellWidth = lastStickyCell.offsetWidth; lastStickyCellLeft = isNaN(lastStickyCellLeft) ? 0 : lastStickyCellLeft; lastStickyCellWidth = isNaN(lastStickyCellWidth) ? 0 : lastStickyCellWidth; fadeOffset = lastStickyCellLeft + lastStickyCellWidth; } return fadeOffset; }, adjustFadePosition: function(offset) { var earLeft = this.getFader().getEarLeft(); var shadowLeft = this.getFader().getShadowLeft(); earLeft.style.left = offset + 'px'; shadowLeft.style.left = offset + 'px'; }, /** * @param {string|object} column */ sortByColumn: function(column) { var headerCell = null; var header = null; if (!BX.type.isPlainObject(column)) { headerCell = this.getColumnHeaderCellByName(column); header = this.getColumnByName(column); } else { header = column; header.sort_url = this.prepareSortUrl(column); } if (header && (!!headerCell && !BX.hasClass(headerCell, this.settings.get('classLoad')) || !headerCell)) { !!headerCell && BX.addClass(headerCell, this.settings.get('classLoad')); this.tableFade(); var self = this; this.getUserOptions().setSort(header.sort_by, header.sort_order, function() { self.getData().request(header.sort_url, null, null, 'sort', function() { self.rows = null; self.getUpdater().updateHeadRows(this.getHeadRows()); self.getUpdater().updateBodyRows(this.getBodyRows()); self.getUpdater().updatePagination(this.getPagination()); self.getUpdater().updateMoreButton(this.getMoreButton()); self.bindOnRowEvents(); self.bindOnMoreButtonEvents(); self.bindOnClickPaginationLinks(); self.bindOnClickHeader(); self.bindOnCheckAll(); self.updateCounterDisplayed(); self.updateCounterSelected(); self.disableActionsPanel(); self.disableForAllCounter(); if (self.getParam('SHOW_ACTION_PANEL')) { self.getActionsPanel().resetForAllCheckbox(); } if (self.getParam('ALLOW_ROWS_SORT')) { self.rowsSortable.reinit(); } if (self.getParam('ALLOW_COLUMNS_SORT')) { self.colsSortable.reinit(); } BX.onCustomEvent(window, 'BX.Main.grid:sort', [header, self]); BX.onCustomEvent(window, 'Grid::updated', [self]); self.tableUnfade(); }); }); } }, prepareSortUrl: function(header) { var url = window.location.toString(); if ('sort_by' in header) { url = BX.util.add_url_param(url, {by: header.sort_by}); } if ('sort_order' in header) { url = BX.util.add_url_param(url, {order: header.sort_order}); } return url; }, _clickOnSortableHeader: function(header, event) { event.preventDefault(); this.sortByColumn(BX.data(header, 'name')); }, getObserver: function() { return BX.Grid.observer; }, initRowsDragAndDrop: function() { this.rowsSortable = new BX.Grid.RowsSortable(this); }, initColsDragAndDrop: function() { this.colsSortable = new BX.Grid.ColsSortable(this); }, /** * @return {BX.Grid.RowsSortable} */ getRowsSortable: function() { return this.rowsSortable; }, /** * @return {BX.Grid.ColsSortable} */ getColsSortable: function() { return this.colsSortable; }, getUserOptionsHandlerUrl: function() { return this.userOptionsHandlerUrl || ''; }, /** * @return {BX.Grid.UserOptions} */ getUserOptions: function() { return this.userOptions; }, getCheckAllCheckboxes: function() { var checkAllNodes = BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classCheckAllCheckboxes')); return checkAllNodes.map(function(current) { return new BX.Grid.Element(current); }); }, selectAllCheckAllCheckboxes: function() { this.getCheckAllCheckboxes().forEach(function(current) { current.getNode().checked = true; }); }, unselectAllCheckAllCheckboxes: function() { this.getCheckAllCheckboxes().forEach(function(current) { current.getNode().checked = false; }); }, adjustCheckAllCheckboxes: function() { var total = this.getRows().getBodyChild().filter(function(row) { return row.isShown(); }).length; var selected = this.getRows().getSelected().filter(function(row) { return row.isShown(); }).length; total === selected ? this.selectAllCheckAllCheckboxes() : this.unselectAllCheckAllCheckboxes(); }, bindOnCheckAll: function() { var self = this; this.getCheckAllCheckboxes().forEach(function(current) { current.getObserver().add( current.getNode(), 'change', self._clickOnCheckAll, self ); }); }, _clickOnCheckAll: function(event) { event.preventDefault(); this.toggleSelectionAll(); }, toggleSelectionAll: function() { if (!this.getRows().isAllSelected()) { this.getRows().selectAll(); this.selectAllCheckAllCheckboxes(); this.enableActionsPanel(); BX.onCustomEvent(window, 'Grid::allRowsSelected', [this]); } else { this.getRows().unselectAll(); this.unselectAllCheckAllCheckboxes(); this.disableActionsPanel(); BX.onCustomEvent(window, 'Grid::allRowsUnselected', [this]); } this.updateCounterSelected(); }, bindOnClickPaginationLinks: function() { var self = this; this.getPagination().getLinks().forEach(function(current) { current.getObserver().add( current.getNode(), 'click', self._clickOnPaginationLink, self ); }); }, bindOnMoreButtonEvents: function() { var self = this; this.getMoreButton().getObserver().add( this.getMoreButton().getNode(), 'click', self._clickOnMoreButton, self ); }, bindOnRowEvents: function() { var observer = this.getObserver(); var showCheckboxes = this.getParam('SHOW_ROW_CHECKBOXES'); var enableCollapsibleRows = this.getParam('ENABLE_COLLAPSIBLE_ROWS'); this.getRows().getBodyChild().forEach(function(current) { showCheckboxes && observer.add(current.getNode(), 'click', this._onClickOnRow, this); current.getDefaultAction() && observer.add(current.getNode(), 'dblclick', this._onRowDblclick, this); current.getActionsButton() && observer.add(current.getActionsButton(), 'click', this._clickOnRowActionsButton, this); enableCollapsibleRows && current.getCollapseButton() && observer.add(current.getCollapseButton(), 'click', this._onCollapseButtonClick, this); }, this); }, _onCollapseButtonClick: function(event) { event.preventDefault(); event.stopPropagation(); var row = this.getRows().get(event.currentTarget); row.toggleChildRows(); if (row.isCustom()) { this.getUserOptions().setCollapsedGroups(this.getRows().getIdsCollapsedGroups()); } else { this.getUserOptions().setExpandedRows(this.getRows().getIdsExpandedRows()); } BX.fireEvent(document.body, 'click'); }, _clickOnRowActionsButton: function(event) { var row = this.getRows().get(event.target); event.preventDefault(); if (!row.actionsMenuIsShown()) { row.showActionsMenu(); } else { row.closeActionsMenu(); } }, _onRowDblclick: function(event) { event.preventDefault(); var row = this.getRows().get(event.target); var defaultJs = ''; if (!row.isEdit()) { clearTimeout(this.clickTimer); this.clickPrevent = true; try { defaultJs = row.getDefaultAction(); eval(defaultJs); } catch (err) { console.warn(err); } } }, _onClickOnRow: function(event) { var clickDelay = 50; var selection = window.getSelection(); if (event.target.nodeName === 'LABEL') { event.preventDefault(); } if (event.shiftKey || selection.toString().length === 0) { selection.removeAllRanges(); this.clickTimer = setTimeout(BX.delegate(function() { if (!this.clickPrevent) { clickActions.apply(this, [event]); } this.clickPrevent = false; }, this), clickDelay); } function clickActions(event) { var rows, row, containsNotSelected, min, max, contentContainer; var isPrevent = true; if (event.target.nodeName !== 'A' && event.target.nodeName !== 'INPUT') { row = this.getRows().get(event.target); contentContainer = row.getContentContainer(event.target); if (BX.type.isDomNode(contentContainer) && event.target.nodeName !== 'TD' && event.target !== contentContainer) { isPrevent = BX.data(contentContainer, 'prevent-default') === 'true'; } if (isPrevent) { if (row.getCheckbox()) { rows = []; this.currentIndex = 0; this.getRows().getRows().forEach(function(currentRow, index) { if (currentRow === row) { this.currentIndex = index; } }, this); this.lastIndex = this.lastIndex || this.currentIndex; if (!event.shiftKey) { if (!row.isSelected()) { row.select(); BX.onCustomEvent(window, 'Grid::selectRow', [row, this]); } else { row.unselect(); BX.onCustomEvent(window, 'Grid::unselectRow', [row, this]); } } else { min = Math.min(this.currentIndex, this.lastIndex); max = Math.max(this.currentIndex, this.lastIndex); while (min <= max) { rows.push(this.getRows().getRows()[min]); min++; } containsNotSelected = rows.some(function(current) { return !current.isSelected(); }); if (containsNotSelected) { rows.forEach(function(current) { current.select(); }); BX.onCustomEvent(window, 'Grid::selectRows', [rows, this]); } else { rows.forEach(function(current) { current.unselect(); }); BX.onCustomEvent(window, 'Grid::unselectRows', [rows, this]); } } this.updateCounterSelected(); this.lastIndex = this.currentIndex; } this.adjustRows(); this.adjustCheckAllCheckboxes(); } } } }, adjustRows: function() { if (this.getRows().isSelected()) { BX.onCustomEvent(window, 'Grid::thereSelectedRows', []); this.enableActionsPanel(); } else { BX.onCustomEvent(window, 'Grid::noSelectedRows', []); this.disableActionsPanel(); } }, getPagination: function() { return new BX.Grid.Pagination(this); }, getState: function() { return window.history.state; }, tableFade: function() { BX.addClass(this.getTable(), this.settings.get('classTableFade')); this.getLoader().show(); BX.onCustomEvent('Grid::disabled', [this]); }, tableUnfade: function() { BX.removeClass(this.getTable(), this.settings.get('classTableFade')); this.getLoader().hide(); BX.onCustomEvent('Grid::enabled', [this]); }, _clickOnPaginationLink: function(event) { event.preventDefault(); var self = this; var link = this.getPagination().getLink(event.target); if (!link.isLoad()) { this.getUserOptions().resetExpandedRows(); link.load(); this.tableFade(); this.getData().request(link.getLink(), null, null, 'pagination', function() { self.rows = null; self.getUpdater().updateBodyRows(this.getBodyRows()); self.getUpdater().updateHeadRows(this.getHeadRows()); self.getUpdater().updateMoreButton(this.getMoreButton()); self.getUpdater().updatePagination(this.getPagination()); self.bindOnRowEvents(); self.bindOnMoreButtonEvents(); self.bindOnClickPaginationLinks(); self.bindOnClickHeader(); self.bindOnCheckAll(); self.updateCounterDisplayed(); self.updateCounterSelected(); self.disableActionsPanel(); self.disableForAllCounter(); if (self.getParam('SHOW_ACTION_PANEL')) { self.getActionsPanel().resetForAllCheckbox(); } if (self.getParam('ALLOW_ROWS_SORT')) { self.rowsSortable.reinit(); } if (self.getParam('ALLOW_COLUMNS_SORT')) { self.colsSortable.reinit(); } link.unload(); self.tableUnfade(); BX.onCustomEvent(window, 'Grid::updated', [self]); }); } }, _clickOnMoreButton: function(event) { event.preventDefault(); var self = this; var moreButton = this.getMoreButton(); moreButton.load(); this.getData().request(moreButton.getLink(), null, null, 'more', function() { self.getUpdater().appendBodyRows(this.getBodyRows()); self.getUpdater().updateMoreButton(this.getMoreButton()); self.getUpdater().updatePagination(this.getPagination()); self.getRows().reset(); self.bindOnRowEvents(); self.bindOnMoreButtonEvents(); self.bindOnClickPaginationLinks(); self.bindOnClickHeader(); self.bindOnCheckAll(); self.updateCounterDisplayed(); self.updateCounterSelected(); if (self.getParam('ALLOW_ROWS_SORT')) { self.rowsSortable.reinit(); } if (self.getParam('ALLOW_COLUMNS_SORT')) { self.colsSortable.reinit(); } self.unselectAllCheckAllCheckboxes(); }); }, getAjaxId: function() { return BX.data( this.getContainer(), this.settings.get('ajaxIdDataProp') ); }, update: function(data, action) { var newRows, newHeadRows, newNavPanel, thisBody, thisHead, thisNavPanel; if (!BX.type.isNotEmptyString(data)) { return; } thisBody = BX.Grid.Utils.getByTag(this.getTable(), 'tbody', true); thisHead = BX.Grid.Utils.getByTag(this.getTable(), 'thead', true); thisNavPanel = BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classNavPanel'), true); data = BX.create('div', {html: data}); newHeadRows = BX.Grid.Utils.getByClass(data, this.settings.get('classHeadRow')); newRows = BX.Grid.Utils.getByClass(data, this.settings.get('classDataRows')); newNavPanel = BX.Grid.Utils.getByClass(data, this.settings.get('classNavPanel'), true); if (action === this.settings.get('updateActionMore')) { this.getRows().addRows(newRows); this.unselectAllCheckAllCheckboxes(); } if (action === this.settings.get('updateActionPagination')) { BX.cleanNode(thisBody); this.getRows().addRows(newRows); this.unselectAllCheckAllCheckboxes(); } if (action === this.settings.get('updateActionSort')) { BX.cleanNode(thisHead); BX.cleanNode(thisBody); thisHead.appendChild(newHeadRows[0]); this.getRows().addRows(newRows); } thisNavPanel.innerHTML = newNavPanel.innerHTML; this.bindOnRowEvents(); this.bindOnMoreButtonEvents(); this.bindOnClickPaginationLinks(); this.bindOnClickHeader(); this.bindOnCheckAll(); this.updateCounterDisplayed(); this.updateCounterSelected(); this.sortable.reinit(); }, getCounterDisplayed: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classCounterDisplayed')); }, getCounterSelected: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classCounterSelected')); }, updateCounterDisplayed: function() { var counterDisplayed = this.getCounterDisplayed(); var rows; if (BX.type.isArray(counterDisplayed)) { rows = this.getRows(); counterDisplayed.forEach(function(current) { if (BX.type.isDomNode(current)) { current.innerText = rows.getCountDisplayed(); } }, this); } }, updateCounterSelected: function() { var counterSelected = this.getCounterSelected(); var rows; if (BX.type.isArray(counterSelected)) { rows = this.getRows(); counterSelected.forEach(function(current) { if (BX.type.isDomNode(current)) { current.innerText = rows.getCountSelected(); } }, this); } }, getContainerId: function() { return this.containerId; }, getId: function() { //ID is equals to container Id return this.containerId; }, getContainer: function() { return BX(this.getContainerId()); }, getCounter: function() { if (!this.counter) { this.counter = BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classCounter')); } return this.counter; }, enableForAllCounter: function() { var counter = this.getCounter(); if (BX.type.isArray(counter)) { counter.forEach(function(current) { BX.addClass(current, this.settings.get('classForAllCounterEnabled')); }, this); } }, disableForAllCounter: function() { var counter = this.getCounter(); if (BX.type.isArray(counter)) { counter.forEach(function(current) { BX.removeClass(current, this.settings.get('classForAllCounterEnabled')); }, this); } }, getScrollContainer: function() { if (!this.scrollContainer) { this.scrollContainer = BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classScrollContainer'), true); } return this.scrollContainer; }, getWrapper: function() { if (!this.wrapper) { this.wrapper = BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classWrapper'), true); } return this.wrapper; }, getFadeContainer: function() { if (!this.fadeContainer) { this.fadeContainer = BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classFadeContainer'), true); } return this.fadeContainer; }, getTable: function() { return BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classTable'), true); }, getHeaders: function() { return BX.Grid.Utils.getBySelector(this.getWrapper(), '.main-grid-header[data-relative="' + this.getContainerId() + '"]'); }, getHead: function() { return BX.Grid.Utils.getByTag(this.getContainer(), 'thead', true); }, getBody: function() { return BX.Grid.Utils.getByTag(this.getContainer(), 'tbody', true); }, getFoot: function() { return BX.Grid.Utils.getByTag(this.getContainer(), 'tfoot', true); }, /** * @return {BX.Grid.Rows} */ getRows: function() { if (!(this.rows instanceof BX.Grid.Rows)) { this.rows = new BX.Grid.Rows(this) } return this.rows; }, getMoreButton: function() { var node = BX.Grid.Utils.getByClass(this.getContainer(), this.settings.get('classMoreButton'), true); return new BX.Grid.Element(node, this); }, /** * Gets loader instance * @return {BX.Grid.Loader} */ getLoader: function() { if (!(this.loader instanceof BX.Grid.Loader)) { this.loader = new BX.Grid.Loader(this); } return this.loader; }, blockSorting: function() { var headerCells = BX.Grid.Utils.getByClass( this.getContainer(), this.settings.get('classHeadCell') ); headerCells.forEach(function(header) { if (this.isSortableHeader(header)) { BX.removeClass(header, this.settings.get('classHeaderSortable')); BX.addClass(header, this.settings.get('classHeaderNoSortable')); } }, this); }, unblockSorting: function() { var headerCells = BX.Grid.Utils.getByClass( this.getContainer(), this.settings.get('classHeadCell') ); headerCells.forEach(function(header) { if (this.isNoSortableHeader(header) && header.dataset.sortBy) { BX.addClass(header, this.settings.get('classHeaderSortable')); BX.removeClass(header, this.settings.get('classHeaderNoSortable')); } }, this); }, confirmDialog: function(action, then, cancel) { var dialog, popupContainer, applyButton, cancelButton; if ('CONFIRM' in action && action.CONFIRM) { action.CONFIRM_MESSAGE = action.CONFIRM_MESSAGE || this.arParams.CONFIRM_MESSAGE; action.CONFIRM_APPLY_BUTTON = action.CONFIRM_APPLY_BUTTON || this.arParams.CONFIRM_APPLY; action.CONFIRM_CANCEL_BUTTON = action.CONFIRM_CANCEL_BUTTON || this.arParams.CONFIRM_CANCEL; dialog = new BX.PopupWindow( this.getContainerId() + '-confirm-dialog', null, { content: '<div class="main-grid-confirm-content">'+action.CONFIRM_MESSAGE+'</div>', titleBar: 'CONFIRM_TITLE' in action ? action.CONFIRM_TITLE : '', autoHide: false, zIndex: 9999, overlay: 0.4, offsetTop: -100, closeIcon : true, closeByEsc : true, events: { onClose: function() { BX.unbind(window, 'keydown', hotKey); } }, buttons: [ new BX.PopupWindowButton({ text: action.CONFIRM_APPLY_BUTTON, id: this.getContainerId() + '-confirm-dialog-apply-button', events: { click: function() { BX.type.isFunction(then) ? then() : null; this.popupWindow.close(); this.popupWindow.destroy(); BX.onCustomEvent(window, 'Grid::confirmDialogApply', [this]); BX.unbind(window, 'keydown', hotKey); } } }), new BX.PopupWindowButtonLink({ text: action.CONFIRM_CANCEL_BUTTON, id: this.getContainerId() + '-confirm-dialog-cancel-button', events: { click: function() { BX.type.isFunction(cancel) ? cancel() : null; this.popupWindow.close(); this.popupWindow.destroy(); BX.onCustomEvent(window, 'Grid::confirmDialogCancel', [this]); BX.unbind(window, 'keydown', hotKey); } } }) ] } ); if (!dialog.isShown()) { dialog.show(); popupContainer = dialog.popupContainer; BX.removeClass(popupContainer, this.settings.get('classCloseAnimation')); BX.addClass(popupContainer, this.settings.get('classShowAnimation')); applyButton = BX(this.getContainerId() + '-confirm-dialog-apply-button'); cancelButton = BX(this.getContainerId() + '-confirm-dialog-cancel-button'); BX.bind(window, 'keydown', hotKey); } } else { BX.type.isFunction(then) ? then() : null; } function hotKey(event) { if (event.code === 'Enter') { event.preventDefault(); event.stopPropagation(); BX.fireEvent(applyButton, 'click'); } if (event.code === 'Escape') { event.preventDefault(); event.stopPropagation(); BX.fireEvent(cancelButton, 'click'); } } } }; })();