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();
59 const dataTypeSelector
= this.querySelector('#dataType');
60 dataTypeSelector
.addEventListener('change', () => {
61 let dataType
= dataTypeSelector
.value
;
62 controllers
.timeSeriesDataType
.setValue(dataType
);
64 this.updateTimestamps();
67 initializeTimeSeriesButton() {
68 const timeSeriesButton
= this.querySelector('#timeSeriesButton');
69 timeSeriesButton
.onpointerdown
= () => {
71 simVars
.cancelTimeSeriesCallback();
77 this.querySelector('#generate-button-label').classList
.add('hidden');
78 this.querySelector('#cancel-button-label').classList
.remove('hidden');
79 simVars
.generateTimeSeriesCallback();
84 initializeStartDateSelector() {
85 const startDate
= this.querySelector('#startDate');
86 const endDate
= this.querySelector('#endDate');
87 startDate
.addEventListener('change', () => {
88 let simulationStartDate
= controllers
.startDate
.getValue();
89 if (startDate
.value
< simulationStartDate
) {
90 controllers
.startDate
.setValue(startDate
.value
);
91 controllers
.startDate
.broadcastEvent(controllerEvents
.VALUE_SET
)
93 linkSelects(startDate
, endDate
);
97 initializeEndDateSelector() {
98 const startDate
= this.querySelector('#startDate');
99 const endDate
= this.querySelector('#endDate');
100 endDate
.addEventListener('change', () => {
101 let simulationEndDate
= controllers
.endDate
.getValue();
102 if (endDate
.value
> simulationEndDate
) {
103 controllers
.endDate
.setValue(endDate
.value
);
104 controllers
.endDate
.broadcastEvent(controllerEvents
.VALUE_SET
)
106 linkSelects(startDate
, endDate
);
110 subscribeToTimeSeriesProgress() {
111 controllers
.timeSeriesProgress
.subscribe(() => {
112 let progress
= controllers
.timeSeriesProgress
.getValue();
113 this.setProgress(progress
);
117 /** ===== Getters block ===== */
119 return this.querySelector('#timeSeriesButton');
123 return this.querySelector('#startDate').value
;
127 return this.querySelector('#endDate').value
;
131 return this.querySelector('#dataType').value
;
134 getLayerSpecification() {
135 return this.querySelector('#layer-specification').value
;
139 /** ===== Setters block ===== */
141 const startDate
= this.querySelector('#startDate');
142 const endDate
= this.querySelector('#endDate');
143 startDate
.innerHTML
= '';
144 endDate
.innerHTML
= '';
145 for (let timestamp
of simVars
.sortedTimestamps
) {
146 startDate
.appendChild(createOption(timestamp
, true));
147 endDate
.appendChild(createOption(timestamp
, true));
149 startDate
.value
= controllers
.startDate
.getValue();
150 endDate
.value
= controllers
.endDate
.getValue();
153 setProgress(progress
) {
157 const progressBar
= this.querySelector('#progressBar');
159 progressBar
.classList
.remove('hidden');
160 progressBar
.style
.width
= Math
.floor(progress
*100) + '%';
162 this.loading
= false;
163 this.querySelector('#generate-button-label').classList
.remove('hidden');
164 this.querySelector('#cancel-button-label').classList
.add('hidden');
165 progressBar
.classList
.add('hidden');
169 setStartDate(newStartDate
) {
170 let newStartIndex
= simVars
.sortedTimestamps
.indexOf(newStartDate
);
171 if (newStartIndex
== simVars
.sortedTimestamps
.length
- 1) {
175 const startDate
= this.querySelector('#startDate');
176 const endDate
= this.querySelector('#endDate');
178 let oldEndDate
= endDate
.value
;
179 if (newStartDate
>= oldEndDate
) {
180 endDate
.value
= simVars
.sortedTimestamps
[newStartIndex
+ 1];
182 startDate
.value
= newStartDate
;
184 linkSelects(startDate
, endDate
);
187 setEndDate(newEndDate
) {
188 let newEndIndex
= simVars
.sortedTimestamps
.indexOf(newEndDate
);
189 if (newEndIndex
== 0) {
193 const endDate
= this.querySelector('#endDate');
194 const startDate
= this.querySelector('#startDate');
196 let oldStartDate
= startDate
.value
;
197 if (newEndDate
<= oldStartDate
) {
198 startDate
.value
= simVars
.sortedTimestamps
[newEndIndex
- 1];
200 endDate
.value
= newEndDate
;
202 linkSelects(startDate
, endDate
);
206 window
.customElements
.define('timeseries-button', TimeSeriesButton
);