123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- 'use strict';
- /*
- * Licensed Materials - Property of IBM
- * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2014, 2020
- * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
- define(['../../lib/@waca/core-client/js/core-client/ui/core/Class', 'jquery', '../../canvas/CanvasFactory', './WidgetLoader', '../../lib/@waca/core-client/js/core-client/utils/ClassFactory', './DeploymentReferencesUtil', 'underscore', '../../extension/Extensions', './BoardLoaderHelper', '../../lib/@waca/core-client/js/core-client/utils/Deferred'], function (BaseClass, $, CanvasFactory, WidgetLoader, ClassFactory, DeploymentReferencesUtil, _, Extensions, BoardLoaderHelper, Deferred) {
- /**
- * The board loader's responsibility is to load a dashboard. The board loader will be used in two main scenarios:
- *
- * 1. Loading a board from within the Gemini app (e.g from the homepage)
- * 2. Loading a board directly from a URL
- *
- * @param options
- *
- * boardSpec The board specification if avaialble, otherwise the spec will be fetched using the board ID
- * boardId The board ID used to fetch the spec
- * isAuthoringMode Set to true if the board is being loaded in authoring mode
- * el The element to render the board layout to
- * isLayoutRendered Set to false if the board's layout hasn't already been rendered
- *
- */
- var BoardLoader = BaseClass.extend({
- init: function init(options) {
- BoardLoader.inherited('init', this, arguments);
- options = options || {};
- // start - to be removed after done the refactoring
- this.glassContext = options.glassContext;
- this.appSettings = options.appSettings || {};
- this.services = options.services;
- this.ajaxSvc = options.ajaxSvc;
- // end - to be removed after done the refactoring
- this.dashboardApi = options.dashboardApi;
- this.eventRouter = options.eventRouter;
- this.boardSpec = options.boardSpec;
- this.addOnSpec = options.addOnSpec;
- this.specUrl = options.specUrl;
- this.boardModel = options.boardModel;
- this.setDirty = this.boardModel.isUpgraded || false;
- this.pageViewContentNode = options.el;
- this.contentNode = null;
- this.$viewEl = options.$viewEl;
- this.isLayoutRendered = options.isLayoutRendered;
- this._registry = options.widgetRegistry;
- this.gatewayUrl = options.gatewayUrl || '';
- this.cdnUrl = options.cdnUrl || '';
- this.currentVersion = options.currentVersion;
- this.logger = this.dashboardApi.getGlassCoreSvc('.Logger');
- this.stringResources = this.dashboardApi.getDashboardCoreSvc('.StringResources');
- this.extensions = options.extensions;
- this.boardLoaderHelper = new BoardLoaderHelper(this.dashboardApi);
- this.boardModuleFactory = this.boardLoaderHelper.createBoardModuleFactory(options.boardModules);
- // loading dfds
- this._canvasControllerDfd = new Deferred();
- this.featureLoader = options.featureLoader;
- this._dashboardController = options.dashboardController;
- this._colorsService = this.dashboardApi.getFeature('Colors');
- },
- getCanvasController: function getCanvasController() {
- return this._canvasControllerDfd.promise;
- },
- _createCanvas: function _createCanvas() {
- var _this = this;
- var factory = new CanvasFactory({
- dashboardAPI: this.dashboardApi,
- services: this.services,
- extensions: this.extensions,
- glassContext: this.glassContext,
- eventRouter: this.eventRouter,
- appSettings: this.appSettings,
- logger: this.logger,
- widgetRegistry: this._registry,
- featureLoader: this.featureLoader,
- boardModel: this.boardModel,
- dashboardContent: this._dashboardController.getContent()
- });
- return factory.createCanvas().then(function (factoryResponse) {
- _this.canvas = factoryResponse.canvas;
- _this.internalCanvas = factoryResponse.internalCanvas;
- });
- },
- _createDashboardContent: function _createDashboardContent() {
- return this._dashboardController.createContent(this.boardModel);
- },
- /**
- * Load the board
- *
- * @returns Deferred which is resolved once the board is loaded
- */
- loadBoard: function loadBoard() {
- return this._preDashboardInitialize().then(this._createDashboardContent.bind(this)).then(this._createCanvas.bind(this)).then(this._registerServices.bind(this)).then(this._initializeTranslationService.bind(this)).then(this._renderLayoutHtml.bind(this)).then(this._initBoardController.bind(this)).then(this._postDashboardInitialize.bind(this));
- },
- getCanvas: function getCanvas() {
- return this.canvas;
- },
- _initializeTranslationService: function _initializeTranslationService() {
- return this.dashboardApi.getDashboardSvc('TranslationService').then(function (translationService) {
- return translationService.initialize({ boardModel: this.boardModel, view: this.$viewEl });
- }.bind(this));
- },
- _getDashboardFrameNode: function _getDashboardFrameNode() {
- var parentNode = this.pageViewContentNode;
- var dashboardFrame = parentNode.querySelector('.dashboardFrame');
- if (!dashboardFrame) {
- dashboardFrame = document.createElement('div');
- dashboardFrame.setAttribute('class', 'dashboardFrame');
- var dashboardFrameCentre = document.createElement('div');
- dashboardFrameCentre.setAttribute('class', 'dashboardFrameCentre');
- var dashboardFrameRight = document.createElement('div');
- dashboardFrameRight.setAttribute('class', 'dashboardFrameRight');
- dashboardFrame.appendChild(dashboardFrameCentre);
- dashboardFrame.appendChild(dashboardFrameRight);
- parentNode.appendChild(dashboardFrame);
- }
- return dashboardFrame;
- },
- _getDashboardFrameCentreNode: function _getDashboardFrameCentreNode() {
- var dashboardFrame = this._getDashboardFrameNode();
- return dashboardFrame.querySelector('.dashboardFrameCentre');
- },
- _setContentNode: function _setContentNode() {
- this.contentNode = this._getDashboardFrameCentreNode();
- },
- /**
- * Render the layout HTML into the board's DOM element
- *
- * TODO: This is a bit awkward, it'd be nice if we could just create the board and if the DOM elements don't exist that
- * we'd create them on the fly.
- *
- * @returns deferred which is resolved once the HTML is rendered
- */
- _renderLayoutHtml: function _renderLayoutHtml() {
- var _this2 = this;
- // first set the content node where we want to render the content
- this._setContentNode();
- return this.boardLoaderHelper.loadLayoutExtensions(this.extensions.getLayoutViewExtensions(), this.boardModuleFactory).then(function (layoutExtensions) {
- _this2.boardLoaderHelper.registerLayoutExtensions(layoutExtensions);
- var html = _this2.dashboardApi.getFeature('htmlTemplates').getHtml(_this2.boardModel.layout, _this2.boardModel.widgetInstances);
- if (!_this2.isLayoutRendered) {
- _this2.contentNode.innerHTML = html;
- }
- });
- },
- /**
- * Initialize the board controller
- */
- _initBoardController: function _initBoardController() {
- var _this3 = this;
- return ClassFactory.loadModule('dashboard-core/js/dashboard/CanvasController').then(function (CanvasController) {
- _this3.widgetLoader = new WidgetLoader({
- // TODO begin to be removed
- glassContext: _this3.glassContext,
- services: _this3.services,
- appSettings: _this3.appSettings,
- // end to be removed
- dashboardApi: _this3.dashboardApi,
- eventRouter: _this3.eventRouter,
- widgetRegistry: _this3._registry,
- loadedWidgets: {},
- boardModel: _this3.boardModel,
- contentFeatureLoader: _this3.internalCanvas,
- canvas: _this3.getCanvas()
- });
- _this3.canvasController = new CanvasController({
- //begin to be removed
- glassContext: _this3.glassContext,
- services: _this3.services,
- appSettings: _this3.appSettings,
- //end to be removed
- dashboardApi: _this3.dashboardApi,
- eventRouter: _this3.eventRouter,
- $el: _this3.$viewEl,
- boardModel: _this3.boardModel,
- boardModuleFactory: _this3.boardModuleFactory,
- widgetLoader: _this3.widgetLoader,
- layoutExtensions: _this3.extensions.getLayoutViewExtensions(),
- boardLoader: _this3,
- gatewayUrl: _this3.gatewayUrl,
- cdnUrl: _this3.cdnUrl,
- contentFeatureLoader: _this3.internalCanvas
- });
- // TODO - Explore and storyTelling are using this service
- // Should be removed
- _this3.dashboardApi.registerDashboardSvc('widgetLoader', {
- loadedWidgets: _this3.widgetLoader.loadedWidgets,
- loadingWidgets: _this3.widgetLoader.loadingWidgets,
- load: _this3.widgetLoader.loadWidget.bind(_this3.widgetLoader),
- unload: _this3.widgetLoader.unLoadWidget.bind(_this3.widgetLoader),
- isLoaded: _this3.widgetLoader.isLoaded.bind(_this3.widgetLoader),
- isLoading: _this3.widgetLoader.isLoading.bind(_this3.widgetLoader),
- getWidget: _this3.widgetLoader.getWidget.bind(_this3.widgetLoader)
- });
- return _this3.canvasController.initialize().then(function () {
- _this3._canvasControllerDfd.resolve(_this3.canvasController);
- });
- }).catch(function (err) {
- _this3.logger.error(err);
- // don't rethrow, recover
- // TODO: probably rethrowing is a good idea. if you're
- // brave enough and you know what you're doing, make it do that.
- });
- },
- _preDashboardInitialize: function _preDashboardInitialize() {
- return this.dashboardApi.getFeature('.LifeCycleManager').invokeLifeCycleHandlers('pre:dashboard.initialize');
- },
- _postDashboardInitialize: function _postDashboardInitialize() {
- return this.dashboardApi.getFeature('.LifeCycleManager').invokeLifeCycleHandlers('post:dashboard.initialize');
- },
- _registerServices: function _registerServices() {
- // TODO - these services must go away
- //Add the board loader services
- var services = this.boardLoaderHelper.createBoardServices({
- boardModel: this.boardModel,
- widgetRegistry: this._registry
- });
- this.smartNamingSvc = services.smartNamingSvc;
- },
- /**
- * Populate map of widgetId and containerPageId from given layout. populate recursively if layout has items
- * Widget can be determined by type of layout.
- */
- _mapContainerPageForWidgetsInLayout: function _mapContainerPageForWidgetsInLayout(layout, map, containerPageId) {
- map = map || {};
- if (layout.items) {
- for (var i = 0; i < layout.items.length; i++) {
- map = this._mapContainerPageForWidgetsInLayout(layout.items[i], map, containerPageId);
- }
- } else if (layout.type === 'widget') {
- map[layout.id] = containerPageId;
- }
- return map;
- },
- activate: function activate() {
- if (this._colorsService) {
- this._colorsService.enableTheme();
- }
- },
- deactivate: function deactivate() {
- if (this._colorsService) {
- this._colorsService.disableTheme();
- }
- },
- destroyViews: function destroyViews() {
- this.deactivate();
- // The canvasController and widget loader might not exist if we are loading an invalid dashboard( missing/invalid spec or no permissions)
- if (this.widgetLoader) {
- this.widgetLoader.cleanup();
- this.widgetLoader = null;
- }
- if (this.canvasController) {
- this.canvasController.destroy();
- this.canvasController = null;
- }
- },
- /**
- * Destroy the board loader
- */
- destroyCanvasAPI: function destroyCanvasAPI() {
- if (this.internalCanvas) {
- this.internalCanvas.destroy();
- this.internalCanvas = null;
- }
- },
- _hasPermission: function _hasPermission(permissions) {
- return _.indexOf(permissions, 'read') !== -1 && _.indexOf(permissions, 'execute') !== -1;
- }
- });
- return BoardLoader;
- });
- //# sourceMappingURL=BoardLoader.js.map
|