org.sakaiproject.attendance.tool.panels.AttendanceRecordFormDataPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.sakaiproject.attendance.tool.panels.AttendanceRecordFormDataPanel.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.panels;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.*;
import org.sakaiproject.attendance.model.AttendanceRecord;
import org.sakaiproject.attendance.model.AttendanceStatus;
import org.sakaiproject.attendance.model.Status;
import org.sakaiproject.attendance.tool.dataproviders.AttendanceStatusProvider;
import org.sakaiproject.component.cover.ServerConfigurationService;

import java.util.ArrayList;
import java.util.List;

/**
 * AttendanceRecordFormDataPanel is a panel used to display the data contained within an AttendanceRecord
 *
 * @author Leonardo Canessa [lcanessa1 (at) udayton (dot) edu]
 * @author David Bauer [dbauer1 (at) udayton (dot) edu]
 */
public class AttendanceRecordFormDataPanel extends BasePanel {
    private static final long serialVersionUID = 1L;
    private IModel<AttendanceRecord> recordIModel;
    private boolean restricted;
    private boolean showCommentsToStudents;
    private List<Component> ajaxTargets = new ArrayList<Component>();
    private String returnPage;
    private Status oldStatus;

    private WebMarkupContainer commentContainer;
    private WebMarkupContainer noComment;
    private WebMarkupContainer yesComment;

    public AttendanceRecordFormDataPanel(String id, IModel<AttendanceRecord> aR, String rP, FeedbackPanel fP) {
        super(id, aR);
        this.recordIModel = aR;
        this.oldStatus = aR.getObject().getStatus();
        this.showCommentsToStudents = recordIModel.getObject().getAttendanceEvent().getAttendanceSite()
                .getShowCommentsToStudents();
        this.restricted = this.role != null && this.role.equals("Student");
        this.returnPage = rP;
        enable(fP);
        this.ajaxTargets.add(this.pageFeedbackPanel);

        add(createRecordInputForm());
    }

    private Form<AttendanceRecord> createRecordInputForm() {
        Form<AttendanceRecord> recordForm = new Form<AttendanceRecord>("attendanceRecord", this.recordIModel) {
            protected void onSubmit() {
                AttendanceRecord aR = (AttendanceRecord) getDefaultModelObject();
                if (aR.getStatus() == null) {
                    aR.setStatus(Status.UNKNOWN);
                }
                boolean result = attendanceLogic.updateAttendanceRecord(aR, oldStatus);
                String[] resultMsgVars = new String[] { sakaiProxy.getUserSortName(aR.getUserID()),
                        aR.getAttendanceEvent().getName(), getStatusString(aR.getStatus()) };
                StringResourceModel temp;
                if (result) {
                    temp = new StringResourceModel("attendance.record.save.success", null, resultMsgVars);
                    getSession().info(temp.getString());
                    oldStatus = aR.getStatus();
                } else {
                    temp = new StringResourceModel("attendance.record.save.failure", null, resultMsgVars);
                    getSession().error(temp.getString());
                }
            }

            @Override
            public boolean isEnabled() {
                return !recordIModel.getObject().getAttendanceEvent().getAttendanceSite().getIsSyncing();
            }
        };

        createStatusRadio(recordForm);
        createCommentBox(recordForm);

        boolean noRecordBool = recordForm.getModelObject().getStatus().equals(Status.UNKNOWN) && restricted;
        recordForm.setVisibilityAllowed(!noRecordBool);

        WebMarkupContainer noRecordContainer = new WebMarkupContainer("no-record");
        noRecordContainer.setVisibilityAllowed(noRecordBool);
        add(noRecordContainer);

        return recordForm;
    }

    private void createStatusRadio(final Form<AttendanceRecord> rF) {
        AttendanceStatusProvider attendanceStatusProvider = new AttendanceStatusProvider(
                attendanceLogic.getCurrentAttendanceSite(), AttendanceStatusProvider.ACTIVE);
        DataView<AttendanceStatus> attendanceStatusRadios = new DataView<AttendanceStatus>("status-radios",
                attendanceStatusProvider) {
            @Override
            protected void populateItem(Item<AttendanceStatus> item) {
                final Status itemStatus = item.getModelObject().getStatus();
                Radio statusRadio = new Radio<Status>("record-status", new Model<Status>(itemStatus));
                item.add(statusRadio);
                statusRadio.add(new AjaxFormSubmitBehavior(rF, "onclick") {
                    protected void onSubmit(AjaxRequestTarget target) {
                        target.appendJavaScript(
                                "attendance.recordFormRowSetup(" + this.getAttributes().getFormId() + ");");
                        for (Component c : ajaxTargets) {
                            target.add(c);
                        }
                    }
                });
                ajaxTargets.add(statusRadio);
                statusRadio.setLabel(Model.of(getStatusString(itemStatus)));
                item.add(new SimpleFormComponentLabel("record-status-name", statusRadio));
                item.add(new Label("record-status-name-raw", itemStatus.toString()));
            }
        };

        RadioGroup group = new RadioGroup<Status>("attendance-record-status-group",
                new PropertyModel<Status>(this.recordIModel, "status"));
        group.setOutputMarkupPlaceholderTag(true);
        group.setRenderBodyOnly(false);
        group.add(attendanceStatusRadios);
        group.setEnabled(!this.restricted);

        rF.add(group);
    }

    private void createCommentBox(final Form<AttendanceRecord> rF) {

        commentContainer = new WebMarkupContainer("comment-container");
        commentContainer.setOutputMarkupId(true);

        noComment = new WebMarkupContainer("no-comment");
        noComment.setOutputMarkupId(true);

        yesComment = new WebMarkupContainer("yes-comment");
        yesComment.setOutputMarkupId(true);

        if (recordIModel.getObject().getComment() != null && !recordIModel.getObject().getComment().equals("")) {
            noComment.setVisible(false);
        } else {
            yesComment.setVisible(false);
        }

        commentContainer.add(noComment);
        commentContainer.add(yesComment);

        final TextArea<String> commentBox = new TextArea<String>("comment",
                new PropertyModel<String>(this.recordIModel, "comment"));

        final AjaxSubmitLink saveComment = new AjaxSubmitLink("save-comment") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                super.onSubmit(target, form);
                if (recordIModel.getObject().getComment() != null
                        && !recordIModel.getObject().getComment().equals("")) {
                    noComment.setVisible(false);
                    yesComment.setVisible(true);
                } else {
                    noComment.setVisible(true);
                    yesComment.setVisible(false);
                }
                commentContainer.addOrReplace(noComment);
                commentContainer.addOrReplace(yesComment);
                for (Component c : ajaxTargets) {
                    target.add(c);
                }
            }
        };

        commentContainer.add(saveComment);
        commentContainer.add(commentBox);

        ajaxTargets.add(commentContainer);

        if (restricted) {
            commentContainer.setVisible(showCommentsToStudents);
            saveComment.setVisible(!showCommentsToStudents);
            commentBox.setEnabled(!showCommentsToStudents);
            noComment.setVisible(!showCommentsToStudents);
            commentContainer.add(new Label("add-header", new ResourceModel("attendance.record.form.view.comment")));
        } else {
            commentContainer.add(new Label("add-header", new ResourceModel("attendance.record.form.add.comment")));
        }

        rF.add(commentContainer);
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        final String version = ServerConfigurationService.getString("portal.cdn.version", "");
        response.render(JavaScriptHeaderItem
                .forUrl(String.format("javascript/attendanceRecordForm.js?version=%s", version)));
        response.render(OnDomReadyHeaderItem.forScript("attendance.recordFormSetup();"));
    }
}