123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- 'use strict';
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
- /**
- * Licensed Materials - Property of IBM
- * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2020
- * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
- define(['gemini/lib/@waca/dashboard-common/dist/core/APIFactory', './SmartTitleAPI', 'underscore'], function (APIFactory, SmartTitleAPI, _) {
- var SmartTitleFeatureProvider = function () {
- function SmartTitleFeatureProvider(options) {
- var _this = this;
- _classCallCheck(this, SmartTitleFeatureProvider);
- this._dashboard = options.dashboardAPI;
- this._content = options.content;
- this._dashboardInternal = options.features['Dashboard.internal'];
- this._widgetApiHandlers = {};
- //tracking event to detect if this widget was added after dashboard open
- //event listener will be removed on render state change
- this._addedContent = [];
- var canvas = this._dashboard.getCanvas();
- if (canvas) {
- this._addContentEvent = canvas.on('add:content:child', function (event) {
- _this._addedContent.push(event.info.newContentId);
- });
- }
- this._state = {
- setupDone: false,
- setupCheckDone: false,
- initialWidgetRenderDone: false,
- shouldUseGeneratedTitle: undefined,
- smartTitleEnabled: undefined,
- toEnableGeneratedTitle: undefined,
- toSetNoTitle: undefined,
- toSetSmartTitle: undefined
- };
- }
- SmartTitleFeatureProvider.prototype._isSmartTitleFeatureEnabled = function _isSmartTitleFeatureEnabled() {
- return !this._dashboard.getGlassCoreSvc('.FeatureChecker').checkValue('dashboard', 'SmartTitle', 'disabled');
- };
- SmartTitleFeatureProvider.prototype._isSmartTitleEnabled = function _isSmartTitleEnabled() {
- return this._isSmartTitleFeatureEnabled() && this._state.smartTitleEnabled;
- };
- SmartTitleFeatureProvider.prototype.getAPI = function getAPI() {
- return APIFactory.createAPI(this, [SmartTitleAPI]); //each content object has its own 'feature' impl
- };
- SmartTitleFeatureProvider.prototype.initialize = function initialize() {
- this.prepare();
- };
- SmartTitleFeatureProvider.prototype.prepare = function prepare() {
- if (!this._isSmartTitleFeatureEnabled()) {
- return;
- }
- this.upgradeIfNeeded();
- this._setupTitle();
- this._addChangeHandlerForTitleModeProperty();
- };
- SmartTitleFeatureProvider.prototype._getModelAttr = function _getModelAttr(name) {
- var boardModel = this._dashboardInternal.getBoardModel();
- var id = this._content.getId();
- var widgetModel = boardModel && boardModel.getWidgetModel(id);
- if (widgetModel) {
- return widgetModel.get(name);
- }
- return undefined;
- };
- SmartTitleFeatureProvider.prototype._setModelAttr = function _setModelAttr(attribs) {
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { silent: true };
- var boardModel = this._dashboardInternal.getBoardModel();
- var id = this._content.getId();
- var widgetModel = boardModel && boardModel.getWidgetModel(id);
- widgetModel && widgetModel.set(attribs, options);
- };
- SmartTitleFeatureProvider.prototype._setProp = function _setProp(name, value) {
- var _this2 = this;
- if (this._state.initialWidgetRenderDone) {
- this._content.setPropertyValue(name, value);
- } else {
- var stateAPI = this._content.getFeature('state');
- stateAPI.whenStatusChanges('rendered').then(function () {
- //Content api does not allow SKIP undo/red0 event yet. Need to set in the model and skip the event for the first time
- //this._content.setPropertyValue(name, value);
- var boardModel = _this2._dashboardInternal.getBoardModel();
- var id = _this2._content.getId();
- var widgetModel = boardModel && boardModel.getWidgetModel(id);
- if (widgetModel) {
- var attribs = {};
- attribs[name] = value;
- widgetModel.set(attribs, { payloadData: { skipUndoRedo: true } });
- }
- });
- }
- };
- SmartTitleFeatureProvider.prototype.upgradeIfNeeded = function upgradeIfNeeded() {
- //TODO: feature manages its own upgrade, but could we allow others to customize upgrade process ?
- var container = this._content.getContainer();
- var containerType = container && container.getType();
- var forceSmartTitle = containerType && containerType === 'exploreCard';
- if (forceSmartTitle) {
- var attribs = {
- showTitle: undefined,
- titleMode: 'smartTitle'
- };
- this._setModelAttr(attribs);
- this._setProp('titleMode', 'smartTitle');
- this._setProp('showTitle', undefined);
- return;
- }
- var showTitle = this._getModelAttr('showTitle');
- var name = this._getModelAttr('name');
- var titleMode = this._getModelAttr('titleMode');
- if (showTitle !== undefined) {
- var _attribs = {
- showTitle: undefined
- };
- if (name && (!titleMode || titleMode !== 'noTitle')) {
- if (showTitle === true) {
- _attribs.titleMode = 'customTitle';
- this._setProp('titleMode', 'customTitle');
- } else {
- _attribs.titleMode = 'noTitle';
- this._setProp('titleMode', 'noTitle');
- }
- }
- this._setModelAttr(_attribs);
- this._setProp('showTitle', undefined);
- }
- };
- SmartTitleFeatureProvider.prototype._setupTitle = function _setupTitle() {
- var _this3 = this;
- //if no title set & showTitle prop is true and generatedTitle is undefined, enable smart title
- //if showTitle is true & generatedTitle true, enable smart title (does not matter if title is set or not)
- var stateAPI = this._content.getFeature('state');
- stateAPI.whenStatusChanges('rendered').then(function () {
- _this3._state.initialWidgetRenderDone = true;
- });
- this._stateInitPromise = stateAPI.whenStatusChanges('rendering');
- this._stateInitPromise.then(function () {
- _this3._ensureStateCheckOnInit();
- _this3._state.setupCheckDone = true;
- if (!_this3._state.setupDone) {
- _this3._state.setupDone = true;
- if (_this3._state.toEnableGeneratedTitle && _this3._state.toSetSmartTitle) {
- _this3.enableAndSetSmartTitle();
- } else if (_this3._state.toEnableGeneratedTitle) {
- _this3._enableSmartTitle();
- } else if (_this3._state.toSetNoTitle) {
- _this3._setProp('titleMode', 'noTitle');
- }
- }
- });
- };
- SmartTitleFeatureProvider.prototype._removeAddContentEventListener = function _removeAddContentEventListener() {
- if (this._addContentEvent && this._addContentEvent.remove) {
- this._addContentEvent.remove();
- this._addContentEvent = null;
- }
- };
- SmartTitleFeatureProvider.prototype._ensureStateCheckOnInit = function _ensureStateCheckOnInit() {
- this._removeAddContentEventListener();
- var id = this._content.getId();
- var isWidgetLoadedAfterDashboardOpen = this._addedContent.indexOf(id) !== -1;
- var name = this._getModelAttr('name');
- var titleMode = this._content.getPropertyValue('titleMode');
- var shouldUseGeneratedTitle = false;
- if (name) {
- if (titleMode === 'smartTitle' || !titleMode && isWidgetLoadedAfterDashboardOpen) {
- this._state.toEnableGeneratedTitle = true;
- shouldUseGeneratedTitle = true;
- } else if (titleMode !== 'customTitle') {
- this._setProp('titleMode', 'noTitle');
- }
- } else {
- if (titleMode === undefined) {
- if (name !== undefined && name !== null && name === '' && !isWidgetLoadedAfterDashboardOpen) {
- this._state.toSetNoTitle = true;
- } else {
- //newly added widget
- this._state.toEnableGeneratedTitle = true;
- this._state.toSetSmartTitle = true;
- shouldUseGeneratedTitle = true;
- }
- } else if (titleMode === 'smartTitle') {
- this._state.toEnableGeneratedTitle = true;
- this._state.toSetSmartTitle = true;
- shouldUseGeneratedTitle = true;
- }
- }
- this._state.shouldUseGeneratedTitle = shouldUseGeneratedTitle;
- return this._state;
- };
- SmartTitleFeatureProvider.prototype.shouldUseGeneratedTitle = function shouldUseGeneratedTitle() {
- var smartTitleEnabledConfig = this._dashboard.getAppConfig('smartTitle');
- if (smartTitleEnabledConfig) {
- var state = this._ensureStateCheckOnInit();
- return state.shouldUseGeneratedTitle;
- }
- return false;
- };
- SmartTitleFeatureProvider.prototype._addChangeHandlerForTitleModeProperty = function _addChangeHandlerForTitleModeProperty() {
- var _this4 = this;
- this._content.on('change:property:titleMode', function (event) {
- if (event.info.value === 'smartTitle') {
- _this4.enableAndSetSmartTitle();
- } else {
- _this4.disableSmartTitle(event.info.value);
- }
- });
- };
- SmartTitleFeatureProvider.prototype.enableAndSetSmartTitle = function enableAndSetSmartTitle() {
- if (this._isSmartTitleEnabled()) {
- return;
- }
- var widgetAPI = this._content.getFeature('WidgetAPI.deprecated');
- this._enableSmartTitle();
- this._triggerTitleUpdate(widgetAPI, true);
- };
- SmartTitleFeatureProvider.prototype._enableSmartTitle = function _enableSmartTitle() {
- if (this._isSmartTitleEnabled()) {
- return;
- }
- this._state.smartTitleEnabled = true;
- var widgetAPI = this._content.getFeature('WidgetAPI.deprecated');
- var visAPI = widgetAPI.getVisApi();
- this._deregisterListener();
- this._widgetApiHandlers = {
- _onChangeDefinition: visAPI && visAPI.on('change:definition', this._triggerTitleUpdate.bind(this, widgetAPI))
- };
- this._setProp('titleMode', 'smartTitle');
- };
- SmartTitleFeatureProvider.prototype.disableSmartTitle = function disableSmartTitle() {
- var newTitleMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'customTitle';
- if (this._isSmartTitleEnabled() === false) {
- return;
- }
- this._state.smartTitleEnabled = false;
- this._deregisterListener();
- this._setProp('titleMode', newTitleMode);
- };
- SmartTitleFeatureProvider.prototype.getTitleState = function getTitleState() {
- var name = this._getModelAttr('name');
- return {
- generatedTitle: this._isSmartTitleEnabled(),
- title: name
- };
- };
- SmartTitleFeatureProvider.prototype.shouldSetTitle = function shouldSetTitle(newTitle) {
- var name = this._getModelAttr('name');
- if (name != newTitle) {
- return true;
- }
- if (this._isTitlePartiallyFormatted(name)) {
- return true;
- }
- return false;
- };
- SmartTitleFeatureProvider.prototype._isTitlePartiallyFormatted = function _isTitlePartiallyFormatted(name) {
- //If the rawTitle can't be found in the titleHtml, then its been formatted.
- return !this._findRawTitleInHtml(name);
- };
- SmartTitleFeatureProvider.prototype.getTitleHtmlWithPreviousFormat = function getTitleHtmlWithPreviousFormat(title) {
- //If the previous unformatted title is found in the html, replace it with the new title to preserve the surrounding format
- var htmlTitleInfo = this._findRawTitleInHtml(this._getModelAttr('name'));
- if (htmlTitleInfo) {
- htmlTitleInfo.spanContainingTheTitle.innerHTML = _.escape(title);
- var newTitleHtml = htmlTitleInfo.titleRoot.innerHTML;
- return newTitleHtml;
- }
- //Null means the title itself had mixed format and can't be replaced.
- return null;
- };
- SmartTitleFeatureProvider.prototype._findRawTitleInHtml = function _findRawTitleInHtml(rawTitle) {
- var titleHtml = this._getModelAttr('titleHtml');
- if (rawTitle && titleHtml) {
- //When escaped html is set in the title control, some characters are changed (eg encoded single quotes are decoded)
- //Use innerHTML for both titleHtml and the escaped rawTitle to make sure things match.
- var rawTitleDiv = document.createElement('div');
- rawTitleDiv.innerHTML = _.escape(rawTitle);
- //The only titleHtml structure we count on is that there's a span somewhere with a title that matches rawTitle.
- var root = document.createElement('div'); //Create a node and set its html content to be titleHtml.
- root.innerHTML = titleHtml;
- var spans = root.getElementsByTagName('span');
- var spanContainingTheTitle = null;
- for (var i = 0; i < spans.length; ++i) {
- if (spans[i].innerHTML === rawTitleDiv.innerHTML) {
- spanContainingTheTitle = spans[i];
- }
- }
- return spanContainingTheTitle && { spanContainingTheTitle: spanContainingTheTitle, titleRoot: root };
- }
- return null;
- };
- SmartTitleFeatureProvider.prototype.destroy = function destroy() {
- this._deregisterListener();
- return Promise.resolve(true);
- };
- SmartTitleFeatureProvider.prototype._deregisterListener = function _deregisterListener() {
- if (this._widgetApiHandlers._onChangeDefinition) {
- this._widgetApiHandlers._onChangeDefinition.remove();
- this._widgetApiHandlers._onChangeDefinition = null;
- }
- this._removeAddContentEventListener();
- };
- SmartTitleFeatureProvider.prototype._triggerTitleUpdate = function _triggerTitleUpdate(widgetAPI) {
- if (widgetAPI) {
- widgetAPI.updateTitle();
- }
- };
- return SmartTitleFeatureProvider;
- }();
- return SmartTitleFeatureProvider;
- });
- //# sourceMappingURL=SmartTitleFeatureProvider.js.map
|