From 13c8be3d82350082093df8cd65771f09fcb83c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1=20Smodi=C5=A1?= Date: Tue, 15 Dec 2015 11:26:23 +0100 Subject: Fixed the bug about the loss of problem solving screen state when entering a navigation-bar state and getting back. Now every state carries with itself the publicly exposed jqScreen object and isModal boolean information, which is used by the globalStateMachine in the actualTransition method. --- js/codeq/aaiLogin.js | 2 ++ js/codeq/about.js | 3 +++ js/codeq/change_password.js | 3 +++ js/codeq/language.js | 2 ++ js/codeq/login.js | 2 ++ js/codeq/navigation.js | 44 +++++++++++++++++++++++++++++++++++++++----- js/codeq/problem_list.js | 2 ++ js/codeq/profile.js | 10 +++++++--- js/codeq/prolog.js | 3 +++ js/codeq/python.js | 2 ++ js/codeq/robot.js | 2 ++ js/codeq/settings.js | 3 +++ js/codeq/signup.js | 2 ++ js/codeq/upgrade_to_aai.js | 2 ++ 14 files changed, 74 insertions(+), 8 deletions(-) diff --git a/js/codeq/aaiLogin.js b/js/codeq/aaiLogin.js index a0a8e68..abe7283 100644 --- a/js/codeq/aaiLogin.js +++ b/js/codeq/aaiLogin.js @@ -29,6 +29,8 @@ along with this program. If not, see . */ samlLoginUrl = ''; codeq.globalStateMachine.register('aailogin',{ + 'jqScreen': jqScreen, + 'enter': function(){ jqDisabledOverlay.css('display', ''); codeq.samlLogin = true;//set the flag diff --git a/js/codeq/about.js b/js/codeq/about.js index 25fa829..f56d9fd 100644 --- a/js/codeq/about.js +++ b/js/codeq/about.js @@ -23,6 +23,9 @@ along with this program. If not, see . */ jqBtnGoBack = $("#btnAboutGoBack"); codeq.globalStateMachine.register('about',{ + 'jqScreen': jqScreen, + 'isModal': true, + 'enter': function(){ jqBtnGoBack.on('click',function(){ history.back();//forces a transition to the previous state diff --git a/js/codeq/change_password.js b/js/codeq/change_password.js index dc5db39..6ebd6dd 100644 --- a/js/codeq/change_password.js +++ b/js/codeq/change_password.js @@ -26,6 +26,9 @@ along with this program. If not, see . */ jqChangePassForm = $('#formChangePassword'); codeq.globalStateMachine.register('changePassword',{ + 'jqScreen': jqScreen, + 'isModal': true, + 'enter': function(){ jqCancelBtn.on('click',function(){ history.back();//forces a transition to the previous state diff --git a/js/codeq/language.js b/js/codeq/language.js index 5433c84..cacdb32 100644 --- a/js/codeq/language.js +++ b/js/codeq/language.js @@ -28,6 +28,8 @@ along with this program. If not, see . */ }; codeq.globalStateMachine.register('language',{ + 'jqScreen': jqScreen, + 'enter': function(){ jqScreen.css('display', ''); jqProlog.on('click', function (e) { e.preventDefault(); choose('prolog') }); diff --git a/js/codeq/login.js b/js/codeq/login.js index 162e336..f7ddeb3 100644 --- a/js/codeq/login.js +++ b/js/codeq/login.js @@ -78,6 +78,8 @@ along with this program. If not, see . */ formInputs = $('#username, #password'); codeq.globalStateMachine.register('login',{ + 'jqScreen': jqScreen, + 'enter': function(){ jqNavigationHomeBtn.off('click');//remove the click listener of this element here jqNavBarRight.css('display','none');//hide settings etc. diff --git a/js/codeq/navigation.js b/js/codeq/navigation.js index da2b04a..cfff71b 100644 --- a/js/codeq/navigation.js +++ b/js/codeq/navigation.js @@ -49,7 +49,8 @@ along with this program. If not, see . */ //the global state machine is a bit different - so it'll be implemented here var makeGlobalStateMachine = function (def) { - var currState = null; + var currState = null, + waitingState = null; // state hidden with a modal form var stateChangeFun = function historyStateChangeHandler() { var historyState = History.getState(); codeq.globalStateMachine.actualTransition.apply(codeq.globalStateMachine, $.merge([historyState.data.state] ,historyState.data.params)); @@ -77,11 +78,14 @@ along with this program. If not, see . */ } }, 'destroy': function () { + var i; if (currState) currState.exit(); currState = null; + if (waitingState) waitingState.exit(); + waitingState = null; History.Adapter.unbind(window, 'statechange', stateChangeFun); }, - 'register': function (name, state) { + 'register': function (name, state, props) { if (name in def) codeq.log.error('The state ' + name + ' is already registered, overriding'); def[name] = state; }, @@ -93,9 +97,39 @@ along with this program. If not, see . */ var newState = def[name];//if the newState is not the same as the old or if it doesn't exist at all is already checked at this point - if (currState) currState.exit(); - currState = newState; - currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1])); +// if (currState) currState.exit(); +// currState = newState; +// currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1])); + if (currState) { + if (newState.isModal) { + if (currState.isModal) currState.exit(); + else { + waitingState = currState; + waitingState.jqScreen.css('display', 'none'); + } + currState = newState; + currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1])); + } + else { + currState.exit(); + currState = newState; + if (waitingState === newState) { + waitingState.jqScreen.css('display', ''); + waitingState = null; + } + else { + if (waitingState) { + waitingState.exit(); + waitingState = null; + } + currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1])); + } + } + } + else { + currState = newState; + currState.enter.apply(currState, Array.prototype.slice.apply(arguments, [1])); + } } } }; diff --git a/js/codeq/problem_list.js b/js/codeq/problem_list.js index 8c3808e..e3ce255 100644 --- a/js/codeq/problem_list.js +++ b/js/codeq/problem_list.js @@ -382,6 +382,8 @@ along with this program. If not, see . */ // ================================================================================ codeq.globalStateMachine.register('problem_list', { + 'jqScreen': jqScreen, + 'enter': function(language){ var data = languageCache[language]; // language data diff --git a/js/codeq/profile.js b/js/codeq/profile.js index 09a0e05..f863140 100644 --- a/js/codeq/profile.js +++ b/js/codeq/profile.js @@ -20,13 +20,17 @@ along with this program. If not, see . */ (function(){ - var jqBtnChangePass = $("#change_pass_profile"), + var jqScreen = $("#screen_profile"), + jqBtnChangePass = $("#change_pass_profile"), jqBtnGoBack = $("#btnProfileGoBack"); codeq.profile = { }; codeq.globalStateMachine.register('profile',{ + 'jqScreen': jqScreen, + 'isModal': true, + 'enter': function(){ jqBtnChangePass.on('click',function(){ codeq.globalStateMachine.transition('changePassword'); @@ -35,7 +39,7 @@ along with this program. If not, see . */ history.back();//forces a transition to the previous state }); if(codeq.samlLogin) $('#loggedInViaSamlSpan').css("display","");//show the span if we actually logged in with SAML - $("#screen_profile").css('display', ''); + jqScreen.css('display', ''); $('#disabled').css('display', 'none'); codeq.comms.getUserStat() .then(function (data) { @@ -78,7 +82,7 @@ along with this program. If not, see . */ 'exit' : function(){ jqBtnChangePass.off('click'); jqBtnGoBack.off('click'); - $("#screen_profile").css('display', 'none'); + jqScreen.css('display', 'none'); $('#loggedInViaSamlSpan').css("display","none"); } }); diff --git a/js/codeq/prolog.js b/js/codeq/prolog.js index 7f74aaf..8a6cddc 100644 --- a/js/codeq/prolog.js +++ b/js/codeq/prolog.js @@ -82,6 +82,8 @@ along with this program. If not, see . */ }; var prologHandler; //created when we enter the prolog state and destroyed once we leave it codeq.globalStateMachine.register('prolog', { + 'jqScreen': jqScreen, + 'enter': function (problemDef, commonDef, currentSolution) { $('#navigation-problem_list').css('display', ''); $("#navigation-prolog").addClass("active"); @@ -103,6 +105,7 @@ along with this program. If not, see . */ }); }, 'exit': function () { + codeq.log.info('prolog exit()'); jqAllButtons.off(); // unregister all event handlers jqAllQuadrants.off(); jqScreen.css('display', 'none'); diff --git a/js/codeq/python.js b/js/codeq/python.js index 4033a63..b1f46f5 100644 --- a/js/codeq/python.js +++ b/js/codeq/python.js @@ -87,6 +87,8 @@ along with this program. If not, see . */ }; var pythonHandler; //created when we enter the python state and destroyed once we leave it codeq.globalStateMachine.register('python', { + 'jqScreen': jqScreen, + 'enter': function (problemDef, commonDef, currentSolution) { $('#navigation-problem_list').css('display', ''); $("#navigation-python").addClass("active"); diff --git a/js/codeq/robot.js b/js/codeq/robot.js index 0dca6f3..cfff13d 100644 --- a/js/codeq/robot.js +++ b/js/codeq/robot.js @@ -82,6 +82,8 @@ along with this program. If not, see . */ }; var robotHandler; //created when we enter the robot state and destroyed once we leave it codeq.globalStateMachine.register('robot', { + 'jqScreen': jqScreen, + 'enter': function (problemDef, commonDef, currentSolution) { $('#navigation-problem_list').css('display', ''); $("#navigation-robot").addClass("active"); diff --git a/js/codeq/settings.js b/js/codeq/settings.js index 3e72cbd..6fec614 100644 --- a/js/codeq/settings.js +++ b/js/codeq/settings.js @@ -34,6 +34,9 @@ along with this program. If not, see . */ }); codeq.globalStateMachine.register('settings',{ + 'jqScreen': jqScreenSettings, + 'isModal': true, + 'enter':function(){ jqDisabledOverlay.css('display', ''); robotAddressInput.val(codeq.settings['robot_address']);//set the robot address once we enter the state diff --git a/js/codeq/signup.js b/js/codeq/signup.js index 2667fe4..5f3f2be 100644 --- a/js/codeq/signup.js +++ b/js/codeq/signup.js @@ -32,6 +32,8 @@ along with this program. If not, see . */ jqNavigationHomeBtn = $('#navigation-home'); codeq.globalStateMachine.register('signup',{ + 'jqScreen': jqScreen, + 'enter': function(){ jqNavigationHomeBtn.off('click');//remove the click listener of this element here jqNavBarRight.css('display','none');//hide settings etc. diff --git a/js/codeq/upgrade_to_aai.js b/js/codeq/upgrade_to_aai.js index 6ea5855..5357a29 100644 --- a/js/codeq/upgrade_to_aai.js +++ b/js/codeq/upgrade_to_aai.js @@ -26,6 +26,8 @@ along with this program. If not, see . */ jqLangSelect = jqScreen.find('.lang-select'); codeq.globalStateMachine.register('upgradeToAAI',{ + 'jqScreen': jqScreen, + 'enter': function(){ jqNoBtn.on('click',function(){ codeq.comms.samlLogin(false) -- cgit v1.2.1