123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- /*
- *+------------------------------------------------------------------------+
- *| Licensed Materials - Property of IBM
- *| IBM Cognos Products: Viewer
- *| (C) Copyright IBM Corp. 2013
- *|
- *| US Government Users Restricted Rights - Use, duplication or
- *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- *|
- *+------------------------------------------------------------------------+
- */
- function RequestHandler( oCV ) {
- if (oCV) {
- RequestHandler.baseConstructor.call(this, oCV);
- this.m_originalFormFields = null;
- this.m_forceRaiseSharePrompt = false;
- }
- }
- RequestHandler.prototype = new BaseRequestHandler();
- RequestHandler.baseConstructor = BaseRequestHandler;
- RequestHandler.prototype.parent = BaseRequestHandler.prototype;
- RequestHandler.prototype.postHttpRequest = function(response) {
- var oCV = this.getViewer();
- this.parent.postHttpRequest.call(this, response);
- };
- RequestHandler.prototype.setForceRaiseSharePrompt = function( bFlag ) {
- this.m_forceRaiseSharePrompt = bFlag;
- };
- RequestHandler.prototype.preHttpRequest = function(request) {
- var oCV = this.getViewer();
- var cvWidget = oCV.getViewerWidget();
- oCV.setCurrentNodeFocus(null);
- if( this.doRaiseSharePromptEvent(request) ) {
- if (oCV.widgetHasPromptParameters()) {
- // use the default request executed indicator which is a opaque background so user can't interact with
- // report content in the case where the prompt is on the report and not on a prompt page.
- this.setRequestIndicator(new BaseRequestExecutedIndicator(oCV));
- var cascadeParameterList = this.getListOfCascadingPromptParametersToReset(oCV, request );
- oCV.raisePromptEvent(oCV.envParams["reportPrompts"], request.getFormFields(), cascadeParameterList);
-
- } else {
- if (!(cvWidget && cvWidget.promptParametersRetrieved == true)) {
- //run getTransients to get the prompt parameters for this widget
- var getParametersAction = oCV.getAction("GetParameters");
- getParametersAction.isPrimaryPromptWidget = true;
- getParametersAction.execute();
- }
- }
- }
- oCV.resetRaiseSharePromptEventFlag();
- this.parent.preHttpRequest.call(this, request);
- };
- /**
- * Returns a list of parameter names of parameters which values have been changed.
- */
- RequestHandler.prototype.getListOfChangedPromptParameters = function(oCV, request) {
- var oldParams = oCV.getOldParameters();
- if (!oldParams) { return null; }
- var changedPromptParamsList = [];
- for ( var oldParam in oldParams) {
- oldParmValueItems = oldParams[oldParam].m_parmValueItems;
- var newParmValueItems = request.getFormFields().get('p_' + oldParam);
- if( !newParmValueItems ){ continue; }
- for ( var j = 0; j < oldParmValueItems.length; ++j) {
- var oldXmlEncodeParmValueItems = sXmlEncode(oldParmValueItems[j].m_useValue);
- if (newParmValueItems.indexOf(oldXmlEncodeParmValueItems) < 0) {
- //prefixing params name with
- changedPromptParamsList.push('p_' + oldParam);
- }
- }
- }
- return changedPromptParamsList;
- };
- /*
- * For cascading prompts, if a parent prompt value is changed, then all its descendants need to be cleared.
- * Returns a list of parameters that needs to be cleared for cascading prompts.
- */
- RequestHandler.prototype.getListOfCascadingPromptParametersToReset = function( oCV, request ) {
- if (!oCV.preProcessControlArray ) { return null; }
-
- var listOfChangedPrompts = this.getListOfChangedPromptParameters(oCV, request);
-
- if( !listOfChangedPrompts || !listOfChangedPrompts.length){ return null; }
-
- var promptParamsToBeReset = [];
- var kCount = oCV.preProcessControlArray.length;
- var tempList = listOfChangedPrompts.slice(); //keeps track of all the changed prompts and their dependent cascading prompts.
- for (var k = 0; k < kCount; k++) {
- var oPromptElement = (oCV.preProcessControlArray[k]);
- if( !oPromptElement.getCascadeOnParameter ){ return; }
- var oCascadedOnParentPrompt = oPromptElement.getCascadeOnParameter();
- if (!oCascadedOnParentPrompt) { continue; }
-
- var sParamName = oPromptElement.getParameterName();
- var sCascadedOnParentPromptName=oCascadedOnParentPrompt.getName();
-
- //if parent prompt had changed, then need to reset the child prompt value
- if (this.contains(tempList, sCascadedOnParentPromptName) && !this.contains(tempList, sParamName)) {
- //add this child prompt to the tempList so that if it has any child prompt, we know to reset it as well
- tempList.push(sParamName);
- promptParamsToBeReset.push(sParamName);
-
- }
- }
- return promptParamsToBeReset;
- };
- RequestHandler.prototype.contains = function(a, obj) {
- var i = a.length;
- while (i--) {
- if (a[i] === obj) {
- return true;
- }
- }
- return false;
- };
- RequestHandler.prototype.doRaiseSharePromptEvent = function(response) {
- var oCV = this.getViewer();
- var result = false;
- var action = response.getFormField("ui.action");
-
- if (( (typeof action !== "undefined" && ( action === "forward" || action === "back" ) ) && oCV.m_raiseSharePromptEvent ) ||
- this.m_forceRaiseSharePrompt ){
- result = true;
- var requestParam = null;
- var credentialParamExists = false;
- var promptParamsCount = 0;
- var params = response.getFormFields();
- var keys = params.keys();
- for(requestParam in keys) {
- requestParam = keys[requestParam];
- // don't share credential parameters or search request
- if( requestParam == "_promptControl" && params.get(requestParam) == "search") {
- result = false;
- break;
- } else if (requestParam.indexOf("p_") === 0) {
- if (requestParam.indexOf("p_credential:") === 0) {
- credentialParamExists = true;
- } else {
- promptParamsCount += 1;
- }
- }
- }
- if (result && credentialParamExists && promptParamsCount === 0) {
- result = false;
- }
- }
- return result;
- };
- RequestHandler.prototype.onComplete = function(asynchDataResponse) {
- var oCV = this.getViewer();
- if (oCV && !oCV.m_destroyed) {
- this.parent.onComplete.call(this, asynchDataResponse);
- this.processDATAReportResponse(asynchDataResponse);
- this.postComplete();
- }
- else if (console) {
- console.warn("Tried to complete a request on an invalid CCognosViewer", oCV);
- }
- };
- RequestHandler.prototype.onPrompting = function(asynchDataResponse) {
- var oCV = this.getViewer();
- if (oCV && !oCV.m_destroyed) {
- var oWidget = oCV.getViewerWidget();
- oWidget.hideToolbarAndContextMenu();
- this.onComplete(asynchDataResponse);
- }
- else if (console) {
- console.warn("Tried to prompt on an invalid CCognosViewer", oCV);
- }
- };
- /**
- * Fire an event to CW so they can show the http error in a modal dialog
- */
- RequestHandler.prototype.onError = function(response) {
- var oCV = this.getViewer();
- if (response && oCV) {
- var oWidget = oCV.getViewerWidget();
- if (typeof console != "undefined" && console && console.log) {
- console.log("Viewer http error: " + response.getResponseText() + " " + response.getStatus());
- }
- oWidget.fireEvent("com.ibm.bux.widget.action", null, { action : "httpError", responseText : response.getResponseText(), status : response.getStatus() });
- }
- };
- RequestHandler.prototype.onFault = function(response) {
- var oCV = this.getViewer();
- var viewerIWidget = oCV.getViewerWidget();
- var dispatcherEntry = oCV.getRetryDispatcherEntry();
- if (dispatcherEntry && dispatcherEntry.getOriginalFormFields()) {
- this.m_originalFormFields = dispatcherEntry.getOriginalFormFields();
- }
- else {
- // if we don't ahve a retryDispatcherEntry, then the fault must of happened right away (on drop).
- // get the retry form fields from the widget
- this.m_originalFormFields = viewerIWidget.getOriginalFormFields();
- }
- if(window['gReportWidgetLoadQueue']) {
- window['gReportWidgetLoadQueue'].widgetDoneLoading(viewerIWidget);
- }
- if( this.isGlobalPromptException() ) {
- this.handleGlobalPromptException();
- }
- if( this.isMissingMemberException(oCV, response) ) {
- this.handleMissingMemberException(oCV);
- }
- if( oCV.envParams && oCV.envParams["updateToolbar"] === "true") {
- viewerIWidget.savedOutputMenuUpdated = false;
- viewerIWidget.updateToolbar();
- }
- if( oCV.envParams && oCV.envParams["ui.action"] === "buxView" ) {
- viewerIWidget.setSavedOutputsCMResponse( null );
- }
- if(typeof viewerIWidget.postOnFault == "function") {
- viewerIWidget.postOnFault();
- }
- this.parent.onFault.call(this, response);
-
- if (dispatcherEntry && response && response.getResponseState){
- // as we don't reset cv statuses when onFault called from processInitialResponse
- // since it's done inside processInitialResponse
- // then we do it when it comes from dispatcherEntry
- // when called from processInitialResponse then dispatcherEntry and response are null
- var responseState = response.getResponseState();
- if (responseState) {
- this.updateViewerState(responseState);
- }
- this.onPostEntryComplete();
- }
-
- };
- RequestHandler.prototype.handleGlobalPromptException = function(){
- var oCV = this.getViewer();
- var faultDialog = new GlobalPromptFaultDialog(oCV);
- oCV.disableRaiseSharePromptEvent();
- if(this.m_originalFormFields && !this.m_originalFormFields.exists("sharedPromptRequest")) {
- //for report that failed immediately on drop, the request needs to be resent on OK, otherwise,
- //user will get a blank widget.
- faultDialog.setSendRequestOnOK( true );
- }
- faultDialog.setErrorMessage(RV_RES.IDS_JS_GLOBAL_PROMPTS_NOT_RESPONDING_WARNING);
- this.setFaultDialog(faultDialog);
- };
- RequestHandler.prototype.isGlobalPromptException = function( ) {
- var oCV = this.getViewer();
- if (this.m_originalFormFields) {
- if( this.m_originalFormFields.exists("sharedPromptRequest") ||
- ( this.m_originalFormFields.get("ui.reportDrop") === "true" && this.m_originalFormFields.exists("widget.globalPromptInfo") ) ){
- return true;
- }
- }
- return false;
- };
- RequestHandler.prototype.postComplete = function() {
- var oCV = this.getViewer();
- // Wait until all the inline scripts are done executing.
- if (oCV.getStatus() == "complete" && !oCV.inlineScriptsDoneExecuting) {
- var objRef = this;
- setTimeout(function() { objRef.postComplete(); }, 10);
- return;
- }
-
- this.parent.postComplete.call(this);
- if (oCV && oCV.m_destroyed) {
- if (console) {
- console.warn("Tried to postComplete on an invalid CCognosViewer", oCV);
- }
- return;
- }
- var viewerIWidget = oCV.getViewerWidget();
- if(window['gReportWidgetLoadQueue']) {
- window['gReportWidgetLoadQueue'].widgetDoneLoading(viewerIWidget);
- }
- this.showReport();
- // make sure all our selections are cleared.
- oCV.getSelectionController().clearSelectionData();
- oCV.addPageAdornments();
- viewerIWidget.savedOutputMenuUpdated = false;
- if (oCV.getStatus() != "prompting") {
- viewerIWidget.fetchAnnotationData();
- viewerIWidget.getUndoRedoQueue().add({"reportUpdated": true});
- }
- viewerIWidget.updateToolbar();
- oCV.m_stateSet = true;
- oCV.doneLoading();
- if(typeof viewerIWidget.postComplete == "function") {
- viewerIWidget.postComplete();
- }
- };
- RequestHandler.prototype.updateViewerState = function(oState) {
- var oCV = this.getViewer();
- if (oCV && oCV.m_destroyed) {
- if (console) {
- console.warn("Tried to update state on an invalid CCognosViewer", oCV);
- }
- return;
- }
- this.parent.updateViewerState.call(this, oState);
- var status = oCV.getStatus();
- if(status != "fault") {
- if (oCV.envParams["buxToolbarPayload"]) {
- oCV.setToolbar(eval(oCV.envParams["buxToolbarPayload"]));
- delete oCV.envParams["buxToolbarPayload"];
- }
- if (oCV.envParams["buxContextMenuPayload"]) {
- oCV.setContextMenu(eval(oCV.envParams["buxContextMenuPayload"]));
- delete oCV.envParams["buxContextMenuPayload"];
- }
- if(oCV.envParams.reportPrompts) {
- oCV.getViewerWidget().setPromptParametersRetrieved(true);
- }
- if(oCV.envParams.reRunObject) {
- var formWarpRequest = document.getElementById("formWarpRequest" + oCV.getId());
- if (formWarpRequest["reRunObj"]) {
- formWarpRequest["reRunObj"].value = oCV.envParams.reRunObject;
- }
- else {
- formWarpRequest.appendChild(createHiddenFormField('reRunObj', oCV.envParams.reRunObject));
- }
- }
- }
- };
- /**
- * Should only be called once when the Viewer first loads. This is because
- * the initial response from the server didn't go through the dispatcher entries,
- * so we need logic to handle complete, working, fault, ...
- */
- RequestHandler.prototype.processInitialResponse = function(oState) {
- var oCV = this.getViewer();
- var viewerIWidget = oCV.getViewerWidget();
-
- if(viewerIWidget != null) {
- if (viewerIWidget.shouldUseSavedReportInfo()) {
- oCV.envParams["rapReportInfo"] = viewerIWidget.getAttributeValue("rapReportInfo");
- }
- this.parent.processInitialResponse.call(this, oState);
- // we need to call the render.done event so that pinFreeze size calculations are done correctly
- // this even can be fixed for all the Viewer's status, since as soon as we get a response from the
- // server we want to show our UI instead of chromes.
- viewerIWidget.fireEvent("com.ibm.bux.widget.render.done", null, {noAutoResize:true});
- this.getViewer().renderTabs();
- oCV.getPinFreezeManager().fromJSONString(viewerIWidget.getAttributeValue("PinFreezeInfo"));
- // we only need the outputKey for a working response since we're
- // not done getting the report output
- var status = oCV.getStatus();
- if (status != "working" && status != "stillWorking") {
- delete oCV.envParams["cv.outputKey"];
- viewerIWidget.setXNodeId(null);
- }
- switch(status) {
- case "complete":
- viewerIWidget.setOriginalFormFields(null);
- this.postComplete();
- break;
- case "working":
- case "stillWorking":
- oCV.getWorkingDialog().show();
- // add a delay for this callback to allow the server request to clean up, and not block any futher server requests
- setTimeout(getCognosViewerObjectRefAsString(oCV.getId())+".executeCallback(\"wait\");",10);
- break;
- case "prompting":
- viewerIWidget.hideToolbarAndContextMenu();
- break;
- case "fault":
- if (this.isAuthenticationFault()) {
- this.onPassportTimeout();
- }
- else {
- this.onFault();
- }
- }
- this.showReport();
- this.onPostEntryComplete();
- oCV.m_stateSet = true;
-
- this.onAsynchStatusUpdate(status);
- }
- else {
- var objRef = this;
- setTimeout(function() { objRef.processInitialResponse(oState); }, 100);
- }
- };
- RequestHandler.prototype.onPostEntryComplete = function()
- {
- var oCV = this.getViewer();
- if (oCV && oCV.getViewerWidget()) {
- var cvWidget = oCV.getViewerWidget();
- cvWidget.getLoadManager().processQueue();
- }
- };
- RequestHandler.prototype.isMissingMemberException = function(oCV, response){
-
- if (oCV.bMissingMemberException) {
- return true;
- }
-
- if (response && response.getResponseState) {
- var oState = response.getResponseState();
- if (oState && oState.envParams && oState.envParams.bMissingMemberException) {
- this._populateMissingMemberDetails(oCV, oState);
- return true;
- }
- }
- return false;
- };
- RequestHandler.prototype._populateMissingMemberDetails = function(oCV, oState){
- if (!oCV || !oState || !oState.envParams) {
- return;
- }
-
- oCV.bCanEditContent = oState.envParams.bCanEditContent;
- oCV.bHasParameters = oState.envParams.bHasParameters;
-
- if (oState.envParams["ui.spec"]) {
- if (oCV.envParams) {
- if (!oCV.envParams["ui.spec"]) {
- oCV.envParams["ui.spec"] = xml_decode(oState.envParams["ui.spec"]);
- }
- }
- }
- };
- RequestHandler.prototype.handleMissingMemberException = function(oCV){
- var sErrorMsg = null;
-
- sErrorMsg =(oCV.bCanEditContent) ? RV_RES.IDS_JS_MISSING_MEMBER_ERROR_MSG_FOR_SPEC_PARAM : RV_RES.IDS_JS_MISSING_MEMBER_ERROR_MSG_WITH_NO_BUA;
-
- var faultDialog = new MissingMemberFaultDialog(oCV, sErrorMsg, oCV.bCanEditContent, oCV.bHasParameters);
- this.setFaultDialog(faultDialog);
- };
- RequestHandler.prototype.massageHtmlBeforeDisplayed = function() {
- var oCV = this.getViewer();
- if (!oCV) {
- return;
- }
- var oWidget = oCV.getViewerWidget();
- if (!oWidget) {
- return;
- }
-
- oWidget.updateDrillThroughLinks();
- };
|