Extensions.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 Cognos Products: BI Cloud (C) Copyright IBM Corp. 2018
  6. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. */
  8. define(['../lib/@waca/core-client/js/core-client/utils/ClassFactory', 'underscore'], function (ClassFactory, _) {
  9. /**
  10. * Helper class used to create the required dashboard extensions.
  11. * This includes the board model, layout and canvas extensions as well as the dashboard service extensions.
  12. */
  13. var Extensions = function () {
  14. function Extensions(dashboardApi) {
  15. _classCallCheck(this, Extensions);
  16. this.dashboardApi = dashboardApi;
  17. this.logger = this.dashboardApi.getGlassCoreSvc('.Logger');
  18. this.consumeViews = {
  19. absolute: 'dashboard-core/js/dashboard/layout/views/LayoutBaseView',
  20. genericPage: 'dashboard-core/js/dashboard/layout/views/GenericPage',
  21. tab: 'dashboard-core/js/dashboard/layout/views/Tab',
  22. hub: 'dashboard-core/js/dashboard/layout/views/Tab',
  23. longscroll: 'dashboard-core/js/dashboard/layout/views/Tab',
  24. group: 'dashboard-core/js/dashboard/layout/views/LayoutBaseView',
  25. singlePage: 'dashboard-core/js/dashboard/layout/views/SinglePage'
  26. };
  27. this.authoringViews = {
  28. absolute: 'dashboard-core/js/dashboard/layout/authoring/views/Absolute',
  29. tab: 'dashboard-core/js/dashboard/layout/authoring/views/Tab',
  30. hub: 'dashboard-core/js/dashboard/layout/authoring/views/Tab',
  31. longscroll: 'dashboard-core/js/dashboard/layout/authoring/views/Tab',
  32. group: 'dashboard-core/js/dashboard/layout/authoring/views/Group',
  33. templateDropZone: 'dashboard-core/js/dashboard/layout/authoring/views/TemplateDropZone',
  34. templateIndicator: 'dashboard-core/js/dashboard/layout/authoring/views/TemplateIndicator',
  35. scalingAbsolute: 'dashboard-core/js/dashboard/layout/authoring/views/ScalingAbsolute',
  36. genericPage: 'dashboard-core/js/dashboard/layout/authoring/views/GenericPage',
  37. container: 'dashboard-core/js/dashboard/layout/authoring/views/TemplateContainer',
  38. singlePage: 'dashboard-core/js/dashboard/layout/authoring/views/SinglePage'
  39. };
  40. }
  41. Extensions.prototype.getBoardModelExtensions = function getBoardModelExtensions() {
  42. return this.boardModelExtensions;
  43. };
  44. Extensions.prototype.getLayoutModelExtensions = function getLayoutModelExtensions() {
  45. return this.layoutExtensions && this.layoutExtensions.modelExtensions;
  46. };
  47. Extensions.prototype.getLayoutViewExtensions = function getLayoutViewExtensions() {
  48. if (!this.layoutViewExtensions) {
  49. var consumeViews = this.layoutExtensions && this.layoutExtensions.consumeViews;
  50. if (consumeViews) {
  51. Object.keys(consumeViews).forEach(function (key) {
  52. this.consumeViews[key] = consumeViews[key];
  53. }.bind(this));
  54. }
  55. var authoringViews = this.layoutExtensions && this.layoutExtensions.authoringViews;
  56. if (authoringViews) {
  57. Object.keys(authoringViews).forEach(function (key) {
  58. this.authoringViews[key] = authoringViews[key];
  59. }.bind(this));
  60. }
  61. this.layoutViewExtensions = {
  62. authoringViews: this.authoringViews,
  63. consumeViews: this.consumeViews,
  64. modelExtensions: this.layoutExtensions && this.layoutExtensions.modelExtensions
  65. };
  66. }
  67. return this.layoutViewExtensions;
  68. };
  69. Extensions.prototype.getCanvasExtensions = function getCanvasExtensions() {
  70. return this.canvasExtensions;
  71. };
  72. Extensions.prototype.load = function load() {
  73. var _this = this;
  74. return this.loadLayoutAndCanvasExtensions().then(function (extensions) {
  75. _this.layoutExtensions = extensions[0];
  76. _this.canvasExtensions = extensions[1];
  77. return _this.loadBoardModelExtensions().then(function (boardModelExtensions) {
  78. _this.boardModelExtensions = boardModelExtensions;
  79. });
  80. });
  81. };
  82. Extensions.prototype.loadLayoutAndCanvasExtensions = function loadLayoutAndCanvasExtensions() {
  83. return Promise.all([this._getLayoutExtensions(), this._getCanvasExtensions()]).then(function (result) {
  84. return result;
  85. }.bind(this));
  86. };
  87. Extensions.prototype._getLayoutExtensions = function _getLayoutExtensions() {
  88. var _this2 = this;
  89. var promise = Promise.resolve();
  90. var layoutExtensions = this.dashboardApi.getCollectionConfig('layoutExtension');
  91. if (layoutExtensions) {
  92. var collectionId = layoutExtensions.id;
  93. promise = Promise.all([this.dashboardApi.findGlassCollection(collectionId)]).then(function (collections) {
  94. var collection = collections[0] || [];
  95. return _this2.loadLayoutModelExtensions(collection);
  96. });
  97. }
  98. return promise;
  99. };
  100. Extensions.prototype.loadLayoutModelExtensions = function loadLayoutModelExtensions(collections) {
  101. var combinedExtensions = this._combineLayoutModelExtensions(collections);
  102. return this._loadModelExtensions(combinedExtensions);
  103. };
  104. Extensions.prototype._combineLayoutModelExtensions = function _combineLayoutModelExtensions(collection) {
  105. var combinedExtensions = {};
  106. //this is where it gets squirrely, we should edevour to simplify this... Yeah, and when monkeys fly
  107. collection.forEach(function (entry) {
  108. var extensions = entry.extensions;
  109. Object.keys(extensions).forEach(function (key) {
  110. var layoutMode = extensions[key];
  111. if (!combinedExtensions[key]) {
  112. combinedExtensions[key] = {};
  113. }
  114. Object.keys(layoutMode).forEach(function (layoutKey) {
  115. combinedExtensions[key][layoutKey] = layoutMode[layoutKey];
  116. });
  117. });
  118. });
  119. return combinedExtensions;
  120. };
  121. Extensions.prototype._loadModelExtensions = function _loadModelExtensions(layoutExtensions) {
  122. var _this3 = this;
  123. var modelExtensions = layoutExtensions.modelExtensions;
  124. if (modelExtensions) {
  125. return Promise.all(Object.keys(modelExtensions).map(function (key) {
  126. return ClassFactory.loadModule(modelExtensions[key]).then(function (module) {
  127. var _ref;
  128. return _ref = {}, _ref[key] = module, _ref;
  129. }).catch(function (err) {
  130. _this3.logger.error(err);
  131. return {};
  132. });
  133. })).then(function (results) {
  134. // each array member contains a single key/value so we merge them all into 1 object;
  135. layoutExtensions.modelExtensions = _.extend.apply(_, results);
  136. return layoutExtensions;
  137. });
  138. }
  139. return Promise.resolve(layoutExtensions);
  140. };
  141. Extensions.prototype._getCanvasExtensions = function _getCanvasExtensions() {
  142. var promise;
  143. var canvasExtension = this.dashboardApi.getCollectionConfig('canvasExtension');
  144. if (canvasExtension) {
  145. var collectionId = canvasExtension.id;
  146. promise = Promise.all([this.dashboardApi.findGlassCollection(collectionId)]).then(function (collections) {
  147. var canvasExtensions = [];
  148. if (collections.length > 0 && collections[0]) {
  149. collections[0].forEach(function (collection) {
  150. canvasExtensions.push(collection);
  151. }.bind(this));
  152. }
  153. return canvasExtensions;
  154. }.bind(this));
  155. }
  156. return promise || Promise.resolve();
  157. };
  158. Extensions.prototype.loadBoardModelExtensions = function loadBoardModelExtensions() {
  159. var boardModelCollection = this.dashboardApi.getCollectionConfig('boardModel');
  160. var collectionId = boardModelCollection.id;
  161. return this.dashboardApi.findGlassCollection(collectionId).then(function (extensionCollection) {
  162. return this._loadBoardModelExtensions(extensionCollection);
  163. }.bind(this));
  164. };
  165. Extensions.prototype._loadBoardModelExtensions = function _loadBoardModelExtensions(extensionCollection) {
  166. if (!extensionCollection) {
  167. return;
  168. }
  169. var promises = [];
  170. extensionCollection.forEach(function (extensionObj) {
  171. if (!extensionObj.name || !extensionObj.class) {
  172. return;
  173. }
  174. promises.push(ClassFactory.loadModule(extensionObj.class).then(function (ModelExtension) {
  175. return {
  176. 'name': extensionObj.name,
  177. 'type': extensionObj.type || 'model',
  178. 'class': ModelExtension,
  179. 'triggers': extensionObj.triggers || [],
  180. // backward compatible default is true unless value is explicitly false.
  181. 'autoCreate': extensionObj.autoCreate !== false
  182. };
  183. }.bind(this)).catch(function (error) {
  184. this.logger.error(error);
  185. }.bind(this)));
  186. }, this);
  187. return Promise.all(promises).then(function (results) {
  188. // Failed promises will return an undefined extension in the results. Make sure we filter it out
  189. return results.filter(function (n) {
  190. return n != undefined;
  191. });
  192. });
  193. };
  194. return Extensions;
  195. }();
  196. return Extensions;
  197. });
  198. //# sourceMappingURL=Extensions.js.map