Blame view

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

{% block more_heads %}
b15e4db5   hitier   Tooltip on mouseo...
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<style type="text/css">
  #charge_div {
    background-color: #fAfAfA;
    border: 1pt solid black;
    display: inline-block;
  }

  rect.bar:hover {
    fill: dimgrey;
  }

  rect.bar {
    fill: rgb(127, 127, 159);
  }

  .tooltip {
    position: absolute;
17a768f8   hitier   Enhance agent cha...
21
    opacity: 1.0;
b15e4db5   hitier   Tooltip on mouseo...
22
23
24
25
26
    z-index: 1000;
    text-align: left;
    border-radius: 4px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
17a768f8   hitier   Enhance agent cha...
27
28
29
30
31
    padding: 10px;
    border: 1px solid;
    background-color: white;
    color: black;
    /*font: 12px sans-serif;*/
b15e4db5   hitier   Tooltip on mouseo...
32
33
34
35
    max-width: 300px;
  }

</style>
04e2a90d   hitier   Show agent charge...
36
37
{% endblock %}

d9f5cfc9   hitier   New agent page dy...
38
{% block content %}
b15e4db5   hitier   Tooltip on mouseo...
39
<div id="charge_div"></div>
d9f5cfc9   hitier   New agent page dy...
40
{% endblock %}
04e2a90d   hitier   Show agent charge...
41
42


d9f5cfc9   hitier   New agent page dy...
43
{% block more_scripts %}
b15e4db5   hitier   Tooltip on mouseo...
44
45
46
47
48
49
50
{% 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
51
52
  const tooltip_offset = {dx: 300, dy: 120}

b15e4db5   hitier   Tooltip on mouseo...
53
54
  const x = d3.scaleBand()
      .range([0, width])
73359858   hitier   Fix non empty cha...
55
      .padding(0.2);
b15e4db5   hitier   Tooltip on mouseo...
56
57
58
59
60
61
62
63
64
65
66

  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...
67
68

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

    // waiting for structure of the form:
    //
17a768f8   hitier   Enhance agent cha...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
    // {
    // '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...
94
95
96
    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...
97

22c5ff60   hitier   New stacked_charg...
98
99
100
101
    var x = d3.scaleBand()
        .domain(periods)
        .range([0, width])
        .padding(0.2)
94071fee   hitier   Better axis position
102
103
104
105
106
107
108
109
110
111
112
113
114
115
    // 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...
116
117
118
119
120
121
122
123
124

    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
125
126
127
128
129
130
131
132
133

    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...
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
    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...
150
    var stack_generator = d3.stack().keys(projects)
22c5ff60   hitier   New stacked_charg...
151

17a768f8   hitier   Enhance agent cha...
152
153
154
    // 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...
155
    var stackable_data = []
17a768f8   hitier   Enhance agent cha...
156
    Object.keys(data).forEach(function (period) {
22c5ff60   hitier   New stacked_charg...
157
      line = data[period];
17a768f8   hitier   Enhance agent cha...
158
      line['period'] = period;
22c5ff60   hitier   New stacked_charg...
159
160
161
162
163
      stackable_data.push(line)
    });

    var stacked_data = stack_generator(stackable_data)

17a768f8   hitier   Enhance agent cha...
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183

    // ----------------
    // 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
184
185
          .style("left", (e.x - tooltip_offset.dx) + "px")
          .style("top", (e.y - tooltip_offset.dy) + "px")
17a768f8   hitier   Enhance agent cha...
186
187
188
189
190
191
192
193
194
195
196
197
    }

    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
198
199
      tooltip
          .transition()
17a768f8   hitier   Enhance agent cha...
200
201
202
          .duration(200)
          .style("opacity", 1);
      tooltip
94071fee   hitier   Better axis position
203
          .html("Project: " + project_name + "<br>" + "Charge: " + project_charge + "%")
17a768f8   hitier   Enhance agent cha...
204
205
206
          .style("left", (e.x - 400) + "px")
          .style("top", (e.y - 90) + "px");
    }
22c5ff60   hitier   New stacked_charg...
207
208
209
210
211
212
213
214
215
216
217

    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...
218
        .enter().append("rect")
22c5ff60   hitier   New stacked_charg...
219
220
221
        .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...
222
        .attr("width", x.bandwidth())
17a768f8   hitier   Enhance agent cha...
223
224
225
226
        .attr("stroke", "black")
        .on("mouseover", mouseover)
        .on("mousemove", mousemove)
        .on("mouseleave", mouseleave);
b15e4db5   hitier   Tooltip on mouseo...
227
228
  });
</script>
d9f5cfc9   hitier   New agent page dy...
229
{% endblock %}