RenderTask.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. 'use strict';
  2. /*
  3. *+------------------------------------------------------------------------+
  4. *| Licensed Materials - Property of IBM
  5. *| IBM Cognos Products: Dashboard
  6. *| (C) Copyright IBM Corp. 2018, 2020
  7. *|
  8. *| US Government Users Restricted Rights - Use, duplication or disclosure
  9. *| restricted by GSA ADP Schedule Contract with IBM Corp.
  10. *+------------------------------------------------------------------------+
  11. */
  12. define(['underscore', './BaseTask'], function (_, BaseTask) {
  13. 'use strict';
  14. var renderErrors = {
  15. 'ENGINE_LAYOUT_DOES_NOT_FIT': 'dwErrorVisualizationTooSmall'
  16. };
  17. var RESERVED_CONTEXT_KEYS = ['id', 'extraInfo'];
  18. var RenderTask = BaseTask.extend({
  19. /**
  20. * Final render task. Call the view to render the visualization.
  21. * @param renderContext - information collected by a particular call to render or reRender (such as the view, control, data etc).
  22. * @returns a promise
  23. */
  24. process: function process(renderContext) {
  25. this._logRenderContext('_render:ContextStepsComplete', renderContext);
  26. var isAnnotationRequest = renderContext.extraInfo && renderContext.extraInfo.annotationRequest;
  27. if (this._isStepComplete(renderContext, 'render') || isAnnotationRequest) {
  28. this._completeStep(renderContext, 'render', this.getRenderState());
  29. return Promise.resolve(renderContext);
  30. }
  31. return this.render(renderContext);
  32. },
  33. render: function render(renderContext) {
  34. var bResizing = renderContext.resizing;
  35. delete renderContext.resizing;
  36. var result = void 0;
  37. var renderState = this.getRenderState();
  38. var isRealTimeRefresh = renderContext.extraInfo && renderContext.extraInfo.sender === 'realtimeRefresh';
  39. if (!renderState.readyToRender()) {
  40. // This may happen when resize occurs prematurely along with the main render
  41. // Since we are not ready to render, we have no choice but to terminate render
  42. // However we should NOT make a false claim that render has completed
  43. // the state of the render will eventually get updated by the subsequent render request
  44. result = Promise.resolve(renderContext);
  45. } else if (renderContext.sameQueryData === true && isRealTimeRefresh) {
  46. renderContext.renderComplete = true;
  47. this.visAPI.renderComplete();
  48. result = Promise.resolve(renderContext);
  49. } else {
  50. this.clearError();
  51. result = this.ownerWidget.getVisBounds().then(function (bounds) {
  52. var _this = this;
  53. this._logRenderContext('_render:visBoundReady', renderContext);
  54. if (renderState.readyToRender()) {
  55. renderState.lastSizeRendered = bounds;
  56. _.each(_.keys(renderContext), function (key) {
  57. if (!_this._isReservedContextKey(key) && renderState.getCurrentContext(key)) {
  58. renderContext[key] = renderState.getCurrentContext(key)[key];
  59. }
  60. });
  61. renderContext.widgetSize = bounds;
  62. var visView = this.getRenderState().getCurrentContextData('visView');
  63. visView.show();
  64. try {
  65. visView.resizing = bResizing;
  66. return visView.render(renderContext).then(function (result) {
  67. if (result && result.reRenderNeeded) {
  68. _this.ownerWidget.setReRenderOnShow({
  69. resizing: true
  70. });
  71. renderContext.renderComplete = false;
  72. return renderContext;
  73. }
  74. _this._completeStep(renderContext, 'render', renderState);
  75. renderState.firstRenderComplete = true;
  76. renderContext.renderComplete = true;
  77. //The render is completed so ensure the renderingNewData flag is reset prior to the next render.
  78. visView.setRenderingNewData(false);
  79. //refresh property panel when re-render happens, no need to refreh the panel if the rerender is triggered by resizing or auto-refresh
  80. var isAutoRefresh = renderContext && renderContext.extraInfo && renderContext.extraInfo.sender === 'realtimeRefresh';
  81. var refreshPropertiesPane = renderContext && renderContext.refresh && renderContext.refresh.propertiesPane;
  82. refreshPropertiesPane = refreshPropertiesPane || refreshPropertiesPane === undefined && renderContext.refreshAll;
  83. if (refreshPropertiesPane && _this.ownerWidget.focusOn && !bResizing && !isAutoRefresh) {
  84. _this.ownerWidget.refreshPropertiesPane();
  85. }
  86. return renderContext;
  87. }).catch(function (e) {
  88. this._showRenderError(renderContext, e);
  89. renderContext.renderComplete = true;
  90. //The render is completed so ensure the renderingNewData flag is reset prior to the next render.
  91. visView.setRenderingNewData(false);
  92. return renderContext;
  93. }.bind(this));
  94. } catch (e) {
  95. //The render is completed (with an error) so ensure the renderingNewData flag is reset prior to the next render.
  96. visView.setRenderingNewData(false);
  97. this._showRenderError(renderContext, e);
  98. }
  99. renderState.firstRenderComplete = true;
  100. }
  101. renderContext.renderComplete = true;
  102. return renderContext;
  103. }.bind(this));
  104. }
  105. return result;
  106. },
  107. /**
  108. * Don't process these keys as steps in the render sequence
  109. */
  110. _isReservedContextKey: function _isReservedContextKey(key) {
  111. return RESERVED_CONTEXT_KEYS.indexOf(key) > -1;
  112. },
  113. _showRenderError: function _showRenderError(renderContext, e) {
  114. if (this.owner.isActive()) {
  115. if (this.owner.isLastRun(renderContext)) {
  116. renderContext.visView.hide();
  117. var errorCode = e.getErrorCode && e.getErrorCode();
  118. var errorCodeName = errorCode && errorCode.name();
  119. var errorMessage = errorCodeName && renderErrors[errorCodeName] || 'dwErrorRenderingVisualization';
  120. this.owner.showError(errorMessage);
  121. }
  122. this.logger.error('An error occured during the data widget rendering sequence', e, this.visAPI);
  123. } else {
  124. this.logger.debug('An error occured during the data widget rendering sequence', e, this.visAPI);
  125. }
  126. }
  127. });
  128. return RenderTask;
  129. });
  130. //# sourceMappingURL=RenderTask.js.map