Change logic for the new version handling (#7405)

This commit is contained in:
Joakim Sørensen 2020-10-21 12:40:06 +02:00 committed by GitHub
parent 0fcf0dcd18
commit 01b9a07320
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 152 additions and 140 deletions

View File

@ -23,9 +23,9 @@ import { hassioStyle } from "../resources/hassio-style";
class HassioAddonRepositoryEl extends LitElement { class HassioAddonRepositoryEl extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@property() public repo!: HassioAddonRepository; @property({ attribute: false }) public repo!: HassioAddonRepository;
@property() public addons!: HassioAddonInfo[]; @property({ attribute: false }) public addons!: HassioAddonInfo[];
@property() public filter!: string; @property() public filter!: string;
@ -78,18 +78,18 @@ class HassioAddonRepositoryEl extends LitElement {
.title=${addon.name} .title=${addon.name}
.description=${addon.description} .description=${addon.description}
.available=${addon.available} .available=${addon.available}
.icon=${addon.installed && addon.installed !== addon.version .icon=${addon.installed && addon.update_available
? mdiArrowUpBoldCircle ? mdiArrowUpBoldCircle
: mdiPuzzle} : mdiPuzzle}
.iconTitle=${addon.installed .iconTitle=${addon.installed
? addon.installed !== addon.version ? addon.update_available
? "New version available" ? "New version available"
: "Add-on is installed" : "Add-on is installed"
: addon.available : addon.available
? "Add-on is not installed" ? "Add-on is not installed"
: "Add-on is not available on your system"} : "Add-on is not available on your system"}
.iconClass=${addon.installed .iconClass=${addon.installed
? addon.installed !== addon.version ? addon.update_available
? "update" ? "update"
: "installed" : "installed"
: !addon.available : !addon.available
@ -104,7 +104,7 @@ class HassioAddonRepositoryEl extends LitElement {
: undefined} : undefined}
.showTopbar=${addon.installed || !addon.available} .showTopbar=${addon.installed || !addon.available}
.topbarClass=${addon.installed .topbarClass=${addon.installed
? addon.installed !== addon.version ? addon.update_available
? "update" ? "update"
: "installed" : "installed"
: !addon.available : !addon.available

View File

@ -135,7 +135,7 @@ class HassioAddonInfo extends LitElement {
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`
${this._computeUpdateAvailable ${this.addon.update_available
? html` ? html`
<ha-card header="Update available! 🎉"> <ha-card header="Update available! 🎉">
<div class="card-content"> <div class="card-content">
@ -609,15 +609,6 @@ class HassioAddonInfo extends LitElement {
return this.addon?.state === "started"; return this.addon?.state === "started";
} }
private get _computeUpdateAvailable(): boolean | "" {
return (
this.addon &&
!this.addon.detached &&
this.addon.version &&
this.addon.version !== this.addon.version_latest
);
}
private get _pathWebui(): string | null { private get _pathWebui(): string | null {
return ( return (
this.addon.webui && this.addon.webui &&

View File

@ -50,7 +50,7 @@ class HassioCardContent extends LitElement {
` `
: html` : html`
<ha-svg-icon <ha-svg-icon
class=${this.iconClass} class=${this.iconClass!}
.path=${this.icon} .path=${this.icon}
.title=${this.iconTitle} .title=${this.iconTitle}
></ha-svg-icon> ></ha-svg-icon>

View File

@ -52,22 +52,21 @@ class HassioAddons extends LitElement {
.title=${addon.name} .title=${addon.name}
.description=${addon.description} .description=${addon.description}
available available
.showTopbar=${addon.installed !== addon.version} .showTopbar=${addon.update_available}
topbarClass="update" topbarClass="update"
.icon=${addon.installed !== addon.version .icon=${addon.update_available!
? mdiArrowUpBoldCircle ? mdiArrowUpBoldCircle
: mdiPuzzle} : mdiPuzzle}
.iconTitle=${addon.state !== "started" .iconTitle=${addon.state !== "started"
? "Add-on is stopped" ? "Add-on is stopped"
: addon.installed !== addon.version : addon.update_available!
? "New version available" ? "New version available"
: "Add-on is running"} : "Add-on is running"}
.iconClass=${addon.installed && .iconClass=${addon.update_available
addon.installed !== addon.version
? addon.state === "started" ? addon.state === "started"
? "update" ? "update"
: "update stopped" : "update stopped"
: addon.installed && addon.state === "started" : addon.state === "started"
? "running" ? "running"
: "stopped"} : "stopped"}
.iconImage=${atLeastVersion( .iconImage=${atLeastVersion(

View File

@ -5,11 +5,11 @@ import {
CSSResult, CSSResult,
customElement, customElement,
html, html,
internalProperty,
LitElement, LitElement,
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import memoizeOne from "memoize-one";
import "../../../src/components/buttons/ha-progress-button"; import "../../../src/components/buttons/ha-progress-button";
import "../../../src/components/ha-card"; import "../../../src/components/ha-card";
import "../../../src/components/ha-svg-icon"; import "../../../src/components/ha-svg-icon";
@ -35,29 +35,30 @@ import { hassioStyle } from "../resources/hassio-style";
export class HassioUpdate extends LitElement { export class HassioUpdate extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public hassInfo: HassioHomeAssistantInfo; @property({ attribute: false }) public hassInfo?: HassioHomeAssistantInfo;
@property({ attribute: false }) public hassOsInfo?: HassioHassOSInfo; @property({ attribute: false }) public hassOsInfo?: HassioHassOSInfo;
@property() public supervisorInfo: HassioSupervisorInfo; @property({ attribute: false }) public supervisorInfo?: HassioSupervisorInfo;
@internalProperty() private _error?: string; private _pendingUpdates = memoizeOne(
(
core?: HassioHomeAssistantInfo,
supervisor?: HassioSupervisorInfo,
os?: HassioHassOSInfo
): number => {
return [core, supervisor, os].filter(
(value) => !!value && value?.update_available
).length;
}
);
protected render(): TemplateResult { protected render(): TemplateResult {
const updatesAvailable: number = [ const updatesAvailable = this._pendingUpdates(
this.hassInfo, this.hassInfo,
this.supervisorInfo, this.supervisorInfo,
this.hassOsInfo, this.hassOsInfo
].filter((value) => { );
return (
!!value &&
(value.version_latest
? value.version !== value.version_latest
: value.version_latest
? value.version !== value.version_latest
: false)
);
}).length;
if (!updatesAvailable) { if (!updatesAvailable) {
return html``; return html``;
@ -65,9 +66,6 @@ export class HassioUpdate extends LitElement {
return html` return html`
<div class="content"> <div class="content">
${this._error
? html` <div class="error">Error: ${this._error}</div> `
: ""}
<h1> <h1>
${updatesAvailable > 1 ${updatesAvailable > 1
? "Updates Available 🎉" ? "Updates Available 🎉"
@ -76,26 +74,24 @@ export class HassioUpdate extends LitElement {
<div class="card-group"> <div class="card-group">
${this._renderUpdateCard( ${this._renderUpdateCard(
"Home Assistant Core", "Home Assistant Core",
this.hassInfo.version, this.hassInfo!,
this.hassInfo.version_latest,
"hassio/homeassistant/update", "hassio/homeassistant/update",
`https://${ `https://${
this.hassInfo.version_latest.includes("b") ? "rc" : "www" this.hassInfo?.version_latest.includes("b") ? "rc" : "www"
}.home-assistant.io/latest-release-notes/`, }.home-assistant.io/latest-release-notes/`
mdiHomeAssistant
)} )}
${this._renderUpdateCard( ${this._renderUpdateCard(
"Supervisor", "Supervisor",
this.supervisorInfo.version, this.supervisorInfo!,
this.supervisorInfo.version_latest,
"hassio/supervisor/update", "hassio/supervisor/update",
`https://github.com//home-assistant/hassio/releases/tag/${this.supervisorInfo.version_latest}` `https://github.com//home-assistant/hassio/releases/tag/${
this.supervisorInfo!.version_latest
}`
)} )}
${this.hassOsInfo ${this.hassOsInfo
? this._renderUpdateCard( ? this._renderUpdateCard(
"Operating System", "Operating System",
this.hassOsInfo.version, this.hassOsInfo,
this.hassOsInfo.version_latest,
"hassio/os/update", "hassio/os/update",
`https://github.com//home-assistant/hassos/releases/tag/${this.hassOsInfo.version_latest}` `https://github.com//home-assistant/hassos/releases/tag/${this.hassOsInfo.version_latest}`
) )
@ -107,28 +103,22 @@ export class HassioUpdate extends LitElement {
private _renderUpdateCard( private _renderUpdateCard(
name: string, name: string,
curVersion: string, object: HassioHomeAssistantInfo | HassioSupervisorInfo | HassioHassOSInfo,
lastVersion: string,
apiPath: string, apiPath: string,
releaseNotesUrl: string, releaseNotesUrl: string
icon?: string
): TemplateResult { ): TemplateResult {
if (!lastVersion || lastVersion === curVersion) { if (!object.update_available) {
return html``; return html``;
} }
return html` return html`
<ha-card> <ha-card>
<div class="card-content"> <div class="card-content">
${icon <div class="icon">
? html` <ha-svg-icon .path=${mdiHomeAssistant}></ha-svg-icon>
<div class="icon"> </div>
<ha-svg-icon .path=${icon}></ha-svg-icon> <div class="update-heading">${name} ${object.version_latest}</div>
</div>
`
: ""}
<div class="update-heading">${name} ${lastVersion}</div>
<div class="warning"> <div class="warning">
You are currently running version ${curVersion} You are currently running version ${object.version}
</div> </div>
</div> </div>
<div class="card-actions"> <div class="card-actions">
@ -138,7 +128,7 @@ export class HassioUpdate extends LitElement {
<ha-progress-button <ha-progress-button
.apiPath=${apiPath} .apiPath=${apiPath}
.name=${name} .name=${name}
.version=${lastVersion} .version=${object.version_latest}
@click=${this._confirmUpdate} @click=${this._confirmUpdate}
> >
Update Update

View File

@ -25,13 +25,13 @@ class HassioPanelRouter extends HassRouterPage {
@property({ type: Boolean }) public narrow!: boolean; @property({ type: Boolean }) public narrow!: boolean;
@property({ attribute: false }) public supervisorInfo: HassioSupervisorInfo; @property({ attribute: false }) public supervisorInfo?: HassioSupervisorInfo;
@property({ attribute: false }) public hassioInfo!: HassioInfo; @property({ attribute: false }) public hassioInfo!: HassioInfo;
@property({ attribute: false }) public hostInfo: HassioHostInfo; @property({ attribute: false }) public hostInfo: HassioHostInfo;
@property({ attribute: false }) public hassInfo: HassioHomeAssistantInfo; @property({ attribute: false }) public hassInfo?: HassioHomeAssistantInfo;
@property({ attribute: false }) public hassOsInfo!: HassioHassOSInfo; @property({ attribute: false }) public hassOsInfo!: HassioHassOSInfo;

View File

@ -66,7 +66,7 @@ class HassioRouter extends HassRouterPage {
}, },
}; };
@internalProperty() private _supervisorInfo: HassioSupervisorInfo; @internalProperty() private _supervisorInfo?: HassioSupervisorInfo;
@internalProperty() private _hostInfo: HassioHostInfo; @internalProperty() private _hostInfo: HassioHostInfo;
@ -74,7 +74,7 @@ class HassioRouter extends HassRouterPage {
@internalProperty() private _hassOsInfo?: HassioHassOSInfo; @internalProperty() private _hassOsInfo?: HassioHassOSInfo;
@internalProperty() private _hassInfo: HassioHomeAssistantInfo; @internalProperty() private _hassInfo?: HassioHomeAssistantInfo;
protected firstUpdated(changedProps: PropertyValues) { protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps); super.firstUpdated(changedProps);

View File

@ -108,8 +108,8 @@ class HassioHostInfo extends LitElement {
<span slot="description"> <span slot="description">
${this.hostInfo.operating_system} ${this.hostInfo.operating_system}
</span> </span>
${this.hostInfo.version !== this.hostInfo.version_latest && ${this.hostInfo.features.includes("hassos") &&
this.hostInfo.features.includes("hassos") this.hostInfo.update_available
? html` ? html`
<ha-progress-button <ha-progress-button
title="Update the host OS" title="Update the host OS"

View File

@ -62,7 +62,8 @@ const ISSUES = {
class HassioSupervisorInfo extends LitElement { class HassioSupervisorInfo extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@property() public supervisorInfo!: HassioSupervisorInfoType; @property({ attribute: false })
public supervisorInfo!: HassioSupervisorInfoType;
@property() public hostInfo!: HassioHostInfoType; @property() public hostInfo!: HassioHostInfoType;
@ -85,7 +86,7 @@ class HassioSupervisorInfo extends LitElement {
<span slot="description"> <span slot="description">
${this.supervisorInfo.version_latest} ${this.supervisorInfo.version_latest}
</span> </span>
${this.supervisorInfo.version !== this.supervisorInfo.version_latest ${this.supervisorInfo.update_available
? html` ? html`
<ha-progress-button <ha-progress-button
title="Update the supervisor" title="Update the supervisor"

View File

@ -2,78 +2,71 @@ import { HomeAssistant } from "../../types";
import { hassioApiResultExtractor, HassioResponse } from "./common"; import { hassioApiResultExtractor, HassioResponse } from "./common";
export interface HassioAddonInfo { export interface HassioAddonInfo {
name: string; advanced: boolean;
slug: string;
description: string;
repository: "core" | "local" | string;
version: string;
state: "none" | "started" | "stopped";
installed: string | undefined;
detached: boolean;
available: boolean; available: boolean;
build: boolean; build: boolean;
advanced: boolean; description: string;
url: string | null; detached: boolean;
icon: boolean; icon: boolean;
installed: boolean;
logo: boolean; logo: boolean;
name: string;
repository: "core" | "local" | string;
slug: string;
stage: "stable" | "experimental" | "deprecated";
state: "started" | "stopped" | null;
update_available: boolean;
url: string | null;
version_latest: string;
version: string;
} }
export interface HassioAddonDetails extends HassioAddonInfo { export interface HassioAddonDetails extends HassioAddonInfo {
name: string;
slug: string;
description: string;
long_description: null | string;
auto_update: boolean;
url: null | string;
detached: boolean;
documentation: boolean;
available: boolean;
arch: "armhf" | "aarch64" | "i386" | "amd64";
machine: any;
homeassistant: string;
version_latest: string;
boot: "auto" | "manual";
build: boolean;
options: Record<string, unknown>;
network: null | Record<string, number>;
network_description: null | Record<string, string>;
host_network: boolean;
host_pid: boolean;
host_ipc: boolean;
host_dbus: boolean;
privileged: any;
apparmor: "disable" | "default" | "profile"; apparmor: "disable" | "default" | "profile";
devices: string[]; arch: "armhf" | "aarch64" | "i386" | "amd64";
auto_uart: boolean;
icon: boolean;
logo: boolean;
stage: "stable" | "experimental" | "deprecated";
changelog: boolean;
hassio_api: boolean;
hassio_role: "default" | "homeassistant" | "manager" | "admin";
startup: "initialize" | "system" | "services" | "application" | "once";
homeassistant_api: boolean;
auth_api: boolean;
full_access: boolean;
protected: boolean;
rating: "1-6";
stdin: boolean;
webui: null | string;
gpio: boolean;
kernel_modules: boolean;
devicetree: boolean;
docker_api: boolean;
audio: boolean;
audio_input: null | string; audio_input: null | string;
audio_output: null | string; audio_output: null | string;
services_role: string[]; audio: boolean;
auth_api: boolean;
auto_uart: boolean;
auto_update: boolean;
boot: "auto" | "manual";
changelog: boolean;
devices: string[];
devicetree: boolean;
discovery: string[]; discovery: string[];
ip_address: string; docker_api: boolean;
ingress: boolean; documentation: boolean;
ingress_panel: boolean; full_access: boolean;
gpio: boolean;
hassio_api: boolean;
hassio_role: "default" | "homeassistant" | "manager" | "admin";
homeassistant_api: boolean;
homeassistant: string;
host_dbus: boolean;
host_ipc: boolean;
host_network: boolean;
host_pid: boolean;
ingress_entry: null | string; ingress_entry: null | string;
ingress_panel: boolean;
ingress_url: null | string; ingress_url: null | string;
ingress: boolean;
ip_address: string;
kernel_modules: boolean;
long_description: null | string;
machine: any;
network_description: null | Record<string, string>;
network: null | Record<string, number>;
options: Record<string, unknown>;
privileged: any;
protected: boolean;
rating: "1-6";
services_role: string[];
slug: string;
startup: "initialize" | "system" | "services" | "application" | "once";
stdin: boolean;
watchdog: null | boolean; watchdog: null | boolean;
webui: null | string;
} }
export interface HassioAddonsInfo { export interface HassioAddonsInfo {

View File

@ -4,11 +4,12 @@ import { hassioApiResultExtractor, HassioResponse } from "./common";
export type HassioHostInfo = any; export type HassioHostInfo = any;
export interface HassioHassOSInfo { export interface HassioHassOSInfo {
version: string; board: "ova" | "rpi";
update_available: boolean;
version_cli_latest: string;
version_cli: string; version_cli: string;
version_latest: string; version_latest: string;
version_cli_latest: string; version: string;
board: "ova" | "rpi";
} }
export const fetchHassioHostInfo = async (hass: HomeAssistant) => { export const fetchHassioHostInfo = async (hass: HomeAssistant) => {

View File

@ -1,19 +1,56 @@
import { HomeAssistant, PanelInfo } from "../../types"; import { HomeAssistant, PanelInfo } from "../../types";
import { HassioAddonInfo, HassioAddonRepository } from "./addon";
import { hassioApiResultExtractor, HassioResponse } from "./common"; import { hassioApiResultExtractor, HassioResponse } from "./common";
export type HassioHomeAssistantInfo = any; export type HassioHomeAssistantInfo = {
export type HassioSupervisorInfo = any; arch: string;
audio_input: string | null;
audio_output: string | null;
boot: boolean;
image: string;
ip_address: string;
machine: string;
port: number;
ssl: boolean;
update_available: boolean;
version_latest: string;
version: string;
wait_boot: number;
watchdog: boolean;
};
export type HassioSupervisorInfo = {
addons: HassioAddonInfo[];
addons_repositories: HassioAddonRepository[];
arch: string;
channel: string;
debug: boolean;
debug_block: boolean;
diagnostics: boolean | null;
healthy: boolean;
ip_address: string;
logging: string;
supported: boolean;
timezone: string;
update_available: boolean;
version: string;
version_latest: string;
wait_boot: number;
};
export type HassioInfo = { export type HassioInfo = {
arch: string; arch: string;
channel: string; channel: string;
docker: string; docker: string;
hassos?: string; features: string[];
hassos: null;
homeassistant: string; homeassistant: string;
hostname: string; hostname: string;
logging: string; logging: string;
maching: string; machine: string;
operating_system: string;
supervisor: string; supervisor: string;
supported: boolean;
supported_arch: string[]; supported_arch: string[];
timezone: string; timezone: string;
}; };