eu.uqasar.web.pages.admin.companies.CompanyListPage.java Source code

Java tutorial

Introduction

Here is the source code for eu.uqasar.web.pages.admin.companies.CompanyListPage.java

Source

/*
 */
package eu.uqasar.web.pages.admin.companies;

/*
 * #%L
 * U-QASAR
 * %%
 * Copyright (C) 2012 - 2015 U-QASAR Consortium
 * %%
 * 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.
 * #L%
 */

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

import javax.inject.Inject;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Check;
import org.apache.wicket.markup.html.form.CheckGroup;
import org.apache.wicket.markup.html.form.CheckGroupSelector;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.CssClassNameAppender;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
import de.agilecoders.wicket.core.markup.html.bootstrap.navigation.ajax.BootstrapAjaxPagingNavigator;
import eu.uqasar.model.company.Company;
import eu.uqasar.model.user.Team;
import eu.uqasar.model.user.TeamMembership;
import eu.uqasar.model.user.User;
import eu.uqasar.service.company.CompanyService;
import eu.uqasar.service.user.TeamMembershipService;
import eu.uqasar.service.user.TeamService;
import eu.uqasar.service.user.UserService;
import eu.uqasar.web.UQSession;
import eu.uqasar.web.components.ModalActionButton;
import eu.uqasar.web.components.NotificationModal;
import eu.uqasar.web.pages.admin.AdminBasePage;
import eu.uqasar.web.pages.admin.companies.panels.CompanyFilterPanel;
import eu.uqasar.web.pages.admin.companies.panels.CompanyFilterStructure;
import eu.uqasar.web.provider.EntityProvider;

/**
 *
 *
 */
public class CompanyListPage extends AdminBasePage {

    @Inject
    private CompanyService companyService;
    @Inject
    private UserService userservice;
    @Inject
    private TeamService teamService;
    @Inject
    private TeamMembershipService teamMembershipService;

    private final CheckGroup<Company> companyGroup;
    private final AjaxSubmitLink deleteSelectedButton;
    private final BootstrapAjaxPagingNavigator navigator;
    private final Modal deleteConfirmationModal;
    private final WebMarkupContainer companyContainer;
    private CompanyProvider companyProvider;

    // how many items do we show per page
    private static final int itemsPerPage = 10;

    public CompanyListPage(final PageParameters pageParameters) {
        super(pageParameters);

        Form<Void> form = new Form("form");
        companyContainer = new WebMarkupContainer("companyContainer");

        CompanyFilterPanel filterPanel = new CompanyFilterPanel("filter") {

            @Override
            public void applyClicked(AjaxRequestTarget target, Form<?> form) {
                if (getFilter().getName() == null && getFilter().getShortName() == null
                        && getFilter().getCountry() == null) {
                    companyProvider.setFilter(null);
                } else {
                    companyProvider.setFilter(this.getFilter());
                }
                target.add(companyContainer);
            }

            @Override
            public void resetClicked(AjaxRequestTarget target, Form<?> form) {
                companyProvider.setFilter(null);
                target.add(companyContainer);
            }

        };
        add(filterPanel);
        if (filterPanel.getFilter().getName() == null && filterPanel.getFilter().getShortName() == null
                && filterPanel.getFilter().getCountry() == null) {
            companyProvider = new CompanyProvider();
        } else {
            companyProvider = new CompanyProvider(filterPanel.getFilter());
        }
        form.add(companyGroup = newCheckGroup());
        companyGroup.add(companyContainer.setOutputMarkupId(true));
        CheckGroupSelector checkGroupSelector = new CheckGroupSelector("companyGroupSelector", companyGroup);
        companyContainer.add(checkGroupSelector);
        companyContainer.add(deleteSelectedButton = newDeleteSelectedButton(companyGroup));

        DataView<Company> companiesView = new DataView<Company>("companies", companyProvider, itemsPerPage) {
            @Override
            protected void populateItem(Item<Company> item) {
                final Company company = item.getModelObject();

                Check<Company> check = newDeleteCheck(item);
                item.add(check);

                Link companyEditNameLink = new BookmarkablePageLink("link.name.edit.company", CompanyEditPage.class,
                        new PageParameters().add("id", company.getId()));
                item.add(companyEditNameLink.add(new Label("td.name", new PropertyModel<>(company, "name"))));

                item.add(new Label("td.shortName", new PropertyModel<>(company, "shortName")));

                item.add(new Label("td.street", new PropertyModel<>(company, "street")));
                item.add(new Label("td.zipcode", new PropertyModel<>(company, "zipcode")));
                item.add(new Label("td.city", new PropertyModel<>(company, "city")));
                item.add(new Label("td.country", new PropertyModel<>(company, "country")));

                item.add(new Label("td.phone", new PropertyModel<>(company, "phone")));
                item.add(new Label("td.fax", new PropertyModel<>(company, "fax")));

                Link companyEditLink = new BookmarkablePageLink("link.actions.edit.company", CompanyEditPage.class,
                        new PageParameters().add("id", company.getId()));
                item.add(companyEditLink);

                item.setOutputMarkupId(true);
            }
        };

        // add links for table pagination
        companyContainer.add(navigator = new BootstrapAjaxPagingNavigator("navigatorFoot", companiesView));
        companyContainer.add(companiesView);

        BookmarkablePageLink<CompanyEditPage> createUser = new BookmarkablePageLink<>("link.create.company",
                CompanyEditPage.class);
        companyContainer.add(createUser);
        add(form);

        // add confirmation modal for deleting products
        add(deleteConfirmationModal = newDeleteConfirmationModal());
    }

