SaveAsTemplateActionHandler.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. 'use strict';
  2. /**
  3. * Licensed Materials - Property of IBM
  4. * IBM Cognos Products: dashboard-core (C) Copyright IBM Corp. 2019, 2020
  5. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  6. */
  7. define(['./SaveActionHandler', '../../../dashboard/glass/util/SaveActionUtil', '../../../app/util/ErrorUtils', '../../../app/util/GlassUtil'], function (BaseClass, SaveActionUtil, ErrorUtils, GlassUtil) {
  8. var ActionHandler = BaseClass.extend({
  9. onSelectItem: function onSelectItem(context) {
  10. var contentView = this.getContentView(context);
  11. var id = contentView.getBoardId();
  12. this.saveAsTemplate(context, id);
  13. },
  14. isItemVisible: function isItemVisible(context) {
  15. var isDashboardTemplatesEnabled = !context.glassContext.getCoreSvc('.FeatureChecker').checkValue('dashboard', 'dashboardTemplates', 'disabled');
  16. return isDashboardTemplatesEnabled && this._isBoardTypeSupported(context) && ErrorUtils.hasCapability(context.glassContext, 'canAuthorDashboard');
  17. },
  18. _isBoardTypeSupported: function _isBoardTypeSupported(context) {
  19. var view = this.getContentView(context);
  20. return view.getDashboardApi().getType() === 'dashboard';
  21. },
  22. /**
  23. * Prompt the user for a location to save the dashboard template.
  24. * @param {Object} context of selection (passed during onSelect)
  25. * @param {string} id The Board Id that we are creaing a template from
  26. */
  27. saveAsTemplate: function saveAsTemplate(context, id) {
  28. var _this = this;
  29. var dashboardView = this.getDashboardView(context);
  30. return this._getAncestors(context, id).then(function (ancestors) {
  31. return context.glassContext.getSvc('.ContentDialogFactory').then(function (dialogFactory) {
  32. var stringResources = _this.getStringResourcesService(context);
  33. _this._saveAsTemplateDialog = dialogFactory.createSaveAsDialog({
  34. glassContext: context.glassContext,
  35. defaultFileName: stringResources.get('dashboard_template_prefix', { name: dashboardView.boardModel.name }),
  36. service: {
  37. context: context,
  38. save: _this.onSaveAsTemplate.bind(_this)
  39. },
  40. ancestors: ancestors
  41. });
  42. _this._saveAsTemplateDialog.open();
  43. });
  44. });
  45. },
  46. onSaveAsTemplate: function onSaveAsTemplate(service, selection, name, overwrite) {
  47. 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));
  48. },
  49. _onSaveAsTemplateSuccess: function _onSaveAsTemplateSuccess(params) {
  50. var _this2 = this;
  51. var context = params.context;
  52. var glassContext = context.glassContext;
  53. return glassContext.appController.openAppView('dashboardTemplate', {
  54. perspective: 'dashboardTemplate',
  55. content: {
  56. perspective: 'dashboardTemplate',
  57. objectUrl: params.saveRequest.getResponseHeader('location'),
  58. isAuthoringMode: glassContext.appController.getCurrentContentView().isAuthoringMode
  59. }
  60. }).then(function () {
  61. var stringResources = _this2.getStringResourcesService(context);
  62. var contentView = _this2.getContentView(context);
  63. var id = contentView.getBoardId();
  64. // Remove any filter widgets - ideally, this should be done before the template spec is saved to CM,
  65. // but there's no dashboard api until the view is opened, once this is available - update this
  66. var canvas = contentView.getDashboardApi().getCanvas();
  67. var filterWidgets = canvas.findContent({ type: 'widget' }).filter(function (widget) {
  68. return widget.getType() === 'widget.filter';
  69. });
  70. if (filterWidgets.length) {
  71. filterWidgets.forEach(function (widget) {
  72. canvas.removeContent(widget.getId());
  73. });
  74. glassContext.appController.showToast(stringResources.get('dashboard_template_filters_removed'), { type: 'warning' });
  75. _this2.save(context, true, false);
  76. }
  77. // Ensure widgets of current tab have rendered before taking screen shot
  78. var widgets = canvas.getContent(contentView.boardModel.getSelectedLayout()).findContent({ type: 'widget' });
  79. var widgetStatePromises = widgets.map(function (widget) {
  80. var state = widget.getFeature('state');
  81. return state.whenStatusChanges(state.STATUS.RENDERED);
  82. });
  83. return Promise.all(widgetStatePromises).then(function () {
  84. return _this2._saveThumbnail(context, id).catch(function (err) {
  85. glassContext.getCoreSvc('.Logger').error(err);
  86. });
  87. }).then(function () {
  88. glassContext.appController.showToast(stringResources.get('dashboard_template_save_success'));
  89. });
  90. });
  91. },
  92. /**
  93. * Send a create request to create a new dashboard template in CM
  94. * @return {Promise} Resolve when save succeeds; reject when save fails
  95. */
  96. _executeSaveAsTemplateRequest: function _executeSaveAsTemplateRequest(context, url, name, overwrite) {
  97. var _this3 = this;
  98. var glassContext = context.glassContext;
  99. var ajaxSvc = GlassUtil.getAjaxService(glassContext);
  100. var dashboardView = this.getDashboardView(context);
  101. var dashboard = dashboardView.getDashboardApi();
  102. var convertToTemplate = dashboard.getFeature('ConvertToTemplate');
  103. var spec = dashboard.getFeature('Serializer').toJSON();
  104. SaveActionUtil.cleanUnusedCustomColors(dashboard, spec, dashboardView.boardModel);
  105. if (name) {
  106. spec.name = name;
  107. }
  108. return new Promise(function (resolve, reject) {
  109. convertToTemplate.convertToTemplate(spec).then(function (templateSpec) {
  110. var cmSpec = _this3._getCMSpec(templateSpec, context);
  111. url = url + (overwrite ? '?updateAction=replace&ignoreInvalidObjectReference=true' : '?ignoreInvalidObjectReference=true');
  112. ajaxSvc.post(url, {
  113. contentType: 'application/json',
  114. processData: false,
  115. dataType: 'text',
  116. data: JSON.stringify(cmSpec)
  117. }).done(function (data, status, response) {
  118. resolve({
  119. 'saveRequest': response,
  120. 'context': context
  121. });
  122. }).fail(function (ajaxRequestDeferred, response) {
  123. reject({
  124. 'saveRequest': response,
  125. 'cmSpec': spec,
  126. 'glassContext': glassContext
  127. });
  128. });
  129. });
  130. });
  131. },
  132. _getCMSpec: function _getCMSpec(spec, context) {
  133. var templateSpec = Object.assign(spec, { dataSources: {} });
  134. var contentView = this.getContentView(context);
  135. var dashboard = contentView.getDashboardApi();
  136. var cmSpec = {
  137. defaultName: templateSpec.name,
  138. type: SaveActionUtil.getAssetType(dashboard),
  139. specification: JSON.stringify(templateSpec),
  140. tags: ['dashboard_template']
  141. };
  142. return cmSpec;
  143. }
  144. });
  145. return ActionHandler;
  146. });
  147. //# sourceMappingURL=SaveAsTemplateActionHandler.js.map