Index: lams_build/lib/lams/lams-central.jar =================================================================== diff -u -rdded08ea618c437f0f0f6424c6b1bbf54abe5bd7 -r10c87fd05c34bda4f1695bb872296803ab77faa0 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java =================================================================== diff -u -r88e98be30293b57a81d4a8a6e5cdaf5c62e97883 -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision 88e98be30293b57a81d4a8a6e5cdaf5c62e97883) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -2733,7 +2733,7 @@ private BranchActivityEntry extractBranchActivityEntry(JSONObject details) throws JSONException, ObjectExtractorException { - Long entryId = details.getLong(AuthoringJsonTags.BRANCH_ACTIVITY_ENTRY_ID); + Long entryId = JsonUtil.optLong(details, AuthoringJsonTags.BRANCH_ACTIVITY_ENTRY_ID); Integer entryUIID = details.getInt(AuthoringJsonTags.BRANCH_ACTIVITY_ENTRY_UIID); Integer sequenceActivityUIID = details.getInt(AuthoringJsonTags.BRANCH_SEQUENCE_ACTIVITY_UIID); @@ -2816,7 +2816,7 @@ BranchCondition condition = extractCondition(details.optJSONObject(AuthoringJsonTags.BRANCH_CONDITION), entry); - Integer groupUIID = details.getInt(AuthoringJsonTags.GROUP_UIID); + Integer groupUIID = (Integer) JsonUtil.opt(details, AuthoringJsonTags.GROUP_UIID); Group group = null; if (groupUIID != null) { group = groups.get(groupUIID); @@ -2985,17 +2985,17 @@ conditionDetails.getString(AuthoringJsonTags.CONDITION_NAME), conditionDetails.getString(AuthoringJsonTags.CONDITION_DISPLAY_NAME), conditionDetails.getString(AuthoringJsonTags.CONDITION_TYPE), - conditionDetails.getString(AuthoringJsonTags.CONDITION_START_VALUE), - conditionDetails.getString(AuthoringJsonTags.CONDITION_END_VALUE), - conditionDetails.getString(AuthoringJsonTags.CONDITION_EXACT_MATCH_VALUE)); + (String) JsonUtil.opt(conditionDetails, AuthoringJsonTags.CONDITION_START_VALUE), + (String) JsonUtil.opt(conditionDetails, AuthoringJsonTags.CONDITION_END_VALUE), + (String) JsonUtil.opt(conditionDetails, AuthoringJsonTags.CONDITION_EXACT_MATCH_VALUE)); } else { condition.setConditionUIID(conditionUIID); condition.setDisplayName(conditionDetails.getString(AuthoringJsonTags.CONDITION_DISPLAY_NAME)); - condition.setEndValue(conditionDetails.getString(AuthoringJsonTags.CONDITION_END_VALUE)); - condition.setExactMatchValue(conditionDetails.getString(AuthoringJsonTags.CONDITION_EXACT_MATCH_VALUE)); + condition.setEndValue((String) JsonUtil.opt(conditionDetails, AuthoringJsonTags.CONDITION_END_VALUE)); + condition.setExactMatchValue((String) JsonUtil.opt(conditionDetails, AuthoringJsonTags.CONDITION_EXACT_MATCH_VALUE)); condition.setName(conditionDetails.getString(AuthoringJsonTags.CONDITION_NAME)); condition.setOrderId(conditionDetails.getInt(AuthoringJsonTags.ORDER_ID)); - condition.setStartValue(conditionDetails.getString(AuthoringJsonTags.CONDITION_START_VALUE)); + condition.setStartValue((String) JsonUtil.opt(conditionDetails, AuthoringJsonTags.CONDITION_START_VALUE)); condition.setType(conditionDetails.getString(AuthoringJsonTags.CONDITION_TYPE)); } } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -r260f167585ffb5b4db7b021294782607437aed4a -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 260f167585ffb5b4db7b021294782607437aed4a) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -419,8 +419,7 @@ * @see org.lamsfoundation.lams.authoring.service.IAuthoringService#getToolOutputDefinitions(java.lang.Long, int) */ @Override - public String getToolOutputDefinitions(Long toolContentID, int definitionType) throws IOException { - + public List getToolOutputDefinitions(Long toolContentID, int definitionType) { SortedMap defns = lamsCoreToolService.getOutputDefinitionsFromTool(toolContentID, definitionType); @@ -431,9 +430,7 @@ defnDTOList.add(new ToolOutputDefinitionDTO(defn)); } } - - FlashMessage flashMessage = new FlashMessage("getToolOutputDefinitions", defnDTOList); - return flashMessage.serializeMessage(); + return defnDTOList; } /** Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java =================================================================== diff -u -r035853516626933d59e2473b4410b1dc54bb023e -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision 035853516626933d59e2473b4410b1dc54bb023e) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -25,6 +25,7 @@ import java.io.IOException; import java.text.ParseException; +import java.util.ArrayList; import java.util.List; import java.util.Vector; @@ -39,6 +40,7 @@ import org.lamsfoundation.lams.learningdesign.dto.AuthoringActivityDTO; import org.lamsfoundation.lams.learningdesign.dto.ValidationErrorDTO; import org.lamsfoundation.lams.learningdesign.exception.LearningDesignException; +import org.lamsfoundation.lams.tool.dto.ToolOutputDefinitionDTO; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; import org.lamsfoundation.lams.usermanagement.exception.UserException; @@ -202,12 +204,9 @@ public Vector getToolActivities(Long learningDesignId, String languageCode); /** - * This method returns a output definitions of the Tool in WDDX format. - * - * @return String The required definitions in WDDX format - * @throws IOException + * This method returns a output definitions of the Tool. */ - public String getToolOutputDefinitions(Long toolContentID, int definitionType) throws IOException; + public List getToolOutputDefinitions(Long toolContentID, int definitionType); /** * This method returns a output definition of the Tool, filtered by the supported Tool Output classes, in WDDX Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java =================================================================== diff -u -rfc2ced698f28223da5c95c833f48fbd0b0890423 -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision fc2ced698f28223da5c95c833f48fbd0b0890423) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -56,6 +56,7 @@ import org.lamsfoundation.lams.tool.IToolVO; import org.lamsfoundation.lams.tool.ToolContentManager; import org.lamsfoundation.lams.tool.ToolOutputDefinition; +import org.lamsfoundation.lams.tool.dto.ToolOutputDefinitionDTO; import org.lamsfoundation.lams.tool.service.ILamsToolService; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.Role; @@ -114,12 +115,12 @@ HttpServletResponse response) throws IOException { request.setAttribute("tools", getLearningDesignService().getToolDTOs(true, request.getRemoteUser())); request.setAttribute(AttributeNames.PARAM_CONTENT_FOLDER_ID, FileUtil.generateUniqueContentFolderID()); - + List accessList = getAuthoringService().getLearningDesignAccessByUser(getUserId()); accessList = accessList.subList(0, Math.min(accessList.size(), AuthoringAction.LEARNING_DESIGN_ACCESS_ENTRIES_LIMIT - 1)); Gson gson = new GsonBuilder().create(); - request.setAttribute("access", gson.toJson(accessList)); + request.setAttribute("access", gson.toJson(accessList)); return mapping.findForward("openAutoring"); } @@ -156,14 +157,35 @@ Long toolContentID = WebUtil.readLongParam(request, "toolContentID", false); Integer definitionType = ToolOutputDefinition.DATA_OUTPUT_DEFINITION_TYPE_CONDITION; // WebUtil.readIntParam(request, // "toolOutputDefinitionType"); - wddxPacket = authoringService.getToolOutputDefinitions(toolContentID, definitionType); + List defnDTOList = authoringService.getToolOutputDefinitions(toolContentID, + definitionType); + FlashMessage flashMessage = new FlashMessage("getToolOutputDefinitions", defnDTOList); + wddxPacket = flashMessage.serializeMessage(); + } catch (Exception e) { wddxPacket = handleException(e, "getToolOutputDefinitions", authoringService, true).serializeMessage(); } return outputPacket(mapping, request, response, wddxPacket, "definitions"); } + public ActionForward getToolOutputDefinitionsJSON(ActionMapping mapping, ActionForm form, + HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, + JSONException { + String wddxPacket; + IAuthoringService authoringService = getAuthoringService(); + Long toolContentID = WebUtil.readLongParam(request, "toolContentID"); + Integer definitionType = ToolOutputDefinition.DATA_OUTPUT_DEFINITION_TYPE_CONDITION; + + List defnDTOList = authoringService.getToolOutputDefinitions(toolContentID, + definitionType); + + Gson gson = new GsonBuilder().create(); + response.setContentType("application/json;charset=utf-8"); + response.getWriter().write(gson.toJson(defnDTOList)); + return null; + } + public ActionForward getLearningDesignDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String wddxPacket; @@ -196,7 +218,7 @@ accessList = accessList.subList(0, Math.min(accessList.size(), AuthoringAction.LEARNING_DESIGN_ACCESS_ENTRIES_LIMIT - 1)); responseJSON.put("access", new JSONArray(gson.toJson(accessList))); - + response.getWriter().write(responseJSON.toString()); return null; } @@ -488,7 +510,7 @@ Integer userId = getUserId(); getAuthoringService().storeLearningDesignAccess(learningDesignID, userId); - + List accessList = getAuthoringService().getLearningDesignAccessByUser(userId); accessList = accessList.subList(0, Math.min(accessList.size(), AuthoringAction.LEARNING_DESIGN_ACCESS_ENTRIES_LIMIT - 1)); @@ -514,7 +536,6 @@ response.getWriter().write(gson.toJson(accessList)); return null; } - /** * Get AuditService bean. Index: lams_central/web/author2.jsp =================================================================== diff -u -r1740a9e416a44b39b44da0534860b83d798d4149 -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/web/author2.jsp (.../author2.jsp) (revision 1740a9e416a44b39b44da0534860b83d798d4149) +++ lams_central/web/author2.jsp (.../author2.jsp) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -212,35 +212,33 @@ - + -
+
- - - - - + + + + - - - + + - - + +
+ Mappings
GroupsBranchesGroupBranchBranchesBranch
-
-
+
+
+
@@ -440,6 +438,16 @@ +
Create conditions
+ + + + +
Match conditions to branches
+ + + +
Match Groups to Branches
@@ -551,6 +559,37 @@
+ +
+ + +
+ +
+ From: To: +
+ Add +
+
+
Name:
+
    +
    + + + + + +
    NameCondition
    +
    + +
    Right-click on the image and save it
    Index: lams_central/web/css/authoring.css =================================================================== diff -u -r1740a9e416a44b39b44da0534860b83d798d4149 -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/web/css/authoring.css (.../authoring.css) (revision 1740a9e416a44b39b44da0534860b83d798d4149) +++ lams_central/web/css/authoring.css (.../authoring.css) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -142,47 +142,91 @@ } -div#gtbDialog > table { +div.branchMappingDialog > table { width: 100%; height: 98%; table-layout: fixed; border-collapse: collapse; } -div#gtbDialog td { +div.branchMappingDialog td { text-align: center; vertical-align: top; } -div#gtbDialog td.gtbLabelCell { +div.branchMappingDialog td.branchMappingLabelCell { height: 15px; font-weight: bold; } -div#gtbDialog td.gtbListCell { +div.branchMappingDialog td.branchMappingListCell { border: thin black solid; padding: 3px; } -div#gtbDialog td.gtbListCell .selected { +div.branchMappingDialog td.branchMappingListCell .selected { background-color: #5c9ccc; color: white; } -div#gtbDialog #gtbAddButton, div#gtbDialog #gtbRemoveButton { +div.branchMappingDialog .branchMappingButton { width: 40%; height: 25px; display: block; margin: auto; margin-bottom: 20px; } -div#gtbDialog td.gtbListCell div { +div.branchMappingDialog td.branchMappingListCell div { text-align: left; cursor: pointer; } +div#outputConditionsDialog div#complexConditions > div { + font-weight: bold; + margin: 10px 0 0 2px; +} + +div#outputConditionsDialog select { + margin-bottom: 10px; +} + +div#outputConditionsDialog .spinner { + width: 40px; +} + +div#outputConditionsDialog div#multiRangeDiv { + display: inline-block; +} + +div#outputConditionsDialog #rangeAddButton { + margin-left: 10px; +} + +div#outputConditionsDialog table#rangeConditions { + width: 100%; + margin-top: 15px; + border-collapse: collapse; + text-align: center; +} + +div#outputConditionsDialog table#rangeConditions tr td, +div#outputConditionsDialog table#rangeConditions tr th { + padding: 3px; + border: black thin solid; + cursor: pointer; +} + +div#outputConditionsDialog table#rangeConditions input { + width: 95%; +} + +div#outputConditionsDialog tr.selected { + background-color: #dfeffc; +} + + div#exportImageDialog div#exportCanvas { margin: 5px; padding: 5px; Index: lams_central/web/includes/javascript/authoring/authoringActivity.js =================================================================== diff -u -rbf965a1a2768bdec78ccb7b0ff8f7b694580e02c -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/web/includes/javascript/authoring/authoringActivity.js (.../authoringActivity.js) (revision bf965a1a2768bdec78ccb7b0ff8f7b694580e02c) +++ lams_central/web/includes/javascript/authoring/authoringActivity.js (.../authoringActivity.js) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -146,6 +146,8 @@ this.branches = []; // mapping between groups and branches, if applicable this.groupsToBranches = []; + // mapping between tool output and branches, if applicable + this.conditionsToBranches = []; this.minOptions = 0; this.maxOptions = 0; @@ -547,11 +549,12 @@ * Deletes the given activity. */ removeActivity : function(activity, forceRemove) { + var coreActivity = activity.branchingActivity || this; if (!forceRemove && activity instanceof ActivityLib.BranchingEdgeActivity){ // user removes one of the branching edges, so remove the whole activity if (confirm('Are you sure you want to remove the whole branching activity?')){ - var otherEdge = activity.isStart ? activity.branchingActivity.end - : activity.branchingActivity.start; + var otherEdge = activity.isStart ? coreActivity.end + : coreActivity.start; ActivityLib.removeActivity(otherEdge, true); } else { return; @@ -579,14 +582,15 @@ layout.items.copiedActivity = null; } - if (activity instanceof ActivityLib.GroupingActivity) { - $.each(layout.activities, function(){ - if (activity == this.grouping) { - this.grouping = null; - this.draw(); - } - }); - } + // find references of this activity as grouping or input + $.each(layout.activities, function(){ + if (activity == coreActivity.grouping) { + coreActivity.grouping = null; + this.draw(); + } else if (activity == coreActivity.input) { + coreActivity.input = null; + } + }); } // remove the activity from parent activity @@ -673,7 +677,7 @@ if (transition) { - ActivityLib.removeTransition(transition); + ActivityLib.removeTransition(transition, redraw); } transition = new ActivityLib.Transition(id, uiid, fromActivity, toActivity, @@ -694,7 +698,7 @@ /** * Removes the given transition. */ - removeTransition : function(transition) { + removeTransition : function(transition, redraw) { // find the transition and remove it var transitions = transition.fromActivity.transitions.from; transitions.splice(transitions.indexOf(transition), 1); @@ -707,32 +711,41 @@ branches.splice(branches.indexOf(transition.branch), 1); } - // remove grouping references if chain was broken by the removed transition - $.each(layout.activities, function(){ - if (this.grouping) { - var candidate = this, - groupingFound = false; - do { - if (candidate.transitions && candidate.transitions.to.length > 0) { - candidate = candidate.transitions.to[0].fromActivity; - } else if (candidate.parentActivity) { - candidate = candidate.parentActivity; - } else { - candidate = null; - } + if (!redraw){ + // remove grouping or input references if chain was broken by the removed transition + $.each(layout.activities, function(){ + var coreActivity = this.branchingActivity || this; + if (coreActivity.grouping || coreActivity.input) { + var candidate = this, + groupingFound = false, + inputFound = false; + do { + if (candidate.transitions && candidate.transitions.to.length > 0) { + candidate = candidate.transitions.to[0].fromActivity; + } else if (candidate.parentActivity) { + candidate = candidate.parentActivity; + } else { + candidate = null; + } + + if (coreActivity.grouping == candidate) { + groupingFound = true; + } + if (coreActivity.input == candidate) { + inputFound = true; + } + } while (candidate != null); - if (this.grouping == candidate) { - groupingFound = true; - candidate = null; + if (!groupingFound) { + coreActivity.grouping = null; + this.draw(); } - } while (candidate != null); - } - - if (!groupingFound) { - this.grouping = null; - this.draw(); - } - }); + if (!inputFound) { + coreActivity.input = null; + } + } + }); + } transition.items.remove(); setModified(true); Index: lams_central/web/includes/javascript/authoring/authoringGeneral.js =================================================================== diff -u -r76af4beb267213a5dcac9953f862a04459b63392 -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/web/includes/javascript/authoring/authoringGeneral.js (.../authoringGeneral.js) (revision 76af4beb267213a5dcac9953f862a04459b63392) +++ lams_central/web/includes/javascript/authoring/authoringGeneral.js (.../authoringGeneral.js) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -1054,6 +1054,7 @@ $.each(ld.branchMappings, function(){ var entry = this, group = null, + input = null, branch = null; $.each(layout.activities, function(){ // is it the branch we're looking for? @@ -1072,21 +1073,33 @@ return false; } }); + } else if (entry.condition && entry.condition.toolActivityUIID == this.uiid) { + input = this; } // found both, no need to continue iteration - if (group && branch) { + if (branch && (group || input)) { return false; } }); - if (group && branch) { - branch.branchingActivity.groupsToBranches.push({ - 'id' : entry.entryID, - 'uiid' : entry.entryUIID, - 'group' : group, - 'branch' : branch - }); + if (branch) { + if (group) { + branch.branchingActivity.groupsToBranches.push({ + 'id' : entry.entryID, + 'uiid' : entry.entryUIID, + 'group' : group, + 'branch' : branch + }); + } else if (input) { + branch.branchingActivity.input = input; + branch.branchingActivity.conditionsToBranches.push({ + 'id' : entry.entryID, + 'uiid' : entry.entryUIID, + 'condition' : entry.condition, + 'branch' : branch + }); + } } }); @@ -1099,14 +1112,13 @@ $.each(branches, function(){ var branch = this, - // if there is no branch data, the branch is empty branchData = branchToActivities[branch.id]; // add reference to the transition inside branch ActivityLib.addTransition(branchingActivity.start, - branchData ? branchData.firstActivity : branchingActivity.end, + branchData.firstActivity || branchingActivity.end, true, null, null, branch); - if (branchData && !branchData.stopAfterActivity) { + if (branchData.lastActivity && !branchData.stopAfterActivity) { ActivityLib.addTransition(branchData.lastActivity, branchingActivity.end, true); } }); @@ -1210,6 +1222,9 @@ layoutActivities.push(branchingActivity); $.each(branchingActivity.branches, function(branchOrderID){ + if (!branchingActivity.defaultActivityUIID) { + branchingActivity.defaultActivityUIID = this.uiid; + } this.defaultActivityUIID = null; this.orderID = branchOrderID + 1; this.parentActivity = branchingActivity; @@ -1322,20 +1337,47 @@ case 'chosen' : activityTypeID = 10; break; case 'group' : activityTypeID = 11; - $.each(activity.groupsToBranches, function(){ - branchMappings.push({ - 'entryID' : this.id, - 'entryUIID' : this.uiid, - 'groupUIID' : this.group.uiid, - 'branchingActivityUIID': this.branch.branchingActivity.uiid, - 'sequenceActivityUIID' : this.branch.uiid, - 'condition' : null + var branchMappingCopy = activity.groupsToBranches.slice(), + branchMapping = activity.groupsToBranches = []; + // no break, so fall to 'tool' + case 'tool' : + activityTypeID = activityTypeID || 12; + var branchMappingCopy = branchMappingCopy || activity.conditionsToBranches.slice(), + // yes, yes, a lousy construction + branchMapping = branchMapping || (activity.conditionsToBranches = []); + + if (activity.defaultActivityUIID && (activityTypeID == 11 || activity.input)) { + $.each(branchMappingCopy, function(index){ + if (activity.branches.indexOf(this.branch) == -1){ + return true; + } + if (this.group && activity.grouping.groups.indexOf(this.group) == -1) { + return true; + } + + var condition = this.condition; + if (condition) { + condition.orderID = index + 1; + if (condition.exactMatchValue) { + condition.startValue = condition.endValue = null; + } + } + + branchMappings.push({ + 'entryID' : this.id, + 'entryUIID' : this.uiid, + 'branchingActivityUIID': this.branch.branchingActivity.uiid, + 'sequenceActivityUIID' : this.branch.uiid, + 'groupUIID' : this.group ? this.group.uiid : null, + 'condition' : condition + }); + + branchMapping.push(this); }); - }); + } break; - case 'tool' : activityTypeID = 12; break; - case 'optional' : activityTypeID = 13; break; + case 'optional' : activityTypeID = 13; break; } } else if (activity instanceof ActivityLib.BranchActivity){ activityTypeID = 8; @@ -1378,6 +1420,7 @@ 'minOptions' : activity.minOptions, 'maxOptions' : activity.maxOptions, 'stopAfterActivity' : activity.stopAfterActivity ? true : false, + 'toolActivityUIID' : activity.input ? activity.input.uiid : null, 'gradebookToolOutputDefinitionName' : null, 'helpText' : null, Index: lams_central/web/includes/javascript/authoring/authoringProperty.js =================================================================== diff -u -rbf965a1a2768bdec78ccb7b0ff8f7b694580e02c -r10c87fd05c34bda4f1695bb872296803ab77faa0 --- lams_central/web/includes/javascript/authoring/authoringProperty.js (.../authoringProperty.js) (revision bf965a1a2768bdec78ccb7b0ff8f7b694580e02c) +++ lams_central/web/includes/javascript/authoring/authoringProperty.js (.../authoringProperty.js) (revision 10c87fd05c34bda4f1695bb872296803ab77faa0) @@ -16,7 +16,7 @@ 'at' : 'right top', 'of' : '#canvas' }, - 'resizable' : true, + 'resizable' : false, 'title' : 'Properties' }); // for proximity detection throttling (see handlers) @@ -80,7 +80,10 @@ // initialise dialog from matching groups to branches in branching activities - var gtbDialog = layout.items.groupsToBranchesMappingDialog = $('#gtbDialog').dialog({ + var gtbDialog = layout.items.groupsToBranchesMappingDialog = $('#branchMappingDialog') + .clone() + .attr('id','gtbDialog') + .dialog({ 'autoOpen' : false, 'modal' : true, 'show' : 'fold', @@ -96,22 +99,30 @@ 'text' : 'OK', 'click' : function() { var dialog = $(this), - branchingActivity = dialog.dialog('option', 'branchingActivity'); - + branchingActivity = dialog.dialog('option', 'branchingActivity'), + assignedToDefault = false; + // find references to groups and branches branchingActivity.groupsToBranches = []; - $('#gtbMappingGroupCell div', dialog).each(function(){ + $('.branchMappingBoundItemCell div, .branchMappingFreeItemCell div', dialog).each(function(){ var groupUIID = +$(this).attr('uiid'), - branchUIID = +$(this).data('boundItem').attr('uiid'), + boundItem = $(this).data('boundItem'), + branchUIID = boundItem ? +boundItem.attr('uiid') : null, group = null, branch = null; - $.each(branchingActivity.branches, function(){ - if (branchUIID == this.uiid) { - branch = this; - return false; - } - }); + if (branchUIID) { + $.each(branchingActivity.branches, function(){ + if (branchUIID == this.uiid) { + branch = this; + return false; + } + }); + } else { + branch = branchingActivity.branches[0]; + assignedToDefault = true; + } + $.each(branchingActivity.grouping.groups, function(){ if (groupUIID == this.uiid) { group = this; @@ -127,34 +138,457 @@ }); }); + if (assignedToDefault){ + alert('All remaining groups will be mapped to the default branch'); + } dialog.dialog('close'); - setModified(true); - } - }, - { - 'text' : 'Cancel', - 'click' : function() { - $(this).dialog('close'); - } + } } ] }); - $('#gtbAddButton', gtbDialog).button({ + $('.branchMappingAddButton', gtbDialog).button({ 'icons' : { 'primary' : 'ui-icon-seek-next' }, 'text' : false + }).click(function(){ + PropertyLib.addBranchMapping(gtbDialog); }); - $('#gtbRemoveButton', gtbDialog).button({ + $('.branchMappingRemoveButton', gtbDialog).button({ 'icons' : { 'primary' : 'ui-icon-seek-prev' }, 'text' : false + }).click(function(){ + PropertyLib.removeBranchMapping(gtbDialog); }); + $('.branchMappingFreeItemHeaderCell', gtbDialog).text('Groups'); + $('.branchMappingBoundItemHeaderCell', gtbDialog).text('Group'); layout.dialogs.push(gtbDialog); + + + var outputConditionsDialog = layout.items.outputConditionsDialog = $('#outputConditionsDialog').dialog({ + 'autoOpen' : false, + 'modal' : true, + 'show' : 'fold', + 'hide' : 'fold', + 'position' : { + 'of' : '#canvas' + }, + 'width' : 400, + 'height' : 400, + 'title' : 'Select Output Conditions for Input', + 'buttons' : [ + { + 'class' : 'outputSelectDependent rangeOutputButton', + 'text' : 'Clear all', + 'click' : function() { + var rows = $('#rangeConditions td', this).closest('tr'); + rows.each(function(){ + if ($(this).data('mappingEntry').branch) { + if (confirm('There are conditions linked to an existing branch.\nDo you wish to remove them?')) { + rows = null; + } + return false; + } + }); + + if (rows) { + rows.remove(); + } + } + }, + { + 'class' : 'outputSelectDependent rangeOutputButton', + 'text' : 'Remove', + 'click' : function() { + var selected = $('#rangeConditions tr.selected', this); + if (!selected.data('mappingEntry').branch + || confirm('This condition is linked to an existing branch.\nDo you wish to remove it?')) { + selected.remove(); + } + } + }, + { + 'class' : 'outputSelectDependent complexOutputButton', + 'text' : 'Refresh', + 'click' : function() { + $(this).dialog('option', 'refreshDefinitions')(); + $(this).dialog('option', 'buildContent')(); + } + }, + { + 'text' : 'Cancel', + 'click' : function() { + var dialog = $(this); + dialog.dialog('close'); + } + }, + { + 'text' : 'OK', + 'click' : function() { + var dialog = $(this), + activity = dialog.dialog('option', 'parentObject'); + + if (activity instanceof ActivityLib.BranchingActivity) { + activity.conditionsToBranches = []; + $('#rangeConditions tr, #complexConditions li', dialog).each(function(){ + var mappingEntry = $(this).is(':visible') ? $(this).data('mappingEntry') : null; + if (!mappingEntry) { + return true; + } + + if (!mappingEntry.uiid) { + mappingEntry.uiid = ++layout.ld.maxUIID; + } + if (!mappingEntry.condition.conditionUIID) { + mappingEntry.condition.conditionUIID = ++layout.ld.maxUIID; + } + + var input = $('input', this); + if (input.length > 0) { + mappingEntry.condition.displayName = input.val(); + } + activity.conditionsToBranches.push(mappingEntry); + }); + } + + dialog.dialog('close'); + PropertyLib.openConditionsToBranchesMappingDialog(activity); + } + } + ], + + 'open' : function(){ + $(this).dialog('option', 'buildContent')(); + } + }); + + outputConditionsDialog.dialog('option', + { + 'refreshDefinitions' : function(){ + var dialog = layout.items.outputConditionsDialog, + activity = dialog.dialog('option', 'parentObject'); + + $.ajax({ + url : LAMS_URL + 'authoring/author.do', + data : { + 'method' : 'getToolOutputDefinitionsJSON', + 'toolContentID' : activity.input.toolContentID || activity.input.toolID + }, + cache : false, + async: false, + dataType : 'json', + success : function(response) { + activity.input.outputDefinitions = response; + } + }); + }, + + + 'buildContent' : function() { + var dialog = layout.items.outputConditionsDialog, + activity = dialog.dialog('option', 'parentObject'), + outputSelect = $('#outputSelect', dialog), + emptyOption = $('option[value="none"]', outputSelect).attr('selected', 'selected'), + outputName = activity.conditionsToBranches && activity.conditionsToBranches.length > 0 + ? activity.conditionsToBranches[0].condition.name.split('#')[0] : null; + $('option[value!="none"]', outputSelect).remove(); + + if (!activity.input.outputDefinitions) { + dialog.dialog('option', 'refreshDefinitions')(); + } + + if (activity.input.outputDefinitions) { + $.each(activity.input.outputDefinitions,function(){ + var suffix = ''; + switch(this.type) { + case 'OUTPUT_COMPLEX' : + suffix = ' (user defined)'; + break; + + case 'OUTPUT_LONG' : + suffix = ' (range)'; + break; + }; + + this.toolActivityUIID = activity.input.uiid; + var option = $('