2nd crack at ajaxifying links and forms (made harder since some lessons produce a 2nd form and links based on earlier input
This commit is contained in:
		| @ -35,8 +35,8 @@ import org.owasp.webgoat.lessons.AbstractLesson; | ||||
|  * | ||||
|  * Getting Source ============== | ||||
|  * | ||||
|  * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository | ||||
|  * for free software projects. | ||||
|  * Source for this application is maintained at | ||||
|  * https://github.com/WebGoat/WebGoat, a repository for free software projects. | ||||
|  * | ||||
|  * For details, please see http://webgoat.github.io | ||||
|  * | ||||
| @ -202,12 +202,11 @@ public abstract class Screen { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // TODO we could hook all forms here with javascript call to ajax forms plugin | ||||
|     // hook all the links | ||||
|     public String getContent() { | ||||
|         String makeFormsAjax = "<script>  $(document).ready(function() { makeFormsAjax(); });</script>"; | ||||
|         // handle this on the page with js | ||||
|         makeFormsAjax = ""; | ||||
|         return (content == null) ? "" : content.toString() + makeFormsAjax; | ||||
|         String makeAllAjax = "<script>goat.utils.makeFormsAjax();goat.utils.ajaxifyAttackHref();</script>"; | ||||
|         // need to do this here as some of the lessons render forms after submission of an ajax form | ||||
|         return (content == null) ? "" : content.toString() + makeAllAjax; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|  | ||||
| @ -41,7 +41,7 @@ | ||||
|         <![endif]--> | ||||
|  | ||||
|         <!--Global JS--> | ||||
|          | ||||
|  | ||||
|         <script src="js/jquery_form/jquery.form.js"></script>   | ||||
|         <script src="plugins/bootstrap/js/bootstrap.min.js"></script> | ||||
|  | ||||
| @ -115,9 +115,9 @@ | ||||
|                             <a ng-click="accordionMenu(item.id)" href=""><i class="fa {{item.class}}"></i><span>{{item.name}}</span></a><!-- expanded = !expanded--> | ||||
|                             <ul class="slideDown lessonsAndStages {{item.displayClass}}" id="{{item.id}}" isOpen=0> | ||||
|                                 <li ng-repeat="lesson in item.children" class="{{lesson.selectedClass}}"> | ||||
|                                     <a ng-click="renderLesson(lesson.id,lesson.link,{showSource:lesson.showSource,showHints:lesson.showHints})" id="{{lesson.id}}" class="{{lesson.selectedClass}}" title="link to {{lesson.name}}" href="">{{lesson.name}}</a><span class="{{lesson.completeClass}}"></span> | ||||
|                                     <a ng-click="renderLesson(lesson.id, lesson.link, {showSource: lesson.showSource, showHints: lesson.showHints})" id="{{lesson.id}}" class="{{lesson.selectedClass}}" title="link to {{lesson.name}}" href="">{{lesson.name}}</a><span class="{{lesson.completeClass}}"></span> | ||||
|                                     <span ng-repeat="stage in lesson.children"> | ||||
|                                         <a ng-click="renderLesson(stage.id,stage.link,{showSource:stage.showSource,showHints:stage.showHints})" class="selectedClass" id="{{stage.id}}"  title="link to {{stage.name}}" href="">{{stage.name}}</a><span class="{{stage.completeClass}}"></span> | ||||
|                                         <a ng-click="renderLesson(stage.id, stage.link, {showSource: stage.showSource, showHints: stage.showHints})" class="selectedClass" id="{{stage.id}}"  title="link to {{stage.name}}" href="">{{stage.name}}</a><span class="{{stage.completeClass}}"></span> | ||||
|                                     </span> | ||||
|                                 </li> | ||||
|                             </ul> | ||||
| @ -177,19 +177,19 @@ | ||||
|                                             <div class="cookiesView"> | ||||
|                                                 <h4>Cookies</h4> | ||||
|                                                 <div class="cookieContainer" ng-repeat="cookie in cookies"> | ||||
|                                                 <table class="cookieTable table-striped table-nonfluid" > | ||||
|                                                     <thead> | ||||
|                                                         <tr><th class="col-sm-1"></th><th class="col-sm-1"></th></tr> <!-- Field / Value --> | ||||
|                                                     </thead> | ||||
|                                                     <tbody> | ||||
|                                                         <tr ng-repeat="(key, value) in cookie"> | ||||
|                                                             <td>{{key}}</td> | ||||
|                                                             <td>{{value}}</td> | ||||
|                                                         </tr> | ||||
|                                                     </tbody> | ||||
|                                                     <!--<li ng-repeat="(key, value) in cookie">{{key}} :: {{ value}} </td>--> | ||||
|                                                     <!--</ul>--> | ||||
|                                                 </table> | ||||
|                                                     <table class="cookieTable table-striped table-nonfluid" > | ||||
|                                                         <thead> | ||||
|                                                             <tr><th class="col-sm-1"></th><th class="col-sm-1"></th></tr> <!-- Field / Value --> | ||||
|                                                         </thead> | ||||
|                                                         <tbody> | ||||
|                                                             <tr ng-repeat="(key, value) in cookie"> | ||||
|                                                                 <td>{{key}}</td> | ||||
|                                                                 <td>{{value}}</td> | ||||
|                                                             </tr> | ||||
|                                                         </tbody> | ||||
|                                                         <!--<li ng-repeat="(key, value) in cookie">{{key}} :: {{ value}} </td>--> | ||||
|                                                         <!--</ul>--> | ||||
|                                                     </table> | ||||
|                                                 </div> | ||||
|                                             </div> | ||||
|                                             <div id="paramsView"> <!--class="paramsView"--> | ||||
| @ -296,7 +296,7 @@ | ||||
|  | ||||
|             $(document).ready(function() { | ||||
|                 //TODO merge appliction.js code into other js files | ||||
|                 app.init();                | ||||
|                 app.init(); | ||||
|             }); | ||||
|             // make all forms ajax forms | ||||
|             var options = { | ||||
| @ -354,7 +354,8 @@ | ||||
|                 // make any embedded forms ajaxy | ||||
|                 goat.utils.showLessonCookiesAndParams(); | ||||
|                 goat.utils.makeFormsAjax(); | ||||
|                 goat.utils.ajaxifyAttackHref(); //TODO find some way to hook scope for current menu. Likely needs larger refactor which is already started/stashed | ||||
|                 // links are hooked with each lesson now (see Java class Screen.getContent()) | ||||
|                 //goat.utils.ajaxifyAttackHref(); //TODO find some way to hook scope for current menu. Likely needs larger refactor which is already started/stashed | ||||
|                 //refresh menu | ||||
|                 angular.element($('#leftside-navigation')).scope().renderMenu(); | ||||
|             } | ||||
|  | ||||
| @ -8,170 +8,171 @@ var goatMenu = function($scope, $http, $modal, $log, $templateCache) { | ||||
|     $scope.cookies = []; | ||||
|     $scope.params = []; | ||||
|     $scope.renderMenu = function() { | ||||
| 	goat.data.loadMenu($http).then( //$http({method: 'GET', url: goatConstants.lessonService}) | ||||
| 	    function(menuData) { | ||||
| 		var menuItems = goat.utils.addMenuClasses(goatConstants.menuPrefix.concat(menuData.data)); | ||||
| 		//top-tier 'categories' | ||||
| 		for (var i=0;i<menuItems.length;i++) { | ||||
| 		    menuItems[i].id = goat.utils.makeId(menuItems[i].name);//TODO move the replace routine into util function | ||||
| 		    menuItems[i].displayClass= ($scope.openMenu === menuItems[i].id) ? goatConstants.keepOpenClass : ''; | ||||
| 		    if (menuItems[i].children) { | ||||
| 			for (var j=0;j<menuItems[i].children.length;j++){ | ||||
| 			    menuItems[i].children[j].id = goat.utils.makeId(menuItems[i].children[j].name); | ||||
| 			    //handle selected Menu state | ||||
| 			    if (menuItems[i].children[j].id === $scope.curMenuItemSelected) { | ||||
| 				menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass; | ||||
| 				menuItems[i].selectedClass = goatConstants.selectedMenuClass; | ||||
| 			    } | ||||
| 			    //handle complete state | ||||
| 			    if (menuItems[i].children[j].complete) { | ||||
| 				menuItems[i].children[j].completeClass = goatConstants.lessonCompleteClass; | ||||
| 			    } else { | ||||
| 				menuItems[i].children[j].completeClass =''; | ||||
| 			    } | ||||
| 			    if (menuItems[i].children[j].children) { | ||||
| 				for (var k=0;k < menuItems[i].children[j].children.length;k++) { | ||||
| 				    //TODO make utility function for name >> id | ||||
| 				    menuItems[i].children[j].children[k].id = goat.utils.makeId(menuItems[i].children[j].children[k].name); | ||||
| 				    //menuItems[i].children[j].children[k].id = menuItems[i].children[j].children[k].name.replace(/\s|\(|\)/g,''); | ||||
| 				    //handle selected Menu state | ||||
| 				    if (menuItems[i].children[j].children[k].id === $scope.curMenuItemSelected) { | ||||
| 					menuItems[i].children[j].children[k].selectedClass = goatConstants.selectedMenuClass; | ||||
| 					menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass; | ||||
| 				    } | ||||
| 				    //handle complete state | ||||
| 				    if (menuItems[i].children[j].children[k].complete) { | ||||
| 					menuItems[i].children[j].children[k].completeClass= goatConstants.lessonCompleteClass; | ||||
| 				    } else { | ||||
| 					menuItems[i].children[j].children[k].completeClass= '' | ||||
| 				    } | ||||
| 				} | ||||
| 			    } | ||||
| 			}		     | ||||
| 		    } | ||||
| 		} | ||||
| 		$scope.menuTopics = menuItems; | ||||
| 		// | ||||
| 		if ($scope.openMenu) { | ||||
| 		    $('ul'+$scope.openMenu).show(); | ||||
| 		} | ||||
| 		 | ||||
| 	    }, | ||||
| 	    function(error) { | ||||
| 		// TODO - handle this some way other than an alert | ||||
| 		console.error("Error rendering menu: " + error); | ||||
| 	    }	 | ||||
| 	); | ||||
|         goat.data.loadMenu($http).then(//$http({method: 'GET', url: goatConstants.lessonService}) | ||||
|                 function(menuData) { | ||||
|                     var menuItems = goat.utils.addMenuClasses(goatConstants.menuPrefix.concat(menuData.data)); | ||||
|                     //top-tier 'categories' | ||||
|                     for (var i = 0; i < menuItems.length; i++) { | ||||
|                         menuItems[i].id = goat.utils.makeId(menuItems[i].name);//TODO move the replace routine into util function | ||||
|                         menuItems[i].displayClass = ($scope.openMenu === menuItems[i].id) ? goatConstants.keepOpenClass : ''; | ||||
|                         if (menuItems[i].children) { | ||||
|                             for (var j = 0; j < menuItems[i].children.length; j++) { | ||||
|                                 menuItems[i].children[j].id = goat.utils.makeId(menuItems[i].children[j].name); | ||||
|                                 //handle selected Menu state | ||||
|                                 if (menuItems[i].children[j].id === $scope.curMenuItemSelected) { | ||||
|                                     menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                     menuItems[i].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                 } | ||||
|                                 //handle complete state | ||||
|                                 if (menuItems[i].children[j].complete) { | ||||
|                                     menuItems[i].children[j].completeClass = goatConstants.lessonCompleteClass; | ||||
|                                 } else { | ||||
|                                     menuItems[i].children[j].completeClass = ''; | ||||
|                                 } | ||||
|                                 if (menuItems[i].children[j].children) { | ||||
|                                     for (var k = 0; k < menuItems[i].children[j].children.length; k++) { | ||||
|                                         //TODO make utility function for name >> id | ||||
|                                         menuItems[i].children[j].children[k].id = goat.utils.makeId(menuItems[i].children[j].children[k].name); | ||||
|                                         //menuItems[i].children[j].children[k].id = menuItems[i].children[j].children[k].name.replace(/\s|\(|\)/g,''); | ||||
|                                         //handle selected Menu state | ||||
|                                         if (menuItems[i].children[j].children[k].id === $scope.curMenuItemSelected) { | ||||
|                                             menuItems[i].children[j].children[k].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                             menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                         } | ||||
|                                         //handle complete state | ||||
|                                         if (menuItems[i].children[j].children[k].complete) { | ||||
|                                             menuItems[i].children[j].children[k].completeClass = goatConstants.lessonCompleteClass; | ||||
|                                         } else { | ||||
|                                             menuItems[i].children[j].children[k].completeClass = '' | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     $scope.menuTopics = menuItems; | ||||
|                     // | ||||
|                     if ($scope.openMenu) { | ||||
|                         $('ul' + $scope.openMenu).show(); | ||||
|                     } | ||||
|  | ||||
|                 }, | ||||
|                 function(error) { | ||||
|                     // TODO - handle this some way other than an alert | ||||
|                     console.error("Error rendering menu: " + error); | ||||
|                 } | ||||
|         ); | ||||
|     }; | ||||
|  | ||||
|     $scope.renderLesson = function(id,url,showControls) {//TODO convert to single object parameter | ||||
|     $scope.renderLesson = function(id, url, showControls) {//TODO convert to single object parameter | ||||
|         $scope.hintIndex = 0; | ||||
|         var curScope = $scope; | ||||
| 	$('.lessonHelp').hide(); | ||||
| 	// clean up menus, mark selected | ||||
| 	$scope.curMenuItemSelected = id; | ||||
| 	goat.utils.highlightCurrentLessonMenu(id); | ||||
|         $('.lessonHelp').hide(); | ||||
|         // clean up menus, mark selected | ||||
|         $scope.curMenuItemSelected = id; | ||||
|         goat.utils.highlightCurrentLessonMenu(id); | ||||
|         curScope.parameters = goat.utils.scrapeParams(url); | ||||
| 	// lesson content | ||||
|         goat.data.loadLessonContent($http,url).then( | ||||
| 	    function(reply) { | ||||
| 		goat.data.loadLessonTitle($http).then( | ||||
| 		    function(reply) { | ||||
| 			    $("#lessonTitle").text(reply.data); | ||||
| 		    } | ||||
| 		); | ||||
| 		//TODO encode html or get angular js portion working | ||||
| 		$("#lesson_content").html(reply.data); | ||||
| 		//hook forms | ||||
| 		goat.utils.makeFormsAjax();// inject form? | ||||
| 		goat.utils.ajaxifyAttackHref(); | ||||
| 		$('#leftside-navigation').height($('#main-content').height()+15)//TODO: get ride of fixed value (15)here | ||||
| 		//notifies goatLesson Controller of the less change | ||||
| 		$scope.$emit('lessonUpdate',{params:curScope.parameters,'showControls':showControls}); | ||||
| 	    } | ||||
| 	) | ||||
| 	$scope.renderMenu();	 | ||||
|         // lesson content | ||||
|         goat.data.loadLessonContent($http, url).then( | ||||
|                 function(reply) { | ||||
|                     goat.data.loadLessonTitle($http).then( | ||||
|                             function(reply) { | ||||
|                                 $("#lessonTitle").text(reply.data); | ||||
|                             } | ||||
|                     ); | ||||
|                     //TODO encode html or get angular js portion working | ||||
|                     $("#lesson_content").html(reply.data); | ||||
|                     //hook forms | ||||
|                     goat.utils.makeFormsAjax();// inject form? | ||||
|                     // links are hooked with each lesson now (see Java class Screen.getContent()) | ||||
|                     //goat.utils.ajaxifyAttackHref(); | ||||
|                     $('#leftside-navigation').height($('#main-content').height() + 15)//TODO: get ride of fixed value (15)here | ||||
|                     //notifies goatLesson Controller of the less change | ||||
|                     $scope.$emit('lessonUpdate', {params: curScope.parameters, 'showControls': showControls}); | ||||
|                 } | ||||
|         ) | ||||
|         $scope.renderMenu(); | ||||
|     }; | ||||
|     $scope.accordionMenu = function(id) { | ||||
| 	if ($('ul#'+id).attr('isOpen') == 0) { | ||||
| 	    $scope.expandMe = true;     | ||||
| 	} else { | ||||
| 	    $('ul#'+id).slideUp(300).attr('isOpen',0); | ||||
| 	    return; | ||||
| 	} | ||||
| 	$scope.openMenu = id; | ||||
| 	$('.lessonsAndStages').not('ul#'+id).slideUp(300).attr('isOpen',0); | ||||
| 	if ($scope.expandMe) { | ||||
| 	    $('ul#'+id).slideDown(300).attr('isOpen',1); | ||||
| 	} | ||||
|         if ($('ul#' + id).attr('isOpen') == 0) { | ||||
|             $scope.expandMe = true; | ||||
|         } else { | ||||
|             $('ul#' + id).slideUp(300).attr('isOpen', 0); | ||||
|             return; | ||||
|         } | ||||
|         $scope.openMenu = id; | ||||
|         $('.lessonsAndStages').not('ul#' + id).slideUp(300).attr('isOpen', 0); | ||||
|         if ($scope.expandMe) { | ||||
|             $('ul#' + id).slideDown(300).attr('isOpen', 1); | ||||
|         } | ||||
|     } | ||||
|     $scope.renderMenu(); | ||||
|     // runs on first loadcan be augmented later to ' | ||||
|     // resume' for a given user ... currently kluged to start at fixed lesson | ||||
|     var url = 'attack?Screen=32&menu=5'; | ||||
|     angular.element($('#leftside-navigation')).scope().renderLesson(null,url); | ||||
|     angular.element($('#leftside-navigation')).scope().renderLesson(null, url); | ||||
| } | ||||
|  | ||||
| /* lesson controller */ | ||||
| var goatLesson = function($scope,$http,$log) { | ||||
| var goatLesson = function($scope, $http, $log) { | ||||
|  | ||||
|     $('#hintsView').hide(); | ||||
| 	// adjust menu to lessonContent size if necssary | ||||
| 	//cookies | ||||
| 	 | ||||
| 	$scope.$on('lessonUpdate',function(params){ | ||||
| 	    $scope.parameters = arguments[1].params; | ||||
| 	    $scope.showHints = (arguments[1].showControls && arguments[1].showControls.showHints); | ||||
| 	    $scope.showSource = (arguments[1].showControls && arguments[1].showControls.showSource); | ||||
| 	    curScope = $scope; //TODO .. update below, this curScope is probably not needed | ||||
| 	    goat.data.loadCookies($http).then( | ||||
| 		function(resp) { | ||||
| 		    curScope.cookies = resp.data; | ||||
| 		} | ||||
| 	    ); | ||||
| 	    //hints | ||||
| 	    curScope.hintIndex = 0; | ||||
| 	    if ($scope.showHints) { | ||||
| 		goat.data.loadHints($http).then( | ||||
| 		    function(resp) { | ||||
| 			curScope.hints = resp.data; | ||||
| 			if (curScope.hints.length > 0 && curScope.hints[0].hint.indexOf(goatConstants.noHints) === -1) { | ||||
| 			    goat.utils.displayButton('showHintsBtn', true); | ||||
| 			} else { | ||||
| 			    goat.utils.displayButton('showHintsBtn', false); | ||||
| 			} | ||||
| 		    } | ||||
| 		); | ||||
| 	    } else { | ||||
| 		$scope.hints = null; | ||||
| 		goat.utils.displayButton('showHintsBtn', false); | ||||
| 	    } | ||||
| 	    //source | ||||
| 	    if ($scope.showSource) { | ||||
| 		goat.data.loadSource($http).then( | ||||
| 		    function(resp) { | ||||
| 			curScope.source = resp.data; | ||||
| 		    } | ||||
| 		); | ||||
| 	    } else { | ||||
| 		$scope.source = goatConstants.noSourcePulled; | ||||
| 	    } | ||||
| 	     | ||||
| 	    //plan | ||||
| 	    goat.data.loadPlan($http).then( | ||||
| 		    function(resp) { | ||||
| 			curScope.plan = resp.data; | ||||
| 		    } | ||||
| 	    ); | ||||
| 	    //solution | ||||
| 	    goat.data.loadSolution($http).then( | ||||
| 		    function(resp) { | ||||
| 			curScope.solution = resp.data; | ||||
| 		    } | ||||
| 	    ); | ||||
| 	}); | ||||
| 		 | ||||
| 	//goat.utils.scrollToTop(); | ||||
|     // adjust menu to lessonContent size if necssary | ||||
|     //cookies | ||||
|  | ||||
|     $scope.$on('lessonUpdate', function(params) { | ||||
|         $scope.parameters = arguments[1].params; | ||||
|         $scope.showHints = (arguments[1].showControls && arguments[1].showControls.showHints); | ||||
|         $scope.showSource = (arguments[1].showControls && arguments[1].showControls.showSource); | ||||
|         curScope = $scope; //TODO .. update below, this curScope is probably not needed | ||||
|         goat.data.loadCookies($http).then( | ||||
|                 function(resp) { | ||||
|                     curScope.cookies = resp.data; | ||||
|                 } | ||||
|         ); | ||||
|         //hints | ||||
|         curScope.hintIndex = 0; | ||||
|         if ($scope.showHints) { | ||||
|             goat.data.loadHints($http).then( | ||||
|                     function(resp) { | ||||
|                         curScope.hints = resp.data; | ||||
|                         if (curScope.hints.length > 0 && curScope.hints[0].hint.indexOf(goatConstants.noHints) === -1) { | ||||
|                             goat.utils.displayButton('showHintsBtn', true); | ||||
|                         } else { | ||||
|                             goat.utils.displayButton('showHintsBtn', false); | ||||
|                         } | ||||
|                     } | ||||
|             ); | ||||
|         } else { | ||||
|             $scope.hints = null; | ||||
|             goat.utils.displayButton('showHintsBtn', false); | ||||
|         } | ||||
|         //source | ||||
|         if ($scope.showSource) { | ||||
|             goat.data.loadSource($http).then( | ||||
|                     function(resp) { | ||||
|                         curScope.source = resp.data; | ||||
|                     } | ||||
|             ); | ||||
|         } else { | ||||
|             $scope.source = goatConstants.noSourcePulled; | ||||
|         } | ||||
|  | ||||
|         //plan | ||||
|         goat.data.loadPlan($http).then( | ||||
|                 function(resp) { | ||||
|                     curScope.plan = resp.data; | ||||
|                 } | ||||
|         ); | ||||
|         //solution | ||||
|         goat.data.loadSolution($http).then( | ||||
|                 function(resp) { | ||||
|                     curScope.solution = resp.data; | ||||
|                 } | ||||
|         ); | ||||
|     }); | ||||
|  | ||||
|     //goat.utils.scrollToTop(); | ||||
|  | ||||
|  | ||||
|     $scope.showLessonSource = function() { | ||||
| @ -216,42 +217,42 @@ var goatLesson = function($scope,$http,$log) { | ||||
|         $('.lessonHelp').hide(); | ||||
|         $('#lesson_hint_row').show(); | ||||
|         //goat.utils.scrollToHelp(); | ||||
| 	//TODO | ||||
|         //TODO | ||||
|         $scope.curHint = $scope.hints[$scope.hintIndex].hint; | ||||
| 	//$scope.curHint = $sce.trustAsHtml($scope.hints[$scope.hintIndex].hint); | ||||
| 	//TODO get html binding workin in the UI ... in the meantime ... | ||||
| 	//$scope.renderCurHint(); | ||||
|         //$scope.curHint = $sce.trustAsHtml($scope.hints[$scope.hintIndex].hint); | ||||
|         //TODO get html binding workin in the UI ... in the meantime ... | ||||
|         //$scope.renderCurHint(); | ||||
|         $scope.manageHintButtons(); | ||||
|     }; | ||||
|  | ||||
|     $scope.viewNextHint = function() { | ||||
|         $scope.hintIndex++; | ||||
|         $scope.curHint = $scope.hints[$scope.hintIndex].hint; | ||||
| 	$scope.renderCurHint(); | ||||
|         $scope.renderCurHint(); | ||||
|         $scope.manageHintButtons(); | ||||
|     }; | ||||
|  | ||||
|     $scope.viewPrevHint = function() { | ||||
|         $scope.hintIndex--; | ||||
|         $scope.curHint = $scope.hints[$scope.hintIndex].hint; | ||||
| 	$scope.renderCurHint(); | ||||
|         $scope.renderCurHint(); | ||||
|         $scope.manageHintButtons(); | ||||
|     }; | ||||
|      | ||||
|  | ||||
|     $scope.renderCurHint = function() { | ||||
| 	$('#curHintContainer').html($scope.curHint); | ||||
|         $('#curHintContainer').html($scope.curHint); | ||||
|     } | ||||
|  | ||||
|     $scope.hideHints = function() { | ||||
|  | ||||
|     }; | ||||
|      | ||||
|     $scope.restartLesson = function () { | ||||
| 	goat.data.loadRestart($http).then( | ||||
| 	    function(resp) { | ||||
| 		angular.element($('#leftside-navigation')).scope().renderLesson(null,resp.data,{showSource:$scope.showSource,showHints:$scope.showHints}); | ||||
| 	    } | ||||
| 	) | ||||
|  | ||||
|     $scope.restartLesson = function() { | ||||
|         goat.data.loadRestart($http).then( | ||||
|                 function(resp) { | ||||
|                     angular.element($('#leftside-navigation')).scope().renderLesson(null, resp.data, {showSource: $scope.showSource, showHints: $scope.showHints}); | ||||
|                 } | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     $scope.showAbout = function() { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user