123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- 'use strict';
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
- /**
- * Licensed Materials - Property of IBM
- * IBM Business Analytics (C) Copyright IBM Corp. 2020
- * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
- /**
- * @class VisDnDUtils
- * @hideconstructor
- *
- * @classdesc Utility feature for drag and drop of metadata onto a visualization content
- */
- define(['underscore', '../../../lib/@waca/dashboard-common/dist/core/APIFactory', './api/VisDnDUtilsAPI', './OlapHelper.v2', './LocalFilterMemberDNDHelper', './VisMapColumnsToSlot', 'dashboard-analytics/dataSources/utils/ShapingUIUtils', './api/impl/VisDnDColumnToSlotProvider', './api/impl/VisDnDSlotToSlotProvider', './api/impl/VisDnDShapeToSlotProvider', './api/impl/VisDnDSlotLocalFilterProvider', './api/impl/VisDndLiveWidgetProvider', 'dashboard-analytics/dataSources/utils/ShapingConstants', 'dashboard-analytics/apiHelpers/SlotAPIHelper'], function (_, APIFactory, VisDnDUtilsAPI, OlapHelperV2, LocalFilterMemberDNDHelper, VisMapColumnsToSlot, ShapingUIUtils, VisDnDColumnToSlotProvider, VisDnDSlotToSlotProvider, VisDnDShapeToSlotProvider, VisDnDSlotLocalFilterProvider, VisDndLiveWidgetProvider, ShapingConstants, SlotAPIHelper) {
- var METADATA_TYPES = ['MODEL_ITEM', 'GRID_HEADER_ITEM', 'filter' // Used for FM package model filters ?
- ];
- var VisDnDUtils = function () {
- function VisDnDUtils(_ref) {
- var features = _ref.features,
- content = _ref.content;
- _classCallCheck(this, VisDnDUtils);
- this.content = content;
- this.dashboard = features['API'];
- this.dashboardDnD = features['Dashboard.DashboardDnd'];
- this.transaction = features['Dashboard.Transaction'];
- this.datasources = features['Dashboard.DataSources'];
- this.datasourcesMoser = features['Dashboard.DataSources.moser'];
- this.state = features['state'];
- this.visualization = features['Visualization'];
- this.visRecommender = features['Visualization.SmartsRecommender'];
- this.visDnD = features['VisDnD'];
- this.olapHelper = new OlapHelperV2(this.dashboard, this.visualization);
- this.visMapColumnsToSlot = new VisMapColumnsToSlot({
- content: this.content,
- visualization: this.visualization,
- transaction: this.transaction
- });
- this._initializeProviders();
- }
- VisDnDUtils.prototype.getAPI = function getAPI() {
- if (!this.api) {
- this.api = APIFactory.createAPI(this, [VisDnDUtilsAPI]);
- }
- return this.api;
- };
- VisDnDUtils.prototype._initializeProviders = function _initializeProviders() {
- var param = {
- visDnDUtils: this,
- dashboardAPI: this.dashboard,
- dashboardDnD: this.dashboardDnD,
- datasources: this.datasources,
- datasourcesMoser: this.datasourcesMoser,
- transaction: this.transaction,
- content: this.content,
- state: this.state,
- visualization: this.visualization,
- visRecommender: this.visRecommender
- };
- // Register the all livewidget providers
- var shapeToSlotProvider = new VisDnDShapeToSlotProvider(param);
- this.visDnD.registerProviders('widget.live', [new VisDndLiveWidgetProvider(param), shapeToSlotProvider], ['slot.item']);
- // Register the all slot.item providers
- var slotItemProviders = [VisDnDColumnToSlotProvider, VisDnDSlotToSlotProvider].map(function (ProviderClass) {
- return new ProviderClass(param);
- });
- this.visDnD.registerProviders('slot.item', [].concat(slotItemProviders, [shapeToSlotProvider]));
- // Register the slot.filter provider
- this.visDnD.registerProviders('slot.filter', [new VisDnDSlotLocalFilterProvider(param)]);
- };
- VisDnDUtils.prototype.destroy = function destroy() {
- this.dashboard = null;
- this.content = null;
- this.transaction = null;
- this.visualization = null;
- this.olapHelper = null;
- this.visMapColumnsToSlot = null;
- };
- VisDnDUtils.prototype._isSameDataSource = function _isSameDataSource(dragData) {
- var sourceId = dragData.sourceId;
- var dataSource = this.visualization.getDataSource();
- var currentModuleId = dataSource ? dataSource.getId() : null;
- return currentModuleId && sourceId !== currentModuleId ? false : true;
- };
- /**
- * return all the projected dataItems except MultiMeasure item.
- */
- VisDnDUtils.prototype._getProjectedDataItemList = function _getProjectedDataItemList() {
- if (!this.visualization) {
- throw new Error('Invalid visualization');
- }
- var dataItemList = this.visualization.getSlots().getDataItemList();
- dataItemList = dataItemList.filter(function (dataItem) {
- return dataItem.getColumnId() !== SlotAPIHelper.MULTI_MEASURES_SERIES;
- });
- return dataItemList.map(function (dataItem) {
- return dataItem.getMetadataColumn();
- });
- };
- VisDnDUtils.prototype._acceptsOlapColumnsV2 = function _acceptsOlapColumnsV2(payload, _ref2) {
- var dropTarget = _ref2.dropTarget,
- dropAction = _ref2.dropAction;
- var metadataColumns = _.map(payload.data.columns, function (column) {
- return column.metadataColumn;
- });
- if (dropTarget === ShapingConstants.DROP_TARGET_OPTIONS.FILTER || !metadataColumns.some(function (col) {
- return col.isOlapColumn();
- })) {
- return true;
- }
- var targetSlotId = void 0;
- var position = void 0,
- bReplace = void 0;
- if (dropAction) {
- //When dnd hover on crosstab, GridDnDManager composes dropAction and call VisDnD.accepts()
- position = dropAction.actionSpec.position;
- bReplace = dropAction.actionSpec.replace;
- var targetSlotAPI = dropAction.actionSpec.slot;
- targetSlotId = targetSlotAPI.getDefinition().getId();
- } else {
- return true;
- }
- return this.acceptsOlapV2({
- targetSlotId: targetSlotId,
- sourceSlotId: undefined,
- indexInSourceSlot: undefined,
- sourceColumns: metadataColumns,
- indexInTargetSlot: position,
- isReplace: bReplace
- });
- };
- VisDnDUtils.prototype.accepts = function accepts() {
- var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- //No visualizationAPI return false
- //No metadata provided return false
- if (!this.visualization || !payload.data || !this._isSameDataSource(payload.data)) {
- return false;
- }
- // No restrictions need to be applied when drop target is filter.
- var checkHierarchy = !options || options.dropTarget !== ShapingConstants.DROP_TARGET_OPTIONS.FILTER;
- if (checkHierarchy) {
- /**
- * Map of hierarchies used to check if the dragObject follows the drop rules.
- */
- var oHierarchyMap = {};
- var metadataColumns = _.map(payload.data.columns, function (columns) {
- return columns.metadataColumn;
- });
- var metadataColumnsWithMembers = payload.data.utils && payload.data.utils.getColumnsWithMembers();
- // Check the metadata item(s) in dragObject
- if (!metadataColumns) {
- return false;
- }
- if (ShapingUIUtils.isInvalidDragObject(metadataColumns, oHierarchyMap, metadataColumnsWithMembers)) {
- return false;
- }
- // Check dragObject with widget metadata
- // Members from the same hierarchy can only be dropped to same slot.
- var projectedMetadataColumns = this._getProjectedDataItemList();
- if (options.dropTarget === ShapingConstants.DROP_TARGET_OPTIONS.SLOT) {
- var slotMetadataColumnIds = [];
- if (options.targetNode) {
- var slotId = options.targetNode.getAttribute('data-slot-id');
- var slotDataItemList = slotId && this.visualization.getSlots().getSlot(slotId).getDataItemList();
- slotMetadataColumnIds = _.map(slotDataItemList, function (dataItem) {
- return dataItem.getColumnId() !== SlotAPIHelper.MULTI_MEASURES_SERIES;
- }).filter(Boolean);
- }
- // Get restricted columns that are not in the target slot
- var columnsNotInTargetSlot = slotMetadataColumnIds.length ? _.filter(projectedMetadataColumns, function (column) {
- return slotMetadataColumnIds.indexOf(column.getId()) === -1;
- }) : projectedMetadataColumns;
- // Restrict any metadata object from the same hierarchy to be dropped to a different slot
- var dragColumnProjected = _.some(columnsNotInTargetSlot, function (column) {
- return _.some(metadataColumns, function (dragColumn) {
- return column.getId() === dragColumn.getId() && (column.isHierarchy() || column.isNamedSet());
- });
- });
- if (dragColumnProjected) {
- return false;
- }
- }
- if (ShapingUIUtils.isInvalidDragObject(projectedMetadataColumns, oHierarchyMap, null, /** metadataColumnsExist */true)) {
- return false;
- }
- }
- var expandCollapseFeatureFlag = !this.dashboard.getGlassCoreSvc('.FeatureChecker').checkValue('dashboard', 'expandCollapse', 'disabled');
- if (expandCollapseFeatureFlag && this.visualization.getType() === 'Crosstab') {
- if (!this._acceptsOlapColumnsV2(payload, options)) {
- return false;
- }
- }
- return payload.data && payload.data.utils && payload.data.utils.isValid(options) && METADATA_TYPES.indexOf(payload.type) !== -1 ? true : false;
- };
- VisDnDUtils.prototype.onDrop = function onDrop(payload) {
- return METADATA_TYPES.indexOf(payload.type) !== -1 ? payload.data : null;
- };
- VisDnDUtils.prototype.mapColumns = function mapColumns(slotId, droppedColumns, options, transactionToken) {
- return this.visMapColumnsToSlot.mapColumns(slotId, droppedColumns, options, transactionToken);
- };
- VisDnDUtils.prototype.acceptsOlapV2 = function acceptsOlapV2(params) {
- return this.olapHelper.acceptsOlapV2(params);
- };
- VisDnDUtils.prototype.addMembersAsLocalFilters = function addMembersAsLocalFilters() {
- var _this = this;
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var transactionToken = arguments[1];
- var dataItemList = options.slotAPI ? options.slotAPI.getDataItemList() : this.visualization.getSlots().getDataItemList();
- var columns = options.columns ? options.columns.slice() : [];
- var removedExistingDataItem = options.columns || [];
- var _removeResultFn = function (index) {
- if (index > -1 && index < columns.length) {
- removedExistingDataItem.splice(index, 1);
- }
- }.bind(this);
- var localFiltersSpec = [];
- columns.forEach(function (column) {
- var newLocalFilters = column.original.members;
- if (newLocalFilters && newLocalFilters.length) {
- var hasMappedDatItem = LocalFilterMemberDNDHelper.hasDataItem(dataItemList, column.metadataColumn.getId());
- var itemContext = LocalFilterMemberDNDHelper.getItemContext(dataItemList, column.original.metadataColumn);
- LocalFilterMemberDNDHelper.addOrUpdateFilter({
- bReplace: options.bReplace,
- itemContext: itemContext,
- localFilters: _this.visualization.getLocalFilters(),
- newLocalFilters: newLocalFilters,
- localFiltersSpec: localFiltersSpec,
- doUpdateFilters: options.doUpdateFilters
- }, transactionToken);
- var appendMembersToExistingDataItem = hasMappedDatItem && !options.bReplace;
- if (appendMembersToExistingDataItem) {
- removedExistingDataItem.forEach(function (col, index) {
- if (column.metadataColumn.getId() === col.metadataColumn.getId()) {
- _removeResultFn(index);
- return;
- }
- });
- }
- }
- });
- return localFiltersSpec;
- };
- VisDnDUtils.prototype.exceedsItemsLimit = function exceedsItemsLimit(countOfItemsToDrop, indexInSlot, addAfter, slot) {
- var limit = slot.getDefinition().getMaxItems();
- if (typeof limit !== 'number' || limit < 0) {
- // no limit verification if maxItems is null or undefined or something else than a positive number (0 is considered as positive in this function)
- return false;
- }
- var mappedItems = slot.getDataItemList().length;
- //When dropping on top of an existing slot dataItem, we replace it with the items we're dropping.
- //EXCEPTION....for index===-1, we always add to the existing set of items.
- //indexInSlot===-1 means add at the end.
- //indexInSlot===-1 and addAfter = true means add at the beginning.
- var mappedItemsAfterDrop = countOfItemsToDrop + mappedItems - (addAfter || indexInSlot === -1 ? 0 : 1);
- return mappedItemsAfterDrop > limit;
- };
- VisDnDUtils.prototype.validateSupportsOLAP = function validateSupportsOLAP(metadataColumns) {
- var supported = true;
- var visDefinition = this.visualization.getDefinition();
- if (visDefinition.getProperty('supportsOLAP') === false) {
- metadataColumns && metadataColumns.forEach(function (metadataColumn) {
- if (metadataColumn.isOlapColumn() || metadataColumn.isNamedSet()) {
- supported = false;
- }
- });
- }
- return supported;
- };
- return VisDnDUtils;
- }();
- return VisDnDUtils;
- });
- //# sourceMappingURL=VisDnDUtils.js.map
|