Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
820ea64
Improve cross-platform compatibility by making BLE and GPIO Linux-onl…
DXCanas Jan 30, 2026
098e7af
Reset manager opening task on BLE module load failure to allow retry …
DXCanas Feb 19, 2026
ece78ab
Add simulateWithoutHardware configuration option
DXCanas Feb 20, 2026
40d7f52
Refactor BleManager to use dynamic module loading and guard clauses
DXCanas Feb 20, 2026
cd82439
Refactor GpioTimerService to gracefully handle module load failures
DXCanas Feb 20, 2026
2776b55
Enhance hardware checks to explicitly verify OS and RPi model
DXCanas Feb 20, 2026
0359730
Refactor GPIO hardware checks to handle pigpio C-library initializati…
DXCanas Feb 20, 2026
b813c59
Restore strict typing for BleManager lazy-loaded modules using inline…
DXCanas Feb 20, 2026
266c27f
Switching to `@import` tags from older dynamic import syntax.
DXCanas Feb 20, 2026
1d0ba44
Revert "Switching to `@import` tags from older dynamic import syntax."
DXCanas Feb 20, 2026
07d756a
Refactor: Move slot positioning styles from DashboardMetric to Batter…
DXCanas Mar 1, 2026
a090ace
Add MetricSelectorDialog component skeleton.
DXCanas Mar 1, 2026
39fbbdd
Import MetricSelectorDialog in DashboardToolbar.
DXCanas Mar 1, 2026
206e852
Add retile mode toggle button to DashboardToolbar.
DXCanas Mar 1, 2026
5932210
Add retile mode state management to PerformanceDashboard.
DXCanas Mar 1, 2026
25a73a5
Add retile controls: Remove buttons and Add tile.
DXCanas Mar 1, 2026
e12f9a6
Add Replace button to retile controls.
DXCanas Mar 1, 2026
90c3dc3
Add Reset to Default button in retile mode.
DXCanas Mar 1, 2026
758ab92
Implement reset-to-default functionality in retile mode.
DXCanas Mar 1, 2026
834e4d5
Clean up SettingsDialog: Remove tile selection UI.
DXCanas Mar 1, 2026
5b2fff3
Add gridConfig to app state with landscape/portrait defaults.
DXCanas Mar 1, 2026
f2a552c
Update PerformanceDashboard to use gridConfig for layout.
DXCanas Mar 1, 2026
a35b7b7
Add grid configuration UI to SettingsDialog.
DXCanas Mar 1, 2026
10a4992
Replace Add tile button with inline radio buttons.
DXCanas Mar 1, 2026
32a833b
Replace Replace button with select dropdown.
DXCanas Mar 1, 2026
ad2d061
Remove dialog usage from PerformanceDashboard.
DXCanas Mar 1, 2026
518488b
Delete MetricSelectorDialog.js.
DXCanas Mar 1, 2026
41d19bd
Refactor: Use APP_STATE for default dashboard metrics.
DXCanas Mar 1, 2026
38c2d99
Refactor Settings dialog and move retile controls to slots.
DXCanas Mar 1, 2026
a52c5aa
Remove grid row configurations.
DXCanas Mar 1, 2026
f3e6f98
Add slot to Force Curve title for Quick Edit controls.
DXCanas Mar 1, 2026
2fde38b
Ensure dashboard grid rows are of equal height.
DXCanas Mar 1, 2026
9b1ef7f
Move slot to label div in DashboardMetric.
DXCanas Mar 1, 2026
fcb8008
Revert "Remove grid row configurations."
DXCanas Mar 1, 2026
eddd322
Enhance retile mode controls and limit grid tiles.
DXCanas Mar 1, 2026
203056c
Show grid layout settings only for current orientation.
DXCanas Mar 1, 2026
d4b7dc1
Remove unused retile-mode CSS class from metrics grid.
DXCanas Mar 1, 2026
74e5699
Fix TypeError when accessing grid layout settings.
DXCanas Mar 1, 2026
0a5f3d2
Fix TypeError when accessing grid layout settings.
DXCanas Mar 2, 2026
cee750b
Convert grid layout settings to use range sliders.
DXCanas Mar 2, 2026
ff7886f
Refactor retile controls and add-tile functionality.
DXCanas Mar 2, 2026
166e4c5
Update retile mode button text to Submit.
DXCanas Mar 2, 2026
5f23d52
Refactor local metrics trimming logic to use willUpdate lifecycle met…
DXCanas Mar 2, 2026
dae1ba3
Auto-trim dashboard metrics when resizing grid via settings.
DXCanas Mar 2, 2026
f02ab6f
Revert add-tile template and update grid config layout.
DXCanas Mar 2, 2026
d9dc018
Remove inline styles and consolidate grid config logic.
DXCanas Mar 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/client/components/BatteryIcon.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ import { customElement, property } from 'lit/decorators.js'
@customElement('battery-icon')
export class DashboardMetric extends AppElement {
static styles = css`
:host {
right: 0.2em;
bottom: 0;
position: absolute;
}

.icon {
height: 1.2em;
}
Expand Down
11 changes: 10 additions & 1 deletion app/client/components/DashboardForceCurve.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ export class DashboardForceCurve extends AppElement {
position: relative;
}

:host {
grid-column: span 2;
}

.title {
position: absolute;
top: 0;
Expand Down Expand Up @@ -181,7 +185,12 @@ export class DashboardForceCurve extends AppElement {
<!== Only show label if no chart -->
${this._chart?.data.datasets[0].data.length ?
'' :
html`<div class="title"> Force Curve </div>`
html`
<div class="title">
Force Curve
<slot></slot>
</div>
`
}
<canvas @click="${this._handleClick}" id="chart"></canvas>
`
Expand Down
21 changes: 11 additions & 10 deletions app/client/components/DashboardMetric.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,12 @@ export class DashboardMetric extends AppElement {
font-size: 150%;
}

.metric-unit {
font-size: 80%;
.metric-value.with-icon {
font-size: 200%;
}

::slotted(*) {
right: 0.2em;
bottom: 0;
position: absolute;
.metric-unit {
font-size: 80%;
}
`

Expand All @@ -44,15 +42,18 @@ export class DashboardMetric extends AppElement {
accessor value

render () {
const hasIcon = this.icon !== ''
return html`
<div class="${this.icon === '' ? '' : 'label'}">
<div class=${this.icon === '' ? '' : 'icon'}>${this.icon}</div>
<div class="${hasIcon ? 'icon' : 'label'}">
${this.icon}
<slot></slot>
</div>
<div class="content">
<span class="metric-value" style="${this.icon === '' ? 'font-size: 200%;' : ''}">${this.value !== undefined ? this.value : '--'}</span>
<span class="metric-value ${hasIcon ? 'with-icon' : ''}">
${this.value !== undefined ? this.value : '--'}
</span>
<span class="metric-unit">${this.unit}</span>
</div>
<slot></slot>
`
}
}
42 changes: 38 additions & 4 deletions app/client/components/DashboardToolbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import { AppElement, html, css } from './AppElement.js'
import { customElement, property, state } from 'lit/decorators.js'
import { iconSettings, iconUndo, iconExpand, iconCompress, iconPoweroff, iconBluetooth, iconUpload, iconHeartbeat, iconAntplus } from '../lib/icons.js'
import './SettingsDialog.js'
import './AppDialog.js'

@customElement('dashboard-toolbar')
Expand Down Expand Up @@ -51,6 +50,11 @@ export class DashboardToolbar extends AppElement {
filter: brightness(150%);
}

button.active {
background: var(--theme-accent-color, #4a9eff);
filter: brightness(120%);
}

button .text {
position: absolute;
left: 2px;
Expand Down Expand Up @@ -91,12 +95,25 @@ export class DashboardToolbar extends AppElement {
@state()
accessor _dialog

@state()
accessor _retileMode = false

render () {
return html`
<div class="button-group">
<button @click=${this.openSettings} title="Settings">
${iconSettings}
</button>
<button @click=${this.toggleRetileMode} title="Retile Dashboard" class="${this._retileMode ? 'active' : ''}">
${this._retileMode ? 'Submit' : 'Retile'}
</button>
${this._retileMode
? html`
<button @click=${this.resetToDefault} title="Reset to Default">
Reset
</button>
`
: ''}
<button @click=${this.reset} title="Reset">
${iconUndo}
</button>
Expand Down Expand Up @@ -179,9 +196,10 @@ export class DashboardToolbar extends AppElement {
}

openSettings () {
this._dialog = html`<settings-dialog .config=${this.config.guiConfigs} @close=${() => {
this._dialog = undefined
}}></settings-dialog>`
this.dispatchEvent(new CustomEvent('open-settings', {
bubbles: true,
composed: true
}))
}

toggleFullscreen () {
Expand All @@ -195,6 +213,22 @@ export class DashboardToolbar extends AppElement {
}
}

toggleRetileMode () {
this._retileMode = !this._retileMode
this.dispatchEvent(new CustomEvent('retile-mode-changed', {
bubbles: true,
composed: true,
detail: { active: this._retileMode }
}))
}

resetToDefault () {
this.dispatchEvent(new CustomEvent('reset-layout-to-default', {
bubbles: true,
composed: true
}))
}

reset () {
this.sendEvent('triggerAction', { command: 'reset' })
}
Expand Down
Loading