diff --git a/public/js/appChart.js b/public/js/appChart.js
index fe5aade993914f1cbd4e6f095002c494bc7deb15..24f546851cdb1d63e33a9f77d1c9b321f8629cc1 100644
--- a/public/js/appChart.js
+++ b/public/js/appChart.js
@@ -17,10 +17,9 @@ import {
   extractPropertiesFromFormattedDatastreamMetadata,
 } from "./src_modules/fetchedDataProcessing.mjs";
 
-import {
-  formatSensorThingsApiResponseForLineOrColumnChart,
-  drawLineChartHighcharts,
-} from "./src_modules/chartLine.mjs";
+import { formatSensorThingsApiResponseForLineOrColumnChart } from "./src_modules/chartHelpers.mjs";
+
+import { drawLineChartHighcharts } from "./src_modules/chartLine.mjs";
 
 import { drawColumnChartHighcharts } from "./src_modules/chartColumn.mjs";
 
@@ -50,12 +49,13 @@ import {
   getAbbreviationsForSelectedOptionsFromAllDropDownLists,
 } from "./src_modules/dropDownListHelpers.mjs";
 
-import {
-  drawHeatmapBasedOnSelectedOptions,
-  drawScatterPlotFromChartSelection,
-  drawLineChartBasedOnSelectedAggregationOptions,
-  drawColumnChartBasedOnSelectedAggregationOptions,
-} from "./src_modules/dropDownListProcessing.mjs";
+import { drawColumnChartBasedOnSelectedAggregationOptions } from "./src_modules/dropDownListChartColumn.mjs";
+
+import { drawHeatmapBasedOnSelectedOptions } from "./src_modules/dropDownListChartHeatmap.mjs";
+
+import { drawLineChartBasedOnSelectedAggregationOptions } from "./src_modules/dropDownListChartLine.mjs";
+
+import { drawScatterPlotFromChartSelection } from "./src_modules/dropDownListChartScatterPlot.mjs";
 
 /**
  * Use the `vanillaDropDown` library to style the buildings & data points drop down list
@@ -193,7 +193,7 @@ const drawChartUsingSelectedOptions = async function () {
           )
         : selectedBuildingsDataPointsSamplingRateAbbrevNestedArr;
 
-    // Check if we have dT (temperature difference)
+    // Check if we have dT (temperature difference), if so, extract these options
     const selectedBuildingsDataPointsSamplingRateAbbrevTempDiffArr =
       checkIfSelectedOptionsContainTemperatureDifference(
         selectedBuildingsDataPointsSamplingRateAbbrevNestedArr
diff --git a/public/js/src_modules/aggregateHelpers.mjs b/public/js/src_modules/aggregateHelpers.mjs
index e81f0cbd5d1c7011e782f4a999fb734371a2444f..4f9d780e85df49141fd1dc0d9ccf8de772fb57d3 100644
--- a/public/js/src_modules/aggregateHelpers.mjs
+++ b/public/js/src_modules/aggregateHelpers.mjs
@@ -354,10 +354,42 @@ const extractUniqueCalendarMonthsFromCalendarDates = function (
   return [...uniqueCalendarMonths];
 };
 
+/**
+ * Format a computed aggregation result to make it suitable for a chart. Currently, only line and column charts are supported
+ * @param {Array} calendarDatesMonthsStrArr An array of unique calendar dates strings (in "YYYY-MM-DD" fromat) or unique calendar months strings (in "YYYY-MM" format)
+ * @param {Array} aggregatedValuesArr An array of aggregated values
+ * @returns {Array} An array of formatted aggregation values suitable for use in a column chart
+ */
+const formatAggregationResultForChart = function (
+  calendarDatesMonthsStrArr,
+  aggregatedValuesArr
+) {
+  if (!calendarDatesMonthsStrArr || !aggregatedValuesArr) return;
+
+  // Create an array of Unix timestamp strings
+  const timestampsArr = calendarDatesMonthsStrArr.map((calendarStr) =>
+    new Date(calendarStr).getTime()
+  );
+
+  // Combine timestamp and value pairs
+  // The timestamps array and values array have same lengths, use one for looping
+  if (timestampsArr.length !== aggregatedValuesArr.length) {
+    throw new Error(
+      "The timestamps array and aggregated values array have different lengths"
+    );
+  } else {
+    return timestampsArr.map((timestamp, i) => [
+      timestamp,
+      aggregatedValuesArr[i],
+    ]);
+  }
+};
+
 export {
   extractObservationsWithinDatesInterval,
   extractObservationValuesWithinDatesInterval,
   extractObservationValuesWithinMonthInterval,
   extractUniqueCalendarDatesFromTimestamp,
   extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
 };
diff --git a/public/js/src_modules/chartColumn.mjs b/public/js/src_modules/chartColumn.mjs
index d9717466d55b836e347dc4d8fc536fce9f4cdf7f..646efbc140f194815e8fb9473cb03598bb09f6ed 100644
--- a/public/js/src_modules/chartColumn.mjs
+++ b/public/js/src_modules/chartColumn.mjs
@@ -9,31 +9,6 @@ import {
   createTooltipDateString,
 } from "./chartHelpers.mjs";
 
