diff --git a/hassio/src/backups/hassio-backups.ts b/hassio/src/backups/hassio-backups.ts
index c089d395bf..af8cbf170b 100644
--- a/hassio/src/backups/hassio-backups.ts
+++ b/hassio/src/backups/hassio-backups.ts
@@ -374,6 +374,9 @@ export class HassioBackups extends LitElement {
haStyle,
hassioStyle,
css`
+ :host {
+ color: var(--primary-text-color);
+ }
.table-header {
display: flex;
justify-content: space-between;
diff --git a/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts b/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts
index 9d616d68c3..e2769703f6 100644
--- a/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts
+++ b/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts
@@ -120,9 +120,6 @@ class HassioRepositoriesDialog extends LitElement {
`
)
- : html` No repositories `}
+ : html`${this._dialogParams!.supervisor.localize(
+ "dialog.repositories.no_repositories"
+ )}`}
+ hass.callApiRaw(
+ "GET",
+ `hassio/${provider.includes("_") ? `addons/${provider}` : provider}/logs/follow?lines=${lines}`,
+ undefined,
+ undefined,
+ signal
+ );
+
+export const fetchHassioLogsBootFollow = async (
hass: HomeAssistant,
provider: string,
signal: AbortSignal,
@@ -222,7 +236,12 @@ export const getHassioLogDownloadUrl = (provider: string) =>
provider.includes("_") ? `addons/${provider}` : provider
}/logs`;
-export const getHassioLogDownloadLinesUrl = (
+export const getHassioLogDownloadLinesUrl = (provider: string, lines: number) =>
+ `/api/hassio/${
+ provider.includes("_") ? `addons/${provider}` : provider
+ }/logs?lines=${lines}`;
+
+export const getHassioLogBootDownloadLinesUrl = (
provider: string,
lines: number,
boot = 0
diff --git a/src/data/lovelace/config/action.ts b/src/data/lovelace/config/action.ts
index 800a54dc3f..6aa0a8ee88 100644
--- a/src/data/lovelace/config/action.ts
+++ b/src/data/lovelace/config/action.ts
@@ -28,7 +28,7 @@ export interface UrlActionConfig extends BaseActionConfig {
export interface MoreInfoActionConfig extends BaseActionConfig {
action: "more-info";
- entity_id?: string;
+ entity?: string;
}
export interface AssistActionConfig extends BaseActionConfig {
diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts
index cdc5d9f845..9ac568e80d 100644
--- a/src/layouts/hass-tabs-subpage-data-table.ts
+++ b/src/layouts/hass-tabs-subpage-data-table.ts
@@ -371,11 +371,13 @@ export class HaTabsSubpageDataTable extends LitElement {
-
- ${localize("ui.components.subpage-data-table.selected", {
- selected: this.selected || "0",
- })}
-
+ ${this.selected !== undefined
+ ? html`
+ ${localize("ui.components.subpage-data-table.selected", {
+ selected: this.selected || "0",
+ })}
+
`
+ : nothing}
diff --git a/src/panels/config/logs/dialog-download-logs.ts b/src/panels/config/logs/dialog-download-logs.ts
index fdd67e5a31..e4726e0528 100644
--- a/src/panels/config/logs/dialog-download-logs.ts
+++ b/src/panels/config/logs/dialog-download-logs.ts
@@ -14,7 +14,10 @@ import type { DownloadLogsDialogParams } from "./show-dialog-download-logs";
import "../../../components/ha-select";
import "../../../components/ha-list-item";
import { stopPropagation } from "../../../common/dom/stop_propagation";
-import { getHassioLogDownloadLinesUrl } from "../../../data/hassio/supervisor";
+import {
+ getHassioLogDownloadLinesUrl,
+ getHassioLogBootDownloadLinesUrl,
+} from "../../../data/hassio/supervisor";
import { getSignedPath } from "../../../data/auth";
import { fileDownload } from "../../../util/file_download";
@@ -112,7 +115,7 @@ class DownloadLogsDialog extends LitElement {
const boot = this._dialogParams!.boot;
const timeString = new Date().toISOString().replace(/:/g, "-");
- const downloadUrl = getHassioLogDownloadLinesUrl(
+ const downloadUrl = this._getDownloadUrlFunction()(
provider,
this._lineCount,
boot
@@ -126,6 +129,13 @@ class DownloadLogsDialog extends LitElement {
this.closeDialog();
}
+ private _getDownloadUrlFunction() {
+ if (this._dialogParams!.boot === 0) {
+ return getHassioLogDownloadLinesUrl;
+ }
+ return getHassioLogBootDownloadLinesUrl;
+ }
+
private _setNumberOfLogs(ev) {
this._lineCount = Number(ev.target.value);
}
diff --git a/src/panels/config/logs/error-log-card.ts b/src/panels/config/logs/error-log-card.ts
index b487f07c95..12994fe1e2 100644
--- a/src/panels/config/logs/error-log-card.ts
+++ b/src/panels/config/logs/error-log-card.ts
@@ -39,6 +39,7 @@ import { extractApiErrorMessage } from "../../../data/hassio/common";
import {
fetchHassioBoots,
fetchHassioLogs,
+ fetchHassioLogsBootFollow,
fetchHassioLogsFollow,
getHassioLogDownloadUrl,
} from "../../../data/hassio/supervisor";
@@ -378,7 +379,7 @@ class ErrorLogCard extends LitElement {
isComponentLoaded(this.hass, "hassio") &&
this.provider
) {
- const response = await fetchHassioLogsFollow(
+ const response = await this._fetchLogsFunction()(
this.hass,
this.provider,
this._logStreamAborter.signal,
@@ -468,6 +469,13 @@ class ErrorLogCard extends LitElement {
}
}
+ private _fetchLogsFunction = () => {
+ if (this._boot === 0) {
+ return fetchHassioLogsFollow;
+ }
+ return fetchHassioLogsBootFollow;
+ };
+
private _debounceSearch = debounce(() => {
this._noSearchResults = !this._ansiToHtmlElement?.filterLines(this.filter);
@@ -570,9 +578,14 @@ class ErrorLogCard extends LitElement {
if (this._streamSupported && isComponentLoaded(this.hass, "hassio")) {
try {
const { data } = await fetchHassioBoots(this.hass);
- this._boots = Object.keys(data.boots)
+ const boots = Object.keys(data.boots)
.map(Number)
.sort((a, b) => b - a);
+
+ // only show boots select when there are more than one boot
+ if (boots.length > 1) {
+ this._boots = boots;
+ }
} catch (err: any) {
// eslint-disable-next-line no-console
console.error(err);
diff --git a/src/panels/lovelace/cards/hui-card.ts b/src/panels/lovelace/cards/hui-card.ts
index 855c4d3040..8692e34dd1 100644
--- a/src/panels/lovelace/cards/hui-card.ts
+++ b/src/panels/lovelace/cards/hui-card.ts
@@ -86,10 +86,11 @@ export class HuiCard extends ReactiveElement {
return this._element.getGridOptions();
}
if (this._element.getLayoutOptions) {
+ // Disabled for now to avoid spamming the console, need to be re-enabled when hui-card performance are fixed
// eslint-disable-next-line no-console
- console.warn(
- `This card (${this.config?.type}) is using "getLayoutOptions" and it is deprecated, contact the developer to suggest to use "getGridOptions" instead`
- );
+ // console.warn(
+ // `This card (${this.config?.type}) is using "getLayoutOptions" and it is deprecated, contact the developer to suggest to use "getGridOptions" instead`
+ // );
const options = migrateLayoutToGridOptions(
this._element.getLayoutOptions()
);
diff --git a/src/panels/lovelace/common/handle-action.ts b/src/panels/lovelace/common/handle-action.ts
index 00ab032fdd..e7337ab51c 100644
--- a/src/panels/lovelace/common/handle-action.ts
+++ b/src/panels/lovelace/common/handle-action.ts
@@ -95,7 +95,7 @@ export const handleAction = async (
switch (actionConfig.action) {
case "more-info": {
const entityId =
- actionConfig.entity_id ||
+ actionConfig.entity ||
config.entity ||
config.camera_image ||
config.image_entity;
diff --git a/src/panels/lovelace/editor/structs/action-struct.ts b/src/panels/lovelace/editor/structs/action-struct.ts
index 7744a99070..b6b7c75a27 100644
--- a/src/panels/lovelace/editor/structs/action-struct.ts
+++ b/src/panels/lovelace/editor/structs/action-struct.ts
@@ -63,7 +63,7 @@ const actionConfigStructAssist = type({
const actionConfigStructMoreInfo = type({
action: literal("more-info"),
- entity_id: optional(string()),
+ entity: optional(string()),
});
export const actionConfigStructType = object({
diff --git a/src/translations/en.json b/src/translations/en.json
index 5c62be98d2..0fc56d82f1 100644
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -7774,7 +7774,8 @@
"title": "Manage add-on repositories",
"add": "Add",
"remove": "Remove",
- "used": "Repository is in use for installed add-ons and can't be removed."
+ "used": "Repository is in use for installed add-ons and can't be removed.",
+ "no_repositories": "No repositories"
},
"restart_addon": {
"title": "Restart {name}?",
@@ -7814,6 +7815,37 @@
"cancel": "[%key:ui::common::cancel%]",
"move": "Move"
}
+ },
+ "ui": {
+ "components": {
+ "subpage-data-table": {
+ "filters": "[%key:ui::components::subpage-data-table::filters%]",
+ "show_results": "[%key:ui::components::subpage-data-table::show_results%]",
+ "clear_filter": "[%key:ui::components::subpage-data-table::clear_filter%]",
+ "close_filter": "[%key:ui::components::subpage-data-table::close_filter%]",
+ "exit_selection_mode": "[%key:ui::components::subpage-data-table::exit_selection_mode%]",
+ "enter_selection_mode": "[%key:ui::components::subpage-data-table::enter_selection_mode%]",
+ "sort_by": "[%key:ui::components::subpage-data-table::sort_by%]",
+ "group_by": "[%key:ui::components::subpage-data-table::group_by%]",
+ "dont_group_by": "[%key:ui::components::subpage-data-table::dont_group_by%]",
+ "collapse_all_groups": "[%key:ui::components::subpage-data-table::collapse_all_groups%]",
+ "expand_all_groups": "[%key:ui::components::subpage-data-table::expand_all_groups%]",
+ "select": "[%key:ui::components::subpage-data-table::select%]",
+ "selected": "[%key:ui::components::subpage-data-table::selected%]",
+ "select_all": "[%key:ui::components::subpage-data-table::select_all%]",
+ "select_none": "[%key:ui::components::subpage-data-table::select_none%]",
+ "settings": "[%key:ui::components::subpage-data-table::settings%]"
+ },
+ "data-table": {
+ "settings": {
+ "header": "[%key:ui::components::data-table::settings::header%]",
+ "hide": "[%key:ui::components::data-table::settings::hide%]",
+ "show": "[%key:ui::components::data-table::settings::show%]",
+ "done": "[%key:ui::components::data-table::settings::done%]",
+ "restore": "[%key:ui::components::data-table::settings::restore%]"
+ }
+ }
+ }
}
}
}
diff --git a/yarn.lock b/yarn.lock
index 5a866a60dd..b6d4ed513a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6099,12 +6099,12 @@ __metadata:
languageName: node
linkType: hard
-"chart.js@npm:4.4.5":
- version: 4.4.5
- resolution: "chart.js@npm:4.4.5"
+"chart.js@npm:4.4.6":
+ version: 4.4.6
+ resolution: "chart.js@npm:4.4.6"
dependencies:
"@kurkle/color": "npm:^0.3.0"
- checksum: 10/def643ed3ae898f3f37a0a59b5f1a36ffaf68c8a4f4392dcfebb6e5872534065d04b5b437b25c2b3065c20799403b4436a356bdd1700727267b3b468fec49f84
+ checksum: 10/50d0c13a16fd8c156784ff5e4c79070f09325147b0ee5c64d6d3a17933dd9072027dbc72c561cdd8aa41183d8e5736ef634c9843767f79e8abcf1fa0fd03543b
languageName: node
linkType: hard
@@ -8824,7 +8824,7 @@ __metadata:
babel-plugin-template-html-minifier: "npm:4.1.0"
browserslist-useragent-regexp: "npm:4.1.3"
chai: "npm:5.1.2"
- chart.js: "npm:4.4.5"
+ chart.js: "npm:4.4.6"
color-name: "npm:2.0.0"
comlink: "npm:4.4.1"
core-js: "npm:3.38.1"