/*
* 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.displayer.client.prototypes;
import java.util.EnumMap;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.dashbuilder.dataset.sort.SortOrder;
import org.dashbuilder.dataset.uuid.UUIDGenerator;
import org.dashbuilder.displayer.DisplayerSettings;
import org.dashbuilder.displayer.DisplayerSettingsFactory;
import org.dashbuilder.displayer.DisplayerSubType;
import org.dashbuilder.displayer.DisplayerType;
import static org.dashbuilder.displayer.client.prototypes.DataSetPrototypes.*;
@ApplicationScoped
public class DisplayerPrototypes {
protected DataSetPrototypes dataSetPrototypes;
protected UUIDGenerator uuidGenerator;
protected Map<DisplayerType, DisplayerSettings> prototypeMap = new EnumMap<>(DisplayerType.class);
protected Map<DisplayerSubType, DisplayerSettings> subprotoMap = new EnumMap<>(DisplayerSubType.class);
public DisplayerPrototypes() {
}
@Inject
public DisplayerPrototypes(DataSetPrototypes dataSetPrototypes, UUIDGenerator uuidGenerator) {
this.dataSetPrototypes = dataSetPrototypes;
this.uuidGenerator = uuidGenerator;
init();
}
public void init() {
prototypeMap.put(DisplayerType.PIECHART, DisplayerSettingsFactory
.newPieChartSettings()
.uuid("pieChartPrototype")
.dataset(dataSetPrototypes.getContinentPopulation())
.title("Population per Continent")
.titleVisible(false)
.column(POPULATION)
.expression("value/1000000")
.format("Population", "#,### M")
.width(500).height(300)
.margins(10, 10, 10, 100)
.legendOn("right")
.set3d(true)
.filterOn(false, true, true)
.buildSettings());
prototypeMap.put(DisplayerType.BARCHART, DisplayerSettingsFactory
.newBarChartSettings()
.subType_Bar()
.uuid("barChartPrototype")
.dataset(dataSetPrototypes.getTopRichCountries())
.title("Top Rich Countries")
.titleVisible(false)
.column(COUNTRY).format("Country")
.column(GDP_2013).format("2013", "$ #,### M")
.column(GDP_2014).format("2014", "$ #,### M")
.width(500).height(250)
.margins(10, 40, 100, 50)
.legendOn("right")
.filterOn(false, true, true)
.buildSettings());
prototypeMap.put(DisplayerType.LINECHART, DisplayerSettingsFactory
.newLineChartSettings()
.uuid("lineChartPrototype")
.dataset(dataSetPrototypes.getContinentPopulation())
.title("Population per Continent")
.titleVisible(false)
.column(POPULATION)
.expression("value/1000000")
.format("Population", "#,### M")
.width(500).height(300)
.margins(10, 40, 90, 10)
.legendOff()
.filterOn(false, true, true)
.buildSettings());
prototypeMap.put(DisplayerType.AREACHART, DisplayerSettingsFactory
.newAreaChartSettings()
.uuid("areaChartPrototype")
.dataset(dataSetPrototypes.getContinentPopulation())
.title("Population per Continent")
.titleVisible(false)
.column(POPULATION)
.expression("value/1000000")
.format("Population", "#,### M")
.width(500).height(300)
.margins(10, 40, 90, 10)
.legendOff()
.filterOn(false, true, true)
.buildSettings());
prototypeMap.put(DisplayerType.BUBBLECHART, DisplayerSettingsFactory
.newBubbleChartSettings()
.uuid("bubbleChartPrototype")
.dataset(dataSetPrototypes.getContinentPopulationExt())
.title("Population per Continent")
.titleVisible(false)
.width(500).height(300)
.margins(10, 30, 50, 10)
.legendOff()
.filterOn(false, true, true)
.buildSettings());
prototypeMap.put(DisplayerType.METERCHART, DisplayerSettingsFactory
.newMeterChartSettings()
.uuid("meterChartPrototype")
.dataset(dataSetPrototypes.getContinentPopulation())
.title("Population per Continent")
.titleVisible(false)
.width(400).height(300)
.column(POPULATION)
.expression("value/1000000")
.format("Population", "#,### M")
.margins(10, 10, 10, 10)
.meter(0, 1000L, 3000L, 6000L)
.filterOn(false, true, true)
.buildSettings());
DisplayerSettings metricCard = DisplayerSettingsFactory
.newMetricSettings()
.uuid("metricCardPrototype")
.dataset(dataSetPrototypes.getTotalPopulation())
.column(POPULATION).format("Population", "#,##0 MM")
.subtype(DisplayerSubType.METRIC_CARD)
.title("World population")
.titleVisible(true)
.width(200).height(100)
.margins(0, 0, 0, 0)
.backgroundColor("white")
.filterOn(false, false, true)
.htmlTemplate("<div id=\"${this}\" class=\"card-pf card-pf-accented card-pf-aggregate-status\" " +
"style=\"background-color:${bgColor}; width:${width}px; height:${height}px; " +
"margin-top:${marginTop}px; margin-right:${marginRight}px; margin-bottom:${marginBottom}px; margin-left:${marginLeft}px;\">\n" +
" <h3>${title}</h3>\n" +
" <h2>${value}</h2>\n" +
"</div>")
.jsTemplate("if (${isFilterEnabled}) { \n" +
" var filterOn = false;\n" +
" ${this}.style.cursor=\"pointer\";\n" +
"\n" +
" ${this}.onmouseover = function() {\n" +
" if (!filterOn) ${this}.style.backgroundColor = \"lightblue\";\n" +
" };\n" +
" ${this}.onmouseout = function() {\n" +
" if (!filterOn) ${this}.style.backgroundColor = \"${bgColor}\";\n" +
" };\n" +
" ${this}.onclick = function() {\n" +
" filterOn = !filterOn;\n" +
" ${this}.style.backgroundColor = filterOn ? \"lightblue\" : \"${bgColor}\";\n" +
" ${doFilter};\n" +
" };\n" +
"}")
.buildSettings();
DisplayerSettings metricCard2 = DisplayerSettingsFactory
.newMetricSettings()
.uuid("metricCard2Prototype")
.dataset(dataSetPrototypes.getTotalPopulation())
.column(POPULATION).format("Population", "#,##0 MM")
.subtype(DisplayerSubType.METRIC_CARD2)
.title("World population")
.titleVisible(true)
.width(200).height(100)
.margins(0, 0, 0, 0)
.backgroundColor("white")
.filterOn(false, false, true)
.htmlTemplate("<h2 class=\"card-pf-title\">\n" +
" ${title}\n" +
" </h2>\n" +
"<div class=\"card-pf-body\">\n" +
" <p class=\"card-pf-utilization-details\">\n" +
" <span class=\"card-pf-utilization-card-details-count\">${value}</span>\n" +
" <span class=\"card-pf-utilization-card-details-description\">\n" +
" <span class=\"card-pf-utilization-card-details-line-1\">people</span>\n" +
" <span class=\"card-pf-utilization-card-details-line-2\">in the world</span>\n" +
" </span>\n" +
" </p>\n" +
"</div>")
.buildSettings();
DisplayerSettings metricQuota = DisplayerSettingsFactory
.newMetricSettings()
.uuid("metricQuotaPrototype")
.dataset(dataSetPrototypes.getTotalPopulation())
.column(POPULATION).format("Population", "#,##0 MM")
.subtype(DisplayerSubType.METRIC_QUOTA)
.title("World population")
.titleVisible(true)
.width(200).height(100)
.margins(0, 0, 0, 0)
.metric(0, 0, 0, 100000)
.filterOn(false, false, true)
.htmlTemplate("<div class=\"progress-description\">\n" +
" ${title}\n" +
"</div>\n" +
"<div class=\"progress progress-label-top-right\">\n" +
" <div id=\"${bar}\" class=\"progress-bar\" role=\"progressbar\" data-toggle=\"tooltip\" title=\"${value}\">\n" +
" <span><strong>${value}</strong></span>\n" +
" </div>\n" +
" <div class=\"progress-bar progress-bar-remaining\" role=\"progressbar\" data-toggle=\"tooltip\">\n" +
" </div>\n" +
"</div>")
.jsTemplate("var end = ${value.end};\n" +
"var current = Math.round(${value.raw} * 100 / end);\n" +
"${bar}.style.width = current + \"%\";")
.buildSettings();
DisplayerSettings metricPlainText = DisplayerSettingsFactory
.newMetricSettings()
.uuid("metricPlainTextPrototype")
.dataset(dataSetPrototypes.getTotalPopulation())
.column(POPULATION).format("Population", "#,##0 MM")
.subtype(DisplayerSubType.METRIC_PLAIN_TEXT)
.title("World population ")
.titleVisible(true)
.width(200).height(100)
.margins(0, 0, 0, 0)
.metric(0, 50000, 75000, 100000)
.filterOn(false, false, true)
.htmlTemplate("<div>\n" +
" ${title}: <span id=\"${valref}\" style=\"font-weight: bold\">${value}</span>\n" +
"</div>\n")
.jsTemplate("if (${value.raw} > ${value.critical}) { \n" +
" ${valref}.style.color = \"red\"; \n" +
"} else if (${value.raw} > ${value.warning}) { \n" +
" ${valref}.style.color = \"yellow\"; \n" +
"} else {\n" +
" ${valref}.style.color = \"black\";\n" +
"}")
.buildSettings();
prototypeMap.put(DisplayerType.METRIC, metricCard);
subprotoMap.put(DisplayerSubType.METRIC_CARD, metricCard);
subprotoMap.put(DisplayerSubType.METRIC_CARD2, metricCard2);
subprotoMap.put(DisplayerSubType.METRIC_QUOTA, metricQuota);
subprotoMap.put(DisplayerSubType.METRIC_PLAIN_TEXT, metricPlainText);
prototypeMap.put(DisplayerType.MAP, DisplayerSettingsFactory
.newMapChartSettings()
.uuid("mapChartPrototype")
.dataset(dataSetPrototypes.getCountryPopulation())
.title("World Population")
.titleVisible(false)
.width(500).height(300)
.margins(10, 10, 10, 10)
.filterOn(false, true, true)
.buildSettings());
prototypeMap.put(DisplayerType.TABLE, DisplayerSettingsFactory
.newTableSettings()
.uuid("tablePrototype")
.dataset(dataSetPrototypes.getWorldPopulation())
.title("Population per Continent")
.titleVisible(false)
.column(POPULATION)
.expression("value/1000000")
.format("Population", "#,### M")
.tableOrderEnabled(true)
.tableOrderDefault(POPULATION, SortOrder.DESCENDING)
.tablePageSize(8)
.filterOn(false, true, true)
.buildSettings());
}
public DisplayerSettings getProto(DisplayerType type) {
return getProto(type, null);
}
public DisplayerSettings getProto(DisplayerType type, DisplayerSubType subType) {
boolean hasSubproto = subType != null && subprotoMap.containsKey(subType);
DisplayerSettings proto = hasSubproto ? subprotoMap.get(subType) : prototypeMap.get(type);
proto = proto.cloneInstance();
proto.setUUID(uuidGenerator.newUuid());
if (subType != null) {
proto.setSubtype(subType);
}
return proto;
}
}