From 10fbf50d011ab2a8da66b0d4b6c70fa5c79c597c Mon Sep 17 00:00:00 2001 From: Devyn Keeney Date: Tue, 5 Aug 2025 20:03:49 -0500 Subject: [PATCH 1/2] Create types for composable field monitor widgets --- .../field-monitor/MonitorItem.svelte | 3 +++ .../field-monitor/battery/BatteryWidget.svelte | 8 ++++++++ ui/src/lib/field-monitor/battery/settings.ts | 1 + ui/src/lib/field-monitor/rio/RioWidget.svelte | 8 ++++++++ ui/src/lib/field-monitor/rio/settings.ts | 1 + ui/src/lib/field-monitor/widget.ts | 18 ++++++++++++++++++ ui/src/routes/fieldMonitorTest/+page.svelte | 17 +++++++++++++++++ 7 files changed, 56 insertions(+) create mode 100644 ui/src/lib/components/field-monitor/MonitorItem.svelte create mode 100644 ui/src/lib/field-monitor/battery/BatteryWidget.svelte create mode 100644 ui/src/lib/field-monitor/battery/settings.ts create mode 100644 ui/src/lib/field-monitor/rio/RioWidget.svelte create mode 100644 ui/src/lib/field-monitor/rio/settings.ts create mode 100644 ui/src/lib/field-monitor/widget.ts create mode 100644 ui/src/routes/fieldMonitorTest/+page.svelte diff --git a/ui/src/lib/components/field-monitor/MonitorItem.svelte b/ui/src/lib/components/field-monitor/MonitorItem.svelte new file mode 100644 index 0000000..f03c796 --- /dev/null +++ b/ui/src/lib/components/field-monitor/MonitorItem.svelte @@ -0,0 +1,3 @@ + + diff --git a/ui/src/lib/field-monitor/battery/BatteryWidget.svelte b/ui/src/lib/field-monitor/battery/BatteryWidget.svelte new file mode 100644 index 0000000..48f98c0 --- /dev/null +++ b/ui/src/lib/field-monitor/battery/BatteryWidget.svelte @@ -0,0 +1,8 @@ + + +
Battery: {JSON.stringify(props)}
diff --git a/ui/src/lib/field-monitor/battery/settings.ts b/ui/src/lib/field-monitor/battery/settings.ts new file mode 100644 index 0000000..069270b --- /dev/null +++ b/ui/src/lib/field-monitor/battery/settings.ts @@ -0,0 +1 @@ +export type BatteryWidgetSettings = {showGraph: boolean}; diff --git a/ui/src/lib/field-monitor/rio/RioWidget.svelte b/ui/src/lib/field-monitor/rio/RioWidget.svelte new file mode 100644 index 0000000..8599352 --- /dev/null +++ b/ui/src/lib/field-monitor/rio/RioWidget.svelte @@ -0,0 +1,8 @@ + + +
Rio: {JSON.stringify(props)}
diff --git a/ui/src/lib/field-monitor/rio/settings.ts b/ui/src/lib/field-monitor/rio/settings.ts new file mode 100644 index 0000000..d120b35 --- /dev/null +++ b/ui/src/lib/field-monitor/rio/settings.ts @@ -0,0 +1 @@ +export type RioWidgetSettings = {}; diff --git a/ui/src/lib/field-monitor/widget.ts b/ui/src/lib/field-monitor/widget.ts new file mode 100644 index 0000000..096426b --- /dev/null +++ b/ui/src/lib/field-monitor/widget.ts @@ -0,0 +1,18 @@ +import type { BatteryWidgetSettings } from './battery/settings'; +import type { RioWidgetSettings } from './rio/settings'; + +export enum WidgetID { + Battery = "Battery", + Rio = "Rio", +} + +type WidgetDescription = + | { id: WidgetID.Battery; settings: BatteryWidgetSettings } + | { id: WidgetID.Rio; settings: RioWidgetSettings }; + +type WidgetConfig = WidgetDescription[]; + +export const widget_config: WidgetConfig = [ + { id: WidgetID.Battery, settings: { showGraph: false } }, + { id: WidgetID.Rio, settings: {} }, +]; diff --git a/ui/src/routes/fieldMonitorTest/+page.svelte b/ui/src/routes/fieldMonitorTest/+page.svelte new file mode 100644 index 0000000..e5fe9ef --- /dev/null +++ b/ui/src/routes/fieldMonitorTest/+page.svelte @@ -0,0 +1,17 @@ + + + +{#each widget_config as widget, index (index)} + {#if widget.id == WidgetID.Battery} + + {:else if widget.id == WidgetID.Rio} + + {/if} +{/each} From fb842599c055864064af4f319007058b67cd3d33 Mon Sep 17 00:00:00 2001 From: Devyn Keeney Date: Tue, 5 Aug 2025 22:05:55 -0500 Subject: [PATCH 2/2] Add CSS grid and styling for modular field monitor --- ui/src/app.css | 6 ++++ .../field-monitor/MonitorItem.svelte | 3 -- ui/src/{routes => lib}/defaults.ts | 0 .../lib/field-monitor/BaseMonitorItem.svelte | 16 ++++++++++ ui/src/lib/field-monitor/MonitorHeader.svelte | 9 ++++++ ui/src/lib/field-monitor/MonitorRow.svelte | 30 +++++++++++++++++++ ui/src/lib/field-monitor/RowBlock.svelte | 19 ++++++++++++ .../battery/BatteryWidget.svelte | 9 +++--- ui/src/lib/field-monitor/battery/settings.ts | 2 +- ui/src/lib/field-monitor/rio/RioWidget.svelte | 9 +++--- ui/src/lib/field-monitor/widget.ts | 20 ++++++++----- ui/src/routes/+layout.svelte | 6 ++-- ui/src/routes/fieldMonitor/+page.svelte | 2 +- ui/src/routes/fieldMonitorTest/+page.svelte | 27 +++++++++-------- 14 files changed, 121 insertions(+), 37 deletions(-) delete mode 100644 ui/src/lib/components/field-monitor/MonitorItem.svelte rename ui/src/{routes => lib}/defaults.ts (100%) create mode 100644 ui/src/lib/field-monitor/BaseMonitorItem.svelte create mode 100644 ui/src/lib/field-monitor/MonitorHeader.svelte create mode 100644 ui/src/lib/field-monitor/MonitorRow.svelte create mode 100644 ui/src/lib/field-monitor/RowBlock.svelte diff --git a/ui/src/app.css b/ui/src/app.css index ef3b177..3ebeb30 100644 --- a/ui/src/app.css +++ b/ui/src/app.css @@ -47,6 +47,12 @@ html.dark { } } +.grid-rows-fieldmonitor { + grid-template-rows: max-content 1fr 1fr 1fr 1fr 1fr 1fr; +} + +@source inline("col-span-{2..10}"); + .fieldmonitor-square-height { height: calc((100vh - 8rem) / 6); } diff --git a/ui/src/lib/components/field-monitor/MonitorItem.svelte b/ui/src/lib/components/field-monitor/MonitorItem.svelte deleted file mode 100644 index f03c796..0000000 --- a/ui/src/lib/components/field-monitor/MonitorItem.svelte +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/ui/src/routes/defaults.ts b/ui/src/lib/defaults.ts similarity index 100% rename from ui/src/routes/defaults.ts rename to ui/src/lib/defaults.ts diff --git a/ui/src/lib/field-monitor/BaseMonitorItem.svelte b/ui/src/lib/field-monitor/BaseMonitorItem.svelte new file mode 100644 index 0000000..740fba5 --- /dev/null +++ b/ui/src/lib/field-monitor/BaseMonitorItem.svelte @@ -0,0 +1,16 @@ + + +
+

+ {@render children()} +

+
diff --git a/ui/src/lib/field-monitor/MonitorHeader.svelte b/ui/src/lib/field-monitor/MonitorHeader.svelte new file mode 100644 index 0000000..6711b0c --- /dev/null +++ b/ui/src/lib/field-monitor/MonitorHeader.svelte @@ -0,0 +1,9 @@ + + +
+
M: {matchNumber}
+
Match Status
+
On Time
+
diff --git a/ui/src/lib/field-monitor/MonitorRow.svelte b/ui/src/lib/field-monitor/MonitorRow.svelte new file mode 100644 index 0000000..987aaab --- /dev/null +++ b/ui/src/lib/field-monitor/MonitorRow.svelte @@ -0,0 +1,30 @@ + + +{data.teamNumber} +{#if data.isBypassed} + Bypassed +{:else} + {#each settings.widgets as widget, index (index)} + {#if widget.id == WidgetID.Battery} + + {:else if widget.id == WidgetID.Rio} + + {/if} + {/each} +{/if} diff --git a/ui/src/lib/field-monitor/RowBlock.svelte b/ui/src/lib/field-monitor/RowBlock.svelte new file mode 100644 index 0000000..e7ac4d9 --- /dev/null +++ b/ui/src/lib/field-monitor/RowBlock.svelte @@ -0,0 +1,19 @@ + + +
+

+ {@render children()} +

+
diff --git a/ui/src/lib/field-monitor/battery/BatteryWidget.svelte b/ui/src/lib/field-monitor/battery/BatteryWidget.svelte index 48f98c0..ffac32c 100644 --- a/ui/src/lib/field-monitor/battery/BatteryWidget.svelte +++ b/ui/src/lib/field-monitor/battery/BatteryWidget.svelte @@ -1,8 +1,9 @@ -
Battery: {JSON.stringify(props)}
+{data.battery} diff --git a/ui/src/lib/field-monitor/battery/settings.ts b/ui/src/lib/field-monitor/battery/settings.ts index 069270b..1e8229a 100644 --- a/ui/src/lib/field-monitor/battery/settings.ts +++ b/ui/src/lib/field-monitor/battery/settings.ts @@ -1 +1 @@ -export type BatteryWidgetSettings = {showGraph: boolean}; +export type BatteryWidgetSettings = { showGraph: boolean }; diff --git a/ui/src/lib/field-monitor/rio/RioWidget.svelte b/ui/src/lib/field-monitor/rio/RioWidget.svelte index 8599352..b0c5aea 100644 --- a/ui/src/lib/field-monitor/rio/RioWidget.svelte +++ b/ui/src/lib/field-monitor/rio/RioWidget.svelte @@ -1,8 +1,9 @@ -
Rio: {JSON.stringify(props)}
+{data.rioLink} diff --git a/ui/src/lib/field-monitor/widget.ts b/ui/src/lib/field-monitor/widget.ts index 096426b..a4ebbec 100644 --- a/ui/src/lib/field-monitor/widget.ts +++ b/ui/src/lib/field-monitor/widget.ts @@ -2,17 +2,21 @@ import type { BatteryWidgetSettings } from './battery/settings'; import type { RioWidgetSettings } from './rio/settings'; export enum WidgetID { - Battery = "Battery", - Rio = "Rio", + Battery = 'Battery', + Rio = 'Rio' } -type WidgetDescription = +export type WidgetDescription = | { id: WidgetID.Battery; settings: BatteryWidgetSettings } | { id: WidgetID.Rio; settings: RioWidgetSettings }; -type WidgetConfig = WidgetDescription[]; +export interface FieldMonitorConfig { + widgets: WidgetDescription[]; +} -export const widget_config: WidgetConfig = [ - { id: WidgetID.Battery, settings: { showGraph: false } }, - { id: WidgetID.Rio, settings: {} }, -]; +export const field_monitor_config: FieldMonitorConfig = { + widgets: [ + { id: WidgetID.Battery, settings: { showGraph: false } }, + { id: WidgetID.Rio, settings: {} } + ] +}; diff --git a/ui/src/routes/+layout.svelte b/ui/src/routes/+layout.svelte index ec9cbe2..6223d9e 100644 --- a/ui/src/routes/+layout.svelte +++ b/ui/src/routes/+layout.svelte @@ -57,7 +57,7 @@ -
+
-
-
+
+
{@render children()}
diff --git a/ui/src/routes/fieldMonitor/+page.svelte b/ui/src/routes/fieldMonitor/+page.svelte index 5abecae..f991d7e 100644 --- a/ui/src/routes/fieldMonitor/+page.svelte +++ b/ui/src/routes/fieldMonitor/+page.svelte @@ -9,7 +9,7 @@ Red1Default, Red2Default, Red3Default - } from '../defaults'; + } from '$lib/defaults'; import { settingsStore } from '$lib/settings-store'; let blue1: FieldMonitorData = Blue1Default; diff --git a/ui/src/routes/fieldMonitorTest/+page.svelte b/ui/src/routes/fieldMonitorTest/+page.svelte index e5fe9ef..c19aae2 100644 --- a/ui/src/routes/fieldMonitorTest/+page.svelte +++ b/ui/src/routes/fieldMonitorTest/+page.svelte @@ -1,17 +1,18 @@ + +
+
Team Number
+ {#each field_monitor_config.widgets as widget, index (index)} +
{widget.id}
+ {/each} -{#each widget_config as widget, index (index)} - {#if widget.id == WidgetID.Battery} - - {:else if widget.id == WidgetID.Rio} - - {/if} -{/each} + {#each { length: 6 }} + + {/each} +