-/**
- * Format a computed aggregation result to make it suitable for a column chart
- * @param {Array} calendarDatesMonthsStrArr An array of unique calendar dates strings (in "YYYY-MM-DD" fromat) or unique calendar months strings (in "YYYY-MM" format)
- * @param {Array} aggregatedValuesArr An array of aggregated values
- * @returns {Array} An array of formatted aggregation values suitable for use in a column chart
- */
-const formatAggregationResultForColumnChart = function (
-  calendarDatesMonthsStrArr,
-  aggregatedValuesArr
-) {
-  if (!calendarDatesMonthsStrArr || !aggregatedValuesArr) return;
-
-  // Create an array of Unix timestamp strings
-  const timestampsArr = calendarDatesMonthsStrArr.map((calendarStr) =>
-    new Date(calendarStr).getTime()
-  );
-
-  // Combine timestamp and value pairs
-  // The timestamps array and values array have same lengths, use one for looping
-  return timestampsArr.map((timestamp, i) => [
-    timestamp,
-    aggregatedValuesArr[i],
-  ]);
-};
-
 /**
  * Creates an options object for each series drawn in a column chart
  * @param {Array} formattedAggregatedResultForColumnChart An array of formatted aggregated result array(s) from one or more datastreams
@@ -96,12 +71,12 @@ const createYAxisTitleTextColumnChart = function (
 
 /**
  * Draw a column chart using Highcharts library
- * @param {Array} formattedAggResultArraysForColumnChart An array made up of formatted aggregated result array(s) suitable for use in a column chart
+ * @param {Array} formattedObsArraysForColumnChart An array made up of formatted observation array(s) suitable for use in a column chart. The observations may either be raw or aggregated
  * @param {Object} extractedFormattedDatastreamProperties An object that contains arrays of formatted Datastream properties
  * @returns {undefined} undefined
  */
 const drawColumnChartHighcharts = function (
-  formattedAggResultArraysForColumnChart,
+  formattedObsArraysForColumnChart,
   extractedFormattedDatastreamProperties
 ) {
   // Formatted datastream properties
@@ -136,7 +111,7 @@ const drawColumnChartHighcharts = function (
 
   // Create the array of series options object(s)
   const seriesOptionsArr = createSeriesOptionsForColumnChart(
-    formattedAggResultArraysForColumnChart,
+    formattedObsArraysForColumnChart,
     buildingIdsPhenomenonNamesArr
   );
 
@@ -213,4 +188,4 @@ const drawColumnChartHighcharts = function (
   });
 };
 
-export { formatAggregationResultForColumnChart, drawColumnChartHighcharts };
+export { drawColumnChartHighcharts };
diff --git a/public/js/src_modules/chartHeatmap.mjs b/public/js/src_modules/chartHeatmap.mjs
index 87884e0af04ab2f6e1124e33ac437c6a9ff942ab..24e997cd39850fef77526944cde80798bbf44e70 100644
--- a/public/js/src_modules/chartHeatmap.mjs
+++ b/public/js/src_modules/chartHeatmap.mjs
@@ -57,7 +57,7 @@ const calculateMinMaxValuesForHeatmapColorAxis = function (
 
 /**
  * Draw a heatmap using Highcharts library
- * @param {Array} formattedObsArrayForHeatmap Response from SensorThings API formatted for use in a heatmap
+ * @param {Array} formattedObsArrayForHeatmap Response from SensorThings API formatted for use in a heatmap. Currently, only raw observations are supported, i.e. no aggregation
  * @param {Object} extractedFormattedDatastreamProperties An object that contains arrays of formatted Datastream properties
  * @returns {undefined} undefined
  */
diff --git a/public/js/src_modules/chartHelpers.mjs b/public/js/src_modules/chartHelpers.mjs
index 0c633b31e97a9681eedbafa54bb0542e9366e35a..432b04399d6cc92cfcd45a7a8c88c6b77a6f8d33 100644
--- a/public/js/src_modules/chartHelpers.mjs
+++ b/public/js/src_modules/chartHelpers.mjs
@@ -177,6 +177,21 @@ const checkForAndDeleteUniqueObservationsFromLargerArray = function (
   }
 };
 
+/**
+ * Format the response from SensorThings API to make it suitable for use in a line chart or column chart
+ * @param {Array} obsArray Array of observations (timestamp + value) that is response from SensorThings API
+ * @returns {Array} Array of formatted observations suitable for use in a line chart
+ */
+const formatSensorThingsApiResponseForLineOrColumnChart = function (obsArray) {
+  if (!obsArray) return;
+
+  return obsArray.map((result) => {
+    const timestampObs = new Date(result[0].slice(0, -1)).getTime(); // slice() removes trailing "Z" character in timestamp
+    const valueObs = result[1];
+    return [timestampObs, valueObs];
+  });
+};
+
 /**
  * Convert a hexadecimal color code obtained from the Highcharts object (`Highcharts.getOptions().colors`) to its equivalent RGB color code
  * @param {String} hexCode Input hex color code
@@ -406,6 +421,7 @@ const removeTransparencyFromColor = function (rgbaColor) {
 export {
   chartExportOptions,
   checkForAndDeleteUniqueObservationsFromLargerArray,
+  formatSensorThingsApiResponseForLineOrColumnChart,
   createCombinedTextDelimitedByAmpersand,
   createCombinedTextDelimitedByComma,
   extractSamplingRateFromDatastreamName,
diff --git a/public/js/src_modules/chartLine.mjs b/public/js/src_modules/chartLine.mjs
index f34b8a90a79b2e9415cb63cdb79b91bdcfb0bb1b..6754a9679eea4062224ca1d2dd1b169b9a493510 100644
--- a/public/js/src_modules/chartLine.mjs
+++ b/public/js/src_modules/chartLine.mjs
@@ -7,30 +7,6 @@ import {
   createTooltipDateString,
 } from "./chartHelpers.mjs";
 
-/**
- * Format the response from SensorThings API to make it suitable for use in a line chart or column chart
- * @param {Array} obsArray Array of observations (timestamp + value) that is response from SensorThings API
- * @returns {Array} Array of formatted observations suitable for use in a line chart
- */
-const formatSensorThingsApiResponseForLineOrColumnChart = function (obsArray) {
-  if (!obsArray) return;
-
-  return obsArray.map((result) => {
-    const timestampObs = new Date(result[0].slice(0, -1)).getTime(); // slice() removes trailing "Z" character in timestamp
-    const valueObs = result[1];
-    return [timestampObs, valueObs];
-  });
-};
-
-/**
- * Concatenates metadata properties to create a string for either the title or subtitle of a line chart
- * @param {Array} phenomenonNamesArr An array of phenomenon name strings
- * @returns {String} A string made up of combined phenomenon names
- */
-const createCombinedTextForLineChartTitles = function (phenomenonNamesArr) {
-  return phenomenonNamesArr.join(", ");
-};
-
 /**
  * Creates an options object for each series drawn in the line chart
  * @param {Array} formattedObsArraysForLineChart An array of formatted observation array(s) from one or more datastreams
@@ -42,10 +18,10 @@ const createSeriesOptionsForLineChart = function (
   buildingIdsPhenomenonNamesArr
 ) {
   // An array of colors, in hexadecimal format, provided by the global Highcharts object
-  const seriesColors = Highcharts.getOptions().colors;
+  const seriesColorsArr = Highcharts.getOptions().colors;
 
-  // Create a copy of the colors array
-  const seriesColorsArr = [...seriesColors];
+  // Create a local copy of the colors array
+  const seriesColorsForLineChartArr = [...seriesColorsArr];
 
   // Create an array of seriesOptions objects
   // Assumes that the observation array of arrays and building IDs + phenomenon names array are of equal length
@@ -62,7 +38,7 @@ const createSeriesOptionsForLineChart = function (
       return {
         name: `${buildingIdsPhenomenonNamesArr[i]}`,
         data: formattedObsArray,
-        color: seriesColorsArr[i],
+        color: seriesColorsForLineChartArr[i],
         turboThreshold: Number.MAX_VALUE, // #3404, remove after 4.0.5 release
       };
     });
@@ -71,7 +47,7 @@ const createSeriesOptionsForLineChart = function (
 
 /**
  * Draw a line chart using Highcharts library
- * @param {Array} formattedObsArraysForLineChart An array made up of formatted observation array(s) suitable for use in a line chart
+ * @param {Array} formattedObsArraysForLineChart An array made up of formatted observation array(s) suitable for use in a line chart. The observations may either be raw or aggregated
  * @param {Object} extractedFormattedDatastreamPropertiesArr An object that contains arrays of formatted Datastream properties
  * @returns {undefined} undefined
  */
