Index: lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/IndexButton.as =================================================================== RCS file: /usr/local/cvsroot/lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/IndexButton.as,v diff -u -r1.14 -r1.15 --- lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/IndexButton.as 21 Oct 2008 03:09:01 -0000 1.14 +++ lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/IndexButton.as 13 Nov 2008 05:19:32 -0000 1.15 @@ -20,7 +20,7 @@ * http://www.gnu.org/licenses/gpl.txt * ************************************************************************ */ - + import org.lamsfoundation.lams.common.util.*; import org.lamsfoundation.lams.common.ui.*; import org.lamsfoundation.lams.common.style.*; @@ -111,8 +111,7 @@ LFMessage.showMessageAlert(Dictionary.getValue('mv_search_error_msg', [mm.numIndexButtons]), null); } else { - var mc:MonitorController = mm.getMonitor().getMV().getController(); - matchesArr = mc.searchForLearners(String(mm.learnerIndexView.getIdxTextField().text)); + matchesArr = mm.searchForLearners(String(mm.learnerIndexView.getIdxTextField().text)); if (matchesArr.length > 0) { mm.drawIndexButtons = true; mm.currentLearnerIndexNoRedraw = 1; Index: lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorController.as =================================================================== RCS file: /usr/local/cvsroot/lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorController.as,v diff -u -r1.30 -r1.31 --- lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorController.as 21 Oct 2008 03:09:01 -0000 1.30 +++ lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorController.as 13 Nov 2008 05:19:31 -0000 1.31 @@ -665,28 +665,6 @@ } /** - * Searches for learners by name, and returns an array of learners whose full names contain the search string (case insensitive). - * - * @param searchStr The learner name to search - * @return matches Array of Learners whose names contain the search string - */ - public function searchForLearners(searchStr:String):Array { - Debugger.log("searchForLearners invoked, searching for "+searchStr, Debugger.CRITICAL, "searchForLearners", "MonitorController"); - - var len:Number = _monitorModel.progressArrBackup.length; - - var matches:Array = new Array(); - for (var i = 0; i < len; i++) { - var fullName:String = _monitorModel.progressArrBackup[i].getFullName(); - if (fullName.toLowerCase().indexOf(searchStr.toLowerCase()) != -1){ - Debugger.log("Match Found With: "+ fullName, Debugger.CRITICAL, "searchForLearners", "MonitorController"); - matches.push(_monitorModel.progressArrBackup[i]); - } - } - return matches; - } - - /** * Alert message after applying the remove action on a archived lesson. * * @param msg Message to display Index: lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorModel.as =================================================================== RCS file: /usr/local/cvsroot/lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorModel.as,v diff -u -r1.39 -r1.40 --- lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorModel.as 21 Oct 2008 03:09:01 -0000 1.39 +++ lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorModel.as 13 Nov 2008 05:19:32 -0000 1.40 @@ -141,6 +141,8 @@ private var _openBranchingActivity:Number; + private var _learnerSortingMechanism:String; + private var dispatchEvent:Function; public var addEventListener:Function; public var removeEventListener:Function; @@ -285,7 +287,6 @@ infoObj.updateType = "DRAW_DESIGN"; infoObj.tabID = getSelectedTab(); notifyObservers(infoObj); - } /** @@ -610,6 +611,28 @@ return _numPreferredIndexButtons; } + /** + * Searches for learners by name, and returns an array of learners whose full names contain the search string (case insensitive). + * + * @param searchStr The learner name to search + * @return matches Array of Learners whose names contain the search string + */ + public function searchForLearners(searchStr:String):Array { + Debugger.log("searchForLearners invoked, searching for "+searchStr, Debugger.CRITICAL, "searchForLearners", "MonitorModel"); + + var len:Number = progressArrBackup.length; + + var matches:Array = new Array(); + for (var i = 0; i < len; i++) { + var fullName:String = progressArrBackup[i].getFullName(); + if (fullName.toLowerCase().indexOf(searchStr.toLowerCase()) != -1){ + Debugger.log("Match Found With: "+ fullName, Debugger.CRITICAL, "searchForLearners", "MonitorModel"); + matches.push(progressArrBackup[i]); + } + } + return matches; + } + public function set searchResults(matchesArr:Array) { if (!_inSearchView) { _currentLearnerIndex = 1; @@ -619,6 +642,17 @@ _searchResultsBackup = matchesArr; } + public function setLearnerSortingMechanism(m:String) { + Debugger.log("Learner sorting mechanism set to: "+m, Debugger.CRITICAL, "setLearnerSortingMechanism", "MonitorModel"); + _learnerSortingMechanism = m; + + broadcastViewUpdate("DRAW_DESIGN", null, getSelectedTab(), null); + } + + public function getLearnerSortingMechanism():String { + return (_learnerSortingMechanism == undefined) ? "alphabetically" : _learnerSortingMechanism; + } + // invoked on refresh public function resetLearnerIndexBar():Void { _drawButtons = true; @@ -1330,10 +1364,52 @@ } public function get allLearnersProgress():Array{ - learnerTabActArr.sortOn(["_learnerLName", "_learnerFName"], Array.CASEINSENSITIVE); + //TODO: add order boolean param, to indicate whether or not to apply ordering or just return the array as is + if (getLearnerSortingMechanism() == "alphabetically") { + learnerTabActArr.sortOn(["_learnerLName", "_learnerFName"], Array.CASEINSENSITIVE); + } + else if (getLearnerSortingMechanism() == "completion") { + learnerTabActArr = orderByCompletion(); + } return learnerTabActArr; } + private function orderByCompletion():Array { + var completedLearnersArr:Array = new Array(); + var unfinishedLearnersArr:Array = new Array(); + var retArray:Array = new Array(); + + var largestNumCompletedActs:Number = 0; // the most acts completed by an unfinished learner + + // seperate learners into completed and unfinished arrays + for (var index in learnerTabActArr) { + if (learnerTabActArr[index].isLessonComplete()) { + completedLearnersArr.push(learnerTabActArr[index]); + } else { + + if (learnerTabActArr[index].getCompletedActivities().length > largestNumCompletedActs) { + largestNumCompletedActs = learnerTabActArr[index].getCompletedActivities().length; + } + unfinishedLearnersArr.push(learnerTabActArr[index]); + } + } + + completedLearnersArr.sortOn(["_learnerLName", "_learnerFName"], Array.CASEINSENSITIVE); + unfinishedLearnersArr.sortOn(["_learnerLName", "_learnerFName"], Array.CASEINSENSITIVE); + + for (var i=0; i=0; i--) { + for (var j=0; j displayedButtons.length && displayedButtons.length == mm.numPreferredIndexButtons) - mm.drawIndexButtons = true; + mm.drawIndexButtons = true; if ((displayedButtons.length > 0) && (mm.drawIndexButtons)) { removeButtons(); } - + if (mm.drawIndexButtons) { _buttonsPanel_mc = this.createEmptyMovieClip("_buttonsPanel_mc", DepthManager.kTop); addRangeLabel(mm); @@ -246,39 +246,23 @@ direction = null; } } - + + if (mm.drawIndexButtons) { + addOrderCheckBox(mm); + } + nextPosition = 0; } public function removeButtons(){ - Debugger.log("Removing Index Buttons", Debugger.GEN, "removeButtons", "LearnerIndexView"); - _buttonsPanel_mc.removeMovieClip(rangeLabel); - - //need to remove the text field from the background - textFieldBackground_mc.removeMovieClip(idxTextField); - _buttonsPanel_mc.removeMovieClip(textFieldBackground_mc); - - if (mm.numIndexButtons > mm.numPreferredIndexButtons) - _buttonsPanel_mc.removeMovieClip(backBtn); - - while (displayedButtons.length != 0) { - var idxBtn:MovieClip = MovieClip(displayedButtons.pop()); - _buttonsPanel_mc.removeMovieClip(idxBtn); - } - - if (mm.numIndexButtons > mm.numPreferredIndexButtons) { - _buttonsPanel_mc.removeMovieClip(nextBtn); - navigationButtonsDrawn = false; - } - - _buttonsPanel_mc.removeMovieClip(goBtn); - _buttonsPanel_mc.removeMovieClip(indexViewBtn); + _buttonsPanel_mc.removeMovieClip(); + _buttonsPanel_mc = null; } private function addRangeLabel(mm:MonitorModel):Void { // Label that displays 'Page # of #' - var idxLabel_mc:MovieClip = _buttonsPanel_mc.attachMovie("Label", "rangeLabel", _buttonsPanel_mc.getNextHighestDepth()); + _buttonsPanel_mc.attachMovie("Label", "rangeLabel", _buttonsPanel_mc.getNextHighestDepth()); rangeLabel = _buttonsPanel_mc["rangeLabel"]; // style info @@ -348,7 +332,29 @@ nextBtn._x = nextPosition; nextPosition += (forwardIdxBtnWidth); } + + private function addOrderCheckBox(mm:MonitorModel):Void { + + var checkBoxWidth:Number = Math.ceil(StringUtils.getButtonWidthForStr(Dictionary.getValue('order_learners_by_completion_lbl')) * fontWidthVariance) + 20; + _buttonsPanel_mc.attachMovie("CheckBox", "orderByCompletion_chk", _buttonsPanel_mc.getNextHighestDepth(), {_x:Stage.width-checkBoxWidth, _y:0, _width: checkBoxWidth, label:Dictionary.getValue('order_learners_by_completion_lbl')}); + var orderByCompletion_chk = _buttonsPanel_mc['orderByCompletion_chk']; + orderByCompletion_chk.selected = (mm.getLearnerSortingMechanism() == "completion"); + orderByCompletion_chk.addEventListener("click", Delegate.create(this, setSortingMechanism)); + + // TODO: this should go in the setStyles method + var styleObj = _tm.getStyleObject('label'); + orderByCompletion_chk.setStyle('styleName',styleObj); + } + private function setSortingMechanism(evt:Object):Void { + + if (evt.target.selected) { + mm.setLearnerSortingMechanism("completion"); + } else { + mm.setLearnerSortingMechanism("alphabetically"); + } + } + private function addIndexTextField(mm:MonitorModel):Void { _buttonsPanel_mc.attachMovie("textFieldBackground", "textFieldBackground_mc", _buttonsPanel_mc.getNextHighestDepth(), {_x: nextPosition, _y: 0}); @@ -412,10 +418,7 @@ _indexButton.init(mm, undefined); _indexButton.btnType = "IndexView"; indexViewBtn._x = nextPosition; - Debugger.log("addIndexButton1_nextPosition: "+nextPosition, Debugger.CRITICAL, "addIndexButton", "LearnerIndexView"); - Debugger.log("addIndexButton1_indexViewBtnWidth: "+indexViewBtnWidth, Debugger.CRITICAL, "addIndexButton", "LearnerIndexView"); nextPosition += indexViewBtnWidth; - Debugger.log("addIndexButton2_nextPosition: "+nextPosition, Debugger.CRITICAL, "addIndexButton", "LearnerIndexView"); nextPosition--; }