Blame view

app/main/templates/agent.html 5.96 KB
d9f5cfc9   hitier   New agent page dy...
1
{% extends "base_page.html" %}
04e2a90d   hitier   Show agent charge...
2
3

{% block more_heads %}
11b5b6f8   hitier   Fix css file path
4
<link href="{{ url_for('main.static', filename='css/charges.css') }}" rel="stylesheet" type="text/css"/>
04e2a90d   hitier   Show agent charge...
5
6
{% endblock %}

d9f5cfc9   hitier   New agent page dy...
7
{% block content %}
b15e4db5   hitier   Tooltip on mouseo...
8
<div id="charge_div"></div>
70da5dd5   hitier   Insert charges ta...
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<table id="charge_table">
  <thead>
  <tr>
  {% for header in charges[0] %}
    <td>{{header}}</td>
  {% endfor %}
  </tr>
  </thead>
  <tbody>
  {% for line in charges[1:] %}
  <tr>
    {% for cell in line %}
      <td>{{cell}}</td>
    {% endfor %}
  </tr>
  {% endfor %}

  </tbody>
</table>
d9f5cfc9   hitier   New agent page dy...
28
{% endblock %}
04e2a90d   hitier   Show agent charge...
29
30


d9f5cfc9   hitier   New agent page dy...
31
{% block more_scripts %}
b15e4db5   hitier   Tooltip on mouseo...
32
33
34
35
36
37
38
{% include 'd3js-includes.html' %}
<script>

  const margin = {top: 40, right: 40, bottom: 90, left: 120},
      width = 900 - margin.left - margin.right,
      height = 500 - margin.top - margin.bottom;

94071fee   hitier   Better axis position
39
40
  const tooltip_offset = {dx: 300, dy: 120}

b15e4db5   hitier   Tooltip on mouseo...
41
42
  const x = d3.scaleBand()
      .range([0, width])
73359858   hitier   Fix non empty cha...
43
      .padding(0.2);
b15e4db5   hitier   Tooltip on mouseo...
44
45
46
47
48
49
50
51
52
53
54

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

  const svg = d3.select("#charge_div").append("svg")
      .attr("id", "svg")
      .attr("width", width + margin.left + margin.right)
      .attr("height", height + margin.top + margin.bottom)
      .append("g")
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

b15e4db5   hitier   Tooltip on mouseo...
55
56

  // On demande à D3JS de charger notre fichier
