mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-23 17:26:42 +00:00
Merge pull request #9358 from home-assistant/dev
This commit is contained in:
commit
8666e6baae
@ -52,6 +52,7 @@ module.exports.terserOptions = (latestBuild) => ({
|
|||||||
|
|
||||||
module.exports.babelOptions = ({ latestBuild }) => ({
|
module.exports.babelOptions = ({ latestBuild }) => ({
|
||||||
babelrc: false,
|
babelrc: false,
|
||||||
|
compact: false,
|
||||||
presets: [
|
presets: [
|
||||||
!latestBuild && [
|
!latestBuild && [
|
||||||
"@babel/preset-env",
|
"@babel/preset-env",
|
||||||
@ -79,12 +80,6 @@ module.exports.babelOptions = ({ latestBuild }) => ({
|
|||||||
].filter(Boolean),
|
].filter(Boolean),
|
||||||
});
|
});
|
||||||
|
|
||||||
// Are already ES5, cause warnings when babelified.
|
|
||||||
module.exports.babelExclude = () => [
|
|
||||||
require.resolve("@mdi/js/mdi.js"),
|
|
||||||
require.resolve("hls.js"),
|
|
||||||
];
|
|
||||||
|
|
||||||
const outputPath = (outputRoot, latestBuild) =>
|
const outputPath = (outputRoot, latestBuild) =>
|
||||||
path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5");
|
path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5");
|
||||||
|
|
||||||
|
@ -57,7 +57,6 @@ const createRollupConfig = ({
|
|||||||
babel({
|
babel({
|
||||||
...bundle.babelOptions({ latestBuild }),
|
...bundle.babelOptions({ latestBuild }),
|
||||||
extensions,
|
extensions,
|
||||||
exclude: bundle.babelExclude(),
|
|
||||||
babelHelpers: isWDS ? "inline" : "bundled",
|
babelHelpers: isWDS ? "inline" : "bundled",
|
||||||
}),
|
}),
|
||||||
string({
|
string({
|
||||||
|
@ -47,7 +47,6 @@ const createWebpackConfig = ({
|
|||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
test: /\.m?js$|\.ts$/,
|
test: /\.m?js$|\.ts$/,
|
||||||
exclude: bundle.babelExclude(),
|
|
||||||
use: {
|
use: {
|
||||||
loader: "babel-loader",
|
loader: "babel-loader",
|
||||||
options: bundle.babelOptions({ latestBuild }),
|
options: bundle.babelOptions({ latestBuild }),
|
||||||
|
@ -44,6 +44,9 @@ const _computeFolders = (folders): CheckboxItem[] => {
|
|||||||
if (folders.includes("share")) {
|
if (folders.includes("share")) {
|
||||||
list.push({ slug: "share", name: "Share", checked: false });
|
list.push({ slug: "share", name: "Share", checked: false });
|
||||||
}
|
}
|
||||||
|
if (folders.includes("media")) {
|
||||||
|
list.push({ slug: "media", name: "Media", checked: false });
|
||||||
|
}
|
||||||
if (folders.includes("addons/local")) {
|
if (folders.includes("addons/local")) {
|
||||||
list.push({ slug: "addons/local", name: "Local add-ons", checked: false });
|
list.push({ slug: "addons/local", name: "Local add-ons", checked: false });
|
||||||
}
|
}
|
||||||
|
@ -97,16 +97,23 @@ class HassioIngressView extends LitElement {
|
|||||||
title: requestedAddon,
|
title: requestedAddon,
|
||||||
});
|
});
|
||||||
await nextRender();
|
await nextRender();
|
||||||
history.back();
|
navigate("/hassio/store", { replace: true });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!addonInfo.ingress) {
|
if (!addonInfo.version) {
|
||||||
|
await showAlertDialog(this, {
|
||||||
|
text: this.supervisor.localize("my.error_addon_not_installed"),
|
||||||
|
title: addonInfo.name,
|
||||||
|
});
|
||||||
|
await nextRender();
|
||||||
|
navigate(`/hassio/addon/${addonInfo.slug}/info`, { replace: true });
|
||||||
|
} else if (!addonInfo.ingress) {
|
||||||
await showAlertDialog(this, {
|
await showAlertDialog(this, {
|
||||||
text: this.supervisor.localize("my.error_addon_no_ingress"),
|
text: this.supervisor.localize("my.error_addon_no_ingress"),
|
||||||
title: addonInfo.name,
|
title: addonInfo.name,
|
||||||
});
|
});
|
||||||
await nextRender();
|
await nextRender();
|
||||||
history.back();
|
navigate(`/hassio/addon/${addonInfo.slug}/info`, { replace: true });
|
||||||
} else {
|
} else {
|
||||||
navigate(`/hassio/ingress/${addonInfo.slug}`, { replace: true });
|
navigate(`/hassio/ingress/${addonInfo.slug}`, { replace: true });
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
"*.ts": () => "tsc -p tsconfig.json",
|
|
||||||
"*.{js,ts}": "eslint --fix",
|
"*.{js,ts}": "eslint --fix",
|
||||||
"!(/translations)*.{js,ts,json,css,md,html}": "prettier --write",
|
"!(/translations)*.{js,ts,json,css,md,html}": "prettier --write",
|
||||||
};
|
};
|
||||||
|
@ -108,7 +108,7 @@
|
|||||||
"fecha": "^4.2.0",
|
"fecha": "^4.2.0",
|
||||||
"fuse.js": "^6.0.0",
|
"fuse.js": "^6.0.0",
|
||||||
"google-timezones-json": "^1.0.2",
|
"google-timezones-json": "^1.0.2",
|
||||||
"hls.js": "^1.0.4",
|
"hls.js": "^1.0.5",
|
||||||
"home-assistant-js-websocket": "^5.10.0",
|
"home-assistant-js-websocket": "^5.10.0",
|
||||||
"idb-keyval": "^5.0.5",
|
"idb-keyval": "^5.0.5",
|
||||||
"intl-messageformat": "^9.6.16",
|
"intl-messageformat": "^9.6.16",
|
||||||
|
2
setup.py
2
setup.py
@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="home-assistant-frontend",
|
name="home-assistant-frontend",
|
||||||
version="20210601.1",
|
version="20210603.0",
|
||||||
description="The Home Assistant frontend",
|
description="The Home Assistant frontend",
|
||||||
url="https://github.com/home-assistant/home-assistant-polymer",
|
url="https://github.com/home-assistant/home-assistant-polymer",
|
||||||
author="The Home Assistant Authors",
|
author="The Home Assistant Authors",
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
import "@material/mwc-icon-button/mwc-icon-button";
|
import "@material/mwc-icon-button/mwc-icon-button";
|
||||||
import { mdiClose, mdiMagnify } from "@mdi/js";
|
import { mdiClose, mdiMagnify } from "@mdi/js";
|
||||||
import "@polymer/paper-input/paper-input";
|
import "@polymer/paper-input/paper-input";
|
||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import type { PaperInputElement } from "@polymer/paper-input/paper-input";
|
||||||
import { customElement, property } from "lit/decorators";
|
import {
|
||||||
import { classMap } from "lit/directives/class-map";
|
css,
|
||||||
|
CSSResultGroup,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
PropertyValues,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit";
|
||||||
|
import { customElement, property, query } from "lit/decorators";
|
||||||
import "../../components/ha-svg-icon";
|
import "../../components/ha-svg-icon";
|
||||||
import { fireEvent } from "../dom/fire_event";
|
import { fireEvent } from "../dom/fire_event";
|
||||||
|
|
||||||
@ -27,18 +34,11 @@ class SearchInput extends LitElement {
|
|||||||
this.shadowRoot!.querySelector("paper-input")!.focus();
|
this.shadowRoot!.querySelector("paper-input")!.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@query("paper-input", true) private _input!: PaperInputElement;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
protected render(): TemplateResult {
|
||||||
return html`
|
return html`
|
||||||
<style>
|
|
||||||
.no-underline:not(.focused) {
|
|
||||||
--paper-input-container-underline: {
|
|
||||||
display: none;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<paper-input
|
<paper-input
|
||||||
class=${classMap({ "no-underline": this.noUnderline })}
|
|
||||||
.autofocus=${this.autofocus}
|
.autofocus=${this.autofocus}
|
||||||
.label=${this.label || "Search"}
|
.label=${this.label || "Search"}
|
||||||
.value=${this.filter}
|
.value=${this.filter}
|
||||||
@ -62,6 +62,17 @@ class SearchInput extends LitElement {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected updated(changedProps: PropertyValues) {
|
||||||
|
if (
|
||||||
|
changedProps.has("noUnderline") &&
|
||||||
|
(this.noUnderline || changedProps.get("noUnderline") !== undefined)
|
||||||
|
) {
|
||||||
|
(this._input.inputElement!.parentElement!.shadowRoot!.querySelector(
|
||||||
|
"div.unfocused-line"
|
||||||
|
) as HTMLElement).style.display = this.noUnderline ? "none" : "block";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async _filterChanged(value: string) {
|
private async _filterChanged(value: string) {
|
||||||
fireEvent(this, "value-changed", { value: String(value) });
|
fireEvent(this, "value-changed", { value: String(value) });
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,11 @@ import { nextRender } from "../common/util/render-status";
|
|||||||
import { getExternalConfig } from "../external_app/external_config";
|
import { getExternalConfig } from "../external_app/external_config";
|
||||||
import type { HomeAssistant } from "../types";
|
import type { HomeAssistant } from "../types";
|
||||||
|
|
||||||
|
type HlsLite = Omit<
|
||||||
|
HlsType,
|
||||||
|
"subtitleTrackController" | "audioTrackController" | "emeController"
|
||||||
|
>;
|
||||||
|
|
||||||
@customElement("ha-hls-player")
|
@customElement("ha-hls-player")
|
||||||
class HaHLSPlayer extends LitElement {
|
class HaHLSPlayer extends LitElement {
|
||||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||||
@ -39,7 +44,7 @@ class HaHLSPlayer extends LitElement {
|
|||||||
|
|
||||||
@state() private _attached = false;
|
@state() private _attached = false;
|
||||||
|
|
||||||
private _hlsPolyfillInstance?: HlsType;
|
private _hlsPolyfillInstance?: HlsLite;
|
||||||
|
|
||||||
private _useExoPlayer = false;
|
private _useExoPlayer = false;
|
||||||
|
|
||||||
@ -103,7 +108,8 @@ class HaHLSPlayer extends LitElement {
|
|||||||
const useExoPlayerPromise = this._getUseExoPlayer();
|
const useExoPlayerPromise = this._getUseExoPlayer();
|
||||||
const masterPlaylistPromise = fetch(this.url);
|
const masterPlaylistPromise = fetch(this.url);
|
||||||
|
|
||||||
const Hls = (await import("hls.js")).default;
|
const Hls: typeof HlsType = (await import("hls.js/dist/hls.light.min.js"))
|
||||||
|
.default;
|
||||||
let hlsSupported = Hls.isSupported();
|
let hlsSupported = Hls.isSupported();
|
||||||
|
|
||||||
if (!hlsSupported) {
|
if (!hlsSupported) {
|
||||||
@ -182,7 +188,7 @@ class HaHLSPlayer extends LitElement {
|
|||||||
url: string
|
url: string
|
||||||
) {
|
) {
|
||||||
const hls = new Hls({
|
const hls = new Hls({
|
||||||
liveBackBufferLength: 60,
|
backBufferLength: 60,
|
||||||
fragLoadingTimeOut: 30000,
|
fragLoadingTimeOut: 30000,
|
||||||
manifestLoadingTimeOut: 30000,
|
manifestLoadingTimeOut: 30000,
|
||||||
levelLoadingTimeOut: 30000,
|
levelLoadingTimeOut: 30000,
|
||||||
|
@ -48,6 +48,9 @@
|
|||||||
window.providersPromise = fetch("/auth/providers", {
|
window.providersPromise = fetch("/auth/providers", {
|
||||||
credentials: "same-origin",
|
credentials: "same-origin",
|
||||||
});
|
});
|
||||||
|
if (!window.globalThis) {
|
||||||
|
window.globalThis = window;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
@ -71,6 +71,9 @@
|
|||||||
import("<%= latestAppJS %>");
|
import("<%= latestAppJS %>");
|
||||||
window.customPanelJS = "<%= latestCustomPanelJS %>";
|
window.customPanelJS = "<%= latestCustomPanelJS %>";
|
||||||
window.latestJS = true;
|
window.latestJS = true;
|
||||||
|
if (!window.globalThis) {
|
||||||
|
window.globalThis = window;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
{% for extra_module in extra_modules -%}
|
{% for extra_module in extra_modules -%}
|
||||||
|
@ -80,6 +80,9 @@
|
|||||||
window.stepsPromise = fetch("/api/onboarding", {
|
window.stepsPromise = fetch("/api/onboarding", {
|
||||||
credentials: "same-origin",
|
credentials: "same-origin",
|
||||||
});
|
});
|
||||||
|
if (!window.globalThis) {
|
||||||
|
window.globalThis = window;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
@ -9,7 +9,12 @@ import {
|
|||||||
} from "../../../../../data/zha";
|
} from "../../../../../data/zha";
|
||||||
import "../../../../../layouts/hass-tabs-subpage";
|
import "../../../../../layouts/hass-tabs-subpage";
|
||||||
import type { HomeAssistant, Route } from "../../../../../types";
|
import type { HomeAssistant, Route } from "../../../../../types";
|
||||||
import { Network, Edge, Node, EdgeOptions } from "vis-network/peer";
|
import {
|
||||||
|
Network,
|
||||||
|
Edge,
|
||||||
|
Node,
|
||||||
|
EdgeOptions,
|
||||||
|
} from "vis-network/peer/esm/vis-network";
|
||||||
import "../../../../../common/search/search-input";
|
import "../../../../../common/search/search-input";
|
||||||
import "../../../../../components/device/ha-device-picker";
|
import "../../../../../components/device/ha-device-picker";
|
||||||
import "../../../../../components/ha-button-menu";
|
import "../../../../../components/ha-button-menu";
|
||||||
@ -21,6 +26,7 @@ import "../../../../../components/ha-checkbox";
|
|||||||
import type { HaCheckbox } from "../../../../../components/ha-checkbox";
|
import type { HaCheckbox } from "../../../../../components/ha-checkbox";
|
||||||
import { zhaTabs } from "./zha-config-dashboard";
|
import { zhaTabs } from "./zha-config-dashboard";
|
||||||
import { customElement, property, query, state } from "lit/decorators";
|
import { customElement, property, query, state } from "lit/decorators";
|
||||||
|
import "../../../../../components/ha-formfield";
|
||||||
|
|
||||||
@customElement("zha-network-visualization-page")
|
@customElement("zha-network-visualization-page")
|
||||||
export class ZHANetworkVisualizationPage extends LitElement {
|
export class ZHANetworkVisualizationPage extends LitElement {
|
||||||
@ -28,7 +34,7 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
|||||||
|
|
||||||
@property({ attribute: false }) public route!: Route;
|
@property({ attribute: false }) public route!: Route;
|
||||||
|
|
||||||
@property({ type: Boolean }) public narrow!: boolean;
|
@property({ type: Boolean, reflect: true }) public narrow!: boolean;
|
||||||
|
|
||||||
@property({ type: Boolean }) public isWide!: boolean;
|
@property({ type: Boolean }) public isWide!: boolean;
|
||||||
|
|
||||||
@ -67,8 +73,6 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
|||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
autoResize: true,
|
autoResize: true,
|
||||||
height: window.innerHeight + "px",
|
|
||||||
width: window.innerWidth + "px",
|
|
||||||
layout: {
|
layout: {
|
||||||
improvedLayout: true,
|
improvedLayout: true,
|
||||||
},
|
},
|
||||||
@ -135,10 +139,13 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
|||||||
"ui.panel.config.zha.visualization.header"
|
"ui.panel.config.zha.visualization.header"
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<div class="table-header">
|
${this.narrow
|
||||||
|
? html`
|
||||||
|
<div slot="header">
|
||||||
<search-input
|
<search-input
|
||||||
no-label-float
|
no-label-float
|
||||||
no-underline
|
no-underline
|
||||||
|
class="header"
|
||||||
@value-changed=${this._handleSearchChange}
|
@value-changed=${this._handleSearchChange}
|
||||||
.filter=${this._filter}
|
.filter=${this._filter}
|
||||||
.label=${this.hass.localize(
|
.label=${this.hass.localize(
|
||||||
@ -146,6 +153,21 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
</search-input>
|
</search-input>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
<div class="header">
|
||||||
|
${!this.narrow
|
||||||
|
? html`<search-input
|
||||||
|
no-label-float
|
||||||
|
no-underline
|
||||||
|
@value-changed=${this._handleSearchChange}
|
||||||
|
.filter=${this._filter}
|
||||||
|
.label=${this.hass.localize(
|
||||||
|
"ui.panel.config.zha.visualization.highlight_label"
|
||||||
|
)}
|
||||||
|
></search-input>`
|
||||||
|
: ""}
|
||||||
<ha-device-picker
|
<ha-device-picker
|
||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.value=${this.zoomedDeviceId}
|
.value=${this.zoomedDeviceId}
|
||||||
@ -155,16 +177,24 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
|||||||
.deviceFilter=${(device) => this._filterDevices(device)}
|
.deviceFilter=${(device) => this._filterDevices(device)}
|
||||||
@value-changed=${this._onZoomToDevice}
|
@value-changed=${this._onZoomToDevice}
|
||||||
></ha-device-picker>
|
></ha-device-picker>
|
||||||
|
<div class="controls">
|
||||||
|
<ha-formfield
|
||||||
|
.label=${this.hass!.localize(
|
||||||
|
"ui.panel.config.zha.visualization.auto_zoom"
|
||||||
|
)}
|
||||||
|
>
|
||||||
<ha-checkbox
|
<ha-checkbox
|
||||||
@change=${this._handleCheckboxChange}
|
@change=${this._handleCheckboxChange}
|
||||||
.checked=${this._autoZoom}
|
.checked=${this._autoZoom}
|
||||||
></ha-checkbox
|
|
||||||
>${this.hass!.localize("ui.panel.config.zha.visualization.auto_zoom")}
|
|
||||||
<mwc-button @click=${this._refreshTopology}
|
|
||||||
>${this.hass!.localize(
|
|
||||||
"ui.panel.config.zha.visualization.refresh_topology"
|
|
||||||
)}</mwc-button
|
|
||||||
>
|
>
|
||||||
|
</ha-checkbox>
|
||||||
|
</ha-formfield>
|
||||||
|
<mwc-button @click=${this._refreshTopology}>
|
||||||
|
${this.hass!.localize(
|
||||||
|
"ui.panel.config.zha.visualization.refresh_topology"
|
||||||
|
)}
|
||||||
|
</mwc-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="visualization"></div>
|
<div id="visualization"></div>
|
||||||
</hass-tabs-subpage>
|
</hass-tabs-subpage>
|
||||||
@ -352,30 +382,23 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
|||||||
return [
|
return [
|
||||||
css`
|
css`
|
||||||
.header {
|
.header {
|
||||||
font-family: var(--paper-font-display1_-_font-family);
|
border-bottom: 1px solid var(--divider-color);
|
||||||
-webkit-font-smoothing: var(
|
padding: 0 8px;
|
||||||
--paper-font-display1_-_-webkit-font-smoothing
|
|
||||||
);
|
|
||||||
font-size: var(--paper-font-display1_-_font-size);
|
|
||||||
font-weight: var(--paper-font-display1_-_font-weight);
|
|
||||||
letter-spacing: var(--paper-font-display1_-_letter-spacing);
|
|
||||||
line-height: var(--paper-font-display1_-_line-height);
|
|
||||||
opacity: var(--dark-primary-opacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-header {
|
|
||||||
border-bottom: 1px solid --divider-color;
|
|
||||||
padding: 0 16px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
flex-direction: row;
|
justify-content: space-between;
|
||||||
height: var(--header-height);
|
height: var(--header-height);
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
:host([narrow]) .table-header {
|
.header > * {
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:host([narrow]) .header {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
height: var(--header-height) * 3;
|
height: var(--header-height) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-toolbar {
|
.search-toolbar {
|
||||||
@ -386,34 +409,34 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
search-input {
|
search-input {
|
||||||
position: relative;
|
|
||||||
top: 2px;
|
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
:host(:not([narrow])) search-input {
|
|
||||||
margin: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
search-input.header {
|
search-input.header {
|
||||||
left: -8px;
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
top: -2px;
|
||||||
|
color: var(--secondary-text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
ha-device-picker {
|
ha-device-picker {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
position: relative;
|
||||||
|
top: -4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:host(:not([narrow])) ha-device-picker {
|
.controls {
|
||||||
margin: 5px;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
mwc-button {
|
#visualization {
|
||||||
font-weight: 500;
|
height: calc(100% - var(--header-height));
|
||||||
color: var(--primary-color);
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
:host([narrow]) #visualization {
|
||||||
:host(:not([narrow])) mwc-button {
|
height: calc(100% - (var(--header-height) * 2));
|
||||||
margin: 5px;
|
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
];
|
];
|
||||||
|
106
src/panels/profile/ha-long-lived-access-token-dialog.ts
Normal file
106
src/panels/profile/ha-long-lived-access-token-dialog.ts
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
import "@material/mwc-button";
|
||||||
|
import "@polymer/paper-input/paper-input";
|
||||||
|
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||||
|
import { customElement, property, state } from "lit/decorators";
|
||||||
|
import { fireEvent } from "../../common/dom/fire_event";
|
||||||
|
import { createCloseHeading } from "../../components/ha-dialog";
|
||||||
|
import { haStyleDialog } from "../../resources/styles";
|
||||||
|
import type { HomeAssistant } from "../../types";
|
||||||
|
import { LongLivedAccessTokenDialogParams } from "./show-long-lived-access-token-dialog";
|
||||||
|
|
||||||
|
const QR_LOGO_URL = "/static/icons/favicon-192x192.png";
|
||||||
|
|
||||||
|
@customElement("ha-long-lived-access-token-dialog")
|
||||||
|
export class HaLongLivedAccessTokenDialog extends LitElement {
|
||||||
|
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||||
|
|
||||||
|
@state() private _params?: LongLivedAccessTokenDialogParams;
|
||||||
|
|
||||||
|
@state() private _qrCode?: TemplateResult;
|
||||||
|
|
||||||
|
public showDialog(params: LongLivedAccessTokenDialogParams): void {
|
||||||
|
this._params = params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public closeDialog() {
|
||||||
|
this._params = undefined;
|
||||||
|
this._qrCode = undefined;
|
||||||
|
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected render(): TemplateResult {
|
||||||
|
if (!this._params || !this._params.token) {
|
||||||
|
return html``;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<ha-dialog
|
||||||
|
open
|
||||||
|
hideActions
|
||||||
|
.heading=${createCloseHeading(this.hass, this._params.name)}
|
||||||
|
@closed=${this.closeDialog}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<paper-input
|
||||||
|
dialogInitialFocus
|
||||||
|
.value=${this._params.token}
|
||||||
|
.label=${this.hass.localize(
|
||||||
|
"ui.panel.profile.long_lived_access_tokens.prompt_copy_token"
|
||||||
|
)}
|
||||||
|
type="text"
|
||||||
|
></paper-input>
|
||||||
|
<div id="qr">
|
||||||
|
${this._qrCode
|
||||||
|
? this._qrCode
|
||||||
|
: html`
|
||||||
|
<mwc-button @click=${this._generateQR}>
|
||||||
|
Generate QR code
|
||||||
|
</mwc-button>
|
||||||
|
`}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ha-dialog>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async _generateQR() {
|
||||||
|
const qrcode = await import("qrcode");
|
||||||
|
const canvas = await qrcode.toCanvas(this._params?.token, {
|
||||||
|
width: 180,
|
||||||
|
errorCorrectionLevel: "Q",
|
||||||
|
});
|
||||||
|
const context = canvas.getContext("2d");
|
||||||
|
|
||||||
|
const imageObj = new Image();
|
||||||
|
imageObj.src = QR_LOGO_URL;
|
||||||
|
await new Promise((resolve) => {
|
||||||
|
imageObj.onload = resolve;
|
||||||
|
});
|
||||||
|
context.drawImage(
|
||||||
|
imageObj,
|
||||||
|
canvas.width / 3,
|
||||||
|
canvas.height / 3,
|
||||||
|
canvas.width / 3,
|
||||||
|
canvas.height / 3
|
||||||
|
);
|
||||||
|
|
||||||
|
this._qrCode = html`<img src=${canvas.toDataURL()}></img>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
static get styles(): CSSResultGroup {
|
||||||
|
return [
|
||||||
|
haStyleDialog,
|
||||||
|
css`
|
||||||
|
#qr {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
"ha-long-lived-access-token-dialog": HaLongLivedAccessTokenDialog;
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,7 @@ import {
|
|||||||
import { haStyle } from "../../resources/styles";
|
import { haStyle } from "../../resources/styles";
|
||||||
import "../../styles/polymer-ha-style";
|
import "../../styles/polymer-ha-style";
|
||||||
import { HomeAssistant } from "../../types";
|
import { HomeAssistant } from "../../types";
|
||||||
|
import { showLongLivedAccessTokenDialog } from "./show-long-lived-access-token-dialog";
|
||||||
|
|
||||||
@customElement("ha-long-lived-access-tokens-card")
|
@customElement("ha-long-lived-access-tokens-card")
|
||||||
class HaLongLivedTokens extends LitElement {
|
class HaLongLivedTokens extends LitElement {
|
||||||
@ -118,13 +119,7 @@ class HaLongLivedTokens extends LitElement {
|
|||||||
client_name: name,
|
client_name: name,
|
||||||
});
|
});
|
||||||
|
|
||||||
showPromptDialog(this, {
|
showLongLivedAccessTokenDialog(this, { token, name });
|
||||||
title: name,
|
|
||||||
text: this.hass.localize(
|
|
||||||
"ui.panel.profile.long_lived_access_tokens.prompt_copy_token"
|
|
||||||
),
|
|
||||||
defaultValue: token,
|
|
||||||
});
|
|
||||||
|
|
||||||
fireEvent(this, "hass-refresh-tokens");
|
fireEvent(this, "hass-refresh-tokens");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -36,7 +36,9 @@ export class HaPickThemeRow extends LitElement {
|
|||||||
const hasThemes =
|
const hasThemes =
|
||||||
this.hass.themes.themes && Object.keys(this.hass.themes.themes).length;
|
this.hass.themes.themes && Object.keys(this.hass.themes.themes).length;
|
||||||
const curTheme =
|
const curTheme =
|
||||||
this.hass.selectedTheme?.theme || this.hass.themes.default_theme;
|
this.hass.selectedTheme?.theme || this.hass.themes.darkMode
|
||||||
|
? this.hass.themes.default_dark_theme || this.hass.themes.default_theme
|
||||||
|
: this.hass.themes.default_theme;
|
||||||
|
|
||||||
const themeSettings = this.hass.selectedTheme;
|
const themeSettings = this.hass.selectedTheme;
|
||||||
|
|
||||||
|
17
src/panels/profile/show-long-lived-access-token-dialog.ts
Normal file
17
src/panels/profile/show-long-lived-access-token-dialog.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { fireEvent } from "../../common/dom/fire_event";
|
||||||
|
|
||||||
|
export interface LongLivedAccessTokenDialogParams {
|
||||||
|
token: string;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const showLongLivedAccessTokenDialog = (
|
||||||
|
element: HTMLElement,
|
||||||
|
longLivedAccessTokenDialogParams: LongLivedAccessTokenDialogParams
|
||||||
|
): void => {
|
||||||
|
fireEvent(element, "show-dialog", {
|
||||||
|
dialogTag: "ha-long-lived-access-token-dialog",
|
||||||
|
dialogImport: () => import("./ha-long-lived-access-token-dialog"),
|
||||||
|
dialogParams: longLivedAccessTokenDialogParams,
|
||||||
|
});
|
||||||
|
};
|
@ -1,10 +1,10 @@
|
|||||||
// For localize
|
// For localize
|
||||||
import "@formatjs/intl-getcanonicallocales/polyfill";
|
|
||||||
import "lit/polyfill-support";
|
|
||||||
import "core-js";
|
import "core-js";
|
||||||
|
import "regenerator-runtime/runtime";
|
||||||
|
import "lit/polyfill-support";
|
||||||
|
import "@formatjs/intl-getcanonicallocales/polyfill";
|
||||||
// To use comlink under ES5
|
// To use comlink under ES5
|
||||||
import "proxy-polyfill";
|
import "proxy-polyfill";
|
||||||
import "regenerator-runtime/runtime";
|
|
||||||
import "unfetch/polyfill";
|
import "unfetch/polyfill";
|
||||||
|
|
||||||
// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/append()/append().md
|
// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/append()/append().md
|
||||||
@ -32,3 +32,16 @@ import "unfetch/polyfill";
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
})([Element.prototype, Document.prototype, DocumentFragment.prototype]);
|
})([Element.prototype, Document.prototype, DocumentFragment.prototype]);
|
||||||
|
|
||||||
|
// Source: https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNames
|
||||||
|
if (Element.prototype.getAttributeNames === undefined) {
|
||||||
|
Element.prototype.getAttributeNames = function () {
|
||||||
|
const attributes = this.attributes;
|
||||||
|
const length = attributes.length;
|
||||||
|
const result = new Array(length);
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
result[i] = attributes[i].name;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -3813,6 +3813,8 @@
|
|||||||
"faq_link": "[%key:ui::panel::my::faq_link%]",
|
"faq_link": "[%key:ui::panel::my::faq_link%]",
|
||||||
"error": "[%key:ui::panel::my::error%]",
|
"error": "[%key:ui::panel::my::error%]",
|
||||||
"error_addon_not_found": "Add-on not found",
|
"error_addon_not_found": "Add-on not found",
|
||||||
|
"error_addon_not_started": "The requested add-on are not running. Please start it first",
|
||||||
|
"error_addon_not_installed": "The requested add-on is not installed. Please install it first",
|
||||||
"error_addon_no_ingress": "The requested add-on does not support ingress"
|
"error_addon_no_ingress": "The requested add-on does not support ingress"
|
||||||
},
|
},
|
||||||
"system": {
|
"system": {
|
||||||
|
@ -929,8 +929,11 @@
|
|||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "Si es desactiva, les entitats descobertes recentment per a {integration} no s'afegiran automàticament a Home Assistant.",
|
"enable_new_entities_description": "Si està activat, les noves entitats descobertes per {integration} s'afegiran automàticament a Home Assistant.",
|
||||||
"enable_new_entities_label": "Activa entitats afegides recentment.",
|
"enable_new_entities_label": "Activa entitats afegides recentment.",
|
||||||
|
"enable_polling_description": "Si Home Assistant ha de sondejar automàticament {integration} per obtenir actualitzacions de les entitats.",
|
||||||
|
"enable_polling_label": "Activa el sondeig per obtenir actualitzacions.",
|
||||||
|
"restart_home_assistant": "Has de reiniciar Home Assistant per aplicar els canvis.",
|
||||||
"title": "Opcions del sistema per a {integration}",
|
"title": "Opcions del sistema per a {integration}",
|
||||||
"update": "Actualitza"
|
"update": "Actualitza"
|
||||||
},
|
},
|
||||||
@ -1388,7 +1391,7 @@
|
|||||||
"type_select": "Tipus de repetició",
|
"type_select": "Tipus de repetició",
|
||||||
"type": {
|
"type": {
|
||||||
"count": {
|
"count": {
|
||||||
"label": "Compta"
|
"label": "Comptador"
|
||||||
},
|
},
|
||||||
"until": {
|
"until": {
|
||||||
"conditions": "Condicions de \"Fins que\"",
|
"conditions": "Condicions de \"Fins que\"",
|
||||||
@ -1540,7 +1543,7 @@
|
|||||||
"delete_confirm": "Segur que vols eliminar-ho?",
|
"delete_confirm": "Segur que vols eliminar-ho?",
|
||||||
"duplicate": "Duplica",
|
"duplicate": "Duplica",
|
||||||
"header": "Disparadors",
|
"header": "Disparadors",
|
||||||
"introduction": "Els activadors són les regles que fan que es dispari una automatització. Pots definir més d'un activador per a cada automatització. Una vegada s'iniciï un activador, Home Assistant validarà les condicions (si n'hi ha) i finalment cridarà l'acció.",
|
"introduction": "Els disparadors són les regles que fan que s'executi una automatització. Pots definir més d'un disparador per a cada automatització. Una vegada salti un disparador, Home Assistant validarà les condicions (si n'hi ha) i finalment cridarà l'acció.",
|
||||||
"learn_more": "Més informació sobre els activadors",
|
"learn_more": "Més informació sobre els activadors",
|
||||||
"name": "Disparador",
|
"name": "Disparador",
|
||||||
"type_select": "Tipus de disparador",
|
"type_select": "Tipus de disparador",
|
||||||
@ -2073,7 +2076,8 @@
|
|||||||
"scripts": "Programes (scripts)",
|
"scripts": "Programes (scripts)",
|
||||||
"unknown_error": "Error desconegut",
|
"unknown_error": "Error desconegut",
|
||||||
"unnamed_device": "Dispositiu sense nom",
|
"unnamed_device": "Dispositiu sense nom",
|
||||||
"update": "Actualitza"
|
"update": "Actualitza",
|
||||||
|
"update_device_error": "No s'ha pogut actualitzar el dispositiu"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "Entitats",
|
"caption": "Entitats",
|
||||||
@ -2206,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "Depèn del núvol",
|
"depends_on_cloud": "Depèn del núvol",
|
||||||
"device_unavailable": "Dispositiu no disponible",
|
"device_unavailable": "Dispositiu no disponible",
|
||||||
"devices": "{count} {count, plural,\n one {dispositiu}\n other {dispositius}\n}",
|
"devices": "{count} {count, plural,\n one {dispositiu}\n other {dispositius}\n}",
|
||||||
|
"disable_error": "S'ha produït un error en activar o desactivar la integració",
|
||||||
"disable_restart_confirm": "Reinicia Home Assistant per acabar de desactivar aquesta integració",
|
"disable_restart_confirm": "Reinicia Home Assistant per acabar de desactivar aquesta integració",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "Estàs segur que vols desactivar aquesta entrada de configuració? Els seus dispositius i entitats es desactivaran.",
|
"disable_confirm": "Estàs segur que vols desactivar aquesta entrada de configuració? Els seus dispositius i entitats es desactivaran.",
|
||||||
@ -2217,6 +2222,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "Desactivada per {cause}"
|
"disabled_cause": "Desactivada per {cause}"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "Sondeig automàtic per l'obtenció de dades actualitzades desactivat",
|
||||||
"documentation": "Documentació",
|
"documentation": "Documentació",
|
||||||
"enable_restart_confirm": "Reinicia Home Assistant per acabar d'activar aquesta integració",
|
"enable_restart_confirm": "Reinicia Home Assistant per acabar d'activar aquesta integració",
|
||||||
"entities": "{count} {count, plural,\n one {entitat}\n other {entitats}\n}",
|
"entities": "{count} {count, plural,\n one {entitat}\n other {entitats}\n}",
|
||||||
|
@ -2076,7 +2076,8 @@
|
|||||||
"scripts": "Scripts",
|
"scripts": "Scripts",
|
||||||
"unknown_error": "Unknown error",
|
"unknown_error": "Unknown error",
|
||||||
"unnamed_device": "Unnamed device",
|
"unnamed_device": "Unnamed device",
|
||||||
"update": "Update"
|
"update": "Update",
|
||||||
|
"update_device_error": "Updating the device failed"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "Entities",
|
"caption": "Entities",
|
||||||
@ -2209,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "Depends on the cloud",
|
"depends_on_cloud": "Depends on the cloud",
|
||||||
"device_unavailable": "Device unavailable",
|
"device_unavailable": "Device unavailable",
|
||||||
"devices": "{count} {count, plural,\n one {device}\n other {devices}\n}",
|
"devices": "{count} {count, plural,\n one {device}\n other {devices}\n}",
|
||||||
|
"disable_error": "Enabling or disabling of the integration failed",
|
||||||
"disable_restart_confirm": "Restart Home Assistant to finish disabling this integration",
|
"disable_restart_confirm": "Restart Home Assistant to finish disabling this integration",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "Are you sure you want to disable this config entry? Its devices and entities will be disabled.",
|
"disable_confirm": "Are you sure you want to disable this config entry? Its devices and entities will be disabled.",
|
||||||
|
@ -929,8 +929,11 @@
|
|||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "Si está deshabilitada, las nuevas entidades que se descubran para {integration} no se añadirán automáticamente a Home Assistant.",
|
"enable_new_entities_description": "Si los dispositivos recién descubiertos para {integration} deberían agregarse automáticamente.",
|
||||||
"enable_new_entities_label": "Habilitar entidades recién añadidas.",
|
"enable_new_entities_label": "Habilitar entidades recién añadidas.",
|
||||||
|
"enable_polling_description": "Si Home Assistant debería sondear automáticamente las entidades de {integration} para obtener actualizaciones.",
|
||||||
|
"enable_polling_label": "Habilitar el sondeo de actualizaciones.",
|
||||||
|
"restart_home_assistant": "Debes reiniciar Home Assistant para que los cambios surtan efecto.",
|
||||||
"title": "Opciones del sistema para {integration}",
|
"title": "Opciones del sistema para {integration}",
|
||||||
"update": "Actualizar"
|
"update": "Actualizar"
|
||||||
},
|
},
|
||||||
@ -2073,7 +2076,8 @@
|
|||||||
"scripts": "Scripts",
|
"scripts": "Scripts",
|
||||||
"unknown_error": "Error desconocido",
|
"unknown_error": "Error desconocido",
|
||||||
"unnamed_device": "Dispositivo sin nombre",
|
"unnamed_device": "Dispositivo sin nombre",
|
||||||
"update": "Actualizar"
|
"update": "Actualizar",
|
||||||
|
"update_device_error": "Error al actualizar el dispositivo"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "Entidades",
|
"caption": "Entidades",
|
||||||
@ -2206,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "Depende de la nube",
|
"depends_on_cloud": "Depende de la nube",
|
||||||
"device_unavailable": "Dispositivo no disponible",
|
"device_unavailable": "Dispositivo no disponible",
|
||||||
"devices": "{count} {count, plural,\n one {dispositivo}\n other {dispositivos}\n}",
|
"devices": "{count} {count, plural,\n one {dispositivo}\n other {dispositivos}\n}",
|
||||||
|
"disable_error": "Error al habilitar o deshabilitar la integración",
|
||||||
"disable_restart_confirm": "Reinicia Home Assistant para terminar de deshabilitar esta integración",
|
"disable_restart_confirm": "Reinicia Home Assistant para terminar de deshabilitar esta integración",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "¿Estás seguro de que deseas deshabilitar esta entrada de configuración? Sus dispositivos y entidades estarán deshabilitados.",
|
"disable_confirm": "¿Estás seguro de que deseas deshabilitar esta entrada de configuración? Sus dispositivos y entidades estarán deshabilitados.",
|
||||||
@ -2217,6 +2222,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "Deshabilitada por {cause}"
|
"disabled_cause": "Deshabilitada por {cause}"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "Sondeo automático para datos actualizados deshabilitado",
|
||||||
"documentation": "Documentación",
|
"documentation": "Documentación",
|
||||||
"enable_restart_confirm": "Reinicia Home Assistant para terminar de habilitar esta integración",
|
"enable_restart_confirm": "Reinicia Home Assistant para terminar de habilitar esta integración",
|
||||||
"entities": "{count} {count, plural,\n one {entidad}\n other {entidades}\n}",
|
"entities": "{count} {count, plural,\n one {entidad}\n other {entidades}\n}",
|
||||||
|
@ -929,8 +929,11 @@
|
|||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "Kui see on keelatud ei lisata äsja avastatud sidumise {integration} olemeid automaatselt Home Assistant'i.",
|
"enable_new_entities_description": "Kas lisada äsja avastatud sidumise {integration} olemed automaatselt Home Assistant'i.",
|
||||||
"enable_new_entities_label": "Luba äsja lisatud olemid.",
|
"enable_new_entities_label": "Luba äsja lisatud olemid.",
|
||||||
|
"enable_polling_description": "Kas Home Assistant peaks automaatselt küsitlema {integration} üksusi uuenduste saamiseks.",
|
||||||
|
"enable_polling_label": "Luba värskenduste jaoks küsitlus.",
|
||||||
|
"restart_home_assistant": "Muudatuste jõustumiseks pead Home Assistanti taaskäivitama.",
|
||||||
"title": "Süsteemi valikud {integration} jaoks",
|
"title": "Süsteemi valikud {integration} jaoks",
|
||||||
"update": "Uuenda"
|
"update": "Uuenda"
|
||||||
},
|
},
|
||||||
@ -2073,7 +2076,8 @@
|
|||||||
"scripts": "Skriptid",
|
"scripts": "Skriptid",
|
||||||
"unknown_error": "Tundmatu viga",
|
"unknown_error": "Tundmatu viga",
|
||||||
"unnamed_device": "Nimetu seade",
|
"unnamed_device": "Nimetu seade",
|
||||||
"update": "Uuenda"
|
"update": "Uuenda",
|
||||||
|
"update_device_error": "Seadme värskendamine nurjus"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "Olemite register",
|
"caption": "Olemite register",
|
||||||
@ -2206,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "Sõltub pilveteenusest",
|
"depends_on_cloud": "Sõltub pilveteenusest",
|
||||||
"device_unavailable": "Seade pole saadaval",
|
"device_unavailable": "Seade pole saadaval",
|
||||||
"devices": "{count} {count, plural,\n one {seade}\n other {seadet}\n}",
|
"devices": "{count} {count, plural,\n one {seade}\n other {seadet}\n}",
|
||||||
|
"disable_error": "Sidumise lubamine või keelamine nurjus",
|
||||||
"disable_restart_confirm": "Taaskäivita Home Assistant, et lõpetada selle sidumise keelamine",
|
"disable_restart_confirm": "Taaskäivita Home Assistant, et lõpetada selle sidumise keelamine",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "Kas soovid selle seadistuskirje kindlasti keelata? Selle seadmed ja üksused keelatakse.",
|
"disable_confirm": "Kas soovid selle seadistuskirje kindlasti keelata? Selle seadmed ja üksused keelatakse.",
|
||||||
@ -2217,6 +2222,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "Keelatud {cause} põhjusel"
|
"disabled_cause": "Keelatud {cause} põhjusel"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "Uuendatud andmete automaatne päring on välja lülitatud",
|
||||||
"documentation": "Vaata dokumentatsiooni",
|
"documentation": "Vaata dokumentatsiooni",
|
||||||
"enable_restart_confirm": "Selle sidumise lubamise lõpetamiseks taaskäivita Home Assistant",
|
"enable_restart_confirm": "Selle sidumise lubamise lõpetamiseks taaskäivita Home Assistant",
|
||||||
"entities": "{count} {count, plural,\n one {olem}\n other{olemit}\n}",
|
"entities": "{count} {count, plural,\n one {olem}\n other{olemit}\n}",
|
||||||
|
@ -931,6 +931,9 @@
|
|||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "Se disabilitato, le entità appena rilevate per {integration} non verranno automaticamente aggiunte a Home Assistant.",
|
"enable_new_entities_description": "Se disabilitato, le entità appena rilevate per {integration} non verranno automaticamente aggiunte a Home Assistant.",
|
||||||
"enable_new_entities_label": "Abilita nuove entità aggiunte.",
|
"enable_new_entities_label": "Abilita nuove entità aggiunte.",
|
||||||
|
"enable_polling_description": "Se disabilitato, Home Assistant non richiederà più in automatico aggiornamenti alle entità dell'integrazione {integration}.",
|
||||||
|
"enable_polling_label": "Abilita il polling per gli aggiornamenti.",
|
||||||
|
"restart_home_assistant": "È necessario riavviare Home Assistant affinché le modifiche abbiano effetto.",
|
||||||
"title": "Opzioni di sistema per {integration}",
|
"title": "Opzioni di sistema per {integration}",
|
||||||
"update": "Aggiorna"
|
"update": "Aggiorna"
|
||||||
},
|
},
|
||||||
@ -2215,8 +2218,9 @@
|
|||||||
"integration": "Integrazione",
|
"integration": "Integrazione",
|
||||||
"user": "utente"
|
"user": "utente"
|
||||||
},
|
},
|
||||||
"disabled_cause": "Disabilitato da {causa}"
|
"disabled_cause": "Disabilitato da {cause}"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "Polling automatico per i dati aggiornati disabilitato",
|
||||||
"documentation": "Documentazione",
|
"documentation": "Documentazione",
|
||||||
"enable_restart_confirm": "Riavvia Home Assistant per completare l'attivazione di questa integrazione",
|
"enable_restart_confirm": "Riavvia Home Assistant per completare l'attivazione di questa integrazione",
|
||||||
"entities": "{count} {count, plural, \none {entità}\nother {entità }\n}",
|
"entities": "{count} {count, plural, \none {entità}\nother {entità }\n}",
|
||||||
|
@ -929,8 +929,11 @@
|
|||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "Hvis den er deaktivert, blir ikke nyoppdagede entiteter for {integration} automatisk lagt til i Home Assistant.",
|
"enable_new_entities_description": "Hvis nylig oppdagede enheter for {integration} skal legges til automatisk.",
|
||||||
"enable_new_entities_label": "Aktiver entiteter som nylig er lagt til.",
|
"enable_new_entities_label": "Aktiver entiteter som nylig er lagt til.",
|
||||||
|
"enable_polling_description": "Hvis Home Assistant automatisk skal avstemme {integration} enheter for oppdateringer.",
|
||||||
|
"enable_polling_label": "Aktiver avstemning for oppdateringer.",
|
||||||
|
"restart_home_assistant": "Du må starte Home Assistant på nytt for at endringene skal tre i kraft.",
|
||||||
"title": "Systemalternativer for {integration}",
|
"title": "Systemalternativer for {integration}",
|
||||||
"update": "Oppdater"
|
"update": "Oppdater"
|
||||||
},
|
},
|
||||||
@ -2073,7 +2076,8 @@
|
|||||||
"scripts": "Skript",
|
"scripts": "Skript",
|
||||||
"unknown_error": "Ukjent feil",
|
"unknown_error": "Ukjent feil",
|
||||||
"unnamed_device": "Enhet uten navn",
|
"unnamed_device": "Enhet uten navn",
|
||||||
"update": "Oppdater"
|
"update": "Oppdater",
|
||||||
|
"update_device_error": "Oppdatering av enheten mislyktes"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "Entiteter",
|
"caption": "Entiteter",
|
||||||
@ -2206,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "Avhenger av skyen",
|
"depends_on_cloud": "Avhenger av skyen",
|
||||||
"device_unavailable": "Enheten er utilgjengelig",
|
"device_unavailable": "Enheten er utilgjengelig",
|
||||||
"devices": "{count} {count, plural,\n one {enhet}\n other {enheter}\n}",
|
"devices": "{count} {count, plural,\n one {enhet}\n other {enheter}\n}",
|
||||||
|
"disable_error": "Aktivering eller deaktivering av integrasjonen mislyktes",
|
||||||
"disable_restart_confirm": "Start Home Assistant på nytt for å fullføre deaktiveringen av denne integreringen",
|
"disable_restart_confirm": "Start Home Assistant på nytt for å fullføre deaktiveringen av denne integreringen",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "Er du sikker på at du vil deaktivere denne config-oppføringen? Enhetene og enhetene deaktiveres.",
|
"disable_confirm": "Er du sikker på at du vil deaktivere denne config-oppføringen? Enhetene og enhetene deaktiveres.",
|
||||||
@ -2217,6 +2222,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "Deaktivert av {cause}"
|
"disabled_cause": "Deaktivert av {cause}"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "Automatisk avstemning for oppdaterte data deaktivert",
|
||||||
"documentation": "Dokumentasjon",
|
"documentation": "Dokumentasjon",
|
||||||
"enable_restart_confirm": "Start Home Assistant på nytt for å fullføre aktiveringen av denne integreringen",
|
"enable_restart_confirm": "Start Home Assistant på nytt for å fullføre aktiveringen av denne integreringen",
|
||||||
"entities": "{count} {count, plural,\n one {entitet}\n other {entiteter}\n}",
|
"entities": "{count} {count, plural,\n one {entitet}\n other {entiteter}\n}",
|
||||||
|
@ -931,6 +931,9 @@
|
|||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "Indien uitgeschakeld, worden nieuwe entiteiten van {integration} niet automatisch aan Home Assistant toegevoegd.",
|
"enable_new_entities_description": "Indien uitgeschakeld, worden nieuwe entiteiten van {integration} niet automatisch aan Home Assistant toegevoegd.",
|
||||||
"enable_new_entities_label": "Voeg nieuwe entiteiten automatisch toe",
|
"enable_new_entities_label": "Voeg nieuwe entiteiten automatisch toe",
|
||||||
|
"enable_polling_description": "Of Home Assistant automatisch moet pollen voor updates voor {integration} entiteiten",
|
||||||
|
"enable_polling_label": "Schakel polling voor updates in.",
|
||||||
|
"restart_home_assistant": "U moet Home Assistant opnieuw starten om uw wijzigingen door te voeren.",
|
||||||
"title": "Systeeminstellingen voor {integration}",
|
"title": "Systeeminstellingen voor {integration}",
|
||||||
"update": "Bijwerken"
|
"update": "Bijwerken"
|
||||||
},
|
},
|
||||||
@ -2217,6 +2220,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "Uitgeschakeld door {cause}"
|
"disabled_cause": "Uitgeschakeld door {cause}"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "Automatische polling voor bijgewerkte gegevens uitgeschakeld",
|
||||||
"documentation": "Documentatie",
|
"documentation": "Documentatie",
|
||||||
"enable_restart_confirm": "Start Home Assistant opnieuw op om het opzetten van deze integratie te voltooien",
|
"enable_restart_confirm": "Start Home Assistant opnieuw op om het opzetten van deze integratie te voltooien",
|
||||||
"entities": "{count} {count, plural,\n one {entiteit}\n other {entiteiten}\n}",
|
"entities": "{count} {count, plural,\n one {entiteit}\n other {entiteiten}\n}",
|
||||||
|
@ -394,7 +394,7 @@
|
|||||||
"failed_to_delete": "Не удалось удалить",
|
"failed_to_delete": "Не удалось удалить",
|
||||||
"folder": {
|
"folder": {
|
||||||
"addons/local": "Локальные дополнения",
|
"addons/local": "Локальные дополнения",
|
||||||
"homeassistant": "Home Assistant",
|
"homeassistant": "Home Assistant configuration",
|
||||||
"media": "Media",
|
"media": "Media",
|
||||||
"share": "Share",
|
"share": "Share",
|
||||||
"ssl": "SSL"
|
"ssl": "SSL"
|
||||||
@ -411,7 +411,7 @@
|
|||||||
"select_type": "Выберите что нужно восстановить",
|
"select_type": "Выберите что нужно восстановить",
|
||||||
"selected": "Выбрано: {number}",
|
"selected": "Выбрано: {number}",
|
||||||
"type": "Тип снимка",
|
"type": "Тип снимка",
|
||||||
"upload_snapshot": "Загрузить снимок"
|
"upload_snapshot": "Загрузить снимок на сервер"
|
||||||
},
|
},
|
||||||
"store": {
|
"store": {
|
||||||
"missing_addons": "Пропали дополнения? Активируйте расширенный режим на странице Вашего профиля пользователя",
|
"missing_addons": "Пропали дополнения? Активируйте расширенный режим на странице Вашего профиля пользователя",
|
||||||
@ -929,8 +929,11 @@
|
|||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "{integration} будет автоматически добавлять в Home Assistant вновь обнаруженные объекты",
|
"enable_new_entities_description": "Home Assistant будет автоматически добавлять новые обнаруженные устройства {integration}",
|
||||||
"enable_new_entities_label": "Добавлять новые объекты",
|
"enable_new_entities_label": "Добавлять новые объекты",
|
||||||
|
"enable_polling_description": "Home Assistant будет автоматически опрашивать объекты {integration} для получения обновлений",
|
||||||
|
"enable_polling_label": "Включить опрос для получения обновлений",
|
||||||
|
"restart_home_assistant": "Чтобы изменения вступили в силу, нужно перезапустить Home Assistant.",
|
||||||
"title": "{integration}",
|
"title": "{integration}",
|
||||||
"update": "Обновить"
|
"update": "Обновить"
|
||||||
},
|
},
|
||||||
@ -2073,7 +2076,8 @@
|
|||||||
"scripts": "Скрипты",
|
"scripts": "Скрипты",
|
||||||
"unknown_error": "Неизвестная ошибка.",
|
"unknown_error": "Неизвестная ошибка.",
|
||||||
"unnamed_device": "Устройство без названия",
|
"unnamed_device": "Устройство без названия",
|
||||||
"update": "Обновить"
|
"update": "Обновить",
|
||||||
|
"update_device_error": "Не удалось обновить устройство"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "Объекты",
|
"caption": "Объекты",
|
||||||
@ -2206,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "Зависит от облачных сервисов",
|
"depends_on_cloud": "Зависит от облачных сервисов",
|
||||||
"device_unavailable": "Устройство недоступно",
|
"device_unavailable": "Устройство недоступно",
|
||||||
"devices": "{count} {count, plural,\n one {устройство}\n few {устройства}\n many {устройств}\n other {устройств}\n}",
|
"devices": "{count} {count, plural,\n one {устройство}\n few {устройства}\n many {устройств}\n other {устройств}\n}",
|
||||||
|
"disable_error": "Не удалось активировать или деактивировать интеграцию",
|
||||||
"disable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить деактивацию этой интеграции.",
|
"disable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить деактивацию этой интеграции.",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "Вы уверены, что хотите деактивировать эту запись конфигурации? Её дочерние устройства и объекты будут также деактивированы.",
|
"disable_confirm": "Вы уверены, что хотите деактивировать эту запись конфигурации? Её дочерние устройства и объекты будут также деактивированы.",
|
||||||
@ -2217,6 +2222,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "Деактивировано {cause}"
|
"disabled_cause": "Деактивировано {cause}"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "Автоматический опрос для получения обновленных данных отключен",
|
||||||
"documentation": "Документация",
|
"documentation": "Документация",
|
||||||
"enable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить подключение этой интеграции.",
|
"enable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить подключение этой интеграции.",
|
||||||
"entities": "{count} {count, plural,\n one {объект}\n few {объекта}\n many {объектов}\n other {объектов}\n}",
|
"entities": "{count} {count, plural,\n one {объект}\n few {объекта}\n many {объектов}\n other {объектов}\n}",
|
||||||
|
@ -929,8 +929,11 @@
|
|||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "如果禁用,从 {integration} 新发现的实体将不会自动添加到 Home Assistant。",
|
"enable_new_entities_description": "是否将 {integration} 新发现的实体自动添加到 Home Assistant。",
|
||||||
"enable_new_entities_label": "启用新添加的实体。",
|
"enable_new_entities_label": "启用新添加的实体。",
|
||||||
|
"enable_polling_description": "是否让 Home Assistant 轮询 {integration} 的实体,以便更新其状态。",
|
||||||
|
"enable_polling_label": "启用轮询刷新。",
|
||||||
|
"restart_home_assistant": "需要重新启动 Home Assistant 才能使更改生效。",
|
||||||
"title": "{integration} 系统选项",
|
"title": "{integration} 系统选项",
|
||||||
"update": "更新"
|
"update": "更新"
|
||||||
},
|
},
|
||||||
@ -2073,7 +2076,8 @@
|
|||||||
"scripts": "脚本",
|
"scripts": "脚本",
|
||||||
"unknown_error": "未知错误",
|
"unknown_error": "未知错误",
|
||||||
"unnamed_device": "未命名设备",
|
"unnamed_device": "未命名设备",
|
||||||
"update": "更新"
|
"update": "更新",
|
||||||
|
"update_device_error": "更新设备失败"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "实体注册表",
|
"caption": "实体注册表",
|
||||||
@ -2115,7 +2119,7 @@
|
|||||||
"confirm_title": "您要删除这 {number} 个实体吗?"
|
"confirm_title": "您要删除这 {number} 个实体吗?"
|
||||||
},
|
},
|
||||||
"search": "搜索实体",
|
"search": "搜索实体",
|
||||||
"selected": "选择了 {number} 项",
|
"selected": "已选择 {number} 项",
|
||||||
"status": {
|
"status": {
|
||||||
"disabled": "已禁用",
|
"disabled": "已禁用",
|
||||||
"ok": "确定",
|
"ok": "确定",
|
||||||
@ -2206,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "依赖云端服务",
|
"depends_on_cloud": "依赖云端服务",
|
||||||
"device_unavailable": "设备不可用",
|
"device_unavailable": "设备不可用",
|
||||||
"devices": "{count} {count, plural,\n one {个设备}\n other {个设备}\n}",
|
"devices": "{count} {count, plural,\n one {个设备}\n other {个设备}\n}",
|
||||||
|
"disable_error": "启用/禁用集成失败",
|
||||||
"disable_restart_confirm": "重启 Home Assistant 以完成此集成的禁用",
|
"disable_restart_confirm": "重启 Home Assistant 以完成此集成的禁用",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "您确定要禁用此配置条目吗?其设备和实体也将被禁用。",
|
"disable_confirm": "您确定要禁用此配置条目吗?其设备和实体也将被禁用。",
|
||||||
@ -2217,6 +2222,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "通过{cause}禁用"
|
"disabled_cause": "通过{cause}禁用"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "自动轮询刷新数据已禁用",
|
||||||
"documentation": "文档",
|
"documentation": "文档",
|
||||||
"enable_restart_confirm": "重启 Home Assistant 以完成此集成的启用",
|
"enable_restart_confirm": "重启 Home Assistant 以完成此集成的启用",
|
||||||
"entities": "{count} {count, plural,\n one {个实体}\n other {个实体}\n}",
|
"entities": "{count} {count, plural,\n one {个实体}\n other {个实体}\n}",
|
||||||
|
@ -929,8 +929,11 @@
|
|||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"config_entry_system_options": {
|
"config_entry_system_options": {
|
||||||
"enable_new_entities_description": "關閉後,{integration} 新發現的實體將不會自動新增至 Home Assistant。",
|
"enable_new_entities_description": "關閉後,{integration} 新發現的實體將不會自動新增。",
|
||||||
"enable_new_entities_label": "啟用新增實體",
|
"enable_new_entities_label": "啟用新增實體",
|
||||||
|
"enable_polling_description": "是否讓 Home Assistant 自動輪詢 {integration} 實體以獲得更新。",
|
||||||
|
"enable_polling_label": "開啟自動輪詢更新。",
|
||||||
|
"restart_home_assistant": "需要重啟 Home Assistant 才能使變更生效。",
|
||||||
"title": "{integration} 系統選項",
|
"title": "{integration} 系統選項",
|
||||||
"update": "更新"
|
"update": "更新"
|
||||||
},
|
},
|
||||||
@ -2073,7 +2076,8 @@
|
|||||||
"scripts": "腳本",
|
"scripts": "腳本",
|
||||||
"unknown_error": "未知錯誤",
|
"unknown_error": "未知錯誤",
|
||||||
"unnamed_device": "未命名的裝置",
|
"unnamed_device": "未命名的裝置",
|
||||||
"update": "更新"
|
"update": "更新",
|
||||||
|
"update_device_error": "更新裝置失敗"
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
"caption": "實體",
|
"caption": "實體",
|
||||||
@ -2206,6 +2210,7 @@
|
|||||||
"depends_on_cloud": "跟隨雲服務",
|
"depends_on_cloud": "跟隨雲服務",
|
||||||
"device_unavailable": "裝置不可用",
|
"device_unavailable": "裝置不可用",
|
||||||
"devices": "{count} {count, plural,\n one {個裝置}\n other {個裝置}\n}",
|
"devices": "{count} {count, plural,\n one {個裝置}\n other {個裝置}\n}",
|
||||||
|
"disable_error": "開啟或關閉整合失敗",
|
||||||
"disable_restart_confirm": "重啟 Home Assistant 以完成整合關閉",
|
"disable_restart_confirm": "重啟 Home Assistant 以完成整合關閉",
|
||||||
"disable": {
|
"disable": {
|
||||||
"disable_confirm": "確定要關閉此設定實體?其裝置與實體將會關閉。",
|
"disable_confirm": "確定要關閉此設定實體?其裝置與實體將會關閉。",
|
||||||
@ -2217,6 +2222,7 @@
|
|||||||
},
|
},
|
||||||
"disabled_cause": "由 {cause} 關閉。"
|
"disabled_cause": "由 {cause} 關閉。"
|
||||||
},
|
},
|
||||||
|
"disabled_polling": "自動輪詢更新資料已關閉。",
|
||||||
"documentation": "相關文件",
|
"documentation": "相關文件",
|
||||||
"enable_restart_confirm": "重啟 Home Assistant 以完成整合開啟",
|
"enable_restart_confirm": "重啟 Home Assistant 以完成整合開啟",
|
||||||
"entities": "{count} {count, plural,\n one {個實體}\n other {個實體}\n}",
|
"entities": "{count} {count, plural,\n one {個實體}\n other {個實體}\n}",
|
||||||
|
@ -7462,10 +7462,10 @@ he@1.2.0, he@^1.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
||||||
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
|
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
|
||||||
|
|
||||||
hls.js@^1.0.4:
|
hls.js@^1.0.5:
|
||||||
version "1.0.4"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.0.4.tgz#1b191f0f49c992e5c22d4a648ac73630d13d3c2e"
|
resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.0.5.tgz#3879bcf5ebcd6cdc188279cf9c15a74ac773630c"
|
||||||
integrity sha512-sTea9L0ORE9u5dThUjEhDP4t9YzakEYRyMHEYQctaLZf2X9ihjmUbqKneExQWHXZz2cYQs5ihaKUe8QnrQDp7Q==
|
integrity sha512-G7euEVuzM2AMZ69OzpQikO0HDJTMReX8OMUJmGhgwcjyh2OSsL2mGiqbL+6aK6wmUJelUfIh+FLyH73udZVYKQ==
|
||||||
|
|
||||||
hmac-drbg@^1.0.1:
|
hmac-drbg@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user