diff --git a/docs/user_guide.md b/docs/user_guide.md index 1be0374..fb3a7da 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -25,6 +25,9 @@ peach-and-brown palette therefore continue behind and through the dialog views. names, locations, metrics, switch channels, forecast source, selected theme, and live values will vary by installation. +The dashboard header centers the Sensorius image between individual pill buttons for +the full-screen graph (left) and General Settings (right). + The dashboard presents: ### Interface Icons @@ -32,7 +35,7 @@ The dashboard presents: **Graph icon**—a blue line graph on horizontal and vertical axes—opens the full-screen **Sensorius Graphum** workspace. - Settings icon The - **Settings icon (gear)** beside **Sensorius AI** opens General Settings. + **Settings icon (gear)** to the right of the **Sensorius image** opens General Settings. Other gear icons open settings for the associated sensor or switch, or open the timer control for a Switch Tile. diff --git a/sensorius/__init__.py b/sensorius/__init__.py index fb5f775..6e44693 100644 --- a/sensorius/__init__.py +++ b/sensorius/__init__.py @@ -4,4 +4,4 @@ release notes, and supporting tooling can report a consistent build identity. """ -__version__ = "v0.26.251.8" +__version__ = "v0.26.251.13" diff --git a/sensorius/saiHtml.py b/sensorius/saiHtml.py index 7a700e5..e70d84b 100644 --- a/sensorius/saiHtml.py +++ b/sensorius/saiHtml.py @@ -1686,7 +1686,7 @@ def _status_color_hex(status: str) -> str: yield "
" yield "

" - yield "" + yield "" yield " " yield " Full Screen Graphs" yield " " @@ -1698,8 +1698,8 @@ def _status_color_hex(status: str) -> str: yield " fill='none' stroke='blue' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/>" yield " " yield "" - yield f" {APP_NAME_SHORT} " - yield "" + yield f"Sensorius AI" + yield "" yield from _settings_gear_svg_lines(indent=" ") yield "" yield "

" @@ -2371,7 +2371,7 @@ def _format_stat_value(stat_value): yield " const ts = document.getElementById('update_time');" yield " if (ts) {" yield " const formatted = now.toLocaleString('en-CA', { year:'numeric', month:'2-digit', day:'2-digit', hour:'2-digit', minute:'2-digit', second:'2-digit' }).replace(',', '');" - yield " const weekday = now.toLocaleDateString('en-CA', { weekday:'long' });" + yield " const weekday = now.toLocaleDateString('en-CA', { weekday:'short' });" yield " ts.textContent = `${weekday} ${formatted}`;" yield " }" yield " const biodynamicMinuteKey = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}`;" @@ -4360,9 +4360,8 @@ def _format_stat_value(stat_value): yield "" yield " const existingRow = document.querySelector('.sensor-row');" yield " const byGraphModal = document.getElementById('graphModal')?.parentElement || null;" - yield " const overviewFooter = document.getElementById('dashboard-overview-footer');" yield " const dashboard = document.querySelector('.dashboard');" - yield " const parent = (overviewFooter && overviewFooter.parentElement) || (existingRow && existingRow.parentElement) || dashboard || byGraphModal || document.body;" + yield " const parent = document.querySelector('.dashboard-content') || (existingRow && existingRow.parentElement) || dashboard || byGraphModal || document.body;" yield " const switchGroup = document.getElementById('group_switches');" yield "" @@ -4378,7 +4377,6 @@ def _format_stat_value(stat_value): yield " group.style.flex = '0 0 100%';" yield " group.style.display = 'block';" yield " if (switchGroup && switchGroup.parentElement === parent) parent.insertBefore(group, switchGroup);" - yield " else if (overviewFooter && overviewFooter.parentElement === parent) parent.insertBefore(group, overviewFooter);" yield " else parent.appendChild(group);" yield " }" yield "" @@ -6689,36 +6687,21 @@ def _format_stat_value(stat_value): yield " if (btn) btn.setAttribute('aria-expanded', 'false');" yield " });" yield "};" - yield "window.pinDashboardOverviewFooter = function(){" - yield " const overviewFooter = document.getElementById('dashboard-overview-footer');" - yield " if (!overviewFooter) return;" - yield " const sensorGroup = document.querySelector('.sensor-group[data-sensor-id]');" - yield " const dashboardContent = (sensorGroup && sensorGroup.parentElement) || overviewFooter.parentElement || document.querySelector('.dashboard-content');" - yield " if (!dashboardContent) return;" - yield " if (overviewFooter.parentElement !== dashboardContent || dashboardContent.lastElementChild !== overviewFooter) dashboardContent.appendChild(overviewFooter);" - yield "};" yield "window.applySensorGroupOrder = function(order){" yield " if (!Array.isArray(order) || !order.length) return;" - yield " const overviewFooter = document.getElementById('dashboard-overview-footer');" yield " const firstSensorGroup = document.querySelector('.sensor-group[data-sensor-id]');" - yield " const dashboardContent = (firstSensorGroup && firstSensorGroup.parentElement) || (overviewFooter && overviewFooter.parentElement) || document.querySelector('.dashboard-content');" + yield " const dashboardContent = (firstSensorGroup && firstSensorGroup.parentElement) || document.querySelector('.dashboard-content');" yield " if (!dashboardContent) return;" - yield " const insertBeforeFooter = (el) => {" - yield " if (!el) return;" - yield " if (overviewFooter && overviewFooter.parentElement === dashboardContent) dashboardContent.insertBefore(el, overviewFooter);" - yield " else dashboardContent.appendChild(el);" - yield " };" yield " const groups = new Map();" yield " dashboardContent.querySelectorAll('.sensor-group[data-sensor-id]').forEach((el) => {" yield " groups.set(el.getAttribute('data-sensor-id') || '', el);" yield " });" yield " order.forEach((sid) => {" yield " const el = groups.get(String(sid || ''));" - yield " if (el) insertBeforeFooter(el);" + yield " if (el) dashboardContent.appendChild(el);" yield " });" yield " const switchGroup = document.getElementById('group_switches');" - yield " if (switchGroup) insertBeforeFooter(switchGroup);" - yield " window.pinDashboardOverviewFooter();" + yield " if (switchGroup) dashboardContent.appendChild(switchGroup);" yield "};" yield "window.reorderSensorGroup = async function(sensorId, direction){" yield " const sid = String(sensorId || '').trim();" @@ -8172,9 +8155,6 @@ def _format_stat_value(stat_value): yield "" - yield "" yield "" yield "
" yield "