MetadataDnD.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. 2019, 2020
  6. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. */
  8. /**
  9. * @class VisDnD
  10. * @hideconstructor
  11. *
  12. * @classdesc Handles drag and drop of metadata to create a visualization.
  13. */
  14. define(['../../../../../lib/@waca/dashboard-common/dist/api/DnDProviderAPI', '../../../../../lib/@waca/dashboard-common/dist/core/APIFactory', 'underscore'], function (DnDProviderAPI, APIFactory, _) {
  15. var METADATA_TYPES = ['MODEL_ITEM', 'GRID_HEADER_ITEM'];
  16. return function () {
  17. function MetadataDnD() {
  18. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  19. _classCallCheck(this, MetadataDnD);
  20. this.features = options.features;
  21. var canvasDnD = this.features['CanvasDnD'];
  22. if (!canvasDnD) {
  23. throw new Error('MetadataDnD should depend on the CanvasDnD dashboard feature');
  24. }
  25. canvasDnD.registerProvider(this.getAPI());
  26. }
  27. MetadataDnD.prototype.getAPI = function getAPI() {
  28. if (!this.api) {
  29. this.api = APIFactory.createAPI(this, [DnDProviderAPI]);
  30. }
  31. return this.api;
  32. };
  33. MetadataDnD.prototype.destroy = function destroy() {
  34. this.api = null;
  35. };
  36. MetadataDnD.prototype.accepts = function accepts(payload, options) {
  37. return MetadataDnD.canAccepts(payload, options);
  38. };
  39. MetadataDnD.canAccepts = function canAccepts() {
  40. var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  41. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  42. var isValid = payload.data && payload.data.utils && payload.data.utils.isValid(options);
  43. return isValid && METADATA_TYPES.indexOf(payload.type) !== -1 ? true : false;
  44. };
  45. MetadataDnD.prototype.onDrop = function onDrop() {
  46. var payload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  47. if (!payload.data || !(METADATA_TYPES.indexOf(payload.type) !== -1)) {
  48. return null;
  49. }
  50. var dataItems = [];
  51. var localFilters = [];
  52. var droppedColumns = payload.data.columns ? payload.data.columns : [];
  53. var originalMetadataColumns = _.map(droppedColumns, function (column) {
  54. return column.original.metadataColumn;
  55. });
  56. var navPathIds = _.reduce(originalMetadataColumns, function (result, item) {
  57. var parent = item.getParent();
  58. var isDrillGroup = parent && parent.getObjectType() === 'DrillGroup';
  59. var navPathId = isDrillGroup && typeof parent.getIdentifier === 'function' ? parent.getId() : null;
  60. var itemId = item.getId();
  61. if (navPathId && itemId) {
  62. var currentNavPathID = {};
  63. currentNavPathID[itemId] = navPathId;
  64. return _.defaults(result, currentNavPathID);
  65. } else {
  66. return result;
  67. }
  68. }, {});
  69. var metadataColumns = _.map(droppedColumns, function (column) {
  70. return column.metadataColumn;
  71. });
  72. var columnIds = [];
  73. metadataColumns.forEach(function (metadataColumn) {
  74. if (metadataColumn.isFilter()) {
  75. localFilters.push({
  76. id: metadataColumn.getId(),
  77. columnId: metadataColumn.getId()
  78. });
  79. } else {
  80. columnIds.push(metadataColumn.getId());
  81. dataItems.push({
  82. itemId: metadataColumn.getId(),
  83. itemLabel: metadataColumn.getLabel()
  84. });
  85. }
  86. });
  87. //Now add selected members as local filters
  88. var columnsWithMembers = payload.data.utils.getColumnsWithMembers();
  89. metadataColumns.forEach(function (metadataColumn) {
  90. var useAsLocalFilters = columnsWithMembers[metadataColumn.getId()];
  91. if (useAsLocalFilters && useAsLocalFilters.length > 0) {
  92. var filter = {
  93. id: metadataColumn.getId(),
  94. columnId: metadataColumn.getId(),
  95. overrideHierarchyDefaultSelection: true,
  96. excludedValues: [],
  97. operator: 'in',
  98. type: null,
  99. binsLabel: metadataColumn.getLabel(),
  100. values: []
  101. };
  102. useAsLocalFilters.forEach(function (value) {
  103. filter.values.push({
  104. d: value.memberCaption,
  105. u: value.id
  106. });
  107. });
  108. localFilters.push(filter);
  109. }
  110. });
  111. var result = {
  112. type: 'live',
  113. data: {
  114. dataViews: [{
  115. modelRef: payload.data.sourceId,
  116. dataItems: dataItems
  117. }]
  118. }
  119. };
  120. if (localFilters.length > 0) {
  121. result.localFilters = localFilters;
  122. }
  123. // Go over the dataitems and insert the navpath id
  124. result.data.dataViews.forEach(function (dataView) {
  125. dataView.dataItems.forEach(function (dataItem) {
  126. dataItem.navigationPathId = navPathIds[dataItem.itemId] || null;
  127. });
  128. });
  129. return Promise.resolve(result);
  130. };
  131. return MetadataDnD;
  132. }();
  133. });
  134. //# sourceMappingURL=MetadataDnD.js.map