package nl.topicus.onderwijs.dashboard.web.components.bargraph;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import nl.topicus.onderwijs.dashboard.keys.Project;
import nl.topicus.onderwijs.dashboard.modules.DataSource;
import nl.topicus.onderwijs.dashboard.web.WicketApplication;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.odlabs.wiquery.core.IWiQueryPlugin;
import org.odlabs.wiquery.core.javascript.JsQuery;
import org.odlabs.wiquery.core.javascript.JsStatement;
import org.odlabs.wiquery.core.options.Options;
import org.odlabs.wiquery.ui.commons.WiQueryUIPlugin;
import org.odlabs.wiquery.ui.widget.WidgetJavaScriptResourceReference;
@WiQueryUIPlugin
public class BarGraphPanel extends Panel implements IWiQueryPlugin {
private static final long serialVersionUID = 1L;
private IModel<List<Class<? extends DataSource<? extends Number>>>> dataSources;
public BarGraphPanel(
String id,
final IModel<List<Class<? extends DataSource<? extends Number>>>> dataSources) {
super(id);
this.dataSources = dataSources;
ListView<Project> bars = new ListView<Project>("bars",
WicketApplication.get().getProjects()) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<Project> item) {
item.add(new BarGraphBarPanel("bar", item.getModel(),
dataSources));
}
};
add(bars);
}
@Override
public void renderHead(IHeaderResponse response) {
response.renderJavaScriptReference(WidgetJavaScriptResourceReference
.get());
response.renderJavaScriptReference(new JavaScriptResourceReference(
BarGraphBarPanel.class, "jquery.ui.dashboardbargraphmaster.js"));
}
@Override
public JsStatement statement() {
ObjectMapper mapper = new ObjectMapper();
List<BarDataSet> dataSets = new ArrayList<BarDataSet>();
int count = 1;
for (Class<? extends DataSource<?>> curDataSource : dataSources
.getObject()) {
dataSets.add(new BarDataSet(curDataSource, "color-" + count));
count++;
}
Options options = new Options();
options.put("secondsBetweenSwitch", WicketApplication.get()
.isDevelopment() ? 30 : 60);
try {
options.put("dataSets", mapper.writeValueAsString(dataSets));
} catch (JsonGenerationException e) {
throw new RuntimeException(e);
} catch (JsonMappingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
JsQuery jsq = new JsQuery(this);
return jsq.$().chain("dashboardBarGraphMaster",
options.getJavaScriptOptions());
}
@Override
protected void onDetach() {
super.onDetach();
dataSources.detach();
}
}