org.devgateway.eudevfin.projects.module.modals.ReportsTableModal.java Source code

Java tutorial

Introduction

Here is the source code for org.devgateway.eudevfin.projects.module.modals.ReportsTableModal.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.devgateway.eudevfin.projects.module.modals;

import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.devgateway.eudevfin.financial.FileWrapper;
import org.devgateway.eudevfin.projects.common.entities.ProjectReport;
import static org.devgateway.eudevfin.projects.module.modals.ResultsTableModal.PARAM_NEW_VALUE;
import org.devgateway.eudevfin.projects.module.pages.ModalHeaderFooter;
import org.devgateway.eudevfin.projects.module.pages.NewProjectPage;
import org.devgateway.eudevfin.projects.module.providers.ReportTypeProvider;
import org.devgateway.eudevfin.projects.module.validator.WordsValidator;
import org.devgateway.eudevfin.projects.service.ProjectReportService;
import org.devgateway.eudevfin.projects.service.ProjectService;
import org.devgateway.eudevfin.ui.common.RWComponentPropertyModel;
import org.devgateway.eudevfin.ui.common.components.BootstrapCancelButton;
import org.devgateway.eudevfin.ui.common.components.BootstrapSubmitButton;
import org.devgateway.eudevfin.ui.common.components.CheckBoxField;
import org.devgateway.eudevfin.ui.common.components.DateInputField;
import org.devgateway.eudevfin.ui.common.components.DropDownField;
import org.devgateway.eudevfin.ui.common.components.MultiFileUploadField;
import org.devgateway.eudevfin.ui.common.components.TextInputField;
import org.devgateway.eudevfin.ui.common.models.DateToLocalDateTimeModel;
import org.joda.time.LocalDateTime;

/**
 *
 * @author alcr
 */
public class ReportsTableModal extends ModalHeaderFooter {

    public static final String PARAM_REPORT_ID = "reportId";
    public static final String PARAM_REPORT_ID_VALUE_NEW = "new";
    public static final String PARAM_PROJECT_ID = "projectId";

    @SpringBean
    private ProjectReportService projectReportService;

    @SpringBean
    private ProjectService projectService;

    public ReportsTableModal(final PageParameters parameters) {
        if (parameters == null) {
            return;
        }
        AddComponents(parameters, null, null);
    }

    public ReportsTableModal(final PageParameters parameters, final PageReference modalWindowPage,
            final ModalWindow window) {
        AddComponents(parameters, modalWindowPage, window);
    }

    public final void AddComponents(final PageParameters parameters, final PageReference modalWindowPage,
            final ModalWindow window) {
        final ProjectReport report = getEditableReport(parameters);
        CompoundPropertyModel<ProjectReport> model = new CompoundPropertyModel<>(report);
        setModel(model);

        Form<ProjectReport> form = new Form<>("form");

        ReportTypeProvider typeProvider = new ReportTypeProvider(this);
        DropDownField<String> reportType = new DropDownField<>("1reportType",
                new RWComponentPropertyModel<String>("type"), typeProvider);
        reportType.required();
        reportType.setVisible(true);

        TextInputField<String> reportTitle = new TextInputField<>("2reportTitle",
                new RWComponentPropertyModel<String>("reportTitle")).typeString();
        reportTitle.getField().add(new WordsValidator(30));

        DateInputField reportingPeriodStart = new DateInputField("3reportingPeriodStart",
                new DateToLocalDateTimeModel(new RWComponentPropertyModel<LocalDateTime>("reportingPeriodStart")));
        reportingPeriodStart.required();

        DateInputField reportingPeriodEnd = new DateInputField("3reportingPeriodEnd",
                new DateToLocalDateTimeModel(new RWComponentPropertyModel<LocalDateTime>("reportingPeriodEnd")));
        reportingPeriodEnd.required();

        DateInputField reportDate = new DateInputField("4reportDate",
                new DateToLocalDateTimeModel(new RWComponentPropertyModel<LocalDateTime>("reportDate")));
        reportDate.required();

        CheckBoxField fileProvided = new CheckBoxField("5fileProvided",
                new RWComponentPropertyModel<Boolean>("fileProvided"));

        MultiFileUploadField reportFiles = new MultiFileUploadField("6reportFiles",
                new RWComponentPropertyModel<Collection<FileWrapper>>("reportFiles"));
        reportFiles.maxFiles(10);
        add(reportFiles);

        form.add(reportType);
        form.add(reportTitle);
        form.add(reportingPeriodStart);
        form.add(reportingPeriodEnd);
        form.add(reportDate);
        form.add(fileProvided);
        form.add(reportFiles);

        form.add(new BootstrapSubmitButton("submit", new StringResourceModel("button.submit", this, null, null)) {

            private static final long serialVersionUID = -7833958712063599191L;

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                super.onError(target, form);
            }

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                replaceReport(report);
                if (window != null) {
                    window.close(target);
                }
            }

        });

        BootstrapCancelButton cancelButton = new BootstrapCancelButton("cancel",
                new StringResourceModel("button.cancel", this, null)) {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                if (window != null) {
                    window.close(target);
                }
            }

        };
        cancelButton.setDefaultFormProcessing(false);
        form.add(cancelButton);

        add(form);
    }

    public ProjectReport getEditableReport(PageParameters parameters) {
        Long resultId = null;

        if (parameters.get(PARAM_PROJECT_ID).isNull() && parameters.get(PARAM_REPORT_ID).isNull()) {
            parameters.add(PARAM_REPORT_ID, PARAM_NEW_VALUE);
        }

        if (!parameters.get(PARAM_REPORT_ID).isNull()) {
            ProjectReport result = null;
            if (PARAM_REPORT_ID_VALUE_NEW.equals(parameters.get(PARAM_REPORT_ID).toString())) {
                result = new ProjectReport();
            } else {
                resultId = parameters.get(PARAM_REPORT_ID).toLong();
                result = findOne(resultId);
            }
            return result;
        } else {
            return new ProjectReport();
        }
    }

    private void replaceReport(ProjectReport report) {
        if (NewProjectPage.project == null) {
            return;
        }

        Set<ProjectReport> reports = NewProjectPage.project.getProjectReports();

        if (report.getId() != null) {
            Iterator iterator = reports.iterator();
            while (iterator.hasNext()) {
                ProjectReport temp = (ProjectReport) iterator.next();
                if (temp.getId().equals(report.getId())) {
                    iterator.remove();
                }
            }
        } else {
            report.setId(generateId(NewProjectPage.project.getProjectReports()));
        }

        NewProjectPage.project.addReport(report);
    }

    private ProjectReport findOne(Long resultId) {
        Set<ProjectReport> results = NewProjectPage.project.getProjectReports();
        for (ProjectReport temp : results) {
            if (resultId.equals(temp.getId())) {
                return temp;
            }
        }
        return null;
    }

    private long generateId(Set<ProjectReport> reports) {
        if (reports.isEmpty())
            return 1;

        long id = Long.MIN_VALUE;
        for (ProjectReport result : reports) {
            if (result.getId() != null && result.getId() > id) {
                id = result.getId();
            }
        }

        return ++id;
    }
}