Fix Home and Phone settings states
This commit is contained in:
@@ -4,25 +4,38 @@ import qs.services
|
||||
|
||||
Item {
|
||||
id: root
|
||||
objectName: "home-phone-page"
|
||||
|
||||
property string lightQuery: searchInput.text.trim().toLowerCase()
|
||||
|
||||
readonly property var availableLights: HomeAssistant.catalog.filter(entity => {
|
||||
if (HomePreferences.isSelected(entity.id))
|
||||
if (HomeAssistant.selectedEntities.some(selected => selected.id === entity.id))
|
||||
return false;
|
||||
const haystack = (entity.sourceName + " " + entity.id).toLowerCase();
|
||||
return root.lightQuery === "" || haystack.includes(root.lightQuery);
|
||||
})
|
||||
readonly property string availableEmptyText: root.availableLights.length > 0
|
||||
? ""
|
||||
: (root.lightQuery !== ""
|
||||
? "No lights match that search"
|
||||
: (HomeAssistant.catalog.length === 0
|
||||
? "No lights discovered"
|
||||
: "All discovered lights are already selected"))
|
||||
readonly property var pageDiagnostics: ({
|
||||
availableLightIds: root.availableLights.map(entity => entity.id),
|
||||
availableEmptyText: root.availableEmptyText,
|
||||
homeStatus: root.homeStatus()
|
||||
})
|
||||
|
||||
function homeStatus(): string {
|
||||
if (HomeAssistant.phase === "ready")
|
||||
return `Connected · ${HomeAssistant.discoveredCount} lights discovered`;
|
||||
if (HomeAssistant.phase === "degraded")
|
||||
return "Last update unavailable · showing saved controls";
|
||||
if (HomeAssistant.lastError === "authentication-required")
|
||||
return "Authentication required";
|
||||
if (HomeAssistant.lastError === "not-configured")
|
||||
return "Home Assistant is not configured";
|
||||
if (HomeAssistant.phase === "ready")
|
||||
return `Connected · ${HomeAssistant.discoveredCount} lights discovered`;
|
||||
if (HomeAssistant.phase === "degraded")
|
||||
return "Last update unavailable · showing saved controls";
|
||||
if (HomeAssistant.phase === "loading")
|
||||
return "Connecting to Home Assistant";
|
||||
return "Home Assistant is unavailable";
|
||||
@@ -250,9 +263,7 @@ Item {
|
||||
Text {
|
||||
width: parent.width
|
||||
visible: root.availableLights.length === 0
|
||||
text: root.lightQuery === "" && HomeAssistant.catalog.length > 0
|
||||
? "All discovered lights are already selected"
|
||||
: "No lights match that search"
|
||||
text: root.availableEmptyText
|
||||
color: Theme.fgDim
|
||||
font.family: Theme.fontFamily
|
||||
font.pixelSize: Theme.fontSize
|
||||
|
||||
@@ -6,6 +6,11 @@ Rectangle {
|
||||
id: root
|
||||
|
||||
property var hostWindow: null
|
||||
readonly property var homePhoneDiagnostics: pageLoader.status === Loader.Ready
|
||||
&& pageLoader.item
|
||||
&& pageLoader.item.objectName === "home-phone-page"
|
||||
? pageLoader.item.pageDiagnostics
|
||||
: ({})
|
||||
|
||||
color: Theme.bg
|
||||
radius: 18
|
||||
|
||||
@@ -6,6 +6,8 @@ import qs.services
|
||||
FloatingWindow {
|
||||
id: root
|
||||
|
||||
readonly property var homePhoneDiagnostics: settingsShell.homePhoneDiagnostics
|
||||
|
||||
title: "Panama Settings"
|
||||
visible: ShellState.settingsOpen
|
||||
implicitWidth: 1120
|
||||
@@ -23,6 +25,7 @@ FloatingWindow {
|
||||
}
|
||||
|
||||
SettingsShell {
|
||||
id: settingsShell
|
||||
anchors.fill: parent
|
||||
hostWindow: root
|
||||
}
|
||||
|
||||
@@ -434,7 +434,8 @@ Singleton {
|
||||
}
|
||||
|
||||
function applyFixture(name: string): void {
|
||||
if (["ready", "stale", "unavailable", "missing-selected", "action-error",
|
||||
if (["ready", "available-extra", "stale", "stale-authentication", "stale-not-configured",
|
||||
"unavailable", "missing-selected", "action-error",
|
||||
"process-actions", "process-no-output", "process-delayed-exit",
|
||||
"process-slow-actions"].indexOf(name) < 0)
|
||||
return;
|
||||
@@ -488,15 +489,31 @@ Singleton {
|
||||
|
||||
root.catalog = root.fixtureEntities();
|
||||
root.fixtureFavorites = root.fixturePreferenceRecords();
|
||||
if (name === "available-extra") {
|
||||
root.catalog = root.catalog.concat([{
|
||||
id: "light.fixture_guest",
|
||||
sourceName: "Guest lamp",
|
||||
state: "off",
|
||||
available: true,
|
||||
active: false,
|
||||
dimmable: true,
|
||||
brightnessPct: 0
|
||||
}]);
|
||||
}
|
||||
if (name === "missing-selected") {
|
||||
root.fixtureFavorites = root.fixtureFavorites.concat([
|
||||
{ id: "light.fixture_missing", alias: "Porch" }
|
||||
]);
|
||||
}
|
||||
root.rebuildSelection();
|
||||
root.phase = name === "stale" ? "degraded" : "ready";
|
||||
root.stale = name === "stale";
|
||||
root.lastError = name === "stale" ? "unreachable" : "";
|
||||
const isStale = ["stale", "stale-authentication", "stale-not-configured"].indexOf(name) >= 0;
|
||||
root.phase = isStale ? "degraded" : "ready";
|
||||
root.stale = isStale;
|
||||
root.lastError = name === "stale-authentication"
|
||||
? "authentication-required"
|
||||
: (name === "stale-not-configured"
|
||||
? "not-configured"
|
||||
: (name === "stale" ? "unreachable" : ""));
|
||||
if (name === "action-error") {
|
||||
root.entityErrors = {
|
||||
"light.fixture_kitchen": "request-failed"
|
||||
|
||||
@@ -85,7 +85,7 @@ ShellRoot {
|
||||
IntelligenceResult {}
|
||||
ActivityPanel {}
|
||||
PowerMenu {}
|
||||
SettingsWindow {}
|
||||
SettingsWindow { id: settingsWindow }
|
||||
|
||||
// Toasts are their own always-on layer; they must be able to appear
|
||||
// without any overlay being open.
|
||||
@@ -295,7 +295,8 @@ ShellRoot {
|
||||
open: ShellState.settingsOpen,
|
||||
page: ShellState.settingsPage,
|
||||
discoveredCount: HomeAssistant.discoveredCount,
|
||||
selectedCount: HomeAssistant.configuredCount
|
||||
selectedCount: HomeAssistant.configuredCount,
|
||||
homePhone: settingsWindow.homePhoneDiagnostics
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user