    private void deleteSelectedCompanies(Collection<Company> companies, AjaxRequestTarget target) {
        String message = new StringResourceModel("delete.confirmed", this, null).getString();
        for (Company company : companies) {
            List<User> users = userservice.getByCompany(company);
            for (User user : users) {
                Collection<TeamMembership> members = teamMembershipService.getForUser(user);
                if (!members.isEmpty()) {
                    for (TeamMembership membership : members) {
                        Team team = membership.getTeam();
                        team.getMembers().remove(membership);
                        teamMembershipService.delete(membership);
                        teamService.update(team);
                    }
                }
            }
            userservice.delete(users);
        }
        companyService.delete(companies);
        getPage().success(message);
        target.add(feedbackPanel);
        target.add(companyContainer);
        companyGroup.updateModel();
        target.add(deleteSelectedButton);
        setResponsePage(CompanyListPage.class);
    }

    private NotificationModal newDeleteConfirmationModal() {
        final NotificationModal notificationModal = new NotificationModal("deleteConfirmationModal",
                new StringResourceModel("delete.confirmation.modal.header", this, null),
                new StringResourceModel("delete.confirmation.modal.message", this, null), false);
        notificationModal.addButton(new ModalActionButton(notificationModal, Buttons.Type.Primary,
                new StringResourceModel("delete.confirmation.modal.submit.text", this, null), true) {

            @Override
            protected void onAfterClick(AjaxRequestTarget target) {
                // confirmed --> delete
                deleteSelectedCompanies(companyGroup.getModelObject(), target);
                // close modal
                closeDeleteConfirmationModal(notificationModal, target);
            }
        });
        notificationModal.addButton(new ModalActionButton(notificationModal, Buttons.Type.Default,
                new StringResourceModel("delete.confirmation.modal.cancel.text", this, null), true) {
            @Override
            protected void onAfterClick(AjaxRequestTarget target) {
                // Cancel clicked --> do nothing, close modal
                closeDeleteConfirmationModal(notificationModal, target);
            }
        });
        return notificationModal;
    }

    private void closeDeleteConfirmationModal(final Modal modal, AjaxRequestTarget target) {
        modal.appendCloseDialogJavaScript(target);
    }

    public static PageParameters forCompany(Company company) {
        if (company.getName() == null) {
            return new PageParameters();
        } else if (company != null) {
            return forCompany(company.getName());
        } else {
            return new PageParameters();
        }
    }

    private static PageParameters forCompany(final String name) {
        return new PageParameters().add("name", name);
    }

    @Override
    protected void onConfigure() {
        super.onConfigure();
        navigator.setVisible(companyProvider.size() > itemsPerPage);
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        response.render(CssHeaderItem.forUrl("assets/css/admin/user.css"));
    }

    private AjaxSubmitLink newDeleteSelectedButton(final CheckGroup<Company> companyGroup) {
        AjaxSubmitLink submitLink = new AjaxSubmitLink("deleteSelected") {

            @Override
            protected void onConfigure() {
                super.onConfigure();
                // only enabled if at least one user is selected
                if (companyGroup.getModelObject().isEmpty()) {
                    add(new CssClassNameAppender(Model.of("disabled")) {
                        private static final long serialVersionUID = 5588027455196328830L;

                        // remove css class when component is rendered again
                        @Override
                        public boolean isTemporary(Component component) {
                            return true;
                        }
                    });
                    setEnabled(false);
                } else {
                    setEnabled(true);
                }
            }

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                deleteConfirmationModal.appendShowDialogJavaScript(target);
            }
        };
        submitLink.setOutputMarkupId(true);
        return submitLink;
    }

    private CheckGroup newCheckGroup() {
        CheckGroup<User> checkGroup = new CheckGroup<>("companyGroup", new ArrayList<User>());
        checkGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                target.add(deleteSelectedButton);
            }
        });
        return checkGroup;
    }

    private Check<Company> newDeleteCheck(final Item<Company> item) {
        return new Check<Company>("companyCheck", item.getModel(), companyGroup) {

            @Override
            protected void onConfigure() {
                super.onConfigure();
                setVisible(
                        !Objects.equals(item.getModelObject().getId(), UQSession.get().getLoggedInUser().getId()));
            }
        };
    }

    private final class CompanyProvider extends EntityProvider<Company> {

        private static final long serialVersionUID = -1527580045919906872L;

        private CompanyFilterStructure filter;
        private String selected;

        public CompanyProvider() {
            this.filter = null;
        }

        public CompanyProvider(CompanyFilterStructure filter) {
            this.filter = filter;
        }

        public void setFilter(CompanyFilterStructure filter) {
            this.filter = filter;
        }

        @Override
        public Iterator<? extends Company> iterator(long first, long count) {
            if (filter == null) {
                return companyService.getAllByAscendingName().iterator();
            } else {
                return companyService.getAllByAscendingNameFiltered(filter, Long.valueOf(first).intValue(),
                        Long.valueOf(count).intValue()).iterator();
            }

        }

        @Override
        public long size() {
            if (filter == null) {
                return companyService.countAll();
            } else {
                return companyService.countAllFiltered(filter);
            }
        }
    }

}