org.sakaiproject.attendance.tool.pages.StudentOverview.java Source code

Java tutorial

Introduction

Here is the source code for org.sakaiproject.attendance.tool.pages.StudentOverview.java

Source

/*
 *  Copyright (c) 2017, University of Dayton
 *
 *  Licensed under the Educational Community License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *              http://opensource.org/licenses/ecl2
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.sakaiproject.attendance.tool.pages;

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.sakaiproject.attendance.model.AttendanceGrade;
import org.sakaiproject.attendance.model.AttendanceStatus;
import org.sakaiproject.attendance.model.AttendanceUserStats;
import org.sakaiproject.attendance.model.Status;
import org.sakaiproject.attendance.tool.dataproviders.AttendanceStatusProvider;
import org.sakaiproject.attendance.tool.panels.AttendanceGradePanel;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

/**
 * StudentOverview is an overview of all the students and their statistics in the AttendanceSite
 *
 * @author Leonardo Canessa [lcanessa1 (at) udayton (dot) edu]
 * @author David Bauer [dbauer1 (at) udayton (dot) edu]
 */
public class StudentOverview extends BasePage {
    private static final long serialVersionUID = 1L;

    private AttendanceStatusProvider attendanceStatusProvider;

    private DropDownChoice<String> groupChoice;
    private String selectedGroup;

    public StudentOverview() {
        disableLink(this.studentOverviewLink);

        if (this.role != null && this.role.equals("Student")) {
            throw new RestartResponseException(StudentView.class);
        }

        this.attendanceStatusProvider = new AttendanceStatusProvider(attendanceLogic.getCurrentAttendanceSite(),
                AttendanceStatusProvider.ACTIVE);

        add(createHeader());
        add(createStatsTable());
    }

    public StudentOverview(String selectedGroup) {
        disableLink(this.studentOverviewLink);

        if (this.role != null && this.role.equals("Student")) {
            throw new RestartResponseException(StudentView.class);
        }

        this.selectedGroup = selectedGroup;

        this.attendanceStatusProvider = new AttendanceStatusProvider(attendanceLogic.getCurrentAttendanceSite(),
                AttendanceStatusProvider.ACTIVE);

        add(createHeader());
        add(createStatsTable());
    }

    private WebMarkupContainer createHeader() {
        WebMarkupContainer contain = new WebMarkupContainer("student-overview-header");
        Label title = new Label("student-overview-title", new ResourceModel("attendance.student.overview.title"));
        Label subtitle = new Label("student-overview-subtitle",
                new ResourceModel("attendance.student.overview.subtitle"));

        contain.add(title);
        contain.add(subtitle);

        return contain;
    }

    private WebMarkupContainer createStatsTable() {
        WebMarkupContainer statsTable = new WebMarkupContainer("student-overview-stats-table");

        createStatsTableHeader(statsTable);
        createStatsTableData(statsTable);

        return statsTable;
    }

    private void createStatsTableHeader(WebMarkupContainer t) {
        //headers for the table
        Label studentName = new Label("header-student-name", new ResourceModel("attendance.header.student"));
        Label grade = new Label("header-grade", new ResourceModel("attendance.header.grade"));
        Label totalPoints = new Label("total-points",
                "Total: " + attendanceLogic.getCurrentAttendanceSite().getMaximumGrade());

        DataView<AttendanceStatus> statusHeaders = new DataView<AttendanceStatus>("status-headers",
                attendanceStatusProvider) {
            @Override
            protected void populateItem(Item<AttendanceStatus> item) {
                item.add(new Label("header-status-name", getStatusString(item.getModelObject().getStatus())));
            }
        };

        Link<Void> settings = new Link<Void>("settings-link") {
            private static final long serialVersionUID = 1L;

            public void onClick() {
                setResponsePage(new GradingPage());
            }
        };

        t.add(studentName);
        t.add(grade);
        t.add(totalPoints);
        t.add(statusHeaders);
        t.add(settings);
    }

    private void createStatsTableData(WebMarkupContainer t) {
        final Map<String, AttendanceGrade> gradeMap = attendanceLogic.getAttendanceGrades();

        // Add form to filter table
        final Form<?> filterForm = new Form<Void>("filter-table-form") {
            @Override
            protected void onSubmit() {
                setResponsePage(new StudentOverview(groupChoice.getModelObject()));
            }
        };

        add(filterForm);

        List<String> groupIds = sakaiProxy.getAvailableGroupsForCurrentSite();
        Collections.sort(groupIds, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return sakaiProxy.getGroupTitleForCurrentSite(o1)
                        .compareTo(sakaiProxy.getGroupTitleForCurrentSite(o2));
            }
        });
        groupChoice = new DropDownChoice<String>("group-choice", new PropertyModel<String>(this, "selectedGroup"),
                groupIds, new IChoiceRenderer<String>() {
                    @Override
                    public Object getDisplayValue(String s) {
                        return sakaiProxy.getGroupTitleForCurrentSite(s);
                    }

                    @Override
                    public String getIdValue(String s, int i) {
                        return s;
                    }
                });
        groupChoice.setNullValid(true);

        groupChoice.add(new AjaxFormSubmitBehavior("onchange") {
            @Override
            protected void onSubmit(AjaxRequestTarget target) {
                super.onSubmit(target);
            }
        });
        filterForm.add(groupChoice);
        filterForm.add(new Label("group-choice-label", new ResourceModel("attendance.event.view.filter")));

        List<AttendanceUserStats> userStatsList = attendanceLogic.getUserStatsForCurrentSite(selectedGroup);
        final ListView<AttendanceUserStats> uListView = new ListView<AttendanceUserStats>("students",
                userStatsList) {
            @Override
            protected void populateItem(ListItem<AttendanceUserStats> item) {
                final String id = item.getModelObject().getUserID();
                Link<Void> studentLink = new Link<Void>("student-link") {
                    public void onClick() {
                        setResponsePage(new StudentView(id, BasePage.STUDENT_OVERVIEW_PAGE));
                    }
                };
                studentLink.add(new Label("student-name",
                        sakaiProxy.getUserSortName(id) + " (" + sakaiProxy.getUserDisplayId(id) + ")"));
                item.add(studentLink);

                DataView<AttendanceStatus> activeStatusStats = new DataView<AttendanceStatus>("active-status-stats",
                        attendanceStatusProvider) {
                    @Override
                    protected void populateItem(Item<AttendanceStatus> statusItem) {
                        Status itemStatus = statusItem.getModelObject().getStatus();
                        int stat = attendanceLogic.getStatsForStatus(item.getModelObject(), itemStatus);
                        statusItem.add(new Label("student-stats", stat));
                    }
                };
                item.add(activeStatusStats);
                item.add(new AttendanceGradePanel("attendance-grade", gradeMap.get(id), feedbackPanel));
            }
        };

        Label noStudents = new Label("no-students", new ResourceModel("attendance.student.overview.no.students")) {
            @Override
            public boolean isVisible() {
                return uListView.size() <= 0;
            }
        };
        Label noStudents2 = new Label("no-students2",
                new ResourceModel("attendance.student.overview.no.students.2")) {
            @Override
            public boolean isVisible() {
                return uListView.size() <= 0;
            }
        };

        t.add(uListView);
        t.add(noStudents);
        t.add(noStudents2);
    }
}