diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index a28fd83e4d..8b35690bb4 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -18,8 +18,8 @@
## Type of change
@@ -56,7 +56,7 @@
-->
- This PR fixes or closes issue: fixes #
-- This PR is related to issue:
+- This PR is related to issue or discussion:
- Link to documentation pull request:
## Checklist
diff --git a/.github/lock.yml b/.github/lock.yml
deleted file mode 100644
index 2566272cb3..0000000000
--- a/.github/lock.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-# Configuration for Lock Threads - https://github.com/dessant/lock-threads
-
-# Number of days of inactivity before a closed issue or pull request is locked
-daysUntilLock: 1
-
-# Skip issues and pull requests created before a given timestamp. Timestamp must
-# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
-skipCreatedBefore: 2020-01-01
-
-# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
-exemptLabels: []
-
-# Label to add before locking, such as `outdated`. Set to `false` to disable
-lockLabel: false
-
-# Comment to post before locking. Set to `false` to disable
-lockComment: false
-
-# Assign `resolved` as the reason for locking. Set to `false` to disable
-setLockReason: false
-
-# Limit to only `issues` or `pulls`
-only: pulls
-
-# Optionally, specify configuration settings just for `issues` or `pulls`
-issues:
- daysUntilLock: 30
diff --git a/.github/stale.yml b/.github/stale.yml
deleted file mode 100644
index dc0896c22c..0000000000
--- a/.github/stale.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-# Configuration for probot-stale - https://github.com/probot/stale
-
-# Number of days of inactivity before an Issue or Pull Request becomes stale
-daysUntilStale: 90
-
-# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
-# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
-daysUntilClose: 7
-
-# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
-onlyLabels: []
-
-# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
-exemptLabels:
- - feature request
- - Help wanted
- - to do
-
-# Set to true to ignore issues in a project (defaults to false)
-exemptProjects: true
-
-# Set to true to ignore issues in a milestone (defaults to false)
-exemptMilestones: true
-
-# Set to true to ignore issues with an assignee (defaults to false)
-exemptAssignees: false
-
-# Label to use when marking as stale
-staleLabel: stale
-
-# Comment to post when marking as stale. Set to `false` to disable
-markComment: >
- There hasn't been any activity on this issue recently. Due to the high number
- of incoming GitHub notifications, we have to clean some of the old issues,
- as many of them have already been resolved with the latest updates.
-
- Please make sure to update to the latest Home Assistant version and check
- if that solves the issue. Let us know if that works for you by adding a
- comment 👍
-
- This issue now has been marked as stale and will be closed if no further
- activity occurs. Thank you for your contributions.
-
-# Comment to post when removing the stale label.
-# unmarkComment: >
-# Your comment here.
-
-# Comment to post when closing a stale Issue or Pull Request.
-# closeComment: >
-# Your comment here.
-
-# Limit the number of actions per hour, from 1-30. Default is 30
-limitPerRun: 30
-
-# Limit to only `issues` or `pulls`
-only: issues
diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml
new file mode 100644
index 0000000000..4f7a0efb2d
--- /dev/null
+++ b/.github/workflows/lock.yml
@@ -0,0 +1,20 @@
+name: Lock
+
+# yamllint disable-line rule:truthy
+on:
+ schedule:
+ - cron: "0 * * * *"
+
+jobs:
+ lock:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: dessant/lock-threads@v2.0.1
+ with:
+ github-token: ${{ github.token }}
+ issue-lock-inactive-days: "30"
+ issue-exclude-created-before: "2020-10-01T00:00:00Z"
+ issue-lock-reason: ""
+ pr-lock-inactive-days: "1"
+ pr-exclude-created-before: "2020-11-01T00:00:00Z"
+ pr-lock-reason: ""
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 0000000000..bcb543cf49
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,42 @@
+name: Stale
+
+# yamllint disable-line rule:truthy
+on:
+ schedule:
+ - cron: "0 * * * *"
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ steps:
+ - name: 90 days stale policy
+ uses: actions/stale@v3.0.13
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ days-before-stale: 90
+ days-before-close: 7
+ operations-per-run: 25
+ remove-stale-when-updated: true
+ stale-issue-label: "stale"
+ exempt-issue-labels: "no-stale,Help%20wanted,help-wanted,feature-request,feature%20request"
+ stale-issue-message: >
+ There hasn't been any activity on this issue recently. Due to the
+ high number of incoming GitHub notifications, we have to clean some
+ of the old issues, as many of them have already been resolved with
+ the latest updates.
+
+ Please make sure to update to the latest Home Assistant version and
+ check if that solves the issue. Let us know if that works for you by
+ adding a comment 👍
+
+ This issue has now been marked as stale and will be closed if no
+ further activity occurs. Thank you for your contributions.
+
+ stale-pr-label: "stale"
+ exempt-pr-labels: "no-stale"
+ stale-pr-message: >
+ There hasn't been any activity on this pull request recently. This
+ pull request has been automatically marked as stale because of that
+ and will be closed if no further activity occurs within 7 days.
+
+ Thank you for your contributions.
diff --git a/build-scripts/gulp/translations.js b/build-scripts/gulp/translations.js
index 19d329a7e0..e357d38edf 100755
--- a/build-scripts/gulp/translations.js
+++ b/build-scripts/gulp/translations.js
@@ -7,7 +7,6 @@ const gulp = require("gulp");
const fs = require("fs");
const foreach = require("gulp-foreach");
const merge = require("gulp-merge-json");
-const minify = require("gulp-jsonminify");
const rename = require("gulp-rename");
const transform = require("gulp-json-transform");
const { mapFiles } = require("../util");
@@ -301,7 +300,6 @@ gulp.task("build-flattened-translations", function () {
return flatten(data);
})
)
- .pipe(minify())
.pipe(
rename((filePath) => {
if (filePath.dirname === "core") {
diff --git a/demo/src/configs/teachingbirds/lovelace.ts b/demo/src/configs/teachingbirds/lovelace.ts
index f7684fde6d..135dde6a0b 100644
--- a/demo/src/configs/teachingbirds/lovelace.ts
+++ b/demo/src/configs/teachingbirds/lovelace.ts
@@ -7,205 +7,183 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
cards: [
{ type: "custom:ha-demo-card" },
{
+ type: "grid",
+ columns: 4,
cards: [
{
- cards: [
+ image: "/assets/teachingbirds/isa_square.jpg",
+ type: "picture-entity",
+ show_name: false,
+ tap_action: {
+ action: "more-info",
+ },
+ entity: "sensor.presence_isa",
+ },
+ {
+ image: "/assets/teachingbirds/Stefan_square.jpg",
+ type: "picture-entity",
+ show_name: false,
+ tap_action: {
+ action: "more-info",
+ },
+ entity: "sensor.presence_stefan",
+ },
+ {
+ image: "/assets/teachingbirds/background_square.png",
+ elements: [
{
- image: "/assets/teachingbirds/isa_square.jpg",
- type: "picture-entity",
- show_name: false,
+ state_image: {
+ on: "/assets/teachingbirds/radiator_on.jpg",
+ off: "/assets/teachingbirds/radiator_off.jpg",
+ },
+ type: "image",
+ style: {
+ width: "100%",
+ top: "50%",
+ left: "50%",
+ },
tap_action: {
action: "more-info",
},
- entity: "sensor.presence_isa",
+ entity: "switch.stefan_radiator_3",
},
{
- image: "/assets/teachingbirds/Stefan_square.jpg",
- type: "picture-entity",
- show_name: false,
- tap_action: {
- action: "more-info",
+ style: {
+ top: "90%",
+ left: "50%",
},
- entity: "sensor.presence_stefan",
- },
- {
- image: "/assets/teachingbirds/background_square.png",
- elements: [
- {
- state_image: {
- on: "/assets/teachingbirds/radiator_on.jpg",
- off: "/assets/teachingbirds/radiator_off.jpg",
- },
- type: "image",
- style: {
- width: "100%",
- top: "50%",
- left: "50%",
- },
- tap_action: {
- action: "more-info",
- },
- entity: "switch.stefan_radiator_3",
- },
- {
- style: {
- top: "90%",
- left: "50%",
- },
- type: "state-label",
- entity: "sensor.temperature_stefan",
- },
- ],
- type: "picture-elements",
- },
- {
- image: "/assets/teachingbirds/background_square.png",
- elements: [
- {
- style: {
- "--mdc-icon-size": "100%",
- top: "50%",
- left: "50%",
- },
- type: "icon",
- tap_action: {
- action: "navigate",
- navigation_path: "/lovelace/home_info",
- },
- icon: "mdi:car",
- },
- ],
- type: "picture-elements",
- },
- ],
- type: "horizontal-stack",
- },
- {
- cards: [
- {
- show_name: false,
- type: "picture-entity",
- name: "Alarm",
- image: "/assets/teachingbirds/House_square.jpg",
- entity: "alarm_control_panel.house",
- },
- {
- name: "Roomba",
- image: "/assets/teachingbirds/roomba_square.jpg",
- show_name: false,
- type: "picture-entity",
- state_image: {
- "Not Today": "/assets/teachingbirds/roomba_bw_square.jpg",
- },
- entity: "input_select.roomba_mode",
- },
- {
- show_name: false,
- type: "picture-entity",
- state_image: {
- Mail: "/assets/teachingbirds/mailbox_square.jpg",
- "Package and mail":
- "/assets/teachingbirds/mailbox_square.jpg",
- Empty: "/assets/teachingbirds/mailbox_bw_square.jpg",
- Package: "/assets/teachingbirds/mailbox_square.jpg",
- },
- entity: "sensor.mailbox",
- },
- {
- show_name: false,
- state_image: {
- "Put out": "/assets/teachingbirds/trash_square.jpg",
- "Take in": "/assets/teachingbirds/trash_square.jpg",
- },
- type: "picture-entity",
- image: "/assets/teachingbirds/trash_bear_bw_square.jpg",
- entity: "sensor.trash_status",
- },
- ],
- type: "horizontal-stack",
- },
- {
- cards: [
- {
- state_image: {
- Idle: "/assets/teachingbirds/washer_square.jpg",
- Running: "/assets/teachingbirds/laundry_running_square.jpg",
- Clean: "/assets/teachingbirds/laundry_clean_2_square.jpg",
- },
- entity: "input_select.washing_machine_status",
- type: "picture-entity",
- show_name: false,
- name: "Washer",
- },
- {
- state_image: {
- Idle: "/assets/teachingbirds/dryer_square.jpg",
- Running: "/assets/teachingbirds/clothes_drying_square.jpg",
- Clean: "/assets/teachingbirds/folded_clothes_square.jpg",
- },
- entity: "input_select.dryer_status",
- type: "picture-entity",
- show_name: false,
- name: "Dryer",
- },
- {
- image: "/assets/teachingbirds/guests_square.jpg",
- type: "picture-entity",
- show_name: false,
- tap_action: {
- action: "toggle",
- },
- entity: "input_boolean.guest_mode",
- },
- {
- image: "/assets/teachingbirds/cleaning_square.jpg",
- type: "picture-entity",
- show_name: false,
- tap_action: {
- action: "toggle",
- },
- entity: "input_boolean.cleaning_day",
- },
- ],
- type: "horizontal-stack",
- },
- ],
- type: "vertical-stack",
- },
- {
- type: "vertical-stack",
- cards: [
- {
- cards: [
- {
- graph: "line",
- type: "sensor",
- entity: "sensor.temperature_bedroom",
- },
- {
- graph: "line",
- type: "sensor",
- name: "S's room",
+ type: "state-label",
entity: "sensor.temperature_stefan",
},
],
- type: "horizontal-stack",
+ type: "picture-elements",
},
{
- cards: [
+ image: "/assets/teachingbirds/background_square.png",
+ elements: [
{
- graph: "line",
- type: "sensor",
- entity: "sensor.temperature_passage",
- },
- {
- graph: "line",
- type: "sensor",
- name: "Laundry",
- entity: "sensor.temperature_downstairs_bathroom",
+ style: {
+ "--mdc-icon-size": "100%",
+ top: "50%",
+ left: "50%",
+ },
+ type: "icon",
+ tap_action: {
+ action: "navigate",
+ navigation_path: "/lovelace/home_info",
+ },
+ icon: "mdi:car",
},
],
- type: "horizontal-stack",
+ type: "picture-elements",
+ },
+
+ {
+ show_name: false,
+ type: "picture-entity",
+ name: "Alarm",
+ image: "/assets/teachingbirds/House_square.jpg",
+ entity: "alarm_control_panel.house",
+ },
+ {
+ name: "Roomba",
+ image: "/assets/teachingbirds/roomba_square.jpg",
+ show_name: false,
+ type: "picture-entity",
+ state_image: {
+ "Not Today": "/assets/teachingbirds/roomba_bw_square.jpg",
+ },
+ entity: "input_select.roomba_mode",
+ },
+ {
+ show_name: false,
+ type: "picture-entity",
+ state_image: {
+ Mail: "/assets/teachingbirds/mailbox_square.jpg",
+ "Package and mail": "/assets/teachingbirds/mailbox_square.jpg",
+ Empty: "/assets/teachingbirds/mailbox_bw_square.jpg",
+ Package: "/assets/teachingbirds/mailbox_square.jpg",
+ },
+ entity: "sensor.mailbox",
+ },
+ {
+ show_name: false,
+ state_image: {
+ "Put out": "/assets/teachingbirds/trash_square.jpg",
+ "Take in": "/assets/teachingbirds/trash_square.jpg",
+ },
+ type: "picture-entity",
+ image: "/assets/teachingbirds/trash_bear_bw_square.jpg",
+ entity: "sensor.trash_status",
+ },
+
+ {
+ state_image: {
+ Idle: "/assets/teachingbirds/washer_square.jpg",
+ Running: "/assets/teachingbirds/laundry_running_square.jpg",
+ Clean: "/assets/teachingbirds/laundry_clean_2_square.jpg",
+ },
+ entity: "input_select.washing_machine_status",
+ type: "picture-entity",
+ show_name: false,
+ name: "Washer",
+ },
+ {
+ state_image: {
+ Idle: "/assets/teachingbirds/dryer_square.jpg",
+ Running: "/assets/teachingbirds/clothes_drying_square.jpg",
+ Clean: "/assets/teachingbirds/folded_clothes_square.jpg",
+ },
+ entity: "input_select.dryer_status",
+ type: "picture-entity",
+ show_name: false,
+ name: "Dryer",
+ },
+ {
+ image: "/assets/teachingbirds/guests_square.jpg",
+ type: "picture-entity",
+ show_name: false,
+ tap_action: {
+ action: "toggle",
+ },
+ entity: "input_boolean.guest_mode",
+ },
+ {
+ image: "/assets/teachingbirds/cleaning_square.jpg",
+ type: "picture-entity",
+ show_name: false,
+ tap_action: {
+ action: "toggle",
+ },
+ entity: "input_boolean.cleaning_day",
+ },
+ ],
+ },
+ {
+ type: "grid",
+ columns: 2,
+ cards: [
+ {
+ graph: "line",
+ type: "sensor",
+ entity: "sensor.temperature_bedroom",
+ },
+ {
+ graph: "line",
+ type: "sensor",
+ name: "S's room",
+ entity: "sensor.temperature_stefan",
+ },
+ {
+ graph: "line",
+ type: "sensor",
+ entity: "sensor.temperature_passage",
+ },
+ {
+ graph: "line",
+ type: "sensor",
+ name: "Laundry",
+ entity: "sensor.temperature_downstairs_bathroom",
},
],
},
diff --git a/demo/src/stubs/template.ts b/demo/src/stubs/template.ts
index 726926461c..0e3c1a2638 100644
--- a/demo/src/stubs/template.ts
+++ b/demo/src/stubs/template.ts
@@ -6,4 +6,11 @@ export const mockTemplate = (hass: MockHomeAssistant) => {
body: { message: "Template dev tool does not work in the demo." },
})
);
+ hass.mockWS("render_template", (msg, onChange) => {
+ onChange!({
+ result: msg.template,
+ listeners: { all: false, domains: [], entities: [], time: false },
+ });
+ return () => {};
+ });
};
diff --git a/gallery/public/images/sunflowers.jpg b/gallery/public/images/sunflowers.jpg
new file mode 100644
index 0000000000..961d2a7bf3
Binary files /dev/null and b/gallery/public/images/sunflowers.jpg differ
diff --git a/gallery/src/components/demo-cards.js b/gallery/src/components/demo-cards.js
index 26ac82e3f7..9e076371c4 100644
--- a/gallery/src/components/demo-cards.js
+++ b/gallery/src/components/demo-cards.js
@@ -5,11 +5,16 @@ import { PolymerElement } from "@polymer/polymer/polymer-element";
import "../../../src/components/ha-switch";
import "../../../src/components/ha-formfield";
import "./demo-card";
+import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
class DemoCards extends PolymerElement {
static get template() {
return html`
${hass.localize(`ui.dialogs.options_flow.success.description`)}
`; }, + + renderShowFormProgressHeader(_hass, _step) { + return ""; + }, + + renderShowFormProgressDescription(_hass, _step) { + return ""; + }, } ); diff --git a/src/dialogs/config-flow/step-flow-pick-handler.ts b/src/dialogs/config-flow/step-flow-pick-handler.ts index cbfcf3b8d5..a95f31637b 100644 --- a/src/dialogs/config-flow/step-flow-pick-handler.ts +++ b/src/dialogs/config-flow/step-flow-pick-handler.ts @@ -23,6 +23,7 @@ import { HomeAssistant } from "../../types"; import { documentationUrl } from "../../util/documentation-url"; import { FlowConfig } from "./show-dialog-data-entry-flow"; import { configFlowContentStyles } from "./styles"; +import { brandsUrl } from "../../util/brands-url"; interface HandlerObj { name: string; @@ -102,7 +103,7 @@ class StepFlowPickHandler extends LitElement {
@@ -304,8 +285,8 @@ export class MoreInfoDialog extends LitElement {
text: this.hass.localize(
"ui.dialogs.more_info_control.restored.confirm_remove_text"
),
- confirmText: this.hass.localize("ui.common.yes"),
- dismissText: this.hass.localize("ui.common.no"),
+ confirmText: this.hass.localize("ui.common.remove"),
+ dismissText: this.hass.localize("ui.common.cancel"),
confirm: () => {
removeEntityRegistryEntry(this.hass, entityId);
},
diff --git a/src/dialogs/more-info/more-info-content.ts b/src/dialogs/more-info/more-info-content.ts
new file mode 100644
index 0000000000..47570226fa
--- /dev/null
+++ b/src/dialogs/more-info/more-info-content.ts
@@ -0,0 +1,57 @@
+import { HassEntity } from "home-assistant-js-websocket";
+import { property, PropertyValues, UpdatingElement } from "lit-element";
+
+import { HomeAssistant } from "../../types";
+import dynamicContentUpdater from "../../common/dom/dynamic_content_updater";
+import { stateMoreInfoType } from "./state_more_info_control";
+import { importMoreInfoControl } from "../../panels/lovelace/custom-card-helpers";
+
+class MoreInfoContent extends UpdatingElement {
+ @property({ attribute: false }) public hass?: HomeAssistant;
+
+ @property() public stateObj?: HassEntity;
+
+ private _detachedChild?: ChildNode;
+
+ // This is not a lit element, but an updating element, so we implement update
+ protected update(changedProps: PropertyValues): void {
+ super.update(changedProps);
+ const stateObj = this.stateObj;
+ const hass = this.hass;
+
+ if (!stateObj || !hass) {
+ if (this.lastChild) {
+ this._detachedChild = this.lastChild;
+ // Detach child to prevent it from doing work.
+ this.removeChild(this.lastChild);
+ }
+ return;
+ }
+
+ if (this._detachedChild) {
+ this.appendChild(this._detachedChild);
+ this._detachedChild = undefined;
+ }
+
+ let moreInfoType: string | undefined;
+
+ if (stateObj.attributes && "custom_ui_more_info" in stateObj.attributes) {
+ moreInfoType = stateObj.attributes.custom_ui_more_info;
+ } else {
+ const type = stateMoreInfoType(stateObj);
+ importMoreInfoControl(type);
+ moreInfoType = type === "hidden" ? undefined : `more-info-${type}`;
+ }
+
+ if (!moreInfoType) {
+ return;
+ }
+
+ dynamicContentUpdater(this, moreInfoType.toUpperCase(), {
+ hass,
+ stateObj,
+ });
+ }
+}
+
+customElements.define("more-info-content", MoreInfoContent);
diff --git a/src/dialogs/notifications/notification-drawer.js b/src/dialogs/notifications/notification-drawer.js
index 0ad149e9f0..cc3dc592e3 100644
--- a/src/dialogs/notifications/notification-drawer.js
+++ b/src/dialogs/notifications/notification-drawer.js
@@ -25,8 +25,8 @@ export class HuiNotificationDrawer extends EventsMixin(
color: var(--primary-text-color);
border-bottom: 1px solid var(--divider-color);
background-color: var(--primary-background-color);
- min-height: 64px;
- width: calc(100% - 32px);
+ height: var(--header-height);
+ box-sizing: border-box;
}
div[main-title] {
@@ -63,7 +63,10 @@ export class HuiNotificationDrawer extends EventsMixin(
[[localize('ui.panel.config.cloud.account.thank_you_note')]]
diff --git a/src/panels/config/cloud/alexa/cloud-alexa.ts b/src/panels/config/cloud/alexa/cloud-alexa.ts
index 904333c728..d9bdbd1e14 100644
--- a/src/panels/config/cloud/alexa/cloud-alexa.ts
+++ b/src/panels/config/cloud/alexa/cloud-alexa.ts
@@ -214,9 +214,9 @@ class CloudAlexa extends LitElement {
}
return html`
-
[[localize('ui.panel.config.cloud.login.introduction')]]
diff --git a/src/panels/config/cloud/register/cloud-register.js b/src/panels/config/cloud/register/cloud-register.js
index 382effb34f..8071ec8058 100644
--- a/src/panels/config/cloud/register/cloud-register.js
+++ b/src/panels/config/cloud/register/cloud-register.js
@@ -47,7 +47,7 @@ class CloudRegister extends LocalizeMixin(EventsMixin(PolymerElement)) {
display: none;
}
-
- [[localize('ui.panel.developer-tools.tabs.states.description1')]]
- [[localize('ui.panel.developer-tools.tabs.states.state_attributes')]]
-
+ [[localize('ui.panel.developer-tools.tabs.states.description1')]]
+ [[localize('ui.panel.developer-tools.tabs.states.state_attributes')]]
+
+ [[localize('ui.panel.developer-tools.tabs.states.last_changed')]]:
+ [[localize('ui.panel.developer-tools.tabs.states.last_updated')]]:
- ${entry
- ? entry.name
- : this.hass.localize("ui.panel.config.areas.editor.default_name")}
-
- Create a new automation
+
+ ${this.hass.localize(
+ `ui.panel.config.automation.thingtalk.task_selection.header`
+ )}
+
- For example:
+ ${this.hass.localize(
+ `ui.panel.config.automation.thingtalk.task_selection.introduction`
+ )}
+ ${this.hass.localize(
+ `ui.panel.config.automation.thingtalk.task_selection.language_note`
+ )}
+ ${this.hass.localize(
+ `ui.panel.config.automation.thingtalk.task_selection.for_example`
+ )}
Great! Now we need to link some devices.
+
+ ${this.hass.localize(
+ `ui.panel.config.automation.thingtalk.link_devices.header`
+ )}
+
- One or more devices have more than one matching
- entity, please pick the one you want to use.
+ ${this.hass.localize(
+ `ui.panel.config.automation.thingtalk.link_devices.ambiguous_entities`
+ )}
${Object.keys(extraInfo.manualEntity).map(
(idx) => html`
@@ -226,7 +231,9 @@ export class ThingTalkPlaceholders extends SubscribeMixin(LitElement) {
}
return html`
+ ${this.hass.localize(
+ `ui.panel.config.automation.thingtalk.link_devices.unknown_placeholder`
+ )}
${placeholder.domains}
${placeholder.fields.map(
(field) => html` ${field}
`
@@ -239,10 +246,10 @@ export class ThingTalkPlaceholders extends SubscribeMixin(LitElement) {
diff --git a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts
index 687889c634..944c57044d 100644
--- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts
+++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts
@@ -196,8 +196,8 @@ export default class HaAutomationTriggerRow extends LitElement {
text: this.hass.localize(
"ui.panel.config.automation.editor.triggers.delete_confirm"
),
- dismissText: this.hass.localize("ui.common.no"),
- confirmText: this.hass.localize("ui.common.yes"),
+ dismissText: this.hass.localize("ui.common.cancel"),
+ confirmText: this.hass.localize("ui.common.delete"),
confirm: () => {
fireEvent(this, "value-changed", { value: null });
},
diff --git a/src/panels/config/cloud/account/cloud-account.js b/src/panels/config/cloud/account/cloud-account.js
index fda5256c36..2359d24067 100644
--- a/src/panels/config/cloud/account/cloud-account.js
+++ b/src/panels/config/cloud/account/cloud-account.js
@@ -61,12 +61,10 @@ class CloudAccount extends EventsMixin(LocalizeMixin(PolymerElement)) {
color: var(--primary-color);
}
-
+
+ ${
+ integrations.length
+ ? html`
+
+ `
+ : ""
+ }
+
diff --git a/src/panels/config/info/system-health-card.ts b/src/panels/config/info/system-health-card.ts
index 69df18b5b5..765725b133 100644
--- a/src/panels/config/info/system-health-card.ts
+++ b/src/panels/config/info/system-health-card.ts
@@ -1,3 +1,5 @@
+import "@material/mwc-button/mwc-button";
+import "@material/mwc-icon-button";
import "../../../components/ha-circular-progress";
import { mdiContentCopy } from "@mdi/js";
import {
@@ -15,10 +17,13 @@ import "@polymer/paper-tooltip/paper-tooltip";
import type { PaperTooltipElement } from "@polymer/paper-tooltip/paper-tooltip";
import { domainToName } from "../../../data/integration";
import {
- fetchSystemHealthInfo,
+ subscribeSystemHealthInfo,
SystemHealthInfo,
+ SystemCheckValueObject,
} from "../../../data/system_health";
import { HomeAssistant } from "../../../types";
+import { formatDateTime } from "../../../common/datetime/format_date_time";
+import { copyToClipboard } from "../../../common/util/copy-clipboard";
const sortKeys = (a: string, b: string) => {
if (a === "homeassistant") {
@@ -60,19 +65,77 @@ class SystemHealthCard extends LitElement {
} else {
const domains = Object.keys(this._info).sort(sortKeys);
for (const domain of domains) {
+ const domainInfo = this._info[domain];
const keys: TemplateResult[] = [];
- for (const key of Object.keys(this._info[domain]).sort()) {
+ for (const key of Object.keys(domainInfo.info)) {
+ let value: unknown;
+
+ if (
+ domainInfo.info[key] &&
+ typeof domainInfo.info[key] === "object"
+ ) {
+ const info = domainInfo.info[key] as SystemCheckValueObject;
+
+ if (info.type === "pending") {
+ value = html`
+
-
`);
}
if (domain !== "homeassistant") {
sections.push(
- html`${key}
- ${this._info[domain][key]}
+
+ ${this.hass.localize(
+ `component.${domain}.system_health.info.${key}`
+ ) || key}
+
+ ${value}
${domainToName(this.hass.localize, domain)}
`
+ html`
+
+ ${domainToName(this.hass.localize, domain)}
+
+ ${!domainInfo.manage_url
+ ? ""
+ : html`
+
+
+
- [[localize('ui.panel.developer-tools.tabs.states.description2')]]
-
+ [[localize('ui.panel.developer-tools.tabs.states.description2')]]
+
[[lastChangedString(_entity)]]
+
[[lastUpdatedString(_entity)]]
+
[[localize('ui.panel.developer-tools.tabs.states.current_entities')]]
-
-
+
-
- [[localize('ui.panel.developer-tools.tabs.states.entity')]]
- [[localize('ui.panel.developer-tools.tabs.states.state')]]
-
- [[localize('ui.panel.developer-tools.tabs.states.attributes')]]
-
-
-
-
-
-
-
-
-
-
-
-
+
- [[localize('ui.panel.developer-tools.tabs.states.no_entities')]]
-
-
+
-
-
-
-
- [[entity.state]]
-
- [[attributeString(entity)]]
-
+ [[localize('ui.panel.developer-tools.tabs.states.entity')]]
+ [[localize('ui.panel.developer-tools.tabs.states.state')]]
+
+ [[localize('ui.panel.developer-tools.tabs.states.attributes')]]
+
+
+
+
+
+
+
+
+
+
+
+
+ [[localize('ui.panel.developer-tools.tabs.states.no_entities')]]
+
+
+
+
+
+
+
+ [[entity.state]]
+
+
+ [[attributeString(entity)]]
+
+
+ ${`${this.hass!.localize(
+ "ui.panel.lovelace.editor.card.generic.entities"
+ )} (${this.hass!.localize(
+ "ui.panel.lovelace.editor.card.config.required"
+ )})`}
+
+