diff --git a/public/js/appChart.js b/public/js/appChart.js index 24f546851cdb1d63e33a9f77d1c9b321f8629cc1..b4d1e7bc401630ba49b551cabfc22a718c5da02e 100644 --- a/public/js/appChart.js +++ b/public/js/appChart.js @@ -30,7 +30,7 @@ import { enableDrawChartButton, } from "./src_modules/loadingIndicator.mjs"; -import { vanillaSelectBox } from "./thirdparty/vanillaSelectBox.mjs"; +import { styleAllDropDownLists } from "./src_modules/dropDownListStyling.mjs"; import { extractObservationsWithinDatesInterval, @@ -57,66 +57,6 @@ import { drawLineChartBasedOnSelectedAggregationOptions } from "./src_modules/dr import { drawScatterPlotFromChartSelection } from "./src_modules/dropDownListChartScatterPlot.mjs"; -/** - * Use the `vanillaDropDown` library to style the buildings & data points drop down list - * - * @returns {undefined} - */ -const styleBuildingsDataPointsDropDown = function () { - // Create our dropdown list using `vanillaSelectBox`; supports the selection of multiple options - new vanillaSelectBox("#drop-down--bldg-data-point", { - "disableSelectAll": true, - "maxSelect": 5, - "placeHolder": "--Select--", - "search": false, - }); -}; - -/** - * Use the `vanillaDropDown` library to style the aggregation type drop down list - * - * @returns {undefined} - */ -const styleAggregationDropDown = function () { - // Create our dropdown list using `vanillaSelectBox` - new vanillaSelectBox("#drop-down--aggregation-type", { - "disableSelectAll": true, - "maxSelect": 1, - "placeHolder": "--Select--", - "search": false, - }); -}; - -/** - * Use the `vanillaDropDown` library to style the third sampling rate down list - * - * @returns {undefined} - */ -const styleSamplingRateDropDown = function () { - // Create our dropdown list using `vanillaSelectBox` - new vanillaSelectBox("#drop-down--sampling-rate", { - "disableSelectAll": true, - "maxSelect": 1, - "placeHolder": "--Select--", - "search": false, - }); -}; - -/** - * Use the `vanillaDropDown` library to style the chart type drop down list - * - * @returns {undefined} - */ -const styleChartTypeDropDown = function () { - // Create our dropdown list using `vanillaSelectBox` - new vanillaSelectBox("#drop-down--chart-type", { - "disableSelectAll": true, - "maxSelect": 1, - "placeHolder": "--Select--", - "search": false, - }); -}; - /** * Callback function that wraps the logic of populating the linked drop down lists. * Will run on `DOMContentLoaded` event @@ -124,10 +64,7 @@ const styleChartTypeDropDown = function () { * @returns {undefined} */ const afterDocumentLoads = function () { - styleBuildingsDataPointsDropDown(); - styleAggregationDropDown(); - styleSamplingRateDropDown(); - styleChartTypeDropDown(); + styleAllDropDownLists(); }; /** @@ -140,33 +77,34 @@ const afterDocumentLoads = function () { */ const drawChartUsingSelectedOptions = async function () { try { - const selectedOptionsAllDropDownLists = - getSelectedOptionsFromAllDropDownLists(); - // Note: The chart type amd aggregation type + duration are the first and // third elements respectively, we have ignored the second and fourth elements const [selectedChartTypeArr, , selectedAggregationTypeDurationArr] = - selectedOptionsAllDropDownLists; + getSelectedOptionsFromAllDropDownLists(); - // Create an array of aggregation type and duration - const selectedAggregationTypeDurationSplitNestedArr = + // Note: the resulting array is nested, it only has one sub-array + // Separate the aggregation type and the aggregation duration strings + const [[selectedAggregationType, selectedAggregationDuration]] = splitMultipleOptionsTextDelimitedBySlash( selectedAggregationTypeDurationArr ); - // Separate the aggregation type and the aggregation duration strings - const [selectedAggregationTypeDurationSplitArr] = - selectedAggregationTypeDurationSplitNestedArr; - - const [selectedAggregationType, selectedAggregationDuration] = - selectedAggregationTypeDurationSplitArr; - // Array of building(s) + data point(s) + sampling rate const selectedBuildingsDataPointsSamplingRateAbbrevNestedArr = getAbbreviationsForSelectedOptionsFromAllDropDownLists( - selectedOptionsAllDropDownLists + getSelectedOptionsFromAllDropDownLists() ); + // The formatted abbreviations array is nested, we are interested in the first sub-array + // We assume that all the phenomena have the same sampling rate + // Extract the formatted sampling rate string - used by ALL chart types + const [[, , selectedSamplingRateAbbrev]] = + selectedBuildingsDataPointsSamplingRateAbbrevNestedArr; + + // User-specified start date and end date for aggregation - used by MULTIPLE chart types + const AGGREGATION_START_DATE = "2020-01-01"; + const AGGREGATION_STOP_DATE = "2020-12-31"; + // The values of these references is either equal to `true` or an error will be thrown // We would like the errors to be thrown at this point before we begin performing any asynchronous tasks const selectedAggregationOptionsAreValid = @@ -209,8 +147,8 @@ const drawChartUsingSelectedOptions = async function () { // Disable the 'draw chart' button disableDrawChartButton(); - // Fetch the observations + metadata / raw observations - const observationsRawPlusMetadataArr = + // Fetch and extract the observations + metadata / raw observations + const [observationsRawNestedArr, metadataRawNestedArr] = selectedBuildingsDataPointsSamplingRateAbbrevRawObsArr.length === 0 ? [[], []] : await getMetadataPlusObservationsFromSingleOrMultipleDatastreams( @@ -219,8 +157,8 @@ const drawChartUsingSelectedOptions = async function () { selectedBuildingsDataPointsSamplingRateAbbrevRawObsArr ); - // Fetch the observations + metadata / temperature difference (dT) - const observationsTempDiffPlusMetadataArr = + // Fetch and extract the observations + metadata / temperature difference (dT) + const [observationsTempDiffNestedArr, metadataTempDiffNestedArr] = selectedBuildingsDataPointsSamplingRateAbbrevTempDiffArr.length === 0 ? [[], []] : await calculateVorlaufMinusRuecklaufTemperature( @@ -231,59 +169,36 @@ const drawChartUsingSelectedOptions = async function () { ) ); - // Extract the combined arrays for observations and metadata / raw observations - const [observationsRawNestedArr, metadataRawNestedArr] = - observationsRawPlusMetadataArr; - - // Extract the combined arrays for observations and metadata / temperature difference (dT) - const [observationsTempDiffNestedArr, metadataTempDiffNestedArr] = - observationsTempDiffPlusMetadataArr; - - // Create a combined array of observations and metadata - const observationsPlusMetadataCombined = [ + // Create and extract the combined observations and metadata + const [observationsCombinedNestedArr, metadataCombinedNestedArr] = [ [...observationsRawNestedArr, ...observationsTempDiffNestedArr], [...metadataRawNestedArr, ...metadataTempDiffNestedArr], ]; - const [observationsComboNestedArr, metadataComboNestedArr] = - observationsPlusMetadataCombined; - // Create formatted array(s) for metadata - used by ALL chart types - const formattedMetadataNestedArr = metadataComboNestedArr.map( + const formattedMetadataNestedArr = metadataCombinedNestedArr.map( (metadataObj) => formatDatastreamMetadataForChart(metadataObj) ); // Extract the formatted metadata properties for the raw observations - used by ALL chart types - const rawObservationsExtractedFormattedDatastreamProperties = + const rawObsExtractedFormattedDatastreamProperties = extractPropertiesFromFormattedDatastreamMetadata( formattedMetadataNestedArr, false ); - // The formatted abbreviations array is nested - const [selectedBuildingsDataPointsSamplingRateAbbrevArr] = - selectedBuildingsDataPointsSamplingRateAbbrevNestedArr; - - // Extract the formatted sampling rate string - used by ALL chart types - const [, , selectedSamplingRateAbbrev] = - selectedBuildingsDataPointsSamplingRateAbbrevArr; - - // User-specified start date and end date for aggregation - used by MULTIPLE chart types - const aggregationStartDate = "2020-01-01"; - const aggregationEndDate = "2020-12-31"; - // Create final array of observations- used by MULTIPLE chart types // If we are performing aggregation, it was envisioned that the user would // select observations that fall within a start and end date const observationsComboNestedFinalArr = selectedAggregationType === "None (raw data)" - ? observationsComboNestedArr - : observationsComboNestedArr.map((observationsArr) => + ? observationsCombinedNestedArr + : observationsCombinedNestedArr.map((observationsArr) => extractObservationsWithinDatesInterval( observationsArr, selectedSamplingRateAbbrev, - aggregationStartDate, - aggregationEndDate + AGGREGATION_START_DATE, + AGGREGATION_STOP_DATE ) ); @@ -303,7 +218,7 @@ const drawChartUsingSelectedOptions = async function () { ) { drawHeatmapBasedOnSelectedOptions( observationsComboNestedFinalArr, - rawObservationsExtractedFormattedDatastreamProperties + rawObsExtractedFormattedDatastreamProperties ); } break; @@ -316,7 +231,7 @@ const drawChartUsingSelectedOptions = async function () { ) { drawScatterPlotFromChartSelection( observationsComboNestedFinalArr, - rawObservationsExtractedFormattedDatastreamProperties + rawObsExtractedFormattedDatastreamProperties ); } break; @@ -335,7 +250,7 @@ const drawChartUsingSelectedOptions = async function () { drawLineChartHighcharts( formattedRawObservationsLineChartNestedArr, - rawObservationsExtractedFormattedDatastreamProperties + rawObsExtractedFormattedDatastreamProperties ); } // Aggregated observations @@ -365,7 +280,7 @@ const drawChartUsingSelectedOptions = async function () { drawColumnChartHighcharts( formattedRawObservationsColumnChartNestedArr, - rawObservationsExtractedFormattedDatastreamProperties + rawObsExtractedFormattedDatastreamProperties ); } // Aggregated observations diff --git a/public/js/src_modules/dropDownListStyling.mjs b/public/js/src_modules/dropDownListStyling.mjs new file mode 100644 index 0000000000000000000000000000000000000000..acc028414a6d63a683a09a51377a226adcc96ddc --- /dev/null +++ b/public/js/src_modules/dropDownListStyling.mjs @@ -0,0 +1,53 @@ +"use strict"; + +import { vanillaSelectBox } from "../thirdparty/vanillaSelectBox.mjs"; + +/** + * Use the `vanillaDropDown` library to style the buildings & data points drop down list + * + * @returns {undefined} + */ +const styleBuildingsDataPointsDropDown = function () { + // Create our dropdown list using `vanillaSelectBox`; supports the selection of multiple options + new vanillaSelectBox("#drop-down--bldg-data-point", { + disableSelectAll: true, + maxSelect: 5, + placeHolder: "--Select--", + search: false, + }); +}; + +/** + * Use the `vanillaDropDown` library to style the chart type, + * aggregation type and sampling rates drop down lists + * + * @returns {undefined} undefined + */ +const styleOtherDropDownLists = function () { + // Array of CSS selector strings + const cssSelectorStringsArr = [ + "#drop-down--chart-type", + "#drop-down--aggregation-type", + "#drop-down--sampling-rate", + ]; + + // Create our dropdown lists using `vanillaSelectBox` + cssSelectorStringsArr.forEach((cssSelectorString) => { + new vanillaSelectBox(cssSelectorString, { + disableSelectAll: true, + maxSelect: 1, + placeHolder: "--Select--", + search: false, + }); + }); +}; + +/** + * Use the `vanillaDropDown` library to style all the drop down lists + * + * @returns {undefined} undefined + */ +export const styleAllDropDownLists = function () { + styleBuildingsDataPointsDropDown(); + styleOtherDropDownLists(); +};