1 import { createOption
, linkSelects
} from '../util.js';
2 import { controllers
, controllerEvents
} from './Controller.js';
3 import { simVars
} from '../simVars.js';
6 * 1. Initialization block
11 export class TimeSeriesButton
extends HTMLElement
{
12 /** ===== Initialization block ===== */
13 constructor(dataType
= 'continuous') {
16 <div id='timeseries-button'>
18 <label class='timeseries-select-label' for='startDate'>start time:</label>
19 <select class='timeseries-select' id='startDate'></select>
22 <label class='timeseries-select-label' for='endDate'>end time: </label>
23 <select class='timeseries-select' id='endDate'></select>
26 <label class='timeseries-select-label' for='dataType'>data type: </label>
27 <select class='timeseries-select' id='dataType'>
28 <option value='continuous'>continuous</option>
29 <option value='discrete'>discrete</option>
33 <label class='timeseries-select-label' for='layer-specification'>for layers: </label>
34 <select class='timeseries-select' id='layer-specification'>
35 <option value='all-added-layers'>all added layers</option>
36 <option value='top-layer'>top layer</option>
39 <button class='timeSeriesButton' id='timeSeriesButton'>
40 <span id='generate-button-label'>generate timeseries</span>
41 <span class='hidden' id='cancel-button-label'>cancel timeseries</span>
42 <div id='progressBar' class='hidden'></div>
46 this.querySelector('#dataType').value
= dataType
;
51 this.querySelector('#timeseries-button').onpointerdown
= (e
) => e
.stopPropagation();
53 this.initializeTimeSeriesButton();
54 this.initializeStartDateSelector();
55 this.initializeEndDateSelector();
57 this.subscribeToTimeSeriesProgress();
58 this.subscribeToDataType();
60 this.updateTimestamps();
63 initializeTimeSeriesButton() {
64 const timeSeriesButton
= this.querySelector('#timeSeriesButton');
65 timeSeriesButton
.onpointerdown
= () => {
67 simVars
.cancelTimeSeriesCallback();
73 this.querySelector('#generate-button-label').classList
.add('hidden');
74 this.querySelector('#cancel-button-label').classList
.remove('hidden');
75 simVars
.generateTimeSeriesCallback();
80 initializeStartDateSelector() {
81 const startDate
= this.querySelector('#startDate');
82 const endDate
= this.querySelector('#endDate');
83 startDate
.addEventListener('change', () => {
84 let simulationStartDate
= controllers
.startDate
.getValue();
85 let startValue
= startDate
.value
;
86 if (startValue
< simulationStartDate
) {
87 controllers
.startDate
.setValue(startValue
);
88 controllers
.startDate
.broadcastEvent(controllerEvents
.VALUE_SET
)
90 linkSelects(startDate
, endDate
);
91 controllers
.timeSeriesStart
.setValue(startValue
);
94 controllers
.timeSeriesStart
.subscribe(() => {
95 let startValue
= controllers
.timeSeriesStart
.getValue();
96 startDate
.value
= startValue
;
100 initializeEndDateSelector() {
101 const startDate
= this.querySelector('#startDate');
102 const endDate
= this.querySelector('#endDate');
103 endDate
.addEventListener('change', () => {
104 let simulationEndDate
= controllers
.endDate
.getValue();
105 let endValue
= endDate
.value
;
106 if (endValue
> simulationEndDate
) {
107 controllers
.endDate
.setValue(endValue
);
108 controllers
.endDate
.broadcastEvent(controllerEvents
.VALUE_SET
);
110 linkSelects(startDate
, endDate
);
111 controllers
.timeSeriesEnd
.setValue(endValue
);
114 controllers
.timeSeriesEnd
.subscribe(() => {
115 let endValue
= controllers
.timeSeriesEnd
.getValue();
116 endDate
.value
= endValue
;
120 subscribeToTimeSeriesProgress() {
121 controllers
.timeSeriesProgress
.subscribe(() => {
122 let progress
= controllers
.timeSeriesProgress
.getValue();
123 this.setProgress(progress
);
127 subscribeToDataType() {
128 const dataTypeSelector
= this.querySelector('#dataType');
129 dataTypeSelector
.addEventListener('change', () => {
130 let dataType
= dataTypeSelector
.value
;
131 controllers
.timeSeriesDataType
.setValue(dataType
);
133 controllers
.timeSeriesDataType
.subscribe(() => {
134 let dataType
= controllers
.timeSeriesDataType
.getValue();
135 dataTypeSelector
.value
= dataType
;
137 dataTypeSelector
.value
= controllers
.timeSeriesDataType
.getValue();
140 /** ===== Getters block ===== */
142 return this.querySelector('#timeSeriesButton');
146 return this.querySelector('#startDate').value
;
150 return this.querySelector('#endDate').value
;
154 return this.querySelector('#dataType').value
;
157 getLayerSpecification() {
158 return this.querySelector('#layer-specification').value
;
162 /** ===== Setters block ===== */
164 const startDate
= this.querySelector('#startDate');
165 const endDate
= this.querySelector('#endDate');
166 startDate
.innerHTML
= '';
167 endDate
.innerHTML
= '';
168 for (let timestamp
of simVars
.sortedTimestamps
) {
169 startDate
.appendChild(createOption(timestamp
, true));
170 endDate
.appendChild(createOption(timestamp
, true));
172 startDate
.value
= controllers
.timeSeriesStart
.getValue();
173 endDate
.value
= controllers
.timeSeriesEnd
.getValue();
176 setProgress(progress
) {
180 const progressBar
= this.querySelector('#progressBar');
182 progressBar
.classList
.remove('hidden');
183 progressBar
.style
.width
= Math
.floor(progress
*100) + '%';
185 this.loading
= false;
186 this.querySelector('#generate-button-label').classList
.remove('hidden');
187 this.querySelector('#cancel-button-label').classList
.add('hidden');
188 progressBar
.classList
.add('hidden');
192 setStartDate(newStartDate
) {
193 let newStartIndex
= simVars
.sortedTimestamps
.indexOf(newStartDate
);
194 if (newStartIndex
== simVars
.sortedTimestamps
.length
- 1) {
198 const startDate
= this.querySelector('#startDate');
199 const endDate
= this.querySelector('#endDate');
201 let oldEndDate
= endDate
.value
;
202 if (newStartDate
>= oldEndDate
) {
203 endDate
.value
= simVars
.sortedTimestamps
[newStartIndex
+ 1];
205 startDate
.value
= newStartDate
;
207 linkSelects(startDate
, endDate
);
210 setEndDate(newEndDate
) {
211 let newEndIndex
= simVars
.sortedTimestamps
.indexOf(newEndDate
);
212 if (newEndIndex
== 0) {
216 const endDate
= this.querySelector('#endDate');
217 const startDate
= this.querySelector('#startDate');
219 let oldStartDate
= startDate
.value
;
220 if (newEndDate
<= oldStartDate
) {
221 startDate
.value
= simVars
.sortedTimestamps
[newEndIndex
- 1];
223 endDate
.value
= newEndDate
;
225 linkSelects(startDate
, endDate
);
229 window
.customElements
.define('timeseries-button', TimeSeriesButton
);