Index: lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java =================================================================== diff -u -r3a1ae19ae51ede32cec920fc9bb07f6787f562ff -rb706619f710215b7ced6268be670736b61a96eab --- lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java (.../CentralConstants.java) (revision 3a1ae19ae51ede32cec920fc9bb07f6787f562ff) +++ lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java (.../CentralConstants.java) (revision b706619f710215b7ced6268be670736b61a96eab) @@ -136,6 +136,8 @@ public static final String PARAM_CALL_ATTEMPTED_ID = "callAttemptedID"; public static final String PARAM_SEQUENCE_TITLE = "sequenceTitle"; + + public static final String PARAM_ACTIVITY_METADATA = "activityMetadataField"; public static final String PARAM_FORM_MESSAGE = "formMessage"; Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java =================================================================== diff -u -ra068c0f5a40c0a7818ac3221479444e14e9c854d -rb706619f710215b7ced6268be670736b61a96eab --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision a068c0f5a40c0a7818ac3221479444e14e9c854d) +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision b706619f710215b7ced6268be670736b61a96eab) @@ -158,9 +158,15 @@ // Several chars and strings used for building HTML requests private static final String CHAR_QUESTION_MARK = "?"; private static final String CHAR_AMPERSAND = "&"; - private static final char CHAR_EQUALS = '='; + private static final String CHAR_EQUALS = "="; + private static final String REGEX_DOT = "\\."; private static final String STRING_OK = "OK"; - + + private static final String ACTIVITY_METADATA_PREFIX = "activity"; + private static final String ACTIVITY_METADATA_HIDDEN = "Hidden"; + private static final String ACTIVITY_METADATA_EXPANDED = "Expanded"; + private static final String ACTIVITY_METADATA_COLLAPSED = "Collapsed"; + // Services used in the class, injected by Spring private static IUserManagementService userManagementService; private static IExportToolContentService exportService; @@ -449,44 +455,63 @@ if (pedagogicalPlannerUrl == null) { // if there is no URL, the tool does not support the planner - addedDTO = new PedagogicalPlannerActivityDTO(toolActivity.getTool().getToolDisplayName(), activity - .getTitle(), false, authorUrl, PedagogicalPlannerAction.PATH_ACTIVITY_NO_PLANNER_SUPPORT, activity - .getLibraryActivityUiImage(), null, null); + addedDTO = new PedagogicalPlannerActivityDTO(false, + PedagogicalPlannerAction.PATH_ACTIVITY_NO_PLANNER_SUPPORT); + addedDTO.setType(toolActivity.getTool().getToolDisplayName()); + addedDTO.setTitle(activity.getTitle()); + addedDTO.setAuthorUrl(authorUrl); + addedDTO.setToolIconUrl(activity.getLibraryActivityUiImage()); + addedDTO.setToolContentId(toolActivity.getToolContentId()); + addedDTO.setCollapsed(toolActivity.getPlannerCollapsed()); + addedDTO.setExpanded(toolActivity.getPlannerExpanded()); + addedDTO.setHidden(toolActivity.getPlannerHidden()); } else { // add some required parameters pedagogicalPlannerUrl += pedagogicalPlannerUrl.contains(PedagogicalPlannerAction.CHAR_QUESTION_MARK) ? PedagogicalPlannerAction.CHAR_AMPERSAND : PedagogicalPlannerAction.CHAR_QUESTION_MARK; pedagogicalPlannerUrl += AttributeNames.PARAM_TOOL_CONTENT_ID + PedagogicalPlannerAction.CHAR_EQUALS + toolActivity.getToolContentId(); + // Looks heavy, but we just build URLs for DTO - see that class the meaning of constructor parameters - addedDTO = new PedagogicalPlannerActivityDTO(toolActivity.getTool().getToolDisplayName(), - activity.getTitle(), true, pedagogicalPlannerUrl + PedagogicalPlannerAction.CHAR_AMPERSAND - + AttributeNames.PARAM_CONTENT_FOLDER_ID + PedagogicalPlannerAction.CHAR_EQUALS - + learningDesign.getContentFolderID(), authorUrl, activity.getLibraryActivityUiImage(), - pedagogicalPlannerUrl + PedagogicalPlannerAction.CHAR_AMPERSAND + AttributeNames.PARAM_COMMAND - + PedagogicalPlannerAction.CHAR_EQUALS + AttributeNames.COMMAND_CHECK_EDITING_ADVICE - + PedagogicalPlannerAction.CHAR_AMPERSAND + AttributeNames.PARAM_ACTIVITY_INDEX - + PedagogicalPlannerAction.CHAR_EQUALS + (activities.size() + 1), pedagogicalPlannerUrl - + PedagogicalPlannerAction.CHAR_AMPERSAND + AttributeNames.PARAM_COMMAND - + PedagogicalPlannerAction.CHAR_EQUALS + AttributeNames.COMMAND_GET_EDITING_ADVICE); + addedDTO = new PedagogicalPlannerActivityDTO(true, pedagogicalPlannerUrl + + PedagogicalPlannerAction.CHAR_AMPERSAND + AttributeNames.PARAM_CONTENT_FOLDER_ID + + PedagogicalPlannerAction.CHAR_EQUALS + learningDesign.getContentFolderID()); + addedDTO.setType(toolActivity.getTool().getToolDisplayName()); + addedDTO.setTitle(activity.getTitle()); + addedDTO.setAuthorUrl(authorUrl); + addedDTO.setToolIconUrl(activity.getLibraryActivityUiImage()); + addedDTO.setCheckEditingAdviceUrl(pedagogicalPlannerUrl + PedagogicalPlannerAction.CHAR_AMPERSAND + + AttributeNames.PARAM_COMMAND + PedagogicalPlannerAction.CHAR_EQUALS + + AttributeNames.COMMAND_CHECK_EDITING_ADVICE + PedagogicalPlannerAction.CHAR_AMPERSAND + + AttributeNames.PARAM_ACTIVITY_INDEX + PedagogicalPlannerAction.CHAR_EQUALS + + (activities.size() + 1)); + addedDTO.setEditingAdviceUrl(pedagogicalPlannerUrl + PedagogicalPlannerAction.CHAR_AMPERSAND + + AttributeNames.PARAM_COMMAND + PedagogicalPlannerAction.CHAR_EQUALS + + AttributeNames.COMMAND_GET_EDITING_ADVICE); + addedDTO.setToolContentId(toolActivity.getToolContentId()); + addedDTO.setCollapsed(toolActivity.getPlannerCollapsed()); + addedDTO.setExpanded(toolActivity.getPlannerExpanded()); + addedDTO.setHidden(toolActivity.getPlannerHidden()); } activities.add(addedDTO); } else if (activity.isGroupingActivity()) { // grouping is managed by this action class; GroupingActivity groupingActivity = (GroupingActivity) activity; - addedDTO = new PedagogicalPlannerActivityDTO(null, activity.getTitle(), true, groupingActivity - .getSystemTool().getPedagogicalPlannerUrl() + addedDTO = new PedagogicalPlannerActivityDTO(true, groupingActivity.getSystemTool() + .getPedagogicalPlannerUrl() + PedagogicalPlannerAction.CHAR_AMPERSAND + AttributeNames.PARAM_TOOL_CONTENT_ID + PedagogicalPlannerAction.CHAR_EQUALS - + groupingActivity.getCreateGrouping().getGroupingId(), null, - PedagogicalPlannerAction.IMAGE_PATH_GROUPING, null, null); + + groupingActivity.getCreateGrouping().getGroupingId()); + addedDTO.setTitle(activity.getTitle()); + addedDTO.setToolIconUrl(PedagogicalPlannerAction.IMAGE_PATH_GROUPING); activities.add(addedDTO); } else if (activity.isGateActivity()) { // gate is not supported, but takes its image from a differen spot - addedDTO = new PedagogicalPlannerActivityDTO(null, activity.getTitle(), false, - PedagogicalPlannerAction.PATH_ACTIVITY_NO_PLANNER_SUPPORT, null, - PedagogicalPlannerAction.IMAGE_PATH_GATE, null, null); + addedDTO = new PedagogicalPlannerActivityDTO(false, + PedagogicalPlannerAction.PATH_ACTIVITY_NO_PLANNER_SUPPORT); + addedDTO.setTitle(activity.getTitle()); + addedDTO.setToolIconUrl(PedagogicalPlannerAction.IMAGE_PATH_GATE); activities.add(addedDTO); } else if (activity.isBranchingActivity()) { // Planner does not support branching inside branching/options @@ -512,7 +537,7 @@ + PedagogicalPlannerAction.CHAR_QUESTION_MARK + CentralConstants.PARAM_FORM_MESSAGE + PedagogicalPlannerAction.CHAR_EQUALS + getMessageService().getMessage(CentralConstants.RESOURCE_KEY_BRANCH_EMPTY); - addedDTO = new PedagogicalPlannerActivityDTO(null, null, false, path, null, null, null, null); + addedDTO = new PedagogicalPlannerActivityDTO(false, path); addedDTO.setParentActivityTitle(activity.getTitle()); addedDTO.setGroup(branch); addedDTO.setDefaultBranch(defaultBranch); @@ -600,9 +625,10 @@ addedDTO.setLastNestedActivity(true); } else { // If unknown/unsupported activity - addedDTO = new PedagogicalPlannerActivityDTO(null, activity.getTitle(), false, - PedagogicalPlannerAction.PATH_ACTIVITY_NO_PLANNER_SUPPORT, null, - activity.getLibraryActivityUiImage(), null, null); + addedDTO = new PedagogicalPlannerActivityDTO(false, + PedagogicalPlannerAction.PATH_ACTIVITY_NO_PLANNER_SUPPORT); + addedDTO.setTitle(activity.getTitle()); + addedDTO.setToolIconUrl(activity.getLibraryActivityUiImage()); activities.add(addedDTO); } return addedDTO; @@ -1688,6 +1714,39 @@ } else { LearningDesign learningDesign = getAuthoringService().getLearningDesign(learningDesignID); learningDesign.setTitle(sequenceTitle); + + // parse activity metadata, which is in form "activity.=) learningDesign.getActivities()) { + if (activity.isToolActivity()) { + activity = getActivityDAO().getActivityByActivityId(activity.getActivityId()); + ToolActivity toolActivity = (ToolActivity) activity; + if (toolContentId.equals(toolActivity.getToolContentId())) { + String fieldName = keyParts[1]; + String value = keyAndValue[1]; + // recognise fields and set properties + if (ACTIVITY_METADATA_COLLAPSED.equalsIgnoreCase(fieldName)) { + toolActivity.setPlannerCollapsed(Boolean.parseBoolean(value)); + } else if (ACTIVITY_METADATA_EXPANDED.equalsIgnoreCase(fieldName)) { + toolActivity.setPlannerExpanded(Boolean.parseBoolean(value)); + } else if (ACTIVITY_METADATA_HIDDEN.equalsIgnoreCase(fieldName)) { + toolActivity.setPlannerHidden(Boolean.parseBoolean(value)); + } + } + } + } + } + } + + learningDesign.setLastModifiedDateTime(new Date()); getAuthoringService().saveLearningDesign(learningDesign); writeAJAXResponse(response, PedagogicalPlannerAction.STRING_OK + responseSuffix); } Index: lams_central/web/images/pedag_collapse.png =================================================================== diff -u -ra068c0f5a40c0a7818ac3221479444e14e9c854d -rb706619f710215b7ced6268be670736b61a96eab Binary files differ Index: lams_central/web/images/pedag_expand.png =================================================================== diff -u Binary files differ Index: lams_central/web/includes/javascript/pedagogicalPlanner.js =================================================================== diff -u -ra068c0f5a40c0a7818ac3221479444e14e9c854d -rb706619f710215b7ced6268be670736b61a96eab --- lams_central/web/includes/javascript/pedagogicalPlanner.js (.../pedagogicalPlanner.js) (revision a068c0f5a40c0a7818ac3221479444e14e9c854d) +++ lams_central/web/includes/javascript/pedagogicalPlanner.js (.../pedagogicalPlanner.js) (revision b706619f710215b7ced6268be670736b61a96eab) @@ -7,13 +7,17 @@ var actionAfterCompleted; //What action should be called if all activities were saved successfully var startPreviewUrl; //Url to start preview var learningDesignId; //ID of the design to open + var initialActivityHeight = null; + var activityMetadataFields = [ 'Collapsed', 'Expanded', 'Hidden' ]; + var initialExpandAttempts = []; var ACTION_SAVE_AS_SEQUENCE = 0; //After successful submit save learning design in user's personal folder var ACTION_PREVIEW = 1; //After successful submit start preview var ACTION_OPEN_AUTHOR = 2; //After successful submit open full authoring var ACTION_EXPORT = 3; //After successful submit export the learning design var END_HEAD_REGEX_PATTERN = new RegExp('activityCallRetrievedID){ //clear old data @@ -118,8 +137,8 @@ } // reeavaluate script initializing the CKEditor instance - if (activity.contentWindow.initializeCKEditor){ - activity.contentWindow.initializeCKEditor(); + if (activity.contentWindow.reinitializeCKEditorInstances){ + activity.contentWindow.reinitializeCKEditorInstances(); } } } @@ -235,16 +254,36 @@ $('#activity'+id).hide('slow', function () { $('#activity'+action+'Span'+id).show('slow'); }); + $('#activityCollapsed'+id).val('true'); } - function expandActivity(id, action){ + function uncollapseActivity(id, action){ $('#activity'+action+'Span'+id).hide('slow', function () { $('#activity'+id).show('slow', function (){ $('.collapsible'+id).show(); }); }); + $('#activityCollapsed'+id).val('false'); } + + + function expandActivity(id){ + var activity = $('#activity'+id); + var currentHeight = activity.height(); + var targetHeight = activity[0].contentDocument.height; + var expanded = 'true'; + if (initialActivityHeight == null){ + initialActivityHeight = currentHeight; + } else if (initialActivityHeight != currentHeight) { + targetHeight = initialActivityHeight; + expanded = 'false'; + } + + $('#activityExpanded'+id).val(expanded); + activity.height(targetHeight); + } + function openActivityAuthor(id, url, title) { collapseActivity(id, 'Edit'); @@ -253,11 +292,34 @@ if (wd.closed) { clearTimeout(watchClose); $('#activity'+id)[0].contentWindow.location.reload(true); - expandActivity(id, 'Edit'); + uncollapseActivity(id, 'Edit'); } }, 500); if (window.focus) { wd.window.focus(); } - } \ No newline at end of file + } + + function initialDelayedExpand(id){ + initialExpandAttempts[id] = 0; + + /* we can not just expand it as soon as document is loaded + CKEditor is loaded asynchronously and stretches the iframe afterwards + Below is one (not the best) solution - periodically check if iframe grew: + if yes, adjust the hieght; if no, eventually stop */ + + var watchLoaded = setInterval(function() { + var activity = $('#activity'+id); + var currentHeight = activity.height(); + var targetHeight = activity[0].contentDocument.height; + if (targetHeight > currentHeight) { + initialExpandAttempts[id] = 0; + expandActivity(id); + } else if (initialExpandAttempts[id] > INITIAL_EXPAND_MAX_ATTEMPTS){ + clearTimeout(watchLoaded); + } else { + initialExpandAttempts[id] += 1; + } + }, 2000); + } \ No newline at end of file Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/learningdesign/Activity.hbm.xml =================================================================== diff -u -r61e7bbf20d65e2ecb5e50f3154e52264003defa1 -rb706619f710215b7ced6268be670736b61a96eab --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/learningdesign/Activity.hbm.xml (.../Activity.hbm.xml) (revision 61e7bbf20d65e2ecb5e50f3154e52264003defa1) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/learningdesign/Activity.hbm.xml (.../Activity.hbm.xml) (revision b706619f710215b7ced6268be670736b61a96eab) @@ -199,7 +199,11 @@ - + + + + + Index: lams_common/db/sql/create_lams_11_tables.sql =================================================================== diff -u -r8cbd631849cddfbfc7fb887e8a847894e5baaefa -rb706619f710215b7ced6268be670736b61a96eab --- lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision 8cbd631849cddfbfc7fb887e8a847894e5baaefa) +++ lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision b706619f710215b7ced6268be670736b61a96eab) @@ -520,6 +520,9 @@ , stop_after_activity TINYINT NOT NULL DEFAULT 0 , transition_to_id BIGINT(20) , transition_from_id BIGINT(20) + , planner_collapsed TINYINT(1) DEFAULT 0 + , planner_expanded TINYINT(1) DEFAULT 0 + , planner_hidden TINYINT(1) DEFAULT 0 , PRIMARY KEY (activity_id) , INDEX (learning_library_id) , CONSTRAINT FK_lams_learning_activity_7 FOREIGN KEY (learning_library_id) Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolActivity.java =================================================================== diff -u -r8176135403562bdf207f9477805d0e092915312a -rb706619f710215b7ced6268be670736b61a96eab --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolActivity.java (.../ToolActivity.java) (revision 8176135403562bdf207f9477805d0e092915312a) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolActivity.java (.../ToolActivity.java) (revision b706619f710215b7ced6268be670736b61a96eab) @@ -52,7 +52,7 @@ /** Holds value of property toolContentId. */ private Long toolContentId; - + /** Holds value of property tool. */ private Tool tool; @@ -65,6 +65,21 @@ private Set gradebookUserActivities; + /** + * Holds value of property plannerCollapsed. Tells whether the activity should be collapsed in Pedagogical Planner + */ + private Boolean plannerCollapsed; + + /** + * Holds value of property plannerCollapsed. Tells whether the activity should be expanded in Pedagogical Planner + */ + private Boolean plannerExpanded; + + /** + * Holds value of property plannerCollapsed. Tells whether the activity should be hidden in Pedagogical Planner + */ + private Boolean plannerHidden; + /** full constructor */ public ToolActivity(Long activityId, Integer id, String description, String title, Integer xcoord, Integer ycoord, Integer orderId, Boolean defineLater, java.util.Date createDateTime, LearningLibrary learningLibrary, @@ -340,4 +355,28 @@ public void setGradebookUserActivities(Set gradebookUserActivities) { this.gradebookUserActivities = gradebookUserActivities; } + + public Boolean getPlannerCollapsed() { + return plannerCollapsed; + } + + public void setPlannerCollapsed(Boolean plannerCollapsed) { + this.plannerCollapsed = plannerCollapsed; + } + + public Boolean getPlannerExpanded() { + return plannerExpanded; + } + + public void setPlannerExpanded(Boolean plannerExpanded) { + this.plannerExpanded = plannerExpanded; + } + + public Boolean getPlannerHidden() { + return plannerHidden; + } + + public void setPlannerHidden(Boolean plannerHidden) { + this.plannerHidden = plannerHidden; + } } Index: lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerActivityDTO.java =================================================================== diff -u -ra068c0f5a40c0a7818ac3221479444e14e9c854d -rb706619f710215b7ced6268be670736b61a96eab --- lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerActivityDTO.java (.../PedagogicalPlannerActivityDTO.java) (revision a068c0f5a40c0a7818ac3221479444e14e9c854d) +++ lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerActivityDTO.java (.../PedagogicalPlannerActivityDTO.java) (revision b706619f710215b7ced6268be670736b61a96eab) @@ -45,7 +45,11 @@ private Boolean lastNestedActivity = false; private Boolean defaultBranch = false; private Short complexActivityType; - + private Long toolContentId; + private Boolean hidden = false; + private Boolean collapsed = false; + private Boolean expanded = false; + public static final short TYPE_BRANCHING_ACTIVITY = 1; public static final short TYPE_OPTIONAL_ACTIVITY = 2; public static final short TYPE_PARALLEL_ACTIVITY = 3; @@ -66,17 +70,21 @@ pedagogicalPlannerUrl = toolSignature; } - public PedagogicalPlannerActivityDTO(String type, String title, Boolean supportsPlanner, - String pedagogicalPlannerUrl, String authorUrl, String toolIconUrl, String checkEditingAdviceUrl, - String editingAdviceUrl) { + public PedagogicalPlannerActivityDTO( +// String type, String title, + Boolean supportsPlanner, + String pedagogicalPlannerUrl +// , String authorUrl, String toolIconUrl, String checkEditingAdviceUrl, +// String editingAdviceUrl + ) { this.supportsPlanner = supportsPlanner; this.pedagogicalPlannerUrl = pedagogicalPlannerUrl; - this.authorUrl = authorUrl; - this.toolIconUrl = toolIconUrl; - this.checkEditingAdviceUrl = checkEditingAdviceUrl; - this.editingAdviceUrl = editingAdviceUrl; - this.title = title; - this.type = type; +// this.authorUrl = authorUrl; +// this.toolIconUrl = toolIconUrl; +// this.checkEditingAdviceUrl = checkEditingAdviceUrl; +// this.editingAdviceUrl = editingAdviceUrl; +// this.title = title; +// this.type = type; } @@ -159,4 +167,36 @@ public void setComplexActivityType(Short complexActivityType) { this.complexActivityType = complexActivityType; } + + public Boolean getHidden() { + return hidden; + } + + public void setHidden(Boolean hidden) { + this.hidden = hidden; + } + + public Boolean getCollapsed() { + return collapsed; + } + + public void setCollapsed(Boolean collapsed) { + this.collapsed = collapsed; + } + + public Boolean getExpanded() { + return expanded; + } + + public void setExpanded(Boolean expanded) { + this.expanded = expanded; + } + + public Long getToolContentId() { + return toolContentId; + } + + public void setToolContentId(Long toolContentId) { + this.toolContentId = toolContentId; + } } \ No newline at end of file