Blame view

app/main/static/js/charges.js 18.3 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

13c144c8   Anais Amato   Add horizontal le...
10
    const 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

13c144c8   Anais Amato   Add horizontal le...
21
22
23
24
25
    const legendRectSize = 15; // size of rectangle in legend

    // const legend_cell_size = 15; // size of legend colored scare
    // const legend_x = width + 20; // begin legend a bit after the end of the chart
    // const legend_y = 600 - margin.bottom + 20; // begin legend a bit after the end of the chart
54e2baa6   hitier   Add charge charts...
26

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

5f89fdc7   hitier   Fix color scale: ...
29
30
    const xScale = d3.scaleBand()
        .range([0, width])
67ab2300   hitier   Fix appearance de...
31
        .padding(0.4);
6b44860d   hitier   Make a draw_line ...
32

5f89fdc7   hitier   Fix color scale: ...
33
    const yScale = d3.scaleLinear()
90c7b0e4   hitier   Small comments an...
34
        .range([height, 0]);
54e2baa6   hitier   Add charge charts...
35

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

90c7b0e4   hitier   Small comments an...
38
39
40
41

    //
    // Configure chart by the category given as arg
    //
83d933c9   hitier   New draw_categori...
42
43
    var chart_title = ""
    var category_title = ""
90c7b0e4   hitier   Small comments an...
44
45
    var draw_total_line = () => void 0;
    var draw_categories_bars = () => void 0;
7d095c38   hitier   One color scale b...
46

90c7b0e4   hitier   Small comments an...
47
    if (category_type == 'capacity') {
83d933c9   hitier   New draw_categori...
48
49
50
51
        chart_title = "Charges par fonction"
        category_title = "Fonction"
        //draw_total_line
        draw_categories_bars = draw_categories_grouped
7d095c38   hitier   One color scale b...
52
        colorScale = d3.scaleOrdinal(d3.schemeSet3);
90c7b0e4   hitier   Small comments an...
53
    } else if (category_type == 'service') {
83d933c9   hitier   New draw_categori...
54
55
56
57
        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...
58
        colorScale = d3.scaleOrdinal(d3.schemeTableau10);
90c7b0e4   hitier   Small comments an...
59
    } else if (category_type == 'project') {
c8b7caf5   hitier   Agent now uses co...
60
61
62
63
        chart_title = "Charges par projet"
        category_title = "Projet"
        draw_categories_bars = draw_categories_stacked
        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

a30b11ff   Anais Amato   Add an 'export me...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    // 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
88
                    "<li id='to_csv'>To CSV</li>" +
a30b11ff   Anais Amato   Add an 'export me...
89
90
                    "<li id='to_png'>To PNG</li>")
            d3.select("#to_png").on("click", download_png);
bf0e0b24   hitier   Fix empty charges...
91
92
93
            d3.select("#to_csv").on("click", function () {
                download_csv(this, data_url);
            })
a30b11ff   Anais Amato   Add an 'export me...
94
95
96
97
98
        } else {
            d3.select(".tooltip_hamburger").remove();
        }

    }
cfc5bded   hitier   More chart classe...
99
    // Create a download button inside the div contaning svg chart
a30b11ff   Anais Amato   Add an 'export me...
100
101
102
103
    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...
104
105
    const real_width = width + margin.left + margin.right;
    const real_height = height + margin.top + margin.bottom;
cfc5bded   hitier   More chart classe...
106

54e2baa6   hitier   Add charge charts...
107
    const svg = d3.select(div_selector).append("svg")
5ac5d2b6   Anais Amato   Resize d3 js grap...
108
        .attr("viewBox", [0, 0, real_width, real_height])
cfc5bded   hitier   More chart classe...
109
        .attr("class", "svg_chart")
5ac5d2b6   Anais Amato   Resize d3 js grap...
110
111
        .attr("width", real_width)
        .attr("height", real_height)
54e2baa6   hitier   Add charge charts...
112
113
114
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

069a5102   hitier   Fixed tooltip
115
    const tooltip = d3.select('html')
f9fef9d0   hitier   Add tooltip
116
117
118
119
120
121
122
123
124
125
126
127
128
        .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...
129
            .duration(900)
f9fef9d0   hitier   Add tooltip
130
131
132
133
134
135
            .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...
136
137
138
139
140
141
142
143
144
        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
145
146
147
148
149
        tooltip
            .transition()
            .duration(200)
            .style("opacity", 1);
        tooltip
582e1ee2   hitier   Change charts leg...
150
            .html("<b>" + category_title + ":</b> " + category_name + "<br>" + "<b>Charge:</b> " + category_charge + " ETP")
