ca.travelagency.customer.CustomerPage.java Source code

Java tutorial

Introduction

Here is the source code for ca.travelagency.customer.CustomerPage.java

Source

/**
 *    Copyright (C) 2010 - 2014 VREM Software Development <VREMSoftwareDevelopment@gmail.com>
 *
 *    Licensed under the Apache 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://www.apache.org/licenses/LICENSE-2.0
 *
 *    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 ca.travelagency.customer;

import java.util.Arrays;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.validation.validator.EmailAddressValidator;

import ca.travelagency.BasePage;
import ca.travelagency.components.behaviors.AjaxOnBlurBehavior;
import ca.travelagency.components.decorators.FieldDecorator;
import ca.travelagency.components.fields.BirthDateField;
import ca.travelagency.components.fields.CityField;
import ca.travelagency.components.fields.CountryField;
import ca.travelagency.components.fields.DateField;
import ca.travelagency.components.fields.ProvinceField;
import ca.travelagency.components.fields.SalutationField;
import ca.travelagency.components.fields.StringFieldHelper;
import ca.travelagency.components.fields.SystemUserField;
import ca.travelagency.components.fields.TravelDocumentField;
import ca.travelagency.components.formheader.DaoEntityModelFactory;
import ca.travelagency.components.formheader.ResetPanel;
import ca.travelagency.components.formheader.SavePanel;
import ca.travelagency.components.validators.PhoneNumberValidator;
import ca.travelagency.config.ParameterRepository;
import ca.travelagency.identity.Role;
import ca.travelagency.invoice.InvoiceFilter;
import ca.travelagency.invoice.InvoicePage;
import ca.travelagency.invoice.InvoicesPanel;
import ca.travelagency.utils.StringUtils;

@AuthorizeInstantiation({ "AGENT" })
public class CustomerPage extends BasePage {
    private static final long serialVersionUID = 1L;

    static final String FORM = "form";
    static final String SAVE_BUTTON = "saveButton";
    static final String RESET_BUTTON = "resetButton";
    static final String CREATE_INVOICE_BUTTON = "createInvoiceButton";
    static final String FEEDBACK = "feedback";
    static final String INVOICES = "invoices";

    static final String PAGE_TITLE = "customer.title";

    @SpringBean
    private ParameterRepository parameterRepository;

    public CustomerPage() {
        this(null);
    }

    public CustomerPage(Customer customer) {
        final Form<Customer> form = new Form<Customer>(FORM, DaoEntityModelFactory.make(customer, Customer.class));
        form.setOutputMarkupId(true);
        add(form);

        initialize(form);

        form.add(new ComponentFeedbackPanel(FEEDBACK, form));

        form.add(new DropDownChoice<CustomerStatus>(Customer.Properties.status.name(),
                Arrays.asList(CustomerStatus.values())).setRequired(true)
                        .setLabel(new ResourceModel("customer.status")).setEnabled(hasRole(Role.ADMIN))
                        .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new SalutationField(Customer.Properties.salutation.name())
                .setLabel(new ResourceModel("customer.salutation")).add(StringFieldHelper.maxLenFieldValidator())
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        LastNameField lastNameField = new LastNameField(Customer.Properties.lastName.name());
        form.add(lastNameField.setLabel(new ResourceModel("customer.lastName")).setRequired(true)
                .add(StringFieldHelper.maxLenFieldValidator()).add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        FirstNameField firstNameField = new FirstNameField(Customer.Properties.firstName.name());
        form.add(firstNameField.setLabel(new ResourceModel("customer.firstName")).setRequired(true)
                .add(StringFieldHelper.maxLenFieldValidator()).add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new CompanyNameField(Customer.Properties.companyName.name())
                .setLabel(new ResourceModel("customer.companyName")).add(StringFieldHelper.maxLenFieldValidator())
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new TextField<String>(Customer.Properties.address.name())
                .setLabel(new ResourceModel("customer.address")).add(StringFieldHelper.maxLenFieldValidator())
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new CityField(Customer.Properties.city.name()).setLabel(new ResourceModel("customer.city"))
                .add(StringFieldHelper.maxLenFieldValidator()).add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new ProvinceField(Customer.Properties.province.name())
                .setLabel(new ResourceModel("customer.province")).add(StringFieldHelper.maxLenFieldValidator())
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new TextField<String>(Customer.Properties.postalCode.name())
                .setLabel(new ResourceModel("customer.postalCode")).add(StringFieldHelper.maxLenFieldValidator())
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new CountryField(Customer.Properties.country.name())
                .setLabel(new ResourceModel("customer.country")).add(StringFieldHelper.maxLenFieldValidator())
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new TextField<String>(Customer.Properties.email.name())
                .setLabel(new ResourceModel("customer.email")).add(StringFieldHelper.maxLenFieldValidator())
                .add(EmailAddressValidator.getInstance()).add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        RequiredTextField<String> primaryPhoneNumber = new RequiredTextField<String>(
                Customer.Properties.primaryPhone.name());
        form.add(primaryPhoneNumber.setLabel(new ResourceModel("customer.primaryPhone"))
                .add(StringFieldHelper.maxLenFieldValidator())
                .add(new PhoneNumberValidator(), new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new TextField<String>(Customer.Properties.secondaryPhone.name())
                .setLabel(new ResourceModel("customer.secondaryPhone"))
                .add(StringFieldHelper.maxLenFieldValidator())
                .add(new PhoneNumberValidator(), new FieldDecorator(), new AjaxOnBlurBehavior()));
        DateField dateOfBirthField = new BirthDateField(Customer.Properties.dateOfBirth.name());
        form.add(dateOfBirthField.setLabel(new ResourceModel("customer.dateOfBirth")).add(new FieldDecorator(),
                new AjaxOnBlurBehavior()));
        form.add(new TextArea<String>(Customer.Properties.notes.name())
                .setLabel(new ResourceModel("customer.notes")).add(StringFieldHelper.maxLenAreaValidator())
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new SystemUserField(Customer.Properties.systemUser.name())
                .setLabel(new ResourceModel("customer.agent")).setVisible(hasRole(Role.ADMIN))
                .add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new TravelDocumentField(Customer.Properties.travelDocumentType.name())
                .setLabel(new ResourceModel("customer.travelDocumentType"))
                .add(StringFieldHelper.maxLenFieldValidator()).add(new FieldDecorator(), new AjaxOnBlurBehavior()));
        form.add(new TextField<String>(Customer.Properties.travelDocumentNumber.name())
                .setLabel(new ResourceModel("customer.travelDocumentNumber"))
                .add(StringFieldHelper.maxLenFieldValidator()).add(new FieldDecorator(), new AjaxOnBlurBehavior()));

        form.add(new CustomerDuplicateValidator(lastNameField, firstNameField, primaryPhoneNumber,
                dateOfBirthField));

        form.add(new SavePanel<Customer>(SAVE_BUTTON, form) {
            private static final long serialVersionUID = 1L;

            @Override
            public void preSubmit(AjaxRequestTarget target, Customer daoEntity, boolean newDaoEntity) {
                if (newDaoEntity && !hasRole(Role.ADMIN)) {
                    daoEntity.setSystemUser(getSignedInSystemUser());
                }
            }

            @Override
            public void postSubmit(AjaxRequestTarget target, Customer daoEntity, boolean newDaoEntity) {
                if (newDaoEntity || hasRole(Role.ADMIN)) {
                    setResponsePage(new CustomerPage(daoEntity));
                }
            }
        });

        form.add(new ResetPanel<Customer>(RESET_BUTTON, form));

        form.add(new Link<String>(CREATE_INVOICE_BUTTON) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick() {
                setResponsePage(new InvoicePage(form.getModelObject()));
            }
        }.setVisible(form.getModelObject().isActive() && isVisible(form.getModelObject())));

        add(createInvoicePanel(form));
    }

    private InvoicesPanel createInvoicePanel(Form<Customer> form) {
        InvoiceFilter invoiceFilter = new InvoiceFilter().setCustomer(form.getModelObject());
        if (!hasRole(Role.ADMIN)) {
            invoiceFilter.setSystemUser(getSignedInSystemUser());
        }
        InvoicesPanel invoicesPanel = new InvoicesPanel(INVOICES, Model.of(invoiceFilter));
        invoicesPanel.setVisible(isVisible(form.getModelObject()));
        return invoicesPanel;
    }

    private boolean isVisible(Customer customer) {
        return DaoEntityModelFactory.isPersisted(customer);
    }

    @Override
    public String getPageTitleKey() {
        return PAGE_TITLE;
    }

    private void initialize(Form<Customer> customerForm) {
        Customer customer = customerForm.getModelObject();
        if (StringUtils.isBlank(customer.getTravelDocumentType())) {
            customer.setTravelDocumentType(parameterRepository.getDefaultTravelDocumentType());
        }
    }
}