UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

369 lines (322 loc) • 14.3 kB
"use strict"; var $ = require("../../core/renderer"), eventsEngine = require("../../events/core/events_engine"), ArrayStore = require("../../data/array_store"), clickEvent = require("../../events/click"), noop = require("../../core/utils/common").noop, isDefined = require("../../core/utils/type").isDefined, inArray = require("../../core/utils/array").inArray, extend = require("../../core/utils/extend").extend, iteratorUtils = require("../../core/utils/iterator"), messageLocalization = require("../../localization/message"), registerComponent = require("../../core/component_registrator"), Widget = require("../widget/ui.widget"), headerFilter = require("../grid_core/ui.grid_core.header_filter_core"), columnStateMixin = require("../grid_core/ui.grid_core.column_state_mixin"), sortingMixin = require("../grid_core/ui.grid_core.sorting_mixin"), pivotGridUtils = require("./ui.pivot_grid.utils"), Sortable = require("./ui.sortable"), Deferred = require("../../core/utils/deferred").Deferred, inArray = inArray, each = iteratorUtils.each, IE_FIELD_WIDTH_CORRECTION = 1, DIV = "<div>"; var HeaderFilterView = headerFilter.HeaderFilterView.inherit({ _getSearchExpr: function _getSearchExpr(options) { options.useDefaultSearchExpr = true; return this.callBase(options); } }); var processItems = function processItems(groupItems, field) { var filterValues = [], isTree = !!field.groupName, isExcludeFilterType = field.filterType === "exclude"; if (field.filterValues) { each(field.filterValues, function (_, filterValue) { filterValues.push(Array.isArray(filterValue) ? filterValue.join("/") : filterValue && filterValue.valueOf()); }); } pivotGridUtils.foreachTree(groupItems, function (items) { var item = items[0], path = pivotGridUtils.createPath(items), preparedFilterValueByText = isTree ? iteratorUtils.map(items, function (item) { return item.text; }).reverse().join("/") : item.text, preparedFilterValue; item.value = isTree ? path.slice(0) : item.key || item.value; preparedFilterValue = isTree ? path.join("/") : item.value && item.value.valueOf(); if (item.children) { item.items = item.children; item.children = null; } headerFilter.updateHeaderFilterItemSelectionState(item, item.key && inArray(preparedFilterValueByText, filterValues) > -1 || inArray(preparedFilterValue, filterValues) > -1, isExcludeFilterType); }); }; function getMainGroupField(dataSource, sourceField) { var field = sourceField; if (isDefined(sourceField.groupIndex)) { field = dataSource.getAreaFields(sourceField.area, true)[sourceField.areaIndex]; } return field; } function getStringState(state) { return JSON.stringify([state.fields, state.columnExpandedPaths, state.rowExpandedPaths]); } var FieldChooserBase = Widget.inherit(columnStateMixin).inherit(sortingMixin).inherit(headerFilter.headerFilterMixin).inherit({ _getDefaultOptions: function _getDefaultOptions() { return extend(this.callBase(), { allowFieldDragging: true, applyChangesMode: "instantly", state: null, headerFilter: { width: 252, height: 325, texts: { emptyValue: messageLocalization.format("dxDataGrid-headerFilterEmptyValue"), ok: messageLocalization.format("dxDataGrid-headerFilterOK"), cancel: messageLocalization.format("dxDataGrid-headerFilterCancel") } } }); }, _init: function _init() { this.callBase(); this._headerFilterView = new HeaderFilterView(this); this._refreshDataSource(); this.subscribeToEvents(); }, _refreshDataSource: function _refreshDataSource() { var dataSource = this.option("dataSource"); if (dataSource && dataSource.fields && dataSource.load /* instanceof DX.ui.dxPivotGrid.DataSource */) { this._dataSource = dataSource; } }, _optionChanged: function _optionChanged(args) { switch (args.name) { case "dataSource": this._refreshDataSource(); break; case "applyChangesMode": break; case "state": if (this._skipStateChange || !this._dataSource) { break; } if (getStringState(this._dataSource.state()) === getStringState(args.value)) { this._clean(true); this._renderComponent(); } else { this._dataSource.state(args.value); } break; case "headerFilter": case "allowFieldDragging": this._invalidate(); break; default: this.callBase(args); } }, renderField: function renderField(field, showColumnLines) { var that = this, $fieldContent = $(DIV).addClass("dx-area-field-content").text(field.caption || field.dataField), $fieldElement = $(DIV).addClass("dx-area-field").addClass("dx-area-box").data("field", field).append($fieldContent), mainGroupField = getMainGroupField(that._dataSource, field); if (field.area !== "data") { if (field.allowSorting) { that._applyColumnState({ name: 'sort', rootElement: $fieldElement, column: { alignment: that.option("rtlEnabled") ? "right" : "left", sortOrder: field.sortOrder === 'desc' ? 'desc' : 'asc' }, showColumnLines: showColumnLines }); } that._applyColumnState({ name: 'headerFilter', rootElement: $fieldElement, column: { alignment: that.option("rtlEnabled") ? "right" : "left", filterValues: mainGroupField.filterValues, allowFiltering: mainGroupField.allowFiltering && !field.groupIndex }, showColumnLines: showColumnLines }); } if (field.groupName) { $fieldElement.attr("item-group", field.groupName); } return $fieldElement; }, _clean: function _clean() {}, _render: function _render() { this.callBase(); this._headerFilterView.render(this.$element()); }, renderSortable: function renderSortable() { var that = this; that._createComponent(that.$element(), Sortable, extend({ allowDragging: that.option("allowFieldDragging"), itemSelector: ".dx-area-field", itemContainerSelector: ".dx-area-field-container", groupSelector: ".dx-area-fields", groupFilter: function groupFilter() { var dataSource = that._dataSource, $sortable = $(this).closest(".dx-sortable"), pivotGrid = $sortable.data("dxPivotGrid"), pivotGridFieldChooser = $sortable.data("dxPivotGridFieldChooser"); if (pivotGrid) { return pivotGrid.getDataSource() === dataSource; } if (pivotGridFieldChooser) { return pivotGridFieldChooser.option("dataSource") === dataSource; } return false; }, itemRender: function itemRender($sourceItem, target) { var $item; if ($sourceItem.hasClass("dx-area-box")) { $item = $sourceItem.clone(); if (target === "drag") { each($sourceItem, function (index, sourceItem) { $item.eq(index).css("width", parseInt($(sourceItem).outerWidth(), 10) + IE_FIELD_WIDTH_CORRECTION); }); } } else { $item = $(DIV).addClass("dx-area-field").addClass("dx-area-box").text($sourceItem.text()); } if (target === "drag") { var wrapperContainer = $(DIV); each($item, function (_, item) { var wrapper = $("<div>").addClass("dx-pivotgrid-fields-container").addClass("dx-widget").append($(item)); wrapperContainer.append(wrapper); }); return wrapperContainer.children(); } return $item; }, onDragging: function onDragging(e) { var field = e.sourceElement.data("field"), targetGroup = e.targetGroup; e.cancel = false; if (field.isMeasure === true) { if (targetGroup === "column" || targetGroup === "row" || targetGroup === "filter") { e.cancel = true; } } else if (field.isMeasure === false && targetGroup === "data") { e.cancel = true; } }, useIndicator: true, onChanged: function onChanged(e) { var dataSource = that._dataSource, field = e.sourceElement.data("field"); e.removeSourceElement = !!e.sourceGroup; that._adjustSortableOnChangedArgs(e); if (field) { that._applyChanges([getMainGroupField(dataSource, field)], { area: e.targetGroup, areaIndex: e.targetIndex }); } } }, that._getSortableOptions())); }, _applyChanges: function _applyChanges(fields, props) { var _this = this; var dataSource = this._dataSource; if (this.option("applyChangesMode") === "instantly") { fields.forEach(function (_ref) { var index = _ref.index; dataSource.field(index, props); }); dataSource.load(); } else { fields.forEach(function (_ref2) { var index = _ref2.index; _this._changeState(index, props); }); } }, _changeState: function _changeState(fieldIndex, props) { var that = this, dataSource = that._dataSource, startState = dataSource.state(), state = that.option("state") || startState; dataSource.state(state, true); dataSource.field(fieldIndex, props); that.option("state", dataSource.state()); that._clean(true); that._renderComponent(); dataSource.state(startState, true); }, _adjustSortableOnChangedArgs: function _adjustSortableOnChangedArgs(e) { e.removeSourceElement = false; e.removeTargetElement = true; e.removeSourceClass = false; }, _getSortableOptions: function _getSortableOptions() { return { direction: "auto" }; }, subscribeToEvents: function subscribeToEvents(element) { var that = this, func = function func(e) { var field = $(e.currentTarget).data("field"), mainGroupField = extend(true, {}, getMainGroupField(that._dataSource, field)), isHeaderFilter = $(e.target).hasClass("dx-header-filter"), dataSource = that._dataSource; if (isHeaderFilter) { that._headerFilterView.showHeaderFilterMenu($(e.currentTarget), extend(mainGroupField, { type: mainGroupField.groupName ? 'tree' : 'list', encodeHtml: that.option("encodeHtml"), dataSource: { useDefaultSearch: true, // paginate: false, load: function load(options) { var userData = options.userData; if (userData.store) { return userData.store.load(options); } else { var d = new Deferred(); dataSource.getFieldValues(mainGroupField.index).done(function (data) { userData.store = new ArrayStore(data); userData.store.load(options).done(d.resolve).fail(d.reject); }).fail(d.reject); return d; } }, postProcess: function postProcess(data) { processItems(data, mainGroupField); return data; } }, apply: function apply() { that._applyChanges([mainGroupField], { filterValues: this.filterValues, filterType: this.filterType }); } })); } else if (field.allowSorting && field.area !== "data") { that._applyChanges([field], { sortOrder: field.sortOrder === "desc" ? "asc" : "desc" }); } }; if (element) { eventsEngine.on(element, clickEvent.name, ".dx-area-field.dx-area-box", func); return; } eventsEngine.on(that.$element(), clickEvent.name, ".dx-area-field.dx-area-box", func); }, _initTemplates: noop, addWidgetPrefix: function addWidgetPrefix(className) { return "dx-pivotgrid-" + className; } }); registerComponent("dxPivotGridFieldChooserBase", FieldChooserBase); module.exports = FieldChooserBase;