Index: lams_central/build.xml =================================================================== diff -u -r2f5473044ec01bd94a2ea8e5262b2a200f1e6da6 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_central/build.xml (.../build.xml) (revision 2f5473044ec01bd94a2ea8e5262b2a200f1e6da6) +++ lams_central/build.xml (.../build.xml) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -186,6 +186,10 @@ + + + + @@ -295,10 +299,6 @@ - - - - @@ -311,9 +311,9 @@ - - - + + + Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -re67b31517d5a6991a5d88a3485bc23da8b6e65a0 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision e67b31517d5a6991a5d88a3485bc23da8b6e65a0) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -357,6 +357,17 @@ label.planner.export.sequence=Export sequence error.planner.export.template=There was an error while exporting the template. +label.planner.tutorial.video=Introduction to Pedagogical Planner +label.tutorial.video.never.show.again=Do not show this again + +label.planner.tutorial.video.show=Show tutorial video: Introduction to Pedagogical Planner +label.tutorial.enabled=Automatically open help assistants. If this option is No, then no online help assistants will be opened. +label.tutorial.disable.single=You have chosen not to show this video again. You can always play it using the video icon in the right upper corner of the page. +label.tutorial.disable.all=Welcome to LAMS! As a new user, you might want to spend a few minutes looking at the new online assistant animations and videos to help you get the most out of LAMS. You can turn this option off if you are an experience LAMS user. If you are new to LAMS, we recommend that you leave this on to get contextual help. Do you want to to leave this option on? + button.planner.back=Back +label.planner.recent.learning.designs.title=Recently modified Learning Designs +label.planner.recent.learning.designs.list.empty=No Learning Designs found -#======= End labels: Exported 266 labels for en AU ===== + +#======= End labels: Exported 266 labels for en AU ===== \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java =================================================================== diff -u -rd76e13fea785246cc091078e2b8eb460cc7bf342 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java (.../CentralConstants.java) (revision d76e13fea785246cc091078e2b8eb460cc7bf342) +++ lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java (.../CentralConstants.java) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -147,6 +147,8 @@ public static final int PLANNER_MAX_PARALLEL_ACTIVITIES = 4; + public static final int PLANNER_RECENT_LD_MAX_COUNT = 5; + public static final String MONITORING_SERVICE_BEAN_NAME = "monitoringService"; public static final String CENTRAL_MESSAGE_SERVICE_BEAN_NAME = "centralMessageService"; Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java =================================================================== diff -u -re67b31517d5a6991a5d88a3485bc23da8b6e65a0 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision e67b31517d5a6991a5d88a3485bc23da8b6e65a0) +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -35,6 +35,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -268,9 +269,9 @@ /*----------------------- TEMPLATE CHOOSER METHODS --------------------*/ /** - * Opens template from sequence chooser. + * Opens a new template from sequence chooser. */ - public ActionForward openTemplate(ActionMapping mapping, ActionForm form, HttpServletRequest request, + public ActionForward openNewTemplate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException { ActionMessages errors = new ActionMessages(); @@ -291,6 +292,26 @@ } /** + * Opens an existing learning design. + */ + public ActionForward openExistingTemplate(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws ServletException { + + Long learningDesignId = WebUtil.readLongParam(request, CentralConstants.PARAM_LEARNING_DESIGN_ID); + + // Open the learning design stored in DB. + LearningDesign learningDesign = getAuthoringService().getLearningDesign(learningDesignId); + ActionMessages errors = openTemplate(request, learningDesign); + + if (!errors.isEmpty()) { + saveErrors(request, errors); + // If anything goes wrong, errors will be displayed at top. This approach is used widely in this action. + return openSequenceNode(mapping, form, request, (Long) null); + } + return mapping.findForward(PedagogicalPlannerAction.FORWARD_TEMPLATE); + } + + /** * The main method for opening and parsing template (chosen learning desing). * * @param request @@ -333,7 +354,7 @@ } } // create DTO for the whole design - Long nodeUid = WebUtil.readLongParam(request, CentralConstants.PARAM_UID); + Long nodeUid = WebUtil.readLongParam(request, CentralConstants.PARAM_UID, true); PedagogicalPlannerTemplateDTO planner = new PedagogicalPlannerTemplateDTO(); planner.setActivitySupportingPlannerCount(activitySupportingPlannerCount); @@ -348,6 +369,8 @@ planner.setActivitiesPerPortion(2); request.setAttribute(CentralConstants.ATTR_PLANNER, planner); + + updateRecentLearningDesignList(learningDesign.getLearningDesignId()); return errors; } @@ -664,6 +687,9 @@ if (dto == null) { // No filtering or something went wrong in filtering dto = new PedagogicalPlannerSequenceNodeDTO(node, node.getSubnodes()); + if (nodeUid == null) { + dto.setRecentlyModifiedNodes(getRecentlyModifiedLearnindDesignsAsNodes()); + } } // Additional DTO parameters @@ -1437,6 +1463,49 @@ return mapping.findForward(PedagogicalPlannerAction.FORWARD_GROUPING); } + private List getRecentlyModifiedLearnindDesignsAsNodes() { + // Add the recently modified learning design list, if it's the root node with no filtering + HttpSession session = SessionManager.getSession(); + UserDTO userDto = (UserDTO) session.getAttribute(AttributeNames.USER); + User user = (User) getUserManagementService().findById(User.class, userDto.getUserID()); + Set recentLDs = user.getRecentlyModifiedLearningDesigns(); + List recentNodes = new LinkedList(); + for (Long learningDesignId : recentLDs) { + LearningDesign learningDesign = getAuthoringService().getLearningDesign(learningDesignId); + + PedagogicalPlannerSequenceNodeDTO node = new PedagogicalPlannerSequenceNodeDTO(); + node.setTitle(learningDesign.getTitle()); + node.setLearningDesignId(learningDesignId); + + recentNodes.add(node); + } + return recentNodes; + } + + private void updateRecentLearningDesignList(Long learningDesignId) { + HttpSession session = SessionManager.getSession(); + UserDTO userDto = (UserDTO) session.getAttribute(AttributeNames.USER); + User user = (User) getUserManagementService().findById(User.class, userDto.getUserID()); + Set recentLDs = user.getRecentlyModifiedLearningDesigns(); + boolean ldFound = false; + Iterator iter = recentLDs.iterator(); + while (iter.hasNext()) { + Long recentLD = iter.next(); + if (recentLD.equals(learningDesignId)) { + iter.remove(); + getUserManagementService().save(user); + ldFound = true; + break; + } + } + + if (!ldFound && recentLDs.size() >= CentralConstants.PLANNER_RECENT_LD_MAX_COUNT) { + iter.remove(); + } + recentLDs.add(learningDesignId); + getUserManagementService().save(user); + } + /*-------------------------- TEMPLATE BASE METHODS -----------------*/ /** @@ -1632,4 +1701,5 @@ } } } + } \ No newline at end of file Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/usermanagement/User.hbm.xml =================================================================== diff -u -r4f33380083bd35fd6d0851de9def290c62ffc3c9 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/usermanagement/User.hbm.xml (.../User.hbm.xml) (revision 4f33380083bd35fd6d0851de9def290c62ffc3c9) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/usermanagement/User.hbm.xml (.../User.hbm.xml) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -569,6 +569,22 @@ + + + + + + + Index: lams_common/db/sql/create_lams_11_tables.sql =================================================================== diff -u -r08f4238ab4efb7f72924b08f5f21146cc614bf69 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision 08f4238ab4efb7f72924b08f5f21146cc614bf69) +++ lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -1162,4 +1162,15 @@ , CONSTRAINT FK_lams_user_disabled_tutorials_1 FOREIGN KEY (user_id) REFERENCES lams_user (user_id) ON DELETE CASCADE ON UPDATE CASCADE , PRIMARY KEY (user_id,page_str) +)TYPE=InnoDB; + +CREATE TABLE lams_planner_recent_learning_designs ( + user_id BIGINT(20) NOT NULL + , learning_design_id BIGINT(20) NOT NULL + , last_modified_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + , CONSTRAINT FK_lams_planner_recent_learning_designs_1 FOREIGN KEY (user_id) + REFERENCES lams_user (user_id) ON DELETE CASCADE ON UPDATE CASCADE + , CONSTRAINT FK_lams_planner_recent_learning_designs_2 FOREIGN KEY (learning_design_id) + REFERENCES lams_learning_design (learning_design_id) ON DELETE CASCADE ON UPDATE CASCADE + , PRIMARY KEY (user_id,learning_design_id) )TYPE=InnoDB; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch0017_updateFrom23-231.sql =================================================================== diff -u -r1dc15c329f1868b8e3091b662405f4ea3ceb7ea2 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch0017_updateFrom23-231.sql (.../patch0017_updateFrom23-231.sql) (revision 1dc15c329f1868b8e3091b662405f4ea3ceb7ea2) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch0017_updateFrom23-231.sql (.../patch0017_updateFrom23-231.sql) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -33,6 +33,18 @@ PRIMARY KEY (user_id,page_str) )TYPE=InnoDB; +-- Add recently modified learning design list to Pedagogical Planner +CREATE TABLE lams_planner_recent_learning_designs ( + user_id BIGINT(20) NOT NULL + , learning_design_id BIGINT(20) NOT NULL + , last_modified_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + , CONSTRAINT FK_lams_planner_recent_learning_designs_1 FOREIGN KEY (user_id) + REFERENCES lams_user (user_id) ON DELETE CASCADE ON UPDATE CASCADE + , CONSTRAINT FK_lams_planner_recent_learning_designs_2 FOREIGN KEY (learning_design_id) + REFERENCES lams_learning_design (learning_design_id) ON DELETE CASCADE ON UPDATE CASCADE + , PRIMARY KEY (user_id,learning_design_id) +)TYPE=InnoDB; + ----------------------Put all sql statements above here------------------------- -- If there were no errors, commit and restore autocommit to on Index: lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java =================================================================== diff -u -r9a28a1269fd337e431f26f8515bdc10bcf3a53ee -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java (.../PedagogicalPlannerDAOHibernate.java) (revision 9a28a1269fd337e431f26f8515bdc10bcf3a53ee) +++ lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java (.../PedagogicalPlannerDAOHibernate.java) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -48,6 +48,12 @@ private static final String FIND_NEIGHBOUR_NODE = "FROM " + PedagogicalPlannerSequenceNode.class.getName() + " AS n WHERE ((? IS NULL AND n.parent=NULL) OR n.parent.uid=?) AND n.order=?"; + /* + * private static final String FIND_RECENTLY_MODIFIED_LD = "SELECT ld FROM " + LearningDesign.class.getName() + " AS + * ld, lams_planner_recent_learning_designs AS recent WHERE recent.user_id=? AND + * ld.learningDesignId=recent.learning_design_id ORDER BY recent.last_modified_date DESC LIMIT ?"; + */ + public PedagogicalPlannerSequenceNode getByUid(Long uid) { return (PedagogicalPlannerSequenceNode) getHibernateTemplate().get(PedagogicalPlannerSequenceNode.class, uid); } Index: lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerSequenceNodeDTO.java =================================================================== diff -u -r25b4e713aa72081e702977a097646e2c5b680641 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerSequenceNodeDTO.java (.../PedagogicalPlannerSequenceNodeDTO.java) (revision 25b4e713aa72081e702977a097646e2c5b680641) +++ lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerSequenceNodeDTO.java (.../PedagogicalPlannerSequenceNodeDTO.java) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -40,11 +40,13 @@ private Boolean locked; private List subnodes; private Long parentUid; + private Long learningDesignId; // Not node-bound variables, but simply attributes used in JSP page private Boolean edit = false; private Boolean createSubnode = false; private Boolean isSysAdmin = true; private Boolean importNode = false; + private List recentlyModifiedNodes; private static final String FULL_DESCRIPTION_NOT_EMPTY = "FULL"; @@ -182,4 +184,20 @@ public void setImportNode(Boolean importNode) { this.importNode = importNode; } + + public Long getLearningDesignId() { + return learningDesignId; + } + + public void setLearningDesignId(Long learningDesignId) { + this.learningDesignId = learningDesignId; + } + + public List getRecentlyModifiedNodes() { + return recentlyModifiedNodes; + } + + public void setRecentlyModifiedNodes(List recentlyModifiedNodes) { + this.recentlyModifiedNodes = recentlyModifiedNodes; + } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/User.java =================================================================== diff -u -r4f33380083bd35fd6d0851de9def290c62ffc3c9 -r242af895b7cc36e5f825a4b99862b92a5faa87ed --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/User.java (.../User.java) (revision 4f33380083bd35fd6d0851de9def290c62ffc3c9) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/User.java (.../User.java) (revision 242af895b7cc36e5f825a4b99862b92a5faa87ed) @@ -28,6 +28,7 @@ import java.util.Date; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.Set; import java.util.TimeZone; @@ -171,6 +172,8 @@ /** persistent field - latch */ private Boolean firstLogin; + private Set recentlyModifiedLearningDesigns = new LinkedHashSet(); + // ------- TIMEZONES (hardcoded, there is no need to put them into database -------------- public static String[] timezoneList = new String[] { "GMT-12", "GMT-11", "GMT-10", "GMT-9", "GMT-8", "GMT-7", @@ -896,4 +899,19 @@ public void setFirstLogin(Boolean firstLogin) { this.firstLogin = firstLogin; } + + /** + * @hibernate.set lazy="true" table="lams_planner_recent_learning_designs" cascade="all-delete-orphan" + * order-by="last_modified_date DESC" + * @hibernate.collection-key column="user_id" + * @hibernate.collection-element column="learning_design_id" type="long" not-null="true" + */ + public Set getRecentlyModifiedLearningDesigns() { + return recentlyModifiedLearningDesigns; + } + + public void setRecentlyModifiedLearningDesigns(Set recentlyModifiedLearningDesigns) { + this.recentlyModifiedLearningDesigns = recentlyModifiedLearningDesigns; + } + } \ No newline at end of file