VisDndLiveWidgetProvider.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. 'use strict';
  2. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3. /**
  4. * Licensed Materials - Property of IBM
  5. * IBM Business Analytics (C) Copyright IBM Corp. 2020
  6. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. */
  8. /**
  9. * @class VisDndLiveWidgetProvider
  10. * @hideconstructor
  11. *
  12. * @classdesc Handles drag and drop of metadata to create a visualization.
  13. */
  14. define(['underscore', 'jquery', 'dashboard-analytics/widgets/livewidget/nls/StringResources'], function (_, $, StringResources) {
  15. return function () {
  16. function VisDndLiveWidgetProvider() {
  17. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  18. _classCallCheck(this, VisDndLiveWidgetProvider);
  19. this.dashboardAPI = options.dashboardAPI;
  20. this.dashboardDnD = options.dashboardDnD;
  21. this.content = options.content;
  22. this.visualization = options.visualization;
  23. this.state = options.state;
  24. this.visRecommender = options.visRecommender;
  25. this.visDnDUtils = options.visDnDUtils;
  26. this.transaction = options.transaction;
  27. }
  28. VisDndLiveWidgetProvider.prototype.destroy = function destroy() {
  29. this.dashboardAPI = null;
  30. this.dashboardDnD = null;
  31. this.content = null;
  32. this.visualization = null;
  33. this.state = null;
  34. this.visRecommender = null;
  35. this.visDnDUtils = null;
  36. this.transaction = null;
  37. };
  38. VisDndLiveWidgetProvider.prototype.isInvalidVisDefinition = function isInvalidVisDefinition(target) {
  39. var $errorContainer = $(target.info.node).find('.vis-sdk-error-container-wrapper');
  40. if ($errorContainer.length > 0) {
  41. return true;
  42. }
  43. var definition = this.visualization.getDefinition();
  44. return definition && definition.getState().getError() !== undefined;
  45. };
  46. /**
  47. * Adds the model filters among the mappings to the local filters.
  48. * @param metadataColumns an array of metadataColumns to be added to the visualization
  49. * @returns remaining mappings that are not a model filter
  50. */
  51. VisDndLiveWidgetProvider.prototype.addModelFilters = function addModelFilters(metadataColumns, transactionToken) {
  52. var modelFilters = [];
  53. var nonFilterMetadataColumns = _.filter(metadataColumns, function (metadataColumn) {
  54. if (metadataColumn.isFilter()) {
  55. modelFilters.push(metadataColumn.getId());
  56. return false;
  57. }
  58. return true;
  59. });
  60. if (modelFilters.length > 0) {
  61. this._setModelFilter(modelFilters, transactionToken);
  62. }
  63. return nonFilterMetadataColumns;
  64. };
  65. VisDndLiveWidgetProvider.prototype._setModelFilter = function _setModelFilter(modelfilterId, transactionToken) {
  66. var localFilters = this.visualization.getLocalFilters();
  67. modelfilterId = $.isArray(modelfilterId) ? modelfilterId : [modelfilterId];
  68. _.each(modelfilterId, function (id) {
  69. var itemContext = {
  70. id: id,
  71. itemId: id,
  72. filterType: 'filter'
  73. };
  74. localFilters.addFilter(itemContext, {} /* filterContext */, transactionToken);
  75. });
  76. };
  77. VisDndLiveWidgetProvider.prototype._addFiltersForMembers = function _addFiltersForMembers(filterSpecs, visualization, transactionToken) {
  78. if (!filterSpecs.length) {
  79. return;
  80. }
  81. var localFilters = visualization.getLocalFilters();
  82. var dataItemList = visualization.getSlots().getDataItemList();
  83. filterSpecs.forEach(function (spec) {
  84. //if dataItem is added to slot or visualization, then add filters,
  85. // if dataItem is not added due to any reason, do not add filters
  86. var filterColumnId = spec.itemContext.itemId;
  87. var dataItem = dataItemList.find(function (dataItem) {
  88. return dataItem.getColumnId() === filterColumnId;
  89. });
  90. if (dataItem) {
  91. if (spec.hasFilters) {
  92. localFilters.editFilter(spec.itemContext, spec.filterContext, transactionToken);
  93. } else {
  94. localFilters.addFilter(spec.itemContext, spec.filterContext, transactionToken);
  95. }
  96. }
  97. });
  98. };
  99. VisDndLiveWidgetProvider.prototype.supports = function supports(source, target) {
  100. return target.type === 'widget.live' && source.type !== 'widget';
  101. };
  102. VisDndLiveWidgetProvider.prototype.accepts = function accepts(source, target) {
  103. if (target && target.type === 'widget.live') {
  104. if (this.isInvalidVisDefinition(target)) {
  105. //No definitions so do not all metadata drag and drop
  106. return false;
  107. }
  108. if (this.content) {
  109. if (this.state && this.state.getError()) {
  110. return false;
  111. }
  112. }
  113. if ($(target.info.node).hasClass('liveWidgetPreview')) {
  114. return false;
  115. }
  116. if (this.content) {
  117. return this.visDnDUtils.accepts(source, target);
  118. }
  119. }
  120. return false;
  121. };
  122. VisDndLiveWidgetProvider.prototype.onDrop = function onDrop(source, target) {
  123. var _this = this;
  124. if (target.type !== 'widget.live') {
  125. return;
  126. }
  127. var visDef = this.visualization.getDefinition();
  128. if (visDef.getState().getError()) {
  129. return;
  130. }
  131. if (!this.visExpandMode || this.visExpandMode && !this.visExpandMode.onDrop(source)) {
  132. if (this.visRecommender) {
  133. var metadataPayload = this.visDnDUtils.onDrop(source);
  134. var droppedColumns = metadataPayload.columns;
  135. if (!this.visDnDUtils.validateSupportsOLAP(droppedColumns.map(function (c) {
  136. return c.metadataColumn;
  137. }))) {
  138. this.dashboardAPI.getFeature('Notification').setMessage(StringResources.get('visualizationDoesNotSupportOLAP'));
  139. return;
  140. }
  141. var metadataColumns = _.pluck(droppedColumns, 'metadataColumn');
  142. var transactionToken = this.transaction.startTransaction();
  143. // We add model filters first
  144. metadataColumns = this.addModelFilters(metadataColumns, transactionToken);
  145. var filterSpecsForMembers = [];
  146. if (metadataColumns.length) {
  147. filterSpecsForMembers = this.visDnDUtils.addMembersAsLocalFilters({
  148. visualizationAPI: this.visualization,
  149. columns: metadataPayload.columns,
  150. doUpdateFilters: false
  151. }, transactionToken);
  152. metadataColumns = _.pluck(droppedColumns, 'metadataColumn');
  153. }
  154. var endTransaction = function endTransaction() {
  155. // Add the filters for items that are add as dataitems
  156. _this._addFiltersForMembers(filterSpecsForMembers, _this.visualization, transactionToken);
  157. _this.transaction.endTransaction(transactionToken);
  158. };
  159. if (metadataColumns.length > 0) {
  160. var sourceId = source.data.sourceId;
  161. var dataSource = this.visualization.getDataSource();
  162. // Create a transcation so that we can bundle the dataSource id change with the mapping
  163. if (!dataSource || dataSource.getId() != sourceId) {
  164. this.visualization.setDataSource(sourceId, transactionToken);
  165. }
  166. // The viz might not support the datasource so it might not be set
  167. var isDataSourceSet = !!this.visualization.getDataSource();
  168. if (isDataSourceSet) {
  169. // remove all filters
  170. var dataItems = metadataColumns.filter(function (mc) {
  171. return !mc.isFilter();
  172. }).map(function (column) {
  173. return {
  174. columnId: column.getId()
  175. };
  176. });
  177. this.visRecommender.addDataItems(dataItems, transactionToken).finally(function () {
  178. endTransaction();
  179. });
  180. } else {
  181. endTransaction();
  182. }
  183. } else {
  184. endTransaction();
  185. }
  186. }
  187. }
  188. };
  189. return VisDndLiveWidgetProvider;
  190. }();
  191. });
  192. //# sourceMappingURL=VisDndLiveWidgetProvider.js.map