@@ -171,7 +147,4 @@ const drawLineChartHighcharts = function (
   });
 };
 
-export {
-  formatSensorThingsApiResponseForLineOrColumnChart,
-  drawLineChartHighcharts,
-};
+export { drawLineChartHighcharts };
diff --git a/public/js/src_modules/chartScatterPlot.mjs b/public/js/src_modules/chartScatterPlot.mjs
index 0c3cf1eee0d6b137163d966a90b5d2374afdd3d7..345465c4702bd405f54c529c5df68663e9ff44ac 100644
--- a/public/js/src_modules/chartScatterPlot.mjs
+++ b/public/js/src_modules/chartScatterPlot.mjs
@@ -36,20 +36,18 @@ const formatSensorThingsApiResponseForScatterPlot = function (
   obsArrayOne,
   obsArrayTwo
 ) {
-  // When our observation arrays have DIFFERENT lengths
-  if (obsArrayOne.length !== obsArrayTwo.length) {
-    const [obsArrayOneFinal, obsArrayTwoFinal] =
-      checkForAndDeleteUniqueObservationsFromLargerArray(
-        obsArrayOne,
-        obsArrayTwo
-      );
-
-    return createCombinedObservationValues(obsArrayOneFinal, obsArrayTwoFinal);
-  }
-  // When our observation arrays already have SAME lengths
-  else {
-    return createCombinedObservationValues(obsArrayOne, obsArrayTwo);
-  }
+  // Check if our observation arrays have equal lengths,
+  // remove the unique observations, if necessary
+  const [obsArrayOneFinal, obsArrayTwoFinal] =
+    obsArrayOne.length !== obsArrayTwo.length
+      ? checkForAndDeleteUniqueObservationsFromLargerArray(
+          obsArrayOne,
+          obsArrayTwo
+        )
+      : [obsArrayOne, obsArrayTwo];
+
+  // Create the combined observations array
+  return createCombinedObservationValues(obsArrayOneFinal, obsArrayTwoFinal);
 };
 
 /**
@@ -138,14 +136,14 @@ const createSeriesOptionsForScatterPlot = function (
   // An array of colors, in hexadecimal format, provided by the global Highcharts object
   const highchartsColorsArr = Highcharts.getOptions().colors;
 
-  // Create a reversed copy of the colors array
-  const highchartsColorsReversedArr = [...highchartsColorsArr].reverse();
+  // Create a local copy of the colors array
+  const highchartsColorsForScatterPlotArr = [...highchartsColorsArr];
 
   // Opacity value for symbol
   const SERIES_SYMBOL_COLOR_OPACITY = ".3";
 
   // Create array of colors in RGBA format
-  const seriesColors = highchartsColorsReversedArr.map(
+  const seriesColorsArr = highchartsColorsForScatterPlotArr.map(
     (hexColorCode) =>
       `rgba(${convertHexColorToRGBColor(
         hexColorCode
@@ -171,7 +169,7 @@ const createSeriesOptionsForScatterPlot = function (
       return {
         name: `${phenomenonNamesYAxisArr[i]}, ${phenomenonNameXAxis}`,
         data: formattedObsArray,
-        color: seriesColors[i],
+        color: seriesColorsArr[i],
       };
     });
   }
@@ -209,12 +207,12 @@ const getYAxisUnitOfMeasurementSymbol = function (seriesName) {
 
 /**
  * Draw a scatter plot using Highcharts library
- * @param {Array} formattedObsArrayForSeriesOnePlusSeriesTwo Response from SensorThings API formatted for use in a scatter plot
+ * @param {Array} formattedObsArraysForScatterPlot Response from SensorThings API formatted for use in a scatter plot. Currently, only raw observations are supported, i.e. no aggregation
  * @param {Object} extractedFormattedDatastreamProperties An object that contains arrays of formatted Datastream properties
  * @returns {undefined} undefined
  */
 const drawScatterPlotHighcharts = function (
-  formattedObsArrayForSeriesOnePlusSeriesTwo,
+  formattedObsArraysForScatterPlot,
   extractedFormattedDatastreamProperties
 ) {
   // Arrays of datastream properties
@@ -227,7 +225,7 @@ const drawScatterPlotHighcharts = function (
 
   // Create the array of series options object(s)
   const seriesOptionsArr = createSeriesOptionsForScatterPlot(
-    formattedObsArrayForSeriesOnePlusSeriesTwo,
+    formattedObsArraysForScatterPlot,
     phenomenonNamesArr
   );
 
diff --git a/public/js/src_modules/dropDownListAggregationAverage.mjs b/public/js/src_modules/dropDownListAggregationAverage.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..d2d6c322bb480ec54d318453c061ae098fce5832
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationAverage.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateAverageOfObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily average of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily average) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailyAverageObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate AVERAGE / DAILY of values of observations
+  const observationsAverageDailyNestedArr =
+    calculateAverageOfObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsAverageDailyNestedArr =
+    observationsAverageDailyNestedArr.map((obsAverageDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsAverageDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "average"
+    );
+
+  return [
+    formattedObservationsAverageDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly average of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly average) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlyAverageObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate AVERAGE / MONTHLY of values of observations
+  const observationsAverageMonthlyNestedArr =
+    calculateAverageOfObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsAverageMonthlyNestedArr =
+    observationsAverageMonthlyNestedArr.map((obsAverageMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsAverageMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "average"
+    );
+
+  return [
+    formattedObservationsAverageMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailyAverageObservations,
+  calculateAndFormatMonthlyAverageObservations,
+};
diff --git a/public/js/src_modules/dropDownListAggregationMaximum.mjs b/public/js/src_modules/dropDownListAggregationMaximum.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..bb5464d1c194befad044a659cf7af7e2d61dd177
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationMaximum.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateMaximumObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily maximum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily maximum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailyMaximumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate MAXIMUM / DAILY of values of observations
+  const observationsMaximumDailyNestedArr =
+    calculateMaximumObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsMaximumDailyNestedArr =
+    observationsMaximumDailyNestedArr.map((obsMinDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsMinDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "maximum"
+    );
+
+  return [
+    formattedObservationsMaximumDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly maximum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly maximum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlyMaximumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate MAXIMUM / MONTHLY of values of observations
+  const observationsMaximumMonthlyNestedArr =
+    calculateMaximumObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsMaximumMonthlyNestedArr =
+    observationsMaximumMonthlyNestedArr.map((obsMaxMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsMaxMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "maximum"
+    );
+
+  return [
+    formattedObservationsMaximumMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailyMaximumObservations,
+  calculateAndFormatMonthlyMaximumObservations,
+};
diff --git a/public/js/src_modules/dropDownListAggregationMinimum.mjs b/public/js/src_modules/dropDownListAggregationMinimum.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..fa1d050557fc694801d78f61714feac4dad88cdb
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationMinimum.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateMinimumObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily minimum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily minimum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailyMinimumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate MINIMUM / DAILY of values of observations
+  const observationsMinimumDailyNestedArr =
+    calculateMinimumObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsMinimumDailyNestedArr =
+    observationsMinimumDailyNestedArr.map((obsMinDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsMinDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "minimum"
+    );
+
+  return [
+    formattedObservationsMinimumDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly minimum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly minimum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlyMinimumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate MINIMUM / MONTHLY of values of observations
+  const observationsMinimumMonthlyNestedArr =
+    calculateMinimumObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsMinimumMonthlyNestedArr =
+    observationsMinimumMonthlyNestedArr.map((obsMinMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsMinMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "minimum"
+    );
+
+  return [
+    formattedObservationsMinimumMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailyMinimumObservations,
+  calculateAndFormatMonthlyMinimumObservations,
+};
diff --git a/public/js/src_modules/dropDownListAggregationSum.mjs b/public/js/src_modules/dropDownListAggregationSum.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..4d153282d6f51989c4540fb5225a4e86311f3360
--- /dev/null
+++ b/public/js/src_modules/dropDownListAggregationSum.mjs
@@ -0,0 +1,117 @@
+"use strict";
+
+import {
+  extractUniqueCalendarMonthsFromCalendarDates,
+  formatAggregationResultForChart,
+} from "./aggregateHelpers.mjs";
+
+import { calculateSumOfObservationValuesWithinInterval } from "./aggregate.mjs";
+
+import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
+
+/**
+ * Calculate the daily sum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (daily sum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatDailySumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Calculate SUM / DAILY of values of observations
+  const observationsSumDailyNestedArr =
+    calculateSumOfObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarDatesNestedArr,
+      "daily"
+    );
+
+  // Format the observations
+  const formattedObservationsSumDailyNestedArr =
+    observationsSumDailyNestedArr.map((obsSumDailyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarDatesNestedArr[i],
+        obsSumDailyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "daily",
+      "sum"
+    );
+
+  return [
+    formattedObservationsSumDailyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+/**
+ * Calculate the monthly sum of observations and format these aggregated observations
+ *
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {Array} An array whose first element is the formatted aggregated (monthly sum) observations. The second element is an object made up of extracted & formatted datastream properties
+ */
+const calculateAndFormatMonthlySumObservations = function (
+  uniqueCalendarDatesNestedArr,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  formattedMetadataNestedArr
+) {
+  // Unique calendar months
+  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
+    (uniqueCalendarDatesArr) =>
+      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
+  );
+
+  // Calculate SUM / MONTHLY of values of observations
+  const observationsSumMonthlyNestedArr =
+    calculateSumOfObservationValuesWithinInterval(
+      observationsNestedArr,
+      selectedSamplingRateAbbrev,
+      uniqueCalendarMonthsNestedArr,
+      "monthly"
+    );
+
+  // Format the observations
+  const formattedObservationsSumMonthlyNestedArr =
+    observationsSumMonthlyNestedArr.map((obsSumMonthlyArr, i) =>
+      formatAggregationResultForChart(
+        uniqueCalendarMonthsNestedArr[i],
+        obsSumMonthlyArr
+      )
+    );
+
+  // Extract the formatted metadata properties
+  const extractedFormattedDatastreamProperties =
+    extractPropertiesFromFormattedDatastreamMetadata(
+      formattedMetadataNestedArr,
+      true,
+      "monthly",
+      "sum"
+    );
+
+  return [
+    formattedObservationsSumMonthlyNestedArr,
+    extractedFormattedDatastreamProperties,
+  ];
+};
+
+export {
+  calculateAndFormatDailySumObservations,
+  calculateAndFormatMonthlySumObservations,
+};
diff --git a/public/js/src_modules/dropDownListChartColumn.mjs b/public/js/src_modules/dropDownListChartColumn.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..7c2aeee80ad43a592c9d9a2bbf56c39f05547251
--- /dev/null
+++ b/public/js/src_modules/dropDownListChartColumn.mjs
@@ -0,0 +1,159 @@
+"use strict";
+
+import { drawColumnChartHighcharts } from "./chartColumn.mjs";
+
+import {
+  calculateAndFormatDailySumObservations,
+  calculateAndFormatMonthlySumObservations,
+} from "./dropDownListAggregationSum.mjs";
+
+import {
+  calculateAndFormatDailyMaximumObservations,
+  calculateAndFormatMonthlyMaximumObservations,
+} from "./dropDownListAggregationMaximum.mjs";
+
+import {
+  calculateAndFormatDailyMinimumObservations,
+  calculateAndFormatMonthlyMinimumObservations,
+} from "./dropDownListAggregationMinimum.mjs";
+
+import {
+  calculateAndFormatDailyAverageObservations,
+  calculateAndFormatMonthlyAverageObservations,
+} from "./dropDownListAggregationAverage.mjs";
+
+/**
+ * Draw a column chart based on the selected aggregation options from a drop-down list
+ *
+ * @param {String} selectedAggregationType A string representing the selected aggregation type. The currently supported strings include `Sum`, `Maximum`, `Minimum` and `Average`
+ * @param {String} selectedAggregationDuration A string representing the selected aggregation duration. The currently supported strings include `Daily` and `Monthly`
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {undefined} undefined
+ */
+export const drawColumnChartBasedOnSelectedAggregationOptions = function (
+  selectedAggregationType,
+  selectedAggregationDuration,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  uniqueCalendarDatesNestedArr,
+  formattedMetadataNestedArr
+) {
+  // Daily / sum
+  if (
+    selectedAggregationType === "Sum" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    // Note: The `drawColumnChart` function expects two arguments,
+    // these are obtained by using the spread operator on the
+    // result returned from the `calculateAndFormat...` functions
+    drawColumnChartHighcharts(
+      ...calculateAndFormatDailySumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / sum
+  else if (
+    selectedAggregationType === "Sum" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawColumnChartHighcharts(
+      ...calculateAndFormatMonthlySumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Daily / maximum
+  else if (
+    selectedAggregationType === "Maximum" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    drawColumnChartHighcharts(
+      ...calculateAndFormatDailyMaximumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / maximum
+  else if (
+    selectedAggregationType === "Maximum" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawColumnChartHighcharts(
+      ...calculateAndFormatMonthlyMaximumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Daily / minimum
+  else if (
+    selectedAggregationType === "Minimum" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    drawColumnChartHighcharts(
+      ...calculateAndFormatDailyMinimumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / minimum
+  else if (
+    selectedAggregationType === "Minimum" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawColumnChartHighcharts(
+      ...calculateAndFormatMonthlyMinimumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Daily / average
+  else if (
+    selectedAggregationType === "Average" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    drawColumnChartHighcharts(
+      ...calculateAndFormatDailyAverageObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / average
+  else if (
+    selectedAggregationType === "Average" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawColumnChartHighcharts(
+      ...calculateAndFormatMonthlyAverageObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+};
diff --git a/public/js/src_modules/dropDownListChartHeatmap.mjs b/public/js/src_modules/dropDownListChartHeatmap.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..cad77602c6c55491a624c9430a4f3a22326338aa
--- /dev/null
+++ b/public/js/src_modules/dropDownListChartHeatmap.mjs
@@ -0,0 +1,34 @@
+"use strict";
+
+import {
+  formatSensorThingsApiResponseForHeatMap,
+  drawHeatMapHighcharts,
+} from "./chartHeatmap.mjs";
+
+/**
+ * Draw a heatmap based on the selected options from a drop-down list
+ *
+ * @param {Array} observationsComboNestedArr An array that contains non-computed (raw) observations and computed (temperature difference, dT) observations
+ * @param {Object} extractedFormattedDatastreamProperties An object that contains array(s) of formatted Datastream properties
+ * @returns {undefined} undefined
+ */
+export const drawHeatmapBasedOnSelectedOptions = function (
+  observationsComboNestedArr,
+  extractedFormattedDatastreamProperties
+) {
+  // Create formatted array of observations
+  const formattedObservationsHeatMapNestedArr = observationsComboNestedArr.map(
+    (observationsArr) =>
+      formatSensorThingsApiResponseForHeatMap(observationsArr)
+  );
+
+  // Note: The resulting array is nested and is not suitable for heatmap,
+  // extract the nested array
+  const [formattedObservationsHeatMapArr] =
+    formattedObservationsHeatMapNestedArr;
+
+  drawHeatMapHighcharts(
+    formattedObservationsHeatMapArr,
+    extractedFormattedDatastreamProperties
+  );
+};
diff --git a/public/js/src_modules/dropDownListChartLine.mjs b/public/js/src_modules/dropDownListChartLine.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..494e466c718cdd041267ee95b4ae31fca1d50b18
--- /dev/null
+++ b/public/js/src_modules/dropDownListChartLine.mjs
@@ -0,0 +1,159 @@
+"use strict";
+
+import { drawLineChartHighcharts } from "./chartLine.mjs";
+
+import {
+  calculateAndFormatDailySumObservations,
+  calculateAndFormatMonthlySumObservations,
+} from "./dropDownListAggregationSum.mjs";
+
+import {
+  calculateAndFormatDailyMaximumObservations,
+  calculateAndFormatMonthlyMaximumObservations,
+} from "./dropDownListAggregationMaximum.mjs";
+
+import {
+  calculateAndFormatDailyMinimumObservations,
+  calculateAndFormatMonthlyMinimumObservations,
+} from "./dropDownListAggregationMinimum.mjs";
+
+import {
+  calculateAndFormatDailyAverageObservations,
+  calculateAndFormatMonthlyAverageObservations,
+} from "./dropDownListAggregationAverage.mjs";
+
+/**
+ * Draw a line chart based on the selected aggregation options from a drop-down list
+ *
+ * @param {String} selectedAggregationType A string representing the selected aggregation type. The currently supported strings include `Sum`, `Maximum`, `Minimum` and `Average`
+ * @param {String} selectedAggregationDuration A string representing the selected aggregation duration. The currently supported strings include `Daily` and `Monthly`
+ * @param {Array} observationsNestedArr An array made up of sub-array(s) of observations
+ * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
+ * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
+ * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
+ * @returns {undefined} undefined
+ */
+export const drawLineChartBasedOnSelectedAggregationOptions = function (
+  selectedAggregationType,
+  selectedAggregationDuration,
+  observationsNestedArr,
+  selectedSamplingRateAbbrev,
+  uniqueCalendarDatesNestedArr,
+  formattedMetadataNestedArr
+) {
+  // Daily / sum
+  if (
+    selectedAggregationType === "Sum" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    // Note: The `drawColumChart` function expects two arguments,
+    // these are obtained by using the spread operator on the
+    // result returned from the `calculateAndFormat...` functions
+    drawLineChartHighcharts(
+      ...calculateAndFormatDailySumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / sum
+  else if (
+    selectedAggregationType === "Sum" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawLineChartHighcharts(
+      ...calculateAndFormatMonthlySumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Daily / maximum
+  else if (
+    selectedAggregationType === "Maximum" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    drawLineChartHighcharts(
+      ...calculateAndFormatDailyMaximumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / maximum
+  else if (
+    selectedAggregationType === "Maximum" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawLineChartHighcharts(
+      ...calculateAndFormatMonthlyMaximumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Daily / minimum
+  else if (
+    selectedAggregationType === "Minimum" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    drawLineChartHighcharts(
+      ...calculateAndFormatDailyMinimumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / minimum
+  else if (
+    selectedAggregationType === "Minimum" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawLineChartHighcharts(
+      ...calculateAndFormatMonthlyMinimumObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Daily / average
+  else if (
+    selectedAggregationType === "Average" &&
+    selectedAggregationDuration === "Daily"
+  ) {
+    drawLineChartHighcharts(
+      ...calculateAndFormatDailyAverageObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+  // Monthly / average
+  else if (
+    selectedAggregationType === "Average" &&
+    selectedAggregationDuration === "Monthly"
+  ) {
+    drawLineChartHighcharts(
+      ...calculateAndFormatMonthlyAverageObservations(
+        uniqueCalendarDatesNestedArr,
+        observationsNestedArr,
+        selectedSamplingRateAbbrev,
+        formattedMetadataNestedArr
+      )
+    );
+  }
+};
diff --git a/public/js/src_modules/dropDownListChartScatterPlot.mjs b/public/js/src_modules/dropDownListChartScatterPlot.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..9307a48dfd99cc8c016923b8c194b25c33e703a4
--- /dev/null
+++ b/public/js/src_modules/dropDownListChartScatterPlot.mjs
@@ -0,0 +1,35 @@
+"use strict";
+
+import {
+  formatSensorThingsApiResponseForScatterPlot,
+  drawScatterPlotHighcharts,
+} from "./chartScatterPlot.mjs";
+
+/**
+ * Draw a scatter plot based on the selected options from a drop-down list
+ *
+ * @param {Array} observationsComboNestedArr An array that contains non-computed (raw) observations and computed (temperature difference, dT) observations
+ * @param {Object} extractedFormattedDatastreamProperties An object that contains array(s) of formatted Datastream properties
+ * @returns {undefined} undefined
+ */
+export const drawScatterPlotFromChartSelection = function (
+  observationsComboNestedArr,
+  extractedFormattedDatastreamProperties
+) {
+  // Extract values for x-axis and y-axis
+  // x-axis values are first element of nested observations array
+  const [obsXAxisArr] = observationsComboNestedArr.slice(0, 1);
+  // y-axis values are rest of elements of nested observations array
+  const obsYAxisNestedArr = observationsComboNestedArr.slice(1);
+
+  // Create formatted array(s) of observations
+  const formattedObservationsScatterPlotArr = obsYAxisNestedArr.map(
+    (obsYAxisArr) =>
+      formatSensorThingsApiResponseForScatterPlot(obsXAxisArr, obsYAxisArr)
+  );
+
+  drawScatterPlotHighcharts(
+    formattedObservationsScatterPlotArr,
+    extractedFormattedDatastreamProperties
+  );
+};
diff --git a/public/js/src_modules/dropDownListHelpers.mjs b/public/js/src_modules/dropDownListHelpers.mjs
index 50ffbb8a267c94d0562e976187a1bb36fb0ef079..bb37a61cfd798d97a079b2723cf287b03189a1e4 100644
--- a/public/js/src_modules/dropDownListHelpers.mjs
+++ b/public/js/src_modules/dropDownListHelpers.mjs
@@ -279,14 +279,10 @@ const checkIfChartRequiresRawObservations = function (
   selectedAggregationType,
   selectedAggregationDuration
 ) {
-  if (
-    selectedAggregationType === "None (raw data)" &&
+  return selectedAggregationType === "None (raw data)" &&
     selectedAggregationDuration === undefined
-  ) {
-    return true;
-  } else {
-    return false;
-  }
+    ? true
+    : false;
 };
 
 /**
diff --git a/public/js/src_modules/dropDownListProcessing.mjs b/public/js/src_modules/dropDownListProcessing.mjs
deleted file mode 100644
index 123db15692211ef5bd3ae1f03bc595156d0232e5..0000000000000000000000000000000000000000
--- a/public/js/src_modules/dropDownListProcessing.mjs
+++ /dev/null
@@ -1,849 +0,0 @@
-"use strict";
-
-import { drawLineChartHighcharts } from "./chartLine.mjs";
-
-import {
-  formatSensorThingsApiResponseForHeatMap,
-  drawHeatMapHighcharts,
-} from "./chartHeatmap.mjs";
-
-import {
-  formatSensorThingsApiResponseForScatterPlot,
-  drawScatterPlotHighcharts,
-} from "./chartScatterPlot.mjs";
-
-import {
-  formatAggregationResultForColumnChart,
-  drawColumnChartHighcharts,
-} from "./chartColumn.mjs";
-
-import { extractUniqueCalendarMonthsFromCalendarDates } from "./aggregateHelpers.mjs";
-
-import {
-  calculateMinimumObservationValuesWithinInterval,
-  calculateMaximumObservationValuesWithinInterval,
-  calculateSumOfObservationValuesWithinInterval,
-  calculateAverageOfObservationValuesWithinInterval,
-} from "./aggregate.mjs";
-
-import { extractPropertiesFromFormattedDatastreamMetadata } from "./fetchedDataProcessing.mjs";
-
-/**
- * Draw a heatmap based on the selected options from a drop-down list
- *
- * @param {Array} observationsComboNestedArr An array that contains non-computed (raw) observations and computed (temperature difference, dT) observations
- * @param {Object} extractedFormattedDatastreamProperties An object that contains array(s) of formatted Datastream properties
- * @returns {undefined} undefined
- */
-const drawHeatmapBasedOnSelectedOptions = function (
-  observationsComboNestedArr,
-  extractedFormattedDatastreamProperties
-) {
-  // Create formatted array(s) for observations
-  const formattedObservationsHeatMapNestedArr = observationsComboNestedArr.map(
-    (observationsArr) =>
-      formatSensorThingsApiResponseForHeatMap(observationsArr)
-  );
-
-  // Note: The resulting array is nested and is not suitable for heatmap,
-  // extract the nested array
-  const [formattedObservationsHeatMapArr] =
-    formattedObservationsHeatMapNestedArr;
-
-  drawHeatMapHighcharts(
-    formattedObservationsHeatMapArr,
-    extractedFormattedDatastreamProperties
-  );
-};
-
-/**
- * Draw a scatter plot based on the selected options from a drop-down list
- *
- * @param {Array} observationsComboNestedArr An array that contains non-computed (raw) observations and computed (temperature difference, dT) observations
- * @param {Object} extractedFormattedDatastreamProperties An object that contains array(s) of formatted Datastream properties
- * @returns {undefined} undefined
- */
-const drawScatterPlotFromChartSelection = function (
-  observationsComboNestedArr,
-  extractedFormattedDatastreamProperties
-) {
-  // Extract values for x-axis and y-axis
-  // x-axis values are first element of nested observations array
-  const [obsXAxisArr] = observationsComboNestedArr.slice(0, 1);
-  // y-axis values are rest of elements of nested observations array
-  const obsYAxisNestedArr = observationsComboNestedArr.slice(1);
-
-  // Create formatted array(s) for observations
-  const formattedObservationsScatterPlotArr = obsYAxisNestedArr.map(
-    (obsYAxisArr) =>
-      formatSensorThingsApiResponseForScatterPlot(obsXAxisArr, obsYAxisArr)
-  );
-
-  drawScatterPlotHighcharts(
-    formattedObservationsScatterPlotArr,
-    extractedFormattedDatastreamProperties
-  );
-};
-
-/**
- * Calculate the daily sum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily sum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailySumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate sum of values of observations - daily
-  const observationsSumDailyNestedArr =
-    calculateSumOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations - sum / daily
-  const formattedObservationsSumDailyNestedArr =
-    observationsSumDailyNestedArr.map((obsSumDailyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsSumDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "sum"
-    );
-
-  return [
-    formattedObservationsSumDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly sum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly sum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlySumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate sum of values of observations - monthly
-  const observationsSumMonthlyNestedArr =
-    calculateSumOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations - sum / monthly
-  const formattedObservationsSumMonthlyNestedArr =
-    observationsSumMonthlyNestedArr.map((obsSumMonthlyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsSumMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "sum"
-    );
-
-  return [
-    formattedObservationsSumMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the daily maximum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily maximum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailyMaximumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate minimum of values of observations - daily
-  const observationsMaximumDailyNestedArr =
-    calculateMaximumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations - min / daily
-  const formattedObservationsMaximumDailyNestedArr =
-    observationsMaximumDailyNestedArr.map((obsMinDailyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsMinDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "maximum"
-    );
-
-  return [
-    formattedObservationsMaximumDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly maximum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly maximum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlyMaximumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate minimum of values of observations - monthly
-  const observationsMaximumMonthlyNestedArr =
-    calculateMaximumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations - max / monthly
-  const formattedObservationsMaximumMonthlyNestedArr =
-    observationsMaximumMonthlyNestedArr.map((obsMaxMonthlyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsMaxMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "maximum"
-    );
-
-  return [
-    formattedObservationsMaximumMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the daily minimum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily minimum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailyMinimumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate minimum of values of observations - daily
-  const observationsMinimumDailyNestedArr =
-    calculateMinimumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations - min / daily
-  const formattedObservationsMinimumDailyNestedArr =
-    observationsMinimumDailyNestedArr.map((obsMinDailyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsMinDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "minimum"
-    );
-
-  return [
-    formattedObservationsMinimumDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly minimum of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly minimum) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlyMinimumObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate minimum of values of observations - monthly
-  const observationsMinimumMonthlyNestedArr =
-    calculateMinimumObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations - min / monthly
-  const formattedObservationsMinimumMonthlyNestedArr =
-    observationsMinimumMonthlyNestedArr.map((obsMinMonthlyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsMinMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "minimum"
-    );
-
-  return [
-    formattedObservationsMinimumMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the daily average of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (daily average) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatDailyAverageObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Calculate average of values of observations - daily
-  const observationsAverageDailyNestedArr =
-    calculateAverageOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarDatesNestedArr,
-      "daily"
-    );
-
-  // Format the observations - average / daily
-  const formattedObservationsAverageDailyNestedArr =
-    observationsAverageDailyNestedArr.map((obsAverageDailyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarDatesNestedArr[i],
-        obsAverageDailyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "daily",
-      "average"
-    );
-
-  return [
-    formattedObservationsAverageDailyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Calculate the monthly average of observations and format these aggregated observations
- *
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {Array} An array whose first element is the formatted aggregated (monthly average) observations. The second element is an object made up of extracted & formatted datastream properties
- */
-const calculateAndFormatMonthlyAverageObservations = function (
-  uniqueCalendarDatesNestedArr,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  formattedMetadataNestedArr
-) {
-  // Unique calendar months
-  const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
-    (uniqueCalendarDatesArr) =>
-      extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
-  );
-
-  // Calculate average of values of observations - monthly
-  const observationsAverageMonthlyNestedArr =
-    calculateAverageOfObservationValuesWithinInterval(
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      uniqueCalendarMonthsNestedArr,
-      "monthly"
-    );
-
-  // Format the observations - average / monthly
-  const formattedObservationsAverageMonthlyNestedArr =
-    observationsAverageMonthlyNestedArr.map((obsAverageMonthlyArr, i) =>
-      formatAggregationResultForColumnChart(
-        uniqueCalendarMonthsNestedArr[i],
-        obsAverageMonthlyArr
-      )
-    );
-
-  // Extract the formatted metadata properties
-  const extractedFormattedDatastreamProperties =
-    extractPropertiesFromFormattedDatastreamMetadata(
-      formattedMetadataNestedArr,
-      true,
-      "monthly",
-      "average"
-    );
-
-  return [
-    formattedObservationsAverageMonthlyNestedArr,
-    extractedFormattedDatastreamProperties,
-  ];
-};
-
-/**
- * Draw a line chart based on the selected aggregation options from a drop-down list
- *
- * @param {String} selectedAggregationType A string representing the selected aggregation type. The currently supported strings include `Sum`, `Maximum`, `Minimum` and `Average`
- * @param {String} selectedAggregationDuration A string representing the selected aggregation duration. The currently supported strings include `Daily` and `Monthly`
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {undefined} undefined
- */
-const drawLineChartBasedOnSelectedAggregationOptions = function (
-  selectedAggregationType,
-  selectedAggregationDuration,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  uniqueCalendarDatesNestedArr,
-  formattedMetadataNestedArr
-) {
-  if (
-    selectedAggregationType === "Sum" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / sum
-    const [
-      formattedObservationsSumDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailySumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsSumDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationType === "Sum" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / sum
-    const [
-      formattedObservationsSumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlySumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsSumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationType === "Maximum" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / maximum
-    const [
-      formattedObservationsMaximumDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailyMaximumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsMaximumDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationType === "Maximum" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / maximum
-    const [
-      formattedObservationsMaximumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlyMaximumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsMaximumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationType === "Minimum" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / minimum
-    const [
-      formattedObservationsMinimumDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailyMinimumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsMinimumDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationType === "Minimum" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / minimum
-    const [
-      formattedObservationsMinimumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlyMinimumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsMinimumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationType === "Average" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / average
-    const [
-      formattedObservationsAverageDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailyAverageObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsAverageDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationType === "Average" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / average
-    const [
-      formattedObservationsAverageMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlyAverageObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawLineChartHighcharts(
-      formattedObservationsAverageMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  }
-};
-
-/**
- * Draw a column chart based on the selected aggregation options from a drop-down list
- *
- * @param {String} selectedAggregationType A string representing the selected aggregation type. The currently supported strings include `Sum`, `Maximum`, `Minimum` and `Average`
- * @param {String} selectedAggregationDuration A string representing the selected aggregation duration. The currently supported strings include `Daily` and `Monthly`
- * @param {Array} observationsAggregationNestedArr An array made up of sub-array(s) of aggregated observations
- * @param {String} selectedSamplingRateAbbrev A string representing the abbreviated form of the selected sampling rate option
- * @param {Array} uniqueCalendarDatesNestedArr An array made up of sub-array(s) of unique calendar date(s) string(s)
- * @param {Array} formattedMetadataNestedArr An array of sub-arrays of formatted metadata properties
- * @returns {undefined} undefined
- */
-const drawColumnChartBasedOnSelectedAggregationOptions = function (
-  selectedAggregationTypeArr,
-  selectedAggregationDuration,
-  observationsAggregationNestedArr,
-  selectedSamplingRateAbbrev,
-  uniqueCalendarDatesNestedArr,
-  formattedMetadataNestedArr
-) {
-  if (
-    selectedAggregationTypeArr === "Sum" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / sum
-    const [
-      formattedObservationsSumDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailySumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsSumDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationTypeArr === "Sum" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / sum
-    const [
-      formattedObservationsSumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlySumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsSumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationTypeArr === "Maximum" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / maximum
-    const [
-      formattedObservationsMaximumDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailyMaximumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsMaximumDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationTypeArr === "Maximum" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / maximum
-    const [
-      formattedObservationsMaximumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlyMaximumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsMaximumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationTypeArr === "Minimum" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / minimum
-    const [
-      formattedObservationsMinimumDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailyMinimumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsMinimumDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationTypeArr === "Minimum" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / minimum
-    const [
-      formattedObservationsMinimumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlyMinimumObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsMinimumMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationTypeArr === "Average" &&
-    selectedAggregationDuration === "Daily"
-  ) {
-    // Formatted observations and metadata for chart - daily / average
-    const [
-      formattedObservationsAverageDailyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatDailyAverageObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsAverageDailyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  } else if (
-    selectedAggregationTypeArr === "Average" &&
-    selectedAggregationDuration === "Monthly"
-  ) {
-    // Formatted observations and metadata for chart - monthly / average
-    const [
-      formattedObservationsAverageMonthlyNestedArr,
-      extractedFormattedDatastreamProperties,
-    ] = calculateAndFormatMonthlyAverageObservations(
-      uniqueCalendarDatesNestedArr,
-      observationsAggregationNestedArr,
-      selectedSamplingRateAbbrev,
-      formattedMetadataNestedArr
-    );
-
-    drawColumnChartHighcharts(
-      formattedObservationsAverageMonthlyNestedArr,
-      extractedFormattedDatastreamProperties
-    );
-  }
-};
-
-export {
-  drawHeatmapBasedOnSelectedOptions,
-  drawScatterPlotFromChartSelection,
-  drawLineChartBasedOnSelectedAggregationOptions,
-  drawColumnChartBasedOnSelectedAggregationOptions,
-};
diff --git a/public/js/src_modules/fetchData.mjs b/public/js/src_modules/fetchData.mjs
index 7b2cca248743999b818759b29171433d99fe08f4..f1d207dd6f8b66733a588d10a794ad04fddb8653 100644
--- a/public/js/src_modules/fetchData.mjs
+++ b/public/js/src_modules/fetchData.mjs
@@ -35,7 +35,7 @@ const getDatastream = function (urlDatastream) {
 };
 
 /**
- * Perform a GET request using the Axios library
+ * Perform a GET request to fetch Observations using the Axios library
  * @param {String} urlObservations A URL that fetches Observations from an STA instance
  * @param {Object} urlParamObj The URL parameters to be sent together with the GET request
  * @returns {Promise} A promise that contains the first page of results when fulfilled