Links start and end dates of timeSeriesMenu
[wrfxweb.git] / fdds / js / components / timeSeriesButton.js
blob75ba6590544c2642748b5ed064021a637a14806e
1 import { createOption, linkSelects } from '../util.js';
2 import { controllers, controllerEvents } from './Controller.js';
3 import { simVars } from '../simVars.js';
5 /** Contents
6 * 1. Initialization block
7 * 2. Getters block
8 * 3. Setters block
9 *
11 export class TimeSeriesButton extends HTMLElement {
12 /** ===== Initialization block ===== */
13 constructor(dataType = 'continuous') {
14 super();
15 this.innerHTML = `
16 <div id='timeseries-button'>
17 <div>
18 <label class='timeseries-select-label' for='startDate'>start time:</label>
19 <select class='timeseries-select' id='startDate'></select>
20 </div>
21 <div>
22 <label class='timeseries-select-label' for='endDate'>end time: </label>
23 <select class='timeseries-select' id='endDate'></select>
24 </div>
25 <div>
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>
30 </select>
31 </div>
32 <div>
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>
37 </select>
38 </div>
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>
43 </button>
44 </div>
46 this.querySelector('#dataType').value = dataType;
47 this.loading = false;
50 connectedCallback() {
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);
63 });
64 this.updateTimestamps();
67 initializeTimeSeriesButton() {
68 const timeSeriesButton = this.querySelector('#timeSeriesButton');
69 timeSeriesButton.onpointerdown = () => {
70 if (this.loading) {
71 simVars.cancelTimeSeriesCallback();
72 this.setProgress(1);
73 this.loading = false;
74 } else {
75 this.loading = true;
76 this.setProgress(0);
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);
94 });
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 ===== */
118 getButton() {
119 return this.querySelector('#timeSeriesButton');
122 getStartDate() {
123 return this.querySelector('#startDate').value;
126 getEndDate() {
127 return this.querySelector('#endDate').value;
130 getDataType() {
131 return this.querySelector('#dataType').value;
134 getLayerSpecification() {
135 return this.querySelector('#layer-specification').value;
139 /** ===== Setters block ===== */
140 updateTimestamps() {
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) {
154 if (!this.loading) {
155 return;
157 const progressBar = this.querySelector('#progressBar');
158 if (progress < 1) {
159 progressBar.classList.remove('hidden');
160 progressBar.style.width = Math.floor(progress*100) + '%';
161 } else {
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) {
172 return;
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) {
190 return;
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);