Blame view

app/main/static/js/charges.js 19.8 KB
5e6f4e07   hitier   Set Rokotyan Solu...
1
/* Round float to two decimals only */
966f9b78   hitier   Js Round float be...
2
function roundToTwo(num) {
bf0e0b24   hitier   Fix empty charges...
3
    return +(Math.round(num + "e+2") + "e-2");
966f9b78   hitier   Js Round float be...
4
5
}

90c7b0e4   hitier   Small comments an...
6
7
function build_chart(div_selector, data_url, entity_name, category_type) {

5f89fdc7   hitier   Fix color scale: ...
8
    const main_elt = document.getElementById("main")
7c1b38be   hitier   Draw charts to fi...
9

1cb6e878   hitier   New draw_projects...
10
    var margin = {top: 60, right: 150, bottom: 200, left: 90},
5f89fdc7   hitier   Fix color scale: ...
11
        width = main_elt.offsetWidth * 0.95 - margin.left - margin.right,
13c144c8   Anais Amato   Add horizontal le...
12
        height = 600 - margin.top - margin.bottom;
54e2baa6   hitier   Add charge charts...
13

90c7b0e4   hitier   Small comments an...
14
    const height_ratio = 1.2;    // how murch room to give above chart for lisibility
ff5fd5bf   hitier   Less and Longer ...
15

5f89fdc7   hitier   Fix color scale: ...
16
17
    const tooltip_offset = {dx: 0, dy: 100}
    const tooltip_offset_dot = {dx: 20, dy: 60}
f9fef9d0   hitier   Add tooltip
18

90c7b0e4   hitier   Small comments an...
19
    const y_ticks_num = 5        // dont show to many y ticks for lisibility
f0706d95   hitier   Add color legend
20

8ede71fd   hitier   Truncate legend k...
21
    const legend_rect_size = 15; // size of rectangle in legend
1cb6e878   hitier   New draw_projects...
22
    const legend_height = 20;
8ede71fd   hitier   Truncate legend k...
23
24
    const legend_max_length = 30;
    const legend_spacing = 5;
54e2baa6   hitier   Add charge charts...
25

90c7b0e4   hitier   Small comments an...
26
    const dot_radius = 6;        // size of total line dot
f9c1f568   hitier   Add dot on total ...
27

54e2baa6   hitier   Add charge charts...
28

90c7b0e4   hitier   Small comments an...
29
    var colorScale = d3.scaleOrdinal([]); //  Will be really set later by category type
de63cb72   hitier   Add title to proj...
30

90c7b0e4   hitier   Small comments an...
31
32
33
    //
    // Configure chart by the category given as arg
    //
83d933c9   hitier   New draw_categori...
34
35
    var chart_title = ""
    var category_title = ""
1cb6e878   hitier   New draw_projects...
36
    var draw_areas = () => void 0;
90c7b0e4   hitier   Small comments an...
37
38
    var draw_total_line = () => void 0;
    var draw_categories_bars = () => void 0;
7d095c38   hitier   One color scale b...
39

90c7b0e4   hitier   Small comments an...
40
    if (category_type == 'capacity') {
83d933c9   hitier   New draw_categori...
41
42
43
44
        chart_title = "Charges par fonction"
        category_title = "Fonction"
        //draw_total_line
        draw_categories_bars = draw_categories_grouped
7d095c38   hitier   One color scale b...
45
        colorScale = d3.scaleOrdinal(d3.schemeSet3);
90c7b0e4   hitier   Small comments an...
46
    } else if (category_type == 'service') {
83d933c9   hitier   New draw_categori...
47
48
49
50
        chart_title = "Charges par service"
        category_title = "Service"
        draw_total_line = draw_totalcharge_line
        draw_categories_bars = draw_categories_stacked
7d095c38   hitier   One color scale b...
51
        colorScale = d3.scaleOrdinal(d3.schemeTableau10);
90c7b0e4   hitier   Small comments an...
52
    } else if (category_type == 'project') {
c8b7caf5   hitier   Agent now uses co...
53
54
55
56
        chart_title = "Charges par projet"
        category_title = "Projet"
        draw_categories_bars = draw_categories_stacked
        colorScale = d3.scaleOrdinal(d3.schemeTableau10);
1cb6e878   hitier   New draw_projects...
57
58
59
60
61
62
63
    } else if (category_type == 'area') {
        margin = {top: 60, right: 150, bottom: 350, left: 90};
        height = 1200 - margin.top - margin.bottom;
        chart_title = "Tous agents confondus"
        category_title = "Projet"
        draw_areas = draw_projects_areas
        colorScale = d3.scaleOrdinal(d3.schemeTableau10);
6b44860d   hitier   Make a draw_line ...
64
65
    } else {
        alert("ALERT ! Every body shall quit the boat, we are sinking ! ALERT !")
de63cb72   hitier   Add title to proj...
66
    }
54e2baa6   hitier   Add charge charts...
67

1cb6e878   hitier   New draw_projects...
68
69
70
71
72
73
74
75
76

    const xScale = d3.scaleBand()
        .range([0, width])
        .padding(0.4);

    const yScale = d3.scaleLinear()
        .range([height, 0]);


a30b11ff   Anais Amato   Add an 'export me...
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    // Configure the tooltip to export svg to png or csv
    var update_export_menu = function (e, d) {

        const tooltip_test = document.getElementsByClassName('tooltip_hamburger');

        if (tooltip_test.length == 0) {
            d3.select(".tooltip_hamburger").remove();

            const tooltip_hamburger = hamburger.append("div")
                .style("opacity", 0)
                .attr("class", "tooltip tooltip_hamburger");

            d3.select(this).transition()
                .duration(1)
            tooltip_hamburger
                .transition()
                .duration(200)
                .style("opacity", 1)
            tooltip_hamburger
                .html("<span>Export </span>" +
7d42e277   hitier   Download chart csv
97
                    "<li id='to_csv'>To CSV</li>" +
a30b11ff   Anais Amato   Add an 'export me...
98
99
                    "<li id='to_png'>To PNG</li>")
            d3.select("#to_png").on("click", download_png);
bf0e0b24   hitier   Fix empty charges...
100
101
102
            d3.select("#to_csv").on("click", function () {
                download_csv(this, data_url);
            })
a30b11ff   Anais Amato   Add an 'export me...
103
104
105
106
107
        } else {
            d3.select(".tooltip_hamburger").remove();
        }

    }
cfc5bded   hitier   More chart classe...
108
    // Create a download button inside the div contaning svg chart
a30b11ff   Anais Amato   Add an 'export me...
109
110
111
112
    const hamburger = d3.select(div_selector).append('i')
        .attr('class', 'fas fa-bars fa-lg export')
        .on("click", update_export_menu);

5ac5d2b6   Anais Amato   Resize d3 js grap...
113
114
    const real_width = width + margin.left + margin.right;
    const real_height = height + margin.top + margin.bottom;
cfc5bded   hitier   More chart classe...
115

54e2baa6   hitier   Add charge charts...
116
    const svg = d3.select(div_selector).append("svg")
5ac5d2b6   Anais Amato   Resize d3 js grap...
117
        .attr("viewBox", [0, 0, real_width, real_height])
cfc5bded   hitier   More chart classe...
118
        .attr("class", "svg_chart")
5ac5d2b6   Anais Amato   Resize d3 js grap...
119
120
        .attr("width", real_width)
        .attr("height", real_height)
54e2baa6   hitier   Add charge charts...
121
122
123
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

069a5102   hitier   Fixed tooltip
124
    const tooltip = d3.select('html')
f9fef9d0   hitier   Add tooltip
125
126
127
128
129
130
131
132
133
134
135
136
137
        .append("div")
        .style("opacity", 0)
        .attr("class", "tooltip")

    var mousemove = function (e, d) {
        tooltip
            .style("left", (e.pageX - tooltip_offset.dx) + "px")
            .style("top", (e.pageY - tooltip_offset.dy) + "px")
    }

    var mouseleave = function (d) {
        tooltip
            .transition()
67ab2300   hitier   Fix appearance de...
138
            .duration(900)
f9fef9d0   hitier   Add tooltip
139
140
141
142
143
144
            .style("opacity", 0)
    }

    var mouseover = function (e, d) {
        var category_name = d3.select(this.parentNode).datum().key
        var category_charge = d.data[category_name]
22397f43   hitier   Show tooltip on g...
145
146
147
148
149
150
151
152
153
        show_tooltip(e, category_name, category_charge)
    }

    var mouseovergrouped = function (e, d) {
        var category_name = d.key
        var category_charge = d.value
        show_tooltip(e, category_name, category_charge)
    }
    var show_tooltip = function (e, category_name, category_charge) {
f9fef9d0   hitier   Add tooltip
154
155
156
157
158
        tooltip
            .transition()
            .duration(200)
            .style("opacity", 1);
        tooltip
582e1ee2   hitier   Change charts leg...
159
            .html("<b>" + category_title + ":</b> " + category_name + "<br>" + "<b>Charge:</b> " + category_charge + " ETP")
f9fef9d0   hitier   Add tooltip
160
161
162
163
            .style("left", (e.pageX - tooltip_offset.dx) + "px")
            .style("top", (e.pageY - tooltip_offset.dy) + "px")
    }

f9c1f568   hitier   Add dot on total ...
164
165
166
167
168
169
    var mouseleavedot = function (e, d) {
        d3.select(this).transition()
            .duration(1)
            .attr("r", dot_radius);
        mouseleave(d);
    }
6b44860d   hitier   Make a draw_line ...
170

f9c1f568   hitier   Add dot on total ...
171
172
173
174
175
176
177
178
179
    var mouseoverdot = function (e, d) {
        d3.select(this).transition()
            .duration(1)
            .attr("r", dot_radius * 1.5);
        tooltip
            .transition()
            .duration(200)
            .style("opacity", 1)
        tooltip
582e1ee2   hitier   Change charts leg...
180
            .html("<b>" + d.period + ": </b>" + d.total + " ETP")
f9c1f568   hitier   Add dot on total ...
181
182
183
184
            .style("left", (e.pageX - tooltip_offset_dot.dx) + "px")
            .style("top", (e.pageY - tooltip_offset_dot.dy) + "px")
    }

8afeed29   Anais Amato   Add hover effect ...
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
    function mouseoverlegend() {
        var legend_category = $(this).attr("class");
        var bar_category = document.getElementsByClassName(legend_category);
        if (bar_category[0].tagName === "g") {
            var rect_to_hover = bar_category[0].children;
            (bar_category[1].children[0]).classList.add("brillance");
            for (var i=0;i<rect_to_hover.length;i++) {
                rect_to_hover[i].classList.add("brillance");
            }
        } else {
            for (var i=0;i<bar_category.length;i++) {
                bar_category[i].classList.add("brillance");
            }
        }
    }

    function mouseleavelegend() {
        var legend_category = $(this).attr("class");
        var bar_category = document.getElementsByClassName(legend_category);
        if (bar_category[0].tagName === "g") {
            var rect_to_hover = bar_category[0].children;
            (bar_category[1].children[0]).classList.remove("brillance");
            for (var i=0;i<rect_to_hover.length;i++) {
                rect_to_hover[i].classList.remove("brillance");
            }
        } else {
            var lenght_i = bar_category.length - 1;
            for (var i=lenght_i;i>=0;i--) {
                bar_category[i].classList.remove("brillance");
            }
        }
    }

f0706d95   hitier   Add color legend
218
219
    var addlegend = function (color_scale) {

13c144c8   Anais Amato   Add horizontal le...
220
        // add horizontal legend
48613832   hitier   Fix legend keys o...
221
        let legend_keys = color_scale.domain();
8ede71fd   hitier   Truncate legend k...
222
223
224
225
226
227
228
229
230

        // Truncate legend keys when too long
        legend_keys = legend_keys.map(function (l) {
            const n = legend_max_length;
            return (l.length > n) ? l.substr(0, n - 1) : l;
        });

        // Get Max legend key length for later display
        const max_key_length =  Math.max(...legend_keys.map(el => el.length));
f0706d95   hitier   Add color legend
231

13c144c8   Anais Amato   Add horizontal le...
232
233
234
        var legendWrap = svg.append('g')
            .attr('width', '100%')
            .attr('class', 'legendwrap');
f0706d95   hitier   Add color legend
235

13c144c8   Anais Amato   Add horizontal le...
236
        var legend = svg.select('.legendwrap').selectAll('.legend')
48613832   hitier   Fix legend keys o...
237
            .data(legend_keys)
13c144c8   Anais Amato   Add horizontal le...
238
239
            .enter()
            .append('g')
8afeed29   Anais Amato   Add hover effect ...
240
241
242
            .attr('class', function (d) { return d})
            .on("mouseover", mouseoverlegend)
            .on("mouseleave", mouseleavelegend);
f0706d95   hitier   Add color legend
243

13c144c8   Anais Amato   Add horizontal le...
244
        legend.append('rect')
8ede71fd   hitier   Truncate legend k...
245
246
            .attr('width', legend_rect_size)
            .attr('height', legend_rect_size)
13c144c8   Anais Amato   Add horizontal le...
247
            .style('fill', color_scale)
cfc5bded   hitier   More chart classe...
248
            .attr('class', 'legend');
13c144c8   Anais Amato   Add horizontal le...
249
250

        legend.append('text')
f0706d95   hitier   Add color legend
251
            .attr('class', 'legend')
8ede71fd   hitier   Truncate legend k...
252
            .attr('x', legend_rect_size + legend_spacing * 1.5)
13c144c8   Anais Amato   Add horizontal le...
253
            .attr('y', 13)
8ede71fd   hitier   Truncate legend k...
254
            .text(d => d);
13c144c8   Anais Amato   Add horizontal le...
255
256
257
258
259
260
261

        var ypos = 0,
            newxpos = 0,
            maxwidth = 0,
            xpos;

        legend
bf0e0b24   hitier   Fix empty charges...
262
            .attr("transform", function (d, i) {
8ede71fd   hitier   Truncate legend k...
263
                const key_length = 9*max_key_length;
13c144c8   Anais Amato   Add horizontal le...
264
                xpos = newxpos;
8ede71fd   hitier   Truncate legend k...
265
                if (width < xpos + key_length) {
13c144c8   Anais Amato   Add horizontal le...
266
                    newxpos = xpos = 0;
1cb6e878   hitier   New draw_projects...
267
268
                    ypos += legend_height;

13c144c8   Anais Amato   Add horizontal le...
269
                }
8ede71fd   hitier   Truncate legend k...
270
                newxpos += key_length;
13c144c8   Anais Amato   Add horizontal le...
271
272
273
274
275
276
277
278
                if (newxpos > maxwidth) maxwidth = newxpos;

                return 'translate(' + xpos + ',' + ypos + ')';

            });


        legendWrap
bf0e0b24   hitier   Fix empty charges...
279
            .attr("transform", function (d, i) {
13c144c8   Anais Amato   Add horizontal le...
280
281
                return "translate(0 ," + (height + 100) + ")";
            });
f0706d95   hitier   Add color legend
282
283
    }

83d933c9   hitier   New draw_categori...
284
285
    function draw_categories_grouped(data, categories) {

bf0e0b24   hitier   Fix empty charges...
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
        // Get the max y to plot
        // If no data at all, force to 0
        if (categories.length == 0) {
            y_max = 0
        } else {
            var y_max = d3.max(data, function (d) {
                return d3.max(categories, function (c) {
                    return +d[c]
                })
            });
        }
        // Force maximum in any cases
        if (y_max == 0) {
            y_max = 100
        }
a07df204   hitier   Compute for group...
301
302
        y_max = y_max * height_ratio
        yScale.domain([0, y_max])
83d933c9   hitier   New draw_categori...
303
304
305
306
        // Another scale for subgroup position
        var xCategories = d3.scaleBand()
            .domain(categories)
            .range([0, xScale.bandwidth()])
67ab2300   hitier   Fix appearance de...
307
            .padding([0.2])
83d933c9   hitier   New draw_categori...
308
309
310
311
312
313
314

        svg.append("g")
            .selectAll("g")
            // Enter in data = loop group per group
            .data(data)
            .enter()
            .append("g")
a5294567   hitier   Rewrite anonymous...
315
            .attr("transform", d => "translate(" + xScale(d.period) + ",0)")
83d933c9   hitier   New draw_categori...
316
317
318
319
320
321
322
            .selectAll("rect")
            .data(function (d) {
                return categories.map(function (key) {
                    return {key: key, value: d[key]};
                });
            })
            .enter().append("rect")
a5294567   hitier   Rewrite anonymous...
323
            .attr("x", d => xCategories(d.key))
83d933c9   hitier   New draw_categori...
324
            .attr("width", xCategories.bandwidth())
1cb6e878   hitier   New draw_projects...
325
326
327
328
329
330
331
332
333
334
            /* Transition part */
            .attr("y", d => {
                return height;
            })
            .attr("height", 0)
            .transition()
            .duration(750)
            .delay(function (d, i) {
                return i * 150;
            })
8dad7ce7   Anais Amato   Add animations to...
335
            .attr("y", d => yScale(d.value))
a5294567   hitier   Rewrite anonymous...
336
            .attr("height", d => height - yScale(d.value))
22397f43   hitier   Show tooltip on g...
337
            .attr("fill", d => colorScale(d.key))
8afeed29   Anais Amato   Add hover effect ...
338
            .attr("class", d => d.key);
8dad7ce7   Anais Amato   Add animations to...
339
340

        svg.selectAll("rect")
22397f43   hitier   Show tooltip on g...
341
342
343
            .on("mouseover", mouseovergrouped)
            .on("mousemove", mousemove)
            .on("mouseleave", mouseleave);
83d933c9   hitier   New draw_categori...
344

8dad7ce7   Anais Amato   Add animations to...
345

a48677c4   hitier   Make a draw_categ...
346
347
    }

1cb6e878   hitier   New draw_projects...
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
    function draw_projects_areas(data, projects) {

        // Now build the stacked data for stacked bars
        //
        var stack = d3.stack()
            .keys(projects)
        // .order(d3.stackOrderNone)
        // .offset(d3.stackOffsetNone);
        var stacked_data = stack(data)

        yScale.domain([0, 85]);

        const area = d3.area()
            .x(d => xScale(d.data.period))
            .y0(d => yScale(d[0]))
            .y1(d => yScale(d[1]))

        let paths = svg.append("g")
            .selectAll("path")
            .data(stacked_data)
            .join("path")
            .attr("fill", ({key}) => colorScale(key))
            .attr("stroke", 'black')
            .attr("stroke-width", '0.2pt')
            .attr("d", area)
            .append("title")
            .text(({key}) => key);

        paths.selectAll("area")
            .on("mouseover", mouseover)
            .on("mousemove", mousemove)
            .on("mouseleave", mouseleave);

    }


83d933c9   hitier   New draw_categori...
384
385
386
387
388
389
390
391
392
393
394
    function draw_categories_stacked(data, categories) {

        // Now build the stacked data for stacked bars
        //
        var stack = d3.stack()
            .keys(categories)
        // .order(d3.stackOrderNone)
        // .offset(d3.stackOffsetNone);
        var stacked_data = stack(data)

        // Get the max y to plot
bf0e0b24   hitier   Fix empty charges...
395
396
397
398
399
400
401
        // If no data at all, force to 0
        if (stacked_data.length == 0) {
            y_max = 0
        } else {
            var y_max = d3.max(stacked_data[stacked_data.length - 1], d => d[1]);
        }
        // Force maximum in any cases
83d933c9   hitier   New draw_categori...
402
403
404
405
406
407
408
409
        if (y_max == 0) {
            y_max = 100
        }
        // Enhance it by %ratio to leave room on the top of the graph
        y_max = y_max * height_ratio

        yScale.domain([0, y_max]);

90c7b0e4   hitier   Small comments an...
410
        // first draw one group for one category containing all bars over periods
a48677c4   hitier   Make a draw_categ...
411
412
413
414
        let groups = svg.selectAll("g.category")
            .data(stacked_data)
            .enter()
            .append("g")
8afeed29   Anais Amato   Add hover effect ...
415
            .attr("class", d => d.key)
83d933c9   hitier   New draw_categori...
416
            .style("fill", (d) => colorScale(d.key));
a48677c4   hitier   Make a draw_categ...
417

90c7b0e4   hitier   Small comments an...
418
        // then draw each period/category bar
a48677c4   hitier   Make a draw_categ...
419
420
421
422
423
424
425
        let rect = groups.selectAll("rect")
            .data(d => d)
            .enter()
            .append("rect")
            .attr("class", "bar")
            .attr("x", d => xScale(d.data.period))
            .attr("width", xScale.bandwidth())
1cb6e878   hitier   New draw_projects...
426
427
428
429
430
431
432
433
434
435
            /* transition part */
            .attr("y", d => {
                return height;
            })
            .attr("height", 0)
            .transition()
            .duration(750)
            .delay(function (d, i) {
                return i * 150;
            })
a48677c4   hitier   Make a draw_categ...
436
437
            .attr("y", d => yScale(d[1]))
            .attr("height", d => height - yScale(d[1] - d[0]))
8dad7ce7   Anais Amato   Add animations to...
438
439

        groups.selectAll("rect")
a48677c4   hitier   Make a draw_categ...
440
441
442
443
444
445
            .on("mouseover", mouseover)
            .on("mousemove", mousemove)
            .on("mouseleave", mouseleave);

    }

6b44860d   hitier   Make a draw_line ...
446
447
    function draw_totalcharge_line(data) {
        // Build the total charge by period;
518c7cc5   hitier   Draw the total ca...
448
449
        // it will be used for the line drawing above bars.
        //
6b44860d   hitier   Make a draw_line ...
450
451
        var periods_total_charge = []

518c7cc5   hitier   Draw the total ca...
452
453
454
455
456
        data.forEach(function (d) {
            // get the list of values for all columns except the first one which is the period name
            var period_values = Object.values(d).slice(1)
            var row = {}
            row['period'] = d.period
966f9b78   hitier   Js Round float be...
457
            row['total'] = roundToTwo(d3.sum(period_values))
518c7cc5   hitier   Draw the total ca...
458
459
460
            periods_total_charge.push(row)
        });

6b44860d   hitier   Make a draw_line ...
461
462
463
464
465
466
467
468
469
470
        // the line itselet
        //
        const line = d3.line()
            .x(d => (xScale.bandwidth() / 2) + xScale(d.period)) // décalage pour centrer au milieu des barres
            .y(d => yScale(d.total))
            .curve(d3.curveMonotoneX); // Fonction de courbe permettant de l'adoucir

        svg.append("path")
            .datum(periods_total_charge)
            .attr("class", "total-line")
83d933c9   hitier   New draw_categori...
471
472
            .attr("d", line)
            .lower();// set it below bars if called after
6b44860d   hitier   Make a draw_line ...
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487

        // data dots at each point
        //
        svg.selectAll("line-circle")
            .data(periods_total_charge)
            .enter().append("circle")
            .attr("class", "total-circle")
            .attr("r", dot_radius)
            .attr("cx", function (d) {
                return (xScale.bandwidth() / 2) + xScale(d.period)
            })
            .attr("cy", function (d) {
                return yScale(d.total);
            })
            .on("mouseover", mouseoverdot)
83d933c9   hitier   New draw_categori...
488
489
            .on("mouseleave", mouseleavedot)
            .lower();// set it below bars if called after
6b44860d   hitier   Make a draw_line ...
490
491
492
493

    }

    d3.csv(data_url).then(data => {
a07df204   hitier   Compute for group...
494
        // we could get categories that way,
6b44860d   hitier   Make a draw_line ...
495
        // var categories = data.columns.slice(1)
1cb6e878   hitier   New draw_projects...
496
        // but instead we want to filter by non zero, see later
90c7b0e4   hitier   Small comments an...
497

6b44860d   hitier   Make a draw_line ...
498
499
500
        var periods = d3.map(data, d => d.period)
        xScale.domain(periods)

90c7b0e4   hitier   Small comments an...
501
502
        // Filter datas to only keep non zero categories
        // TODO: should be done on server (python/flask) side
518c7cc5   hitier   Draw the total ca...
503
        //
90c7b0e4   hitier   Small comments an...
504
        // 1- Get the charge sum for each category over periods
f0706d95   hitier   Add color legend
505
        // That will leave '0' to categories with no charge at all
a07df204   hitier   Compute for group...
506
        // TODO: to be done with Object.keys, Object.values and d3 filtering methods
ce5f45ea   hitier   Fix data bug
507
        //
6b44860d   hitier   Make a draw_line ...
508
        var categories_total_charge = {}
f0706d95   hitier   Add color legend
509
510
        data.forEach(function (d) {
            Object.keys(d).forEach(function (k) {
04f2b6e8   hitier   Fix period as cat...
511
512
513
                    if (k === 'period') {
                        return;
                    }
f0706d95   hitier   Add color legend
514
515
516
                    if (categories_total_charge.hasOwnProperty(k)) {
                        categories_total_charge[k] += +d[k]
                    } else {
582e1ee2   hitier   Change charts leg...
517
                        categories_total_charge[k] = +d[k]
f0706d95   hitier   Add color legend
518
                    }
966f9b78   hitier   Js Round float be...
519
                    categories_total_charge[k] = roundToTwo(categories_total_charge[k])
f0706d95   hitier   Add color legend
520
521
522
523
                }
            )
        })

518c7cc5   hitier   Draw the total ca...
524
        // 2- Now, filter only categories that have a non-zero charge
a07df204   hitier   Compute for group...
525
        // TODO: to be done with Object.keys, Object.values and d3 filtering methods
90c7b0e4   hitier   Small comments an...
526
        //
f0706d95   hitier   Add color legend
527
528
529
530
531
532
533
        var categories = []
        for (var key in categories_total_charge) {
            if (categories_total_charge[key] > 0) {
                categories.push(key)
            }
        }

518c7cc5   hitier   Draw the total ca...
534
        //
1cb6e878   hitier   New draw_projects...
535
536
537
538
539
        // Draw the  areas, stacked.
        //
        draw_areas(data, categories)

        //
90c7b0e4   hitier   Small comments an...
540
        // Draw the  bars, stacked or grouped
83d933c9   hitier   New draw_categori...
541
542
        //
        draw_categories_bars(data, categories)
54e2baa6   hitier   Add charge charts...
543

518c7cc5   hitier   Draw the total ca...
544
        //
83d933c9   hitier   New draw_categori...
545
546
547
548
549
550
551
552
553
554
        //  Draw the total charge line ( may be)
        //
        draw_total_line(data, categories)

        //
        // This former list we use as color_scale domain.
        // And that allows us to build the legend
        //
        colorScale.domain(categories)
        addlegend(colorScale)
54e2baa6   hitier   Add charge charts...
555

f0706d95   hitier   Add color legend
556
557
        // Xaxis
        //
518c7cc5   hitier   Draw the total ca...
558
        const xAxis = d3.axisBottom(xScale)
f0706d95   hitier   Add color legend
559

f0706d95   hitier   Add color legend
560
        // Draw Xaxis
68fd83a8   hitier   Add axis
561
        svg.append("g")
cfc5bded   hitier   More chart classe...
562
            .attr("class", "x_axis")
68fd83a8   hitier   Add axis
563
564
565
566
567
568
569
570
            .attr("transform", "translate(0," + height + ")")
            .call(xAxis)
            .selectAll("text")
            .style("text-anchor", "end")
            .attr("dx", "-.9em")
            .attr("dy", ".15em")
            .attr("transform", "rotate(-65)");

90c7b0e4   hitier   Small comments an...
571
572
573
574
575
        // Yaxis
        //
        const yAxis = d3.axisLeft(yScale)
            .ticks(y_ticks_num)

f0706d95   hitier   Add color legend
576
        // Draw Yaxis
68fd83a8   hitier   Add axis
577
        svg.append("g")
cfc5bded   hitier   More chart classe...
578
            .attr("class", "y_axis")
68fd83a8   hitier   Add axis
579
            .call(yAxis)
68fd83a8   hitier   Add axis
580

ff5fd5bf   hitier   Less and Longer ...
581
582
583
584
585
586
587
588
589
590
        // Draw horizontal lines
        svg.selectAll("y axis")
            .data(yScale.ticks(y_ticks_num))
            .enter()
            .append("line")
            .attr("class", d => (d == 0 ? "horizontalY0" : "horizontalY"))
            .attr("x1", 0)
            .attr("x2", width)
            .attr("y1", d => yScale(d))
            .attr("y2", d => yScale(d))
83d933c9   hitier   New draw_categori...
591
            .lower();// set it below bars if called after
ff5fd5bf   hitier   Less and Longer ...
592

f0706d95   hitier   Add color legend
593
        // Write Y axis title
68fd83a8   hitier   Add axis
594
595
596
597
598
        svg.append("text")
            .attr("text-anchor", "end")
            .attr("transform", "rotate(-90)")
            .attr("y", -margin.left + 40)
            .attr("x", -margin.top - 70)
582e1ee2   hitier   Change charts leg...
599
            .text("Charge en ETP");
54e2baa6   hitier   Add charge charts...
600

6b44860d   hitier   Make a draw_line ...
601
        //
f0706d95   hitier   Add color legend
602
        // Write chart Title
6b44860d   hitier   Make a draw_line ...
603
604
        //

f0706d95   hitier   Add color legend
605
        // part 1
de63cb72   hitier   Add title to proj...
606
        svg.append("text")
3c21ae9f   hitier   Change bar colors
607
608
609
610
            .attr("x", (width / 2))
            .attr("y", 0 - (margin.top / 2) - 10)
            .attr("text-anchor", "middle")
            .style("font-size", "16px")
c8b7caf5   hitier   Agent now uses co...
611
            .text(entity_name);
f0706d95   hitier   Add color legend
612
        // part 2
de63cb72   hitier   Add title to proj...
613
        svg.append("text")
3c21ae9f   hitier   Change bar colors
614
615
616
617
618
            .attr("x", (width / 2))
            .attr("y", 0 - (margin.top / 2) + 10)
            .attr("text-anchor", "middle")
            .style("font-size", "12px")
            .text(chart_title);
54e2baa6   hitier   Add charge charts...
619

518c7cc5   hitier   Draw the total ca...
620

6b44860d   hitier   Make a draw_line ...
621
    }); // end of d3.csv().then({})
54e2baa6   hitier   Add charge charts...
622
623

}