Wiki source code of TableToChartJS
Last modified by QUIS Admin on 2024/06/18 12:01
Show last authors
author | version | line-number | content |
---|---|---|---|
1 | == Description == | ||
2 | |||
3 | Draws charts using Chart.js and the data from a table. | ||
4 | |||
5 | == Usage == | ||
6 | |||
7 | {{code language="none"}} | ||
8 | (% id="myTable" %) | ||
9 | |=Header1|=Header2 | ||
10 | |label|numeric value | ||
11 | ... | ||
12 | |||
13 | {{tableToChartJS type="..." table="myTable" /}} | ||
14 | {{/code}} | ||
15 | |||
16 | == Parameters == | ||
17 | |||
18 | {{velocity}} | ||
19 | #set ($parameters = $doc.getObjects('XWiki.WikiMacroParameterClass')) | ||
20 | #set ($headers = '|=Name|=Description|=Mandatory|=Default') | ||
21 | #set ($body = '') | ||
22 | #foreach ($parameter in $parameters) | ||
23 | #set ($isMandatory = ${parameter.getProperty('mandatory').value}) | ||
24 | #if ($isMandatory == 1) #set ($isMandatory = "Yes") #else #set ($isMandatory = "No") #end | ||
25 | #set ($body = "$body|${parameter.getProperty('name').value}|(((${parameter.getProperty('description').value})))|$isMandatory|$parameter.getProperty('defaultValue').value | ||
26 | ") | ||
27 | #end | ||
28 | ## This option is handy for generating the code to be pasted to the online extension.xwiki.org page for documenting the parameters statically (i.e. without having the macro object attached to the page). | ||
29 | #if ($request.debug) | ||
30 | {{code}} | ||
31 | $headers | ||
32 | $body | ||
33 | {{/code}} | ||
34 | #end | ||
35 | |||
36 | $headers | ||
37 | $body | ||
38 | {{/velocity}} | ||
39 | |||
40 | == Examples == | ||
41 | |||
42 | === Single Data Set === | ||
43 | |||
44 | (% id="singleDataSet" %) | ||
45 | |=Issue Type|=Count | ||
46 | |Bug|23 | ||
47 | |Improvement|17 | ||
48 | |{{html}}New Feature{{/html}}|9 | ||
49 | |Ideas|0 | ||
50 | |||
51 | {{velocity}} | ||
52 | #set ($chartOptions = { | ||
53 | "backgroundColors": ["#ff16e8", "#0018f4","#065d00"], | ||
54 | "opacity": 0.8, | ||
55 | "skipZeros": true, | ||
56 | "legend": { | ||
57 | "display": false | ||
58 | }, | ||
59 | "layout": { | ||
60 | "padding": { | ||
61 | "left": 50, | ||
62 | "right": 50, | ||
63 | "top": 50, | ||
64 | "bottom": 50 | ||
65 | } | ||
66 | }, | ||
67 | "plugins" : { | ||
68 | "datalabels": { | ||
69 | "anchor": "end", | ||
70 | "align": "end", | ||
71 | "includeLegend": true | ||
72 | } | ||
73 | } | ||
74 | }) | ||
75 | #set ($options = $jsontool.serialize($chartOptions).replaceAll("~","~~").replaceAll("'","~'")) | ||
76 | |||
77 | (% class="row" %)((( | ||
78 | #foreach ($type in ['pie', 'doughnut', 'polarArea']) | ||
79 | (% class="col-sm-6 col-md-4" %)((( | ||
80 | {{tableToChartJS type="$type" id="issues-$type" title="Issues" table="singleDataSet" options='$options' height="200px" cssClass="my-chart"/}} | ||
81 | ))) | ||
82 | #end | ||
83 | ))) | ||
84 | {{/velocity}} | ||
85 | |||
86 | === Multiple Data Sets === | ||
87 | |||
88 | {{velocity}} | ||
89 | #set ($chartOptions = { | ||
90 | "backgroundColors": ["#ff16e8", "#0018f4","#065d00"], | ||
91 | "opacity": 0.8, | ||
92 | "skipZeros": true | ||
93 | }) | ||
94 | #set ($options = $jsontool.serialize($chartOptions).replaceAll("~","~~").replaceAll("'","~'")) | ||
95 | {{/velocity}} | ||
96 | |||
97 | (% id="multipleDataSetsMerged" %) | ||
98 | |=Issue Type|=CKEditor|=Diagram | ||
99 | |Bug|25|34 | ||
100 | |Improvement|17|11 | ||
101 | |New Feature|5|6 | ||
102 | |Ideas|0|0 | ||
103 | |||
104 | {{velocity}} | ||
105 | (% class="row" %)((( | ||
106 | #foreach ($type in ['pie', 'doughnut']) | ||
107 | (% class="col-sm-6 col-md-4" %)((( | ||
108 | {{tableToChartJS type="$type" table="multipleDataSetsMerged" multipleDataSets="true" options='$options' /}} | ||
109 | ))) | ||
110 | #end | ||
111 | #set($chartOptions = { | ||
112 | "backgroundColors": ["#0079b6", "#ffe600"], | ||
113 | "opacity": 0.8, | ||
114 | "skipZeros": true, | ||
115 | "plugins" : { | ||
116 | "datalabels": { | ||
117 | "anchor": "end", | ||
118 | "align": "end", | ||
119 | "showLegend": true | ||
120 | } | ||
121 | } | ||
122 | }) | ||
123 | #set ($options = $jsontool.serialize($chartOptions).replaceAll("~","~~").replaceAll("'","~'")) | ||
124 | |||
125 | (% class="col-sm-6 col-md-4" %)((( | ||
126 | {{tableToChartJS type="bar" table="multipleDataSetsMerged" multipleDataSets="true" options='$options' /}} | ||
127 | ))) | ||
128 | |||
129 | ))) | ||
130 | {{/velocity}} | ||
131 | |||
132 | (% id="multipleDataSetsLine" %) | ||
133 | |=Month|=2016|=2017 | ||
134 | |January|65|61 | ||
135 | |February|59|73 | ||
136 | |March|80|82 | ||
137 | |April|81|69 | ||
138 | |May|56|70 | ||
139 | |June|55|58 | ||
140 | |July|40|47 | ||
141 | |||
142 | (% class="row" %)((( | ||
143 | (% class="col-sm-6" %)((( | ||
144 | {{tableToChartJS type="line" table="multipleDataSetsLine" multipleDataSets="true"/}} | ||
145 | ))) | ||
146 | |||
147 | {{velocity}} | ||
148 | #set ($stackedLineOptions = { | ||
149 | 'scales': { | ||
150 | 'yAxes': [{ | ||
151 | 'stacked': true | ||
152 | }] | ||
153 | } | ||
154 | }) | ||
155 | (% class="col-sm-6" %)((( | ||
156 | {{tableToChartJS type="line" table="multipleDataSetsLine" multipleDataSets="true" | ||
157 | options='$jsontool.serialize($stackedLineOptions)'/}} | ||
158 | ))) | ||
159 | {{/velocity}} | ||
160 | ))) | ||
161 | |||
162 | (% class="row" %)((( | ||
163 | (% class="col-sm-6" %)((( | ||
164 | (% id="multipleDataSetsRadar" %) | ||
165 | |=Month|=2016|=2017 | ||
166 | |Eating|65|28 | ||
167 | |Running|40|100 | ||
168 | |Cycling|55|27 | ||
169 | |Coding|56|96 | ||
170 | |Designing|81|19 | ||
171 | |Sleeping|90|40 | ||
172 | |Drinking|59|48 | ||
173 | ))) | ||
174 | |||
175 | (% class="col-sm-6" %)((( | ||
176 | {{tableToChartJS type="radar" table="multipleDataSetsRadar" multipleDataSets="true"/}} | ||
177 | ))) | ||
178 | ))) | ||
179 | |||
180 | === Merged Data Sets === | ||
181 | |||
182 | (% id="multipleDataSetsSplit" %) | ||
183 | |=Issue Type|=Project|=Count | ||
184 | |Bug|CKEditor|23 | ||
185 | |Bug|Diagram|34 | ||
186 | |Improvement|CKEditor|17 | ||
187 | |Improvement|Diagram|11 | ||
188 | |New Feature|CKEditor|5 | ||
189 | |New Feature|Diagram|6 | ||
190 | |||
191 | (% class="row" %)((( | ||
192 | (% class="col-sm-6" %)((( | ||
193 | {{tableToChartJS type="bar" table="multipleDataSetsSplit" multipleDataSets="true" dataSetLabel="1"/}} | ||
194 | ))) | ||
195 | |||
196 | (% class="col-sm-6" %)((( | ||
197 | {{tableToChartJS type="horizontalBar" table="multipleDataSetsSplit" multipleDataSets="true" dataSetLabel="1"/}} | ||
198 | ))) | ||
199 | |||
200 | {{velocity}} | ||
201 | #set ($stackedBarOptions = { | ||
202 | 'scales': { | ||
203 | 'xAxes': [{ | ||
204 | 'stacked': true | ||
205 | }], | ||
206 | 'yAxes': [{ | ||
207 | 'stacked': true | ||
208 | }] | ||
209 | } | ||
210 | }) | ||
211 | (% class="col-sm-6" %)((( | ||
212 | {{tableToChartJS type="bar" table="multipleDataSetsSplit" multipleDataSets="true" dataSetLabel="1" | ||
213 | options='$jsontool.serialize($stackedBarOptions)'/}} | ||
214 | ))) | ||
215 | |||
216 | (% class="col-sm-6" %)((( | ||
217 | {{tableToChartJS type="horizontalBar" table="multipleDataSetsSplit" multipleDataSets="true" dataSetLabel="1" | ||
218 | options='$jsontool.serialize($stackedBarOptions)'/}} | ||
219 | ))) | ||
220 | {{/velocity}} | ||
221 | ))) |