/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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 org.dashbuilder.client.expenses;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import org.dashbuilder.client.gallery.GalleryWidget;
import org.dashbuilder.client.resources.i18n.AppConstants;
import org.dashbuilder.displayer.DisplayerSettingsFactory;
import org.dashbuilder.displayer.client.Displayer;
import org.dashbuilder.displayer.client.DisplayerCoordinator;
import org.dashbuilder.displayer.client.DisplayerLocator;
import static org.dashbuilder.dataset.group.DateIntervalType.*;
import static org.dashbuilder.dataset.sort.SortOrder.*;
import static org.dashbuilder.client.expenses.ExpenseConstants.*;
import static org.dashbuilder.dataset.group.AggregateFunctionType.*;
/**
* A composite widget that represents an entire dashboard sample based on a UI binder template.
* The dashboard itself is composed by a set of Displayer instances.</p>
* <p>The data set that feeds this dashboard is a CSV file stored into an specific server folder so
* that is auto-deployed during server start up: <code>dashbuilder-webapp/src/main/webapp/datasets/expenseReports.csv</code></p>
*/
@Dependent
public class ExpensesDashboard extends Composite implements GalleryWidget {
interface ExpensesDashboardBinder extends UiBinder<Widget, ExpensesDashboard>{}
private static final ExpensesDashboardBinder uiBinder = GWT.create(ExpensesDashboardBinder.class);
@UiField(provided = true)
Displayer pieByOffice;
@UiField(provided = true)
Displayer barByDepartment;
@UiField(provided = true)
Displayer lineByDate;
@UiField(provided = true)
Displayer bubbleByEmployee;
@UiField(provided = true)
Displayer tableAll;
DisplayerCoordinator displayerCoordinator;
DisplayerLocator displayerLocator;
@Inject
public ExpensesDashboard(DisplayerCoordinator displayerCoordinator, DisplayerLocator displayerLocator) {
this.displayerCoordinator = displayerCoordinator;
this.displayerLocator = displayerLocator;
}
@Override
public String getTitle() {
return AppConstants.INSTANCE.expensesdb_title();
}
@Override
public void onClose() {
displayerCoordinator.closeAll();
}
@Override
public boolean feedsFrom(String dataSetId) {
return EXPENSES.equals(dataSetId);
}
@PostConstruct
public void init() {
// Create the chart definitions
pieByOffice = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newPieChartSettings()
.dataset(EXPENSES)
.group(OFFICE)
.column(OFFICE)
.column(AMOUNT, SUM, "sum1")
.format(AppConstants.INSTANCE.expensesdb_pie_column1(), "$ #,##0.00")
.group(DEPARTMENT)
.column(DEPARTMENT)
.column(AMOUNT, SUM, "sum2")
.format(AppConstants.INSTANCE.expensesdb_pie_column2(), "$ #,##0.00")
.group(EMPLOYEE)
.column(EMPLOYEE)
.column(AMOUNT, SUM, "sum3")
.format(AppConstants.INSTANCE.expensesdb_pie_column3(), "$ #,##0.00")
.title(AppConstants.INSTANCE.expensesdb_pie_title())
.width(400).height(250)
.margins(10, 10, 10, 0)
.filterOn(true, true, true)
.buildSettings());
barByDepartment = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newBarChartSettings()
.dataset(EXPENSES)
.group(DEPARTMENT)
.column(DEPARTMENT)
.column(AMOUNT, SUM).format(AppConstants.INSTANCE.expensesdb_bar_column1(), "$ #,##0.00")
.title(AppConstants.INSTANCE.expensesdb_bar_title())
.width(400).height(250)
.margins(10, 50, 50, 20)
.filterOn(false, true, true)
.buildSettings());
bubbleByEmployee = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newBubbleChartSettings()
.dataset(EXPENSES)
.group(EMPLOYEE)
.column(EMPLOYEE)
.column(AMOUNT, SUM).format(AppConstants.INSTANCE.expensesdb_bubble_column1(), "$ #,##0.00")
.column(AMOUNT, AVERAGE).format(AppConstants.INSTANCE.expensesdb_bubble_column2(), "$ #,##0.00")
.column(EMPLOYEE, AppConstants.INSTANCE.expensesdb_bubble_column3())
.column(COUNT, AppConstants.INSTANCE.expensesdb_bubble_column4())
.title(AppConstants.INSTANCE.expensesdb_bubble_title())
.titleVisible(false)
.width(600).height(280)
.margins(10, 50, 80, 0)
.filterOn(false, true, true)
.buildSettings());
lineByDate = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newAreaChartSettings()
.dataset(EXPENSES)
.group(DATE).dynamic(8, DAY_OF_WEEK, true)
.column(DATE)
.column(AMOUNT, SUM)
.format(AppConstants.INSTANCE.expensesdb_line_column1(), "$ #,##0.00")
.title(AppConstants.INSTANCE.expensesdb_line_title())
.titleVisible(false)
.width(500).height(250)
.margins(10, 50, 50, 50)
.filterOn(true, true, true)
.buildSettings());
tableAll = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newTableSettings()
.dataset(EXPENSES)
.title(AppConstants.INSTANCE.expensesdb_table_title())
.titleVisible(false)
.tablePageSize(8)
.tableOrderEnabled(true)
.tableOrderDefault(AMOUNT, DESCENDING)
.column(OFFICE).format(AppConstants.INSTANCE.expensesdb_table_column1())
.column(DEPARTMENT).format(AppConstants.INSTANCE.expensesdb_table_column2())
.column(EMPLOYEE).format(AppConstants.INSTANCE.expensesdb_table_column3())
.column(AMOUNT).format(AppConstants.INSTANCE.expensesdb_table_column4(), "$ #,##0.00")
.column(DATE).format(AppConstants.INSTANCE.expensesdb_table_column5(), "MMM E dd, yyyy")
.filterOn(true, true, true)
.tableWidth(600)
.buildSettings());
// Make that charts interact among them
displayerCoordinator.addDisplayer(pieByOffice);
displayerCoordinator.addDisplayer(barByDepartment);
displayerCoordinator.addDisplayer(bubbleByEmployee);
displayerCoordinator.addDisplayer(lineByDate);
displayerCoordinator.addDisplayer(tableAll);
// Init the dashboard from the UI Binder template
initWidget(uiBinder.createAndBindUi(this));
// Draw the charts
displayerCoordinator.drawAll();
}
public void redrawAll() {
displayerCoordinator.redrawAll();
}
}