Index: lams_build/lib/pedagogical_planner/1/1/1/LAMS_Pedagogical_Planner_Template.zip =================================================================== RCS file: /usr/local/cvsroot/lams_build/lib/pedagogical_planner/1/1/1/Attic/LAMS_Pedagogical_Planner_Template.zip,v diff -u -r1.7 -r1.8 Binary files differ Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/language/lams/ApplicationResources.properties,v diff -u -r1.54 -r1.55 --- lams_central/conf/language/lams/ApplicationResources.properties 3 Feb 2009 19:37:45 -0000 1.54 +++ lams_central/conf/language/lams/ApplicationResources.properties 5 Feb 2009 18:24:12 -0000 1.55 @@ -254,6 +254,7 @@ label.planner.branch.empty =This branch is empty. label.planner.branch=Branch label.planner.branch.default=(default) +label.planner.option=Option public.folder=Public Folder #======= End labels: Exported 222 labels for en AU ===== Index: lams_central/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/language/lams/ApplicationResources_en_AU.properties,v diff -u -r1.51 -r1.52 --- lams_central/conf/language/lams/ApplicationResources_en_AU.properties 3 Feb 2009 19:37:45 -0000 1.51 +++ lams_central/conf/language/lams/ApplicationResources_en_AU.properties 5 Feb 2009 18:24:12 -0000 1.52 @@ -254,6 +254,7 @@ label.planner.branch.empty =This branch is empty. label.planner.branch=Branch label.planner.branch.default=(default) +label.planner.option=Option public.folder=Public Folder #======= End labels: Exported 222 labels for en AU ===== Index: lams_central/src/java/org/lamsfoundation/lams/authoring/dto/PedagogicalPlannerActivityDTO.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/authoring/dto/Attic/PedagogicalPlannerActivityDTO.java,v diff -u -r1.3 -r1.4 --- lams_central/src/java/org/lamsfoundation/lams/authoring/dto/PedagogicalPlannerActivityDTO.java 3 Feb 2009 19:37:45 -0000 1.3 +++ lams_central/src/java/org/lamsfoundation/lams/authoring/dto/PedagogicalPlannerActivityDTO.java 5 Feb 2009 18:24:12 -0000 1.4 @@ -31,14 +31,14 @@ private String editingAdviceUrl; private String checkEditingAdviceUrl; private Boolean supportsPlanner; - private Short branch; + private Short group; private String parentActivityTitle; private Boolean lastNestedActivity = false; private Boolean defaultBranch = false; + private Short complexActivityType; - public static final short TYPE_PLAIN_ACTIVITY = 1; - public static final short TYPE_BRANCHING_ACTIVITY = 2; - public static final short TYPE_OPTIONAL_ACTIVITY = 3; + public static final short TYPE_BRANCHING_ACTIVITY = 1; + public static final short TYPE_OPTIONAL_ACTIVITY = 2; public Boolean getSupportsPlanner() { return supportsPlanner; @@ -108,12 +108,12 @@ this.checkEditingAdviceUrl = checkEditingAdviceUrl; } - public Short getBranch() { - return branch; + public Short getGroup() { + return group; } - public void setBranch(Short branch) { - this.branch = branch; + public void setGroup(Short branch) { + this.group = branch; } public String getParentActivityTitle() { @@ -139,4 +139,12 @@ public void setDefaultBranch(Boolean defaultBranch) { this.defaultBranch = defaultBranch; } + + public Short getComplexActivityType() { + return complexActivityType; + } + + public void setComplexActivityType(Short complexActivityType) { + this.complexActivityType = complexActivityType; + } } \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java,v diff -u -r1.18 -r1.19 --- lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java 3 Feb 2009 19:37:45 -0000 1.18 +++ lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java 5 Feb 2009 18:24:13 -0000 1.19 @@ -128,7 +128,7 @@ public static final String ATTR_RESULT_CODE = "resultCode"; public static final String ATTR_RESULT_TEXT = "resultText"; - + // Pedagogical Planner constants public static final String ATTR_PLANNER = "planner"; public static final String PARAM_CALL_ATTEMPTED_ID = "callAttemptedID"; @@ -148,4 +148,10 @@ public static final String RESOURCE_KEY_BRANCH_EMPTY = "label.planner.branch.empty"; public static final String IMAGE_PATH_GROUPING = "images/grouping.gif"; + + public static final String FORWARD_GROUPING = "grouping"; + + public static final int PLANNER_MAX_BRANCHES = 4; + + public static final int PLANNER_MAX_OPTIONS = 4; } \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java,v diff -u -r1.5 -r1.6 --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java 3 Feb 2009 19:37:45 -0000 1.5 +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java 5 Feb 2009 18:24:13 -0000 1.6 @@ -35,6 +35,7 @@ import javax.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; @@ -48,6 +49,7 @@ import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearnerChoiceGrouping; import org.lamsfoundation.lams.learningdesign.LearningDesign; +import org.lamsfoundation.lams.learningdesign.OptionsActivity; import org.lamsfoundation.lams.learningdesign.RandomGrouping; import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; @@ -70,7 +72,7 @@ import org.springframework.web.context.support.WebApplicationContextUtils; /** - * Action that manages Pedagogical Planner base page. + * Action managing Pedagogical Planner base page and non-tool activities. * * @author Marcin Cieslak * @@ -84,21 +86,53 @@ */ public class PedagogicalPlannerAction extends LamsDispatchAction { + // Several chars and strings used for building HTML requests private static final String CHAR_QUESTION_MARK = "?"; - private static final char CHAR_AMPERSAND = '&'; + private static final String CHAR_AMPERSAND = "&"; private static final char CHAR_EQUALS = '='; + private static final String STRING_OK = "OK"; + + // Services used in the class, injected by Spring private static IUserManagementService userManagementService; private static IExportToolContentService exportService; private static IAuthoringService authoringService; private static IMonitoringService monitoringService; private static MessageService messageService; + // Error messages used in class + private static final String ERROR_TOOL_ERRORS = "There were tool errors."; + private static final String ERROR_LEARNING_DESIGN_ERRORS = "There were learning design errors."; + private static final String ERROR_LEARNING_DESIGN_COULD_NOT_BE_RETRIEVED = "Learning design could not be retrieved."; + private static final String ERROR_USER_NOT_FOUND = "User not found."; + private static final String ERROR_NOT_PROPER_FILE = "The sequence template does not exist or is not a proper file."; + private static final String ERROR_TOO_MANY_OPTIONS = "Number of options in options activity is limited to " + + CentralConstants.PLANNER_MAX_OPTIONS + " in Pedagogical Planner."; + private static final String ERROR_NESTED_OPTIONS = "Nested optional activities are not allowed in Pedagogical Planner."; + private static final String ERROR_NESTED_BRANCHING = "Nested branching activities are not allowed in Pedagogical Planner."; + private static final String ERROR_TOO_MANY_BRANCHES = "Number of branches in branching activity is limited to " + + CentralConstants.PLANNER_MAX_BRANCHES + " in Pedagogical Planner."; + private static Logger log = Logger.getLogger(PedagogicalPlannerAction.class); + @Override + /** + * Go straight to start(). + */ public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return start(mapping, form, request, response); } + /** + * The main method for opening and parsing template (chosen learning desing). + * + * @param mapping + * @param form + * @param request + * @param response + * @return + * @throws IOException + * @throws ServletException + */ public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Get the learning design template zip file @@ -108,13 +142,13 @@ File templateDirectory = new File(contentRepositoryPath, designFilePath); File designFile = new File(templateDirectory, CentralConstants.TEMPLATE_FILE_NAME); if (!designFile.exists() || designFile.isDirectory()) { - throw new IOException("The sequence template does not exist or is not a proper file."); + throw new IOException(PedagogicalPlannerAction.ERROR_NOT_PROPER_FILE); } HttpSession session = SessionManager.getSession(); UserDTO userDto = (UserDTO) session.getAttribute(AttributeNames.USER); User user = (User) getUserManagementService().findById(User.class, userDto.getUserID()); if (user == null) { - throw new ServletException("User not found."); + throw new ServletException(PedagogicalPlannerAction.ERROR_USER_NOT_FOUND); } List toolsErrorMsgs = new ArrayList(); Long learningDesignID = null; @@ -131,19 +165,28 @@ throw new ServletException(e.getMessage()); } if ((learningDesignID == null || learningDesignID.longValue() == -1) && learningDesignErrorMsgs.size() == 0) { - throw new ServletException("Learning design could not be retrieved."); + throw new ServletException(PedagogicalPlannerAction.ERROR_LEARNING_DESIGN_COULD_NOT_BE_RETRIEVED); } if (learningDesignErrorMsgs.size() > 0) { - throw new ServletException("There were learning design errors."); + for (String error : learningDesignErrorMsgs) { + PedagogicalPlannerAction.log.error(error); + } + throw new ServletException(PedagogicalPlannerAction.ERROR_LEARNING_DESIGN_ERRORS); } if (toolsErrorMsgs.size() > 0) { - throw new ServletException("There were tool errors."); + for (String error : toolsErrorMsgs) { + PedagogicalPlannerAction.log.error(error); + } + throw new ServletException(PedagogicalPlannerAction.ERROR_TOOL_ERRORS); } + List activities = new ArrayList(); - // create DTO that holds all the necessary information of the activities + // create DTOs that hold all the necessary information of the activities Activity activity = learningDesign.getFirstActivity(); while (activity != null) { + + // Iterate through all the activities addActivityToPlanner(learningDesign, activities, activity); Transition transitionTo = activity.getTransitionTo(); if (transitionTo == null) { @@ -152,21 +195,24 @@ activity = transitionTo.getToActivity(); } } + int activitySupportingPlannerCount = 0; for (PedagogicalPlannerActivityDTO activityDTO : activities) { if (activityDTO.getSupportsPlanner()) { activitySupportingPlannerCount++; } } - // Set other properties + // create DTO for the whole design PedagogicalPlannerDTO planner = new PedagogicalPlannerDTO(); planner.setActivitySupportingPlannerCount(activitySupportingPlannerCount); planner.setSequenceTitle(learningDesign.getTitle()); planner.setActivities(activities); + planner.setLearningDesignID(learningDesignID); + + // Some additional options for submitting activity forms; should be moved to configuration file in the future planner.setSendInPortions(false); planner.setSubmitDelay(5000L); planner.setActivitiesInPortion(2); - planner.setLearningDesignID(learningDesignID); request.setAttribute(CentralConstants.ATTR_PLANNER, planner); return mapping.findForward("success"); @@ -219,12 +265,23 @@ return PedagogicalPlannerAction.messageService; } + /** + * Saves additional, non tool bound template details - currently only the title. + * + * @param mapping + * @param form + * @param request + * @param response + * @return + * @throws IOException + */ public ActionForward saveSequenceDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException { String sequenceTitle = WebUtil.readStrParam(request, CentralConstants.PARAM_SEQUENCE_TITLE, true); Long learningDesignID = WebUtil.readLongParam(request, CentralConstants.PARAM_LEARNING_DESIGN_ID); Integer callAttemptedID = WebUtil.readIntParam(request, CentralConstants.PARAM_CALL_ATTEMPTED_ID); - String responseSuffix = "&" + callAttemptedID; + // We send a message in format "&"; it is then parsed in JavaScript + String responseSuffix = PedagogicalPlannerAction.CHAR_AMPERSAND + callAttemptedID; if (StringUtils.isEmpty(sequenceTitle)) { String blankTitleError = getMessageService().getMessage(CentralConstants.ERROR_PLANNER_TITLE_BLANK); @@ -233,7 +290,7 @@ LearningDesign learningDesign = getAuthoringService().getLearningDesign(learningDesignID); learningDesign.setTitle(sequenceTitle); getAuthoringService().saveLearningDesign(learningDesign); - writeAJAXResponse(response, "OK" + responseSuffix); + writeAJAXResponse(response, PedagogicalPlannerAction.STRING_OK + responseSuffix); } return null; } @@ -244,7 +301,7 @@ Long groupingId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); Grouping grouping = getAuthoringService().getGroupingById(groupingId); plannerForm.fillForm(grouping); - return mapping.findForward("grouping"); + return mapping.findForward(CentralConstants.FORWARD_GROUPING); } public ActionForward saveOrUpdateGroupingForm(ActionMapping mapping, ActionForm form, HttpServletRequest request, @@ -280,14 +337,16 @@ } else { saveMessages(request, errors); } - return mapping.findForward("grouping"); + return mapping.findForward(CentralConstants.FORWARD_GROUPING); } public ActionForward startPreview(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Long learningDesignID = WebUtil.readLongParam(request, CentralConstants.PARAM_LEARNING_DESIGN_ID); HttpSession session = SessionManager.getSession(); UserDTO userDto = (UserDTO) session.getAttribute(AttributeNames.USER); + + // Start preview the same way as in authoring Lesson lesson = getMonitoringService().initializeLessonForPreview("Preview", null, learningDesignID, userDto.getUserID(), null, false, false, false); getMonitoringService().createPreviewClassForLesson(userDto.getUserID(), lesson.getLessonId()); @@ -299,24 +358,43 @@ return new ActionForward(newPath, true); } + /** + * Recognises activitiy type and creates proper DTO for web pages use. For branching and options it can be called + * recursevely. + * + * @param learningDesign + * learning design from which activity was taken + * @param activities + * set of DTOs + * @param activity + * currently parsed activity + * @return created DTO + * @throws ServletException + */ private PedagogicalPlannerActivityDTO addActivityToPlanner(LearningDesign learningDesign, List activities, Activity activity) throws ServletException { + // Check if the activity is contained in some complex activity: branching or options boolean isNested = activity.getParentActivity() != null && (activity.getParentActivity().isBranchingActivity() || activity.isOptionsActivity()); PedagogicalPlannerActivityDTO addedDTO = null; + // Simple tool activity if (activity.isToolActivity()) { ToolActivity toolActivity = (ToolActivity) activity; + // Every tool has an URL that leads to Action that returns proper tool form to use String pedagogicalPlannerUrl = toolActivity.getTool().getPedagogicalPlannerUrl(); if (pedagogicalPlannerUrl == null) { + // if there is no URL, the tool does not support the planner addedDTO = new PedagogicalPlannerActivityDTO(toolActivity.getTool().getToolDisplayName(), activity .getTitle(), false, CentralConstants.PATH_ACTIVITY_NO_PLANNER_SUPPORT, activity .getLibraryActivityUiImage(), null, null); } 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 @@ -330,6 +408,7 @@ } 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() @@ -339,36 +418,42 @@ CentralConstants.IMAGE_PATH_GROUPING, null, null); 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, CentralConstants.PATH_ACTIVITY_NO_PLANNER_SUPPORT, CentralConstants.IMAGE_PATH_GATE, null, null); activities.add(addedDTO); } else if (activity.isBranchingActivity()) { + // Planner does not support branching inside branching/options if (isNested) { - throw new ServletException( - "Nested branching or optional activities are not allowed in Pedagogical Planner."); + throw new ServletException(PedagogicalPlannerAction.ERROR_NESTED_BRANCHING); } BranchingActivity branchingActivity = (BranchingActivity) activity; SequenceActivity defaultSequence = (SequenceActivity) branchingActivity.getDefaultActivity(); Set sequenceActivities = branchingActivity.getActivities(); short branch = 1; for (SequenceActivity sequenceActivity : sequenceActivities) { - if (branch > 4) { - throw new ServletException( - "Number of branches in branching activity is limited to 4 in Pedagogical Planner."); + // Currently Planner supports only 4 branches, but there is no logical reason for that; just add colours + // in CSS and change this value for additional branches + if (branch > CentralConstants.PLANNER_MAX_BRANCHES) { + throw new ServletException(PedagogicalPlannerAction.ERROR_TOO_MANY_BRANCHES); } Activity nestedActivity = sequenceActivity.getDefaultActivity(); boolean defaultBranch = sequenceActivity.equals(defaultSequence); + if (nestedActivity == null) { + // Empty sequence String path = CentralConstants.PATH_ACTIVITY_NO_PLANNER_SUPPORT + 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); addedDTO.setParentActivityTitle(activity.getTitle()); - addedDTO.setBranch(branch); + addedDTO.setGroup(branch); addedDTO.setDefaultBranch(defaultBranch); + addedDTO.setComplexActivityType(PedagogicalPlannerActivityDTO.TYPE_BRANCHING_ACTIVITY); activities.add(addedDTO); } else { + // Iterate through all the activities from the sequence, adding them to Planner activity set do { addedDTO = addActivityToPlanner(learningDesign, activities, nestedActivity); Transition transitionTo = nestedActivity.getTransitionTo(); @@ -378,13 +463,54 @@ nestedActivity = transitionTo.getToActivity(); } addedDTO.setParentActivityTitle(activity.getTitle()); - addedDTO.setBranch(branch); + addedDTO.setGroup(branch); addedDTO.setDefaultBranch(defaultBranch); + addedDTO.setComplexActivityType(PedagogicalPlannerActivityDTO.TYPE_BRANCHING_ACTIVITY); } while (nestedActivity != null); } branch++; } addedDTO.setLastNestedActivity(true); + } else if (activity.isOptionsActivity()) { + // Planner does not support branching inside branching/options + if (isNested) { + throw new ServletException(PedagogicalPlannerAction.ERROR_NESTED_OPTIONS); + } + OptionsActivity optionsActivity = (OptionsActivity) activity; + Set nestedActivities = optionsActivity.getActivities(); + short option = 1; + for (Activity nestedActivity : nestedActivities) { + // Currently Planner supports only 4 options, but there is no logical reason for that; just add + // colours + // in CSS and change this value for additional options + if (option > CentralConstants.PLANNER_MAX_OPTIONS) { + throw new ServletException(PedagogicalPlannerAction.ERROR_TOO_MANY_OPTIONS); + } + // There are two types of options: sequence and activity; if sequence, iterate through them to get all + // the nested activities, same as in branching + if (nestedActivity.isSequenceActivity()) { + nestedActivity = ((SequenceActivity) nestedActivity).getDefaultActivity(); + do { + addedDTO = addActivityToPlanner(learningDesign, activities, nestedActivity); + Transition transitionTo = nestedActivity.getTransitionTo(); + if (transitionTo == null) { + nestedActivity = null; + } else { + nestedActivity = transitionTo.getToActivity(); + } + addedDTO.setParentActivityTitle(activity.getTitle()); + addedDTO.setGroup(option); + addedDTO.setComplexActivityType(PedagogicalPlannerActivityDTO.TYPE_OPTIONAL_ACTIVITY); + } while (nestedActivity != null); + } else { + addedDTO = addActivityToPlanner(learningDesign, activities, nestedActivity); + addedDTO.setParentActivityTitle(activity.getTitle()); + addedDTO.setGroup(option); + addedDTO.setComplexActivityType(PedagogicalPlannerActivityDTO.TYPE_OPTIONAL_ACTIVITY); + } + option++; + } + addedDTO.setLastNestedActivity(true); } else { addedDTO = new PedagogicalPlannerActivityDTO(null, activity.getTitle(), false, CentralConstants.PATH_ACTIVITY_NO_PLANNER_SUPPORT, activity.getLibraryActivityUiImage(), null, null); Index: lams_central/web/css/pedagogicalPlanner.css =================================================================== RCS file: /usr/local/cvsroot/lams_central/web/css/pedagogicalPlanner.css,v diff -u -r1.3 -r1.4 --- lams_central/web/css/pedagogicalPlanner.css 3 Feb 2009 19:37:45 -0000 1.3 +++ lams_central/web/css/pedagogicalPlanner.css 5 Feb 2009 18:24:12 -0000 1.4 @@ -67,51 +67,66 @@ margin: 0px 0px 0px 500px; } -td.branchingFirstActivity{ +td.branchingFirstActivity { border-bottom: thick blue solid; text-align: center; + color: blue; } -td.branchingLastActivity{ +td.optionsFirstActivity { + border-bottom: thick lightgreen solid; + text-align: center; + color:lightgreen; +} + +td.branchingLastActivity { border-bottom: thick blue solid; } -td.branch1{ - border-right: thick yellow solid; +td.optionsLastActivity { + border-bottom: thick lightgreen solid; +} + +td.branch { border-left: thick blue solid; } -td.branch2{ +td.option { + border-left: thick lightgreen solid; +} + +td.group1{ + border-right: thick yellow solid; +} + +td.group2{ border-right: thick orange solid; - border-left: thick blue solid; } -td.branch3{ +td.group3{ border-right: thick red solid; - border-left: thick blue solid; } -td.branch4{ +td.group4{ border-right: thick purple solid; - border-left: thick blue solid; } -h3.branch1{ +h3.group1{ color: #F1CD03; text-decoration: underline; } -h3.branch2{ +h3.group2{ color: orange; text-decoration: underline; } -h3.branch3{ +h3.group3{ color: red; text-decoration: underline; } -h3.branch4{ +h3.group4{ color: purple; text-decoration: underline; } \ No newline at end of file Index: lams_central/web/pedagogical_planner/base.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_central/web/pedagogical_planner/Attic/base.jsp,v diff -u -r1.6 -r1.7 --- lams_central/web/pedagogical_planner/base.jsp 3 Feb 2009 19:37:45 -0000 1.6 +++ lams_central/web/pedagogical_planner/base.jsp 5 Feb 2009 18:24:12 -0000 1.7 @@ -8,9 +8,10 @@ <%@ taglib uri="tags-function" prefix="fn" %> - <fmt:message key="title.lams"/> :: <fmt:message key="planner.title" /> - + <fmt:message key="title.lams"/> :: <fmt:message key="planner.title" /> +