f9fef9d0   hitier   Add tooltip
151
152
153
154
            .style("left", (e.pageX - tooltip_offset.dx) + "px")
            .style("top", (e.pageY - tooltip_offset.dy) + "px")
    }

f9c1f568   hitier   Add dot on total ...
155
156
157
158
159
160
    var mouseleavedot = function (e, d) {
        d3.select(this).transition()
            .duration(1)
            .attr("r", dot_radius);
        mouseleave(d);
    }
6b44860d   hitier   Make a draw_line ...
161

f9c1f568   hitier   Add dot on total ...
162
163
164
165
166
167
168
169
170
    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...
171
            .html("<b>" + d.period + ": </b>" + d.total + " ETP")
f9c1f568   hitier   Add dot on total ...
172
173
174
175
            .style("left", (e.pageX - tooltip_offset_dot.dx) + "px")
            .style("top", (e.pageY - tooltip_offset_dot.dy) + "px")
    }

8afeed29   Anais Amato   Add hover effect ...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
    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
209
210
    var addlegend = function (color_scale) {

13c144c8   Anais Amato   Add horizontal le...
211
        // add horizontal legend
48613832   hitier   Fix legend keys o...
212
        let legend_keys = color_scale.domain();
13c144c8   Anais Amato   Add horizontal le...
213
        var legendSpacing = 5;
f0706d95   hitier   Add color legend
214

13c144c8   Anais Amato   Add horizontal le...
215
216
217
        var legendWrap = svg.append('g')
            .attr('width', '100%')
            .attr('class', 'legendwrap');
f0706d95   hitier   Add color legend
218

13c144c8   Anais Amato   Add horizontal le...
219
        var legend = svg.select('.legendwrap').selectAll('.legend')
48613832   hitier   Fix legend keys o...
220
            .data(legend_keys)
13c144c8   Anais Amato   Add horizontal le...
221
222
            .enter()
            .append('g')
8afeed29   Anais Amato   Add hover effect ...
223
224
225
            .attr('class', function (d) { return d})
            .on("mouseover", mouseoverlegend)
            .on("mouseleave", mouseleavelegend);
f0706d95   hitier   Add color legend
226

13c144c8   Anais Amato   Add horizontal le...
227
228
229
230
        legend.append('rect')
            .attr('width', legendRectSize)
            .attr('height', legendRectSize)
            .style('fill', color_scale)
cfc5bded   hitier   More chart classe...
231
            .attr('class', 'legend');
13c144c8   Anais Amato   Add horizontal le...
232
233

        legend.append('text')
f0706d95   hitier   Add color legend
234
            .attr('class', 'legend')
13c144c8   Anais Amato   Add horizontal le...
235
236
            .attr('x', legendRectSize + legendSpacing * 1.5)
            .attr('y', 13)
bf0e0b24   hitier   Fix empty charges...
237
            .text(function (d) {
13c144c8   Anais Amato   Add horizontal le...
238
239
240
241
242
243
244
245
246
                return d;
            });

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

        legend
bf0e0b24   hitier   Fix empty charges...
247
            .attr("transform", function (d, i) {
13c144c8   Anais Amato   Add horizontal le...
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
                var length = d3.select(this).select("text").node().getComputedTextLength() + 40;
                xpos = newxpos;
                if (width < xpos + length) {
                    newxpos = xpos = 0;
                    ypos += 30;
                }
                newxpos += length;
                if (newxpos > maxwidth) maxwidth = newxpos;

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

            });


        legendWrap
bf0e0b24   hitier   Fix empty charges...
263
            .attr("transform", function (d, i) {
13c144c8   Anais Amato   Add horizontal le...
264
265
266
                return "translate(0 ," + (height + 100) + ")";
            });

f0706d95   hitier   Add color legend
267
268
    }

