added table controls

This commit is contained in:
2025-12-12 10:10:30 +10:00
parent e142436ed3
commit dd9002a61b
2 changed files with 215 additions and 30 deletions

57
package-lock.json generated
View File

@@ -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",

188
src/pages/table.pug Normal file
View File

@@ -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