Commit 2c0e15153f2cebc32b2adf1ff9e37f46d72c82a3

Authored by Goutte
1 parent d9453685

Refactor loading and removal of plots for the start and stop dates.

Showing 2 changed files with 111 additions and 65 deletions   Show diff stats
web/static/js/swapp.js
@@ -9,14 +9,15 @@ @@ -9,14 +9,15 @@
9 this.slug = slug; 9 this.slug = slug;
10 this.name = name; 10 this.name = name;
11 this.config = config; 11 this.config = config;
12 - this.active = true; 12 + this.active = this.config.active;
13 } 13 }
14 return Target; 14 return Target;
15 }()); 15 }());
16 out$.SpaceWeather = SpaceWeather = (function(){ 16 out$.SpaceWeather = SpaceWeather = (function(){
17 "The main app, instanciated from an inline script.\nIt defaults to an interval starting a year ago, and ending in seven days.\n(both at midnight)"; 17 "The main app, instanciated from an inline script.\nIt defaults to an interval starting a year ago, and ending in seven days.\n(both at midnight)";
18 SpaceWeather.displayName = 'SpaceWeather'; 18 SpaceWeather.displayName = 'SpaceWeather';
19 - var timeSeries, prototype = SpaceWeather.prototype, constructor = SpaceWeather; 19 + var API_TIME_FORMAT, timeSeries, prototype = SpaceWeather.prototype, constructor = SpaceWeather;
  20 + API_TIME_FORMAT = "YYYY-MM-DDTHH:mm:ss";
20 function SpaceWeather(configuration){ 21 function SpaceWeather(configuration){
21 var configs, res$, k, this$ = this; 22 var configs, res$, k, this$ = this;
22 this.configuration = configuration; 23 this.configuration = configuration;
@@ -37,35 +38,14 @@ @@ -37,35 +38,14 @@
37 } 38 }
38 SpaceWeather.prototype.init = function(){ 39 SpaceWeather.prototype.init = function(){
39 "This is called by the inline bootstrap javascript code.\nThis ain't in the constructor because it might return a Promise later on.\n(for the loader, for example)"; 40 "This is called by the inline bootstrap javascript code.\nThis ain't in the constructor because it might return a Promise later on.\n(for the loader, for example)";
40 - var active_targets, res$, k, started_at, stopped_at, this$ = this;  
41 - res$ = [];  
42 - for (k in this.targets) {  
43 - if (this.targets[k].config.active) {  
44 - res$.push(this.targets[k]);  
45 - }  
46 - }  
47 - active_targets = res$; 41 + var started_at, stopped_at, this$ = this;
48 this.orbits = new Orbits(this.configuration.orbits_container, this.configuration); 42 this.orbits = new Orbits(this.configuration.orbits_container, this.configuration);
49 this.started_at = moment().subtract(1, 'years').hours(0).minutes(0).seconds(0); 43 this.started_at = moment().subtract(1, 'years').hours(0).minutes(0).seconds(0);
50 this.stopped_at = moment().add(7, 'days').hours(0).minutes(0).seconds(0); 44 this.stopped_at = moment().add(7, 'days').hours(0).minutes(0).seconds(0);
51 - started_at = this.started_at.format("YYYY-MM-DDTHH:mm:ss");  
52 - stopped_at = this.stopped_at.format("YYYY-MM-DDTHH:mm:ss"); 45 + started_at = this.started_at.format(API_TIME_FORMAT);
  46 + stopped_at = this.stopped_at.format(API_TIME_FORMAT);
53 console.info("Setting time interval from " + started_at + " to " + stopped_at + "…"); 47 console.info("Setting time interval from " + started_at + " to " + stopped_at + "…");
54 - active_targets.forEach(function(target){  
55 - var targetButton;  
56 - console.info("Loading CSV data of " + target.name + "…");  
57 - targetButton = $(".orbiters_filters .target." + target.slug);  
58 - targetButton.addClass('loading');  
59 - return this$.loadData(target.slug, started_at, stopped_at).then(function(data){  
60 - console.info("Loaded CSV data of " + target.name + ".");  
61 - this$.createTimeSeries(target, data);  
62 - this$.orbits.initOrbiter(target.slug, target.config, data['hci']);  
63 - targetButton.removeClass('loading');  
64 - return this$.hideLoader();  
65 - }, function(error){  
66 - return console.error('Failed to load CSV data.', error);  
67 - });  
68 - }); 48 + this.loadAndCreatePlots(started_at, stopped_at);
69 return window.addEventListener('resize', function(){ 49 return window.addEventListener('resize', function(){
70 return this$.resize(); 50 return this$.resize();
71 }); 51 });
@@ -82,14 +62,6 @@ @@ -82,14 +62,6 @@
82 this.targets[target.slug] = target; 62 this.targets[target.slug] = target;
83 return this; 63 return this;
84 }; 64 };
85 - SpaceWeather.prototype.enableAllTargets = function(){  
86 - var slug, ref$, target;  
87 - for (slug in ref$ = this.targets) {  
88 - target = ref$[slug];  
89 - showTarget(slug);  
90 - }  
91 - return this;  
92 - };  
93 SpaceWeather.prototype.enableTarget = function(target_slug){ 65 SpaceWeather.prototype.enableTarget = function(target_slug){
94 var this$ = this; 66 var this$ = this;
95 timeSeries.forEach(function(ts){ 67 timeSeries.forEach(function(ts){
@@ -118,14 +90,17 @@ @@ -118,14 +90,17 @@
118 return ts.resize(); 90 return ts.resize();
119 }); 91 });
120 }; 92 };
  93 + SpaceWeather.prototype.showLoader = function(){
  94 + return $("#plots_loader").show();
  95 + };
121 SpaceWeather.prototype.hideLoader = function(){ 96 SpaceWeather.prototype.hideLoader = function(){
122 return $("#plots_loader").hide(); 97 return $("#plots_loader").hide();
123 }; 98 };
124 SpaceWeather.prototype.loadData = function(target_slug, started_at, stopped_at){ 99 SpaceWeather.prototype.loadData = function(target_slug, started_at, stopped_at){
125 "Load the data as CSV for the specified target and interval,\nand return it in a Promise."; 100 "Load the data as CSV for the specified target and interval,\nand return it in a Promise.";
126 - var sw, promise; 101 + var sw;
127 sw = this; 102 sw = this;
128 - promise = new Promise(function(resolve, reject){ 103 + return new Promise(function(resolve, reject){
129 var url; 104 var url;
130 url = sw.buildDataUrlForTarget(target_slug, started_at, stopped_at); 105 url = sw.buildDataUrlForTarget(target_slug, started_at, stopped_at);
131 return d3.csv(url, function(csv){ 106 return d3.csv(url, function(csv){
@@ -159,7 +134,42 @@ @@ -159,7 +134,42 @@
159 return resolve(data); 134 return resolve(data);
160 }); 135 });
161 }); 136 });
162 - return promise; 137 + };
  138 + SpaceWeather.prototype.loadAndCreatePlots = function(started_at, stopped_at){
  139 + var active_targets, res$, k, this$ = this;
  140 + this.showLoader();
  141 + res$ = [];
  142 + for (k in this.targets) {
  143 + if (this.targets[k].active) {
  144 + res$.push(this.targets[k]);
  145 + }
  146 + }
  147 + active_targets = res$;
  148 + return active_targets.forEach(function(target){
  149 + var targetButton;
  150 + console.info("Loading CSV data of " + target.name + "…");
  151 + targetButton = $(".orbiters_filters .target." + target.slug);
  152 + targetButton.addClass('loading');
  153 + return this$.loadData(target.slug, started_at, stopped_at).then(function(data){
  154 + console.info("Loaded CSV data of " + target.name + ".");
  155 + this$.createTimeSeries(target, data);
  156 + this$.orbits.initOrbiter(target.slug, target.config, data['hci']);
  157 + targetButton.removeClass('loading');
  158 + return this$.hideLoader();
  159 + }, function(error){
  160 + return console.error("Failed loading CSV data of " + target.name + ".", error);
  161 + });
  162 + });
  163 + };
  164 + SpaceWeather.prototype.clearPlots = function(){
  165 + var timeSeries;
  166 + this.orbits.clear();
  167 + timeSeries.forEach(function(ts){
  168 + return ts.clear();
  169 + });
  170 + this.orbits = null;
  171 + timeSeries = [];
  172 + return this;
163 }; 173 };
164 timeSeries = []; 174 timeSeries = [];
165 SpaceWeather.prototype.createTimeSeries = function(target, data){ 175 SpaceWeather.prototype.createTimeSeries = function(target, data){
@@ -268,7 +278,10 @@ @@ -268,7 +278,10 @@
268 } 278 }
269 }); 279 });
270 this.orbits.resizeDomain(started_at, stopped_at); 280 this.orbits.resizeDomain(started_at, stopped_at);
  281 + return;
