org.devgateway.eudevfin.dim.pages.MessagesListTable.java Source code

Java tutorial

Introduction

Here is the source code for org.devgateway.eudevfin.dim.pages.MessagesListTable.java

Source

/*
 * Copyright (c) 2014 Development Gateway.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 */

package org.devgateway.eudevfin.dim.pages;

import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxCallListener;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
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.model.AbstractReadOnlyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.devgateway.eudevfin.auth.common.domain.PersistedUser;
import org.devgateway.eudevfin.dim.desktop.components.MessageNavbarButton;
import org.devgateway.eudevfin.financial.FileWrapper;
import org.devgateway.eudevfin.financial.Message;
import org.devgateway.eudevfin.financial.service.MessageService;
import org.devgateway.eudevfin.ui.common.components.TableListPanel;
import org.devgateway.eudevfin.ui.common.components.util.DownloadLink;
import org.devgateway.eudevfin.ui.common.components.util.ListGeneratorInterface;
import org.devgateway.eudevfin.ui.common.providers.PersistedUserChoiceProvider;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * @author Alexandru Artimon
 * @since 16/08/14
 */
public class MessagesListTable extends TableListPanel<Message> {
    @SpringBean
    private MessageService mxService;

    public MessagesListTable(String id, ListGeneratorInterface<Message> listGenerator) {
        super(id, listGenerator);
    }

    public void reloadMessageList(AjaxRequestTarget target) {
        reloadTable();
        for (Component c : getPage().visitChildren(MessageNavbarButton.class))
            target.add(c);
        target.add(itemsListView.getParent());
    }

    @Override
    protected void populateTable() {
        this.itemsListView = new ListView<Message>("messagesList", items) {
            @Override
            protected void populateItem(final ListItem<Message> item) {
                final Message msg = item.getModelObject();
                String from = "";
                if (msg.getFrom() != null)
                    from = PersistedUserChoiceProvider.userToString(msg.getFrom());
                else
                    from = "[SYSTEM]";

                String to = "";
                Iterator<PersistedUser> it = msg.getTo().iterator();
                while (it.hasNext()) {
                    PersistedUser u = it.next();
                    to += PersistedUserChoiceProvider.userToString(u) + (it.hasNext() ? ", " : "");
                }

                item.add(new Label("from", Model.of(from)));
                item.add(new Label("to", Model.of(to)));

                final Label messageLabel = new Label("message", new PropertyModel(item.getModel(), "message"));
                messageLabel.setRenderBodyOnly(true);
                messageLabel.setEscapeModelStrings(false);
                item.add(messageLabel);

                AbstractReadOnlyModel<List<FileWrapper>> roList = new AbstractReadOnlyModel<List<FileWrapper>>() {
                    @Override
                    public List<FileWrapper> getObject() {
                        final PropertyModel<Set<FileWrapper>> attachments = new PropertyModel<>(item.getModel(),
                                "attachments");
                        ArrayList<FileWrapper> ret = new ArrayList<FileWrapper>();
                        if (attachments.getObject() != null)
                            for (FileWrapper fw : attachments.getObject())
                                ret.add(fw);
                        return ret;
                    }
                };

                WebMarkupContainer attachments = new WebMarkupContainer("attachments");
                item.add(attachments);

                attachments.setVisibilityAllowed(false);
                if (roList.getObject() != null && roList.getObject().size() > 0)
                    attachments.setVisibilityAllowed(true);

                ListView<FileWrapper> list = new ListView<FileWrapper>("list", roList) {
                    @Override
                    protected void populateItem(final ListItem<FileWrapper> item) {
                        Label label = new Label("label", item.getModelObject().getName());
                        item.add(label);

                        Link<FileWrapper> download = new DownloadLink("download", item.getModel());
                        item.add(download);
                    }
                };
                attachments.add(list);

                final Label subjectModel = new Label("subject", new PropertyModel(item.getModel(), "subject"));
                subjectModel.setRenderBodyOnly(true);
                subjectModel.setEscapeModelStrings(false);
                item.add(subjectModel);
                item.add(new Label("date", Model.of(msg.getSendDate().toString("EEEEEE, dd MMMMM yyyy HH:mm"))));

                TooltipConfig tooltipConfig = new TooltipConfig().withPlacement(TooltipConfig.Placement.left);

                AjaxLink delete = new AjaxLink("delete") {
                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        mxService.delete(msg);
                        reloadMessageList(target);
                    }

                    @Override
                    protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                        super.updateAjaxAttributes(attributes);
                        AjaxCallListener ajaxCallListener = new AjaxCallListener();
                        ajaxCallListener.onPrecondition("return confirm(' "
                                + new StringResourceModel("modal.delete", this.getPage(), null, null).getObject()
                                + " ');");
                        attributes.getAjaxCallListeners().add(ajaxCallListener);
                    }
                };
                delete.add(new TooltipBehavior(new StringResourceModel("delete.tooltip", this, null, null),
                        tooltipConfig));
                item.add(delete);

                AjaxLink reply = new AjaxLink("reply") {
                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        Messages messages = this.findParent(Messages.class);
                        messages.reply(msg.getFrom(), msg.getTo(), msg.getSubject(), target);
                    }
                };
                reply.add(new TooltipBehavior(new StringResourceModel("reply.tooltip", this, null, null),
                        tooltipConfig));
                item.add(reply);

                AjaxLink readToggle = new AjaxLink("readStatus") {
                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        msg.setReadStatus(!msg.getReadStatus());
                        mxService.save(msg);
                        reloadMessageList(target);
                    }
                };
                WebMarkupContainer readToggleIcon = new WebMarkupContainer("readStatusIcon");
                if (msg.getReadStatus() != null && msg.getReadStatus()) {
                    readToggle.add(new TooltipBehavior(
                            new StringResourceModel("markUnread.tooltip", this, null, null), tooltipConfig));
                    readToggleIcon.add(new IconBehavior(IconType.cog));
                } else {
                    readToggle.add(new TooltipBehavior(
                            new StringResourceModel("markRead.tooltip", this, null, null), tooltipConfig));
                    readToggleIcon.add(new IconBehavior(IconType.asterisk));
                }
                readToggle.add(readToggleIcon);
                item.add(readToggle);

            }
        };
        itemsListView.setReuseItems(false);
        this.add(this.itemsListView);
    }

    @Override
    protected void populateHeader() {
        //        this.add( ComponentsUtil.generateLabel("from", "fromLabel", this) );
        //        this.add( ComponentsUtil.generateLabel("message", "messageLabel", this) );
        //        this.add( ComponentsUtil.generateLabel("actions", "actionsLabel", this) );
    }
}