class ReportParametersViewController extends TimeCardsViewController { setReport(report, filterContainer, callback, cleanupCallback) { this.report = report; this.filterContainer = filterContainer; this.callback = callback; this.cleanupCallback = cleanupCallback; //Preserve original parent and move container to dialog. this.originalParent = this.filterContainer.parentNode; this.fieldWrapper.appendChild(this.filterContainer); //Hide filters not set to "ask". [...this.filterContainer.querySelectorAll(".filter:not(:has(option[value=\"ask\"]:checked))")].forEach(filter => filter.style.display = "none"); //Disable "ask" options and reset their parents' value. //Temporarily force-enable dropdowns to allow read-only users to pick a value as well. //Also use previous values from local storage. this.askOptions = [...this.filterContainer.querySelectorAll("option[value=\"ask\"]:checked")]; this.originalValues = {}; this.originalDisabledStates = {}; this.askOptions.forEach(option => { option.disabled = true; option.style.display = "none"; const parentSelect = option.parentNode.nodeName.toLowerCase() == "optgroup" ? option.parentNode.parentNode : option.parentNode; this.originalValues[parentSelect.name] = parentSelect.value; this.originalDisabledStates[parentSelect.name] = parentSelect.disabled; const savedValue = localStorage.getItem("report_" + this.report.report_id + "_" + parentSelect.name + "_parameter"); parentSelect.value = savedValue ? savedValue : option.parentNode.firstElementChild.value; parentSelect.disabled = false; parentSelect.required = true; }); } dismiss(loadReport = true) { //Revert container to original parent. this.originalParent.insertBefore(this.filterContainer, this.originalParent.firstChild); this.dismissModally(); //Call callback (i.e. load report) before resetting fields. this.callback(loadReport); //Show all filters again. [...this.filterContainer.querySelectorAll(".filter")].forEach(filter => filter.style.display = ""); //Re-enable "ask" options and restore their parents' values. //Also store last values in local storage. this.askOptions.forEach(option => { option.disabled = false; option.style.display = ""; const parentSelect = option.parentNode.nodeName.toLowerCase() == "optgroup" ? option.parentNode.parentNode : option.parentNode; localStorage.setItem("report_" + this.report.report_id + "_" + parentSelect.name + "_parameter", parentSelect.value) parentSelect.value = this.originalValues[parentSelect.name]; parentSelect.disabled = this.originalDisabledStates[parentSelect.name]; parentSelect.required = false; }); if (this.cleanupCallback) { this.cleanupCallback(); } } onFieldChanged(event) { this.loadButton.disabled = !this.reportParametersForm.checkValidity(); } onFormSubmitted(event) { event.preventDefault(); this.dismiss(); } onCancelButtonPressed(event) { this.dismiss(false); } } UIKit.registerViewControllerType(ReportParametersViewController);