83d933c9   hitier   New draw_categori...
269
270
    function draw_categories_grouped(data, categories) {

bf0e0b24   hitier   Fix empty charges...
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
        // 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...
286
287
        y_max = y_max * height_ratio
        yScale.domain([0, y_max])
83d933c9   hitier   New draw_categori...
288
289
290
291
        // Another scale for subgroup position
        var xCategories = d3.scaleBand()
            .domain(categories)
            .range([0, xScale.bandwidth()])
67ab2300   hitier   Fix appearance de...
292
            .padding([0.2])
83d933c9   hitier   New draw_categori...
293
294
295
296
297
298
299

        svg.append("g")
            .selectAll("g")
            // Enter in data = loop group per group
            .data(data)
            .enter()
            .append("g")
a5294567   hitier   Rewrite anonymous...
300
            .attr("transform", d => "translate(" + xScale(d.period) + ",0)")
83d933c9   hitier   New draw_categori...
301
302
303
304
305
306
307
            .selectAll("rect")
            .data(function (d) {
                return categories.map(function (key) {
                    return {key: key, value: d[key]};
                });
            })
            .enter().append("rect")
a5294567   hitier   Rewrite anonymous...
308
            .attr("x", d => xCategories(d.key))
83d933c9   hitier   New draw_categori...
309
            .attr("width", xCategories.bandwidth())
8dad7ce7   Anais Amato   Add animations to...
310
311
312
313
314
315
316
317
318
                /* Transition part */
                .attr("y",  d => { return height; })
                .attr("height", 0)
                    .transition()
                    .duration(750)
                    .delay(function (d, i) {
                        return i * 150;
                    })
            .attr("y", d => yScale(d.value))
a5294567   hitier   Rewrite anonymous...
319
            .attr("height", d => height - yScale(d.value))
22397f43   hitier   Show tooltip on g...
320
            .attr("fill", d => colorScale(d.key))
8afeed29   Anais Amato   Add hover effect ...
321
            .attr("class", d => d.key);
8dad7ce7   Anais Amato   Add animations to...
322
323

        svg.selectAll("rect")
22397f43   hitier   Show tooltip on g...
324
325
326
            .on("mouseover", mouseovergrouped)
            .on("mousemove", mousemove)
            .on("mouseleave", mouseleave);
83d933c9   hitier   New draw_categori...
327

8dad7ce7   Anais Amato   Add animations to...
328

a48677c4   hitier   Make a draw_categ...
329
330
    }

83d933c9   hitier   New draw_categori...
331
332
333
334
335
336
337
338
339
340
341
    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...
342
343
344
345
346
347
348
        // 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...
349
350
351
352
353
354
355
356
        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...
357
        // first draw one group for one category containing all bars over periods
a48677c4   hitier   Make a draw_categ...
358
359
360
361
        let groups = svg.selectAll("g.category")
            .data(stacked_data)
            .enter()
            .append("g")
8afeed29   Anais Amato   Add hover effect ...
362
            .attr("class", d => d.key)
83d933c9   hitier   New draw_categori...
363
            .style("fill", (d) => colorScale(d.key));
a48677c4   hitier   Make a draw_categ...
364

90c7b0e4   hitier   Small comments an...
365
        // then draw each period/category bar
a48677c4   hitier   Make a draw_categ...
366
367
368
369
370
371
372
        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())