64515ad9   hitier   New agent charges...
57
  d3.json("{{url_for('main.charge_agent_json', agent_id=agent.id)}}").then(data => {
22c5ff60   hitier   New stacked_charg...
58
59
60

    // waiting for structure of the form:
    //
17a768f8   hitier   Enhance agent cha...
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
    // {
    // '2014_S1': {'4Q++': None,
    //          'Activité service C2L': None,
    //          'Activité service COMCL': None,
    //          .
    //           ...},
    // '2014_S2': {'4Q++': None,
    //          'Activité service C2L': None,
    //          .
    //          .
    //          .
    // '2021_S2': {'4Q++': None,
    //          .
    //          .
    //          'Test IAS': None,
    //          'cahier des charges DT insu': None,
    //          'ŒIL': None
    //          }
    //   }


22c5ff60   hitier   New stacked_charg...
82
83
84
    var periods = Object.keys(data)
    var first_stacked_charges = Object.values(data)[0]
    var projects = Object.keys(first_stacked_charges)
22c5ff60   hitier   New stacked_charg...
85

22c5ff60   hitier   New stacked_charg...
86
87
88
89
    var x = d3.scaleBand()
        .domain(periods)
        .range([0, width])
        .padding(0.2)
94071fee   hitier   Better axis position
90
91
92
93
94
95
96
97
98
99
100
101
102
103
    // Ajout de l'axe X au SVG
    // Déplacement de l'axe horizontal et du futur texte (via la fonction translate) au bas du SVG
    // Selection des noeuds text, positionnement puis rotation
    // svg.append('g')
    //     .attr('transform', 'translate(20, ' + height + ')')
    //     .call(d3.axisBottom(x).tickSizeOuter(0));
    svg.append("g")
        .attr("transform", "translate(20," + height + ")")
        .call(d3.axisBottom(x).tickSize(5))
        .selectAll("text")
        .style("text-anchor", "end")
        .attr("dx", "-.8em")
        .attr("dy", ".15em")
        .attr("transform", "rotate(-65)");
22c5ff60   hitier   New stacked_charg...
104
105
106
107
108
109
110
111
112

    var y = d3.scaleLinear()
        .domain([0, 100])
        .range([height, 0])

    svg.append('g')
        .attr('transform', 'translate(20, 0)')
        .call(d3.axisLeft(y))

94071fee   hitier   Better axis position
113
114
115
116
117
118
119
120
121

    svg.append("text")
        .attr("text-anchor", "end")
        .attr("transform", "rotate(-90)")
        .attr("y", -margin.left + 60)
        .attr("x", -margin.top - 70)
        .text("Charge (ETP)")


22c5ff60   hitier   New stacked_charg...
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
    var color = d3.scaleOrdinal()
        .domain(projects)
        .range(['#e41a1c', '#377eb8', '#4daf4a',
          "#800000",
          "#FFFF00",
          "#808000",
          "#00FF00",
          "#008000",
          "#00FFFF",
          "#008080",
          "#0000FF",
          "#000080",
          "#FF00FF",
          "#800080",
        ]);

17a768f8   hitier   Enhance agent cha...
138
    var stack_generator = d3.stack().keys(projects)
22c5ff60   hitier   New stacked_charg...
139

17a768f8   hitier   Enhance agent cha...
140
141
142
    // Building a list of dict, with projects as keys, like in the input dat,
    // but with a new key, 'period' wich value is the period string for that line
    // This is need for the d3js stack_generator function
22c5ff60   hitier   New stacked_charg...
143
    var stackable_data = []
17a768f8   hitier   Enhance agent cha...
144
    Object.keys(data).forEach(function (period) {
22c5ff60   hitier   New stacked_charg...
145
      line = data[period];
17a768f8   hitier   Enhance agent cha...
146
      line['period'] = period;
22c5ff60   hitier   New stacked_charg...
147
148
149
150
151
      stackable_data.push(line)
    });

    var stacked_data = stack_generator(stackable_data)

17a768f8   hitier   Enhance agent cha...
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171

    // ----------------
    // Create a tooltip
    // ----------------
    var tooltip = d3.select("#charge_div")
        .append("div")
        .style("opacity", 0)
        .attr("class", "tooltip")

    // // Three function that change the tooltip when user hover / move / leave a cell
    // var mouseover = function (d) {
    //   var subgroupName = d3.select(this.parentNode).datum().key;
    //   // var subgroupValue = d.data[subgroupName];
    //   tooltip
    //       .html("subgroup: " + subgroupName + "<br>" + "Value: " + subgroupValue)
    //       .style("opacity", 1)
    // }

    var mousemove = function (e, d) {
      tooltip
94071fee   hitier   Better axis position
172
173
          .style("left", (e.x - tooltip_offset.dx) + "px")
          .style("top", (e.y - tooltip_offset.dy) + "px")
17a768f8   hitier   Enhance agent cha...
174
175
176
177
178
179
180
181
182
183
184
185
    }

    var mouseleave = function (d) {
      tooltip
          .transition()
          .duration(100)
          .style("opacity", 0)
    }

    var mouseover = function (e, d) {
      var project_name = d3.select(this.parentNode).datum().key
      var project_charge = d.data[project_name]
94071fee   hitier   Better axis position
186
187
      tooltip
          .transition()
17a768f8   hitier   Enhance agent cha...
188
189
190
          .duration(200)
          .style("opacity", 1);
      tooltip
94071fee   hitier   Better axis position
191
          .html("Project: " + project_name + "<br>" + "Charge: " + project_charge + "%")
17a768f8   hitier   Enhance agent cha...
192
193
194
          .style("left", (e.x - 400) + "px")
          .style("top", (e.y - 90) + "px");
    }
22c5ff60   hitier   New stacked_charg...
195
196
197
198
199
200
201
202
203
204
205

    svg.append('g')
        .selectAll('g')
        .data(stacked_data)
        .enter().append('g')
        .attr("fill", function (d) {
          return color(d.key);
        })
        .selectAll("rect")
        // enter a second time = loop subgroup per subgroup to add all rectangles
        .data(d => d)
b15e4db5   hitier   Tooltip on mouseo...
206
        .enter().append("rect")
22c5ff60   hitier   New stacked_charg...
207
208
209
        .attr("x", d => x(d.data.period) + 20)
        .attr("y", d => y(d[1]))
        .attr("height", d => y(d[0]) - y(d[1]))
b15e4db5   hitier   Tooltip on mouseo...
210
        .attr("width", x.bandwidth())
17a768f8   hitier   Enhance agent cha...
211
212
213
214
        .attr("stroke", "black")
        .on("mouseover", mouseover)
        .on("mousemove", mousemove)
        .on("mouseleave", mouseleave);
b15e4db5   hitier   Tooltip on mouseo...
215
216
  });
</script>
d9f5cfc9   hitier   New agent page dy...
217
{% endblock %}