/*
* 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.sales.widgets;
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.shared.sales.SalesConstants.*;
import static org.dashbuilder.dataset.group.DateIntervalType.*;
import static org.dashbuilder.dataset.sort.SortOrder.*;
import static org.dashbuilder.dataset.group.AggregateFunctionType.*;
/**
* A composite widget that represents an entire dashboard sample composed using an UI binder template.
* <p>The dashboard itself is composed by a set of Displayer instances.</p>
*/
@Dependent
public class SalesGoals extends Composite implements GalleryWidget {
interface SalesDashboardBinder extends UiBinder<Widget, SalesGoals>{}
private static final SalesDashboardBinder uiBinder = GWT.create(SalesDashboardBinder.class);
@UiField(provided = true)
Displayer meterChartAmount;
@UiField(provided = true)
Displayer lineChartByDate;
@UiField(provided = true)
Displayer barChartByProduct;
@UiField(provided = true)
Displayer barChartByEmployee;
@UiField(provided = true)
Displayer bubbleByCountry;
DisplayerCoordinator displayerCoordinator;
DisplayerLocator displayerLocator;
@Inject
public SalesGoals(DisplayerCoordinator displayerCoordinator, DisplayerLocator displayerLocator) {
this.displayerCoordinator = displayerCoordinator;
this.displayerLocator = displayerLocator;
// Create the chart definitions
meterChartAmount = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newMeterChartSettings()
.dataset(SALES_OPPS)
.column(AMOUNT, SUM, AppConstants.INSTANCE.sales_goals_meter_column1())
.expression("value/1000")
.format(AppConstants.INSTANCE.sales_goals_meter_column1(), "$ #,### K")
.title(AppConstants.INSTANCE.sales_goals_meter_title())
.titleVisible(true)
.width(200).height(200)
.meter(0, 15000, 25000, 35000)
.filterOn(false, true, true)
.buildSettings());
lineChartByDate = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newLineChartSettings()
.dataset(SALES_OPPS)
.group(CLOSING_DATE).dynamic(80, MONTH, true)
.column(CLOSING_DATE).format(AppConstants.INSTANCE.sales_goals_line_column1())
.column(AMOUNT, SUM).format(AppConstants.INSTANCE.sales_goals_line_column2(), "$ #,### K").expression("value/1000")
.column(EXPECTED_AMOUNT, SUM).format(AppConstants.INSTANCE.sales_goals_line_column3(), "$ #,### K").expression("value/1000")
.title(AppConstants.INSTANCE.sales_goals_line_title())
.titleVisible(true)
.width(800).height(200)
.margins(10, 80, 80, 100)
.filterOn(false, true, true)
.buildSettings());
barChartByProduct = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newBarChartSettings()
.subType_Column()
.dataset(SALES_OPPS)
.group(PRODUCT)
.column(PRODUCT).format(AppConstants.INSTANCE.sales_goals_bar_byproduct_column1())
.column(AMOUNT, SUM).format(AppConstants.INSTANCE.sales_goals_bar_byproduct_column2(), "$ #,### K").expression("value/1000")
.column(EXPECTED_AMOUNT, SUM).format(AppConstants.INSTANCE.sales_goals_bar_byproduct_column3(), "$ #,### K").expression("value/1000")
.title(AppConstants.INSTANCE.sales_goals_bar_byproduct_title())
.titleVisible(true)
.width(400).height(150)
.margins(10, 80, 80, 10)
.filterOn(false, true, true)
.buildSettings());
barChartByEmployee = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newBarChartSettings()
.subType_Column()
.dataset(SALES_OPPS)
.group(SALES_PERSON)
.column(SALES_PERSON).format(AppConstants.INSTANCE.sales_goals_bar_byempl_column1())
.column(AMOUNT, SUM).format(AppConstants.INSTANCE.sales_goals_bar_byempl_column2(), "$ #,### K").expression("value/1000")
.sort(AMOUNT, DESCENDING)
.title(AppConstants.INSTANCE.sales_goals_bar_byempl_title())
.titleVisible(true)
.width(400).height(150)
.margins(10, 80, 80, 10)
.filterOn(false, true, true)
.buildSettings());
bubbleByCountry = displayerLocator.lookupDisplayer(
DisplayerSettingsFactory.newBubbleChartSettings()
.dataset(SALES_OPPS)
.group(COUNTRY)
.column(COUNTRY, "Country")
.column(COUNT, "#opps").format(AppConstants.INSTANCE.sales_goals_bubble_column1(), "#,###")
.column(PROBABILITY, AVERAGE).format(AppConstants.INSTANCE.sales_goals_bubble_column2(), "#,###")
.column(COUNTRY, "Country")
.column(EXPECTED_AMOUNT, SUM).expression("value/1000").format(AppConstants.INSTANCE.sales_goals_bubble_column3(), "$ #,##0.00 K")
.title(AppConstants.INSTANCE.sales_goals_bubble_title())
.width(550).height(250)
.margins(10, 30, 50, 0)
.filterOn(false, true, true)
.buildSettings());
// Make the charts interact among them
displayerCoordinator.addDisplayer(meterChartAmount);
displayerCoordinator.addDisplayer(lineChartByDate);
displayerCoordinator.addDisplayer(barChartByProduct);
displayerCoordinator.addDisplayer(barChartByEmployee);
displayerCoordinator.addDisplayer(bubbleByCountry);
// Init the dashboard from the UI Binder template
initWidget(uiBinder.createAndBindUi(this));
// Draw the charts
displayerCoordinator.drawAll();
}
@Override
public String getTitle() {
return AppConstants.INSTANCE.sales_goals_title();
}
@Override
public void onClose() {
displayerCoordinator.closeAll();
}
@Override
public boolean feedsFrom(String dataSetId) {
return SALES_OPPS.equals(dataSetId);
}
@Override
public void redrawAll() {
displayerCoordinator.redrawAll();
}
}