Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/PermissionGateDTO.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/PermissionGateDTO.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/PermissionGateDTO.java (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,81 @@ +package org.lamsfoundation.lams.monitoring.dto; + +import org.lamsfoundation.lams.learningdesign.Activity; + +/** + * DTO used to return the activity details needed for the contribute activities list + * + * @author Andrey Balan + */ +public class PermissionGateDTO { + + private String title; + private String url; + private Long activityID; + private Integer activityTypeID; + private Integer orderID; + private int waitingLearnersCount; + private boolean complete; + + public PermissionGateDTO(Activity activity) { + this.title = activity.getTitle(); + this.activityID = activity.getActivityId(); + } + + /** + * @return Returns the activityID. + */ + public Long getActivityID() { + return activityID; + } + + /** + * @return Returns the activityTypeID. + */ + public Integer getActivityTypeID() { + return activityTypeID; + } + + /** + * @return Returns the description. + */ + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + /** + * @return Returns the orderID. + */ + public Integer getOrderID() { + return orderID; + } + + /** + * @return Returns the title. + */ + public String getTitle() { + return title; + + } + + public int getWaitingLearnersCount() { + return waitingLearnersCount; + } + + public void setWaitingLearnersCount(int waitingLearnersCount) { + this.waitingLearnersCount = waitingLearnersCount; + } + + public boolean isComplete() { + return complete; + } + + public void setComplete(boolean complete) { + this.complete = complete; + } + +} Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblGroupDTO.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblGroupDTO.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblGroupDTO.java (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,92 @@ +package org.lamsfoundation.lams.monitoring.dto; + +import java.util.ArrayList; +import java.util.List; + +import org.lamsfoundation.lams.learningdesign.Group; +import org.lamsfoundation.lams.util.AlphanumComparator; + +public class TblGroupDTO implements Comparable { + + private Long groupID; + private String groupName; + private int orderID; + private List userList; + + private TblUserDTO groupLeader; + + private Double traScore; + + /** + * Get the DTO for this group. Does not include the GroupBranchActivities as they will be in a separate array for + * Flash. + * + * @param group + */ + @SuppressWarnings("unchecked") + public TblGroupDTO(Group group) { + groupID = group.getGroupId(); + groupName = group.getGroupName(); + orderID = group.getOrderId(); + userList = new ArrayList(); + } + + @Override + public int compareTo(Object o) { + TblGroupDTO castOther = (TblGroupDTO) o; + + String grp1Name = castOther != null && castOther.getGroupName() != null ? castOther.getGroupName() : ""; + String grp2Name = this.groupName != null ? this.groupName : ""; + + AlphanumComparator comparator = new AlphanumComparator(); + return -comparator.compare(grp1Name, grp2Name); + } + + public Long getGroupID() { + return groupID; + } + + public void setGroupID(Long groupID) { + this.groupID = groupID; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public int getOrderID() { + return orderID; + } + + public void setOrderID(int orderID) { + this.orderID = orderID; + } + + public List getUserList() { + return userList; + } + + public void setUserList(List userList) { + this.userList = userList; + } + + public TblUserDTO getGroupLeader() { + return groupLeader; + } + + public void setGroupLeader(TblUserDTO groupLeader) { + this.groupLeader = groupLeader; + } + + public void setTraScore(Double traScore) { + this.traScore = traScore; + } + + public Double getTraScore() { + return traScore; + } +} Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblUserDTO.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblUserDTO.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblUserDTO.java (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,32 @@ +package org.lamsfoundation.lams.monitoring.dto; + +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; + +public class TblUserDTO extends UserDTO { + + private boolean groupLeader; + private Double iraScore; + + public TblUserDTO(UserDTO userDto) { + super(userDto.getUserID(), userDto.getFirstName(), userDto.getLastName(), userDto.getLocaleCountry(), + userDto.getLocaleLanguage(), userDto.getLocaleCountry(), userDto.getDirection(), userDto.getEmail(), + userDto.getTheme(), userDto.getTimeZone(), null, null, null, null, null, null, userDto.getPortraitUuid()); + } + + public void setGroupLeader(boolean groupLeader) { + this.groupLeader = groupLeader; + } + + public boolean isGroupLeader() { + return groupLeader; + } + + public void setIraScore(Double iraScore) { + this.iraScore = iraScore; + } + + public Double getIraScore() { + return iraScore; + } + +} Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringAction.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringAction.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringAction.java (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,435 @@ +package org.lamsfoundation.lams.monitoring.web; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.gradebook.GradebookUserActivity; +import org.lamsfoundation.lams.gradebook.service.IGradebookService; +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ActivityOrderComparator; +import org.lamsfoundation.lams.learningdesign.BranchingActivity; +import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.ContributionTypes; +import org.lamsfoundation.lams.learningdesign.GateActivity; +import org.lamsfoundation.lams.learningdesign.Group; +import org.lamsfoundation.lams.learningdesign.Grouping; +import org.lamsfoundation.lams.learningdesign.GroupingActivity; +import org.lamsfoundation.lams.learningdesign.SequenceActivity; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.learningdesign.Transition; +import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.lesson.service.ILessonService; +import org.lamsfoundation.lams.monitoring.dto.ContributeActivityDTO; +import org.lamsfoundation.lams.monitoring.dto.PermissionGateDTO; +import org.lamsfoundation.lams.monitoring.dto.TblGroupDTO; +import org.lamsfoundation.lams.monitoring.dto.TblUserDTO; +import org.lamsfoundation.lams.monitoring.service.IMonitoringService; +import org.lamsfoundation.lams.tool.ToolSession; +import org.lamsfoundation.lams.tool.service.ILamsCoreToolService; +import org.lamsfoundation.lams.tool.service.ILamsToolService; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.util.CentralConstants; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.action.LamsDispatchAction; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * Displays TBL monitor. + * + * @author Andrey Balan + */ +public class TblMonitoringAction extends LamsDispatchAction { + + private static Logger log = Logger.getLogger(TblMonitoringAction.class); + + private static ILessonService lessonService; + private static IMonitoringService monitoringService; + private static ILamsCoreToolService coreToolService; + private static ILamsToolService toolService; + private static IActivityDAO activityDAO; + private static IGradebookService gradebookService; + + /** + * Displays addStudent page. + */ + public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + initServices(); + + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + Lesson lesson = lessonService.getLesson(lessonId); + request.setAttribute("lesson", lesson); + request.setAttribute("totalLearnersNumber", lesson.getAllLearners().size()); + + List lessonActivities = getLessonActivities(lesson); + setupAvailableActivityTypes(request, lessonActivities); + return mapping.findForward("tblmonitor"); + } + + /** + * Shows Teams page + */ + public ActionForward teams(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + Lesson lesson = lessonService.getLesson(lessonId); + + List lessonActivities = getLessonActivities(lesson); + setupAvailableActivityTypes(request, lessonActivities); + boolean isScratchieAvailable = (request.getAttribute("isScratchieAvailable") != null) + && ((Boolean) request.getAttribute("isScratchieAvailable")); + boolean isIraMcqAvailable = (request.getAttribute("isIraMcqAvailable") != null) + && ((Boolean) request.getAttribute("isIraMcqAvailable")); + boolean isIraAssessmentAvailable = (request.getAttribute("isIraAssessmentAvailable") != null) + && ((Boolean) request.getAttribute("isIraAssessmentAvailable")); + Long iraToolActivityId = request.getAttribute("iraToolActivityId") == null ? null + : (Long) request.getAttribute("iraToolActivityId"); + Long traToolActivityId = request.getAttribute("traToolActivityId") == null ? null + : (Long) request.getAttribute("traToolActivityId"); + Long leaderselectionToolActivityId = request.getAttribute("leaderselectionToolActivityId") == null ? null + : (Long) request.getAttribute("leaderselectionToolActivityId"); + + //get all mcq and assessment scores + List iraGradebookUserActivities = new LinkedList<>(); + List traGradebookUserActivities = new LinkedList<>(); + if (isIraMcqAvailable || isIraAssessmentAvailable) { + iraGradebookUserActivities = gradebookService.getGradebookUserActivities(iraToolActivityId); + } + if (isScratchieAvailable) { + traGradebookUserActivities = gradebookService.getGradebookUserActivities(traToolActivityId); + } + + Set leaderUserIds = leaderselectionToolActivityId == null ? new HashSet() + : toolService.getLeaderUserId(leaderselectionToolActivityId); + + GroupingActivity groupingActivity = getGroupingActivity(lesson); + Grouping grouping = groupingActivity == null ? null : groupingActivity.getCreateGrouping(); + Set groups = grouping == null ? null : grouping.getGroups(); + + Set groupDtos = new TreeSet(); + if (groups != null) { + for (Group group : groups) { + TblGroupDTO groupDto = new TblGroupDTO(group); + groupDtos.add(groupDto); + + if (group.getUsers() != null) { + for (User user : group.getUsers()) { + TblUserDTO userDto = new TblUserDTO(user.getUserDTO()); + groupDto.getUserList().add(userDto); + + //set up all user leaders + if (leaderUserIds.contains(new Long(user.getUserId()))) { + userDto.setGroupLeader(true); + groupDto.setGroupLeader(userDto); + } + + if (isIraMcqAvailable || isIraAssessmentAvailable) { + //find according iraGradebookUserActivity + for (GradebookUserActivity iraGradebookUserActivity : iraGradebookUserActivities) { + if (iraGradebookUserActivity.getLearner().getUserId().equals(user.getUserId())) { + userDto.setIraScore(iraGradebookUserActivity.getMark()); + break; + } + } + } + + if (isScratchieAvailable) { + //find according traGradebookUserActivity + for (GradebookUserActivity traGradebookUserActivity : traGradebookUserActivities) { + if (traGradebookUserActivity.getLearner().getUserId().equals(user.getUserId())) { + //we set traScore multiple times, but it's doesn't matter + groupDto.setTraScore(traGradebookUserActivity.getMark()); + break; + } + } + } + } + } + } + } + request.setAttribute("groupDtos", groupDtos); + + return mapping.findForward("teams"); + } + + /** + * Shows Gates page + */ + public ActionForward gates(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + + List permissionGates = new ArrayList(); + + List contributeActivities = monitoringService.getAllContributeActivityDTO(lessonId); + if (contributeActivities != null) { + for (ContributeActivityDTO contributeActivity : contributeActivities) { + + if (contributeActivity.getContributeEntries() != null) { + + //check if there is any persmission gates entries + for (ContributeActivityDTO.ContributeEntry contributeEntry : contributeActivity + .getContributeEntries()) { + if (ContributionTypes.PERMISSION_GATE.equals(contributeEntry.getContributionType())) { + + Long activityId = contributeActivity.getActivityID(); + Activity activity = monitoringService.getActivityById(activityId); + PermissionGateDTO gateDto = new PermissionGateDTO(activity); + + gateDto.setUrl(contributeEntry.getURL()); + gateDto.setComplete(contributeEntry.getIsComplete()); + + int waitingLearnersCount = lessonService.getCountLearnersHaveAttemptedActivity(activity); + gateDto.setWaitingLearnersCount(waitingLearnersCount); + + permissionGates.add(gateDto); + break; + } + } + } + } + } + + request.setAttribute("permissionGates", permissionGates); + return mapping.findForward("gates"); + } + + /** + * Shows forum page + */ + public ActionForward forum(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + + long forumActivityId = WebUtil.readLongParam(request, "activityId"); + ToolActivity forumActivity = (ToolActivity) monitoringService.getActivityById(forumActivityId); + + int attemptedLearnersNumber = lessonService.getCountLearnersHaveAttemptedActivity(forumActivity); + request.setAttribute("attemptedLearnersNumber", attemptedLearnersNumber); + + Set toolSessions = forumActivity.getToolSessions(); + request.setAttribute("toolSessions", toolSessions); + + return mapping.findForward("forum"); + } + + /** + * Shows sequence diagram page + */ + public ActionForward sequence(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + Lesson lesson = lessonService.getLesson(lessonId); + request.setAttribute("lesson", lesson); + return mapping.findForward("sequence"); + } + + /** + * Returns lesson activities sorted by the learning design order. + */ + @SuppressWarnings("unchecked") + private List getLessonActivities(Lesson lesson) { + + /* + * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious + * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. + * + * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is + * one + */ + Activity firstActivity = activityDAO + .getActivityByActivityId(lesson.getLearningDesign().getFirstActivity().getActivityId()); + List activities = new ArrayList(); + sortActivitiesByLearningDesignOrder(firstActivity, activities); + + return activities; + } + + /** + * Sort all activities by the learning design order. + * + * @param activity + * @param sortedActivities + */ + private void sortActivitiesByLearningDesignOrder(Activity activity, List sortedActivities) { + sortedActivities.add(activity); + + //in case of branching activity - add all activities based on their orderId + if (activity.isBranchingActivity()) { + BranchingActivity branchingActivity = (BranchingActivity) activity; + Set sequenceActivities = new TreeSet(new ActivityOrderComparator()); + sequenceActivities.addAll(branchingActivity.getActivities()); + for (Activity sequenceActivityNotInitialized : sequenceActivities) { + SequenceActivity sequenceActivity = (SequenceActivity) monitoringService + .getActivityById(sequenceActivityNotInitialized.getActivityId()); + Set childActivities = new TreeSet(new ActivityOrderComparator()); + childActivities.addAll(sequenceActivity.getActivities()); + + //add one by one in order to initialize all activities + for (Activity childActivity : childActivities) { + Activity activityInit = monitoringService.getActivityById(childActivity.getActivityId()); + sortedActivities.add(activityInit); + } + } + + // In case of complex activity (parallel, help or optional activity) add all its children activities. + // They will be sorted by orderId + } else if (activity.isComplexActivity()) { + ComplexActivity complexActivity = (ComplexActivity) activity; + Set childActivities = new TreeSet(new ActivityOrderComparator()); + childActivities.addAll(complexActivity.getActivities()); + + // add one by one in order to initialize all activities + for (Activity childActivity : childActivities) { + Activity activityInit = monitoringService.getActivityById(childActivity.getActivityId()); + sortedActivities.add(activityInit); + } + } + + Transition transitionFrom = activity.getTransitionFrom(); + if (transitionFrom != null) { + // query activity from DB as transition holds only proxied activity object + Long nextActivityId = transitionFrom.getToActivity().getActivityId(); + Activity nextActivity = monitoringService.getActivityById(nextActivityId); + + sortActivitiesByLearningDesignOrder(nextActivity, sortedActivities); + } + } + + private GroupingActivity getGroupingActivity(Lesson lesson) { + Set activities = new TreeSet(); + + /* + * Hibernate CGLIB is failing to load the first activity in the sequence as a ToolActivity for some mysterious + * reason Causes a ClassCastException when you try to cast it, even if it is a ToolActivity. + * + * THIS IS A HACK to retrieve the first tool activity manually so it can be cast as a ToolActivity - if it is + * one + */ + Activity firstActivity = monitoringService + .getActivityById(lesson.getLearningDesign().getFirstActivity().getActivityId()); + activities.add(firstActivity); + activities.addAll(lesson.getLearningDesign().getActivities()); + + for (Activity activity : activities) { + if (activity instanceof GroupingActivity) { + return (GroupingActivity) activity; + } + } + + return null; + } + + private void setupAvailableActivityTypes(HttpServletRequest request, List activities) { + + boolean scratchiePassed = false; + boolean iraPassed = false; + String assessmentToolContentIds = ""; + String assessmentActivityTitles = ""; + for (Activity activity : activities) { + if (activity instanceof ToolActivity) { + ToolActivity toolActivity = (ToolActivity) activity; + String toolSignature = toolActivity.getTool().getToolSignature(); + Long toolContentId = toolActivity.getToolContentId(); + Long toolActivityId = toolActivity.getActivityId(); + String toolTitle = toolActivity.getTitle(); + + //count only the first MCQ or Assessmnet as iRA + if (!iraPassed && (CentralConstants.TOOL_SIGNATURE_MCQ.equals(toolSignature) + || CentralConstants.TOOL_SIGNATURE_ASSESSMENT.equals(toolSignature))) { + iraPassed = true; + if (CentralConstants.TOOL_SIGNATURE_MCQ.equals(toolSignature)) { + request.setAttribute("isIraMcqAvailable", true); + + } else { + request.setAttribute("isIraAssessmentAvailable", true); + request.setAttribute("iraAssessmentActivityTitle", toolTitle); + } + request.setAttribute("iraToolContentId", toolContentId); + request.setAttribute("iraToolActivityId", toolActivityId); + + continue; + } + + //aes are counted only after Scratchie activity + if (scratchiePassed && CentralConstants.TOOL_SIGNATURE_ASSESSMENT.equals(toolSignature)) { + request.setAttribute("isAeAvailable", true); + //prepare assessment details to be passed to Assessment tool + assessmentToolContentIds += toolContentId + ","; + assessmentActivityTitles += toolTitle + "\\,"; + + } else if (CentralConstants.TOOL_SIGNATURE_FORUM.equals(toolSignature)) { + request.setAttribute("isForumAvailable", true); + request.setAttribute("forumActivityId", toolActivityId); + + //tRA is the first scratchie activity + } else if (!scratchiePassed && CentralConstants.TOOL_SIGNATURE_SCRATCHIE.equals(toolSignature)) { + scratchiePassed = true; + + request.setAttribute("isScratchieAvailable", true); + request.setAttribute("traToolContentId", toolContentId); + request.setAttribute("traToolActivityId", toolActivityId); + } + + if (CentralConstants.TOOL_SIGNATURE_LEADERSELECTION.equals(toolSignature)) { + request.setAttribute("leaderselectionToolActivityId", toolActivityId); + request.setAttribute("leaderselectionToolContentId", toolContentId); + } + + } else if (activity instanceof GateActivity) { + request.setAttribute("isGatesAvailable", true); + } + } + + request.setAttribute("assessmentToolContentIds", assessmentToolContentIds); + request.setAttribute("assessmentActivityTitles", assessmentActivityTitles); + } + + private void initServices() { + ServletContext servletContext = this.getServlet().getServletContext(); + WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); + if (lessonService == null) { + lessonService = (ILessonService) ctx.getBean("lessonService"); + } + + if (monitoringService == null) { + monitoringService = (IMonitoringService) ctx.getBean("monitoringService"); + } + + if (coreToolService == null) { + coreToolService = (ILamsCoreToolService) ctx.getBean("lamsCoreToolService"); + } + + if (toolService == null) { + toolService = (ILamsToolService) ctx.getBean("lamsToolService"); + } + + if (activityDAO == null) { + activityDAO = (IActivityDAO) ctx.getBean("activityDAO"); + } + + if (gradebookService == null) { + gradebookService = (IGradebookService) ctx.getBean("gradebookService"); + } + + } + +} Index: lams_monitoring/web/WEB-INF/struts-config.xml =================================================================== diff -u -r225d293907a5e2976e367ee3aa790239bad38699 -rd7ed1173946998f754a2efef09d68c9e3bfe307f --- lams_monitoring/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 225d293907a5e2976e367ee3aa790239bad38699) +++ lams_monitoring/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -177,6 +177,39 @@ redirect="false" /> + + + + + + + SYSADMIN + + + TBL Monitor interface + /tblmonitor.do + GET + POST + + + + MONITOR + GROUP ADMIN + GROUP MANAGER + SYSADMIN + + Index: lams_monitoring/web/css/tblmonitor.scss =================================================================== diff -u --- lams_monitoring/web/css/tblmonitor.scss (revision 0) +++ lams_monitoring/web/css/tblmonitor.scss (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,400 @@ +/*! + * Start Bootstrap - Simple Sidebar HTML Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + * **LAMS** Heavily customized by LAMS.d + */ + +/* Toggle Styles */ + +@import "_lams_variables.scss"; +@import "_monitorLesson_base.scss"; + +#wrapper { + padding-left: 0; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; +} + +#wrapper.toggled { + padding-left: 150px; +} + +#sidebar-wrapper { + z-index: 101; + position: fixed; + left: 154px; + width: 0; + height: 100%; + margin-left:-154px; + overflow-y: auto; + background: $brand-primary-darker; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; + font-size:20px; + text-align:center; + color: #eee; +} + +#wrapper.toggled #sidebar-wrapper { + width:154px; +} + +#page-content-wrapper { + width:100%; + position:absolute; +/* padding:15px;*/ +} + +#wrapper.toggled #page-content-wrapper { + position: absolute; + margin-right:-154px; +} + +.content { + padding-left: 20px; + padding-right: 20px; + border-radius: 0 0 6px 6px; +} + +#refresh-button { + margin-right: 15px; +} + +/* Sidebar Styles */ + +table.tablesorter { + text-align: left; + width: 100%; +} + +.tablesorter a:hover { + text-decoration: none; +} + +.courses-title { + padding-left: 0; +} + +.offcanvas-header { + max-height: 160px; + overflow-y: hidden; +} + +.tablesorter .active > a, +.tablesorter .active > a:hover, +.tablesorter .active > a:focus { + background: $main_offcanvas_link; +} +.tablesorter .active > a { + color: $main_offcanvas_link_color; +} +.tablesorter td.active { + border-right: 9px solid $brand-primary-bright; + background: $main_offcanvas_link; +} +.tablesorter a { + padding-left: 10px; +} + +.sidebar-nav { + position: absolute; + top: 0; + width:154px; + margin:0; + padding:0; + list-style: none; +} + +.sidebar-nav li { + text-indent: 20px; + line-height: 40px; +} + +.sidebar-nav li a { + display: block; + text-decoration: none; + color: #999999; +} + +.sidebar-nav li a:hover { + text-decoration: none; + color: $body-bg; + background: rgba(255,255,255,0.2); +} + +.li.active { + border-left: 4px solid $brand-primary; + background: #edbae9; +} + + +.sidebar-nav li a:active, +.sidebar-nav li a:focus { + text-decoration: none; +} + +.sidebar-nav > .sidebar-brand { + height: 65px; + font-size: 22px; + line-height: 60px; +} + +.sidebar-nav > .sidebar-brand a { + color: #999999; +} + +.sidebar-nav > .sidebar-brand a:hover { + color: $body-bg; + background: none; +} + +.top-nav div { + padding-top: 13px; +} + +@media(min-width:768px) { + #wrapper { + padding-left: 154px; + } + + #wrapper.toggled { + padding-left: 0; + } + + #sidebar-wrapper { + width: 154px; + } + + #wrapper.toggled #sidebar-wrapper { + width: 0; + } + + #page-content-wrapper { + padding: 20px; + position: relative; + } + + #wrapper.toggled #page-content-wrapper { + position: relative; + margin-right: 0; + } + + .top-nav div { + padding-top: 20px; + } + +} + +@media (max-width: 500px) { + + h1 { + font-size: 20px; + } + + * { + font-size: 12px; + } + + .no-gutter > [class*='col-'] { + padding-right:5px; + padding-left:5px; + padding-top:3px; + } + +} + +.fa bars { + background-color: $brand-primary; + border-color: $brand-primary; +} + +.btn-gate-open { + float: right; + padding:5px; +} + +.btn-success { + float: right; +} + +.btn-gate-open { + background-color:lightgreen; + float: right; + padding:5px; +} + + +.timeline { + list-style: none; + text-align: left; +} + +.timeline > li { + margin-left: -40px; + padding-top: 10px; + padding-bottom: 10px; + background: $body-bg; + position: relative; +} + +.timeline > li.active { + background: $brand-primary-light; +} + +.timeline > li.active > a { + color: $body-bg; +} + +.timeline > li a:hover { + text-decoration: none; + color: $body-bg; +} + +.timeline > li:hover { + color: $body-bg; + background: $brand-primary-light; +} + + i.fa.fa-sign-in{ + color:#2E6DA4; + font-size:1.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; +} + +i.fa.fa-check-square{ + float: right; + color:green; + font-size:2.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; +} + +i.fa.fa-minus-square{ + float: right; + color:red; + font-size:2.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; +} + +i.fa.fa-user{ + color:#F0AD4E; + font-size:1.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; + } + + i.fa.fa-users, i.fa.fa-comments { + color:#3F903F; + font-size:1.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; + } + + i.fa.fa-users-at-gate { + color:darkorange; + font-size:1.0em; + } + + i.fa.fa-question-circle { + color:#D9534F; + font-size:1.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; + } + + i.fa.fa-dashboard { + color:#D9534F; + font-size:1.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; + } + + i.fa.fa-cubes { + color:#D9534F; + font-size:1.2em; + margin-top:-8px; + padding: 3px 5px 3px 5px; + } + + +.lesson { + padding-top:10px; + padding-bottom:10px; + background-color:#F0F0F0; + font-size:0.6em; + font-weight: bold; +} + +.form-group { + padding:15px; +} + +.m-r { + font-size:0.7em; + margin-right: 15px; +} + +.panel-heading a:after { + font-family:'Glyphicons Halflings'; + content:"\e114"; + float: right; + color: grey; +} +.panel-heading a.collapsed:after { + content:"\e080"; +} + +.table > tbody > tr > td.success, +.table > tbody > tr > td.warning, +.table > tbody > tr > td.normal, +.table > tbody > tr > td.danger { + text-align: center; +} + +.float-left { + float: left; +} +.space-right { + margin-right: 10px; +} +div#sequenceCanvas { + text-align: center; + overflow: auto; + padding: 40px !important; +} +div#sequenceCanvas text { + font-size: 10px; +} +div#sequenceCanvas svg { + display: block; + overflow: hidden; +} + +.table > tbody > tr > td.danger { + background-color: $brand-danger; +} +.table > tbody > tr > td.success { + background-color: $brand-success; +} + +#closeBranchingButton { + font-weight: inherit !important; + margin-left: 7px; +} +#disable-sequence-button { + display: inline; +} +.voffset10 { + margin-top: 10px; +} + +.burning-question-description div, .burning-question-count { + display: inline; +} \ No newline at end of file Index: lams_monitoring/web/monitor.jsp =================================================================== diff -u -rfe122f9f7ac40f3a3696a7c69043fc34df7994d4 -rd7ed1173946998f754a2efef09d68c9e3bfe307f --- lams_monitoring/web/monitor.jsp (.../monitor.jsp) (revision fe122f9f7ac40f3a3696a7c69043fc34df7994d4) +++ lams_monitoring/web/monitor.jsp (.../monitor.jsp) (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -216,8 +216,8 @@ refreshMonitor(); $('#description').readmore({ - speed: 500, - collapsedHeight: 85 + speed: 500, + collapsedHeight: 85 }); @@ -226,30 +226,38 @@ }); function doSelectTab(tabId) { - if ( tourInProgress ) { - alert(LABELS.TOUR_DISABLED_ELEMENT); - return; - } - actualDoSelectTab(tabId); + if ( tourInProgress ) { + alert(LABELS.TOUR_DISABLED_ELEMENT); + return; + } + actualDoSelectTab(tabId); } function actualDoSelectTab(tabId) { - selectTab(tabId); + selectTab(tabId); var sequenceInfoDialog = $('#sequenceInfoDialog'); - if ( tabId == '2' ) { + if ( tabId == '2' ) { if (sequenceTabShowInfo) { sequenceInfoDialog.modal("show"); sequenceTabShowInfo = false; // only show it once } } else { sequenceInfoDialog.modal("hide"); } - if ( tabId == '4' ) { - updateGradebookTab(); - } + if ( tabId == '4' ) { + updateGradebookTab(); + } } - + function switchToTblMonitor() { + $("#content").load( + "", + { + lessonID: ${lesson.lessonID} + } + ); + } + <%@ include file="monitorTour.jsp" %> @@ -266,7 +274,14 @@ - + + + " + onclick="javascript:switchToTblMonitor();" id="tbl-monitor-control"> + + + + Index: lams_monitoring/web/tblmonitor/forum.jsp =================================================================== diff -u --- lams_monitoring/web/tblmonitor/forum.jsp (revision 0) +++ lams_monitoring/web/tblmonitor/forum.jsp (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,62 @@ +<%@ include file="/template/taglibs.jsp"%> +<%@ page import="org.lamsfoundation.lams.util.CentralConstants"%> + + + +
+
+

+ +

+
+
+ + + +
+
+
+
+

+ + : ${attemptedLearnersNumber}/ +

+
+
+
+
+ + + +
+
+ +

+ + +
+
+

+ +

+
+ +
+
+ + + +
+
+
+
+ +
+
+ + Index: lams_monitoring/web/tblmonitor/gates.jsp =================================================================== diff -u --- lams_monitoring/web/tblmonitor/gates.jsp (revision 0) +++ lams_monitoring/web/tblmonitor/gates.jsp (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,58 @@ +<%@ include file="/template/taglibs.jsp"%> + + +
+
+

+ +

+
+
+ + + +
+
+ + + +
+
+
+ +
+ + + + + + + + + +
+ + + + + ${permissionGate.waitingLearnersCount} + + +
+ + +
+
+ +
+
+ +
+ +
+
Index: lams_monitoring/web/tblmonitor/sequence.jsp =================================================================== diff -u --- lams_monitoring/web/tblmonitor/sequence.jsp (revision 0) +++ lams_monitoring/web/tblmonitor/sequence.jsp (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,353 @@ +<%@ include file="/template/taglibs.jsp"%> + + + + + + + + + + + + + + + + + + + + + + +
+
+

+ +

+
+
+ + + + + +
+
+ + + +
+
+
+ +
+
+
+ +
+ + +
+ +
+
+
+ + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+
+ + + + +
+
+ +
+
+ +
+ +
+ +
+
+
+ + + + + + +
+
Index: lams_monitoring/web/tblmonitor/tblmonitor.jsp =================================================================== diff -u --- lams_monitoring/web/tblmonitor/tblmonitor.jsp (revision 0) +++ lams_monitoring/web/tblmonitor/tblmonitor.jsp (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,289 @@ +<%@ include file="/template/taglibs.jsp"%> + + + + + <fmt:message key="label.tbl.monitor"/> + + + + + + + + + + + + +
+ + + + + + +
+ + +
+
+ + + +
+ +
+ + + +
+
+ + +
+ +
+
+ + +
+ + + +
Index: lams_monitoring/web/tblmonitor/teams.jsp =================================================================== diff -u --- lams_monitoring/web/tblmonitor/teams.jsp (revision 0) +++ lams_monitoring/web/tblmonitor/teams.jsp (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,425 @@ +<%@ include file="/template/taglibs.jsp"%> + + + + + + +
+
+

+ +

+
+
+ + + +
+
+ + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + ${userDto.firstName} ${userDto.lastName} + + + + + ${userDto.firstName} ${userDto.lastName} + + + + + + + ${userDto.iraScore} + + + + 0 + + + + + ${groupDto.traScore} + +
+
+ + +
+
+ + + + + + + +
+
+ + +
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + Index: lams_monitoring/web/template/taglibs.jsp =================================================================== diff -u --- lams_monitoring/web/template/taglibs.jsp (revision 0) +++ lams_monitoring/web/template/taglibs.jsp (revision d7ed1173946998f754a2efef09d68c9e3bfe307f) @@ -0,0 +1,14 @@ +<%@ page contentType="text/html; charset=utf-8" language="java"%> +<%@ taglib uri="tags-tiles" prefix="tiles" %> +<%@ taglib uri="tags-bean" prefix="bean" %> +<%@ taglib uri="tags-html" prefix="html" %> +<%@ taglib uri="tags-logic" prefix="logic" %> +<%@ taglib uri="tags-function" prefix="fn" %> +<%@ taglib uri="tags-core" prefix="c" %> +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-xml" prefix="x" %> +<%@ taglib uri="tags-lams" prefix="lams" %> + + + +