271 } 282 }
  283 + this.clearPlots();
  284 + return this.loadAndCreatePlots(started_at, stopped_at);
272 }; 285 };
273 SpaceWeather.prototype.resetZoom = function(){ 286 SpaceWeather.prototype.resetZoom = function(){
274 timeSeries.forEach(function(ts){ 287 timeSeries.forEach(function(ts){
@@ -385,6 +398,10 @@ @@ -385,6 +398,10 @@
385 } 398 }
386 return this; 399 return this;
387 }; 400 };
  401 + TimeSeries.prototype.clear = function(){
  402 + $(this.svg.node()).remove();
  403 + return this.visible = false;
  404 + };
388 TimeSeries.prototype.show = function(){ 405 TimeSeries.prototype.show = function(){
389 $(this.svg.node()).show(); 406 $(this.svg.node()).show();
390 return this.visible = true; 407 return this.visible = true;
@@ -584,6 +601,9 @@ @@ -584,6 +601,9 @@
584 $(this.svg.node()).show(); 601 $(this.svg.node()).show();
585 return this; 602 return this;
586 }; 603 };
  604 + Orbits.prototype.clear = function(){
  605 + return $(this.svg.node()).remove();
  606 + };
587 Orbits.prototype.resize = function(){ 607 Orbits.prototype.resize = function(){
588 var width, height, slug, ref$, config; 608 var width, height, slug, ref$, config;
589 width = Math.ceil($(this.container).width() - this.margin.left - this.margin.right); 609 width = Math.ceil($(this.container).width() - this.margin.left - this.margin.right);
web/static/js/swapp.ls
@@ -24,7 +24,7 @@ const GOLDEN_RATIO = 2 / (1 + Math.sqrt(5)) # Between 0 and 1 (0.618...) @@ -24,7 +24,7 @@ const GOLDEN_RATIO = 2 / (1 + Math.sqrt(5)) # Between 0 and 1 (0.618...)
24 24
25 class Target 25 class Target
26 (@slug, @name, @config) -> 26 (@slug, @name, @config) ->
27 - @active = true # by default, all targets are active at first 27 + @active = @config.active
28 28
29 ############################################################################### 29 ###############################################################################
30 30
@@ -35,6 +35,8 @@ export class SpaceWeather @@ -35,6 +35,8 @@ export class SpaceWeather
35 (both at midnight) 35 (both at midnight)
36 """ 36 """
37 37
  38 + API_TIME_FORMAT = "YYYY-MM-DDTHH:mm:ss"
  39 +
38 (@configuration) -> 40 (@configuration) ->
39 console.info """ 41 console.info """
40 _ _ _ _ ____ 42 _ _ _ _ ____
@@ -67,29 +69,15 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE @@ -67,29 +69,15 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE
67 This ain't in the constructor because it might return a Promise later on. 69 This ain't in the constructor because it might return a Promise later on.
68 (for the loader, for example) 70 (for the loader, for example)
69 """ 71 """
70 - active_targets = [ @targets[k] for k of @targets when @targets[k].config.active ]  
71 @orbits = new Orbits(@configuration.orbits_container, @configuration) 72 @orbits = new Orbits(@configuration.orbits_container, @configuration)
72 - # Set the h/m/s to zero so that files are cached per whole days 73 + # Default time interval is from one year ago to one week ahead.
  74 + # We set the h/m/s to zero to benefit from a daily cache.
73 @started_at = moment().subtract(1, 'years').hours(0).minutes(0).seconds(0) 75 @started_at = moment().subtract(1, 'years').hours(0).minutes(0).seconds(0)
74 @stopped_at = moment().add(7, 'days').hours(0).minutes(0).seconds(0) 76 @stopped_at = moment().add(7, 'days').hours(0).minutes(0).seconds(0)
75 - started_at = @started_at.format("YYYY-MM-DDTHH:mm:ss")  
76 - stopped_at = @stopped_at.format("YYYY-MM-DDTHH:mm:ss") 77 + started_at = @started_at.format(API_TIME_FORMAT)
  78 + stopped_at = @stopped_at.format(API_TIME_FORMAT)
77 console.info "Setting time interval from #{started_at} to #{stopped_at}…" 79 console.info "Setting time interval from #{started_at} to #{stopped_at}…"
78 - active_targets.forEach((target) ~>  
79 - console.info "Loading CSV data of #{target.name}…"  
80 - targetButton = $(".orbiters_filters .target.#{target.slug}")  
81 - targetButton.addClass('loading')  
82 - @loadData(target.slug, started_at, stopped_at).then(  
83 - (data) ~>  
84 - console.info "Loaded CSV data of #{target.name}."  
85 - @createTimeSeries(target, data)  
86 - @orbits.initOrbiter(target.slug, target.config, data['hci'])  
87 - targetButton.removeClass('loading')  
88 - @hideLoader()  
89 - ,  
90 - (error) -> console.error('Failed to load CSV data.', error)  
91 - )  
92 - ) 80 + @loadAndCreatePlots(started_at, stopped_at)
93 window.addEventListener 'resize', ~> @resize() 81 window.addEventListener 'resize', ~> @resize()
94 82
95 buildDataUrlForTarget: (target_slug, started_at, stopped_at) -> 83 buildDataUrlForTarget: (target_slug, started_at, stopped_at) ->
@@ -103,10 +91,10 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE @@ -103,10 +91,10 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE
103 @targets[target.slug] = target 91 @targets[target.slug] = target
104 this 92 this
105 93
106 - enableAllTargets: ->  
107 - for slug, target of @targets  
108 - showTarget(slug)  
109 - this 94 +# enableAllTargets: ->
  95 +# for slug, target of @targets
  96 +# enableTarget(slug)
  97 +# this
110 98
111 enableTarget: (target_slug) -> 99 enableTarget: (target_slug) ->
112 timeSeries.forEach((ts) ~> ts.show() if ts.target.slug == target_slug && @parameters[ts.parameter].active) 100 timeSeries.forEach((ts) ~> ts.show() if ts.target.slug == target_slug && @parameters[ts.parameter].active)
@@ -122,6 +110,9 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE @@ -122,6 +110,9 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE
122 @orbits?.resize(); 110 @orbits?.resize();
123 timeSeries.forEach((ts) -> ts.resize()) 111 timeSeries.forEach((ts) -> ts.resize())
124 112
  113 + showLoader: ->
  114 + $("\#plots_loader").show();
  115 +
125 hideLoader: -> 116 hideLoader: ->
126 $("\#plots_loader").hide(); 117 $("\#plots_loader").hide();
127 118
@@ -131,7 +122,7 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE @@ -131,7 +122,7 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE
131 and return it in a Promise. 122 and return it in a Promise.
132 """ 123 """
133 sw = this 124 sw = this
134 - promise = new Promise((resolve, reject) -> 125 + new Promise((resolve, reject) ->
135 url = sw.buildDataUrlForTarget(target_slug, started_at, stopped_at) 126 url = sw.buildDataUrlForTarget(target_slug, started_at, stopped_at)
136 d3.csv(url, (csv) -> 127 d3.csv(url, (csv) ->
137 timeFormat = d3.timeParse('%Y-%m-%dT%H:%M:%S%Z') 128 timeFormat = d3.timeParse('%Y-%m-%dT%H:%M:%S%Z')
@@ -151,7 +142,32 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE @@ -151,7 +142,32 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE
151 resolve(data) 142 resolve(data)
152 ) 143 )
153 ) 144 )
154 - promise 145 +
  146 + loadAndCreatePlots: (started_at, stopped_at) ->
  147 + @showLoader()
  148 + active_targets = [@targets[k] for k of @targets when @targets[k].active]
  149 + active_targets.forEach((target) ~>
  150 + console.info "Loading CSV data of #{target.name}…"
  151 + targetButton = $(".orbiters_filters .target.#{target.slug}")
  152 + targetButton.addClass('loading')
  153 + @loadData(target.slug, started_at, stopped_at).then(
  154 + (data) ~>
  155 + console.info "Loaded CSV data of #{target.name}."
  156 + @createTimeSeries(target, data)
  157 + @orbits.initOrbiter(target.slug, target.config, data['hci'])
  158 + targetButton.removeClass('loading')
  159 + @hideLoader()
  160 + ,
  161 + (error) -> console.error("Failed loading CSV data of #{target.name}.", error)
  162 + )
  163 + )
  164 +
  165 + clearPlots: ->
  166 + @orbits.clear()
  167 + timeSeries.forEach((ts) -> ts.clear())
  168 + @orbits = null
  169 + timeSeries = [] # do we de-reference all existing TimeSeries ? #memleak?
  170 + this
155 171
156 timeSeries = [] # deprecated (was for scoping) ; use @property with ~> 172 timeSeries = [] # deprecated (was for scoping) ; use @property with ~>
157 createTimeSeries: (target, data) -> 173 createTimeSeries: (target, data) ->
@@ -217,7 +233,10 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE @@ -217,7 +233,10 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE
217 @orbits.resizeDomain started_at, stopped_at 233 @orbits.resizeDomain started_at, stopped_at
218 return 234 return
219 235
220 - # todo: fetch new data and remake the plots 236 + # fetch new data and remake the plots
  237 + @clearPlots()
  238 + @loadAndCreatePlots(started_at, stopped_at)
  239 +
221 240
222 resetZoom: -> 241 resetZoom: ->
223 timeSeries.forEach((ts) -> ts.resetZoom()) 242 timeSeries.forEach((ts) -> ts.resetZoom())
@@ -408,6 +427,10 @@ export class TimeSeries @@ -408,6 +427,10 @@ export class TimeSeries
408 unless @visible then @hide() 427 unless @visible then @hide()
409 this 428 this
410 429
  430 + clear: ->
  431 + $(@svg.node()).remove()
  432 + @visible = false
  433 +
411 show: -> 434 show: ->
412 $(@svg.node()).show() 435 $(@svg.node()).show()
413 @visible = true 436 @visible = true
@@ -607,6 +630,9 @@ export class Orbits @@ -607,6 +630,9 @@ export class Orbits
607 630
608 this 631 this
609 632
  633 + clear: ->
  634 + $(@svg.node()).remove()
  635 +
610 resize: -> 636 resize: ->
611 width = Math.ceil($(@container).width() - @margin.left - @margin.right) 637 width = Math.ceil($(@container).width() - @margin.left - @margin.right)
612 height = Math.ceil(1.0 * width) 638 height = Math.ceil(1.0 * width)