org.jpos.qi.minigl.EntryGrid.java Source code

Java tutorial

Introduction

Here is the source code for org.jpos.qi.minigl.EntryGrid.java

Source

/*
 * jPOS Project [http://jpos.org]
 * Copyright (C) 2000-2018 jPOS Software SRL
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.jpos.qi.minigl;

import com.vaadin.data.HasValue;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.server.UserError;
import com.vaadin.shared.Registration;
import com.vaadin.shared.ui.grid.HeightMode;
import com.vaadin.ui.Button;
import com.vaadin.ui.Grid;
import com.vaadin.ui.renderers.HtmlRenderer;
import org.jpos.ee.BLException;
import org.jpos.gl.GLEntry;
import org.jpos.gl.GLTransaction;

import java.util.Collection;
import java.util.List;

import static org.jpos.util.QIUtils.createAmountRenderer;
import static org.jpos.util.QIUtils.getCaptionFromId;

/**
 * Created by jr on 8/1/17.
 */
public class EntryGrid extends Grid<GLEntry> implements HasValue<GLTransaction> {
    private boolean canEdit;
    private GLTransaction transaction;
    private boolean shouldReverse;

    public EntryGrid(String caption) {
        this(caption, false);
    }

    public EntryGrid(String caption, boolean canEdit) {
        super();
        this.canEdit = canEdit;
        if (caption != null)
            this.setCaption(caption);
        this.addStyleName("v-grid");
        this.addColumn(entry -> "<label>" + entry.getAccount().getCode()
                + "</label>&nbsp;<label class='v-label-light'>" + entry.getAccount().getDescription() + "</label>")
                .setId("account").setCaption(getCaptionFromId("account")).setSortable(true).setHidable(false)
                .setRenderer(new HtmlRenderer());
        this.addColumn(GLEntry::getLayer).setId("layer").setCaption(getCaptionFromId("layer")).setSortable(true)
                .setHidable(false);
        this.addColumn(entry -> {
            String detail = entry.getTransaction() != null ? entry.getTransaction().getDetail() : "";
            String entryDetail = entry.getDetail() != null ? entry.getDetail() : "";
            if (entryDetail.length() > 0)
                detail = detail.length() > 0 ? detail + ", " + entryDetail : entryDetail;
            return detail;
        }).setId("detail").setCaption(getCaptionFromId("detail")).setSortable(true).setHidable(false);
        this.addColumn(entry -> entry.getTags() != null ? entry.getTags().toString() : "").setId("tags")
                .setCaption(getCaptionFromId("tags")).setSortable(true).setHidable(false);
        this.addColumn(entry -> entry.isDebit() ? entry.getAmount() : null).setId("debit")
                .setStyleGenerator(cellStyle -> "align-right").setRenderer(createAmountRenderer())
                .setCaption(getCaptionFromId("debit")).setSortable(true).setHidable(false);
        this.addColumn(entry -> entry.isCredit() ? entry.getAmount() : null).setId("credit")
                .setStyleGenerator(cellStyle -> "align-right").setRenderer(createAmountRenderer())
                .setCaption(getCaptionFromId("credit")).setSortable(true).setHidable(false);
        //also align right header of credit & debit
        this.getHeaderRow(0).getCell("credit").setStyleName("align-right");
        this.getHeaderRow(0).getCell("debit").setStyleName("align-right");
        if (canEdit) {
            this.addComponentColumn(entry -> buildDeleteButton(entry)).setId("delete")
                    .setCaption(getCaptionFromId("delete")).setHidden(true).setSortable(false).setHidable(false)
                    .setStyleGenerator(cellStyle -> "align-right");
            this.getHeaderRow(0).getCell("delete").setStyleName("align-right");
        }
        this.setSizeFull();
        this.setHeightMode(HeightMode.ROW);
    }

    private Button buildDeleteButton(GLEntry entry) {
        Button button = new Button(VaadinIcons.TRASH);
        button.addStyleName("borderless");
        button.addClickListener(e -> {
            removeEntry(entry);
        });
        return button;
    }

    private void removeEntry(GLEntry entry) {
        transaction.getEntries().remove(entry);
        setValue(transaction);
        shouldReverse = true;
    }

    //TODO : Check that credits and debits close on each layer? Now checked by GLSession.
    public void validate() throws BLException {
        if (transaction.getEntries().size() == 0) {
            setComponentError(new UserError("Transaction has no entries"));
            throw new BLException("Transaction has no entries");
        }
    }

    @Override
    public void setValue(GLTransaction value) {
        if (value != null) {
            this.transaction = value;
            List<GLEntry> entryList = transaction.getEntries();
            this.setItems(entryList);
            if (transaction.getEntries().size() > 0)
                this.setHeightByRows(transaction.getEntries().size());
            else
                this.setHeightByRows(1);
        }
    }

    public void setItems(Collection<GLEntry> entries) {
        super.setItems(entries);
    }

    @Override
    public GLTransaction getValue() {
        return transaction;
    }

    @Override
    public void setReadOnly(boolean readOnly) {
        super.setReadOnly(readOnly);
        if (getColumn("delete") != null)
            getColumn("delete").setHidden(readOnly);
    }

    @Override
    public boolean isReadOnly() {
        return super.isReadOnly();
    }

    //won't be used
    @Override
    public Registration addValueChangeListener(ValueChangeListener<GLTransaction> listener) {
        return (Registration) () -> {
            //do nothing
        };
    }

    @Override
    public GLTransaction getEmptyValue() {
        return new GLTransaction();
    }

    @Override
    public void setRequiredIndicatorVisible(boolean requiredIndicatorVisible) {
    }

    @Override
    public boolean isRequiredIndicatorVisible() {
        return false;
    }
}