'use strict'; /** * Licensed Materials - Property of IBM * IBM Cognos Products: dashboard-core (C) Copyright IBM Corp. 2019, 2020 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ define(['./SaveActionHandler', '../../../dashboard/glass/util/SaveActionUtil', '../../../app/util/ErrorUtils', '../../../app/util/GlassUtil'], function (BaseClass, SaveActionUtil, ErrorUtils, GlassUtil) { var ActionHandler = BaseClass.extend({ onSelectItem: function onSelectItem(context) { var contentView = this.getContentView(context); var id = contentView.getBoardId(); this.saveAsTemplate(context, id); }, isItemVisible: function isItemVisible(context) { var isDashboardTemplatesEnabled = !context.glassContext.getCoreSvc('.FeatureChecker').checkValue('dashboard', 'dashboardTemplates', 'disabled'); return isDashboardTemplatesEnabled && this._isBoardTypeSupported(context) && ErrorUtils.hasCapability(context.glassContext, 'canAuthorDashboard'); }, _isBoardTypeSupported: function _isBoardTypeSupported(context) { var view = this.getContentView(context); return view.getDashboardApi().getType() === 'dashboard'; }, /** * Prompt the user for a location to save the dashboard template. * @param {Object} context of selection (passed during onSelect) * @param {string} id The Board Id that we are creaing a template from */ saveAsTemplate: function saveAsTemplate(context, id) { var _this = this; var dashboardView = this.getDashboardView(context); return this._getAncestors(context, id).then(function (ancestors) { return context.glassContext.getSvc('.ContentDialogFactory').then(function (dialogFactory) { var stringResources = _this.getStringResourcesService(context); _this._saveAsTemplateDialog = dialogFactory.createSaveAsDialog({ glassContext: context.glassContext, defaultFileName: stringResources.get('dashboard_template_prefix', { name: dashboardView.boardModel.name }), service: { context: context, save: _this.onSaveAsTemplate.bind(_this) }, ancestors: ancestors }); _this._saveAsTemplateDialog.open(); }); }); }, onSaveAsTemplate: function onSaveAsTemplate(service, selection, name, overwrite) { return this._executeSaveAsTemplateRequest(service.context, selection.url, name, overwrite).then(this._onSaveAsTemplateSuccess.bind(this), this._onSaveAsError.bind(this, service.context)).finally(this._saveAsTemplateDialog.hide.bind(this._saveAsTemplateDialog)); }, _onSaveAsTemplateSuccess: function _onSaveAsTemplateSuccess(params) { var _this2 = this; var context = params.context; var glassContext = context.glassContext; return glassContext.appController.openAppView('dashboardTemplate', { perspective: 'dashboardTemplate', content: { perspective: 'dashboardTemplate', objectUrl: params.saveRequest.getResponseHeader('location'), isAuthoringMode: glassContext.appController.getCurrentContentView().isAuthoringMode } }).then(function () { var stringResources = _this2.getStringResourcesService(context); var contentView = _this2.getContentView(context); var id = contentView.getBoardId(); // Remove any filter widgets - ideally, this should be done before the template spec is saved to CM, // but there's no dashboard api until the view is opened, once this is available - update this var canvas = contentView.getDashboardApi().getCanvas(); var filterWidgets = canvas.findContent({ type: 'widget' }).filter(function (widget) { return widget.getType() === 'widget.filter'; }); if (filterWidgets.length) { filterWidgets.forEach(function (widget) { canvas.removeContent(widget.getId()); }); glassContext.appController.showToast(stringResources.get('dashboard_template_filters_removed'), { type: 'warning' }); _this2.save(context, true, false); } // Ensure widgets of current tab have rendered before taking screen shot var widgets = canvas.getContent(contentView.boardModel.getSelectedLayout()).findContent({ type: 'widget' }); var widgetStatePromises = widgets.map(function (widget) { var state = widget.getFeature('state'); return state.whenStatusChanges(state.STATUS.RENDERED); }); return Promise.all(widgetStatePromises).then(function () { return _this2._saveThumbnail(context, id).catch(function (err) { glassContext.getCoreSvc('.Logger').error(err); }); }).then(function () { glassContext.appController.showToast(stringResources.get('dashboard_template_save_success')); }); }); }, /** * Send a create request to create a new dashboard template in CM * @return {Promise} Resolve when save succeeds; reject when save fails */ _executeSaveAsTemplateRequest: function _executeSaveAsTemplateRequest(context, url, name, overwrite) { var _this3 = this; var glassContext = context.glassContext; var ajaxSvc = GlassUtil.getAjaxService(glassContext); var dashboardView = this.getDashboardView(context); var dashboard = dashboardView.getDashboardApi(); var convertToTemplate = dashboard.getFeature('ConvertToTemplate'); var spec = dashboard.getFeature('Serializer').toJSON(); SaveActionUtil.cleanUnusedCustomColors(dashboard, spec, dashboardView.boardModel); if (name) { spec.name = name; } return new Promise(function (resolve, reject) { convertToTemplate.convertToTemplate(spec).then(function (templateSpec) { var cmSpec = _this3._getCMSpec(templateSpec, context); url = url + (overwrite ? '?updateAction=replace&ignoreInvalidObjectReference=true' : '?ignoreInvalidObjectReference=true'); ajaxSvc.post(url, { contentType: 'application/json', processData: false, dataType: 'text', data: JSON.stringify(cmSpec) }).done(function (data, status, response) { resolve({ 'saveRequest': response, 'context': context }); }).fail(function (ajaxRequestDeferred, response) { reject({ 'saveRequest': response, 'cmSpec': spec, 'glassContext': glassContext }); }); }); }); }, _getCMSpec: function _getCMSpec(spec, context) { var templateSpec = Object.assign(spec, { dataSources: {} }); var contentView = this.getContentView(context); var dashboard = contentView.getDashboardApi(); var cmSpec = { defaultName: templateSpec.name, type: SaveActionUtil.getAssetType(dashboard), specification: JSON.stringify(templateSpec), tags: ['dashboard_template'] }; return cmSpec; } }); return ActionHandler; }); //# sourceMappingURL=SaveAsTemplateActionHandler.js.map