From dd9002a61bfc2655fc4b096c4e858a2075330006 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Fri, 12 Dec 2025 10:10:30 +1000 Subject: [PATCH] added table controls --- package-lock.json | 57 +++++++------- src/pages/table.pug | 188 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 215 insertions(+), 30 deletions(-) create mode 100644 src/pages/table.pug diff --git a/package-lock.json b/package-lock.json index 1a2803c..1dba925 100644 --- a/package-lock.json +++ b/package-lock.json @@ -713,11 +713,10 @@ } }, "node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -735,6 +734,18 @@ "acorn": "^4.0.4" } }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-import-phases": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", @@ -3261,6 +3272,18 @@ "object-assign": "^4.0.1" } }, + "node_modules/is-expression/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5861,19 +5884,6 @@ } } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6375,19 +6385,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", diff --git a/src/pages/table.pug b/src/pages/table.pug new file mode 100644 index 0000000..d3b3328 --- /dev/null +++ b/src/pages/table.pug @@ -0,0 +1,188 @@ +include ../components/mixins.pug + +head + title table + +body + +navbarMixin("Table") + + .table-controls + details.filters + summary.filters__summary Filters + form.filters__form + fieldset.filters__fieldset + .filter-group + i.filter-group__label + b Location + br + .filter-group__items + input.filter-group__checkbox(type="checkbox" id="loc_kitchen" name="location" value="Kitchen") + | Kitchen + br + input.filter-group__checkbox(type="checkbox" id="loc_living" name="location" value="Living Room") + | Living Room + br + input.filter-group__checkbox(type="checkbox" id="loc_balcony" name="location" value="Balcony") + | Balcony + br + input.filter-group__checkbox(type="checkbox" id="loc_bedroom" name="location" value="Bedroom") + | Bedroom + br + + .filter-group + i.filter-group__label + b Sensor Type + br + .filter-group__items + input.filter-group__checkbox(type="checkbox" id="type_xiaomi" name="sensor_type" value="Xiaomi") + | Xiaomi + br + input.filter-group__checkbox(type="checkbox" id="type_bmp220" name="sensor_type" value="Bmp220") + | Bmp220 + br + input.filter-group__checkbox(type="checkbox" id="type_scd30" name="sensor_type" value="Scd30(Internal)") + | Scd30(Internal) + br + input.filter-group__checkbox(type="checkbox" id="type_bmp280" name="sensor_type" value="Bmp280") + | Bmp280 + br + + .filter-group + i.filter-group__label + b Numeric Values + br + .filter-group__range + | Temperature from: + input.filter-group__input(type="number" name="temp_min" placeholder="20") + | to: + input.filter-group__input(type="number" name="temp_max" placeholder="30") + br + | Humidity from: + input.filter-group__input(type="number" name="humidity_min" placeholder="40") + | to: + input.filter-group__input(type="number" name="humidity_max" placeholder="60") + br + + .filter-group + i.filter-group__label + b Device Specific Filters + br + .filter-group__items + | Sensor Name: + input.filter-group__input(type="text" name="sensor_name") + br + | Days Since Calibration (max): + input.filter-group__input(type="number" name="calibration_days" placeholder="30") + br + + .filter-group + i.filter-group__label + b Measurement Period + br + .filter-group__dates + | From: + input.filter-group__input(type="date" name="date_from") + br + | To: + input.filter-group__input(type="date" name="date_to") + br + + .filter-group__buttons + input.filter-group__button.filter-group__button--submit(type="submit" value="Apply Filters") + input.filter-group__button.filter-group__button--reset(type="reset" value="Reset Filters") + + details.sorting + summary.sorting__summary Sortings + form.sorting__form + fieldset.sorting__fieldset + .sort-level + i.sort-level__label + b Sort Level 1 + br + label.sort-level__field-label(for="sort1") Field: + select.sort-level__select(id="sort1" name="sort1") + option(value="") -- None -- + option(value="SensorID") SensorID + option(value="Timestamp") Time + option(value="BatteryLevel") BatteryLevel + option(value="Temperature") Temperature + option(value="Humidity") Humidity + label.sort-level__reverse-label(for="sort1_reverse") + input.sort-level__checkbox(type="checkbox" id="sort1_reverse" name="sort1_reverse") + | Reverse + br + br + + .sort-level + i.sort-level__label + b Sort Level 2 + br + label.sort-level__field-label(for="sort2") Field: + select.sort-level__select(id="sort2" name="sort2") + option(value="") -- None -- + option(value="SensorID") SensorID + option(value="Timestamp") Time + option(value="BatteryLevel") BatteryLevel + option(value="Temperature") Temperature + option(value="Humidity") Humidity + label.sort-level__reverse-label(for="sort2_reverse") + input.sort-level__checkbox(type="checkbox" id="sort2_reverse" name="sort2_reverse") + | Reverse + br + br + + .sort-level + i.sort-level__label + b Sort Level 3 + br + label.sort-level__field-label(for="sort3") Field: + select.sort-level__select(id="sort3" name="sort3") + option(value="") -- None -- + option(value="SensorID") SensorID + option(value="Timestamp") Time + option(value="BatteryLevel") BatteryLevel + option(value="Temperature") Temperature + option(value="Humidity") Humidity + label.sort-level__reverse-label(for="sort3_reverse") + input.sort-level__checkbox(type="checkbox" id="sort3_reverse" name="sort3_reverse") + | Reverse + br + input.sort-level__submit(type="submit" value="Sort") + + details.graph + summary.graph__summary Graph + form.graph__form + fieldset.graph__fieldset + .axis-group + i.axis-group__label + b X axis + br + .axis-group__options + input.axis-group__radio(type="radio" id="x_time" name="x_axis" value="Time" checked) + label.axis-group__option-label(for="x_time") Time + br + input.axis-group__radio(type="radio" id="x_battery" name="x_axis" value="BatteryLevel") + label.axis-group__option-label(for="x_battery") BatteryLevel + br + input.axis-group__radio(type="radio" id="x_temperature" name="x_axis" value="Temperature") + label.axis-group__option-label(for="x_temperature") Temperature + br + input.axis-group__radio(type="radio" id="x_humidity" name="x_axis" value="Humidity") + label.axis-group__option-label(for="x_humidity") Humidity + br + + .values-group + i.values-group__label + b Values + br + .values-group__options + input.values-group__checkbox(type="checkbox" id="val_temperature" name="values" value="AverageTemperature" checked) + label.values-group__option-label(for="val_temperature") Average Temperature + br + input.values-group__checkbox(type="checkbox" id="val_humidity" name="values" value="Humidity") + label.values-group__option-label(for="val_humidity") Average Humidity + br + input.values-group__checkbox(type="checkbox" id="val_battery" name="values" value="BatteryLevel") + label.values-group__option-label(for="val_battery") Average BatteryLevel + br + button.values-group__button(type="submit" id="build_graph" name="build_graph") Build \ No newline at end of file