Skip to content

Instantly share code, notes, and snippets.

@kevzlou7979
Created August 10, 2017 23:35
Show Gist options
  • Save kevzlou7979/2c1711c487ba40ce31ed183aebaf87dc to your computer and use it in GitHub Desktop.
Save kevzlou7979/2c1711c487ba40ce31ed183aebaf87dc to your computer and use it in GitHub Desktop.
/*
* #%L
* Errai Prototype
* %%
* Copyright (C) 2015 - 2017 Doltech
* %%
* 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%
*/
package com.insclix.budget.client.page.budget.group.expense;
import com.insclix.budget.client.base.components.table.DataTableCategoryHelper;
import com.insclix.budget.client.base.components.table.EditableTextCell;
import com.insclix.budget.client.page.budget.group.BudgetGroupCategoryFactory;
import com.insclix.budget.client.page.budget.group.BudgetGroupTableType;
import com.insclix.budget.domain.BudgetItem;
import gwt.material.design.client.base.constants.StyleName;
import gwt.material.design.client.constants.Color;
import gwt.material.design.client.constants.IconType;
import gwt.material.design.client.constants.TextAlign;
import gwt.material.design.client.ui.MaterialIcon;
import gwt.material.design.client.ui.table.cell.FrozenProperties;
import gwt.material.design.client.ui.table.cell.FrozenSide;
import gwt.material.design.client.ui.table.cell.TextColumn;
import gwt.material.design.client.ui.table.cell.WidgetColumn;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class ExpenseBudgetGroupOverrideTable extends AbstractExpenseBudgetGroupTable {
public ExpenseBudgetGroupOverrideTable(ExpenseBudgetGroupView view) {
super(view);
}
@Override
protected void build() {
super.build();
setCategoryFactory(new BudgetGroupCategoryFactory(BudgetGroupTableType.OVERRIDE));
}
@Override
protected void buildColumns() {
ExpenseBudgetGroupView view = getExpenseBudgetGroupView();
FrozenProperties properties = new FrozenProperties("200px", "32px");
properties._setSide(FrozenSide.LEFT);
/** Account **/
addColumn(new TextColumn<BudgetItem>() {
@Override
public FrozenProperties frozenProperties() {
return properties;
}
@Override
public String getValue(BudgetItem item) {
return item.getAccount().getUniqueName();
}
}, "Account");
/** Notes **/
WidgetColumn<BudgetItem, EditableTextCell> notesColumn = new WidgetColumn<BudgetItem, EditableTextCell>() {
@Override
public FrozenProperties frozenProperties() {
return properties;
}
@Override
public TextAlign textAlign() {
return TextAlign.LEFT;
}
@Override
public EditableTextCell getValue(BudgetItem item) {
EditableTextCell cell = new EditableTextCell<>(getFieldUpdater(), item, item.getNotes());
cell.setPlaceholder("Notes");
return cell;
}
};
notesColumn.setFieldUpdater((i, item, editableTextCell) -> item.setNotes(editableTextCell.getText()));
addColumn(notesColumn, "Notes");
/** Total Amount **/
WidgetColumn<BudgetItem, EditableTextCell> totalColumn = new WidgetColumn<BudgetItem, EditableTextCell>() {
@Override
public FrozenProperties frozenProperties() {
return properties;
}
@Override
public Map<StyleName, String> styleProperties() {
Map<StyleName, String> styleProps = new HashMap<>();
styleProps.put(StyleName.PADDING_LEFT, "20px");
return styleProps;
}
@Override
public EditableTextCell<BudgetItem, Double> getValue(BudgetItem item) {
EditableTextCell cell = new EditableTextCell(getFieldUpdater(), item, item.getAmortizedAmount());
cell.setEnabled(false);
cell.setPlaceholder("Amount");
return cell;
}
};
addColumn(totalColumn, "Total");
for (Integer index : view.MONTHS.keySet()) {
WidgetColumn<BudgetItem, EditableTextCell> monthColumn = new WidgetColumn<BudgetItem, EditableTextCell>() {
@Override
public String width() {
return "20%";
}
@Override
public Map<StyleName, String> styleProperties() {
Map<StyleName, String> styleProps = new HashMap<>();
styleProps.put(StyleName.PADDING_LEFT, "20px");
return styleProps;
}
@Override
public EditableTextCell<BudgetItem, Double> getValue(BudgetItem item) {
EditableTextCell cell = new EditableTextCell(getFieldUpdater(), item, item.getMonth(index).getAmount());
cell.setPlaceholder("Amount");
return cell;
}
};
monthColumn.setFieldUpdater((i, item, editableTextCell) -> {
double amount = Double.parseDouble(String.valueOf(editableTextCell.getValue().toString()));
item.getMonth(index).setAmount(amount);
view.recalculate(ExpenseBudgetGroupView.CalculateBy.OVERRIDE, false);
// Update the total cell
double total = 0;
for (Integer monthIndex : item.getMonths().keySet()) {
total = total + item.getMonth(monthIndex).getAmount();
}
item.setAmortizedAmount(total);
// Update the row automatically without refreshing the page
updateRow(item);
});
addColumn(monthColumn, view.MONTHS.get(index));
}
addColumn(new WidgetColumn<BudgetItem, MaterialIcon>() {
@Override
public TextAlign textAlign() {
return TextAlign.RIGHT;
}
@Override
public String width() {
return "12px";
}
@Override
public MaterialIcon getValue(BudgetItem stub) {
MaterialIcon delete = new MaterialIcon(IconType.DELETE);
delete.getIcon().setFontSize("1.4em");
delete.getIcon().setMarginTop(6);
delete.setIconColor(Color.GREY_DARKEN_1);
delete.addClickHandler(clickEvent -> {
getBudgetItems().remove(stub);
view.setDirty(true);
view.recalculate(ExpenseBudgetGroupView.CalculateBy.MONTH, true);
// Clear the categories if the budget item size has no more rows. This will avoid flickering effect while removing items.
if (getBudgetItems().stream().filter(item -> item.getAccount().getRoot().getName().equals(stub.getAccount().getRoot().getName())).count() == 0) {
clearRowsAndCategories(true);
}
DataTableCategoryHelper.openCategory(stub.getAccount().getRoot().getName(), ExpenseBudgetGroupOverrideTable.this);
clickEvent.stopPropagation();
});
return delete;
}
}, "");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment