RuntimeEnvironment.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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. 2020
  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', '../../lib/@waca/core-client/js/core-client/ui/core/Events', '../impl/Dashboard', '../../dashboard/glass/services/DashboardGlassContext', '../deprecated/CanvasAPI', '../../dashboard/layout/authoring/interaction/Controller', '../../dashboard/model/BoardModelFactory', '../../dashboard/widgets/WidgetRegistry', 'jquery', 'underscore'], function (ClassFactory, Events, DashboardController, DashboardGlassContext, DeprecatedCanvasAPI, Controller, BoardModelFactory, WidgetRegistry, $, _) {
  9. /**
  10. * Dashboard service that can be used to provide a dashboard runtime environment
  11. * that is needed to run code that is dashboard dependant (e.g. live widget) but without a dashboard Perspective
  12. * The service will require the dashboard perspective json, and use it to provide all the needed extensions and collections
  13. */
  14. var RuntimeEnvironment = function () {
  15. function RuntimeEnvironment(bootstrapFeatures) {
  16. _classCallCheck(this, RuntimeEnvironment);
  17. this.bootstrapFeatures = bootstrapFeatures;
  18. this.logger = this.bootstrapFeatures['Logger'].getAPI();
  19. //TODO: Convert all dependencies to use glass features instead of the glassContext
  20. this.glassFeature = this.bootstrapFeatures['Glass'].getAPI();
  21. }
  22. RuntimeEnvironment.prototype._getCSSLinks = function _getCSSLinks(model) {
  23. var links = document.getElementsByTagName('link');
  24. var loaded = {};
  25. Array.from(links).forEach(function (item) {
  26. loaded[item.getAttribute('href')] = true;
  27. loaded[item.getAttribute('href').split('?')[0]] = true;
  28. });
  29. var cssStyles = [];
  30. if (model.cssStyles) {
  31. model.cssStyles.forEach(function (style) {
  32. if (!loaded[style]) {
  33. cssStyles.push(style);
  34. }
  35. });
  36. }
  37. return cssStyles;
  38. };
  39. RuntimeEnvironment.prototype._registerBootstrapFeatures = function _registerBootstrapFeatures(featureLoader) {
  40. var _this = this;
  41. Object.keys(this.bootstrapFeatures).forEach(function (featureName) {
  42. featureLoader.registerFeature(featureName, _this.bootstrapFeatures[featureName], undefined, true);
  43. });
  44. };
  45. RuntimeEnvironment.prototype.getRuntimeEnvironment = function getRuntimeEnvironment(options, cbGetDefaultSpec) {
  46. var _this2 = this;
  47. return this.glassFeature.getCoreService('.Perspective').getModel('dashboard').then(function (model) {
  48. // Load all required classes and create the services.
  49. return Promise.all(['dashboard-core/js/dashboard/services/ServicesHelper', 'dashboard-core/js/extension/Extensions', 'dashboard-core/js/canvas/CanvasFactory', 'dashboard-core/js/dashboard/loader/BoardLoaderHelper'].map(function (path) {
  50. return ClassFactory.loadModule(path);
  51. })).then(function (_ref) {
  52. var _ServicesHelper = _ref[0],
  53. _ExtensionsHelper = _ref[1],
  54. CanvasFactory = _ref[2],
  55. _BoardModelHelper = _ref[3];
  56. var eventRouter = new Events();
  57. var ServicesHelper = _this2._serviceHelperClass || _ServicesHelper;
  58. var ExtensionsHelper = _this2._extensionsHelperClass || _ExtensionsHelper;
  59. var BoardModelHelper = _this2._boardModelHelperClass || _BoardModelHelper;
  60. var glassContext = _this2.bootstrapFeatures['Glass'].getAPI('internal').getGlassContext();
  61. _this2.dashboardGlassContext = new DashboardGlassContext({ model: model, glassContext: glassContext });
  62. var whenDashboardReady = null;
  63. var canvas = void 0;
  64. var boardView = {
  65. // TODO: this needs to be refactored
  66. // When dashboardRuntime service is invoked from outside of dashboard (where no canvas is present)
  67. // we still need to make sure the consumers get a canvas API (even though empty), or that might
  68. // prevent them from getting access to the runtime entirely.
  69. getDeprecatedCanvasWhenReady: function getDeprecatedCanvasWhenReady() {
  70. return whenDashboardReady.then(function () {
  71. return canvas;
  72. });
  73. },
  74. getDeprecatedCanvas: function getDeprecatedCanvas() {
  75. return canvas;
  76. },
  77. canAuthor: function canAuthor() {
  78. return false;
  79. },
  80. getBoardInfo: function getBoardInfo() {
  81. return {
  82. type: 'exploration'
  83. };
  84. },
  85. getContent: function getContent() {
  86. return {};
  87. },
  88. setPermissions: function setPermissions() {},
  89. setSavedInstance: function setSavedInstance() {}
  90. };
  91. var widgetRegistry = new WidgetRegistry();
  92. var dashboardController = new DashboardController({
  93. glassContext: _this2.dashboardGlassContext,
  94. view: boardView,
  95. eventRouter: eventRouter,
  96. appSettings: model.content,
  97. widgetRegistry: widgetRegistry,
  98. featuresOverride: options && options.featuresOverride
  99. });
  100. var internalDashboardAPI = dashboardController.getInternalAPI();
  101. var dashboardApi = dashboardController.getAPI();
  102. var servicesHelper = new ServicesHelper({
  103. appSettings: model.content,
  104. logger: _this2.logger,
  105. glassContext: _this2.dashboardGlassContext,
  106. dashboardAPI: dashboardApi,
  107. internalDashboardAPI: internalDashboardAPI
  108. });
  109. var services = servicesHelper.createServices();
  110. _this2.dashboardGlassContext.setServices(services.serviceRegistry);
  111. dashboardController.setServices(services.serviceRegistry);
  112. dashboardController.setFeatureLoader(services.featureLoader);
  113. var boardSpec = void 0,
  114. assetId = void 0;
  115. if (!options) {
  116. boardSpec = cbGetDefaultSpec();
  117. } else {
  118. boardSpec = options.spec;
  119. assetId = options.assetId;
  120. }
  121. var extensionsHelper = new ExtensionsHelper(dashboardApi);
  122. var boardModelFactory = void 0;
  123. var env = {
  124. internalDashboardAPI: internalDashboardAPI,
  125. dashboardApi: dashboardApi,
  126. glassContext: _this2.dashboardGlassContext,
  127. services: services,
  128. serviceRegistry: services.serviceRegistry,
  129. eventRouter: eventRouter,
  130. cssStyles: _this2._getCSSLinks(model),
  131. widgetRegistry: widgetRegistry,
  132. dashboardFeatureLoader: services.featureLoader
  133. };
  134. whenDashboardReady = widgetRegistry.initialize(dashboardApi).then(function () {
  135. boardModelFactory = new BoardModelFactory({
  136. dashboardAPI: dashboardApi,
  137. glassContext: glassContext,
  138. boardSpec: boardSpec,
  139. extensions: extensionsHelper,
  140. stringResources: dashboardApi.getDashboardCoreSvc('.StringResources'),
  141. eventRouter: eventRouter,
  142. logger: _this2.logger,
  143. boardId: assetId,
  144. widgetRegistry: widgetRegistry
  145. });
  146. }).then(extensionsHelper.load.bind(extensionsHelper)).then(function () {
  147. env.boardModelExtensions = extensionsHelper.getBoardModelExtensions();
  148. env.layoutExtensions = extensionsHelper.getLayoutViewExtensions() || {};
  149. env.canvasExtensions = extensionsHelper.getCanvasExtensions() || [];
  150. }).then(function () {
  151. return boardModelFactory.createBoardModel();
  152. }).then(function (boardModelInfo) {
  153. env.boardModel = boardModelInfo.boardModel;
  154. boardView.boardModel = env.boardModel;
  155. }).then(_this2._registerBootstrapFeatures.bind(_this2, dashboardController.featureLoader)).then(servicesHelper.createRuntimeServices.bind(servicesHelper, { dashboardApi: dashboardApi })).then(function () {
  156. dashboardController.createContent(env.boardModel);
  157. }).then(function () {
  158. var factory = new CanvasFactory({
  159. dashboardAPI: dashboardApi,
  160. services: env.serviceRegistry,
  161. extensions: extensionsHelper,
  162. glassContext: env.glassContext,
  163. eventRouter: env.eventRouter,
  164. appSettings: {},
  165. logger: _this2.logger,
  166. boardModel: env.boardModel,
  167. featureLoader: services.featureLoader,
  168. dashboardContent: dashboardController.getContent()
  169. });
  170. return factory.createCanvas().then(function (factoryResponse) {
  171. canvas = _.extend(new DeprecatedCanvasAPI(), factoryResponse.canvas);
  172. // Add the canvas to the environment
  173. env.canvas = canvas;
  174. env.internalCanvas = factoryResponse.internalCanvas;
  175. // TODO: evaluate where we use this and if we need this stored on the instance or not
  176. _this2.interactionController = new Controller({
  177. dashboardAPI: env.dashboardApi,
  178. toolbarConfig: env.dashboardApi.getAppConfig('toolbar'),
  179. transaction: env.dashboardApi.getFeature('Transaction'),
  180. canvas: env.canvas,
  181. services: env.serviceRegistry,
  182. glassContext: env.glassContext,
  183. boardModel: env.boardModel,
  184. layoutController: null,
  185. eventRouter: env.eventRouter,
  186. $el: $('body'),
  187. appSettings: {}
  188. });
  189. var boardModelHelper = new BoardModelHelper(env.dashboardApi);
  190. boardModelHelper.createBoardServices({
  191. boardModel: env.boardModel
  192. });
  193. return env;
  194. });
  195. });
  196. return whenDashboardReady;
  197. });
  198. });
  199. };
  200. return RuntimeEnvironment;
  201. }();
  202. return RuntimeEnvironment;
  203. });
  204. //# sourceMappingURL=RuntimeEnvironment.js.map