Replace the (apparently now unsupported) wicket-chartjs
authorFrancesco Chicchiriccò <ilgrosso@apache.org>
Fri, 1 Jun 2018 14:49:10 +0000 (16:49 +0200)
committerFrancesco Chicchiriccò <ilgrosso@apache.org>
Fri, 1 Jun 2018 15:26:51 +0000 (17:26 +0200)
33 files changed:
client/console/pom.xml
client/console/src/main/java/org/apache/syncope/client/console/chartjs/Bar.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/BarChartData.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/BarChartOptions.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/BarDataSet.java [moved from client/console/src/main/java/org/apache/syncope/client/console/widgets/LabeledDoughnutChartData.java with 65% similarity]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/BaseDataSet.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/Chart.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartData.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartJSBehavior.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartJSPanel.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartOptions.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/DataSetChart.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/Doughnut.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutChartData.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutChartOptions.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutDataSet.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/Line.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/LineChartData.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/LineChartOptions.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/LineDataSet.java [moved from client/console/src/main/java/org/apache/syncope/client/console/widgets/LabeledBarDataSet.java with 73% similarity]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/PieChartOptions.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/PointColorDataSet.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/SimpleChart.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/chartjs/SimpleColorValueChartData.java [new file with mode: 0644]
client/console/src/main/java/org/apache/syncope/client/console/widgets/AnyByRealmWidget.java
client/console/src/main/java/org/apache/syncope/client/console/widgets/CompletenessWidget.java
client/console/src/main/java/org/apache/syncope/client/console/widgets/LoadWidget.java
client/console/src/main/java/org/apache/syncope/client/console/widgets/UsersByStatusWidget.java
client/console/src/main/resources/org/apache/syncope/client/console/chartjs/ChartJSPanel.html [new file with mode: 0644]
client/console/src/main/resources/org/apache/syncope/client/console/pages/Dashboard.html
core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
ext/camel/client-console/src/main/java/org/apache/syncope/client/console/widgets/CamelMetricsWidget.java
pom.xml

index 0843ab6..d3103e9 100644 (file)
@@ -94,10 +94,6 @@ under the License.
       <groupId>de.agilecoders.wicket</groupId>
       <artifactId>wicket-bootstrap-extensions</artifactId>
     </dependency>
-    <dependency>
-      <groupId>com.pingunaut</groupId>
-      <artifactId>wicket-chartjs</artifactId>
-    </dependency>      
     
     <dependency>
       <groupId>org.apache.syncope.client</groupId>
@@ -140,6 +136,10 @@ under the License.
       <artifactId>jsplumb</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.webjars.bower</groupId>
