Commit 83d933c9b17dc867bf1e1d9aa855e7d2a11e4efc

Authored by hitier
1 parent a48677c4

New draw_categories_grouped() method called on capacities

Showing 1 changed file with 91 additions and 48 deletions   Show diff stats
app/main/static/js/charges.js
@@ -10,7 +10,7 @@ const height_ratio = 1.2 @@ -10,7 +10,7 @@ const height_ratio = 1.2
10 const tooltip_offset = {dx: 0, dy: 100} 10 const tooltip_offset = {dx: 0, dy: 100}
11 const tooltip_offset_dot = {dx: 20, dy: 60} 11 const tooltip_offset_dot = {dx: 20, dy: 60}
12 12
13 -const color_scale = d3.scaleOrdinal(d3.schemeCategory10); 13 +const colorScale = d3.scaleOrdinal(d3.schemeCategory10);
14 14
15 const y_ticks_num = 5 15 const y_ticks_num = 5
16 16
@@ -37,16 +37,20 @@ const yScale = d3.scaleLinear() @@ -37,16 +37,20 @@ const yScale = d3.scaleLinear()
37 37
38 function build_chart(div_selector, data_url, project_name, category) { 38 function build_chart(div_selector, data_url, project_name, category) {
39 39
  40 + var chart_title = ""
  41 + var category_title = ""
  42 + var draw_total_line = function(data, categories){}
  43 + var draw_categories_bars = function(data, categories){}
40 if (category == 'capacity') { 44 if (category == 'capacity') {
41 - var chart_title = "Charges par fonction"  
42 - var category_title = "Fonction"  
43 - var draw_total_line = function (data) { }  
44 - var draw_categories_bars = draw_categories_grouped 45 + chart_title = "Charges par fonction"
  46 + category_title = "Fonction"
  47 + //draw_total_line
  48 + draw_categories_bars = draw_categories_grouped
45 } else if (category == 'service') { 49 } else if (category == 'service') {
46 - var chart_title = "Charges par service"  
47 - var category_title = "Service"  
48 - var draw_total_line = draw_totalcharge_line  
49 - var draw_categories_bars = draw_categories_stacked 50 + chart_title = "Charges par service"
  51 + category_title = "Service"
  52 + draw_total_line = draw_totalcharge_line
  53 + draw_categories_bars = draw_categories_stacked
50 } else { 54 } else {
51 alert("ALERT ! Every body shall quit the boat, we are sinking ! ALERT !") 55 alert("ALERT ! Every body shall quit the boat, we are sinking ! ALERT !")
52 } 56 }
@@ -136,18 +140,72 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -136,18 +140,72 @@ function build_chart(div_selector, data_url, project_name, category) {
136 .text(d => d); 140 .text(d => d);
137 } 141 }
138 142
139 - function draw_categories_grouped(data){  
140 - // do nothing at the moment  
141 - console.log("HEY grouped ") 143 + function draw_categories_grouped(data, categories) {
  144 +
  145 + // Another scale for subgroup position
  146 + var xCategories = d3.scaleBand()
  147 + .domain(categories)
  148 + .range([0, xScale.bandwidth()])
  149 + .padding([0.05])
  150 +
  151 + svg.append("g")
  152 + .selectAll("g")
  153 + // Enter in data = loop group per group
  154 + .data(data)
  155 + .enter()
  156 + .append("g")
  157 + .attr("transform", function (d) {
  158 + return "translate(" + xScale(d.period) + ",0)";
  159 + })
  160 + .selectAll("rect")
  161 + .data(function (d) {
  162 + return categories.map(function (key) {
  163 + return {key: key, value: d[key]};
  164 + });
  165 + })
  166 + .enter().append("rect")
  167 + .attr("x", function (d) {
  168 + return xCategories(d.key);
  169 + })
  170 + .attr("y", function (d) {
  171 + return yScale(d.value);
  172 + })
  173 + .attr("width", xCategories.bandwidth())
  174 + .attr("height", function (d) {
  175 + return height - yScale(d.value);
  176 + })
  177 + .attr("fill", function (d) {
  178 + return colorScale(d.key);
  179 + });
  180 +
142 } 181 }
143 182
144 - function draw_categories_stacked(stacked_data) { 183 + function draw_categories_stacked(data, categories) {
  184 +
  185 + // Now build the stacked data for stacked bars
  186 + //
  187 + var stack = d3.stack()
  188 + .keys(categories)
  189 + // .order(d3.stackOrderNone)
  190 + // .offset(d3.stackOffsetNone);
  191 + var stacked_data = stack(data)
  192 +
  193 + // Get the max y to plot
  194 + var y_max = d3.max(stacked_data[stacked_data.length - 1], d => d[1]);
  195 + if (y_max == 0) {
  196 + y_max = 100
  197 + }
  198 + // Enhance it by %ratio to leave room on the top of the graph
  199 + y_max = y_max * height_ratio
  200 +
  201 + yScale.domain([0, y_max]);
  202 +
145 // first one group for one category containing all bars over periods 203 // first one group for one category containing all bars over periods
146 let groups = svg.selectAll("g.category") 204 let groups = svg.selectAll("g.category")
147 .data(stacked_data) 205 .data(stacked_data)
148 .enter() 206 .enter()
149 .append("g") 207 .append("g")
150 - .style("fill", (d) => color_scale(d.key)); 208 + .style("fill", (d) => colorScale(d.key));
151 209
152 // then each period/category bar 210 // then each period/category bar
153 let rect = groups.selectAll("rect") 211 let rect = groups.selectAll("rect")
@@ -191,7 +249,8 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -191,7 +249,8 @@ function build_chart(div_selector, data_url, project_name, category) {
191 svg.append("path") 249 svg.append("path")
192 .datum(periods_total_charge) 250 .datum(periods_total_charge)
193 .attr("class", "total-line") 251 .attr("class", "total-line")
194 - .attr("d", line); 252 + .attr("d", line)
  253 + .lower();// set it below bars if called after
195 254
196 // data dots at each point 255 // data dots at each point
197 // 256 //
@@ -207,7 +266,8 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -207,7 +266,8 @@ function build_chart(div_selector, data_url, project_name, category) {
207 return yScale(d.total); 266 return yScale(d.total);
208 }) 267 })
209 .on("mouseover", mouseoverdot) 268 .on("mouseover", mouseoverdot)
210 - .on("mouseleave", mouseleavedot); 269 + .on("mouseleave", mouseleavedot)
  270 + .lower();// set it below bars if called after
211 ; 271 ;
212 272
213 } 273 }
@@ -243,19 +303,22 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -243,19 +303,22 @@ function build_chart(div_selector, data_url, project_name, category) {
243 } 303 }
244 } 304 }
245 305
246 - // This former list we use as color_scale domain.  
247 - // And that allows us to build the legend  
248 // 306 //
249 - color_scale.domain(categories)  
250 - addlegend(color_scale) 307 + // Draw the bars, stacked or group
  308 + //
  309 + draw_categories_bars(data, categories)
