Blame view

web/view/home.html.jinja2 20.8 KB
9390ec89   Goutte   Initial experimen...
1
2
3
4
{% extends 'layout.html.jinja2' %}
{% set menu_section = 'home' %}
{% block title %}Home{% endblock %}

4900d232   Goutte   Add the time inte...
5
6
7
{# This is the main template file, along with the layout. #}
{# The engine is Jinja2, close to Twig (yet not as good) #}

9390ec89   Goutte   Initial experimen...
8
9
{% block content %}

4cf497e0   Goutte   Make the targets ...
10
{% macro target_button(target) -%}
80352490   Goutte   Multi model suppo...
11
12
13
    <div class="target {{ target.slug }} {{ 'locked' if target.locked else 'active' }}"
         data-target-slug="{{ target.slug }}">
      <img width="64px" height="64px"
d1c44c51   Goutte   Enable Earth
14
           src="{{ static('img/target/'~target.slug~'_256.png') }}"
80352490   Goutte   Multi model suppo...
15
16
17
18
           title="{{ target.title }}"
           alt="{{ target.name }}">
      <img width="64px" height="64px"
           src="{{ static('img/target/empty_128.png') }}"
60b73eb1   Goutte   Change temperatur...
19
20
           title="No data at specified interval for {{ target.title }}."
           alt="NO DATA"
80352490   Goutte   Multi model suppo...
21
           class="decorator empty">
60b73eb1   Goutte   Change temperatur...
22
23
24
25
26
      <img width="64px" height="64px"
           src="{{ static('img/target/error_128.png') }}"
           title="There was an error with {{ target.title }}."
           alt="ERROR"
           class="decorator error">
80352490   Goutte   Multi model suppo...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
      <div class="decorator loading" title="Loading data for {{ target.title }}…">
        <div class="small-loader-container">
          <div class="small-loader-circle-1">
            <div class="small-loader-circle-2">
              <div class="small-loader-circle-3">
                <div class="small-loader-circle-4">
                  <div class="small-loader-circle-5">
                    <div class="small-loader-circle-6">
                      <div class="small-loader-circle-7">
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
4cf497e0   Goutte   Make the targets ...
46
47
{%- endmacro %}

23110c4a   Goutte   Add icons to the ...
48
{% macro icon(name) %}<i class="fa fa-{{ name }}" aria-hidden="true"></i>{% endmacro %}
9c0c4509   Goutte   Add a loader to t...
49
50
51
52
53
54
55
56
57
58

<div id="plots_loader">
  <p class="loader-text">Loading Heliopropa&hellip;<br>This might take a while.</p>
  <div id="plots_loader_img1" class="img"></div>
  <div id="plots_loader_img2" class="img"></div>
  <div id="plots_loader_img3" class="img"></div>
  <div id="plots_loader_img4" class="img"></div>
  <div id="plots_loader_img5" class="img"></div>
</div>

f6ed8d85   Goutte   Rework layout as ...
59
60
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer">

f6ed8d85   Goutte   Rework layout as ...
61
  <div class="mdl-layout__drawer">
297a7dfc   Goutte   Add support for i...
62

23110c4a   Goutte   Add icons to the ...
63
    <span class="mdl-layout-title" title="Two years maximum.">{{ icon('calendar') }} Time Interval</span>
297a7dfc   Goutte   Add support for i...
64

1754789b   Goutte   Decorate and clea...
65
66
67
68
69
    <form id="form_time_interval" action="#">
      <div class="mdl-textfield mdl-js-textfield">
      <input type="date" id="started_at" name="started_at" title="The date of the beginning of the interval to observe." class="mdl-textfield__input">
      <input type="date" id="stopped_at" name="stopped_at" title="The date of the end of the interval to observe. (exclusive)" class="mdl-textfield__input">
      </div>
23110c4a   Goutte   Add icons to the ...
70
      <input type="submit" id="apply_new_interval" value="Load new interval" title="Two years maximum. This may take a while." class="mdl-button mdl-js-button mdl-js-ripple-effect">
1754789b   Goutte   Decorate and clea...
71
72
73
74
    </form>

    <br>
    <hr class="clear">
4900d232   Goutte   Add the time inte...
75

23110c4a   Goutte   Add icons to the ...
76
    <span class="mdl-layout-title">{{ icon('eercast') }} Planets</span>
f6ed8d85   Goutte   Rework layout as ...
77

4900d232   Goutte   Add the time inte...
78
    <section class="targets-filters">
4cf497e0   Goutte   Make the targets ...
79
80
{% for target in planets %}
      {{ target_button(target) }}
a79c5268   Goutte   Add probes and co...
81
{% endfor %}
c42fea3a   Goutte   Rework the CSS wi...
82
    </section>
a79c5268   Goutte   Add probes and co...
83
84
85
86

    <br>
    <hr class="clear">

23110c4a   Goutte   Add icons to the ...
87
    <span class="mdl-layout-title">{{ icon('rocket') }} Probes &amp; Comets</span>
a79c5268   Goutte   Add probes and co...
88

4900d232   Goutte   Add the time inte...
89
    <section class="targets-filters">
4cf497e0   Goutte   Make the targets ...
90
91
{% for target in probes %}
      {{ target_button(target) }}
a79c5268   Goutte   Add probes and co...
92
{% endfor %}
4cf497e0   Goutte   Make the targets ...
93
94
{% for target in comets %}
      {{ target_button(target) }}
a79c5268   Goutte   Add probes and co...
95
96
97
{% endfor %}
    </section>

b550c2b0   Goutte   Rework the home s...
98
    <br>
c42fea3a   Goutte   Rework the CSS wi...
99
    <hr class="clear">
b550c2b0   Goutte   Rework the home s...
100

297a7dfc   Goutte   Add support for i...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
{#    <span class="mdl-layout-title">{{ icon('database') }} Inputs</span>#}
{##}
{#    <section class="section-drawer">#}
{#{% for input in config.inputs %}#}
{#      <label class="mdl-radio mdl-js-radio mdl-js-ripple-effect" for="option-input-{{ input.slug }}" title="{{ input.desc }}">#}
{#        <input type="radio" id="option-input-{{ input.slug }}" class="mdl-radio__button" name="input_slug" value="{{ input.slug }}" {{ 'checked' if input.slug == input_slug }}>#}
{#        <span class="mdl-radio__label">{{ input.name }}</span>#}
{#      </label>#}
{#      <br />#}
{#{% endfor %}#}
{#      <br />#}
{#      <input type="button" id="apply_new_input" value="Reload for input" title="This may take a while." class="mdl-button mdl-js-button mdl-js-ripple-effect">#}
{#    </section>#}
{##}
{#    <hr class="clear">#}

23110c4a   Goutte   Add icons to the ...
117
    <span class="mdl-layout-title">{{ icon('flask') }} Parameters</span>
b550c2b0   Goutte   Rework the home s...
118
119

    <nav id="parameters" class="mdl-navigation">
bde97e4d   Goutte   Add more changes ...
120
121
122
      {% for p in parameters %}
      <a class="mdl-navigation__link parameter{{ ' active' if p.active }}" data-ts-slug="{{ p.slug }}" href="#">{{ p.name }}</a>
      {% endfor %}
b550c2b0   Goutte   Rework the home s...
123
124
    </nav>

a4a9ef03   Goutte   Cache generated C...
125
126
    <div class="mdl-layout-spacer"></div>

c42fea3a   Goutte   Rework the CSS wi...
127
  </div>
80352490   Goutte   Multi model suppo...
128
129


b7fe650c   Goutte   Misc bundle of ol...
130
  <main id="plots_wrapper" class="mdl-layout__content">
9390ec89   Goutte   Initial experimen...
131

b550c2b0   Goutte   Rework the home s...
132
    <div class="mdl-grid">
80352490   Goutte   Multi model suppo...
133
      <div class="mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-cell--4-col-phone">
b550c2b0   Goutte   Rework the home s...
134
        <section id="orbits"></section>
cad44b6d   Goutte   Finish adding the...
135
136
        <div class="plots-actions plots-buttons">
          <button id="download" class="mdl-button mdl-button--raised mdl-button--primary"
dc0be992   Goutte   Support having no...
137
                  title="Download the raw data for each selected target and parameters.">
cad44b6d   Goutte   Finish adding the...
138
139
140
141
142
143
144
            Download
          </button>
          <button id="samp" class="samp mdl-button mdl-button--raised mdl-button--primary mdl-button--disabled"
                  title="Send the data to a connected SAMP hub.">
            SAMP
          </button>
        </div>
b550c2b0   Goutte   Rework the home s...
145
      </div>
80352490   Goutte   Multi model suppo...
146
      <div class="mdl-cell mdl-cell--8-col mdl-cell--8-col-tablet mdl-cell--4-col-phone">
9c0c4509   Goutte   Add a loader to t...
147
148
149
        <section id="time_series">
          <p id="zoom_controls_help" class="help mdl-cell--8-col">Drag to zoom in, double click to zoom out.</p>
        </section>
b550c2b0   Goutte   Rework the home s...
150
151
152
      </div>
    </div>

f6ed8d85   Goutte   Rework layout as ...
153
154
  </main>
</div>
9390ec89   Goutte   Initial experimen...
155
156
157
{% endblock %}


80352490   Goutte   Multi model suppo...
158
{#### CSS ####################################################################}
7d6dee0f   Goutte   Continue refacto ...
159

9390ec89   Goutte   Initial experimen...
160
161
{% block styles %}
  <style>
c42fea3a   Goutte   Rework the CSS wi...
162
    html, body {
f6ed8d85   Goutte   Rework layout as ...
163
164
{#      background-color: #322e3f;#}
{#      color: #e3e3e3;#}
c42fea3a   Goutte   Rework the CSS wi...
165
    }
23110c4a   Goutte   Add icons to the ...
166
167
    .mdl-layout__drawer > .mdl-layout-title {
      padding-left: 30px;
b500e561   Goutte   Invert the orbits...
168
169
170
171
      line-height: 42px;
    }
    .mdl-layout__drawer > .mdl-layout-title:first-of-type {
      line-height: 60px;
23110c4a   Goutte   Add icons to the ...
172
173
    }

9c0c4509   Goutte   Add a loader to t...
174
175
176
    #plots_wrapper {
{#      position: relative;#}
    }
80352490   Goutte   Multi model suppo...
177

9c0c4509   Goutte   Add a loader to t...
178
    #plots_loader {
6b149919   Goutte   Add a Download bu...
179
      position: fixed;
9c0c4509   Goutte   Add a loader to t...
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
      top: 0; left: 0; bottom: 0; right: 0;
      height: 100%;
      width: 100%;
      background-color: #fff;
      z-index: 1000;
    }

    #plots_loader .loader-text {
      width: 200px;
      height: 30px;
      position: absolute;
      top: -240px; left: -32px; bottom: 0; right: 0;
      margin: auto;
      text-align: center;
      font-size: 1.0em;
      font-style: italic;
      color: darkgrey;
    }

    #plots_loader .img {
      width: 100px;
      height: 100px;
      border-radius: 100%;
      position: absolute;
      border: 1px solid #6978ff;
80352490   Goutte   Multi model suppo...
205
      animation: keyframes_rotate 1s;
9c0c4509   Goutte   Add a loader to t...
206
207
208
209
210
211
212
213
214
215
216
      animation-iteration-count: infinite;
      transition: 2s;
      border-bottom: none;
      border-right: none;
      animation-timing-function: linear;
      margin-left: -70px;
      margin-top: -70px;
      left: 50%;
      top: 50%;
    }

80352490   Goutte   Multi model suppo...
217
    @keyframes keyframes_rotate {
9c0c4509   Goutte   Add a loader to t...
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
      from {
        transform: rotate(0deg);
      }
      50% {
        transform: rotate(180deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }

    #plots_loader #plots_loader_img2 {
      width: 90px;
      height: 90px;
      left: 50.35%;
      top: 50.7%;
      animation-delay: .2s;
    }

    #plots_loader #plots_loader_img3 {
      width: 80px;
      height: 80px;
      left: 50.70%;
      top: 51.4%;
      animation-delay: .4s;
    }

    #plots_loader #plots_loader_img4 {
      width: 70px;
      height: 70px;
      left: 51.05%;
      top: 52.1%;
      animation-delay: .6s;
    }

    #plots_loader #plots_loader_img5 {
      width: 60px;
      height: 60px;
      left: 51.40%;
      top: 52.8%;
      animation-delay: .8s;
    }

cad44b6d   Goutte   Finish adding the...
261
262
    .plots-buttons {
      text-align: center;
6b149919   Goutte   Add a Download bu...
263
264
      margin: 3em auto;
    }
cad44b6d   Goutte   Finish adding the...
265
266
267
    .plots-buttons button {
      margin: auto 1em;
    }
6b149919   Goutte   Add a Download bu...
268

80352490   Goutte   Multi model suppo...
269
270
271
    #time_series svg {
      cursor: crosshair;
    }
9c0c4509   Goutte   Add a loader to t...
272
273
274
275
276
277
278
279
280
281
282
    #time_series .help {
      position: absolute;
      text-align: center;
      font-size: 0.9em;
      font-style: italic;
      color: darkgrey;
      display: none;
    }
    #time_series:hover .help {
      display: block;
    }
18f38374   Goutte   Crisp edges for a...
283
284
    .axis path, .axis line {
      fill: none;
f6ed8d85   Goutte   Rework layout as ...
285
{#      stroke: #f4f4f4;#}
18f38374   Goutte   Crisp edges for a...
286
287
288
      shape-rendering: crispEdges;
      stroke-width: 1px;
    }
c42fea3a   Goutte   Rework the CSS wi...
289
    svg text {
f6ed8d85   Goutte   Rework layout as ...
290
{#      fill: #f4f4f4;#}
c42fea3a   Goutte   Rework the CSS wi...
291
    }
08569a6b   Goutte   Add a zooming bru...
292
293
294
    #time_series svg .brush .selection {
      fill: #efa02c;
      fill-opacity: 0.382;
908b4423   Goutte   Bump to a newer j...
295
    }
9390ec89   Goutte   Initial experimen...
296
297
298
299
300
    path.line {
      fill: none;
      stroke: steelblue;
      stroke-width: 1px;
    }
81c9b2e8   Goutte   Add the values to...
301
    circle.cursor-circle {
b550c2b0   Goutte   Rework the home s...
302
303
304
305
306
307
308
309
      fill: black;
      stroke: rgba(20, 20, 20, 0.48);
    }
    text.cursor-text {
{#      font-family: 'Ubuntu', 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;#}
{#      font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;#}
      font-family: "Ubuntu Mono", 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
      text-align: right;
81c9b2e8   Goutte   Add the values to...
310
311
312
    }
    text.cursor-text-shadow {
      stroke: white;
b550c2b0   Goutte   Rework the home s...
313
314
      stroke-width: 5px;
      opacity: 0.777
81c9b2e8   Goutte   Add the values to...
315
    }
c42fea3a   Goutte   Rework the CSS wi...
316
    path.orbit.orbit_section {
2d2af24b   Goutte   Add a basic orbit...
317
318
      fill: none;
      stroke: steelblue;
1324cc91   Goutte   Make the footer i...
319
      stroke-width: 1.5px;
c42fea3a   Goutte   Rework the CSS wi...
320
321
322
323
324
325
326
    }
    ellipse.orbit.orbit_ellipse {
      fill: none;
      stroke: #a3a3a3;
      stroke-width: 1px;
      stroke-dasharray: 5px;
    }
1754789b   Goutte   Decorate and clea...
327
328
329
330
331
332
333
334
335
    #form_time_interval {
      padding-left: 30px;
    }
    #form_time_interval .mdl-textfield {
      padding-top: 0;
    }
    #started_at, #stopped_at {
      width: 85%;
    }
297a7dfc   Goutte   Add support for i...
336
337
338
    .section-drawer {
      padding-left: 3em;
    }
4900d232   Goutte   Add the time inte...
339
    .targets-filters {
a79c5268   Goutte   Add probes and co...
340
341
      padding-left: 17px;
    }
4900d232   Goutte   Add the time inte...
342
    .targets-filters .target {
c42fea3a   Goutte   Rework the CSS wi...
343
      float: left;
4cf497e0   Goutte   Make the targets ...
344
      cursor: pointer;
80352490   Goutte   Multi model suppo...
345
      position: relative;
c42fea3a   Goutte   Rework the CSS wi...
346
    }
4900d232   Goutte   Add the time inte...
347
    .targets-filters .target:not(.active) {
c42fea3a   Goutte   Rework the CSS wi...
348
349
350
351
352
353
      -webkit-filter: grayscale(100%);
         -moz-filter: grayscale(100%);
           -o-filter: grayscale(100%);
          -ms-filter: grayscale(100%);
              filter: grayscale(100%);
    }
4900d232   Goutte   Add the time inte...
354
    .targets-filters .target.locked {
4cf497e0   Goutte   Make the targets ...
355
356
      cursor: not-allowed;
    }
4900d232   Goutte   Add the time inte...
357
    .targets-filters .target.loading {
6491a1f1   Goutte   Fix up the bugs l...
358
        -webkit-animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
359
360
361
        -webkit-animation-duration: 4000ms;
        -webkit-animation-iteration-count: infinite;
        -webkit-animation-timing-function: linear;
6491a1f1   Goutte   Fix up the bugs l...
362
        -moz-animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
363
364
365
        -moz-animation-duration: 4000ms;
        -moz-animation-iteration-count: infinite;
        -moz-animation-timing-function: linear;
6491a1f1   Goutte   Fix up the bugs l...
366
        -ms-animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
367
368
369
        -ms-animation-duration: 4000ms;
        -ms-animation-iteration-count: infinite;
        -ms-animation-timing-function: linear;
6491a1f1   Goutte   Fix up the bugs l...
370
        animation-name: keyframes_rotate;
93ee5563   Goutte   Add a loading ani...
371
372
373
374
        animation-duration: 4000ms;
        animation-iteration-count: infinite;
        animation-timing-function: linear;
    }
c42fea3a   Goutte   Rework the CSS wi...
375

80352490   Goutte   Multi model suppo...
376
377
378
379
380
381
382
383
384
    .targets-filters .target .decorator {
      position: absolute;
      top: 0;
      left: 0;
      display: none;
    }
    .targets-filters .target.empty .decorator.empty {
      display: block;
    }
60b73eb1   Goutte   Change temperatur...
385
386
387
    .targets-filters .target.error .decorator.error {
      display: block;
    }
80352490   Goutte   Multi model suppo...
388
389
390
391
392
393
394
    .targets-filters .target .decorator.loading {
      top:  19px;
      left: 19px;
    }
    .targets-filters .target.loading .decorator.loading {
      display: block;
    }
6f9a3852   Goutte   Hide time series ...
395
396
397
398
399
400
401

    #parameters .parameter {
      outline: 0;
    }
    #parameters .parameter.active {
      background-color: #c8d3e1;
    }
80352490   Goutte   Multi model suppo...
402

604616e4   Goutte   Misc changes from...
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
    .small-loader-container {
      width: 27px;
      margin: 0 auto;
      background: none;
      pointer-events: none;
    }

    .small-loader-circle-1 {
      height: 27px;
      width: 27px;
      background: rgba(255, 238, 195, 0.72);
    }

    .small-loader-circle-2 {
      height: 22px;
      width: 22px;
      background: none;
    {#	background: rgba(56, 53, 194, 0.5);#}
    }

    .small-loader-circle-3 {
      height: 18px;
      width: 18px;
      background: rgba(29, 65, 255, 0.9);
    }

    .small-loader-circle-4 {
      height: 13px;
      width: 13px;
      background: none;
    {#	background: rgba(98, 109, 237, 0.5);#}
    }

    .small-loader-circle-5 {
      height: 9px;
      width: 9px;
      background: rgba(238, 238, 238, 0.8);
    }

    .small-loader-circle-6 {
      height: 4px;
      width: 4px;
      background: none;
    {#	background: rgba(0, 0, 0, 0);#}
    }

    .small-loader-circle-7 {
      height: 2px;
      width: 2px;
      background: rgb(110, 102, 255);
    }

    .small-loader-circle-1,
    .small-loader-circle-2,
    .small-loader-circle-3,
    .small-loader-circle-4,
    .small-loader-circle-5,
    .small-loader-circle-6,
    .small-loader-circle-7 {
      border-bottom: none;
      border-radius: 50%;
        -o-border-radius: 50%;
        -ms-border-radius: 50%;
        -webkit-border-radius: 50%;
        -moz-border-radius: 50%;
      box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -o-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -ms-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -webkit-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
        -moz-box-shadow: 0px 0px 0px rgba(0,0,0,0.1);
      animation-name: small-loader-spin;
        -o-animation-name: small-loader-spin;
        -ms-animation-name: small-loader-spin;
        -webkit-animation-name: small-loader-spin;
        -moz-animation-name: small-loader-spin;
      animation-duration: 4600ms;
        -o-animation-duration: 4600ms;
        -ms-animation-duration: 4600ms;
        -webkit-animation-duration: 4600ms;
        -moz-animation-duration: 4600ms;
      animation-iteration-count: infinite;
        -o-animation-iteration-count: infinite;
        -ms-animation-iteration-count: infinite;
        -webkit-animation-iteration-count: infinite;
        -moz-animation-iteration-count: infinite;
      animation-timing-function: linear;
        -o-animation-timing-function: linear;
        -ms-animation-timing-function: linear;
        -webkit-animation-timing-function: linear;
        -moz-animation-timing-function: linear;
    }



    @keyframes small-loader-spin {
      from {
        transform: rotate(0deg);
      }
      to {
        transform: rotate(360deg);
      }
    }

    @-o-keyframes small-loader-spin {
      from {
        -o-transform: rotate(0deg);
      }
      to {
        -o-transform: rotate(360deg);
      }
    }

    @-ms-keyframes small-loader-spin {
      from {
        -ms-transform: rotate(0deg);
      }
      to {
        -ms-transform: rotate(360deg);
      }
    }

    @-webkit-keyframes small-loader-spin {
      from {
        -webkit-transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(360deg);
      }
    }

    @-moz-keyframes small-loader-spin {
      from {
        -moz-transform: rotate(0deg);
      }
      to {
        -moz-transform: rotate(360deg);
      }
    }
80352490   Goutte   Multi model suppo...
541
542
  
  
9390ec89   Goutte   Initial experimen...
543
544
545
546
  </style>
{% endblock %}


7d6dee0f   Goutte   Continue refacto ...
547

80352490   Goutte   Multi model suppo...
548
549
{#### JAVASCRIPT #############################################################}

9390ec89   Goutte   Initial experimen...
550
{% block scripts_footer %}
f7a10f28   Goutte   Make our custom m...
551
<script type="application/javascript" src="{{ static('js/vendor/d3-custom.js') }}"></script>
a4a9ef03   Goutte   Cache generated C...
552
<script type="application/javascript" src="{{ static('js/vendor/moment.min.js') }}"></script>
80352490   Goutte   Multi model suppo...
553
<script type="application/javascript" src="{{ static('js/vendor/samp.js') }}"></script>
438929a4   Goutte   Rewrite the orbit...
554
<script type="application/javascript" src="{{ static('js/swapp.js') }}"></script>
9390ec89   Goutte   Initial experimen...
555
556
<script type="application/javascript">

ae0aa7d2   Goutte   Add an x axis lab...
557
558
559
var configuration = {
  time_series_container: '#time_series',
  orbits_container: '#orbits',
bde97e4d   Goutte   Add more changes ...
560
  api: {
297a7dfc   Goutte   Add support for i...
561
562
563
      'data_for_interval': "{{ request.url_root }}<target>_{{ input_slug }}_<started_at>_<stopped_at>.csv",
      'download':          "{{ request.url_root }}<targets>_{{ input_slug }}_<started_at>_<stopped_at>.cdf",
      'samp':              "{{ request.url_root }}<targets>_{{ input_slug }}_<started_at>_<stopped_at>.cdf"
f75faf5f   Goutte   WIP
564
  },
8bd715ad   Goutte   Use a pixel art i...
565
566
567
  sun: {
    img: '{{ static('img/sun_128.png') }}'
  },
bde97e4d   Goutte   Add more changes ...
568
  targets: {
d9453685   Goutte   Clean up.
569
{% for target in targets if not target.locked %}
a21f81d9   Goutte   Enable Venus and ...
570
571
572
573
    {% if not loop.first %},{% endif %}
    '{{ target.slug }}': {
      slug: '{{ target.slug }}',
      name: '{{ target.name }}',
ae0aa7d2   Goutte   Add an x axis lab...
574
      active: true,
25071e08   Goutte   Easy fix to suppo...
575
      orbit: { a: {{ target.orbit.semimajor or 0 }}, b: {{ target.orbit.semiminor or 0 }} },
a21f81d9   Goutte   Enable Venus and ...
576
      img: '{{ static('img/target/'~target.slug~'_128.png') }}'
ae0aa7d2   Goutte   Add an x axis lab...
577
    }
a21f81d9   Goutte   Enable Venus and ...
578
{% endfor %}
aba70d3a   Goutte   Refactor time ser...
579
  },
bde97e4d   Goutte   Add more changes ...
580
581
  parameters: [
{% for p in parameters %}
aba70d3a   Goutte   Refactor time ser...
582
    {
bde97e4d   Goutte   Add more changes ...
583
584
585
586
587
588
      id: "{{ p.slug | escapejs }}",
      title: "{{ p.name | escapejs }} ({{ p.units | escapejs }})",
      active: {{ 'true' if p.active else 'false' }},
      unit: "{{ p.units | escapejs }}"
    }{{ ',' if not loop.last }}
{% endfor %}
aba70d3a   Goutte   Refactor time ser...
589
  ]
438929a4   Goutte   Rewrite the orbit...
590
};
9390ec89   Goutte   Initial experimen...
591

06a3a1f1   Goutte   Continue bug hunt...
592
var sw;
9390ec89   Goutte   Initial experimen...
593
jQuery().ready(function($){
a975b380   Goutte   Clean up.
594
  // Space Weather app itself, handling data downloads and plot draws.
06a3a1f1   Goutte   Continue bug hunt...
595
  sw = new SpaceWeather(configuration);
fe3132dd   Goutte   Refactor even more.
596
  sw.init();
ae0aa7d2   Goutte   Add an x axis lab...
597

a975b380   Goutte   Clean up.
598
599
600
601
602
603
604
605
  // User Interface (except plots' interactivity, such as mouse hovers)
  var parameters = $('#parameters');
  var isLastParameterEnabled = function(parameter_id) {
    var s = 0;
    parameters.find('.parameter[data-ts-slug]').each(function(i,p) {
      if ($(p).hasClass('active')) s++;
    });
    return s < 2;
6f9a3852   Goutte   Hide time series ...
606
  };
4cf497e0   Goutte   Make the targets ...
607
608
  var isLastTargetEnabled = function(target_slug) {
    var s = 0;
4900d232   Goutte   Add the time inte...
609
    $(".targets-filters .target:not(.locked)").each(function(i,p) {
9c0c4509   Goutte   Add a loader to t...
610
      if ($(p).hasClass('active') && ! $(p).hasClass('loading')) s++;
4cf497e0   Goutte   Make the targets ...
611
612
613
    });
    return s < 2;
  };
a975b380   Goutte   Clean up.
614
  parameters.find(".parameter").click(function(e){
b7fe650c   Goutte   Misc bundle of ol...
615
616
617
618
    var switch_on = ! $(this).hasClass('active');
    var parameter_slug = $(this).attr('data-ts-slug');
    if (switch_on) {
      sw.enableParameter(parameter_slug);
a975b380   Goutte   Clean up.
619
620
      $(this).addClass('active');
    } else if ( ! isLastParameterEnabled(parameter_slug)) {
b7fe650c   Goutte   Misc bundle of ol...
621
      sw.disableParameter(parameter_slug);
a975b380   Goutte   Clean up.
622
      $(this).removeClass('active');
b7fe650c   Goutte   Misc bundle of ol...
623
    }
6f9a3852   Goutte   Hide time series ...
624
625
    return false;
  });
4900d232   Goutte   Add the time inte...
626
  $(".targets-filters .target:not(.locked)").on("click", function(e){
9c0c4509   Goutte   Add a loader to t...
627
    if ($(this).hasClass('loading')) return false;
4cf497e0   Goutte   Make the targets ...
628
629
630
    var switch_on = ! $(this).hasClass('active');
    var target_slug = $(this).attr('data-target-slug');
    if (switch_on) {
6bb225d6   Goutte   Link the time ser...
631
      sw.enableTarget(target_slug);
4cf497e0   Goutte   Make the targets ...
632
633
      $(this).addClass('active');
    } else if ( ! isLastTargetEnabled(target_slug)) {
6bb225d6   Goutte   Link the time ser...
634
      sw.disableTarget(target_slug);
4cf497e0   Goutte   Make the targets ...
635
636
637
638
      $(this).removeClass('active');
    }
    return false;
  });
243cd8a4   Goutte   Timestamp party c...
639
640
641
642
643
  $('#apply_new_interval').on("click", function(e){
    var started_at = moment($("#started_at").val());
    var stopped_at = moment($("#stopped_at").val());
    sw.resizeDomain(started_at, stopped_at);
    return false;
6b149919   Goutte   Add a Download bu...
644
  });
297a7dfc   Goutte   Add support for i...
645
646
647
648
649
  $('#apply_new_input').on("click", function(e){
    var new_input_slug = $("input[name='input_slug']:checked").val();
    window.location = "?input_slug="+new_input_slug;
    return false;
  });
6b149919   Goutte   Add a Download bu...
650
651
  $('#download').on("click", function(e){
    var url = sw.buildDownloadUrl();
aa7247d6   Goutte   Generate a CDF fi...
652
    console.info("Downloading " + url);
6b149919   Goutte   Add a Download bu...
653
654
655
656
    $.ajax({
      type: 'GET',
      url: url,
      processData: false,
5f63c83b   Goutte   Lint.
657
      success: function (data) { window.location = url; },
6b149919   Goutte   Add a Download bu...
658
659
660
661
662
663
664
      error: function (xhr) {
        console.error('Cannot download.', xhr);
        alert("Our apologies, there was an error while downloading.");
      }
    });
    return false;
  });
6f9a3852   Goutte   Hide time series ...
665

9390ec89   Goutte   Initial experimen...
666
667
});
</script>
cad44b6d   Goutte   Finish adding the...
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706

{#### SAMP ###################################################################}
<script type="text/javascript">
  jQuery().ready(function ($) {
    // Flag to know when a hub is connected or not
    var isConnected = false;

    // Show SAMP button(s) depending on whether the hub is available or not.
    var onHubAvailability = function (isHubRunning) {
      $(".samp").each(function (index, element) {
        if (isHubRunning) {
          isConnected = true;
          $(element).removeClass('disabled mdl-button--disabled');
        } else {
          isConnected = false;
          $(element).addClass('disabled mdl-button--disabled');
        }
      });
    };

    // Update the document about the presence of any SAMP hub every 10 sec.
    var connector = new samp.Connector("Sender");
    connector.onHubAvailability(onHubAvailability, 10000);
    window.onunload = function () {
      connector.unregister();
    };

    // Clicking on a SAMP button sends the CDF file to the connected hub.
    $("#samp").click(function (event) {
      event.stopPropagation();
      if ($(this).hasClass('disabled')) { return; }
      // pitfall : connector.connection is ALWAYS undefined here
      if ( ! isConnected) {  // so we use a bool flag instead
        alert("We do not detect any connected SAMP hub.\n" +
            "Wait some more, or try refreshing this page?");
        return;
      }
      var name = sw.buildSampName();
      var url = sw.buildSampUrl();
aa7247d6   Goutte   Generate a CDF fi...
707
      console.info("Trying to activate SAMP…", name, url);
cad44b6d   Goutte   Finish adding the...
708
709
710
711
712
713
714
715
716
717
718
719
720
721
      connector.runWithConnection(function (connection) {
        var msg = new samp.Message("table.load.cdf", {
          "name": name,
          "url": url // absolute URL required
        });
        connection.notifyAll([msg]);
      }, function (error) {
        var msg = 'Error: ' + error;
        console.error(msg);
        alert(msg);  // let's yell at the user as well
      });
    });
  });
</script>
9390ec89   Goutte   Initial experimen...
722
{% endblock %}