+      <artifactId>chart.js</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.webjars</groupId>
       <artifactId>jquery-cookie</artifactId>
     </dependency>
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Bar.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Bar.java
new file mode 100644 (file)
index 0000000..0d3089b
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides a simple implementation of chart.js bar chart.\r
+ *\r
+ * @see <a href="http://www.chartjs.org/docs/#barChart">chart.js docs</a>\r
+ */\r
+public class Bar extends DataSetChart<BarChartData<BarDataSet>, BarChartOptions, BarDataSet> {\r
+\r
+    private static final long serialVersionUID = -332976997065056554L;\r
+\r
+    @Override\r
+    public BarChartOptions getOptions() {\r
+        if (options == null) {\r
+            options = new BarChartOptions();\r
+        }\r
+        return options;\r
+    }\r
+\r
+    @Override\r
+    public BarChartData<BarDataSet> getData() {\r
+        if (data == null) {\r
+            data = new BarChartData<>();\r
+        }\r
+        return data;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/BarChartData.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/BarChartData.java
new file mode 100644 (file)
index 0000000..45608a4
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides chart data used by bar charts.\r
+ *\r
+ * @param <T> the generic type of it's dataset\r
+ */\r
+public class BarChartData<T extends BaseDataSet> extends ChartData<T> {\r
+\r
+    private static final long serialVersionUID = 9057475640743455047L;\r
+\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/BarChartOptions.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/BarChartOptions.java
new file mode 100644 (file)
index 0000000..6616f2a
--- /dev/null
@@ -0,0 +1,157 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides options, that are available for {@link Bar}.\r
+ */\r
+public class BarChartOptions extends ChartOptions {\r
+\r
+    private static final long serialVersionUID = -5356780831848556616L;\r
+\r
+    /**\r
+     * Whether to show horizontal lines (except X axis).\r
+     */\r
+    private Boolean scaleShowHorizontalLines = true;\r
+\r
+    /**\r
+     * Whether to show vertical lines (except Y axis).\r
+     */\r
+    private Boolean scaleShowVerticalLines = true;\r
+\r
+    /**\r
+     * A legend template.\r
+     */\r
+    private String legendTemplate = "<ul class=\"<%=name.toLowerCase()%>-legend\">"\r
+            + "<% for (var i=0; i<datasets.length; i++){%><li>"\r
+            + "<span style=\"background-color:<%=datasets[i].fillColor%>\"></span>"\r
+            + "<%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>";\r
+\r
+    /**\r
+     * The bar show stroke.\r
+     */\r
+    private Boolean barShowStroke;\r
+\r
+    /**\r
+     * The bar stroke width.\r
+     */\r
+    private Integer barStrokeWidth;\r
+\r
+    /** The bar value spacing. */\r
+    private Integer barValueSpacing;\r
+\r
+    /** The bar dataset spacing. */\r
+    private Integer barDatasetSpacing;\r
+\r
+    public Boolean getScaleShowHorizontalLines() {\r
+        return scaleShowHorizontalLines;\r
+    }\r
+\r
+    public void setScaleShowHorizontalLines(final Boolean scaleShowHorizontalLines) {\r
+        this.scaleShowHorizontalLines = scaleShowHorizontalLines;\r
+    }\r
+\r
+    public Boolean getScaleShowVerticalLines() {\r
+        return scaleShowVerticalLines;\r
+    }\r
+\r
+    public void setScaleShowVerticalLines(final Boolean scaleShowVerticalLines) {\r
+        this.scaleShowVerticalLines = scaleShowVerticalLines;\r
+    }\r
+\r
+    public String getLegendTemplate() {\r
+        return legendTemplate;\r
+    }\r
+\r
+    public void setLegendTemplate(final String legendTemplate) {\r
+        this.legendTemplate = legendTemplate;\r
+    }\r
+\r
+    /**\r
+     * Gets the bar show stroke.\r
+     *\r
+     * @return the bar show stroke\r
+     */\r
+    public Boolean getBarShowStroke() {\r
+        return barShowStroke;\r
+    }\r
+\r
+    /**\r
+     * Sets the bar show stroke.\r
+     *\r
+     * @param barShowStroke the new bar show stroke (default is true).\r
+     */\r
+    public void setBarShowStroke(final Boolean barShowStroke) {\r
+        this.barShowStroke = barShowStroke;\r
+    }\r
+\r
+    /**\r
+     * Gets the bar stroke width.\r
+     *\r
+     * @return the bar stroke width\r
+     */\r
+    public Integer getBarStrokeWidth() {\r
+        return barStrokeWidth;\r
+    }\r
+\r
+    /**\r
+     * Sets the bar stroke width.\r
+     *\r
+     * @param barStrokeWidth the new bar stroke width (default is 2).\r
+     */\r
+    public void setBarStrokeWidth(final Integer barStrokeWidth) {\r
+        this.barStrokeWidth = barStrokeWidth;\r
+    }\r
+\r
+    /**\r
+     * Gets the bar value spacing.\r
+     *\r
+     * @return the bar value spacing\r
+     */\r
+    public Integer getBarValueSpacing() {\r
+        return barValueSpacing;\r
+    }\r
+\r
+    /**\r
+     * Sets the bar value spacing.\r
+     *\r
+     * @param barValueSpacing the spacing between each of the X value sets (default is 5)\r
+     */\r
+    public void setBarValueSpacing(final Integer barValueSpacing) {\r
+        this.barValueSpacing = barValueSpacing;\r
+    }\r
+\r
+    /**\r
+     * Gets the bar dataset spacing.\r
+     *\r
+     * @return the bar dataset spacing\r
+     */\r
+    public Integer getBarDatasetSpacing() {\r
+        return barDatasetSpacing;\r
+    }\r
+\r
+    /**\r
+     * Sets the bar dataset spacing.\r
+     *\r
+     * @param barDatasetSpacing the spacing between data sets within X values (default is 1).\r
+     */\r
+    public void setBarDatasetSpacing(final Integer barDatasetSpacing) {\r
+        this.barDatasetSpacing = barDatasetSpacing;\r
+    }\r
+}\r
@@ -1,46 +1,48 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.apache.syncope.client.console.widgets;
-
-import com.pingunaut.wicket.chartjs.data.DoughnutChartData;
-
-public class LabeledDoughnutChartData extends DoughnutChartData {
-
-    private static final long serialVersionUID = -660949108690472467L;
-
-    private String label;
-
-    public LabeledDoughnutChartData(final Integer value, final String color) {
-        super(value, color);
-    }
-
-    public LabeledDoughnutChartData(final Integer value, final String color, final String label) {
-        super(value, color);
-        this.label = label;
-    }
-
-    public String getLabel() {
-        return label;
-    }
-
-    public void setLabel(final String label) {
-        this.label = label;
-    }
-
-}
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import java.util.List;\r
+\r
+/**\r
+ * Provides all information needed for {@link BarChartData}.\r
+ */\r
+public class BarDataSet extends BaseDataSet {\r
+\r
+    private static final long serialVersionUID = 3095383371272813559L;\r
+\r
+    private String label;\r
+\r
+    /**\r
+     * Instantiates a new bar data set.\r
+     *\r
+     * @param data the values\r
+     */\r
+    public BarDataSet(final List<? extends Number> data) {\r
+        super(data);\r
+    }\r
+\r
+    public String getLabel() {\r
+        return label;\r
+    }\r
+\r
+    public void setLabel(final String label) {\r
+        this.label = label;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/BaseDataSet.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/BaseDataSet.java
new file mode 100644 (file)
index 0000000..f4cbba8
--- /dev/null
@@ -0,0 +1,93 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import java.io.Serializable;\r
+import java.util.List;\r
+\r
+/**\r
+ * Provides the simplest kind of a dataset.\r
+ * Besides the list of data itself, it contains default values for fill - and stroke color.\r
+ */\r
+public abstract class BaseDataSet implements Serializable {\r
+\r
+    private static final long serialVersionUID = 1581171902504828797L;\r
+\r
+    /** The fill color. */\r
+    private String fillColor = "rgba(220,220,220,0.5)";\r
+\r
+    /** The stroke color. */\r
+    private String strokeColor = "rgba(220,220,220,1)";\r
+\r
+    /** The data. */\r
+    private final List<? extends Number> data;\r
+\r
+    /**\r
+     * Instantiates a new abstract base data set.\r
+     *\r
+     * @param data the data values\r
+     */\r
+    public BaseDataSet(final List<? extends Number> data) {\r
+        this.data = data;\r
+    }\r
+\r
+    /**\r
+     * Gets the fill color.\r
+     *\r
+     * @return the fill color\r
+     */\r
+    public String getFillColor() {\r
+        return fillColor;\r
+    }\r
+\r
+    /**\r
+     * Sets the fill color.\r
+     *\r
+     * @param fillColor the fill color\r
+     * @return the abstract base data set\r
+     */\r
+    public BaseDataSet setFillColor(final String fillColor) {\r
+        this.fillColor = fillColor;\r
+        return this;\r
+    }\r
+\r
+    /**\r
+     * Gets the stroke color.\r
+     *\r
+     * @return the stroke color\r
+     */\r
+    public String getStrokeColor() {\r
+        return strokeColor;\r
+    }\r
+\r
+    /**\r
+     * Sets the stroke color.\r
+     *\r
+     * @param strokeColor the stroke color\r
+     * @return the abstract base data set\r
+     */\r
+    public BaseDataSet setStrokeColor(final String strokeColor) {\r
+        this.strokeColor = strokeColor;\r
+        return this;\r
+    }\r
+\r
+    public List<? extends Number> getData() {\r
+        return data;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Chart.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Chart.java
new file mode 100644 (file)
index 0000000..435b6dd
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.syncope.client.console.chartjs;
+
+import java.io.Serializable;
+
+/**
+ * Provides chart options and a pojo-json mapper to communicate with javascript.
+ *
+ * @param <O> the generic type of options
+ */
+public abstract class Chart<O extends ChartOptions> implements Serializable {
+
+    private static final long serialVersionUID = 4733939203616971674L;
+
+    /** The options. */
+    protected O options;
+
+    public O getOptions() {
+        return options;
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartData.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartData.java
new file mode 100644 (file)
index 0000000..33510c9
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+/**\r
+ * Provides labels and datasets.\r
+ *\r
+ * @param <T> the dataset type\r
+ */\r
+abstract class ChartData<T extends BaseDataSet> implements Serializable {\r
+\r
+    private static final long serialVersionUID = -5230056951310645070L;\r
+\r
+    /** The labels. */\r
+    private final List<String> labels = new ArrayList<>();\r
+\r
+    /** The datasets. */\r
+    private final List<T> datasets = new ArrayList<>();\r
+\r
+    public List<String> getLabels() {\r
+        return labels;\r
+    }\r
+\r
+    public List<T> getDatasets() {\r
+        return datasets;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartJSBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartJSBehavior.java
new file mode 100644 (file)
index 0000000..5ca88cb
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.syncope.client.console.chartjs;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+
+/**
+ * Builds the bridge between wicket and chart.js' javascript.
+ */
+public class ChartJSBehavior extends AbstractDefaultAjaxBehavior {
+
+    private static final long serialVersionUID = 5935294904099227859L;
+
+    @Override
+    protected void respond(final AjaxRequestTarget target) {
+    }
+
+    @Override
+    public void renderHead(final Component component, final IHeaderResponse response) {
+        super.renderHead(component, response);
+
+        response.render(OnDomReadyHeaderItem.forScript(
+                "WicketCharts['" + component.getMarkupId() + "']=buildChart('" + component.getMarkupId() + "');"));
+
+        if (component.getParent() instanceof ChartJSPanel) {
+            response.render(OnDomReadyHeaderItem.forScript(((ChartJSPanel) component.getParent()).generateChart()));
+        }
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartJSPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartJSPanel.java
new file mode 100644 (file)
index 0000000..a06c6c3
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.syncope.client.console.chartjs;
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ChartJSPanel extends Panel {
+
+    private static final long serialVersionUID = -3844680585650585253L;
+
+    private static final Logger LOG = LoggerFactory.getLogger(ChartJSPanel.class);
+
+    private static final ObjectMapper MAPPER = new ObjectMapper().setSerializationInclusion(Include.NON_NULL);
+
+    private final IModel<? extends Chart<?>> model;
+
+    private final WebMarkupContainer container;
+
+    public ChartJSPanel(
+            final String id,
+            final IModel<? extends Chart<?>> model) {
+
+        super(id, model);
+
+        this.model = model;
+        this.container = new WebMarkupContainer("chart");
+    }
+
+    @Override
+    protected void onInitialize() {
+        super.onInitialize();
+        add(container);
+        container.setOutputMarkupId(true);
+        container.add(new ChartJSBehavior());
+    }
+
+    public Chart<?> getChart() {
+        return model.getObject();
+    }
+
+    public String generateChart() {
+        String dataString = null;
+        String optionString = null;
+        try {
+            Object data = (model.getObject() instanceof SimpleChart)
+                    ? ((SimpleChart) model.getObject()).getData()
+                    : ((DataSetChart) model.getObject()).getData();
+            dataString = MAPPER.writeValueAsString(data);
+            optionString = MAPPER.writeValueAsString(model.getObject().getOptions());
+        } catch (JsonProcessingException e) {
+            LOG.error("Unexpected error during JSON serialization", e);
+        }
+
+        return "var " + container.getMarkupId() + " = WicketCharts['" + container.getMarkupId() + "']."
+                + model.getObject().getClass().getSimpleName() + "(" + dataString + ", " + optionString + ");";
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartOptions.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/ChartOptions.java
new file mode 100644 (file)
index 0000000..942f683
--- /dev/null
@@ -0,0 +1,641 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import com.fasterxml.jackson.annotation.JsonRawValue;\r
+\r
+import java.io.Serializable;\r
+\r
+/**\r
+ * Provides some basic options, that are available for all kinds of charts.\r
+ */\r
+public abstract class ChartOptions implements Serializable {\r
+\r
+    private static final long serialVersionUID = 2401861279216541412L;\r
+\r
+    /** The animation. */\r
+    private Boolean animation;\r
+\r
+    /** The animation steps. */\r
+    private Integer animationSteps;\r
+\r
+    /** The animation easing. */\r
+    private String animationEasing;\r
+\r
+    /** The on animation complete. */\r
+    private String onAnimationComplete;\r
+\r
+    @JsonRawValue\r
+    private String customTooltips;\r
+\r
+    private Boolean showScale;\r
+\r
+    /** The scale override. */\r
+    private Boolean scaleOverride;\r
+\r
+    // ** The next three are required if scaleOverride is true **\r
+    /** The scale steps. */\r
+    private Integer scaleSteps;\r
+\r
+    /** The scale step width. */\r
+    private Integer scaleStepWidth;\r
+\r
+    /** The scale start value. */\r
+    private Integer scaleStartValue;\r
+\r
+    /** The scale line color. */\r
+    private String scaleLineColor;\r
+\r
+    /** The scale line width. */\r
+    private Integer scaleLineWidth;\r
+\r
+    /** The scale show labels. */\r
+    private Boolean scaleShowLabels;\r
+\r
+    /** The scale label. */\r
+    private String scaleLabel;\r
+\r
+    /** The scale font family. */\r
+    private String scaleFontFamily;\r
+\r
+    /** The scale font size. */\r
+    private Integer scaleFontSize;\r
+\r
+    /** The scale font style. */\r
+    private String scaleFontStyle;\r
+\r
+    /** The scale font color. */\r
+    private String scaleFontColor;\r
+\r
+    private Boolean scaleIntegersOnly;\r
+\r
+    private Boolean scaleBeginAtZero;\r
+\r
+    private Boolean responsive;\r
+\r
+    private Boolean maintainAspectRatio;\r
+\r
+    private Boolean showTooltips;\r
+\r
+    private String[] tooltipEvents = new String[] { "mousemove", "touchstart", "touchmove" };\r
+\r
+    private String tooltipFillColor;\r
+\r
+    private String tooltipFontFamily;\r
+\r
+    private Integer tooltipFontSize;\r
+\r
+    private String tooltipFontStyle;\r
+\r
+    private String tooltipFontColor;\r
+\r
+    private String tooltipTitleFontFamily;\r
+\r
+    private Integer tooltipTitleFontSize;\r
+\r
+    private String tooltipTitleFontStyle;\r
+\r
+    private String tooltipTitleFontColor;\r
+\r
+    private Integer tooltipYPadding;\r
+\r
+    private Integer tooltipXPadding;\r
+\r
+    private Integer tooltipCaretSize;\r
+\r
+    private Integer tooltipCornerRadius;\r
+\r
+    private Integer tooltipXOffset;\r
+\r
+    private String tooltipTemplate;\r
+\r
+    private String multiTooltipTemplate;\r
+\r
+    @JsonRawValue\r
+    private String onAnimationProgress;\r
+\r
+    public String getCustomTooltips() {\r
+        return customTooltips;\r
+    }\r
+\r
+    public void setCustomTooltips(final String customTooltips) {\r
+        this.customTooltips = customTooltips;\r
+    }\r
+\r
+    /**\r
+     * Gets the animation.\r
+     *\r
+     * @return the animation\r
+     */\r
+    public Boolean getAnimation() {\r
+        return animation;\r
+    }\r
+\r
+    /**\r
+     * Sets the animation.\r
+     *\r
+     * @param animation decides whether to animate the chart (default is true)\r
+     */\r
+    public void setAnimation(final Boolean animation) {\r
+        this.animation = animation;\r
+    }\r
+\r
+    /**\r
+     * Gets the animation steps.\r
+     *\r
+     * @return the animation steps\r
+     */\r
+    public Integer getAnimationSteps() {\r
+        return animationSteps;\r
+    }\r
+\r
+    /**\r
+     * Sets the animation steps.\r
+     *\r
+     * @param animationSteps the number of animation steps (default is 60)\r
+     */\r
+    public void setAnimationSteps(final Integer animationSteps) {\r
+        this.animationSteps = animationSteps;\r
+    }\r
+\r
+    /**\r
+     * Gets the animation easing.\r
+     *\r
+     * @return the animation easing\r
+     */\r
+    public String getAnimationEasing() {\r
+        return animationEasing;\r
+    }\r
+\r
+    /**\r
+     * Sets the animation easing.\r
+     *\r
+     * @param animationEasing the animation easing effect (default is "easeOutQuart")\r
+     */\r
+    public void setAnimationEasing(final String animationEasing) {\r
+        this.animationEasing = animationEasing;\r
+    }\r
+\r
+    /**\r
+     * Gets the javascript function that fires on animation complete.\r
+     *\r
+     * @return the onAnimationComplete javascript function\r
+     */\r
+    public String getOnAnimationComplete() {\r
+        return onAnimationComplete;\r
+    }\r
+\r
+    /**\r
+     * Sets the onAnimationComplete javascript function.\r
+     *\r
+     * @param onAnimationComplete a function, that fires when the animation is complete\r
+     */\r
+    public void setOnAnimationComplete(final String onAnimationComplete) {\r
+        this.onAnimationComplete = onAnimationComplete;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale override.\r
+     *\r
+     * @return the scale override\r
+     */\r
+    public Boolean getScaleOverride() {\r
+        return scaleOverride;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale override.\r
+     *\r
+     * @param scaleOverride decides if you want to override with a hard coded scale\r
+     */\r
+    public void setScaleOverride(final Boolean scaleOverride) {\r
+        this.scaleOverride = scaleOverride;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale steps.\r
+     *\r
+     * @return the scale steps\r
+     */\r
+    public Integer getScaleSteps() {\r
+        return scaleSteps;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale steps.\r
+     *\r
+     * @param scaleSteps the number of steps in a hard coded scale (required if scaleOverride == true, default is null).\r
+     */\r
+    public void setScaleSteps(final Integer scaleSteps) {\r
+        this.scaleSteps = scaleSteps;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale step width.\r
+     *\r
+     * @return the scale step width\r
+     */\r
+    public Integer getScaleStepWidth() {\r
+        return scaleStepWidth;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale step width.\r
+     *\r
+     * @param scaleStepWidth the value jump in the hard coded scale (required if scaleOverride == true, default is\r
+     * null).\r
+     */\r
+    public void setScaleStepWidth(final Integer scaleStepWidth) {\r
+        this.scaleStepWidth = scaleStepWidth;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale start value.\r
+     *\r
+     * @return the scale start value\r
+     */\r
+    public Integer getScaleStartValue() {\r
+        return scaleStartValue;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale start value.\r
+     *\r
+     * @param scaleStartValue the scale starting value (required if scaleOverride == true, default is null).\r
+     */\r
+    public void setScaleStartValue(final Integer scaleStartValue) {\r
+        this.scaleStartValue = scaleStartValue;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale line color.\r
+     *\r
+     * @return the scale line color\r
+     */\r
+    public String getScaleLineColor() {\r
+        return scaleLineColor;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale line color.\r
+     *\r
+     * @param scaleLineColor\r
+     * color of the scale line\r
+     */\r
+    public void setScaleLineColor(final String scaleLineColor) {\r
+        this.scaleLineColor = scaleLineColor;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale line width.\r
+     *\r
+     * @return the scale line width\r
+     */\r
+    public Integer getScaleLineWidth() {\r
+        return scaleLineWidth;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale line width.\r
+     *\r
+     * @param scaleLineWidth the pixel width of the scale line\r
+     */\r
+    public void setScaleLineWidth(final Integer scaleLineWidth) {\r
+        this.scaleLineWidth = scaleLineWidth;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale show labels.\r
+     *\r
+     * @return the scale show labels\r
+     */\r
+    public Boolean getScaleShowLabels() {\r
+        return scaleShowLabels;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale show labels.\r
+     *\r
+     * @param scaleShowLabels decides whether to show labels on the scale\r
+     */\r
+    public void setScaleShowLabels(final Boolean scaleShowLabels) {\r
+        this.scaleShowLabels = scaleShowLabels;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale label.\r
+     *\r
+     * @return the scale label\r
+     */\r
+    public String getScaleLabel() {\r
+        return scaleLabel;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale label.\r
+     *\r
+     * @param scaleLabel an interpolated js string that can access value.\r
+     */\r
+    public void setScaleLabel(final String scaleLabel) {\r
+        this.scaleLabel = scaleLabel;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale font family.\r
+     *\r
+     * @return the scale font family\r
+     */\r
+    public String getScaleFontFamily() {\r
+        return scaleFontFamily;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale font family.\r
+     *\r
+     * @param scaleFontFamily scale label font declaration for the scale label (default is\r
+     * "'Arial'").\r
+     */\r
+    public void setScaleFontFamily(final String scaleFontFamily) {\r
+        this.scaleFontFamily = scaleFontFamily;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale font size.\r
+     *\r
+     * @return the scale font size\r
+     */\r
+    public Integer getScaleFontSize() {\r
+        return scaleFontSize;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale font size.\r
+     *\r
+     * @param scaleFontSize the scale label font size in pixels\r
+     */\r
+    public void setScaleFontSize(final Integer scaleFontSize) {\r
+        this.scaleFontSize = scaleFontSize;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale font style.\r
+     *\r
+     * @return the scale font style\r
+     */\r
+    public String getScaleFontStyle() {\r
+        return scaleFontStyle;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale font style.\r
+     *\r
+     * @param scaleFontStyle the scale label font weight style (default is "normal").\r
+     */\r
+    public void setScaleFontStyle(final String scaleFontStyle) {\r
+        this.scaleFontStyle = scaleFontStyle;\r
+    }\r
+\r
+    /**\r
+     * Gets the scale font color.\r
+     *\r
+     * @return the scale font color\r
+     */\r
+    public String getScaleFontColor() {\r
+        return scaleFontColor;\r
+    }\r
+\r
+    /**\r
+     * Sets the scale font color.\r
+     *\r
+     * @param scaleFontColor the scale label font color (default is "#666").\r
+     */\r
+    public void setScaleFontColor(final String scaleFontColor) {\r
+        this.scaleFontColor = scaleFontColor;\r
+    }\r
+\r
+    public Boolean getShowScale() {\r
+        return showScale;\r
+    }\r
+\r
+    public void setShowScale(final Boolean showScale) {\r
+        this.showScale = showScale;\r
+    }\r
+\r
+    public Boolean getScaleIntegersOnly() {\r
+        return scaleIntegersOnly;\r
+    }\r
+\r
+    public void setScaleIntegersOnly(final Boolean scaleIntegersOnly) {\r
+        this.scaleIntegersOnly = scaleIntegersOnly;\r
+    }\r
+\r
+    public Boolean getScaleBeginAtZero() {\r
+        return scaleBeginAtZero;\r
+    }\r
+\r
+    public void setScaleBeginAtZero(final Boolean scaleBeginAtZero) {\r
+        this.scaleBeginAtZero = scaleBeginAtZero;\r
+    }\r
+\r
+    public Boolean getResponsive() {\r
+        return responsive;\r
+    }\r
+\r
+    public void setResponsive(final Boolean responsive) {\r
+        this.responsive = responsive;\r
+    }\r
+\r
+    public Boolean getMaintainAspectRatio() {\r
+        return maintainAspectRatio;\r
+    }\r
+\r
+    public void setMaintainAspectRatio(final Boolean maintainAspectRatio) {\r
+        this.maintainAspectRatio = maintainAspectRatio;\r
+    }\r
+\r
+    public Boolean getShowTooltips() {\r
+        return showTooltips;\r
+    }\r
+\r
+    public void setShowTooltips(final Boolean showTooltips) {\r
+        this.showTooltips = showTooltips;\r
+    }\r
+\r
+    public String[] getTooltipEvents() {\r
+        return tooltipEvents;\r
+    }\r
+\r
+    public void setTooltipEvents(final String[] tooltipEvents) {\r
+        this.tooltipEvents = tooltipEvents;\r
+    }\r
+\r
+    public String getTooltipFillColor() {\r
+        return tooltipFillColor;\r
+    }\r
+\r
+    public void setTooltipFillColor(final String tooltipFillColor) {\r
+        this.tooltipFillColor = tooltipFillColor;\r
+    }\r
+\r
+    public String getTooltipFontFamily() {\r
+        return tooltipFontFamily;\r
+    }\r
+\r
+    public void setTooltipFontFamily(final String tooltipFontFamily) {\r
+        this.tooltipFontFamily = tooltipFontFamily;\r
+    }\r
+\r
+    public Integer getTooltipFontSize() {\r
+        return tooltipFontSize;\r
+    }\r
+\r
+    public void setTooltipFontSize(final Integer tooltipFontSize) {\r
+        this.tooltipFontSize = tooltipFontSize;\r
+    }\r
+\r
+    public String getTooltipFontStyle() {\r
+        return tooltipFontStyle;\r
+    }\r
+\r
+    public void setTooltipFontStyle(final String tooltipFontStyle) {\r
+        this.tooltipFontStyle = tooltipFontStyle;\r
+    }\r
+\r
+    public String getTooltipFontColor() {\r
+        return tooltipFontColor;\r
+    }\r
+\r
+    public void setTooltipFontColor(final String tooltipFontColor) {\r
+        this.tooltipFontColor = tooltipFontColor;\r
+    }\r
+\r
+    public String getTooltipTitleFontFamily() {\r
+        return tooltipTitleFontFamily;\r
+    }\r
+\r
+    public void setTooltipTitleFontFamily(final String tooltipTitleFontFamily) {\r
+        this.tooltipTitleFontFamily = tooltipTitleFontFamily;\r
+    }\r
+\r
+    public Integer getTooltipTitleFontSize() {\r
+        return tooltipTitleFontSize;\r
+    }\r
+\r
+    public void setTooltipTitleFontSize(final Integer tooltipTitleFontSize) {\r
+        this.tooltipTitleFontSize = tooltipTitleFontSize;\r
+    }\r
+\r
+    public String getTooltipTitleFontStyle() {\r
+        return tooltipTitleFontStyle;\r
+    }\r
+\r
+    public void setTooltipTitleFontStyle(final String tooltipTitleFontStyle) {\r
+        this.tooltipTitleFontStyle = tooltipTitleFontStyle;\r
+    }\r
+\r
+    public String getTooltipTitleFontColor() {\r
+        return tooltipTitleFontColor;\r
+    }\r
+\r
+    public void setTooltipTitleFontColor(final String tooltipTitleFontColor) {\r
+        this.tooltipTitleFontColor = tooltipTitleFontColor;\r
+    }\r
+\r
+    public Integer getTooltipYPadding() {\r
+        return tooltipYPadding;\r
+    }\r
+\r
+    public void setTooltipYPadding(final Integer tooltipYPadding) {\r
+        this.tooltipYPadding = tooltipYPadding;\r
+    }\r
+\r
+    public Integer getTooltipXPadding() {\r
+        return tooltipXPadding;\r
+    }\r
+\r
+    public void setTooltipXPadding(final Integer tooltipXPadding) {\r
+        this.tooltipXPadding = tooltipXPadding;\r
+    }\r
+\r
+    public Integer getTooltipCaretSize() {\r
+        return tooltipCaretSize;\r
+    }\r
+\r
+    public void setTooltipCaretSize(final Integer tooltipCaretSize) {\r
+        this.tooltipCaretSize = tooltipCaretSize;\r
+    }\r
+\r
+    public Integer getTooltipCornerRadius() {\r
+        return tooltipCornerRadius;\r
+    }\r
+\r
+    public void setTooltipCornerRadius(final Integer tooltipCornerRadius) {\r
+        this.tooltipCornerRadius = tooltipCornerRadius;\r
+    }\r
+\r
+    public Integer getTooltipXOffset() {\r
+        return tooltipXOffset;\r
+    }\r
+\r
+    public void setTooltipXOffset(final Integer tooltipXOffset) {\r
+        this.tooltipXOffset = tooltipXOffset;\r
+    }\r
+\r
+    public String getTooltipTemplate() {\r
+        return tooltipTemplate;\r
+    }\r
+\r
+    public void setTooltipTemplate(final String tooltipTemplate) {\r
+        this.tooltipTemplate = tooltipTemplate;\r
+    }\r
+\r
+    public String getMultiTooltipTemplate() {\r
+        return multiTooltipTemplate;\r
+    }\r
+\r
+    public void setMultiTooltipTemplate(final String multiTooltipTemplate) {\r
+        this.multiTooltipTemplate = multiTooltipTemplate;\r
+    }\r
+\r
+    public String getOnAnimationProgress() {\r
+        return onAnimationProgress;\r
+    }\r
+\r
+    public void setOnAnimationProgress(final String onAnimationProgress) {\r
+        this.onAnimationProgress = onAnimationProgress;\r
+    }\r
+\r
+    /**\r
+     * Tests whether this chart is responsive or not.\r
+     *\r
+     * @return true if its responsive, false otherwise.\r
+     */\r
+    public boolean isResponsive() {\r
+        return responsive;\r
+    }\r
+\r
+    /**\r
+     * Sets the responsive option for this chart.\r
+     *\r
+     * @param responsive the responsive option value.\r
+     */\r
+    public void setResponsive(final boolean responsive) {\r
+        this.responsive = responsive;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DataSetChart.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DataSetChart.java
new file mode 100644 (file)
index 0000000..cc4d896
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides chart data and options.\r
+ *\r
+ * @param <D> the generic type of chart data\r
+ * @param <O> the generic type of chart options\r
+ * @param <S> the generic type of a chart data set\r
+ */\r
+abstract class DataSetChart<\r
+        D extends ChartData<S>, O extends ChartOptions, S extends BaseDataSet>\r
+        extends Chart<O> {\r
+\r
+    private static final long serialVersionUID = 999846601210465414L;\r
+\r
+    /** The data. */\r
+    protected D data;\r
+\r
+    public D getData() {\r
+        return data;\r
+    }\r
+\r
+    public void setData(final D data) {\r
+        this.data = data;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Doughnut.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Doughnut.java
new file mode 100644 (file)
index 0000000..6121093
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+/**\r
+ * Provides a simple implementation of chart.js doughnut chart.\r
+ *\r
+ * @see <a href="http://www.chartjs.org/docs/#doughnutChart">chart.js docs</a>\r
+ */\r
+public class Doughnut extends SimpleChart<DoughnutChartData, DoughnutChartOptions> implements Serializable {\r
+\r
+    private static final long serialVersionUID = -6898362145345731457L;\r
+\r
+    @Override\r
+    public DoughnutChartOptions getOptions() {\r
+        if (options == null) {\r
+            options = new DoughnutChartOptions();\r
+        }\r
+        return options;\r
+    }\r
+\r
+    @Override\r
+    public List<DoughnutChartData> getData() {\r
+        if (data == null) {\r
+            data = new ArrayList<>();\r
+        }\r
+        return data;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutChartData.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutChartData.java
new file mode 100644 (file)
index 0000000..5403785
--- /dev/null
@@ -0,0 +1,52 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides chart data used by doughnut charts.\r
+ */\r
+public class DoughnutChartData extends SimpleColorValueChartData {\r
+\r
+    private static final long serialVersionUID = -5122104387810776812L;\r
+\r
+    private String label;\r
+\r
+    /**\r
+     * Instantiates a new doughnut chart data.\r
+     *\r
+     * @param value the value\r
+     * @param color the color\r
+     */\r
+    public DoughnutChartData(final Integer value, final String color) {\r
+        super(value, color);\r
+    }\r
+\r
+    public DoughnutChartData(final Number value, final String color, final String label) {\r
+        super(value, color);\r
+        this.label = label;\r
+    }\r
+\r
+    public String getLabel() {\r
+        return label;\r
+    }\r
+\r
+    public void setLabel(final String label) {\r
+        this.label = label;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutChartOptions.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutChartOptions.java
new file mode 100644 (file)
index 0000000..b72dafb
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides options, that are available for {@link Doughnut}.\r
+ */\r
+public class DoughnutChartOptions extends PieChartOptions {\r
+\r
+    private static final long serialVersionUID = -5356780831848556616L;\r
+\r
+    /** The percentage inner cutout. */\r
+    private Integer percentageInnerCutout;\r
+\r
+    /**\r
+     * Gets the percentage inner cutout.\r
+     *\r
+     * @return the percentage inner cutout\r
+     */\r
+    public Integer getPercentageInnerCutout() {\r
+        return percentageInnerCutout;\r
+    }\r
+\r
+    /**\r
+     * Sets the percentage inner cutout.\r
+     *\r
+     * @param percentageInnerCutout the percentage of the chart that we cut out of the middle (default is 50).\r
+     */\r
+    public void setPercentageInnerCutout(final Integer percentageInnerCutout) {\r
+        this.percentageInnerCutout = percentageInnerCutout;\r
+    }\r
+\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutDataSet.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/DoughnutDataSet.java
new file mode 100644 (file)
index 0000000..ab46485
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.syncope.client.console.chartjs;
+
+import java.util.List;
+
+/**
+ * Provides all information needed for {@link DoughnutChartData}.
+ */
+public class DoughnutDataSet extends BaseDataSet {
+
+    private static final long serialVersionUID = 3095383371272813559L;
+
+    /**
+     * Instantiates a new bar data set.
+     *
+     * @param data the values
+     */
+    public DoughnutDataSet(final List<? extends Number> data) {
+        super(data);
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Line.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/Line.java
new file mode 100644 (file)
index 0000000..9af958a
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.syncope.client.console.chartjs;
+
+public class Line extends DataSetChart<LineChartData<LineDataSet>, LineChartOptions, LineDataSet> {
+
+    private static final long serialVersionUID = -2467327116468783154L;
+
+    @Override
+    public LineChartOptions getOptions() {
+        if (options == null) {
+            options = new LineChartOptions();
+        }
+        return options;
+    }
+
+    @Override
+    public LineChartData<LineDataSet> getData() {
+        if (data == null) {
+            data = new LineChartData<>();
+        }
+        return data;
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/LineChartData.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/LineChartData.java
new file mode 100644 (file)
index 0000000..f8617d2
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides chart data used by line charts.\r
+ *\r
+ * @param <T> the generic type of it's dataset\r
+ */\r
+public class LineChartData<T extends PointColorDataSet> extends ChartData<T> {\r
+\r
+    private static final long serialVersionUID = 9057475640743455047L;\r
+\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/LineChartOptions.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/LineChartOptions.java
new file mode 100644 (file)
index 0000000..1aa8246
--- /dev/null
@@ -0,0 +1,227 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+/**\r
+ * Provides options for {@link Line}.\r
+ */\r
+public class LineChartOptions extends ChartOptions {\r
+\r
+    private static final long serialVersionUID = -5356780831848556616L;\r
+\r
+    private Boolean scaleShowHorizontalLines = true;\r
+\r
+    private Boolean scaleShowVerticalLines = true;\r
+\r
+    private Double bezierCurveTension = 0.4;\r
+\r
+    private Integer pointHitDetectionRadius = 20;\r
+\r
+    private String legendTemplate = "<ul class=\"<%=name.toLowerCase()%>-legend\">"\r
+            + "<% for (var i=0; i<datasets.length; i++){%><li>"\r
+            + "<span style=\"background-color:<%=datasets[i].strokeColor%>\"></span>"\r
+            + "<%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>";\r
+\r
+    /** The bezier curve. */\r
+    private Boolean bezierCurve;\r
+\r
+    /** The point dot. */\r
+    private Boolean pointDot;\r
+\r
+    /** The point dot radius. */\r
+    private Integer pointDotRadius;\r
+\r
+    /** The point dot stroke width. */\r
+    private Integer pointDotStrokeWidth;\r
+\r
+    /** The dataset stroke. */\r
+    private Boolean datasetStroke;\r
+\r
+    /** The dataset stroke width. */\r
+    private Integer datasetStrokeWidth;\r
+\r
+    /** The dataset fill. */\r
+    private Boolean datasetFill;\r
+\r
+    public Boolean getScaleShowHorizontalLines() {\r
+        return scaleShowHorizontalLines;\r
+    }\r
+\r
+    public void setScaleShowHorizontalLines(final Boolean scaleShowHorizontalLines) {\r
+        this.scaleShowHorizontalLines = scaleShowHorizontalLines;\r
+    }\r
+\r
+    public Boolean getScaleShowVerticalLines() {\r
+        return scaleShowVerticalLines;\r
+    }\r
+\r
+    public void setScaleShowVerticalLines(final Boolean scaleShowVerticalLines) {\r
+        this.scaleShowVerticalLines = scaleShowVerticalLines;\r
+    }\r
+\r
+    public Double getBezierCurveTension() {\r
+        return bezierCurveTension;\r
+    }\r
+\r
+    public void setBezierCurveTension(final Double bezierCurveTension) {\r
+        this.bezierCurveTension = bezierCurveTension;\r
+    }\r
+\r
+    public Integer getPointHitDetectionRadius() {\r
+        return pointHitDetectionRadius;\r
+    }\r
+\r
+    public void setPointHitDetectionRadius(final Integer pointHitDetectionRadius) {\r
+        this.pointHitDetectionRadius = pointHitDetectionRadius;\r
+    }\r
+\r
+    public String getLegendTemplate() {\r
+        return legendTemplate;\r
+    }\r
+\r
+    public void setLegendTemplate(final String legendTemplate) {\r
+        this.legendTemplate = legendTemplate;\r
+    }\r
+\r
+    /**\r
+     * Gets the bezier curve.\r
+     *\r
+     * @return the bezier curve\r
+     */\r
+    public Boolean getBezierCurve() {\r
+        return bezierCurve;\r
+    }\r
+\r
+    /**\r
+     * Sets the bezier curve.\r
+     *\r
+     * @param bezierCurve decides whether the line is curved between points (default is true).\r
+     */\r
+    public void setBezierCurve(final Boolean bezierCurve) {\r
+        this.bezierCurve = bezierCurve;\r
+    }\r
+\r
+    /**\r
+     * Gets the point dot.\r
+     *\r
+     * @return the point dot\r
+     */\r
+    public Boolean getPointDot() {\r
+        return pointDot;\r
+    }\r
+\r
+    /**\r
+     * Sets the point dot.\r
+     *\r
+     * @param pointDot decides whether to show a dot for each point (default is true).\r
+     */\r
+    public void setPointDot(final Boolean pointDot) {\r
+        this.pointDot = pointDot;\r
+    }\r
+\r
+    /**\r
+     * Gets the point dot radius.\r
+     *\r
+     * @return the point dot radius\r
+     */\r
+    public Integer getPointDotRadius() {\r
+        return pointDotRadius;\r
+    }\r
+\r
+    /**\r
+     * Sets the point dot radius.\r
+     *\r
+     * @param pointDotRadius the new point dot radius (default is 3).\r
+     */\r
+    public void setPointDotRadius(final Integer pointDotRadius) {\r
+        this.pointDotRadius = pointDotRadius;\r
+    }\r
+\r
+    /**\r
+     * Gets the point dot stroke width.\r
+     *\r
+     * @return the point dot stroke width\r
+     */\r
+    public Integer getPointDotStrokeWidth() {\r
+        return pointDotStrokeWidth;\r
+    }\r
+\r
+    /**\r
+     * Sets the point dot stroke width.\r
+     *\r
+     * @param pointDotStrokeWidth the new point dot stroke width (default is 1).\r
+     */\r
+    public void setPointDotStrokeWidth(final Integer pointDotStrokeWidth) {\r
+        this.pointDotStrokeWidth = pointDotStrokeWidth;\r
+    }\r
+\r
+    /**\r
+     * Gets the dataset stroke.\r
+     *\r
+     * @return the dataset stroke\r
+     */\r
+    public Boolean getDatasetStroke() {\r
+        return datasetStroke;\r
+    }\r
+\r
+    /**\r
+     * Sets the dataset stroke.\r
+     *\r
+     * @param datasetStroke decides whether to show a stroke for datasets (default is true)\r
+     */\r
+    public void setDatasetStroke(final Boolean datasetStroke) {\r
+        this.datasetStroke = datasetStroke;\r
+    }\r
+\r
+    /**\r
+     * Gets the dataset stroke width.\r
+     *\r
+     * @return the dataset stroke width\r
+     */\r
+    public Integer getDatasetStrokeWidth() {\r
+        return datasetStrokeWidth;\r
+    }\r
+\r
+    /**\r
+     * Sets the dataset stroke width.\r
+     *\r
+     * @param datasetStrokeWidth the new dataset stroke width (default is 2).\r
+     */\r
+    public void setDatasetStrokeWidth(final Integer datasetStrokeWidth) {\r
+        this.datasetStrokeWidth = datasetStrokeWidth;\r
+    }\r
+\r
+    /**\r
+     * Gets the dataset fill.\r
+     *\r
+     * @return the dataset fill\r
+     */\r
+    public Boolean getDatasetFill() {\r
+        return datasetFill;\r
+    }\r
+\r
+    /**\r
+     * Sets the dataset fill.\r
+     *\r
+     * @param datasetFill whether to fill the dataset with a color (default is true)\r
+     */\r
+    public void setDatasetFill(final Boolean datasetFill) {\r
+        this.datasetFill = datasetFill;\r
+    }\r
+}\r
@@ -1,42 +1,43 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.apache.syncope.client.console.widgets;
-
-import com.pingunaut.wicket.chartjs.data.sets.BarDataSet;
-import java.util.List;
-
-public class LabeledBarDataSet extends BarDataSet {
-
-    private static final long serialVersionUID = -6571823370630502272L;
-
-    private String label;
-
-    public LabeledBarDataSet(final List<? extends Number> values) {
-        super(values);
-    }
-
-    public String getLabel() {
-        return label;
-    }
-
-    public void setLabel(final String label) {
-        this.label = label;
-    }
-
-}
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import java.util.List;\r
+\r
+/**\r
+ * Provides all information needed for {@link LineChartData}.\r
+ */\r
+public class LineDataSet extends PointColorDataSet {\r
+\r
+    private static final long serialVersionUID = -3154092519924576329L;\r
+\r
+    private String label;\r
+\r
+    public LineDataSet(final List<? extends Number> data) {\r
+        super(data);\r
+    }\r
+\r
+    public String getLabel() {\r
+        return label;\r
+    }\r
+\r
+    public void setLabel(final String label) {\r
+        this.label = label;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/PieChartOptions.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/PieChartOptions.java
new file mode 100644 (file)
index 0000000..9177d8b
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.syncope.client.console.chartjs;
+
+/**
+ * Provides options, that are available for {@link Pie}.
+ */
+public class PieChartOptions extends ChartOptions {
+
+    private static final long serialVersionUID = -5356780831848556616L;
+
+    /** The segment show stroke. */
+    private Boolean segmentShowStroke;
+
+    /** The segment stroke color. */
+    private String segmentStrokeColor;
+
+    /** The segment stroke width. */
+    private Integer segmentStrokeWidth;
+
+    /** The animate rotate. */
+    private Boolean animateRotate;
+
+    /** The animate scale. */
+    private Boolean animateScale;
+
+    private String legendTemplate = "<ul class=\"<%=name.toLowerCase()%>-legend\">"
+            + "<% for (var i=0; i<segments.length; i++){%><li>"
+            + "<span style=\"background-color:<%=segments[i].fillColor%>\">"
+            + "<%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>";
+
+    public String getLegendTemplate() {
+        return legendTemplate;
+    }
+
+    public void setLegendTemplate(final String legendTemplate) {
+        this.legendTemplate = legendTemplate;
+    }
+
+    /**
+     * Gets the segment show stroke.
+     *
+     * @return the segment show stroke
+     */
+    public Boolean getSegmentShowStroke() {
+        return segmentShowStroke;
+    }
+
+    /**
+     * Sets the segment show stroke.
+     *
+     * @param segmentShowStroke decides whether we should show a stroke on each segment (default is true)
+     */
+    public void setSegmentShowStroke(final Boolean segmentShowStroke) {
+        this.segmentShowStroke = segmentShowStroke;
+    }
+
+    /**
+     * Gets the segment stroke color.
+     *
+     * @return the segment stroke color
+     */
+    public String getSegmentStrokeColor() {
+        return segmentStrokeColor;
+    }
+
+    /**
+     * Sets the segment stroke color.
+     *
+     * @param segmentStrokeColor the new segment stroke color (default is "#fff").
+     */
+    public void setSegmentStrokeColor(final String segmentStrokeColor) {
+        this.segmentStrokeColor = segmentStrokeColor;
+    }
+
+    /**
+     * Gets the segment stroke width.
+     *
+     * @return the segment stroke width
+     */
+    public Integer getSegmentStrokeWidth() {
+        return segmentStrokeWidth;
+    }
+
+    /**
+     * Sets the segment stroke width.
+     *
+     * @param segmentStrokeWidth the new segment stroke width (default is 2).
+     */
+    public void setSegmentStrokeWidth(final Integer segmentStrokeWidth) {
+        this.segmentStrokeWidth = segmentStrokeWidth;
+    }
+
+    /**
+     * Gets the animate rotate.
+     *
+     * @return the animate rotate
+     */
+    public Boolean getAnimateRotate() {
+        return animateRotate;
+    }
+
+    /**
+     * Sets the animate rotate.
+     *
+     * @param animateRotate decides whether we animate the rotation of the pie (default is true).
+     */
+    public void setAnimateRotate(final Boolean animateRotate) {
+        this.animateRotate = animateRotate;
+    }
+
+    /**
+     * Gets the animate scale.
+     *
+     * @return the animate scale
+     */
+    public Boolean getAnimateScale() {
+        return animateScale;
+    }
+
+    /**
+     * Sets the animate scale.
+     *
+     * @param animateScale decides whether we animate scaling the Pie from the center (default is false).
+     */
+    public void setAnimateScale(final Boolean animateScale) {
+        this.animateScale = animateScale;
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/PointColorDataSet.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/PointColorDataSet.java
new file mode 100644 (file)
index 0000000..7d96b21
--- /dev/null
@@ -0,0 +1,80 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import java.util.List;\r
+\r
+/**\r
+ * Provides some additional point color and point stroke color information.\r
+ */\r
+public abstract class PointColorDataSet extends BaseDataSet {\r
+\r
+    private static final long serialVersionUID = 1581171902504828797L;\r
+\r
+    /** The point color. */\r
+    private String pointColor = "rgba(220,220,220,1)";\r
+\r
+    /** The point stroke color. */\r
+    private String pointStrokeColor = "#fff";\r
+\r
+    /**\r
+     * Instantiates a new abstract point color data set.\r
+     *\r
+     * @param data the values\r
+     */\r
+    public PointColorDataSet(final List<? extends Number> data) {\r
+        super(data);\r
+    }\r
+\r
+    /**\r
+     * Gets the point color.\r
+     *\r
+     * @return the point color\r
+     */\r
+    public String getPointColor() {\r
+        return pointColor;\r
+    }\r
+\r
+    /**\r
+     * Sets the point color.\r
+     *\r
+     * @param pointColor the point color\r
+     */\r
+    public void setPointColor(final String pointColor) {\r
+        this.pointColor = pointColor;\r
+    }\r
+\r
+    /**\r
+     * Gets the point stroke color.\r
+     *\r
+     * @return the point stroke color\r
+     */\r
+    public String getPointStrokeColor() {\r
+        return pointStrokeColor;\r
+    }\r
+\r
+    /**\r
+     * Sets the point stroke color.\r
+     *\r
+     * @param pointStrokeColor the point stroke color\r
+     */\r
+    public void setPointStrokeColor(final String pointStrokeColor) {\r
+        this.pointStrokeColor = pointStrokeColor;\r
+    }\r
+}\r
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/SimpleChart.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/SimpleChart.java
new file mode 100644 (file)
index 0000000..9af3f2d
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.syncope.client.console.chartjs;
+
+import java.util.List;
+
+/**
+ * Provides chart data and options.
+ *
+ * @param <D> the generic type of chart data
+ * @param <O> the generic type of chart options
+ */
+public abstract class SimpleChart<D extends SimpleColorValueChartData, O extends ChartOptions> extends Chart<O> {
+
+    private static final long serialVersionUID = 4176838766615656412L;
+
+    /** The data. */
+    protected List<D> data;
+
+    public List<D> getData() {
+        return data;
+    }
+
+    public void setData(final List<D> data) {
+        this.data = data;
+    }
+}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/chartjs/SimpleColorValueChartData.java b/client/console/src/main/java/org/apache/syncope/client/console/chartjs/SimpleColorValueChartData.java
new file mode 100644 (file)
index 0000000..d10744c
--- /dev/null
@@ -0,0 +1,52 @@
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+package org.apache.syncope.client.console.chartjs;\r
+\r
+import java.io.Serializable;\r
+\r
+public class SimpleColorValueChartData implements Serializable {\r
+\r
+    private static final long serialVersionUID = 3049771486746243572L;\r
+\r
+    public SimpleColorValueChartData(final Number value, final String color) {\r
+        this.value = value;\r
+        this.color = color;\r
+    }\r
+\r
+    private Number value;\r
+\r
+    private String color;\r
+\r
+    public String getColor() {\r
+        return color;\r
+    }\r
+\r
+    public void setColor(final String color) {\r
+        this.color = color;\r
+    }\r
+\r
+    public Number getValue() {\r
+        return value;\r
+    }\r
+\r
+    public void setValue(final Integer value) {\r
+        this.value = value;\r
+    }\r
+\r
+}\r
index ce549f4..541252d 100644 (file)
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.client.console.widgets;
 
-import com.pingunaut.wicket.chartjs.chart.impl.Bar;
-import com.pingunaut.wicket.chartjs.core.panel.BarChartPanel;
-import com.pingunaut.wicket.chartjs.data.sets.BarDataSet;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -28,6 +25,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.chartjs.Bar;
+import org.apache.syncope.client.console.chartjs.BarDataSet;
+import org.apache.syncope.client.console.chartjs.ChartJSPanel;
 import org.apache.wicket.model.Model;
 
 public class AnyByRealmWidget extends BaseWidget {
@@ -48,7 +48,7 @@ public class AnyByRealmWidget extends BaseWidget {
 
     private Map<String, Integer> any2ByRealm;
 
-    private final BarChartPanel chart;
+    private final ChartJSPanel chart;
 
     public AnyByRealmWidget(
             final String id,
@@ -68,7 +68,7 @@ public class AnyByRealmWidget extends BaseWidget {
         this.any2ByRealm = any2ByRealm;
         setOutputMarkupId(true);
 
-        chart = new BarChartPanel(
+        chart = new ChartJSPanel(
                 "chart",
                 Model.of(build(usersByRealm, groupsByRealm, anyType1, any1ByRealm, anyType2, any2ByRealm)));
         add(chart);
@@ -101,8 +101,19 @@ public class AnyByRealmWidget extends BaseWidget {
         List<String> realms = new ArrayList<>(realmSet);
         Collections.sort(realms);
 
+        Bar bar = new Bar();
+        bar.getOptions().setScaleBeginAtZero(true);
+        bar.getOptions().setBarShowStroke(true);
+        bar.getOptions().setBarStrokeWidth(2);
+        bar.getOptions().setBarValueSpacing(5);
+        bar.getOptions().setBarDatasetSpacing(1);
+        bar.getOptions().setResponsive(true);
+        bar.getOptions().setMaintainAspectRatio(true);
+        bar.getOptions().setMultiTooltipTemplate("<%= datasetLabel %> - <%= value %>");
+
         for (int i = 0; i < realms.size() && i < MAX_REALMS; i++) {
-            labels.add(StringUtils.prependIfMissing(StringUtils.substringAfterLast(realms.get(i), "/"), "/"));
+            bar.getData().getLabels().add(
+                    StringUtils.prependIfMissing(StringUtils.substringAfterLast(realms.get(i), "/"), "/"));
 
             userValues.add(usersByRealm.get(realms.get(i)));
             groupValues.add(groupsByRealm.get(realms.get(i)));
@@ -114,42 +125,26 @@ public class AnyByRealmWidget extends BaseWidget {
             }
         }
 
-        Bar bar = new Bar();
-        bar.getOptions().setScaleBeginAtZero(true);
-        bar.getOptions().setScaleShowGridLines(true);
-        bar.getOptions().setScaleGridLineWidth(1);
-        bar.getOptions().setBarShowStroke(true);
-        bar.getOptions().setBarStrokeWidth(2);
-        bar.getOptions().setBarValueSpacing(5);
-        bar.getOptions().setBarDatasetSpacing(1);
-        bar.getOptions().setResponsive(true);
-        bar.getOptions().setMaintainAspectRatio(true);
-        bar.getOptions().setMultiTooltipTemplate("<%= datasetLabel %> - <%= value %>");
-
-        bar.getData().setLabels(labels);
-
-        List<BarDataSet> datasets = new ArrayList<>();
-        LabeledBarDataSet userDataSet = new LabeledBarDataSet(userValues);
+        BarDataSet userDataSet = new BarDataSet(userValues);
         userDataSet.setFillColor("orange");
         userDataSet.setLabel(getString("users"));
-        datasets.add(userDataSet);
-        LabeledBarDataSet groupDataSet = new LabeledBarDataSet(groupValues);
+        bar.getData().getDatasets().add(userDataSet);
+        BarDataSet groupDataSet = new BarDataSet(groupValues);
         groupDataSet.setFillColor("red");
         groupDataSet.setLabel(getString("groups"));
-        datasets.add(groupDataSet);
+        bar.getData().getDatasets().add(groupDataSet);
         if (anyType1 != null) {
-            LabeledBarDataSet any1DataSet = new LabeledBarDataSet(any1Values);
+            BarDataSet any1DataSet = new BarDataSet(any1Values);
             any1DataSet.setFillColor("green");
             any1DataSet.setLabel(anyType1);
-            datasets.add(any1DataSet);
+            bar.getData().getDatasets().add(any1DataSet);
         }
         if (anyType2 != null) {
-            LabeledBarDataSet any2DataSet = new LabeledBarDataSet(any2Values);
+            BarDataSet any2DataSet = new BarDataSet(any2Values);
             any2DataSet.setFillColor("aqua");
             any2DataSet.setLabel(anyType2);
-            datasets.add(any2DataSet);
+            bar.getData().getDatasets().add(any2DataSet);
         }
-        bar.getData().setDatasets(datasets);
 
         return bar;
     }
index aee979f..5f26ffd 100644 (file)
  */
 package org.apache.syncope.client.console.widgets;
 
-import com.pingunaut.wicket.chartjs.chart.impl.Doughnut;
-import com.pingunaut.wicket.chartjs.core.panel.DoughnutChartPanel;
 import java.util.Map;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
+import org.apache.syncope.client.console.chartjs.ChartJSPanel;
+import org.apache.syncope.client.console.chartjs.Doughnut;
+import org.apache.syncope.client.console.chartjs.DoughnutChartData;
 import org.apache.syncope.client.console.pages.Notifications;
 import org.apache.syncope.client.console.pages.Policies;
 import org.apache.syncope.client.console.pages.Security;
@@ -43,7 +44,7 @@ public class CompletenessWidget extends BaseWidget {
 
     private Map<String, Boolean> confCompleteness;
 
-    private final DoughnutChartPanel chart;
+    private final ChartJSPanel chart;
 
     private final WebMarkupContainer actions;
 
@@ -66,7 +67,7 @@ public class CompletenessWidget extends BaseWidget {
 
         Pair<Doughnut, Integer> built = build(confCompleteness);
 
-        chart = new DoughnutChartPanel("chart", Model.of(built.getLeft()));
+        chart = new ChartJSPanel("chart", Model.of(built.getLeft()));
         add(chart);
 
         actions = new WebMarkupContainer("actions");
@@ -136,9 +137,9 @@ public class CompletenessWidget extends BaseWidget {
         }
 
         doughnut.getData().add(
-                new LabeledDoughnutChartData(done, "blue", getString("done")));
+                new DoughnutChartData(done, "blue", getString("done")));
         doughnut.getData().add(
-                new LabeledDoughnutChartData(100 - done, "red", getString("todo") + ": " + todo));
+                new DoughnutChartData(100 - done, "red", getString("todo") + ": " + todo));
 
         return Pair.of(doughnut, todo);
     }
index 5a42f24..a06f589 100644 (file)
  */
 package org.apache.syncope.client.console.widgets;
 
-import com.pingunaut.wicket.chartjs.chart.impl.Line;
-import com.pingunaut.wicket.chartjs.core.panel.LineChartPanel;
-import com.pingunaut.wicket.chartjs.data.sets.LineDataSet;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.syncope.client.console.chartjs.ChartJSPanel;
+import org.apache.syncope.client.console.chartjs.Line;
+import org.apache.syncope.client.console.chartjs.LineDataSet;
 import org.apache.syncope.common.lib.info.SystemInfo;
 import org.apache.wicket.model.Model;
 
@@ -31,30 +31,20 @@ public class LoadWidget extends BaseWidget {
 
     private static final long serialVersionUID = -816175678514035085L;
 
-    private final LineChartPanel chart;
+    private final ChartJSPanel chart;
 
     public LoadWidget(final String id, final SystemInfo systeminfo) {
         super(id);
         setOutputMarkupId(true);
 
-        chart = new LineChartPanel("chart", Model.of(build(systeminfo)));
+        chart = new ChartJSPanel("chart", Model.of(build(systeminfo)));
         add(chart);
     }
 
     private Line build(final SystemInfo systeminfo) {
-        List<String> labels = new ArrayList<>();
-
         List<Double> cpuValues = new ArrayList<>();
         List<Long> memValues = new ArrayList<>();
 
-        for (SystemInfo.LoadInstant instant : systeminfo.getLoad()) {
-            labels.add(DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.
-                    format(systeminfo.getStartTime() + instant.getUptime()));
-
-            cpuValues.add(instant.getSystemLoadAverage() * 1000);
-            memValues.add(instant.getTotalMemory());
-        }
-
         Line line = new Line();
         line.getOptions().setPointDot(false);
         line.getOptions().setDatasetFill(false);
@@ -63,21 +53,25 @@ public class LoadWidget extends BaseWidget {
         line.getOptions().setShowScale(false);
         line.getOptions().setMultiTooltipTemplate("<%= datasetLabel %>");
 
-        line.getData().setLabels(labels);
+        for (SystemInfo.LoadInstant instant : systeminfo.getLoad()) {
+            line.getData().getLabels().add(DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.
+                    format(systeminfo.getStartTime() + instant.getUptime()));
+
+            cpuValues.add(instant.getSystemLoadAverage() * 1000);
+            memValues.add(instant.getTotalMemory());
+        }
 
-        List<LineDataSet> datasets = new ArrayList<>();
         LineDataSet cpuDataSet = new LineDataSet(cpuValues);
         cpuDataSet.setLabel("CPU");
         cpuDataSet.setPointColor("purple");
         cpuDataSet.setStrokeColor("purple");
-        datasets.add(cpuDataSet);
+        line.getData().getDatasets().add(cpuDataSet);
 
         LineDataSet memDataSet = new LineDataSet(memValues);
         memDataSet.setLabel("MEM");
         memDataSet.setPointColor("grey");
         memDataSet.setStrokeColor("grey");
-        datasets.add(memDataSet);
-        line.getData().setDatasets(datasets);
+        line.getData().getDatasets().add(memDataSet);
 
         return line;
     }
index e11b5db..c84a640 100644 (file)
  */
 package org.apache.syncope.client.console.widgets;
 
-import com.pingunaut.wicket.chartjs.chart.impl.Doughnut;
-import com.pingunaut.wicket.chartjs.core.panel.DoughnutChartPanel;
 import java.util.Map;
+import org.apache.syncope.client.console.chartjs.ChartJSPanel;
+import org.apache.syncope.client.console.chartjs.Doughnut;
+import org.apache.syncope.client.console.chartjs.DoughnutChartData;
 import org.apache.wicket.model.Model;
 
 public class UsersByStatusWidget extends BaseWidget {
@@ -31,14 +32,14 @@ public class UsersByStatusWidget extends BaseWidget {
 
     private Map<String, Integer> usersByStatus;
 
-    private final DoughnutChartPanel chart;
+    private final ChartJSPanel chart;
 
     public UsersByStatusWidget(final String id, final Map<String, Integer> usersByStatus) {
         super(id);
         this.usersByStatus = usersByStatus;
         setOutputMarkupId(true);
 
-        chart = new DoughnutChartPanel("chart", Model.of(build(usersByStatus)));
+        chart = new ChartJSPanel("chart", Model.of(build(usersByStatus)));
         add(chart);
     }
 
@@ -49,7 +50,7 @@ public class UsersByStatusWidget extends BaseWidget {
 
         int i = 0;
         for (Map.Entry<String, Integer> entry : usersByStatus.entrySet()) {
-            doughnut.getData().add(new LabeledDoughnutChartData(entry.getValue(), COLORS[i % 5], entry.getKey()));
+            doughnut.getData().add(new DoughnutChartData(entry.getValue(), COLORS[i % 5], entry.getKey()));
             i++;
         }
 
@@ -64,5 +65,4 @@ public class UsersByStatusWidget extends BaseWidget {
         }
         return false;
     }
-
 }
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/chartjs/ChartJSPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/chartjs/ChartJSPanel.html
new file mode 100644 (file)
index 0000000..25b2973
--- /dev/null
@@ -0,0 +1,23 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:panel>
+    <canvas wicket:id="chart"></canvas>
+  </wicket:panel>
+</html>
index 3c47012..a324d8a 100644 (file)
@@ -17,6 +17,17 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:head>
+    <script type="text/javascript" src="webjars/chart.js/${chartjs.version}/Chart.min.js"></script>
+    <script type="text/javascript">
+      var WicketCharts = {};
+      // Get context with jQuery - using jQuery's .get() method.
+      function buildChart(markupId) {
+        var ctx = $('#' + markupId).get(0).getContext('2d');
+        return new Chart(ctx);
+      }
+    </script>
+  </wicket:head>
   <wicket:extend>
     <section class="content" wicket:id="content">
       <div class="box">
index d5c4679..7a98f90 100644 (file)
@@ -228,20 +228,20 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
             doHandle(any);
             return true;
         } catch (IgnoreProvisionException e) {
-            ProvisioningReport result = profile.getResults().stream()
-                    .filter(r -> anyKey.equalsIgnoreCase(r.getKey()))
-                    .findFirst()
-                    .orElse(null);
-
+            ProvisioningReport result = profile.getResults().stream().
+                    filter(report -> anyKey.equalsIgnoreCase(report.getKey())).
+                    findFirst().
+                    orElse(null);
             if (result == null) {
                 result = new ProvisioningReport();
+                result.setKey(anyKey);
+                result.setAnyType(any == null ? null : any.getType().getKey());
+
                 profile.getResults().add(result);
             }
 
             result.setOperation(ResourceOperation.NONE);
-            result.setAnyType(any == null ? null : any.getType().getKey());
             result.setStatus(ProvisioningReport.Status.IGNORE);
-            result.setKey(anyKey);
 
             LOG.warn("Ignoring during push", e);
             return true;
index ce1e461..1ccc74d 100644 (file)
  */
 package org.apache.syncope.client.console.widgets;
 
-import com.pingunaut.wicket.chartjs.chart.impl.Bar;
-import com.pingunaut.wicket.chartjs.core.panel.BarChartPanel;
-import com.pingunaut.wicket.chartjs.data.sets.BarDataSet;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.syncope.client.console.annotations.ExtWidget;
+import org.apache.syncope.client.console.chartjs.Bar;
+import org.apache.syncope.client.console.chartjs.BarDataSet;
+import org.apache.syncope.client.console.chartjs.ChartJSPanel;
 import org.apache.syncope.client.console.rest.CamelRoutesRestClient;
 import org.apache.syncope.client.console.wicket.ajax.IndicatorAjaxTimerBehavior;
 import org.apache.syncope.common.lib.to.CamelMetrics;
@@ -42,7 +41,7 @@ public class CamelMetricsWidget extends BaseExtWidget {
 
     private List<CamelMetrics.MeanRate> meanRates;
 
-    private final BarChartPanel chart;
+    private final ChartJSPanel chart;
 
     private final CamelRoutesRestClient restClient = new CamelRoutesRestClient();
 
@@ -59,7 +58,7 @@ public class CamelMetricsWidget extends BaseExtWidget {
             meanRates.add(metrics.getResponseMeanRates().get(i));
         }
 
-        chart = new BarChartPanel("chart", Model.of(build(meanRates)));
+        chart = new ChartJSPanel("chart", Model.of(build(meanRates)));
         container.add(chart);
 
         container.add(new IndicatorAjaxTimerBehavior(Duration.seconds(60)) {
@@ -84,8 +83,6 @@ public class CamelMetricsWidget extends BaseExtWidget {
     private Bar build(final List<CamelMetrics.MeanRate> meanRates) {
         Bar bar = new Bar();
         bar.getOptions().setScaleBeginAtZero(true);
-        bar.getOptions().setScaleShowGridLines(true);
-        bar.getOptions().setScaleGridLineWidth(1);
         bar.getOptions().setBarShowStroke(true);
         bar.getOptions().setBarStrokeWidth(2);
         bar.getOptions().setBarValueSpacing(5);
@@ -93,13 +90,13 @@ public class CamelMetricsWidget extends BaseExtWidget {
         bar.getOptions().setResponsive(true);
         bar.getOptions().setMaintainAspectRatio(true);
 
-        bar.getData().setLabels(
+        bar.getData().getLabels().addAll(
                 meanRates.stream().map(input -> input.getRouteId()).collect(Collectors.toList()));
 
         BarDataSet dataset = new BarDataSet(
                 meanRates.stream().map(input -> input.getValue()).collect(Collectors.toList()));
         dataset.setFillColor("blue");
-        bar.getData().setDatasets(Collections.singletonList(dataset));
+        bar.getData().getDatasets().add(dataset);
 
         return bar;
     }
diff --git a/pom.xml b/pom.xml
index 368be71..547ed90 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -439,11 +439,11 @@ under the License.
     <codemirror.version>5.33.0</codemirror.version>
     <googlediffmatchpath.version>20121119-1</googlediffmatchpath.version>
     <jsplumb.version>2.0.7</jsplumb.version>
+    <chartjs.version>1.0.2</chartjs.version>
     
     <wicket.version>7.10.0</wicket.version>
     <wicket-jqueryui.version>7.10.2</wicket-jqueryui.version>
     <wicket-bootstrap.version>0.10.17</wicket-bootstrap.version>
-    <wicket-chartjs.version>7.0.1</wicket-chartjs.version>
 
     <angular.version>1.6.10</angular.version>
     <angular-ui-router.version>0.3.2</angular-ui-router.version>
@@ -1213,22 +1213,7 @@ under the License.
             <artifactId>momentjs</artifactId>
           </exclusion>
         </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>com.pingunaut</groupId>
-        <artifactId>wicket-chartjs</artifactId>
-        <version>${wicket-chartjs.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>                    
+      </dependency>            
       <!-- /Wicket -->
       
       <dependency>
@@ -1355,6 +1340,11 @@ under the License.
         <version>${jsplumb.version}</version>
       </dependency>
       <dependency>
+        <groupId>org.webjars.bower</groupId>
+        <artifactId>chart.js</artifactId>
+        <version>${chartjs.version}</version>
+      </dependency>
+      <dependency>
         <groupId>org.webjars</groupId>
         <artifactId>jquery-cookie</artifactId>
         <version>${jquery-cookie.version}</version>