251 310
252 - // Now build the stacked data for stacked bars  
253 // 311 //
254 - var stack = d3.stack()  
255 - .keys(categories)  
256 - // .order(d3.stackOrderNone)  
257 - // .offset(d3.stackOffsetNone);  
258 - var stacked_data = stack(data) 312 + // Draw the total charge line ( may be)
  313 + //
  314 + draw_total_line(data, categories)
  315 +
  316 + //
  317 + // This former list we use as color_scale domain.
  318 + // And that allows us to build the legend
  319 + //
  320 + colorScale.domain(categories)
  321 + addlegend(colorScale)
259 322
260 // Xaxis 323 // Xaxis
261 // 324 //
@@ -263,15 +326,6 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -263,15 +326,6 @@ function build_chart(div_selector, data_url, project_name, category) {
263 326
264 // Yaxis 327 // Yaxis
265 // 328 //
266 - // Get the max y to plot  
267 - var y_max = d3.max(stacked_data[stacked_data.length - 1], d => d[1]);  
268 - if (y_max == 0) {  
269 - y_max = 100  
270 - }  
271 - // Enhance it by %ratio to leave room on the top of the graph  
272 - y_max = y_max * height_ratio  
273 -  
274 - yScale.domain([0, y_max]);  
275 329
276 const yAxis = d3.axisLeft(yScale) 330 const yAxis = d3.axisLeft(yScale)
277 .ticks(y_ticks_num) 331 .ticks(y_ticks_num)
@@ -302,6 +356,7 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -302,6 +356,7 @@ function build_chart(div_selector, data_url, project_name, category) {
302 .attr("x2", width) 356 .attr("x2", width)
303 .attr("y1", d => yScale(d)) 357 .attr("y1", d => yScale(d))
304 .attr("y2", d => yScale(d)) 358 .attr("y2", d => yScale(d))
  359 + .lower();// set it below bars if called after
305 360
306 // Write Y axis title 361 // Write Y axis title
307 svg.append("text") 362 svg.append("text")
@@ -309,7 +364,7 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -309,7 +364,7 @@ function build_chart(div_selector, data_url, project_name, category) {
309 .attr("transform", "rotate(-90)") 364 .attr("transform", "rotate(-90)")
310 .attr("y", -margin.left + 40) 365 .attr("y", -margin.left + 40)
311 .attr("x", -margin.top - 70) 366 .attr("x", -margin.top - 70)
312 - .text("Charge (% ETP)") 367 + .text("Charge (% ETP)");
313 368
314 // 369 //
315 // Write chart Title 370 // Write chart Title
@@ -330,18 +385,6 @@ function build_chart(div_selector, data_url, project_name, category) { @@ -330,18 +385,6 @@ function build_chart(div_selector, data_url, project_name, category) {
330 .style("font-size", "12px") 385 .style("font-size", "12px")
331 .text(chart_title); 386 .text(chart_title);
332 387
333 - //  
334 - // Draw the total charge line  
335 - //  
336 -  
337 - draw_total_line(data)  
338 -  
339 - //  
340 - // Draw the stacked bars  
341 - //  
342 -  
343 - draw_categories_bars(stacked_data)  
344 -  
345 388
346 }); // end of d3.csv().then({}) 389 }); // end of d3.csv().then({})
347 390