8dad7ce7   Anais Amato   Add animations to...
373
374
375
376
377
378
379
380
                /* 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...
381
382
            .attr("y", d => yScale(d[1]))
            .attr("height", d => height - yScale(d[1] - d[0]))
8dad7ce7   Anais Amato   Add animations to...
383
384

        groups.selectAll("rect")
a48677c4   hitier   Make a draw_categ...
385
386
387
388
389
390
            .on("mouseover", mouseover)
            .on("mousemove", mousemove)
            .on("mouseleave", mouseleave);

    }

6b44860d   hitier   Make a draw_line ...
391
392
    function draw_totalcharge_line(data) {
        // Build the total charge by period;
518c7cc5   hitier   Draw the total ca...
393
394
        // it will be used for the line drawing above bars.
        //
6b44860d   hitier   Make a draw_line ...
395
396
        var periods_total_charge = []

518c7cc5   hitier   Draw the total ca...
397
398
399
400
401
        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...
402
            row['total'] = roundToTwo(d3.sum(period_values))
518c7cc5   hitier   Draw the total ca...
403
404
405
            periods_total_charge.push(row)
        });

6b44860d   hitier   Make a draw_line ...
406
407
408
409
410
411
412
413
414
415
        // 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...
416
417
            .attr("d", line)
            .lower();// set it below bars if called after
6b44860d   hitier   Make a draw_line ...
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432

        // 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...
433
434
            .on("mouseleave", mouseleavedot)
            .lower();// set it below bars if called after
6b44860d   hitier   Make a draw_line ...
435
436
437
438

    }

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

6b44860d   hitier   Make a draw_line ...
443
444
445
        var periods = d3.map(data, d => d.period)
        xScale.domain(periods)

90c7b0e4   hitier   Small comments an...
446
447
        // Filter datas to only keep non zero categories
        // TODO: should be done on server (python/flask) side
518c7cc5   hitier   Draw the total ca...
448
        //
90c7b0e4   hitier   Small comments an...
449
        // 1- Get the charge sum for each category over periods
f0706d95   hitier   Add color legend
450
        // That will leave '0' to categories with no charge at all
a07df204   hitier   Compute for group...
451
        // TODO: to be done with Object.keys, Object.values and d3 filtering methods
ce5f45ea   hitier   Fix data bug
452
        //
6b44860d   hitier   Make a draw_line ...
453
        var categories_total_charge = {}
f0706d95   hitier   Add color legend
454
455
        data.forEach(function (d) {
            Object.keys(d).forEach(function (k) {
04f2b6e8   hitier   Fix period as cat...
456
457
458
                    if (k === 'period') {
                        return;
                    }
f0706d95   hitier   Add color legend
459
460
461
                    if (categories_total_charge.hasOwnProperty(k)) {
                        categories_total_charge[k] += +d[k]
                    } else {
582e1ee2   hitier   Change charts leg...
462
                        categories_total_charge[k] = +d[k]
f0706d95   hitier   Add color legend
463
                    }
966f9b78   hitier   Js Round float be...
464
                    categories_total_charge[k] = roundToTwo(categories_total_charge[k])
f0706d95   hitier   Add color legend
465
466
467
468
                }
            )
        })

518c7cc5   hitier   Draw the total ca...
469
        // 2- Now, filter only categories that have a non-zero charge
a07df204   hitier   Compute for group...
470
        // TODO: to be done with Object.keys, Object.values and d3 filtering methods
90c7b0e4   hitier   Small comments an...
471
        //
f0706d95   hitier   Add color legend
472
473
474
475
476
477
478
        var categories = []
        for (var key in categories_total_charge) {
            if (categories_total_charge[key] > 0) {
                categories.push(key)
            }
        }

518c7cc5   hitier   Draw the total ca...
479
        //
90c7b0e4   hitier   Small comments an...
480
        // Draw the  bars, stacked or grouped
83d933c9   hitier   New draw_categori...
481
482
        //
        draw_categories_bars(data, categories)
54e2baa6   hitier   Add charge charts...
483

518c7cc5   hitier   Draw the total ca...
484
        //
83d933c9   hitier   New draw_categori...
485
486
487
488
489
490
491
492
493
494
        //  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...
495

f0706d95   hitier   Add color legend
496
497
        // Xaxis
        //
518c7cc5   hitier   Draw the total ca...
498
        const xAxis = d3.axisBottom(xScale)
f0706d95   hitier   Add color legend
499

f0706d95   hitier   Add color legend
500
        // Draw Xaxis
68fd83a8   hitier   Add axis
501
        svg.append("g")
cfc5bded   hitier   More chart classe...
502
            .attr("class", "x_axis")
68fd83a8   hitier   Add axis
503
504
505
506
507
508
509
510
            .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...
511
512
513
514
515
        // Yaxis
        //
        const yAxis = d3.axisLeft(yScale)
            .ticks(y_ticks_num)

f0706d95   hitier   Add color legend
516
        // Draw Yaxis
68fd83a8   hitier   Add axis
517
        svg.append("g")
cfc5bded   hitier   More chart classe...
518
            .attr("class", "y_axis")
68fd83a8   hitier   Add axis
519
            .call(yAxis)
68fd83a8   hitier   Add axis
520

ff5fd5bf   hitier   Less and Longer ...
521
522
523
524
525
526
527
528
529
530
        // 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...
531
            .lower();// set it below bars if called after
ff5fd5bf   hitier   Less and Longer ...
532

f0706d95   hitier   Add color legend
533
        // Write Y axis title
68fd83a8   hitier   Add axis
534
535
536
537
538
        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...
539
            .text("Charge en ETP");
54e2baa6   hitier   Add charge charts...
540

6b44860d   hitier   Make a draw_line ...
541
        //
f0706d95   hitier   Add color legend
542
        // Write chart Title
6b44860d   hitier   Make a draw_line ...
543
544
        //

f0706d95   hitier   Add color legend
545
        // part 1
de63cb72   hitier   Add title to proj...
546
        svg.append("text")
3c21ae9f   hitier   Change bar colors
547
548
549
550
            .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...
551
            .text(entity_name);
f0706d95   hitier   Add color legend
552
        // part 2
de63cb72   hitier   Add title to proj...
553
        svg.append("text")
3c21ae9f   hitier   Change bar colors
554
555
556
557
558
            .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...
559

518c7cc5   hitier   Draw the total ca...
560

6b44860d   hitier   Make a draw_line ...
561
    }); // end of d3.csv().then({})
54e2baa6   hitier   Add charge charts...
562
563

}