diff --git a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts
index ff427aca5b..b54e18edd4 100755
--- a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts
+++ b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts
@@ -7,9 +7,9 @@ import {
CSSResult,
customElement,
html,
+ internalProperty,
LitElement,
property,
- internalProperty,
TemplateResult,
} from "lit-element";
import { createCloseHeading } from "../../../../src/components/ha-dialog";
@@ -19,6 +19,7 @@ import {
fetchHassioSnapshotInfo,
HassioSnapshotDetail,
} from "../../../../src/data/hassio/snapshot";
+import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box";
import { PolymerChangedEvent } from "../../../../src/polymer-types";
import { haStyleDialog } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
@@ -266,8 +267,12 @@ class HassioSnapshotDialog extends LitElement {
this._snapshotPassword = ev.detail.value;
}
- private _partialRestoreClicked() {
- if (!confirm("Are you sure you want to restore this snapshot?")) {
+ private async _partialRestoreClicked() {
+ if (
+ !(await showConfirmationDialog(this, {
+ title: "Are you sure you want partially to restore this snapshot?",
+ }))
+ ) {
return;
}
@@ -312,8 +317,13 @@ class HassioSnapshotDialog extends LitElement {
);
}
- private _fullRestoreClicked() {
- if (!confirm("Are you sure you want to restore this snapshot?")) {
+ private async _fullRestoreClicked() {
+ if (
+ !(await showConfirmationDialog(this, {
+ title:
+ "Are you sure you want to wipe your system and restore this snapshot?",
+ }))
+ ) {
return;
}
@@ -338,8 +348,12 @@ class HassioSnapshotDialog extends LitElement {
);
}
- private _deleteClicked() {
- if (!confirm("Are you sure you want to delete this snapshot?")) {
+ private async _deleteClicked() {
+ if (
+ !(await showConfirmationDialog(this, {
+ title: "Are you sure you want to delete this snapshot?",
+ }))
+ ) {
return;
}
diff --git a/package.json b/package.json
index f2fe5f1c72..5be452e00b 100644
--- a/package.json
+++ b/package.json
@@ -23,8 +23,11 @@
"license": "Apache-2.0",
"dependencies": {
"@formatjs/intl-pluralrules": "^1.5.8",
- "@fullcalendar/core": "^5.0.0-beta.2",
- "@fullcalendar/daygrid": "^5.0.0-beta.2",
+ "@fullcalendar/common": "5.1.0",
+ "@fullcalendar/core": "5.1.0",
+ "@fullcalendar/daygrid": "5.1.0",
+ "@fullcalendar/interaction": "5.1.0",
+ "@fullcalendar/list": "5.1.0",
"@material/chips": "=8.0.0-canary.096a7a066.0",
"@material/circular-progress": "=8.0.0-canary.a78ceb112.0",
"@material/mwc-button": "^0.18.0",
@@ -41,8 +44,8 @@
"@material/mwc-tab": "^0.18.0",
"@material/mwc-tab-bar": "^0.18.0",
"@material/top-app-bar": "=8.0.0-canary.096a7a066.0",
- "@mdi/js": "5.4.55",
- "@mdi/svg": "5.4.55",
+ "@mdi/js": "5.5.55",
+ "@mdi/svg": "5.5.55",
"@polymer/app-layout": "^3.0.2",
"@polymer/app-route": "^3.0.2",
"@polymer/app-storage": "^3.0.2",
@@ -146,7 +149,7 @@
"@types/leaflet-draw": "^1.0.1",
"@types/marked": "^1.1.0",
"@types/memoize-one": "4.1.0",
- "@types/mocha": "^5.2.6",
+ "@types/mocha": "^7.0.2",
"@types/resize-observer-browser": "^0.1.3",
"@types/webspeechapi": "^0.0.29",
"@typescript-eslint/eslint-plugin": "^2.28.0",
@@ -157,7 +160,7 @@
"eslint": "^6.8.0",
"eslint-config-airbnb-typescript": "^7.2.1",
"eslint-config-prettier": "^6.10.1",
- "eslint-import-resolver-webpack": "^0.12.1",
+ "eslint-import-resolver-webpack": "^0.12.2",
"eslint-plugin-disable": "^2.0.1",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-lit": "^1.2.0",
@@ -180,7 +183,7 @@
"magic-string": "^0.25.7",
"map-stream": "^0.0.7",
"merge-stream": "^1.0.1",
- "mocha": "^6.0.2",
+ "mocha": "^7.2.0",
"object-hash": "^2.0.3",
"open": "^7.0.4",
"prettier": "^2.0.4",
@@ -197,7 +200,7 @@
"systemjs": "^6.3.2",
"terser-webpack-plugin": "^3.0.6",
"ts-lit-plugin": "^1.2.0",
- "ts-mocha": "^6.0.0",
+ "ts-mocha": "^7.0.0",
"typescript": "^3.8.3",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
diff --git a/setup.py b/setup.py
index 2c255baf5d..901c39ac1d 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
- version="20200820.0",
+ version="20200824.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",
diff --git a/src/common/config/is_service_loaded.ts b/src/common/config/is_service_loaded.ts
new file mode 100644
index 0000000000..c8a7824a5a
--- /dev/null
+++ b/src/common/config/is_service_loaded.ts
@@ -0,0 +1,9 @@
+import { HomeAssistant } from "../../types";
+
+/** Return if a service is loaded. */
+export const isServiceLoaded = (
+ hass: HomeAssistant,
+ domain: string,
+ service: string
+): boolean =>
+ hass && domain in hass.services && service in hass.services[domain];
diff --git a/src/common/datetime/relative_time.ts b/src/common/datetime/relative_time.ts
index cc414b1e12..c2a761394b 100644
--- a/src/common/datetime/relative_time.ts
+++ b/src/common/datetime/relative_time.ts
@@ -21,6 +21,11 @@ export default function relativeTime(
const tense = delta >= 0 ? "past" : "future";
delta = Math.abs(delta);
let roundedDelta = Math.round(delta);
+
+ if (roundedDelta === 0) {
+ return localize("ui.components.relative_time.just_now");
+ }
+
let unit = "week";
for (let i = 0; i < tests.length; i++) {
diff --git a/src/common/entity/sensor_icon.ts b/src/common/entity/sensor_icon.ts
index 1ec97ff5d9..7c8d264027 100644
--- a/src/common/entity/sensor_icon.ts
+++ b/src/common/entity/sensor_icon.ts
@@ -5,12 +5,16 @@ import { domainIcon } from "./domain_icon";
import { batteryIcon } from "./battery_icon";
const fixedDeviceClassIcons = {
+ current: "hass:current-ac",
+ energy: "hass:flash",
humidity: "hass:water-percent",
illuminance: "hass:brightness-5",
temperature: "hass:thermometer",
pressure: "hass:gauge",
power: "hass:flash",
+ power_factor: "hass:angle-acute",
signal_strength: "hass:wifi",
+ voltage: "hass:sine-wave",
};
export const sensorIcon = (state: HassEntity) => {
diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts
index ba2bf0f35e..69c30633b6 100644
--- a/src/components/data-table/ha-data-table.ts
+++ b/src/components/data-table/ha-data-table.ts
@@ -3,19 +3,21 @@ import {
css,
CSSResult,
customElement,
+ eventOptions,
html,
+ internalProperty,
LitElement,
property,
- internalProperty,
PropertyValues,
query,
TemplateResult,
- eventOptions,
} from "lit-element";
import { classMap } from "lit-html/directives/class-map";
import { ifDefined } from "lit-html/directives/if-defined";
import { styleMap } from "lit-html/directives/style-map";
import { scroll } from "lit-virtualizer";
+import memoizeOne from "memoize-one";
+import { restoreScroll } from "../../common/decorators/restore-scroll";
import { fireEvent } from "../../common/dom/fire_event";
import "../../common/search/search-input";
import { debounce } from "../../common/util/debounce";
@@ -24,8 +26,6 @@ import "../ha-checkbox";
import type { HaCheckbox } from "../ha-checkbox";
import "../ha-icon";
import { filterData, sortData } from "./sort-filter";
-import memoizeOne from "memoize-one";
-import { restoreScroll } from "../../common/decorators/restore-scroll";
declare global {
// for fire event
diff --git a/src/components/entity/ha-chart-base.js b/src/components/entity/ha-chart-base.js
index 350ea82c68..7df570747c 100644
--- a/src/components/entity/ha-chart-base.js
+++ b/src/components/entity/ha-chart-base.js
@@ -1,12 +1,12 @@
/* eslint-plugin-disable lit */
import { IronResizableBehavior } from "@polymer/iron-resizable-behavior/iron-resizable-behavior";
-import "../ha-icon-button";
import { mixinBehaviors } from "@polymer/polymer/lib/legacy/class";
import { timeOut } from "@polymer/polymer/lib/utils/async";
import { Debouncer } from "@polymer/polymer/lib/utils/debounce";
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import { formatTime } from "../../common/datetime/format_time";
+import "../ha-icon-button";
// eslint-disable-next-line no-unused-vars
/* global Chart moment Color */
@@ -355,7 +355,7 @@ class HaChartBase extends mixinBehaviors(
return value;
}
const date = new Date(values[index].value);
- return formatTime(date);
+ return formatTime(date, this.hass.language);
}
drawChart() {
@@ -420,7 +420,7 @@ class HaChartBase extends mixinBehaviors(
},
};
options = Chart.helpers.merge(options, this.data.options);
- options.scales.xAxes[0].ticks.callback = this._formatTickValue;
+ options.scales.xAxes[0].ticks.callback = this._formatTickValue.bind(this);
if (this.data.type === "timeline") {
this.set("isTimeline", true);
if (this.data.colors !== undefined) {
diff --git a/src/components/ha-button-toggle-group.ts b/src/components/ha-button-toggle-group.ts
index a9ea972492..cae0562cf0 100644
--- a/src/components/ha-button-toggle-group.ts
+++ b/src/components/ha-button-toggle-group.ts
@@ -1,21 +1,20 @@
+import "@material/mwc-icon-button/mwc-icon-button";
import {
+ css,
+ CSSResult,
customElement,
html,
- TemplateResult,
- property,
LitElement,
- CSSResult,
- css,
+ property,
+ TemplateResult,
} from "lit-element";
-
-import "./ha-icon-button";
-
import { fireEvent } from "../common/dom/fire_event";
import type { ToggleButton } from "../types";
+import "./ha-svg-icon";
@customElement("ha-button-toggle-group")
export class HaButtonToggleGroup extends LitElement {
- @property() public buttons!: ToggleButton[];
+ @property({ attribute: false }) public buttons!: ToggleButton[];
@property() public active?: string;
@@ -23,21 +22,23 @@ export class HaButtonToggleGroup extends LitElement {
return html`
${this.buttons.map(
- (button) => html`
- `
+ (button) => html`
+
+
+
+ `
)}
`;
}
private _handleClick(ev): void {
- this.active = ev.target.value;
+ this.active = ev.currentTarget.value;
fireEvent(this, "value-changed", { value: this.active });
}
@@ -48,12 +49,13 @@ export class HaButtonToggleGroup extends LitElement {
--mdc-icon-button-size: var(--button-toggle-size, 36px);
--mdc-icon-size: var(--button-toggle-icon-size, 20px);
}
- ha-icon-button {
+ mwc-icon-button {
border: 1px solid var(--primary-color);
border-right-width: 0px;
position: relative;
+ cursor: pointer;
}
- ha-icon-button::before {
+ mwc-icon-button::before {
top: 0;
left: 0;
width: 100%;
@@ -65,22 +67,26 @@ export class HaButtonToggleGroup extends LitElement {
content: "";
transition: opacity 15ms linear, background-color 15ms linear;
}
- ha-icon-button[active]::before {
+ mwc-icon-button[active]::before {
opacity: var(--mdc-icon-button-ripple-opacity, 0.12);
}
- ha-icon-button:first-child {
+ mwc-icon-button:first-child {
border-radius: 4px 0 0 4px;
}
- ha-icon-button:last-child {
+ mwc-icon-button:last-child {
border-radius: 0 4px 4px 0;
border-right-width: 1px;
}
+ mwc-icon-button:only-child {
+ border-radius: 4px;
+ border-right-width: 1px;
+ }
`;
}
}
declare global {
interface HTMLElementTagNameMap {
- "ha-button-toggle-button": HaButtonToggleGroup;
+ "ha-button-toggle-group": HaButtonToggleGroup;
}
}
diff --git a/src/components/ha-camera-stream.ts b/src/components/ha-camera-stream.ts
index 61b3d89d96..e4eda4b3d8 100644
--- a/src/components/ha-camera-stream.ts
+++ b/src/components/ha-camera-stream.ts
@@ -12,6 +12,8 @@ import {
import { fireEvent } from "../common/dom/fire_event";
import { computeStateName } from "../common/entity/compute_state_name";
import { supportsFeature } from "../common/entity/supports-feature";
+import { nextRender } from "../common/util/render-status";
+import { getExternalConfig } from "../external_app/external_config";
import {
CAMERA_SUPPORT_STREAM,
computeMJPEGStreamUrl,
@@ -37,6 +39,8 @@ class HaCameraStream extends LitElement {
private _hlsPolyfillInstance?: Hls;
+ private _useExoPlayer = false;
+
public connectedCallback() {
super.connectedCallback();
this._attached = true;
@@ -125,22 +129,33 @@ class HaCameraStream extends LitElement {
return this.shadowRoot!.querySelector("video")!;
}
+ private async _getUseExoPlayer(): Promise {
+ if (!this.hass!.auth.external) {
+ return false;
+ }
+ const externalConfig = await getExternalConfig(this.hass!.auth.external);
+ return externalConfig && externalConfig.hasExoPlayer;
+ }
+
private async _startHls(): Promise {
// eslint-disable-next-line
- const Hls = ((await import(
- /* webpackChunkName: "hls.js" */ "hls.js"
- )) as any).default as HLSModule;
- let hlsSupported = Hls.isSupported();
+ let hls;
const videoEl = this._videoEl;
+ this._useExoPlayer = await this._getUseExoPlayer();
+ if (!this._useExoPlayer) {
+ hls = ((await import(/* webpackChunkName: "hls.js" */ "hls.js")) as any)
+ .default as HLSModule;
+ let hlsSupported = hls.isSupported();
- if (!hlsSupported) {
- hlsSupported =
- videoEl.canPlayType("application/vnd.apple.mpegurl") !== "";
- }
+ if (!hlsSupported) {
+ hlsSupported =
+ videoEl.canPlayType("application/vnd.apple.mpegurl") !== "";
+ }
- if (!hlsSupported) {
- this._forceMJPEG = this.stateObj!.entity_id;
- return;
+ if (!hlsSupported) {
+ this._forceMJPEG = this.stateObj!.entity_id;
+ return;
+ }
}
try {
@@ -149,8 +164,10 @@ class HaCameraStream extends LitElement {
this.stateObj!.entity_id
);
- if (Hls.isSupported()) {
- this._renderHLSPolyfill(videoEl, Hls, url);
+ if (this._useExoPlayer) {
+ this._renderHLSExoPlayer(url);
+ } else if (hls.isSupported()) {
+ this._renderHLSPolyfill(videoEl, hls, url);
} else {
this._renderHLSNative(videoEl, url);
}
@@ -163,6 +180,29 @@ class HaCameraStream extends LitElement {
}
}
+ private async _renderHLSExoPlayer(url: string) {
+ window.addEventListener("resize", this._resizeExoPlayer);
+ this.updateComplete.then(() => nextRender()).then(this._resizeExoPlayer);
+ this._videoEl.style.visibility = "hidden";
+ await this.hass!.auth.external!.sendMessage({
+ type: "exoplayer/play_hls",
+ payload: new URL(url, window.location.href).toString(),
+ });
+ }
+
+ private _resizeExoPlayer = () => {
+ const rect = this._videoEl.getBoundingClientRect();
+ this.hass!.auth.external!.fireMessage({
+ type: "exoplayer/resize",
+ payload: {
+ left: rect.left,
+ top: rect.top,
+ right: rect.right,
+ bottom: rect.bottom,
+ },
+ });
+ };
+
private async _renderHLSNative(videoEl: HTMLVideoElement, url: string) {
videoEl.src = url;
await new Promise((resolve) =>
@@ -194,11 +234,15 @@ class HaCameraStream extends LitElement {
fireEvent(this, "iron-resize");
}
- private _destroyPolyfill(): void {
+ private _destroyPolyfill() {
if (this._hlsPolyfillInstance) {
this._hlsPolyfillInstance.destroy();
this._hlsPolyfillInstance = undefined;
}
+ if (this._useExoPlayer) {
+ window.removeEventListener("resize", this._resizeExoPlayer);
+ this.hass!.auth.external!.fireMessage({ type: "exoplayer/stop" });
+ }
}
static get styles(): CSSResult {
diff --git a/src/components/ha-icon.ts b/src/components/ha-icon.ts
index 8eeac2e2d4..d7cb0dffae 100644
--- a/src/components/ha-icon.ts
+++ b/src/components/ha-icon.ts
@@ -106,6 +106,7 @@ const mdiRenameMapping = {
pot: "pot-steam",
ruby: "language-ruby",
sailing: "sail-boat",
+ scooter: "human-scooter",
settings: "cog",
"settings-box": "cog-box",
"settings-outline": "cog-outline",
diff --git a/src/components/map/ha-location-editor.ts b/src/components/map/ha-location-editor.ts
index a1775f1a58..9bfcf5e50e 100644
--- a/src/components/map/ha-location-editor.ts
+++ b/src/components/map/ha-location-editor.ts
@@ -21,8 +21,8 @@ import {
import { fireEvent } from "../../common/dom/fire_event";
import {
LeafletModuleType,
- setupLeafletMap,
replaceTileLayer,
+ setupLeafletMap,
} from "../../common/dom/setup-leaflet-map";
import { nextRender } from "../../common/util/render-status";
import { defaultRadiusColor } from "../../data/zone";
@@ -40,6 +40,8 @@ class LocationEditor extends LitElement {
@property() public icon?: string;
+ @property({ type: Boolean }) public darkMode?: boolean;
+
public fitZoom = 16;
private _iconEl?: DivIcon;
@@ -129,7 +131,7 @@ class LocationEditor extends LitElement {
private async _initMap(): Promise {
[this._leafletMap, this.Leaflet, this._tileLayer] = await setupLeafletMap(
this._mapEl,
- this.hass.themes?.darkMode,
+ this.darkMode ?? this.hass.themes?.darkMode,
Boolean(this.radius)
);
this._leafletMap.addEventListener(
diff --git a/src/components/media-player/dialog-media-player-browse.ts b/src/components/media-player/dialog-media-player-browse.ts
new file mode 100644
index 0000000000..c686f5ef94
--- /dev/null
+++ b/src/components/media-player/dialog-media-player-browse.ts
@@ -0,0 +1,115 @@
+import {
+ css,
+ CSSResultArray,
+ customElement,
+ html,
+ internalProperty,
+ LitElement,
+ property,
+ TemplateResult,
+} from "lit-element";
+import { HASSDomEvent } from "../../common/dom/fire_event";
+import type {
+ MediaPickedEvent,
+ MediaPlayerBrowseAction,
+} from "../../data/media-player";
+import { haStyleDialog } from "../../resources/styles";
+import type { HomeAssistant } from "../../types";
+import { createCloseHeading } from "../ha-dialog";
+import "./ha-media-player-browse";
+import { MediaPlayerBrowseDialogParams } from "./show-media-browser-dialog";
+
+@customElement("dialog-media-player-browse")
+class DialogMediaPlayerBrowse extends LitElement {
+ @property({ attribute: false }) public hass!: HomeAssistant;
+
+ @internalProperty() private _entityId!: string;
+
+ @internalProperty() private _mediaContentId?: string;
+
+ @internalProperty() private _mediaContentType?: string;
+
+ @internalProperty() private _action?: MediaPlayerBrowseAction;
+
+ @internalProperty() private _params?: MediaPlayerBrowseDialogParams;
+
+ public async showDialog(
+ params: MediaPlayerBrowseDialogParams
+ ): Promise {
+ this._params = params;
+ this._entityId = this._params.entityId;
+ this._mediaContentId = this._params.mediaContentId;
+ this._mediaContentType = this._params.mediaContentType;
+ this._action = this._params.action || "play";
+
+ await this.updateComplete;
+ }
+
+ protected render(): TemplateResult {
+ if (!this._params) {
+ return html``;
+ }
+
+ return html`
+
+
+
+ `;
+ }
+
+ private _closeDialog() {
+ this._params = undefined;
+ }
+
+ private _mediaPicked(ev: HASSDomEvent): void {
+ this._params!.mediaPickedCallback(ev.detail);
+ if (this._action !== "play") {
+ this._closeDialog();
+ }
+ }
+
+ static get styles(): CSSResultArray {
+ return [
+ haStyleDialog,
+ css`
+ ha-dialog {
+ --dialog-z-index: 8;
+ --dialog-content-padding: 0;
+ }
+
+ @media (min-width: 800px) {
+ ha-dialog {
+ --mdc-dialog-max-width: 800px;
+ }
+ ha-media-player-browse {
+ width: 700px;
+ padding: 20px 24px;
+ }
+ }
+ `,
+ ];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "dialog-media-player-browse": DialogMediaPlayerBrowse;
+ }
+}
diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts
new file mode 100644
index 0000000000..f6f2f08df3
--- /dev/null
+++ b/src/components/media-player/ha-media-player-browse.ts
@@ -0,0 +1,589 @@
+import "@material/mwc-button/mwc-button";
+import "@material/mwc-fab/mwc-fab";
+import "@material/mwc-list/mwc-list";
+import "@material/mwc-list/mwc-list-item";
+import { mdiArrowLeft, mdiFolder, mdiPlay, mdiPlus } from "@mdi/js";
+import "@polymer/paper-item/paper-item";
+import "@polymer/paper-listbox/paper-listbox";
+import {
+ css,
+ CSSResultArray,
+ customElement,
+ html,
+ internalProperty,
+ LitElement,
+ property,
+ PropertyValues,
+ TemplateResult,
+} from "lit-element";
+import memoizeOne from "memoize-one";
+import { fireEvent } from "../../common/dom/fire_event";
+import { debounce } from "../../common/util/debounce";
+import { browseMediaPlayer, MediaPickedEvent } from "../../data/media-player";
+import type { MediaPlayerItem } from "../../data/media-player";
+import { installResizeObserver } from "../../panels/lovelace/common/install-resize-observer";
+import { haStyle } from "../../resources/styles";
+import type { HomeAssistant } from "../../types";
+import "../entity/ha-entity-picker";
+import "../ha-button-menu";
+import "../ha-card";
+import "../ha-circular-progress";
+import "../ha-paper-dropdown-menu";
+import "../ha-svg-icon";
+
+declare global {
+ interface HASSDomEvents {
+ "media-picked": MediaPickedEvent;
+ }
+}
+
+@customElement("ha-media-player-browse")
+export class HaMediaPlayerBrowse extends LitElement {
+ @property({ attribute: false }) public hass!: HomeAssistant;
+
+ @property() public entityId!: string;
+
+ @property() public mediaContentId?: string;
+
+ @property() public mediaContentType?: string;
+
+ @property() public action: "pick" | "play" = "play";
+
+ @property({ type: Boolean, attribute: "narrow", reflect: true })
+ private _narrow = false;
+
+ @internalProperty() private _loading = false;
+
+ @internalProperty() private _mediaPlayerItems: MediaPlayerItem[] = [];
+
+ private _resizeObserver?: ResizeObserver;
+
+ public connectedCallback(): void {
+ super.connectedCallback();
+ this.updateComplete.then(() => this._attachObserver());
+ }
+
+ public disconnectedCallback(): void {
+ if (this._resizeObserver) {
+ this._resizeObserver.disconnect();
+ }
+ }
+
+ protected render(): TemplateResult {
+ if (!this._mediaPlayerItems.length) {
+ return html``;
+ }
+
+ if (this._loading) {
+ return html``;
+ }
+
+ const mostRecentItem = this._mediaPlayerItems[
+ this._mediaPlayerItems.length - 1
+ ];
+ const previousItem =
+ this._mediaPlayerItems.length > 1
+ ? this._mediaPlayerItems[this._mediaPlayerItems.length - 2]
+ : undefined;
+
+ const hasExpandableChildren:
+ | MediaPlayerItem
+ | undefined = this._hasExpandableChildren(mostRecentItem.children);
+
+ return html`
+
+
+ ${mostRecentItem.children?.length
+ ? hasExpandableChildren
+ ? html`
+
+ ${mostRecentItem.children?.length
+ ? html`
+ ${mostRecentItem.children.map(
+ (child) => html`
+
+
+
+ ${child.can_expand && !child.thumbnail
+ ? html`
+
+ `
+ : ""}
+
+ ${child.can_play
+ ? html`
+
+
+
+ `
+ : ""}
+
+
${child.title}
+
+ ${this.hass.localize(
+ `ui.components.media-browser.content-type.${child.media_content_type}`
+ )}
+
+
+ `
+ )}
+ `
+ : ""}
+
+ `
+ : html`
+
+ ${mostRecentItem.children.map(
+ (child) => html`
+ ${child.title}
+
+ `
+ )}
+
+ `
+ : this.hass.localize("ui.components.media-browser.no_items")}
+ `;
+ }
+
+ protected firstUpdated(): void {
+ this._measureCard();
+ this._attachObserver();
+ }
+
+ protected updated(changedProps: PropertyValues): void {
+ super.updated(changedProps);
+
+ if (
+ !changedProps.has("entityId") &&
+ !changedProps.has("mediaContentId") &&
+ !changedProps.has("mediaContentType") &&
+ !changedProps.has("action")
+ ) {
+ return;
+ }
+
+ this._fetchData(this.mediaContentId, this.mediaContentType).then(
+ (itemData) => {
+ this._mediaPlayerItems = [itemData];
+ }
+ );
+ }
+
+ private _actionClicked(ev: MouseEvent): void {
+ ev.stopPropagation();
+ const item = (ev.currentTarget as any).item;
+
+ this._runAction(item);
+ }
+
+ private _runAction(item: MediaPlayerItem): void {
+ fireEvent(this, "media-picked", {
+ media_content_id: item.media_content_id,
+ media_content_type: item.media_content_type,
+ });
+ }
+
+ private async _navigate(ev: MouseEvent): Promise {
+ const target = ev.currentTarget as any;
+ let item: MediaPlayerItem | undefined;
+
+ if (target.previous) {
+ this._mediaPlayerItems!.pop();
+ item = this._mediaPlayerItems!.pop();
+ }
+
+ item = target.item;
+
+ if (!item) {
+ return;
+ }
+
+ const itemData = await this._fetchData(
+ item.media_content_id,
+ item.media_content_type
+ );
+ this._mediaPlayerItems = [...this._mediaPlayerItems, itemData];
+ }
+
+ private async _fetchData(
+ mediaContentId?: string,
+ mediaContentType?: string
+ ): Promise {
+ const itemData = await browseMediaPlayer(
+ this.hass,
+ this.entityId,
+ !mediaContentId ? undefined : mediaContentId,
+ mediaContentType
+ );
+
+ return itemData;
+ }
+
+ private _measureCard(): void {
+ this._narrow = this.offsetWidth < 500;
+ }
+
+ private async _attachObserver(): Promise {
+ if (!this._resizeObserver) {
+ await installResizeObserver();
+ this._resizeObserver = new ResizeObserver(
+ debounce(() => this._measureCard(), 250, false)
+ );
+ }
+
+ this._resizeObserver.observe(this);
+ }
+
+ private _hasExpandableChildren = memoizeOne((children) =>
+ children.find((item: MediaPlayerItem) => item.can_expand)
+ );
+
+ static get styles(): CSSResultArray {
+ return [
+ haStyle,
+ css`
+ :host {
+ display: block;
+ }
+
+ .header {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ .breadcrumb-overflow {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ .header-content {
+ display: flex;
+ flex-wrap: wrap;
+ flex-grow: 1;
+ align-items: flex-start;
+ }
+
+ .header-content .img {
+ height: 200px;
+ width: 200px;
+ margin-right: 16px;
+ background-size: cover;
+ }
+
+ .header-info {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-self: stretch;
+ min-width: 0;
+ flex: 1;
+ }
+
+ .header-info .actions {
+ padding-top: 24px;
+ --mdc-theme-primary: var(--primary-color);
+ }
+
+ .breadcrumb {
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ flex-grow: 1;
+ }
+
+ .breadcrumb .title {
+ font-size: 48px;
+ line-height: 1.2;
+ font-weight: bold;
+ margin: 0;
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ }
+
+ .breadcrumb .previous-title {
+ font-size: 14px;
+ padding-bottom: 8px;
+ color: var(--secondary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ cursor: pointer;
+ --mdc-icon-size: 14px;
+ }
+
+ .breadcrumb .subtitle {
+ font-size: 16px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .divider {
+ padding: 10px 0;
+ }
+
+ .divider::before {
+ height: 1px;
+ display: block;
+ background-color: var(--divider-color);
+ content: " ";
+ }
+
+ /* ============= CHILDREN ============= */
+
+ mwc-list {
+ --mdc-list-vertical-padding: 0;
+ --mdc-theme-text-icon-on-background: var(--secondary-text-color);
+ border: 1px solid var(--divider-color);
+ border-radius: 4px;
+ }
+
+ mwc-list li:last-child {
+ display: none;
+ }
+
+ mwc-list li[divider] {
+ border-bottom-color: var(--divider-color);
+ }
+
+ .children {
+ display: grid;
+ grid-template-columns: repeat(
+ auto-fit,
+ minmax(var(--media-browse-item-size, 175px), 0.33fr)
+ );
+ grid-gap: 16px;
+ margin: 8px 0px;
+ }
+
+ .child {
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+ }
+
+ .ha-card-parent {
+ position: relative;
+ width: 100%;
+ }
+
+ ha-card {
+ width: 100%;
+ padding-bottom: 100%;
+ position: relative;
+ background-size: cover;
+ background-position: center;
+ }
+
+ .child .folder,
+ .child .play {
+ position: absolute;
+ }
+
+ .child .folder {
+ color: var(--secondary-text-color);
+ top: calc(50% - (var(--mdc-icon-size) / 2));
+ left: calc(50% - (var(--mdc-icon-size) / 2));
+ --mdc-icon-size: calc(var(--media-browse-item-size, 175px) * 0.4);
+ }
+
+ .child .play {
+ bottom: 4px;
+ right: 4px;
+ transition: all 0.5s;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-radius: 50%;
+ }
+
+ .child .play:hover {
+ color: var(--primary-color);
+ }
+
+ ha-card:hover {
+ opacity: 0.5;
+ }
+
+ .child .title {
+ font-size: 16px;
+ padding-top: 8px;
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ }
+
+ .child .type {
+ font-size: 12px;
+ color: var(--secondary-text-color);
+ }
+
+ /* ============= Narrow ============= */
+
+ :host([narrow]) {
+ padding: 0;
+ }
+
+ :host([narrow]) mwc-list {
+ border: 0;
+ }
+
+ :host([narrow]) .breadcrumb .title {
+ font-size: 38px;
+ }
+
+ :host([narrow]) .breadcrumb-overflow {
+ align-items: flex-end;
+ }
+
+ :host([narrow]) .header-content {
+ flex-direction: column;
+ flex-wrap: nowrap;
+ }
+
+ :host([narrow]) .header-content .img {
+ height: auto;
+ width: 100%;
+ margin-right: 0;
+ padding-bottom: 100%;
+ margin-bottom: 8px;
+ position: relative;
+ }
+
+ :host([narrow]) .header-content .img mwc-fab {
+ position: absolute;
+ --mdc-theme-secondary: var(--primary-color);
+ bottom: -20px;
+ right: 20px;
+ }
+
+ :host([narrow]) .header-info,
+ :host([narrow]) .media-source,
+ :host([narrow]) .children {
+ padding: 0 24px;
+ }
+
+ :host([narrow]) .children {
+ grid-template-columns: 1fr 1fr !important;
+ }
+ `,
+ ];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "ha-media-player-browse": HaMediaPlayerBrowse;
+ }
+}
diff --git a/src/components/media-player/show-media-browser-dialog.ts b/src/components/media-player/show-media-browser-dialog.ts
new file mode 100644
index 0000000000..7574cdf81d
--- /dev/null
+++ b/src/components/media-player/show-media-browser-dialog.ts
@@ -0,0 +1,27 @@
+import { fireEvent } from "../../common/dom/fire_event";
+import {
+ MediaPickedEvent,
+ MediaPlayerBrowseAction,
+} from "../../data/media-player";
+
+export interface MediaPlayerBrowseDialogParams {
+ action: MediaPlayerBrowseAction;
+ entityId: string;
+ mediaPickedCallback: (pickedMedia: MediaPickedEvent) => void;
+ mediaContentId?: string;
+ mediaContentType?: string;
+}
+
+export const showMediaBrowserDialog = (
+ element: HTMLElement,
+ dialogParams: MediaPlayerBrowseDialogParams
+): void => {
+ fireEvent(element, "show-dialog", {
+ dialogTag: "dialog-media-player-browse",
+ dialogImport: () =>
+ import(
+ /* webpackChunkName: "dialog-media-player-browse" */ "./dialog-media-player-browse"
+ ),
+ dialogParams,
+ });
+};
diff --git a/src/components/state-history-chart-line.js b/src/components/state-history-chart-line.js
index 3a857b8663..1b627e4206 100644
--- a/src/components/state-history-chart-line.js
+++ b/src/components/state-history-chart-line.js
@@ -19,6 +19,7 @@ class StateHistoryChartLine extends LocalizeMixin(PolymerElement) {
{
"POST",
"hassio/ingress/session"
);
- document.cookie = `ingress_session=${response.data.session};path=/api/hassio_ingress/;SameSite=Strict`;
+ document.cookie = `ingress_session=${
+ response.data.session
+ };path=/api/hassio_ingress/;SameSite=Strict${
+ location.protocol === "https:" ? ";Secure" : ""
+ }`;
};
export const setSupervisorOption = async (
diff --git a/src/data/logbook.ts b/src/data/logbook.ts
index fd79c87301..c1ff44b6fe 100644
--- a/src/data/logbook.ts
+++ b/src/data/logbook.ts
@@ -7,6 +7,12 @@ export interface LogbookEntry {
entity_id?: string;
domain: string;
context_user_id?: string;
+ context_event_type?: string;
+ context_domain?: string;
+ context_service?: string;
+ context_entity_id?: string;
+ context_entity_id_name?: string;
+ context_name?: string;
}
const DATA_CACHE: {
diff --git a/src/data/media-player.ts b/src/data/media-player.ts
index 71a2939716..0a3d289259 100644
--- a/src/data/media-player.ts
+++ b/src/data/media-player.ts
@@ -1,4 +1,5 @@
-import { HassEntity } from "home-assistant-js-websocket";
+import type { HassEntity } from "home-assistant-js-websocket";
+import type { HomeAssistant } from "../types";
export const SUPPORT_PAUSE = 1;
export const SUPPORT_SEEK = 2;
@@ -14,8 +15,16 @@ export const SUPPORT_SELECT_SOURCE = 2048;
export const SUPPORT_STOP = 4096;
export const SUPPORTS_PLAY = 16384;
export const SUPPORT_SELECT_SOUND_MODE = 65536;
+export const SUPPORT_BROWSE_MEDIA = 131072;
export const CONTRAST_RATIO = 4.5;
+export type MediaPlayerBrowseAction = "pick" | "play";
+
+export interface MediaPickedEvent {
+ media_content_id: string;
+ media_content_type: string;
+}
+
export interface MediaPlayerThumbnail {
content_type: string;
content: string;
@@ -26,6 +35,29 @@ export interface ControlButton {
action: string;
}
+export interface MediaPlayerItem {
+ title: string;
+ media_content_type: string;
+ media_content_id: string;
+ can_play: boolean;
+ can_expand: boolean;
+ thumbnail?: string;
+ children?: MediaPlayerItem[];
+}
+
+export const browseMediaPlayer = (
+ hass: HomeAssistant,
+ entityId: string,
+ mediaContentId?: string,
+ mediaContentType?: string
+): Promise =>
+ hass.callWS({
+ type: "media_player/browse_media",
+ entity_id: entityId,
+ media_content_id: mediaContentId,
+ media_content_type: mediaContentType,
+ });
+
export const getCurrentProgress = (stateObj: HassEntity): number => {
let progress = stateObj.attributes.media_position;
diff --git a/src/data/ozw.ts b/src/data/ozw.ts
index cbef2a8dbc..b24692c01f 100644
--- a/src/data/ozw.ts
+++ b/src/data/ozw.ts
@@ -39,6 +39,28 @@ export interface OZWDeviceMetaData {
ProductPicBase64: string;
}
+export interface OZWInstance {
+ ozw_instance: number;
+ OZWDaemon_Version: string;
+ OpenZWave_Version: string;
+ QTOpenZWave_Version: string;
+ Status: string;
+ getControllerPath: string;
+ homeID: string;
+}
+
+export interface OZWNetworkStatistics {
+ ozw_instance: number;
+ node_count: number;
+ readCnt: number;
+ writeCnt: number;
+ ACKCnt: number;
+ CANCnt: number;
+ NAKCnt: number;
+ dropped: number;
+ retries: number;
+}
+
export const nodeQueryStages = [
"ProtocolInfo",
"Probe",
@@ -59,6 +81,26 @@ export const nodeQueryStages = [
"Complete",
];
+export const networkOnlineStatuses = [
+ "driverAllNodesQueried",
+ "driverAllNodesQueriedSomeDead",
+ "driverAwakeNodesQueried",
+];
+export const networkStartingStatuses = [
+ "starting",
+ "started",
+ "Ready",
+ "driverReady",
+];
+export const networkOfflineStatuses = [
+ "Offline",
+ "stopped",
+ "driverFailed",
+ "driverReset",
+ "driverRemoved",
+ "driverAllNodesOnFire",
+];
+
export const getIdentifiersFromDevice = function (
device: DeviceRegistryEntry
): OZWNodeIdentifiers | undefined {
@@ -80,6 +122,31 @@ export const getIdentifiersFromDevice = function (
};
};
+export const fetchOZWInstances = (
+ hass: HomeAssistant
+): Promise =>
+ hass.callWS({
+ type: "ozw/get_instances",
+ });
+
+export const fetchOZWNetworkStatus = (
+ hass: HomeAssistant,
+ ozw_instance: number
+): Promise =>
+ hass.callWS({
+ type: "ozw/network_status",
+ ozw_instance: ozw_instance,
+ });
+
+export const fetchOZWNetworkStatistics = (
+ hass: HomeAssistant,
+ ozw_instance: number
+): Promise =>
+ hass.callWS({
+ type: "ozw/network_statistics",
+ ozw_instance: ozw_instance,
+ });
+
export const fetchOZWNodeStatus = (
hass: HomeAssistant,
ozw_instance: number,
diff --git a/src/data/panel.ts b/src/data/panel.ts
index 24e6e31627..eb205c65b0 100644
--- a/src/data/panel.ts
+++ b/src/data/panel.ts
@@ -17,7 +17,9 @@ export const setDefaultPanel = (
};
export const getDefaultPanel = (hass: HomeAssistant): PanelInfo =>
- hass.panels[hass.defaultPanel];
+ hass.panels[hass.defaultPanel]
+ ? hass.panels[hass.defaultPanel]
+ : hass.panels[DEFAULT_PANEL];
export const getPanelTitle = (hass: HomeAssistant): string | undefined => {
if (!hass.panels) {
diff --git a/src/dialogs/more-info/controls/more-info-media_player.ts b/src/dialogs/more-info/controls/more-info-media_player.ts
index efa96dec86..0bdcc97fd8 100644
--- a/src/dialogs/more-info/controls/more-info-media_player.ts
+++ b/src/dialogs/more-info/controls/more-info-media_player.ts
@@ -1,43 +1,45 @@
+import "@material/mwc-button/mwc-button";
+import "@polymer/paper-input/paper-input";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
-import "@polymer/paper-input/paper-input";
-
import {
css,
CSSResult,
+ customElement,
html,
LitElement,
property,
- TemplateResult,
- customElement,
query,
+ TemplateResult,
} from "lit-element";
-import { computeRTLDirection } from "../../../common/util/compute_rtl";
-import { HomeAssistant, MediaEntity } from "../../../types";
+import { isComponentLoaded } from "../../../common/config/is_component_loaded";
import { supportsFeature } from "../../../common/entity/supports-feature";
-import { UNAVAILABLE_STATES, UNAVAILABLE, UNKNOWN } from "../../../data/entity";
+import { computeRTLDirection } from "../../../common/util/compute_rtl";
+import "../../../components/ha-icon";
+import "../../../components/ha-icon-button";
+import "../../../components/ha-paper-dropdown-menu";
+import "../../../components/ha-slider";
+import { showMediaBrowserDialog } from "../../../components/media-player/show-media-browser-dialog";
+import { UNAVAILABLE, UNAVAILABLE_STATES, UNKNOWN } from "../../../data/entity";
import {
- SUPPORT_TURN_ON,
- SUPPORT_TURN_OFF,
+ ControlButton,
+ MediaPickedEvent,
SUPPORTS_PLAY,
- SUPPORT_PREVIOUS_TRACK,
- SUPPORT_PAUSE,
- SUPPORT_STOP,
+ SUPPORT_BROWSE_MEDIA,
SUPPORT_NEXT_TRACK,
+ SUPPORT_PAUSE,
+ SUPPORT_PLAY_MEDIA,
+ SUPPORT_PREVIOUS_TRACK,
+ SUPPORT_SELECT_SOUND_MODE,
+ SUPPORT_SELECT_SOURCE,
+ SUPPORT_STOP,
+ SUPPORT_TURN_OFF,
+ SUPPORT_TURN_ON,
+ SUPPORT_VOLUME_BUTTONS,
SUPPORT_VOLUME_MUTE,
SUPPORT_VOLUME_SET,
- SUPPORT_VOLUME_BUTTONS,
- SUPPORT_SELECT_SOURCE,
- SUPPORT_SELECT_SOUND_MODE,
- SUPPORT_PLAY_MEDIA,
- ControlButton,
} from "../../../data/media-player";
-import { isComponentLoaded } from "../../../common/config/is_component_loaded";
-
-import "../../../components/ha-paper-dropdown-menu";
-import "../../../components/ha-icon-button";
-import "../../../components/ha-slider";
-import "../../../components/ha-icon";
+import { HomeAssistant, MediaEntity } from "../../../types";
@customElement("more-info-media_player")
class MoreInfoMediaPlayer extends LitElement {
@@ -60,15 +62,29 @@ class MoreInfoMediaPlayer extends LitElement {
? ""
: html`
- ${controls!.map(
- (control) => html`
-
- `
- )}
+
+ ${controls!.map(
+ (control) => html`
+
+ `
+ )}
+
+ ${supportsFeature(stateObj, SUPPORT_BROWSE_MEDIA)
+ ? html`
+
+
+ `
+ : ""}
`}
${(supportsFeature(stateObj, SUPPORT_VOLUME_SET) ||
@@ -196,8 +212,16 @@ class MoreInfoMediaPlayer extends LitElement {
flex-grow: 1;
}
+ .controls {
+ display: flex;
+ align-items: center;
+ }
+
+ .basic-controls {
+ flex-grow: 1;
+ }
+
.volume,
- .controls,
.source-input,
.sound-input,
.tts {
@@ -372,6 +396,26 @@ class MoreInfoMediaPlayer extends LitElement {
});
ttsInput.value = "";
}
+
+ private _showBrowseMedia(): void {
+ showMediaBrowserDialog(this, {
+ action: "play",
+ entityId: this.stateObj!.entity_id,
+ mediaPickedCallback: (pickedMedia: MediaPickedEvent) =>
+ this._playMedia(
+ pickedMedia.media_content_id,
+ pickedMedia.media_content_type
+ ),
+ });
+ }
+
+ private _playMedia(media_content_id: string, media_content_type: string) {
+ this.hass!.callService("media_player", "play_media", {
+ entity_id: this.stateObj!.entity_id,
+ media_content_id,
+ media_content_type,
+ });
+ }
}
declare global {
diff --git a/src/external_app/external_config.ts b/src/external_app/external_config.ts
index d911ea2593..27728deaf0 100644
--- a/src/external_app/external_config.ts
+++ b/src/external_app/external_config.ts
@@ -3,6 +3,7 @@ import { ExternalMessaging } from "./external_messaging";
export interface ExternalConfig {
hasSettingsScreen: boolean;
canWriteTag: boolean;
+ hasExoPlayer: boolean;
}
export const getExternalConfig = (
diff --git a/src/html/authorize.html.template b/src/html/authorize.html.template
index 62b1fdf87b..46bca88dd4 100644
--- a/src/html/authorize.html.template
+++ b/src/html/authorize.html.template
@@ -22,6 +22,14 @@
.header img {
margin-right: 16px;
}
+ @media (prefers-color-scheme: dark) {
+ body {
+ background-color: #111111;
+ color: #e1e1e1;
+ --primary-text-color: #e1e1e1;
+ --secondary-text-color: #9b9b9b;
+ }
+ }
diff --git a/src/html/onboarding.html.template b/src/html/onboarding.html.template
index 126f67ab71..cf95d09362 100644
--- a/src/html/onboarding.html.template
+++ b/src/html/onboarding.html.template
@@ -23,6 +23,14 @@
.header img {
margin-right: 16px;
}
+ @media (prefers-color-scheme: dark) {
+ body {
+ background-color: #111111;
+ color: #e1e1e1;
+ --primary-text-color: #e1e1e1;
+ --secondary-text-color: #9b9b9b;
+ }
+ }
diff --git a/src/layouts/home-assistant-main.ts b/src/layouts/home-assistant-main.ts
index 94fdef2fc0..31609dbdc5 100644
--- a/src/layouts/home-assistant-main.ts
+++ b/src/layouts/home-assistant-main.ts
@@ -5,15 +5,15 @@ import type { AppDrawerElement } from "@polymer/app-layout/app-drawer/app-drawer
import {
css,
CSSResult,
+ customElement,
html,
LitElement,
property,
- customElement,
PropertyValues,
TemplateResult,
} from "lit-element";
-import { listenMediaQuery } from "../common/dom/media_query";
import { fireEvent } from "../common/dom/fire_event";
+import { listenMediaQuery } from "../common/dom/media_query";
import { toggleAttribute } from "../common/dom/toggle_attribute";
import { showNotificationDrawer } from "../dialogs/notifications/show-notification-drawer";
import type { HomeAssistant, Route } from "../types";
@@ -49,7 +49,15 @@ class HomeAssistantMain extends LitElement {
const disableSwipe =
!sidebarNarrow || NON_SWIPABLE_PANELS.indexOf(hass.panelUrl) !== -1;
+ // Style block in render because of the mixin that is not supported
return html`
+
diff --git a/src/panels/calendar/ha-full-calendar.ts b/src/panels/calendar/ha-full-calendar.ts
index e3b0e6af15..2607dae6e2 100644
--- a/src/panels/calendar/ha-full-calendar.ts
+++ b/src/panels/calendar/ha-full-calendar.ts
@@ -1,67 +1,85 @@
-import {
- property,
- internalProperty,
- PropertyValues,
- LitElement,
- CSSResult,
- html,
- css,
- unsafeCSS,
- TemplateResult,
-} from "lit-element";
+// @ts-ignore
+import fullcalendarStyle from "@fullcalendar/common/main.css";
import { Calendar } from "@fullcalendar/core";
+import type { CalendarOptions } from "@fullcalendar/core";
import dayGridPlugin from "@fullcalendar/daygrid";
// @ts-ignore
-import fullcalendarStyle from "@fullcalendar/core/main.css";
-// @ts-ignore
import daygridStyle from "@fullcalendar/daygrid/main.css";
+import interactionPlugin from "@fullcalendar/interaction";
+import listPlugin from "@fullcalendar/list";
+// @ts-ignore
+import listStyle from "@fullcalendar/list/main.css";
import "@material/mwc-button";
-
-import "../../components/ha-icon-button";
-import "../../components/ha-button-toggle-group";
-
-import type {
- CalendarViewChanged,
- CalendarEvent,
- ToggleButton,
- HomeAssistant,
-} from "../../types";
+import { mdiViewAgenda, mdiViewDay, mdiViewModule, mdiViewWeek } from "@mdi/js";
+import {
+ css,
+ CSSResult,
+ html,
+ internalProperty,
+ LitElement,
+ property,
+ PropertyValues,
+ TemplateResult,
+ unsafeCSS,
+} from "lit-element";
+import memoize from "memoize-one";
import { fireEvent } from "../../common/dom/fire_event";
+import "../../components/ha-button-toggle-group";
+import "../../components/ha-icon-button";
import { haStyle } from "../../resources/styles";
+import type {
+ CalendarEvent,
+ CalendarViewChanged,
+ FullCalendarView,
+ HomeAssistant,
+ ToggleButton,
+} from "../../types";
declare global {
+ interface HTMLElementTagNameMap {
+ "ha-full-calendar": HAFullCalendar;
+ }
interface HASSDomEvents {
"view-changed": CalendarViewChanged;
}
}
-const fullCalendarConfig = {
+const defaultFullCalendarConfig: CalendarOptions = {
headerToolbar: false,
- plugins: [dayGridPlugin],
+ plugins: [dayGridPlugin, listPlugin, interactionPlugin],
initialView: "dayGridMonth",
dayMaxEventRows: true,
height: "parent",
+ eventDisplay: "list-item",
};
const viewButtons: ToggleButton[] = [
- { label: "Month View", value: "dayGridMonth", icon: "hass:view-module" },
- { label: "Week View", value: "dayGridWeek", icon: "hass:view-week" },
- { label: "Day View", value: "dayGridDay", icon: "hass:view-day" },
+ { label: "Month View", value: "dayGridMonth", iconPath: mdiViewModule },
+ { label: "Week View", value: "dayGridWeek", iconPath: mdiViewWeek },
+ { label: "Day View", value: "dayGridDay", iconPath: mdiViewDay },
+ { label: "List View", value: "listWeek", iconPath: mdiViewAgenda },
];
class HAFullCalendar extends LitElement {
public hass!: HomeAssistant;
- @property() public events: CalendarEvent[] = [];
+ @property({ type: Boolean, reflect: true }) public narrow = false;
- @property({ type: Boolean, reflect: true })
- public narrow!: boolean;
+ @property({ attribute: false }) public events: CalendarEvent[] = [];
+
+ @property({ attribute: false }) public views: FullCalendarView[] = [
+ "dayGridMonth",
+ "dayGridWeek",
+ "dayGridDay",
+ ];
@internalProperty() private calendar?: Calendar;
- @internalProperty() private _activeView = "dayGridMonth";
+ @internalProperty() private _activeView: FullCalendarView = "dayGridMonth";
protected render(): TemplateResult {
+ const viewToggleButtons = this._viewToggleButtons(this.views);
+
return html`
${this.calendar
? html`
@@ -96,27 +114,12 @@ class HAFullCalendar extends LitElement {
${this.calendar.view.title}
`
: html`
-
- ${this.hass.localize(
- "ui.panel.calendar.today"
- )}
-
-
${this.calendar.view.title}
@@ -138,6 +141,21 @@ class HAFullCalendar extends LitElement {
+
+ ${this.hass.localize(
+ "ui.panel.calendar.today"
+ )}
+
+
`}
`
@@ -157,14 +175,25 @@ class HAFullCalendar extends LitElement {
this.calendar.removeAllEventSources();
this.calendar.addEventSource(this.events);
}
+
+ if (changedProps.has("views") && !this.views.includes(this._activeView)) {
+ this._activeView = this.views[0];
+ this.calendar!.changeView(this._activeView);
+ this._fireViewChanged();
+ }
}
protected firstUpdated(): void {
- const config = { ...fullCalendarConfig, locale: this.hass.language };
+ const config: CalendarOptions = {
+ ...defaultFullCalendarConfig,
+ locale: this.hass.language,
+ };
+
+ config.dateClick = (info) => this._handleDateClick(info);
+ config.eventClick = (info) => this._handleEventClick(info);
this.calendar = new Calendar(
this.shadowRoot!.getElementById("calendar")!,
- // @ts-ignore
config
);
@@ -172,6 +201,25 @@ class HAFullCalendar extends LitElement {
this._fireViewChanged();
}
+ private _handleEventClick(info): void {
+ if (info.view.type !== "dayGridMonth") {
+ return;
+ }
+
+ this._activeView = "dayGridDay";
+ this.calendar!.changeView("dayGridDay");
+ this.calendar!.gotoDate(info.event.startStr);
+ }
+
+ private _handleDateClick(info): void {
+ if (info.view.type !== "dayGridMonth") {
+ return;
+ }
+ this._activeView = "dayGridDay";
+ this.calendar!.changeView("dayGridDay");
+ this.calendar!.gotoDate(info.dateStr);
+ }
+
private _handleNext(): void {
this.calendar!.next();
this._fireViewChanged();
@@ -201,14 +249,21 @@ class HAFullCalendar extends LitElement {
});
}
+ private _viewToggleButtons = memoize((views) =>
+ viewButtons.filter((button) =>
+ views.includes(button.value as FullCalendarView)
+ )
+ );
+
static get styles(): CSSResult[] {
return [
haStyle,
css`
${unsafeCSS(fullcalendarStyle)}
${unsafeCSS(daygridStyle)}
-
- :host {
+ ${unsafeCSS(listStyle)}
+
+ :host {
display: flex;
flex-direction: column;
--fc-theme-standard-border-color: var(--divider-color);
@@ -262,6 +317,15 @@ class HAFullCalendar extends LitElement {
#calendar {
flex-grow: 1;
background-color: var(--card-background-color);
+ min-height: 400px;
+ --fc-neutral-bg-color: var(--card-background-color);
+ --fc-list-event-hover-bg-color: var(--card-background-color);
+ --fc-theme-standard-border-color: var(--divider-color);
+ --fc-border-color: var(--divider-color);
+ }
+
+ a {
+ color: inherit !important;
}
.fc-theme-standard .fc-scrollgrid {
@@ -273,15 +337,20 @@ class HAFullCalendar extends LitElement {
}
th.fc-col-header-cell.fc-day {
- color: #70757a;
+ color: var(--secondary-text-color);
font-size: 11px;
font-weight: 400;
text-transform: uppercase;
}
+ .fc-daygrid-dot-event:hover {
+ background-color: inherit
+ }
+
.fc-daygrid-day-top {
text-align: center;
- padding-top: 8px;
+ padding-top: 5px;
+ justify-content: center;
}
table.fc-scrollgrid-sync-table
@@ -296,13 +365,21 @@ class HAFullCalendar extends LitElement {
font-size: 12px;
}
- td.fc-day-today {
+ .fc .fc-daygrid-day-number {
+ padding: 3px !important;
+ }
+
+ .fc .fc-daygrid-day.fc-day-today {
background: inherit;
}
+ td.fc-day-today .fc-daygrid-day-top {
+ padding-top: 4px;
+ }
+
td.fc-day-today .fc-daygrid-day-number {
height: 24px;
- color: var(--text-primary-color);
+ color: var(--text-primary-color) !important;
background-color: var(--primary-color);
border-radius: 50%;
display: inline-block;
@@ -342,6 +419,66 @@ class HAFullCalendar extends LitElement {
.fc-popover-header {
background-color: var(--secondary-background-color) !important;
}
+
+ .fc-theme-standard .fc-list-day-frame {
+ background-color: transparent;
+ }
+
+ .fc-list.fc-view,
+ .fc-list-event.fc-event td {
+ border: none;
+ }
+
+ .fc-list-day.fc-day th {
+ border-bottom: none;
+ border-top: 1px solid var(--fc-theme-standard-border-color, #ddd) !important;
+ }
+
+ .fc-list-day-text {
+ font-size: 16px;
+ font-weight: 400;
+ }
+
+ .fc-list-day-side-text {
+ font-weight: 400;
+ font-size: 16px;
+ color: var(--primary-color);
+ }
+
+ .fc-list-table td,
+ .fc-list-day-frame {
+ padding-top: 12px;
+ padding-bottom: 12px;
+ }
+
+ :host([narrow]) .fc-dayGridMonth-view
+ .fc-daygrid-dot-event
+ .fc-event-time,
+ :host([narrow]) .fc-dayGridMonth-view
+ .fc-daygrid-dot-event
+ .fc-event-title,
+ :host([narrow]) .fc-dayGridMonth-view .fc-daygrid-day-bottom {
+ display: none;
+ }
+
+ :host([narrow]) .fc .fc-dayGridMonth-view .fc-daygrid-event-harness-abs {
+ visibility: visible !important;
+ position: static;
+ }
+
+ :host([narrow]) .fc-dayGridMonth-view .fc-daygrid-day-events {
+ display: flex;
+ min-height: 2em !important;
+ justify-content: center;
+ flex-wrap: wrap;
+ max-height: 2em;
+ height: 2em;
+ overflow: hidden;
+ }
+
+ :host([narrow]) .fc-dayGridMonth-view .fc-scrollgrid-sync-table {
+ overflow: hidden;
+ }
`,
];
}
diff --git a/src/panels/calendar/ha-panel-calendar.ts b/src/panels/calendar/ha-panel-calendar.ts
index ea7d2bb69b..58aefd8146 100644
--- a/src/panels/calendar/ha-panel-calendar.ts
+++ b/src/panels/calendar/ha-panel-calendar.ts
@@ -53,12 +53,6 @@ class PanelCalendar extends LitElement {
selected: true,
calendar,
}));
-
- if (!this._start || !this._end) {
- return;
- }
-
- this._fetchEvents(this._start, this._end, this._selectedCalendars);
}
protected render(): TemplateResult {
@@ -88,8 +82,8 @@ class PanelCalendar extends LitElement {
${this.hass.localize(
- "ui.panel.config.devices.automation.no_automations"
- )}
+
+ ${this.hass.localize(
+ "ui.panel.config.devices.add_prompt",
+ "name",
+ this.hass.localize(
+ "ui.panel.config.devices.automation.automations"
+ )
+ )}
+
`}
`
@@ -375,11 +380,15 @@ export class HaConfigDevicePage extends LitElement {
: "";
})
: html`
- ${this.hass.localize(
- "ui.panel.config.devices.scene.no_scenes"
- )}
+
+ ${this.hass.localize(
+ "ui.panel.config.devices.add_prompt",
+ "name",
+ this.hass.localize(
+ "ui.panel.config.devices.scene.scenes"
+ )
+ )}
+
`
}
@@ -428,9 +437,13 @@ export class HaConfigDevicePage extends LitElement {
: html`
${this.hass.localize(
- "ui.panel.config.devices.script.no_scripts"
- )}
+ "ui.panel.config.devices.add_prompt",
+ "name",
+ this.hass.localize(
+ "ui.panel.config.devices.script.scripts"
+ )
+ )}
+
`}
`
@@ -549,11 +562,14 @@ export class HaConfigDevicePage extends LitElement {
const renameEntityid =
this.showAdvanced &&
- confirm(
- this.hass.localize(
+ (await showConfirmationDialog(this, {
+ title: this.hass.localize(
"ui.panel.config.devices.confirm_rename_entity_ids"
- )
- );
+ ),
+ text: this.hass.localize(
+ "ui.panel.config.devices.confirm_rename_entity_ids_warning"
+ ),
+ }));
const updateProms = entities.map((entity) => {
const name = entity.name || entity.stateName;
@@ -702,6 +718,10 @@ export class HaConfigDevicePage extends LitElement {
color: var(--primary-color);
}
+ ha-card {
+ padding-bottom: 8px;
+ }
+
ha-card a {
color: var(--primary-text-color);
}
diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts
index dad0e22ee4..1857338ac7 100644
--- a/src/panels/config/ha-panel-config.ts
+++ b/src/panels/config/ha-panel-config.ts
@@ -352,6 +352,13 @@ class HaPanelConfig extends HassRouterPage {
/* webpackChunkName: "panel-config-mqtt" */ "./integrations/integration-panels/mqtt/mqtt-config-panel"
),
},
+ ozw: {
+ tag: "ozw-config-router",
+ load: () =>
+ import(
+ /* webpackChunkName: "panel-config-ozw" */ "./integrations/integration-panels/ozw/ozw-config-router"
+ ),
+ },
},
};
diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts
index d88b075a10..fc03a16ddd 100644
--- a/src/panels/config/integrations/ha-integration-card.ts
+++ b/src/panels/config/integrations/ha-integration-card.ts
@@ -55,6 +55,10 @@ const integrationsWithPanel = {
buttonLocalizeKey: "ui.panel.config.zha.button",
path: "/config/zha/dashboard",
},
+ ozw: {
+ buttonLocalizeKey: "ui.panel.config.ozw.button",
+ path: "/config/ozw/dashboard",
+ },
zwave: {
buttonLocalizeKey: "ui.panel.config.zwave.button",
path: "/config/zwave",
diff --git a/src/panels/config/integrations/integration-panels/ozw/ozw-config-dashboard.ts b/src/panels/config/integrations/integration-panels/ozw/ozw-config-dashboard.ts
new file mode 100644
index 0000000000..f23d7a7114
--- /dev/null
+++ b/src/panels/config/integrations/integration-panels/ozw/ozw-config-dashboard.ts
@@ -0,0 +1,227 @@
+import "@polymer/paper-item/paper-icon-item";
+import "@polymer/paper-item/paper-item-body";
+import "@material/mwc-fab";
+import {
+ css,
+ CSSResultArray,
+ customElement,
+ html,
+ internalProperty,
+ LitElement,
+ property,
+ TemplateResult,
+} from "lit-element";
+import { navigate } from "../../../../../common/navigate";
+import "../../../../../components/ha-card";
+import "../../../../../components/ha-icon-next";
+import { haStyle } from "../../../../../resources/styles";
+import type { HomeAssistant, Route } from "../../../../../types";
+import "../../../ha-config-section";
+import { mdiCircle, mdiCheckCircle, mdiCloseCircle, mdiZWave } from "@mdi/js";
+import "../../../../../layouts/hass-tabs-subpage";
+import type { PageNavigation } from "../../../../../layouts/hass-tabs-subpage";
+import "@material/mwc-button/mwc-button";
+import {
+ OZWInstance,
+ fetchOZWInstances,
+ networkOnlineStatuses,
+ networkOfflineStatuses,
+ networkStartingStatuses,
+} from "../../../../../data/ozw";
+
+export const ozwTabs: PageNavigation[] = [];
+
+@customElement("ozw-config-dashboard")
+class OZWConfigDashboard extends LitElement {
+ @property({ type: Object }) public hass!: HomeAssistant;
+
+ @property({ type: Object }) public route!: Route;
+
+ @property({ type: Boolean }) public narrow!: boolean;
+
+ @property({ type: Boolean }) public isWide!: boolean;
+
+ @property() public configEntryId?: string;
+
+ @internalProperty() private _instances: OZWInstance[] = [];
+
+ public connectedCallback(): void {
+ super.connectedCallback();
+ if (this.hass) {
+ this._fetchData();
+ }
+ }
+
+ private async _fetchData() {
+ this._instances = await fetchOZWInstances(this.hass!);
+ if (this._instances.length === 1) {
+ navigate(
+ this,
+ `/config/ozw/network/${this._instances[0].ozw_instance}`,
+ true
+ );
+ }
+ }
+
+ protected render(): TemplateResult {
+ return html`
+
+
+
+ ${this.hass.localize("ui.panel.config.ozw.select_instance.header")}
+
+
+
+ ${this.hass.localize(
+ "ui.panel.config.ozw.select_instance.introduction"
+ )}
+
+ ${this._instances.length > 0
+ ? html`
+ ${this._instances.map((instance) => {
+ let status = "unknown";
+ let icon = mdiCircle;
+ if (networkOnlineStatuses.includes(instance.Status)) {
+ status = "online";
+ icon = mdiCheckCircle;
+ }
+ if (networkStartingStatuses.includes(instance.Status)) {
+ status = "starting";
+ }
+ if (networkOfflineStatuses.includes(instance.Status)) {
+ status = "offline";
+ icon = mdiCloseCircle;
+ }
+
+ return html`
+
+
+
+
+
+
+ ${this.hass.localize(
+ "ui.panel.config.ozw.common.instance"
+ )}
+ ${instance.ozw_instance}
+
+
+ ${this.hass.localize(
+ "ui.panel.config.ozw.network_status." + status
+ )}
+ -
+ ${this.hass.localize(
+ "ui.panel.config.ozw.network_status.details." +
+ instance.Status.toLowerCase()
+ )}
+ ${this.hass.localize(
+ "ui.panel.config.ozw.common.controller"
+ )}
+ : ${instance.getControllerPath}
+ OZWDaemon ${instance.OZWDaemon_Version} (OpenZWave
+ ${instance.OpenZWave_Version})
+
+
+
+
+
+
+ `;
+ })}
+ `
+ : ``}
+
+
+ `;
+ }
+
+ static get styles(): CSSResultArray {
+ return [
+ haStyle,
+ css`
+ ha-card:last-child {
+ margin-bottom: 24px;
+ }
+ ha-config-section {
+ margin-top: -12px;
+ }
+ :host([narrow]) ha-config-section {
+ margin-top: -20px;
+ }
+ ha-card {
+ overflow: hidden;
+ }
+ ha-card a {
+ text-decoration: none;
+ color: var(--primary-text-color);
+ }
+ paper-item-body {
+ margin: 16px 0;
+ }
+ a {
+ text-decoration: none;
+ color: var(--primary-text-color);
+ position: relative;
+ display: block;
+ outline: 0;
+ }
+ ha-svg-icon.network-status-icon {
+ height: 14px;
+ width: 14px;
+ }
+ .online {
+ color: green;
+ }
+ .starting {
+ color: orange;
+ }
+ .offline {
+ color: red;
+ }
+ ha-svg-icon,
+ ha-icon-next {
+ color: var(--secondary-text-color);
+ }
+ .iron-selected paper-item::before,
+ a:not(.iron-selected):focus::before {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ pointer-events: none;
+ content: "";
+ transition: opacity 15ms linear;
+ will-change: opacity;
+ }
+ a:not(.iron-selected):focus::before {
+ background-color: currentColor;
+ opacity: var(--dark-divider-opacity);
+ }
+ .iron-selected paper-item:focus::before,
+ .iron-selected:focus paper-item::before {
+ opacity: 0.2;
+ }
+ `,
+ ];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "ozw-config-dashboard": OZWConfigDashboard;
+ }
+}
diff --git a/src/panels/config/integrations/integration-panels/ozw/ozw-config-network.ts b/src/panels/config/integrations/integration-panels/ozw/ozw-config-network.ts
new file mode 100644
index 0000000000..6d67ed779e
--- /dev/null
+++ b/src/panels/config/integrations/integration-panels/ozw/ozw-config-network.ts
@@ -0,0 +1,253 @@
+import "@material/mwc-fab";
+import {
+ css,
+ CSSResultArray,
+ customElement,
+ html,
+ internalProperty,
+ LitElement,
+ property,
+ TemplateResult,
+} from "lit-element";
+import { navigate } from "../../../../../common/navigate";
+import "../../../../../components/ha-card";
+import "../../../../../components/ha-icon-next";
+import "../../../../../components/buttons/ha-call-service-button";
+import { haStyle } from "../../../../../resources/styles";
+import type { HomeAssistant, Route } from "../../../../../types";
+import "../../../ha-config-section";
+import { mdiCircle, mdiCheckCircle, mdiCloseCircle } from "@mdi/js";
+import "../../../../../layouts/hass-tabs-subpage";
+import type { PageNavigation } from "../../../../../layouts/hass-tabs-subpage";
+import "@material/mwc-button/mwc-button";
+import {
+ OZWInstance,
+ fetchOZWNetworkStatus,
+ fetchOZWNetworkStatistics,
+ networkOnlineStatuses,
+ networkOfflineStatuses,
+ networkStartingStatuses,
+ OZWNetworkStatistics,
+} from "../../../../../data/ozw";
+
+export const ozwTabs: PageNavigation[] = [];
+
+@customElement("ozw-config-network")
+class OZWConfigNetwork extends LitElement {
+ @property({ type: Object }) public hass!: HomeAssistant;
+
+ @property({ type: Object }) public route!: Route;
+
+ @property({ type: Boolean }) public narrow!: boolean;
+
+ @property({ type: Boolean }) public isWide!: boolean;
+
+ @property() public configEntryId?: string;
+
+ @property() public ozw_instance = 0;
+
+ @internalProperty() private _network?: OZWInstance;
+
+ @internalProperty() private _statistics?: OZWNetworkStatistics;
+
+ @internalProperty() private _status = "unknown";
+
+ @internalProperty() private _icon = mdiCircle;
+
+ public connectedCallback(): void {
+ super.connectedCallback();
+ if (this.ozw_instance <= 0) {
+ navigate(this, "/config/ozw/dashboard", true);
+ }
+ if (this.hass) {
+ this._fetchData();
+ }
+ }
+
+ private async _fetchData() {
+ this._network = await fetchOZWNetworkStatus(this.hass!, this.ozw_instance);
+ this._statistics = await fetchOZWNetworkStatistics(
+ this.hass!,
+ this.ozw_instance
+ );
+ if (networkOnlineStatuses.includes(this._network.Status)) {
+ this._status = "online";
+ this._icon = mdiCheckCircle;
+ }
+ if (networkStartingStatuses.includes(this._network.Status)) {
+ this._status = "starting";
+ }
+ if (networkOfflineStatuses.includes(this._network.Status)) {
+ this._status = "offline";
+ this._icon = mdiCloseCircle;
+ }
+ }
+
+ private _generateServiceButton(service: string) {
+ return html`
+
+ ${this.hass!.localize("ui.panel.config.ozw.services." + service)}
+
+ `;
+ }
+
+ protected render(): TemplateResult {
+ return html`
+
+
+
+ ${this.hass.localize("ui.panel.config.ozw.network.header")}
+
+
+
+ ${this.hass.localize("ui.panel.config.ozw.network.introduction")}
+
+ ${this._network
+ ? html`
+
+
+
+
+ ${this.hass.localize(
+ "ui.panel.config.ozw.common.network"
+ )}
+ ${this.hass.localize(
+ "ui.panel.config.ozw.network_status." + this._status
+ )}
+
+
+ ${this.hass.localize(
+ "ui.panel.config.ozw.network_status.details." +
+ this._network.Status.toLowerCase()
+ )}
+
+
+
+ ${this.hass.localize(
+ "ui.panel.config.ozw.common.ozw_instance"
+ )}
+ ${this._network.ozw_instance}
+ ${this._statistics
+ ? html`
+ •
+ ${this.hass.localize(
+ "ui.panel.config.ozw.network.node_count",
+ "count",
+ this._statistics.node_count
+ )}
+ `
+ : ``}
+
+ ${this.hass.localize(
+ "ui.panel.config.ozw.common.controller"
+ )}:
+ ${this._network.getControllerPath}
+ OZWDaemon ${this._network.OZWDaemon_Version} (OpenZWave
+ ${this._network.OpenZWave_Version})
+
+
+
+ ${this._generateServiceButton("add_node")}
+ ${this._generateServiceButton("remove_node")}
+
+
+ `
+ : ``}
+
+
+ `;
+ }
+
+ static get styles(): CSSResultArray {
+ return [
+ haStyle,
+ css`
+ .secondary {
+ color: var(--secondary-text-color);
+ }
+ .online {
+ color: green;
+ }
+ .starting {
+ color: orange;
+ }
+ .offline {
+ color: red;
+ }
+ .content {
+ margin-top: 24px;
+ }
+
+ .sectionHeader {
+ position: relative;
+ padding-right: 40px;
+ }
+
+ .network-status {
+ text-align: center;
+ }
+
+ .network-status div.details {
+ font-size: 1.5rem;
+ margin-bottom: 16px;
+ }
+
+ .network-status ha-svg-icon {
+ display: block;
+ margin: 0px auto 16px;
+ width: 48px;
+ height: 48px;
+ }
+
+ .network-status small {
+ font-size: 1rem;
+ }
+
+ ha-card {
+ margin: 0 auto;
+ max-width: 600px;
+ }
+
+ .card-actions.warning ha-call-service-button {
+ color: var(--error-color);
+ }
+
+ .toggle-help-icon {
+ position: absolute;
+ top: -6px;
+ right: 0;
+ color: var(--primary-color);
+ }
+
+ ha-service-description {
+ display: block;
+ color: grey;
+ padding: 0 8px 12px;
+ }
+
+ [hidden] {
+ display: none;
+ }
+ `,
+ ];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "ozw-config-network": OZWConfigNetwork;
+ }
+}
diff --git a/src/panels/config/integrations/integration-panels/ozw/ozw-config-router.ts b/src/panels/config/integrations/integration-panels/ozw/ozw-config-router.ts
new file mode 100644
index 0000000000..28402cbe4c
--- /dev/null
+++ b/src/panels/config/integrations/integration-panels/ozw/ozw-config-router.ts
@@ -0,0 +1,70 @@
+import { customElement, property } from "lit-element";
+import {
+ HassRouterPage,
+ RouterOptions,
+} from "../../../../../layouts/hass-router-page";
+import { HomeAssistant } from "../../../../../types";
+import { navigate } from "../../../../../common/navigate";
+
+@customElement("ozw-config-router")
+class OZWConfigRouter extends HassRouterPage {
+ @property({ attribute: false }) public hass!: HomeAssistant;
+
+ @property() public isWide!: boolean;
+
+ @property() public narrow!: boolean;
+
+ private _configEntry = new URLSearchParams(window.location.search).get(
+ "config_entry"
+ );
+
+ protected routerOptions: RouterOptions = {
+ defaultPage: "dashboard",
+ showLoading: true,
+ routes: {
+ dashboard: {
+ tag: "ozw-config-dashboard",
+ load: () =>
+ import(
+ /* webpackChunkName: "ozw-config-dashboard" */ "./ozw-config-dashboard"
+ ),
+ },
+ network: {
+ tag: "ozw-config-network",
+ load: () =>
+ import(
+ /* webpackChunkName: "ozw-config-network" */ "./ozw-config-network"
+ ),
+ },
+ },
+ };
+
+ protected updatePageEl(el): void {
+ el.route = this.routeTail;
+ el.hass = this.hass;
+ el.isWide = this.isWide;
+ el.narrow = this.narrow;
+ el.configEntryId = this._configEntry;
+ if (this._currentPage === "network") {
+ el.ozw_instance = this.routeTail.path.substr(1);
+ }
+
+ const searchParams = new URLSearchParams(window.location.search);
+ if (this._configEntry && !searchParams.has("config_entry")) {
+ searchParams.append("config_entry", this._configEntry);
+ navigate(
+ this,
+ `${this.routeTail.prefix}${
+ this.routeTail.path
+ }?${searchParams.toString()}`,
+ true
+ );
+ }
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "ozw-config-router": OZWConfigRouter;
+ }
+}
diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts
index a08b26f072..fe19018906 100644
--- a/src/panels/config/server_control/ha-config-server-control.ts
+++ b/src/panels/config/server_control/ha-config-server-control.ts
@@ -16,7 +16,7 @@ import { HomeAssistant, Route } from "../../../types";
import "@material/mwc-button";
import "@polymer/paper-input/paper-input";
-import { isComponentLoaded } from "../../../common/config/is_component_loaded";
+import { isServiceLoaded } from "../../../common/config/is_service_loaded";
import "../../../components/buttons/ha-call-service-button";
import "../../../components/ha-card";
import "../ha-config-section";
@@ -35,6 +35,7 @@ const reloadableDomains = [
"input_number",
"input_datetime",
"input_select",
+ "template",
];
@customElement("ha-config-server-control")
@@ -202,7 +203,7 @@ export class HaConfigServerControl extends LitElement {
${reloadableDomains.map((domain) =>
- isComponentLoaded(this.hass, domain)
+ isServiceLoaded(this.hass, domain, "reload")
? html`
html`${name}
${narrow
? html`
- ${tag.last_scanned
+ ${tag.last_scanned_datetime
? html``
- : this.hass.localize("ui.components.relative_time.never")}
+ : this.hass.localize("ui.panel.config.tags.never_scanned")}
`
: ""}`,
},
@@ -94,7 +94,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) {
.hass=${this.hass}
.datetimeObj=${last_scanned_datetime}
>`
- : this.hass.localize("ui.components.relative_time.never")}
+ : this.hass.localize("ui.panel.config.tags.never_scanned")}
`,
};
}
diff --git a/src/panels/developer-tools/template/developer-tools-template.js b/src/panels/developer-tools/template/developer-tools-template.js
deleted file mode 100644
index cf6369ee2e..0000000000
--- a/src/panels/developer-tools/template/developer-tools-template.js
+++ /dev/null
@@ -1,204 +0,0 @@
-import "../../../components/ha-circular-progress";
-import { timeOut } from "@polymer/polymer/lib/utils/async";
-import { Debouncer } from "@polymer/polymer/lib/utils/debounce";
-import { html } from "@polymer/polymer/lib/utils/html-tag";
-/* eslint-plugin-disable lit */
-import { PolymerElement } from "@polymer/polymer/polymer-element";
-import "../../../components/ha-code-editor";
-import LocalizeMixin from "../../../mixins/localize-mixin";
-import "../../../styles/polymer-ha-style";
-
-class HaPanelDevTemplate extends LocalizeMixin(PolymerElement) {
- static get template() {
- return html`
-
-
-
-
-
-
- [[localize('ui.panel.developer-tools.tabs.templates.description')]]
-
-
-
[[localize('ui.panel.developer-tools.tabs.templates.editor')]]
-
-
-
-
-
- `;
- }
-
- static get properties() {
- return {
- hass: {
- type: Object,
- },
-
- error: {
- type: Boolean,
- value: false,
- },
-
- rendering: {
- type: Boolean,
- value: false,
- },
-
- template: {
- type: String,
- /* eslint-disable max-len */
- value: `Imitate available variables:
-{% set my_test_json = {
- "temperature": 25,
- "unit": "°C"
-} %}
-
-The temperature is {{ my_test_json.temperature }} {{ my_test_json.unit }}.
-
-{% if is_state("device_tracker.paulus", "home") and
- is_state("device_tracker.anne_therese", "home") -%}
- You are both home, you silly
-{%- else -%}
- Anne Therese is at {{ states("device_tracker.anne_therese") }}
- Paulus is at {{ states("device_tracker.paulus") }}
-{%- endif %}
-
-For loop example:
-{% for state in states.sensor -%}
- {%- if loop.first %}The {% elif loop.last %} and the {% else %}, the {% endif -%}
- {{ state.name | lower }} is {{state.state_with_unit}}
-{%- endfor %}.`,
- /* eslint-enable max-len */
- },
-
- processed: {
- type: String,
- value: "",
- },
- };
- }
-
- ready() {
- super.ready();
- this.renderTemplate();
- }
-
- computeFormClasses(narrow) {
- return narrow ? "content" : "content layout horizontal";
- }
-
- computeRenderedClasses(error) {
- return error ? "error rendered" : "rendered";
- }
-
- templateChanged(ev) {
- this.template = ev.detail.value;
- if (this.error) {
- this.error = false;
- }
- this._debouncer = Debouncer.debounce(
- this._debouncer,
- timeOut.after(500),
- () => {
- this.renderTemplate();
- }
- );
- }
-
- renderTemplate() {
- this.rendering = true;
-
- this.hass.callApi("POST", "template", { template: this.template }).then(
- function (processed) {
- this.processed = processed;
- this.rendering = false;
- }.bind(this),
- function (error) {
- this.processed =
- (error && error.body && error.body.message) ||
- this.hass.localize(
- "ui.panel.developer-tools.tabs.templates.unknown_error_template"
- );
- this.error = true;
- this.rendering = false;
- }.bind(this)
- );
- }
-}
-
-customElements.define("developer-tools-template", HaPanelDevTemplate);
diff --git a/src/panels/developer-tools/template/developer-tools-template.ts b/src/panels/developer-tools/template/developer-tools-template.ts
new file mode 100644
index 0000000000..0bb9d0f78e
--- /dev/null
+++ b/src/panels/developer-tools/template/developer-tools-template.ts
@@ -0,0 +1,280 @@
+import "@material/mwc-button/mwc-button";
+import { UnsubscribeFunc } from "home-assistant-js-websocket";
+import {
+ css,
+ CSSResultArray,
+ customElement,
+ html,
+ internalProperty,
+ LitElement,
+ property,
+} from "lit-element";
+import { classMap } from "lit-html/directives/class-map";
+import { debounce } from "../../../common/util/debounce";
+import "../../../components/ha-circular-progress";
+import "../../../components/ha-code-editor";
+import { subscribeRenderTemplate } from "../../../data/ws-templates";
+import { haStyle } from "../../../resources/styles";
+import { HomeAssistant } from "../../../types";
+
+const DEMO_TEMPLATE = `{## Imitate available variables: ##}
+{% set my_test_json = {
+ "temperature": 25,
+ "unit": "°C"
+} %}
+
+The temperature is {{ my_test_json.temperature }} {{ my_test_json.unit }}.
+
+{% if is_state("sun.sun", "above_horizon") -%}
+ The sun rose {{ relative_time(states.sun.sun.last_changed) }} ago.
+{%- else -%}
+ The sun will rise at {{ as_timestamp(strptime(state_attr("sun.sun", "next_rising"), "")) | timestamp_local }}.
+{%- endif %}
+
+For loop example getting 3 entity values:
+
+{% for states in states | slice(3) -%}
+ {% set state = states | first %}
+ {%- if loop.first %}The {% elif loop.last %} and the {% else %}, the {% endif -%}
+ {{ state.name | lower }} is {{state.state_with_unit}}
+{%- endfor %}.`;
+
+@customElement("developer-tools-template")
+class HaPanelDevTemplate extends LitElement {
+ @property() public hass!: HomeAssistant;
+
+ @property() public narrow!: boolean;
+
+ @internalProperty() private _error = false;
+
+ @internalProperty() private _rendering = false;
+
+ @internalProperty() private _processed = "";
+
+ @internalProperty() private _unsubRenderTemplate?: Promise;
+
+ private _template = "";
+
+ private _inited = false;
+
+ public connectedCallback() {
+ super.connectedCallback();
+ if (this._template && !this._unsubRenderTemplate) {
+ this._subscribeTemplate();
+ }
+ }
+
+ public disconnectedCallback() {
+ this._unsubscribeTemplate();
+ }
+
+ protected firstUpdated() {
+ if (localStorage && localStorage["panel-dev-template-template"]) {
+ this._template = localStorage["panel-dev-template-template"];
+ } else {
+ this._template = DEMO_TEMPLATE;
+ }
+ this._subscribeTemplate();
+ this._inited = true;
+ }
+
+ protected render() {
+ return html`
+
+
+
+ ${this.hass.localize(
+ "ui.panel.developer-tools.tabs.templates.description"
+ )}
+
+
+
+ ${this.hass.localize(
+ "ui.panel.developer-tools.tabs.templates.editor"
+ )}
+
+
+
+ ${this.hass.localize(
+ "ui.panel.developer-tools.tabs.templates.reset"
+ )}
+
+
+
+
+
+
+${this._processed}
+
+
+ `;
+ }
+
+ static get styles(): CSSResultArray {
+ return [
+ haStyle,
+ css`
+ :host {
+ -ms-user-select: initial;
+ -webkit-user-select: initial;
+ -moz-user-select: initial;
+ }
+
+ .content {
+ padding: 16px;
+ direction: ltr;
+ }
+
+ .edit-pane {
+ margin-right: 16px;
+ }
+
+ .edit-pane a {
+ color: var(--primary-color);
+ }
+
+ .horizontal .edit-pane {
+ max-width: 50%;
+ }
+
+ .render-pane {
+ position: relative;
+ max-width: 50%;
+ }
+
+ .render-spinner {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ }
+
+ .rendered {
+ @apply --paper-font-code1;
+ clear: both;
+ white-space: pre-wrap;
+ }
+
+ .rendered.error {
+ color: var(--error-color);
+ }
+ `,
+ ];
+ }
+
+ private _debounceRender = debounce(
+ () => {
+ this._subscribeTemplate();
+ this._storeTemplate();
+ },
+ 500,
+ false
+ );
+
+ private _templateChanged(ev) {
+ this._template = ev.detail.value;
+ if (this._error) {
+ this._error = false;
+ }
+ this._debounceRender();
+ }
+
+ private async _subscribeTemplate() {
+ this._rendering = true;
+ await this._unsubscribeTemplate();
+ try {
+ this._unsubRenderTemplate = subscribeRenderTemplate(
+ this.hass.connection,
+ (result) => {
+ this._processed = result;
+ },
+ {
+ template: this._template,
+ }
+ );
+ await this._unsubRenderTemplate;
+ } catch (err) {
+ this._error = true;
+ if (err.message) {
+ this._processed = err.message;
+ }
+ this._unsubRenderTemplate = undefined;
+ } finally {
+ this._rendering = false;
+ }
+ }
+
+ private async _unsubscribeTemplate(): Promise {
+ if (!this._unsubRenderTemplate) {
+ return;
+ }
+
+ try {
+ const unsub = await this._unsubRenderTemplate;
+ unsub();
+ this._unsubRenderTemplate = undefined;
+ } catch (e) {
+ if (e.code === "not_found") {
+ // If we get here, the connection was probably already closed. Ignore.
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ private _storeTemplate() {
+ if (!this._inited) {
+ return;
+ }
+ localStorage["panel-dev-template-template"] = this._template;
+ }
+
+ private _restoreDemo() {
+ this._template = DEMO_TEMPLATE;
+ this._subscribeTemplate();
+ delete localStorage["panel-dev-template-template"];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "developer-tools-template": HaPanelDevTemplate;
+ }
+}
diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts
index 3fb8bf7a0c..af886126d3 100644
--- a/src/panels/logbook/ha-logbook.ts
+++ b/src/panels/logbook/ha-logbook.ts
@@ -118,6 +118,26 @@ class HaLogbook extends LitElement {
? ` (${item_username})`
: ``}
+ ${!item.context_event_type
+ ? ""
+ : item.context_event_type === "call_service"
+ ? // Service Call
+ html` by service ${item.context_domain}.${item.context_service}`
+ : item.context_entity_id === item.entity_id
+ ? // HomeKit or something that self references
+ html` by
+ ${item.context_name
+ ? item.context_name
+ : item.context_event_type}`
+ : // Another entity such as an automation or script
+ html` by
+ ${item.context_entity_id_name}`}
diff --git a/src/panels/lovelace/cards/hui-calendar-card.ts b/src/panels/lovelace/cards/hui-calendar-card.ts
new file mode 100644
index 0000000000..2351454829
--- /dev/null
+++ b/src/panels/lovelace/cards/hui-calendar-card.ts
@@ -0,0 +1,213 @@
+import {
+ css,
+ CSSResult,
+ customElement,
+ html,
+ LitElement,
+ property,
+ PropertyValues,
+ TemplateResult,
+ internalProperty,
+} from "lit-element";
+
+import "../../../components/ha-card";
+import "../../../components/ha-icon";
+import "../../calendar/ha-full-calendar";
+
+import type {
+ HomeAssistant,
+ CalendarEvent,
+ Calendar,
+ CalendarViewChanged,
+ FullCalendarView,
+} from "../../../types";
+import type { LovelaceCard, LovelaceCardEditor } from "../types";
+import type { CalendarCardConfig } from "./types";
+import { findEntities } from "../common/find-entites";
+import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element";
+import "../components/hui-warning";
+import { fetchCalendarEvents } from "../../../data/calendar";
+import { HASSDomEvent } from "../../../common/dom/fire_event";
+import { HA_COLOR_PALETTE } from "../../../common/const";
+import { debounce } from "../../../common/util/debounce";
+import { installResizeObserver } from "../common/install-resize-observer";
+
+@customElement("hui-calendar-card")
+export class HuiCalendarCard extends LitElement implements LovelaceCard {
+ public static async getConfigElement(): Promise {
+ await import(
+ /* webpackChunkName: "hui-calendar-card-editor" */ "../editor/config-elements/hui-calendar-card-editor"
+ );
+ return document.createElement("hui-calendar-card-editor");
+ }
+
+ public static getStubConfig(
+ hass: HomeAssistant,
+ entities: string[],
+ entitiesFill: string[]
+ ) {
+ const includeDomains = ["calendar"];
+ const maxEntities = 2;
+ const foundEntities = findEntities(
+ hass,
+ maxEntities,
+ entities,
+ entitiesFill,
+ includeDomains
+ );
+
+ return {
+ entities: foundEntities,
+ };
+ }
+
+ @property({ attribute: false }) public hass?: HomeAssistant;
+
+ @property({ attribute: false }) public _events: CalendarEvent[] = [];
+
+ @internalProperty() private _config?: CalendarCardConfig;
+
+ @internalProperty() private _calendars: Calendar[] = [];
+
+ @internalProperty() private _narrow = false;
+
+ @internalProperty() private _veryNarrow = false;
+
+ private _resizeObserver?: ResizeObserver;
+
+ public setConfig(config: CalendarCardConfig): void {
+ if (!config.entities) {
+ throw new Error("Entities must be defined");
+ }
+
+ if (config.entities && !Array.isArray(config.entities)) {
+ throw new Error("Entities need to be an array");
+ }
+
+ this._calendars = config!.entities.map((entity, idx) => {
+ return {
+ entity_id: entity,
+ backgroundColor: `#${HA_COLOR_PALETTE[idx % HA_COLOR_PALETTE.length]}`,
+ };
+ });
+
+ this._config = config;
+ }
+
+ public getCardSize(): number {
+ return 4;
+ }
+
+ public connectedCallback(): void {
+ super.connectedCallback();
+ this.updateComplete.then(() => this._attachObserver());
+ }
+
+ public disconnectedCallback(): void {
+ if (this._resizeObserver) {
+ this._resizeObserver.disconnect();
+ }
+ }
+
+ protected render(): TemplateResult {
+ if (!this._config || !this.hass || !this._calendars.length) {
+ return html``;
+ }
+
+ const views: FullCalendarView[] = this._veryNarrow
+ ? ["listWeek"]
+ : ["listWeek", "dayGridMonth", "dayGridDay"];
+
+ return html`
+
+
+
+
+ `;
+ }
+
+ protected updated(changedProps: PropertyValues) {
+ super.updated(changedProps);
+ if (!this._config || !this.hass) {
+ return;
+ }
+
+ const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
+ const oldConfig = changedProps.get("_config") as
+ | CalendarCardConfig
+ | undefined;
+
+ if (
+ !oldHass ||
+ !oldConfig ||
+ (changedProps.has("hass") && oldHass.themes !== this.hass.themes) ||
+ (changedProps.has("_config") && oldConfig.theme !== this._config.theme)
+ ) {
+ applyThemesOnElement(this, this.hass.themes, this._config!.theme);
+ }
+ }
+
+ private async _handleViewChanged(
+ ev: HASSDomEvent
+ ): Promise {
+ this._events = await fetchCalendarEvents(
+ this.hass!,
+ ev.detail.start,
+ ev.detail.end,
+ this._calendars
+ );
+ }
+
+ private _measureCard() {
+ const card = this.shadowRoot!.querySelector("ha-card");
+ if (!card) {
+ return;
+ }
+ this._narrow = card.offsetWidth < 870;
+ this._veryNarrow = card.offsetWidth < 350;
+ }
+
+ private async _attachObserver(): Promise {
+ if (!this._resizeObserver) {
+ await installResizeObserver();
+ this._resizeObserver = new ResizeObserver(
+ debounce(() => this._measureCard(), 250, false)
+ );
+ }
+ const card = this.shadowRoot!.querySelector("ha-card");
+ // If we show an error or warning there is no ha-card
+ if (!card) {
+ return;
+ }
+ this._resizeObserver.observe(card);
+ }
+
+ static get styles(): CSSResult {
+ return css`
+ ha-card {
+ position: relative;
+ padding: 0 8px 8px;
+ }
+
+ .header {
+ color: var(--ha-card-header-color, --primary-text-color);
+ font-size: var(--ha-card-header-font-size, 24px);
+ line-height: 1.2;
+ padding-top: 16px;
+ padding-left: 8px;
+ }
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "hui-calendar-card": HuiCalendarCard;
+ }
+}
diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts
index ab74d1cf0a..e49ebc1ed2 100644
--- a/src/panels/lovelace/cards/hui-history-graph-card.ts
+++ b/src/panels/lovelace/cards/hui-history-graph-card.ts
@@ -19,6 +19,8 @@ import { processConfigEntities } from "../common/process-config-entities";
import { EntityConfig } from "../entity-rows/types";
import { LovelaceCard } from "../types";
import { HistoryGraphCardConfig } from "./types";
+import { HistoryResult } from "../../../data/history";
+import { hasConfigOrEntitiesChanged } from "../common/has-changed";
@customElement("hui-history-graph-card")
export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
@@ -49,7 +51,7 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
@property({ attribute: false }) public hass?: HomeAssistant;
- @internalProperty() private _stateHistory?: any;
+ @internalProperty() private _stateHistory?: HistoryResult;
@internalProperty() private _config?: HistoryGraphCardConfig;
@@ -59,10 +61,10 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
private _cacheConfig?: CacheConfig;
- private _interval?: number;
-
private _fetching = false;
+ private _date?: Date;
+
public getCardSize(): number {
return 4;
}
@@ -97,9 +99,8 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
};
}
- public disconnectedCallback(): void {
- super.disconnectedCallback();
- this._clearInterval();
+ protected shouldUpdate(changedProps: PropertyValues): boolean {
+ return hasConfigOrEntitiesChanged(this, changedProps);
}
protected updated(changedProps: PropertyValues) {
@@ -108,21 +109,19 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
return;
}
- if (!changedProps.has("_config")) {
+ if (!changedProps.has("_config") && !changedProps.has("hass")) {
return;
}
const oldConfig = changedProps.get("_config") as HistoryGraphCardConfig;
- if (oldConfig !== this._config) {
+ if (changedProps.has("_config") && oldConfig !== this._config) {
+ this._getStateHistory();
+ } else if (
+ this._cacheConfig.refresh &&
+ Date.now() - this._date!.getTime() >= this._cacheConfig.refresh * 100
+ ) {
this._getStateHistory();
- this._clearInterval();
-
- if (!this._interval && this._cacheConfig.refresh) {
- this._interval = window.setInterval(() => {
- this._getStateHistory();
- }, this._cacheConfig.refresh * 1000);
- }
}
}
@@ -155,27 +154,23 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
if (this._fetching) {
return;
}
+ this._date = new Date();
this._fetching = true;
try {
- this._stateHistory = await getRecentWithCache(
- this.hass!,
- this._cacheConfig!.cacheKey,
- this._cacheConfig!,
- this.hass!.localize,
- this.hass!.language
- );
+ this._stateHistory = {
+ ...(await getRecentWithCache(
+ this.hass!,
+ this._cacheConfig!.cacheKey,
+ this._cacheConfig!,
+ this.hass!.localize,
+ this.hass!.language
+ )),
+ };
} finally {
this._fetching = false;
}
}
- private _clearInterval(): void {
- if (this._interval) {
- window.clearInterval(this._interval);
- this._interval = undefined;
- }
- }
-
static get styles(): CSSResult {
return css`
.content {
diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts
index cb6df43058..a176fc251c 100644
--- a/src/panels/lovelace/cards/hui-media-control-card.ts
+++ b/src/panels/lovelace/cards/hui-media-control-card.ts
@@ -1,4 +1,3 @@
-import "../../../components/ha-icon-button";
import "@polymer/paper-progress/paper-progress";
import type { PaperProgressElement } from "@polymer/paper-progress/paper-progress";
import {
@@ -6,9 +5,9 @@ import {
CSSResult,
customElement,
html,
+ internalProperty,
LitElement,
property,
- internalProperty,
PropertyValues,
query,
TemplateResult,
@@ -25,12 +24,17 @@ import { supportsFeature } from "../../../common/entity/supports-feature";
import { debounce } from "../../../common/util/debounce";
import "../../../components/ha-card";
import "../../../components/ha-icon";
+import "../../../components/ha-icon-button";
+import { showMediaBrowserDialog } from "../../../components/media-player/show-media-browser-dialog";
import { UNAVAILABLE_STATES } from "../../../data/entity";
import {
computeMediaDescription,
CONTRAST_RATIO,
+ ControlButton,
getCurrentProgress,
+ MediaPickedEvent,
SUPPORTS_PLAY,
+ SUPPORT_BROWSE_MEDIA,
SUPPORT_NEXT_TRACK,
SUPPORT_PAUSE,
SUPPORT_PREVIOUS_TRACK,
@@ -38,17 +42,16 @@ import {
SUPPORT_STOP,
SUPPORT_TURN_OFF,
SUPPORT_TURN_ON,
- ControlButton,
} from "../../../data/media-player";
import type { HomeAssistant, MediaEntity } from "../../../types";
import { contrast } from "../common/color/contrast";
import { findEntities } from "../common/find-entites";
import { hasConfigOrEntityChanged } from "../common/has-changed";
-import "../components/hui-marquee";
-import type { LovelaceCard, LovelaceCardEditor } from "../types";
-import { createEntityNotFoundWarning } from "../components/hui-warning";
-import { MediaControlCardConfig } from "./types";
import { installResizeObserver } from "../common/install-resize-observer";
+import "../components/hui-marquee";
+import { createEntityNotFoundWarning } from "../components/hui-warning";
+import type { LovelaceCard, LovelaceCardEditor } from "../types";
+import { MediaControlCardConfig } from "./types";
function getContrastRatio(
rgb1: [number, number, number],
@@ -185,7 +188,7 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard {
return { type: "media-control", entity: foundEntities[0] || "" };
}
- @property({ attribute: false }) public hass?: HomeAssistant;
+ @property({ attribute: false }) public hass!: HomeAssistant;
@internalProperty() private _config?: MediaControlCardConfig;
@@ -389,12 +392,27 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard {
${controls!.map(
(control) => html`
`
)}
+ ${supportsFeature(stateObj, SUPPORT_BROWSE_MEDIA)
+ ? html`
+
+ `
+ : ""}
`}
@@ -643,14 +661,31 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard {
});
}
+ private _handleBrowseMedia(): void {
+ showMediaBrowserDialog(this, {
+ action: "play",
+ entityId: this._config!.entity,
+ mediaPickedCallback: (pickedMedia: MediaPickedEvent) =>
+ this._playMedia(
+ pickedMedia.media_content_id,
+ pickedMedia.media_content_type
+ ),
+ });
+ }
+
+ private _playMedia(media_content_id: string, media_content_type: string) {
+ this.hass!.callService("media_player", "play_media", {
+ entity_id: this._config!.entity,
+ media_content_id,
+ media_content_type,
+ });
+ }
+
private _handleClick(e: MouseEvent): void {
- this.hass!.callService(
- "media_player",
- (e.currentTarget! as HTMLElement).getAttribute("action")!,
- {
- entity_id: this._config!.entity,
- }
- );
+ const action = (e.currentTarget! as HTMLElement).getAttribute("action")!;
+ this.hass!.callService("media_player", action, {
+ entity_id: this._config!.entity,
+ });
}
private _updateProgressBar(): void {
@@ -831,6 +866,12 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard {
--mdc-icon-size: 40px;
}
+ ha-icon-button.browse-media {
+ position: absolute;
+ right: 0;
+ --mdc-icon-size: 24px;
+ }
+
.top-info {
display: flex;
justify-content: space-between;
@@ -900,6 +941,10 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard {
--mdc-icon-size: 36px;
}
+ .narrow ha-icon-button.browse-media {
+ --mdc-icon-size: 24px;
+ }
+
.no-progress.player:not(.no-controls) {
padding-bottom: 0px;
}
diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts
index 8ea3d859b5..ac3feafc79 100644
--- a/src/panels/lovelace/cards/types.ts
+++ b/src/panels/lovelace/cards/types.ts
@@ -12,6 +12,12 @@ export interface AlarmPanelCardConfig extends LovelaceCardConfig {
theme?: string;
}
+export interface CalendarCardConfig extends LovelaceCardConfig {
+ entities: string[];
+ title?: string;
+ theme?: string;
+}
+
export interface ConditionalCardConfig extends LovelaceCardConfig {
card: LovelaceCardConfig;
conditions: Condition[];
diff --git a/src/panels/lovelace/common/has-changed.ts b/src/panels/lovelace/common/has-changed.ts
index 49eb8df4c7..44f35709a4 100644
--- a/src/panels/lovelace/common/has-changed.ts
+++ b/src/panels/lovelace/common/has-changed.ts
@@ -1,11 +1,8 @@
import { PropertyValues } from "lit-element";
import { HomeAssistant } from "../../../types";
+import { processConfigEntities } from "./process-config-entities";
-// Check if config or Entity changed
-export function hasConfigOrEntityChanged(
- element: any,
- changedProps: PropertyValues
-): boolean {
+function hasConfigChanged(element: any, changedProps: PropertyValues): boolean {
if (changedProps.has("_config")) {
return true;
}
@@ -23,9 +20,41 @@ export function hasConfigOrEntityChanged(
) {
return true;
}
+ return false;
+}
+
+// Check if config or Entity changed
+export function hasConfigOrEntityChanged(
+ element: any,
+ changedProps: PropertyValues
+): boolean {
+ if (hasConfigChanged(element, changedProps)) {
+ return true;
+ }
+
+ const oldHass = changedProps.get("hass") as HomeAssistant;
return (
oldHass.states[element._config!.entity] !==
element.hass!.states[element._config!.entity]
);
}
+
+// Check if config or Entities changed
+export function hasConfigOrEntitiesChanged(
+ element: any,
+ changedProps: PropertyValues
+): boolean {
+ if (hasConfigChanged(element, changedProps)) {
+ return true;
+ }
+
+ const oldHass = changedProps.get("hass") as HomeAssistant;
+
+ const entities = processConfigEntities(element._config!.entities);
+
+ return entities.some(
+ (entity) =>
+ oldHass.states[entity.entity] !== element.hass!.states[entity.entity]
+ );
+}
diff --git a/src/panels/lovelace/create-element/create-card-element.ts b/src/panels/lovelace/create-element/create-card-element.ts
index e7061c1727..bf62823dbb 100644
--- a/src/panels/lovelace/create-element/create-card-element.ts
+++ b/src/panels/lovelace/create-element/create-card-element.ts
@@ -1,5 +1,6 @@
import { LovelaceCardConfig } from "../../../data/lovelace";
import "../cards/hui-button-card";
+import "../cards/hui-calendar-card";
import "../cards/hui-entities-card";
import "../cards/hui-entity-button-card";
import "../cards/hui-entity-card";
@@ -52,6 +53,7 @@ const LAZY_LOAD_TYPES = {
map: () => import("../cards/hui-map-card"),
markdown: () => import("../cards/hui-markdown-card"),
picture: () => import("../cards/hui-picture-card"),
+ calendar: () => import("../cards/hui-calendar-card"),
};
// This will not return an error card but will throw the error
diff --git a/src/panels/lovelace/editor/config-elements/hui-calendar-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-calendar-card-editor.ts
new file mode 100644
index 0000000000..5a7cd7049a
--- /dev/null
+++ b/src/panels/lovelace/editor/config-elements/hui-calendar-card-editor.ts
@@ -0,0 +1,133 @@
+import {
+ customElement,
+ html,
+ LitElement,
+ property,
+ TemplateResult,
+ internalProperty,
+} from "lit-element";
+import { fireEvent } from "../../../../common/dom/fire_event";
+import type { HomeAssistant } from "../../../../types";
+import type { CalendarCardConfig } from "../../cards/types";
+import "../../components/hui-entity-editor";
+import "../../../../components/entity/ha-entities-picker";
+import "../../components/hui-theme-select-editor";
+import type { LovelaceCardEditor } from "../../types";
+import type { EditorTarget, EntitiesEditorEvent } from "../types";
+import { configElementStyle } from "./config-elements-style";
+import {
+ string,
+ optional,
+ object,
+ boolean,
+ array,
+ union,
+ assert,
+} from "superstruct";
+
+const cardConfigStruct = object({
+ type: string(),
+ title: optional(union([string(), boolean()])),
+ theme: optional(string()),
+ entities: array(string()),
+});
+
+@customElement("hui-calendar-card-editor")
+export class HuiCalendarCardEditor extends LitElement
+ implements LovelaceCardEditor {
+ @property({ attribute: false }) public hass?: HomeAssistant;
+
+ @property({ attribute: false }) private _config?: CalendarCardConfig;
+
+ @internalProperty() private _configEntities?: string[];
+
+ public setConfig(config: CalendarCardConfig): void {
+ assert(config, cardConfigStruct);
+ this._config = config;
+ this._configEntities = config.entities;
+ }
+
+ get _title(): string {
+ return this._config!.title || "";
+ }
+
+ get _theme(): string {
+ return this._config!.theme || "";
+ }
+
+ protected render(): TemplateResult {
+ if (!this.hass || !this._config) {
+ return html``;
+ }
+
+ return html`
+ ${configElementStyle}
+
+
+ ${"Calendar Entities" +
+ " (" +
+ this.hass!.localize("ui.panel.lovelace.editor.card.config.required") +
+ ")"}
+
+
+
+ `;
+ }
+
+ private _valueChanged(ev: EntitiesEditorEvent | CustomEvent): void {
+ if (!this._config || !this.hass) {
+ return;
+ }
+
+ const target = ev.target! as EditorTarget;
+
+ if (this[`_${target.configValue}`] === target.value) {
+ return;
+ }
+
+ if (ev.detail && ev.detail.value && Array.isArray(ev.detail.value)) {
+ this._config = { ...this._config, entities: ev.detail.value };
+ } else if (target.configValue) {
+ if (target.value === "") {
+ delete this._config[target.configValue!];
+ } else {
+ this._config = {
+ ...this._config,
+ [target.configValue]: target.value,
+ };
+ }
+ }
+
+ fireEvent(this, "config-changed", { config: this._config });
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "hui-calendar-card-editor": HuiCalendarCardEditor;
+ }
+}
diff --git a/src/panels/lovelace/editor/lovelace-cards.ts b/src/panels/lovelace/editor/lovelace-cards.ts
index 9d777fa942..13c099a791 100644
--- a/src/panels/lovelace/editor/lovelace-cards.ts
+++ b/src/panels/lovelace/editor/lovelace-cards.ts
@@ -9,6 +9,10 @@ export const coreCards: Card[] = [
type: "button",
showElement: true,
},
+ {
+ type: "calendar",
+ showElement: true,
+ },
{
type: "entities",
showElement: true,
diff --git a/src/translations/en.json b/src/translations/en.json
index 6630adb0e6..caa70d5a03 100755
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -179,6 +179,13 @@
"media_player": {
"source": "Source",
"sound_mode": "Sound mode",
+ "browse_media": "Browse media",
+ "turn_on": "Turn on",
+ "turn_off": "Turn off",
+ "media_play": "Play",
+ "media_play_pause": "Play/pause",
+ "media_next_track": "Next",
+ "media_previous_track": "Previous",
"text_to_speak": "Text to speak"
},
"persistent_notification": {
@@ -312,6 +319,7 @@
"past": "{time} ago",
"future": "In {time}",
"never": "Never",
+ "just_now": "Just now",
"duration": {
"second": "{count} {count, plural,\n one {second}\n other {seconds}\n}",
"minute": "{count} {count, plural,\n one {minute}\n other {minutes}\n}",
@@ -341,6 +349,22 @@
"data-table": {
"search": "Search",
"no-data": "No data"
+ },
+ "media-browser": {
+ "pick": "Pick",
+ "play": "Play",
+ "play-media": "Play Media",
+ "pick-media": "Pick Media",
+ "no_items": "No items",
+ "choose-source": "Choose Source",
+ "media-player-browser": "Media Player Browser",
+ "content-type": {
+ "server": "Server",
+ "library": "Library",
+ "artist": "Artist",
+ "album": "Album",
+ "playlist": "Playlist"
+ }
}
},
"dialogs": {
@@ -608,6 +632,7 @@
"add_tag": "Add tag",
"write": "Write",
"edit": "Edit",
+ "never_scanned": "Never scanned",
"create_automation": "Create automation with tag",
"automation_title": "Tag {name} is scanned",
"headers": {
@@ -812,7 +837,8 @@
"input_text": "Reload input texts",
"input_number": "Reload input numbers",
"input_datetime": "Reload input date times",
- "input_select": "Reload input selects"
+ "input_select": "Reload input selects",
+ "template": "Reload template entities"
},
"server_management": {
"heading": "Server management",
@@ -1376,6 +1402,7 @@
}
},
"devices": {
+ "add_prompt": "No {name} have been added using this device yet. You can add one by clicking the + button above.",
"caption": "Devices",
"description": "Manage connected devices",
"device_info": "Device info",
@@ -1421,6 +1448,7 @@
"scripts": "Scripts",
"scenes": "Scenes",
"confirm_rename_entity_ids": "Do you also want to rename the entity id's of your entities?",
+ "confirm_rename_entity_ids_warning": "This will not change any configuration (like automations, scripts, scenes, Lovelace) that is currently using these entities, you will have to update them yourself.",
"data_table": {
"device": "Device",
"manufacturer": "Manufacturer",
@@ -1656,10 +1684,14 @@
"message_received": "Message {id} received on {topic} at {time}:"
},
"ozw": {
+ "button": "Configure",
"common": {
"zwave": "Z-Wave",
"node_id": "Node ID",
- "ozw_instance": "OpenZWave Instance"
+ "ozw_instance": "OpenZWave Instance",
+ "instance": "Instance",
+ "controller": "Controller",
+ "network": "Network"
},
"device_info": {
"zwave_info": "Z-Wave Info",
@@ -1696,6 +1728,44 @@
"refreshing_description": "Refreshing node information...",
"node_status": "Node Status",
"step": "Step"
+ },
+ "network_status": {
+ "online": "Online",
+ "offline": "Offline",
+ "starting": "Starting",
+ "unknown": "Unknown",
+ "details": {
+ "driverallnodesqueried": "All nodes have been queried",
+ "driverallnodesqueriedsomedead": "All nodes have been queried. Some nodes were found dead",
+ "driverawakenodesqueries": "All awake nodes have been queried",
+ "driverremoved": "The driver has been removed",
+ "driverreset": "The driver has been reset",
+ "driverfailed": "Failed to connect to Z-Wave controller",
+ "driverready": "Initializing the Z-Wave controller",
+ "ready": "Ready to connect",
+ "stopped": "OpenZWave stopped",
+ "started": "Connected to MQTT",
+ "starting": "Connecting to MQTT",
+ "offline": "OZWDaemon offline"
+ }
+ },
+ "navigation": {
+ "select_instance": "Select Instance",
+ "network": "Network",
+ "nodes": "Nodes"
+ },
+ "select_instance": {
+ "header": "Select an OpenZWave Instance",
+ "introduction": "You have more than one OpenZWave instance running. Which instance would you like to manage?"
+ },
+ "network": {
+ "header": "Network Management",
+ "introduction": "Manage network-wide functions.",
+ "node_count": "{count} nodes"
+ },
+ "services": {
+ "add_node": "Add Node",
+ "remove_node": "Remove Node"
}
},
"zha": {
@@ -2064,6 +2134,10 @@
"available_states": "Available States",
"description": "The Alarm Panel card allows you to Arm and Disarm your alarm control panel integrations."
},
+ "calendar": {
+ "name": "Calendar",
+ "description": "The Calendar card displays a calendar including day, week and list views"
+ },
"conditional": {
"name": "Conditional",
"description": "The Conditional card displays another card based on entity states.",
@@ -2564,6 +2638,7 @@
"title": "Template",
"description": "Templates are rendered using the Jinja2 template engine with some Home Assistant specific extensions.",
"editor": "Template editor",
+ "reset": "Reset to demo template",
"jinja_documentation": "Jinja2 template documentation",
"template_extensions": "Home Assistant template extensions",
"unknown_error_template": "Unknown error rendering template"
@@ -2591,6 +2666,7 @@
"intro": "Hello {name}, welcome to Home Assistant. How would you like to name your home?",
"intro_location": "We would like to know where you live. This information will help with displaying information and setting up sun-based automations. This data is never shared outside of your network.",
"intro_location_detect": "We can help you fill in this information by making a one-time request to an external service.",
+ "location_name": "Name of your Home Assistant installation",
"location_name_default": "Home",
"button_detect": "Detect",
"finish": "Next"
diff --git a/src/types.ts b/src/types.ts
index 7639f1ea43..a6f27ee768 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -118,8 +118,8 @@ export interface Panels {
export interface Calendar {
entity_id: string;
- name: string;
- backgroundColor: string;
+ name?: string;
+ backgroundColor?: string;
}
export interface SelectedCalendar {
@@ -144,9 +144,15 @@ export interface CalendarViewChanged {
view: string;
}
+export type FullCalendarView =
+ | "dayGridMonth"
+ | "dayGridWeek"
+ | "dayGridDay"
+ | "listWeek";
+
export interface ToggleButton {
- label?: string;
- icon: string;
+ label: string;
+ iconPath: string;
value: string;
}
diff --git a/test-mocha/hassio/create_session.spec.ts b/test-mocha/hassio/create_session.spec.ts
new file mode 100644
index 0000000000..79bf728ea7
--- /dev/null
+++ b/test-mocha/hassio/create_session.spec.ts
@@ -0,0 +1,57 @@
+import * as assert from "assert";
+import { createHassioSession } from "../../src/data/hassio/supervisor";
+
+const sessionID = "fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh";
+
+describe("Create hassio session", function () {
+ it("Test create session without HTTPS", async function () {
+ // @ts-ignore
+ global.document = {};
+ // @ts-ignore
+ global.location = {};
+ await createHassioSession({
+ // @ts-ignore
+ callApi: async function () {
+ return { data: { session: sessionID } };
+ },
+ });
+ assert.equal(
+ // @ts-ignore
+ global.document.cookie,
+ "ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict"
+ );
+ });
+ it("Test create session with HTTPS", async function () {
+ // @ts-ignore
+ global.document = {};
+ // @ts-ignore
+ global.location = { protocol: "https:" };
+ await createHassioSession({
+ // @ts-ignore
+ callApi: async function () {
+ return { data: { session: sessionID } };
+ },
+ });
+ assert.equal(
+ // @ts-ignore
+ global.document.cookie,
+ "ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict;Secure"
+ );
+
+ // Clean up in case they will be used in other tests
+ // @ts-ignore
+ global.document = {};
+ // @ts-ignore
+ global.location = {};
+ });
+ it("Test fail to create", async function () {
+ const createSessionPromise = createHassioSession({
+ // @ts-ignore
+ callApi: async function () {},
+ }).then(
+ () => true,
+ () => false
+ );
+ assert.equal(await createSessionPromise, false);
+ });
+});
diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json
index 884e231eb2..1d8ef955dc 100644
--- a/translations/frontend/cs.json
+++ b/translations/frontend/cs.json
@@ -554,6 +554,10 @@
"loading_history": "Historie stavu se načítá...",
"no_history_found": "Historie stavu chybí."
},
+ "picture-upload": {
+ "label": "Obrázek",
+ "unsupported_format": "Nepodporovaný formát, prosím vyberte obrázek typu JPEG, PNG nebo GIF."
+ },
"related-items": {
"area": "Oblast",
"automation": "Část následujících automatizací",
@@ -656,6 +660,9 @@
"required_error_msg": "Toto pole je povinné",
"yaml_not_editable": "Nastavení této entity nelze upravovat z uživatelského rozhraní. Pouze entity nastavené z uživatelského rozhraní lze konfigurovat v uživatelském rozhraní."
},
+ "image_cropper": {
+ "crop": "Oříznout"
+ },
"more_info_control": {
"dismiss": "Zavřít dialog",
"edit": "Upravit entitu",
@@ -837,7 +844,7 @@
"add_option": "Přidat volbu",
"conditions": "Podmínky",
"default": "Výchozí akce",
- "label": "Vybrat",
+ "label": "Volby",
"option": "Volba {number}",
"remove_option": "Odebrat volbu",
"sequence": "Akce"
@@ -862,12 +869,20 @@
"service_data": "Data služby"
},
"repeat": {
- "label": "Opakovat",
+ "label": "Opakovaní",
"sequence": "Akce",
"type_select": "Typ opakování",
"type": {
"count": {
"label": "Počet"
+ },
+ "until": {
+ "conditions": "Podmínky \"Dokud nenastane\"",
+ "label": "Dokud nenastane"
+ },
+ "while": {
+ "conditions": "Podmínky \"Pokud platí\"",
+ "label": "Pokud platí"
}
}
},
@@ -1042,6 +1057,9 @@
"sunrise": "Východ slunce",
"sunset": "Západ slunce"
},
+ "tag": {
+ "label": "Značka"
+ },
"template": {
"label": "Šablona",
"value_template": "Šablona hodnoty"
@@ -1319,6 +1337,7 @@
"caption": "Zařízení",
"confirm_delete": "Opravdu chcete toto zařízení odstranit?",
"confirm_rename_entity_ids": "Chcete také přejmenovat ID entit vašich entit?",
+ "confirm_rename_entity_ids_warning": "Žádná konfigurace (např. automatizace, skripty, scény, Lovelace), která tyto entity aktuálně používá, nebude změněna. Budete je muset aktualizovat sami.",
"data_table": {
"area": "Oblast",
"battery": "Baterie",
@@ -1641,6 +1660,9 @@
"ozw": {
"common": {
"zwave": "Z-Wave"
+ },
+ "refresh_node": {
+ "step": "Krok"
}
},
"person": {
@@ -1797,6 +1819,31 @@
}
}
},
+ "tags": {
+ "add_tag": "Přidat značku",
+ "automation_title": "Značka {name} je naskenována",
+ "caption": "Značky",
+ "create_automation": "Vytvořit automatizaci se značkou",
+ "description": "Správa značek",
+ "detail": {
+ "create": "Vytvořit",
+ "create_and_write": "Vytvořit a zapsat",
+ "delete": "Smazat",
+ "description": "Popis",
+ "name": "Název",
+ "new_tag": "Nová značka",
+ "tag_id": "ID značky",
+ "tag_id_placeholder": "Automaticky vygenerováno, pokud zůstane prázdné",
+ "update": "Aktualizovat"
+ },
+ "edit": "Upravit",
+ "headers": {
+ "last_scanned": "Naposledy naskenováno",
+ "name": "Název"
+ },
+ "no_tags": "Žádné značky",
+ "write": "Zapsat"
+ },
"users": {
"add_user": {
"caption": "Přidat uživatele",
diff --git a/translations/frontend/de.json b/translations/frontend/de.json
index 130ade04c7..6bd1aa079d 100644
--- a/translations/frontend/de.json
+++ b/translations/frontend/de.json
@@ -57,7 +57,7 @@
"boost": "Boost",
"comfort": "Komfort",
"eco": "Eco",
- "home": "Zu Hause",
+ "home": "Zuhause",
"normal": "Normal",
"sleep": "Schlafen"
}
@@ -96,7 +96,7 @@
"armed": "Aktiv",
"armed_away": "Aktiv, abwesend",
"armed_custom_bypass": "Aktiv, benutzerdefiniert",
- "armed_home": "Aktiv, zu Hause",
+ "armed_home": "Aktiv, Zuhause",
"armed_night": "Aktiv, Nacht",
"arming": "Aktiviere",
"disarmed": "Inaktiv",
@@ -267,7 +267,7 @@
"standby": "Standby"
},
"person": {
- "home": "Zu Hause"
+ "home": "Zuhause"
},
"plant": {
"ok": "OK",
@@ -2137,7 +2137,7 @@
"empty_state": {
"go_to_integrations_page": "Gehe zur Integrationsseite.",
"no_devices": "Auf dieser Seite können Sie Ihre Geräte steuern, es sieht jedoch so aus, als hätten Sie noch keine eingerichtet. Gehen Sie zur Integrationsseite, um damit zu beginnen.",
- "title": "Willkommen zu Hause"
+ "title": "Willkommen Zuhause"
},
"entities": {
"never_triggered": "Nie ausgelöst"
diff --git a/translations/frontend/en.json b/translations/frontend/en.json
index 461f4c7471..24b2f221a9 100644
--- a/translations/frontend/en.json
+++ b/translations/frontend/en.json
@@ -899,7 +899,7 @@
"wait_template": "Wait Template"
}
},
- "unsupported_action": "Unsupported action: {action}"
+ "unsupported_action": "No UI support for action: {action}"
},
"alias": "Name",
"conditions": {
@@ -965,7 +965,7 @@
"zone": "Zone"
}
},
- "unsupported_condition": "Unsupported condition: {condition}"
+ "unsupported_condition": "No UI support for condition: {condition}"
},
"default_name": "New Automation",
"description": {
@@ -1057,6 +1057,9 @@
"sunrise": "Sunrise",
"sunset": "Sunset"
},
+ "tag": {
+ "label": "Tag"
+ },
"template": {
"label": "Template",
"value_template": "Value template"
@@ -1084,7 +1087,7 @@
"zone": "Zone"
}
},
- "unsupported_platform": "Unsupported platform: {platform}"
+ "unsupported_platform": "No UI support for platform: {platform}"
},
"unsaved_confirm": "You have unsaved changes. Are you sure you want to leave?"
},
@@ -1334,6 +1337,7 @@
"caption": "Devices",
"confirm_delete": "Are you sure you want to delete this device?",
"confirm_rename_entity_ids": "Do you also want to rename the entity id's of your entities?",
+ "confirm_rename_entity_ids_warning": "This will not change any configuration (like automations, scripts, scenes, Lovelace) that is currently using these entities, you will have to update them yourself.",
"data_table": {
"area": "Area",
"battery": "Battery",
@@ -1850,6 +1854,31 @@
}
}
},
+ "tags": {
+ "add_tag": "Add tag",
+ "automation_title": "Tag {name} is scanned",
+ "caption": "Tags",
+ "create_automation": "Create automation with tag",
+ "description": "Manage tags",
+ "detail": {
+ "create": "Create",
+ "create_and_write": "Create and Write",
+ "delete": "Delete",
+ "description": "Description",
+ "name": "Name",
+ "new_tag": "New tag",
+ "tag_id": "Tag id",
+ "tag_id_placeholder": "Autogenerated when left empty",
+ "update": "Update"
+ },
+ "edit": "Edit",
+ "headers": {
+ "last_scanned": "Last scanned",
+ "name": "Name"
+ },
+ "no_tags": "No tags",
+ "write": "Write"
+ },
"users": {
"add_user": {
"caption": "Add user",
diff --git a/translations/frontend/es.json b/translations/frontend/es.json
index b7a8f86dba..921ef74f4c 100644
--- a/translations/frontend/es.json
+++ b/translations/frontend/es.json
@@ -554,6 +554,10 @@
"loading_history": "Cargando historial de estado...",
"no_history_found": "No se encontró historial de estado."
},
+ "picture-upload": {
+ "label": "Imagen",
+ "unsupported_format": "Formato no soportado, por favor, selecciona una imagen JPEG, PNG o GIF."
+ },
"related-items": {
"area": "Área",
"automation": "Parte de las siguientes automatizaciones",
@@ -656,6 +660,9 @@
"required_error_msg": "Este campo es obligatorio",
"yaml_not_editable": "La configuración de esta entidad no se puede editar desde la IU. Solo las entidades configuradas desde la IU se pueden configurar desde la IU"
},
+ "image_cropper": {
+ "crop": "Recortar"
+ },
"more_info_control": {
"dismiss": "Descartar diálogo",
"edit": "Editar entidad",
@@ -892,7 +899,7 @@
"wait_template": "Plantilla de espera"
}
},
- "unsupported_action": "Acción no admitida: {action}"
+ "unsupported_action": "No hay soporte en la IU para la acción: {action}"
},
"alias": "Nombre",
"conditions": {
@@ -958,7 +965,7 @@
"zone": "Zona"
}
},
- "unsupported_condition": "Condición no admitida: {condition}"
+ "unsupported_condition": "No hay soporte en la IU para la condición: {condition}"
},
"default_name": "Nueva automatización",
"description": {
@@ -1050,6 +1057,9 @@
"sunrise": "Amanecer",
"sunset": "Puesta de sol"
},
+ "tag": {
+ "label": "Etiqueta"
+ },
"template": {
"label": "Plantilla",
"value_template": "Valor de la plantilla"
@@ -1077,7 +1087,7 @@
"zone": "Zona"
}
},
- "unsupported_platform": "Plataforma no admitida: {platform}"
+ "unsupported_platform": "No hay soporte en la IU para la plataforma: {platform}"
},
"unsaved_confirm": "Tienes cambios sin guardar. ¿Estás seguro de que quieres salir?"
},
@@ -1327,6 +1337,7 @@
"caption": "Dispositivos",
"confirm_delete": "¿Estás seguro de que quieres eliminar este dispositivo?",
"confirm_rename_entity_ids": "¿También quieres cambiar el nombre de los identificadores de entidad de tus entidades?",
+ "confirm_rename_entity_ids_warning": "Esto no cambiará ninguna configuración (como automatizaciones, scripts, escenas, Lovelace) que estén utilizando actualmente estas entidades, tendrá que actualizarlas usted mismo.",
"data_table": {
"area": "Área",
"battery": "Batería",
@@ -1843,6 +1854,31 @@
}
}
},
+ "tags": {
+ "add_tag": "Añadir etiqueta",
+ "automation_title": "Se escanea la etiqueta {name}",
+ "caption": "Etiquetas",
+ "create_automation": "Crear automatización con etiqueta",
+ "description": "Administrar etiquetas",
+ "detail": {
+ "create": "Crear",
+ "create_and_write": "Crear y escribir",
+ "delete": "Eliminar",
+ "description": "Descripción",
+ "name": "Nombre",
+ "new_tag": "Nueva etiqueta",
+ "tag_id": "ID de etiqueta",
+ "tag_id_placeholder": "Autogenerado cuando se deja vacío",
+ "update": "Actualizar"
+ },
+ "edit": "Editar",
+ "headers": {
+ "last_scanned": "Última vez escaneada",
+ "name": "Nombre"
+ },
+ "no_tags": "Sin etiquetas",
+ "write": "Escribir"
+ },
"users": {
"add_user": {
"caption": "Añadir usuario",
diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json
index 5a6dcc52ca..e60b28d5d7 100644
--- a/translations/frontend/fr.json
+++ b/translations/frontend/fr.json
@@ -554,6 +554,10 @@
"loading_history": "Chargement de l'historique des valeurs ...",
"no_history_found": "Aucun historique des valeurs trouvé."
},
+ "picture-upload": {
+ "label": "Image",
+ "unsupported_format": "Format non pris en charge, veuillez choisir une image JPEG, PNG ou GIF."
+ },
"related-items": {
"area": "Pièce",
"automation": "Partie des automatisations suivantes",
@@ -656,6 +660,9 @@
"required_error_msg": "Ce champ est requis",
"yaml_not_editable": "Les paramètres de cette entité ne peuvent pas être modifiés à partir de l'interface utilisateur. Seules les entités configurées à partir de l'interface utilisateur sont configurables à partir de l'interface utilisateur."
},
+ "image_cropper": {
+ "crop": "Recadrer"
+ },
"more_info_control": {
"dismiss": "Fermer la fenêtre de dialogue",
"edit": "Modifier l'entité",
@@ -892,7 +899,7 @@
"wait_template": "Template d'attente"
}
},
- "unsupported_action": "Action non supportée : {action}"
+ "unsupported_action": "Pas d'interface utilisateur pour l'action : {action}"
},
"alias": "Nom",
"conditions": {
@@ -958,7 +965,7 @@
"zone": "Zone"
}
},
- "unsupported_condition": "Condition non supportée: {condition}"
+ "unsupported_condition": "Pas d'interface utilisateur pour la condition : {condition}"
},
"default_name": "Nouvelle automatisation",
"description": {
@@ -1050,6 +1057,9 @@
"sunrise": "Lever du soleil",
"sunset": "Coucher du soleil"
},
+ "tag": {
+ "label": "Balise"
+ },
"template": {
"label": "Template",
"value_template": "Contenu du template"
@@ -1077,7 +1087,7 @@
"zone": "Zone"
}
},
- "unsupported_platform": "Plateforme non supportée : {platform}"
+ "unsupported_platform": "Pas d'interface utilisateur pour la plateforme : {platform}"
},
"unsaved_confirm": "Vous avez des changements non enregistrés. Êtes-vous sûr de vouloir quitter?"
},
@@ -1327,6 +1337,7 @@
"caption": "Appareils",
"confirm_delete": "Voulez-vous vraiment supprimer cet appareil ?",
"confirm_rename_entity_ids": "Voulez-vous aussi renommer les ID de vos entités?",
+ "confirm_rename_entity_ids_warning": "Cela ne changera aucune configuration (comme les automatismes, les scripts, les scènes, Lovelace) qui utilise actuellement ces entités, vous devrez les mettre à jour vous-même.",
"data_table": {
"area": "Zone",
"battery": "Batterie",
@@ -1663,9 +1674,18 @@
"complete": "Le processus d'interrogation est terminé",
"configuration": "Obtention la configuration à partir du nœud",
"dynamic": "Obtention de valeurs fréquemment modifiées du nœud",
+ "instances": "Obtention des détails sur les instances ou les canaux pris en charge par un appareil",
+ "manufacturerspecific1": "Obtention des codes d'identification du fabricant et du produit auprès du nœud",
+ "manufacturerspecific2": "Obtention de codes d’identification supplémentaires du fabricant et du produit à partir du nœud",
"neighbors": "Obtenir une liste des nœuds voisins",
+ "nodeinfo": "Obtention des classes de commande prises en charge à partir du nœud",
+ "nodeplusinfo": "Obtention d'informations Z-Wave + à partir du nœud",
+ "probe": "Vérification si le nœud est éveillé/vivant",
+ "protocolinfo": "Obtention des capacités Z-Wave de base de ce nœud à partir du contrôleur",
"session": "Obtention de valeurs rarement modifiées du nœud",
- "static": "Obtention des valeurs statiques de l'appareil"
+ "static": "Obtention des valeurs statiques de l'appareil",
+ "versions": "Obtention d'informations sur les versions des microprogrammes et des classes de commande",
+ "wakeup": "Configuration de la prise en charge des files d'attente et des messages de réveil"
},
"refresh_node": {
"battery_note": "Si le nœud est alimenté par batterie, assurez-vous de l'activer avant de continuer",
@@ -1834,6 +1854,31 @@
}
}
},
+ "tags": {
+ "add_tag": "Ajouter une balise",
+ "automation_title": "La balise {name} est analysée",
+ "caption": "Balises",
+ "create_automation": "Créer une automatisation avec une balise",
+ "description": "Gérer les balises",
+ "detail": {
+ "create": "Créer",
+ "create_and_write": "Créer et Ecrire",
+ "delete": "Supprimer",
+ "description": "Description",
+ "name": "Nom",
+ "new_tag": "Nouvelle balise",
+ "tag_id": "Id de balise",
+ "tag_id_placeholder": "Généré automatiquement lorsque laissé vide",
+ "update": "Mise à jour"
+ },
+ "edit": "Modifier",
+ "headers": {
+ "last_scanned": "Dernière analyse",
+ "name": "Nom"
+ },
+ "no_tags": "Aucunes balises",
+ "write": "Écrire"
+ },
"users": {
"add_user": {
"caption": "Ajouter un utilisateur",
@@ -2497,7 +2542,7 @@
},
"menu": {
"close": "Fermer",
- "configure_ui": "Configurer l'interface utilisateur",
+ "configure_ui": "Modifier le tableau de bord",
"exit_edit_mode": "Quitter le mode d'édition de l'interface utilisateur",
"help": "Aide",
"refresh": "Actualiser",
diff --git a/translations/frontend/he.json b/translations/frontend/he.json
index 933e5bb3c8..1d7b6fe533 100644
--- a/translations/frontend/he.json
+++ b/translations/frontend/he.json
@@ -554,6 +554,10 @@
"loading_history": "טוען היסטוריה...",
"no_history_found": "לא נמצאה היסטוריה"
},
+ "picture-upload": {
+ "label": "תמונה",
+ "unsupported_format": "פורמט לא נתמך, בחר תמונת JPEG, PNG או GIF."
+ },
"related-items": {
"area": "אֵזוֹר",
"automation": "חלק מהאוטומציות הבאות",
@@ -656,6 +660,9 @@
"required_error_msg": "שדה זה הוא חובה",
"yaml_not_editable": "אין אפשרות לערוך את ההגדרות של ישות זו מממשק המשתמש. רק ישויות שהוגדרו מממשק המשתמש ניתנות להגדרה מתוך ממשק המשתמש."
},
+ "image_cropper": {
+ "crop": "חתוך"
+ },
"more_info_control": {
"dismiss": "סגור",
"edit": "ערוך יישות",
@@ -1050,6 +1057,9 @@
"sunrise": "זריחה",
"sunset": "שקיעה"
},
+ "tag": {
+ "label": "תג "
+ },
"template": {
"label": "תבנית",
"value_template": "תבנית ערך"
@@ -1327,6 +1337,7 @@
"caption": "התקנים",
"confirm_delete": "האם אתה בטוח שברצונך למחוק מכשיר זה?",
"confirm_rename_entity_ids": "האם אתה רוצה גם לשנות את המזהים של הישויות שלך?",
+ "confirm_rename_entity_ids_warning": "שינוי זה לא ישפיע על התצורה (כמו אוטומציות, קבצי Script, סצנות, Lovelace) המשתמשת כעת בישויות אלה, יהיה עליך לעדכן אותן בעצמך.",
"data_table": {
"area": "אזור",
"battery": "סוללה",
@@ -1656,6 +1667,37 @@
"node_failed": "הרכיב נכשל",
"stage": "שלב",
"zwave_info": "מידע Z-Wave"
+ },
+ "node_query_stages": {
+ "associations": "מרענן קבוצות וחברויות",
+ "cacheload": "טוען מידע מקובץ המטמון של OpenZWave. רכיבי סוללה יישארו בשלב זה עד שהרכיב יתעורר.",
+ "complete": "תהליך הראיון הושלם",
+ "configuration": "מקבל ערכי תצורה מהרכיב",
+ "dynamic": "מקבל ערכים המשתנים לעתים קרובות מהרכיב",
+ "instances": "מקבל פרטים אודות המופעים או הערוצים שבהם הרכיב תומך",
+ "manufacturerspecific1": "קבלת קודי יצרן ומזהי מוצר מהרכיב",
+ "manufacturerspecific2": "מקבל קודי יצרן ומזהי מוצר נוספים מהרכיב",
+ "neighbors": "קבלת רשימת שכנים מהרכיב",
+ "nodeinfo": "קבלת מחלקות פקודות נתמכות מהרכיב",
+ "nodeplusinfo": "קבלת מידע Z-Wave+ מהרכיב",
+ "probe": "בדיקה האם הרכיב ער/חי",
+ "protocolinfo": "קבלת יכולות Z-Wave בסיסיות של רכיב זה מהבקר",
+ "session": "מקבל ערכים המשתנים לעתים רחוקות מהרכיב",
+ "static": "מקבל ערכים סטטיים מהרכיב",
+ "versions": "מקבל מידע אודות גירסאות קושחה ומחלקות פקודות",
+ "wakeup": "הגדרת תמיכה עבור תורי התעוררות והודעות"
+ },
+ "refresh_node": {
+ "battery_note": "אם הרכיב מופעל באמצעות סוללה, הקפד להעיר אותו לפני שתמשיך",
+ "complete": "רענון הרכיב הושלם",
+ "description": "זה יגיד ל- OpenZWave לראיין מחדש את הרכיב ולעדכן את הפקודות, היכולות והערכים של הרכיב.",
+ "node_status": "מצה הרכיב",
+ "refreshing_description": "מרענן מידע על הרכיב",
+ "start_refresh_button": "התחל לרענן",
+ "step": "שלב",
+ "title": "רענן מידע הרכיב",
+ "wakeup_header": "הוראות התעוררות עבור",
+ "wakeup_instructions_source": "הוראות ההתעוררות מקורן במסד הנתונים של קהילת ה OpenZWave."
}
},
"person": {
@@ -1812,6 +1854,31 @@
}
}
},
+ "tags": {
+ "add_tag": "הוסף תג",
+ "automation_title": "התג {name} נסרק",
+ "caption": "תגים",
+ "create_automation": "צור אוטומציה עם תג",
+ "description": "ניהול תגים",
+ "detail": {
+ "create": "צור",
+ "create_and_write": "צור וכתוב",
+ "delete": "מחק",
+ "description": "תיאור",
+ "name": "שם",
+ "new_tag": "תג חדש",
+ "tag_id": "מזהה תג",
+ "tag_id_placeholder": "מחולל אוטומטית אם ריק",
+ "update": "עדכן"
+ },
+ "edit": "ערוך",
+ "headers": {
+ "last_scanned": "נסרק לאחרונה",
+ "name": "שם"
+ },
+ "no_tags": "אין תגים",
+ "write": "כתוב"
+ },
"users": {
"add_user": {
"caption": "הוסף משתמש",
diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json
index f525c91cad..0198e803e4 100644
--- a/translations/frontend/ko.json
+++ b/translations/frontend/ko.json
@@ -554,6 +554,10 @@
"loading_history": "상태 기록 내용 읽는 중...",
"no_history_found": "상태 기록 내용이 없습니다."
},
+ "picture-upload": {
+ "label": "그림",
+ "unsupported_format": "지원되지 않는 형식입니다. JPEG, PNG 또는 GIF 이미지를 선택해주세요."
+ },
"related-items": {
"area": "영역",
"automation": "관련된 자동화",
@@ -656,6 +660,9 @@
"required_error_msg": "이 입력란은 필수 요소입니다",
"yaml_not_editable": "이 구성요소의 설정은 UI 에서 편집할 수 없습니다. UI 에서 설정한 구성요소만 UI 에서 구성할 수 있습니다."
},
+ "image_cropper": {
+ "crop": "자르기"
+ },
"more_info_control": {
"dismiss": "대화창 닫기",
"edit": "구성요소 편집",
@@ -1656,6 +1663,37 @@
"node_failed": "노드 실패",
"stage": "단계",
"zwave_info": "Z-Wave 정보"
+ },
+ "node_query_stages": {
+ "associations": "연결 그룹 및 구성원 자격 새로고침",
+ "cacheload": "OpenZWave 캐시 파일에서 정보를 읽어오기. 배터리 노드는 노드가 절전 해제 상태가 될 때까지 이 단계를 유지합니다.",
+ "complete": "인터뷰 과정이 완료되었습니다",
+ "configuration": "노드에서 구성 값 가져오기",
+ "dynamic": "노드에서 자주 변경되는 값 가져오기",
+ "instances": "기기가 지원하는 인스턴스 또는 채널에 대한 세부 정보 가져오기",
+ "manufacturerspecific1": "노드에서 제조업체 및 제품 ID 코드 가져오기",
+ "manufacturerspecific2": "노드에서 추가 제조업체 및 제품 ID 코드 가져오기",
+ "neighbors": "노드의 연관 항목 목록 가져오기",
+ "nodeinfo": "노드에서 지원되는 명령 클래스 가져오기",
+ "nodeplusinfo": "노드에서 Z-Wave+ 정보 가져오기",
+ "probe": "노드가 절전 해제 상태 또는 활성 상태인지 확인",
+ "protocolinfo": "컨트롤러에서 이 노드의 기본 Z-Wave 기능 가져오기",
+ "session": "노드에서 간헐적으로 변경되는 값 가져오기",
+ "static": "기기에서 정적 값 가져오기",
+ "versions": "펌웨어 및 명령 클래스 버전에 대한 정보 가져오기",
+ "wakeup": "절전 해제 대기열 및 메시지에 대한 지원 설정"
+ },
+ "refresh_node": {
+ "battery_note": "노드가 배터리 전원을 사용하는 경우 계속하기 전에 절전 모드가 해제되어 있는지 확인해주세요",
+ "complete": "노드 새로고침 완료",
+ "description": "OpenZWave 가 노드를 다시 인터뷰하고 노드의 명령 클래스, 기능 및 값을 업데이트하도록 지시합니다.",
+ "node_status": "노드 상태",
+ "refreshing_description": "노드 정보를 새로고침 하는 중...",
+ "start_refresh_button": "새로고침 시작",
+ "step": "단계",
+ "title": "노드 정보 새로고침",
+ "wakeup_header": "절전 해제 지침",
+ "wakeup_instructions_source": "절전 해제 지침은 OpenZWave 커뮤니티 기기 데이터베이스에서 제공됩니다."
}
},
"person": {
@@ -2272,7 +2310,7 @@
"minimum": "최소",
"name": "이름",
"no_theme": "테마 없음",
- "refresh_interval": "새로 고침 간격",
+ "refresh_interval": "새로고침 간격",
"search": "검색",
"secondary_info_attribute": "보조 정보 속성",
"show_icon": "아이콘 표시",
diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json
index c2f3ef2afc..f3bc24879d 100644
--- a/translations/frontend/lb.json
+++ b/translations/frontend/lb.json
@@ -554,6 +554,10 @@
"loading_history": "Lued Status Verlaaf",
"no_history_found": "Keen Status Verlaaf fonnt"
},
+ "picture-upload": {
+ "label": "Bild",
+ "unsupported_format": "Net ënnerstëtzte Format, wiel e JPEG, PNG oder GIF Bild."
+ },
"related-items": {
"area": "Beräich",
"automation": "Deel vun de folgenden Automatismen",
@@ -656,6 +660,9 @@
"required_error_msg": "Dëst Feld ass erfuerderlech",
"yaml_not_editable": "D'Astellunge vun dëser Entitéit kënnen net vun vum Benotzer Interface as geännert ginn. Nëmmen Entitéiten déi iwwer den Benotzer Interface aus konfiguréiert sinn kënnen vun do aus geännert ginn."
},
+ "image_cropper": {
+ "crop": "Kierzen"
+ },
"more_info_control": {
"dismiss": "Dialog ofbriechen",
"edit": "Entitéit änneren",
@@ -1659,6 +1666,7 @@
},
"node_query_stages": {
"associations": "Associatiounsgruppen a Memberen aktualiséieren",
+ "cacheload": "Lued Informatioune vun der OpenZWave Cache Datei. Batterie Nodes bleiwen op dëser Etapp bis de Node erwächt.",
"complete": "Interview Prozess ass komplett",
"configuration": "Konfiguratiounswerter vum Node kréien",
"instances": "Detailer kréien iwwert wéieng Instanzen oder Kanäl en Apparat ënnerstëtzt",
diff --git a/translations/frontend/lt.json b/translations/frontend/lt.json
index 568dd51c70..95f47e7a3a 100644
--- a/translations/frontend/lt.json
+++ b/translations/frontend/lt.json
@@ -6,6 +6,7 @@
},
"panel": {
"config": "Konfigūracija",
+ "developer_tools": "Kūrėjo įrankiai",
"history": "Istorija",
"logbook": "Veiksmų žurnalas",
"mailbox": "Pašto dėžutė",
@@ -17,6 +18,7 @@
"state_attributes": {
"climate": {
"fan_mode": {
+ "auto": "Auto",
"off": "Išjungta",
"on": "Įjungta"
}
@@ -40,9 +42,11 @@
"unknown": "Nžn"
},
"device_tracker": {
+ "home": "Namai",
"not_home": "Išvykęs"
},
"person": {
+ "home": "Namai",
"not_home": "Išvykęs"
}
},
@@ -61,6 +65,13 @@
"on": "Įjungta"
},
"binary_sensor": {
+ "battery": {
+ "off": "Normalus",
+ "on": "Žemas"
+ },
+ "cold": {
+ "on": "Šalta"
+ },
"connectivity": {
"off": "Atsijungęs",
"on": "Prisijungęs"
@@ -81,6 +92,9 @@
"off": "Neaptikta",
"on": "Aptikta"
},
+ "heat": {
+ "on": "Karšta"
+ },
"moisture": {
"off": "Sausa",
"on": "Šlapia"
@@ -98,7 +112,12 @@
"on": "Atidaryta"
},
"presence": {
- "off": "Išvykęs"
+ "off": "Išvykęs",
+ "on": "Namai"
+ },
+ "problem": {
+ "off": "Ok",
+ "on": "Problema"
},
"safety": {
"off": "Saugu",
@@ -131,21 +150,44 @@
"streaming": "Transliuojama"
},
"climate": {
+ "cool": "Šaltas",
+ "dry": "Sausa",
+ "fan_only": "Tik ventiliatorius",
+ "heat": "Šiluma",
"off": "Išjungta"
},
+ "configurator": {
+ "configure": "Konfigūruoti",
+ "configured": "Sukonfigūruotas"
+ },
+ "cover": {
+ "closed": "Uždarytas",
+ "closing": "Uždarymas",
+ "open": "Atidarytas",
+ "opening": "Atidarymas",
+ "stopped": "Sustabdytas"
+ },
"default": {
"unavailable": "(nepasiekiamas)",
"unknown": "Nežinoma"
},
+ "device_tracker": {
+ "not_home": "Išvykęs"
+ },
"fan": {
"off": "Išjungta",
"on": "Įjungta"
},
"group": {
+ "closing": "Uždarymas",
+ "home": "Namai",
"not_home": "Išvykęs",
"off": "Išjungta",
"ok": "Ok",
- "on": "Įjungta"
+ "on": "Įjungta",
+ "open": "Atidarytas",
+ "stopped": "Sustabdytas",
+ "unlocked": "Atrakinta"
},
"input_boolean": {
"on": "Įjungta"
@@ -154,9 +196,17 @@
"off": "Išjungta",
"on": "Įjungta"
},
+ "lock": {
+ "locked": "Užrakintas",
+ "unlocked": "Atrakinta"
+ },
"media_player": {
+ "idle": "Laukimo režimas",
"off": "Išjungta",
- "on": "Įjungta"
+ "on": "Įjungta",
+ "paused": "pristabdytas",
+ "playing": "Groja",
+ "standby": "Laukimo"
},
"person": {
"home": "Namuose"
@@ -173,6 +223,9 @@
"off": "Išjungta",
"on": "Įjungta"
},
+ "sun": {
+ "above_horizon": "Virš horizonto"
+ },
"switch": {
"off": "Išjungta",
"on": "Įjungta"
@@ -200,6 +253,12 @@
"alarm_control_panel": {
"arm_custom_bypass": "Individualizuotas apėjimas"
},
+ "camera": {
+ "not_available": "Vaizdas negalimas"
+ },
+ "persistent_notification": {
+ "dismiss": "Atmesti"
+ },
"weather": {
"attributes": {
"air_pressure": "Atmosferos slėgis",
@@ -221,6 +280,8 @@
}
},
"common": {
+ "cancel": "Atšaukti",
+ "loading": "Pakrovimas",
"save": "Išsaugoti"
},
"components": {
@@ -250,6 +311,11 @@
"second": "{count} {count, plural,\n one {sekundė}\n other {sekundės}\n}",
"week": "{count} {count, plural,\n one {savaitė}\n other {savaitės}\n}"
},
+ "login-form": {
+ "log_in": "Prisijungti",
+ "password": "Slaptažodis",
+ "remember": "Prisiminti"
+ },
"notification_drawer": {
"close": "Uždaryti"
},
@@ -328,10 +394,20 @@
"edit_ui": "Redaguoti naudojant vartotojo sąsają",
"edit_yaml": "Redaguoti kaip YAML",
"triggers": {
+ "add": "Pridėti trigerį",
"delete": "Ištrinti",
+ "delete_confirm": "Ar tikrai norite tai ištrinti?",
+ "duplicate": "Pasikartojantys",
+ "introduction": "Trigeriai yra tai, kas pradeda automatizavimo taisyklės apdorojimą. Tai pačiai taisyklei galima nurodyti kelis aktyviklius. Kai tik įsijungs trigeris, Home Assistant patikrins sąlygas, jei tokių yra, ir iškviečia veiksmą.",
"learn_more": "Sužinokite daugiau apie trigerius",
"name": "Trigeris",
+ "type_select": "Trigerio tipas",
"type": {
+ "event": {
+ "event_data": "Įvykio duomenys",
+ "event_type": "Įvykio tipas",
+ "label": "Įvykis:"
+ },
"geo_location": {
"enter": "Įveskite",
"event": "Įvykis:",
@@ -340,11 +416,32 @@
"source": "Šaltinis",
"zone": "Zona"
},
+ "homeassistant": {
+ "event": "Įvykis:",
+ "label": "Home Assistant",
+ "shutdown": "Išjungti",
+ "start": "Pradėti"
+ },
"mqtt": {
- "label": "MQTT"
+ "label": "MQTT",
+ "topic": "Tema"
+ },
+ "numeric_state": {
+ "above": "Aukščiau",
+ "below": "Žemiau",
+ "label": "Skaitinė būsena",
+ "value_template": "Vertės šablonas (pasirinktinai)"
+ },
+ "state": {
+ "from": "Iš",
+ "to": "Kam"
},
"sun": {
- "event": "Ivykis"
+ "event": "Ivykis",
+ "label": "Saulė",
+ "offset": "Poslinkis (pasirinktinai)",
+ "sunrise": "Saulėtekis",
+ "sunset": "Saulėlydis"
},
"time_pattern": {
"hours": "Valandos",
@@ -360,7 +457,8 @@
"event": "Įvykis",
"zone": "Vieta"
}
- }
+ },
+ "unsupported_platform": "Nėra UI palaikymo platformai: {platform}"
}
},
"picker": {
@@ -374,6 +472,9 @@
},
"caption": "Home Assistant Cloud"
},
+ "core": {
+ "caption": "Bendra"
+ },
"customize": {
"picker": {
"header": "Pritaikymas"
@@ -395,6 +496,7 @@
"introduction2": "Naudokite subjekto registrą, kad perrašytumėte pavadinimą, pakeiskite subjekto ID arba pašalintumėte įrašą iš namų asistento. Atminkite, kad pašalindami registro įrašą tai nepanaikins pačio subjekto. Norėdami tai padaryti, sekite toliau pateiktą nuorodą ir pašalinkite ją iš integracijos puslapio."
}
},
+ "header": "Konfigūruoti Home Assistant",
"integrations": {
"config_entry": {
"hub": "Prijungtas per",
@@ -408,6 +510,7 @@
},
"details": "Integravimo informacija"
},
+ "introduction": "Šiame vaizde galima sukonfigūruoti savo komponentus ir Home Assistant. Dar ne viską galima sukonfigūruoti iš vartotojo sąsajos (UI ), tačiau mes prie to dirbame.",
"mqtt": {
"title": "MQTT"
},
@@ -454,11 +557,29 @@
"question_trust": "Ar pasitikite išoriniu skydeliu {name} adresu {link}?"
}
},
+ "developer-tools": {
+ "tabs": {
+ "events": {
+ "title": "Įvykiai"
+ },
+ "services": {
+ "title": "Paslaugos"
+ },
+ "states": {
+ "title": "Būsenos"
+ },
+ "templates": {
+ "title": "Šablonas"
+ }
+ }
+ },
"history": {
+ "period": "Laikotarpis",
"ranges": {
"today": "Šiandien",
"yesterday": "Vakar"
- }
+ },
+ "showing_entries": "Rodomi įrašai, skirti"
},
"logbook": {
"period": "Laikotarpis",
@@ -535,6 +656,12 @@
"entity_not_found": "Subjektas nepasiekiamas: {entity}"
}
},
+ "mailbox": {
+ "delete_button": "Ištrinti",
+ "delete_prompt": "Ištrinti šį pranešimą?",
+ "empty": "Neturite jokių pranešimų",
+ "playback_title": "Pranešimų atkūrimas"
+ },
"page-authorize": {
"form": {
"providers": {
@@ -587,6 +714,9 @@
"push_notifications": {
"description": "Siųsti pranešimus į šį įrenginį."
}
+ },
+ "shopping-list": {
+ "microphone_tip": "Bakstelėkite mikrofoną viršutinėje dešinėje ir pasakykite arba įveskite „Pridėti saldainių prie mano pirkinių sąrašo“"
}
}
}
diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json
index 6a5167233e..dacd48e75b 100644
--- a/translations/frontend/nb.json
+++ b/translations/frontend/nb.json
@@ -554,6 +554,10 @@
"loading_history": "Laster statushistorikk...",
"no_history_found": "Ingen statushistorikk funnet."
},
+ "picture-upload": {
+ "label": "Bilde",
+ "unsupported_format": "Formatet støttes ikke, vennligst velge et JPEG-, PNG- eller GIF-bilde."
+ },
"related-items": {
"area": "Område",
"automation": "Del av følgende automasjoner",
@@ -656,6 +660,9 @@
"required_error_msg": "Dette feltet er påkrevd",
"yaml_not_editable": "Innstillingene for denne entiteten kan ikke redigeres fra brukergrensesnittet. Bare entiteter som er satt opp fra brukergrensesnittet, kan konfigureres fra brukergrensesnittet."
},
+ "image_cropper": {
+ "crop": "Beskjære"
+ },
"more_info_control": {
"dismiss": "Avvis dialogboksen",
"edit": "Redigér entitet",
@@ -892,7 +899,7 @@
"wait_template": "Ventemal"
}
},
- "unsupported_action": "Ikke-støttet handling: {action}"
+ "unsupported_action": "Ingen brukergrensesnitt for handling: {action}"
},
"alias": "Navn",
"conditions": {
@@ -958,7 +965,7 @@
"zone": "Sone"
}
},
- "unsupported_condition": "Ikke-støttet tilstand: {condition}"
+ "unsupported_condition": "Ingen brukergrensesnitt for bruk: {condition}"
},
"default_name": "Ny automasjon",
"description": {
@@ -1050,6 +1057,9 @@
"sunrise": "Soloppgang",
"sunset": "Solnedgang"
},
+ "tag": {
+ "label": "Tag"
+ },
"template": {
"label": "Mal",
"value_template": "Verdi mal"
@@ -1077,7 +1087,7 @@
"zone": "Sone"
}
},
- "unsupported_platform": "Ikke-støttet plattform: {platform}"
+ "unsupported_platform": "Ingen UI-støtte for plattform: {platform}"
},
"unsaved_confirm": "Du har ulagrede endringer. Er du sikker på at du vil lukke?"
},
@@ -1843,6 +1853,31 @@
}
}
},
+ "tags": {
+ "add_tag": "Legg til tag",
+ "automation_title": "Tag {name} skannes",
+ "caption": "Tags",
+ "create_automation": "Opprett automatisering med tag",
+ "description": "Administrer tagger",
+ "detail": {
+ "create": "Opprett",
+ "create_and_write": "Opprette og skrive",
+ "delete": "Slett",
+ "description": "Beskrivelse",
+ "name": "Navn",
+ "new_tag": "Ny tag",
+ "tag_id": "Tag id",
+ "tag_id_placeholder": "Automatisk generert når den er tom",
+ "update": "Oppdater"
+ },
+ "edit": "Redigere",
+ "headers": {
+ "last_scanned": "Sist skannet",
+ "name": "Navn"
+ },
+ "no_tags": "Ingen tagger",
+ "write": "Skrive"
+ },
"users": {
"add_user": {
"caption": "Legg til bruker",
diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json
index 3f772729ec..9e8fee8fe5 100644
--- a/translations/frontend/pl.json
+++ b/translations/frontend/pl.json
@@ -554,6 +554,10 @@
"loading_history": "Ładowanie historii...",
"no_history_found": "Nie znaleziono historii."
},
+ "picture-upload": {
+ "label": "Obraz",
+ "unsupported_format": "Nieobsługiwany format, wybierz obraz JPEG, PNG lub GIF."
+ },
"related-items": {
"area": "Obszar",
"automation": "Element następujących automatyzacji",
@@ -656,6 +660,9 @@
"required_error_msg": "To pole jest wymagane",
"yaml_not_editable": "Ustawienia tej encji nie mogą być edytowane z interfejsu użytkownika. Tylko encje dodane z interfejsu użytkownika można konfigurować z poziomu interfejsu użytkownika."
},
+ "image_cropper": {
+ "crop": "Przytnij"
+ },
"more_info_control": {
"dismiss": "Zamknij okno dialogowe",
"edit": "Edytuj encję",
@@ -1656,6 +1663,37 @@
"node_failed": "Węzeł uszkodzony",
"stage": "Etap",
"zwave_info": "Informacje Z-Wave"
+ },
+ "node_query_stages": {
+ "associations": "Odświeżanie grup skojarzeń i członkostwa",
+ "cacheload": "Ładowanie informacji z pliku pamięci podręcznej OpenZWave. Węzły baterii pozostaną na tym etapie, dopóki węzeł się nie wybudzi.",
+ "complete": "Proces wywiadu jest zakończony",
+ "configuration": "Pobieranie wartości konfiguracyjnych z węzła",
+ "dynamic": "Pobieranie często zmieniających się wartości z węzła",
+ "instances": "Pobieranie szczegółowych informacji o instancjach lub kanałach obsługiwanych przez urządzenie",
+ "manufacturerspecific1": "Pobieranie kodów producenta i produktu z węzła",
+ "manufacturerspecific2": "Pobieranie dodatkowych kodów producenta i produktu z węzła",
+ "neighbors": "Pobieranie listy sąsiadów węzła",
+ "nodeinfo": "Pobieranie obsługiwanych klas poleceń z węzła",
+ "nodeplusinfo": "Pobieranie informacji Z-Wave+ z węzła",
+ "probe": "Sprawdzanie, czy węzeł jest wybudzony/żywy",
+ "protocolinfo": "Pobieranie z kontrolera informacji o podstawowych możliwościach Z-Wave tego węzła",
+ "session": "Pobieranie rzadko zmieniających się wartości z węzła",
+ "static": "Pobieranie wartości statycznych z urządzenia",
+ "versions": "Pobieranie informacji o wersjach oprogramowania i klas poleceń",
+ "wakeup": "Konfigurowanie obsługi kolejek wybudzania i wiadomości"
+ },
+ "refresh_node": {
+ "battery_note": "Jeśli węzeł jest zasilany bateryjnie, przed kontynuowaniem należy go wybudzić",
+ "complete": "Odświeżanie węzła zakończone",
+ "description": "Poinformuje to OpenZWave o konieczności ponownego odpytania węzła i zaktualizowaniu jego klas poleceń, możliwości i wartości.",
+ "node_status": "Stan węzła",
+ "refreshing_description": "Odświeżanie informacji o węźle...",
+ "start_refresh_button": "Rozpocznij odświeżanie",
+ "step": "Krok",
+ "title": "Odświeżanie informacji o węźle",
+ "wakeup_header": "Instrukcje budzenia dla",
+ "wakeup_instructions_source": "Instrukcje budzenia pochodzą z bazy danych urządzeń społeczności OpenZWave."
}
},
"person": {
diff --git a/translations/frontend/ro.json b/translations/frontend/ro.json
index 8143847c60..b0bcdb48cd 100644
--- a/translations/frontend/ro.json
+++ b/translations/frontend/ro.json
@@ -804,6 +804,14 @@
"name": "Acțiune",
"type_select": "Tip acțiune",
"type": {
+ "choose": {
+ "add_option": "Adauga optiune",
+ "conditions": "Condiții",
+ "default": "Acţiuni implicite",
+ "label": "Alege",
+ "remove_option": "Elimina optiune",
+ "sequence": "Acţiuni"
+ },
"condition": {
"label": "Condiție"
},
@@ -822,6 +830,22 @@
"label": "Eveniment declansare",
"service_data": "Date servicii"
},
+ "repeat": {
+ "label": "Repetaţi",
+ "sequence": "Acţiuni",
+ "type": {
+ "count": {
+ "label": "Numara"
+ },
+ "until": {
+ "label": "Pana cand"
+ },
+ "while": {
+ "conditions": "Condiții in timp ce",
+ "label": "In timp ce"
+ }
+ }
+ },
"service": {
"label": "Cheama serviciu",
"service_data": "Date serviciu"
@@ -1398,6 +1422,18 @@
"title": "MQTT",
"topic": "subiect"
},
+ "ozw": {
+ "common": {
+ "node_id": "ID Nod",
+ "ozw_instance": "Instanta OpenZWave",
+ "zwave": "Z-Wave"
+ },
+ "device_info": {
+ "node_failed": "Nod nereușit",
+ "stage": "Etapă",
+ "zwave_info": "Z-Wave Info"
+ }
+ },
"person": {
"caption": "Persoane",
"description": "Gestionează persoanele pe care Home Assistant le urmărește.",
@@ -2040,6 +2076,9 @@
"para_migrate": "Home Assistant poate adăuga ID-ul la toate cărțile și vizualizările în mod automat pentru tine apăsând butonul \"Migrează configurația\".",
"para_no_id": "Acest element nu are un ID. Adăugați un ID la acest element în \"ui-lovelace.yaml\"."
},
+ "move_card": {
+ "header": "Alegeți o vedere pentru a muta cardul în"
+ },
"raw_editor": {
"confirm_remove_config_text": "Vom genera automat vizualizările UI Lovelace cu zonele și dispozitivele dvs., dacă eliminați configurația UI Lovelace.",
"confirm_remove_config_title": "Sigur eliminați configurația Ui Lovelace? Vom genera automat vizualizările UI Lovelace cu zonele și dispozitivele dvs.",
@@ -2067,6 +2106,10 @@
"yaml_control": "Pentru a prelua controlul în modul YAML, creați un fișier YAML cu numele pe care l-ați specificat în configurația dvs. pentru acest tablou de bord sau implicit „ui-lovelace.yaml”.",
"yaml_mode": "Utilizați modul YAML, ceea ce înseamnă că nu puteți modifica configurația Lovelace din UI. Dacă doriți să schimbați Lovelace din interfața de utilizator, eliminați „modul: yaml” din configurația dvs. Lovelace din „configuration.yaml”."
},
+ "select_view": {
+ "dashboard_label": "Tablou de bord",
+ "header": "Alegeți o vizualizare"
+ },
"suggest_card": {
"add": "Adăugați la Lovelace UI",
"create_own": "Alege alt card",
@@ -2379,10 +2422,18 @@
"header": "Închideți automat conexiunea"
},
"themes": {
+ "accent_color": "Culoare de accent",
+ "dark_mode": {
+ "auto": "Auto",
+ "dark": "Întuneric",
+ "light": "Lumina"
+ },
"dropdown_label": "Temă",
"error_no_theme": "Nu există teme disponibile.",
"header": "Temă",
- "link_promo": "Aflați mai multe despre teme"
+ "link_promo": "Aflați mai multe despre teme",
+ "primary_color": "Culoare primară",
+ "reset": "Resetați"
}
},
"shopping-list": {
diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json
index 208f067158..7f25c55495 100644
--- a/translations/frontend/ru.json
+++ b/translations/frontend/ru.json
@@ -554,6 +554,10 @@
"loading_history": "Загрузка истории...",
"no_history_found": "История не найдена."
},
+ "picture-upload": {
+ "label": "Изображение",
+ "unsupported_format": "Неподдерживаемый формат. Выберите изображение в формате JPEG, PNG или GIF."
+ },
"related-items": {
"area": "Помещение",
"automation": "Используется в автоматизациях",
@@ -656,6 +660,9 @@
"required_error_msg": "Обязательное поле",
"yaml_not_editable": "Настройки этого объекта нельзя изменить из пользовательского интерфейса. Настраиваться из пользовательского интерфейса могут только те объекты, которые были созданы в нём."
},
+ "image_cropper": {
+ "crop": "Обрезать"
+ },
"more_info_control": {
"dismiss": "Закрыть диалог",
"edit": "Изменить объект",
@@ -892,7 +899,7 @@
"wait_template": "Шаблон ожидания"
}
},
- "unsupported_action": "Неподдерживаемое действие: {action}"
+ "unsupported_action": "Отсутствует форма ввода для этого действия: {action}"
},
"alias": "Название",
"conditions": {
@@ -958,7 +965,7 @@
"zone": "Зона"
}
},
- "unsupported_condition": "Неподдерживаемое условие: {condition}"
+ "unsupported_condition": "Отсутствует форма ввода для этого условия: {condition}"
},
"default_name": "Новая автоматизация",
"description": {
@@ -1050,6 +1057,9 @@
"sunrise": "Восход",
"sunset": "Закат"
},
+ "tag": {
+ "label": "Метка"
+ },
"template": {
"label": "Шаблон",
"value_template": "Значение шаблона"
@@ -1077,7 +1087,7 @@
"zone": "Зона"
}
},
- "unsupported_platform": "Неподдерживаемая платформа: {platform}"
+ "unsupported_platform": "Отсутствует форма ввода для этой платформы: {platform}"
},
"unsaved_confirm": "У вас есть несохраненные изменения. Вы уверены, что хотите выйти?"
},
@@ -1327,6 +1337,7 @@
"caption": "Устройства",
"confirm_delete": "Вы уверены, что хотите удалить это устройство?",
"confirm_rename_entity_ids": "Хотите ли Вы также переименовать идентификаторы объектов?",
+ "confirm_rename_entity_ids_warning": "Переименование повлечёт за собой необходимость вручную обновлять изменённые данные в правилах автоматизации, сценариях, сценах и пользовательском интерфейсе",
"data_table": {
"area": "Помещение",
"battery": "Аккумулятор",
@@ -1843,6 +1854,31 @@
}
}
},
+ "tags": {
+ "add_tag": "Добавить метку",
+ "automation_title": "Считана метка {name}",
+ "caption": "Метки",
+ "create_automation": "Создать автоматизацию с меткой",
+ "description": "Управление метками",
+ "detail": {
+ "create": "Добавить",
+ "create_and_write": "Добавить и записать",
+ "delete": "Удалить",
+ "description": "Описание",
+ "name": "Название",
+ "new_tag": "Новая метка",
+ "tag_id": "ID метки",
+ "tag_id_placeholder": "Если не указан, создается автоматически",
+ "update": "Обновить"
+ },
+ "edit": "Изменить",
+ "headers": {
+ "last_scanned": "Последнее считывание",
+ "name": "Название"
+ },
+ "no_tags": "Нет меток",
+ "write": "Записать"
+ },
"users": {
"add_user": {
"caption": "Добавить пользователя",
diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json
index 6f350d1bb0..cccea64731 100644
--- a/translations/frontend/zh-Hans.json
+++ b/translations/frontend/zh-Hans.json
@@ -554,6 +554,10 @@
"loading_history": "正在加载历史状态...",
"no_history_found": "没有找到历史状态。"
},
+ "picture-upload": {
+ "label": "图片",
+ "unsupported_format": "格式不受支持,请选择 JPEG、PNG 或 GIF 图像。"
+ },
"related-items": {
"area": "区域",
"automation": "以下自动化的一部分",
@@ -656,6 +660,9 @@
"required_error_msg": "此字段为必填字段",
"yaml_not_editable": "无法从 UI 编辑此实体的设置。只有通过 UI 设置的实体可以从 UI 配置。"
},
+ "image_cropper": {
+ "crop": "剪裁"
+ },
"more_info_control": {
"dismiss": "关闭对话框",
"edit": "编辑实体",
diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json
index 300057102a..fc07d69502 100644
--- a/translations/frontend/zh-Hant.json
+++ b/translations/frontend/zh-Hant.json
@@ -554,6 +554,10 @@
"loading_history": "正在載入狀態歷史...",
"no_history_found": "找不到狀態歷史。"
},
+ "picture-upload": {
+ "label": "照片",
+ "unsupported_format": "不支援的格式,請選擇 JPEG、PNG 或 GIF 圖檔。"
+ },
"related-items": {
"area": "分區",
"automation": "以下自動化部分",
@@ -656,6 +660,9 @@
"required_error_msg": "必填欄位",
"yaml_not_editable": "此物件的設定無法藉由 UI 編輯、僅有透過 UI 設定的物件可於 UI 進行設定。"
},
+ "image_cropper": {
+ "crop": "裁切"
+ },
"more_info_control": {
"dismiss": "忽略對話",
"edit": "編輯物件",
@@ -892,7 +899,7 @@
"wait_template": "等待模板"
}
},
- "unsupported_action": "不支援的觸發動作: {action}"
+ "unsupported_action": "UI 介面不支援觸發動作:{action}"
},
"alias": "名稱",
"conditions": {
@@ -958,7 +965,7 @@
"zone": "區域"
}
},
- "unsupported_condition": "不支援的觸發判斷: {condition}"
+ "unsupported_condition": "UI 介面不支援觸發判斷:{condition}"
},
"default_name": "建立新的自動化",
"description": {
@@ -1050,6 +1057,9 @@
"sunrise": "日出",
"sunset": "日落"
},
+ "tag": {
+ "label": "標籤"
+ },
"template": {
"label": "模板",
"value_template": "數值模板"
@@ -1077,7 +1087,7 @@
"zone": "區域"
}
},
- "unsupported_platform": "不支持的平台: {platform}"
+ "unsupported_platform": "UI 介面不支援平台:{platform}"
},
"unsaved_confirm": "設定尚未儲存,確定要放棄嗎?"
},
@@ -1327,6 +1337,7 @@
"caption": "設備",
"confirm_delete": "確定要刪除此設備?",
"confirm_rename_entity_ids": "是否也要變更物件的物件 ID?",
+ "confirm_rename_entity_ids_warning": "將不會變更任何物件正在使用的設定(例如自動化、腳本、場景與 Lovelace),必須自行更新。",
"data_table": {
"area": "分區",
"battery": "電量",
@@ -1843,6 +1854,31 @@
}
}
},
+ "tags": {
+ "add_tag": "新增標籤",
+ "automation_title": "標籤 {name} 已掃描",
+ "caption": "標籤",
+ "create_automation": "以標籤新增自動化",
+ "description": "管理標籤",
+ "detail": {
+ "create": "新增",
+ "create_and_write": "新增與編寫",
+ "delete": "刪除",
+ "description": "說明",
+ "name": "名稱",
+ "new_tag": "新標籤",
+ "tag_id": "標籤 ID",
+ "tag_id_placeholder": "空白時將自動產生",
+ "update": "更新"
+ },
+ "edit": "編輯",
+ "headers": {
+ "last_scanned": "最後掃描時間",
+ "name": "名稱"
+ },
+ "no_tags": "無標籤",
+ "write": "編寫"
+ },
"users": {
"add_user": {
"caption": "新增用戶",
diff --git a/yarn.lock b/yarn.lock
index 5fbc9e27ca..83cd0d1794 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1184,20 +1184,45 @@
resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-2.2.5.tgz#eaafd94df3d102ee13e54e80f992a33868a6b1e8"
integrity sha512-p7gcmazKROteL4IECCp03Qrs790fZ8tbemUAjQu0+K0AaAlK49rI1SIFFq3LzDUAqXIshV95JJhRe/yXxkal5g==
-"@fullcalendar/core@^5.0.0-beta.2":
- version "5.0.0-beta.2"
- resolved "https://registry.yarnpkg.com/@fullcalendar/core/-/core-5.0.0-beta.2.tgz#30a9cbbbf2d6476568f53cfa1c0746d06daa9660"
- integrity sha512-9U/kk8Y4ackY1XZ1PHvX8rG1olixoKveStXdDsX3FCtKATR8fA/O+4Pd5qyH7nGcih8TrgreUjZ+dB+DEaomqQ==
+"@fullcalendar/common@5.1.0", "@fullcalendar/common@~5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@fullcalendar/common/-/common-5.1.0.tgz#a45e01ebdcf00654f4d45f0457926cf2f5909820"
+ integrity sha512-ubwf9T0BDocGLh0AK8achrmc0siQdrp3Wn6Rmg/Ht4/WnwBtjc5gumzJ0ezG/xHE0GWG+Pz6Tm0IJF/jE7NJHw==
dependencies:
- preact "^10.0.5"
- tslib "^1.9.3"
+ tslib "^2.0.0"
-"@fullcalendar/daygrid@^5.0.0-beta.2":
- version "5.0.0-beta.2"
- resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-5.0.0-beta.2.tgz#fae2a7cba8a6afc23c9d6faaa88150d820e59a73"
- integrity sha512-Dd2VLsMPWPH1W1HQ+K1iftHVXF1MYOM/lo33FUdFKM8jc0MHnF620TVyOgPojAC26u2hApbURKIY2eY87vFulg==
+"@fullcalendar/core@5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@fullcalendar/core/-/core-5.1.0.tgz#0d9813b0564f24fe6285e31f8313d9366c6db411"
+ integrity sha512-C9OA9LHD1zgfcMABQ17TaxvAO/iubYFLDrgTIRCe77LatC0G36UBafthevUlMRqCR6rt5SBcw0oBt23HqSJO3A==
dependencies:
- tslib "^1.9.3"
+ "@fullcalendar/common" "~5.1.0"
+ preact "^10.0.5"
+ tslib "^2.0.0"
+
+"@fullcalendar/daygrid@5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-5.1.0.tgz#4f8cb30e99ff00600f064645942d21e8f668c946"
+ integrity sha512-zdO/EFer8wWrr+kvkMfyizPi/F7yvOCpGOb6Arz6QqyOgFl1ffNUQoRf1iQf7h2PnIEvZWZdZs+3wuMwwmhb3g==
+ dependencies:
+ "@fullcalendar/common" "~5.1.0"
+ tslib "^2.0.0"
+
+"@fullcalendar/interaction@5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@fullcalendar/interaction/-/interaction-5.1.0.tgz#0e7c6fe17bf8532de2c994bde5fc6e9220c71a89"
+ integrity sha512-RuCtsVFXvGYk4vYz3Aq9+G8SMOG6iX+xNJmHELdmPfAatHTVyUSCD4GznxR1/fzUu74mb98X01DVkLwSB+78oA==
+ dependencies:
+ "@fullcalendar/common" "~5.1.0"
+ tslib "^2.0.0"
+
+"@fullcalendar/list@5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@fullcalendar/list/-/list-5.1.0.tgz#e08b011cce8259fdee46ef8737bf98b31e6eac1a"
+ integrity sha512-FDLsInaLv0H/BwpoJ4RbC69M8yoJ3xoRnkulChAzhIBrwXAKOHJth5P+iNFJVVYI7DaPgSi0BzEwiu0dJdStHQ==
+ dependencies:
+ "@fullcalendar/common" "~5.1.0"
+ tslib "^2.0.0"
"@gfx/zopfli@^1.0.9":
version "1.0.11"
@@ -1877,15 +1902,15 @@
"@material/feature-targeting" "8.0.0-canary.096a7a066.0"
"@material/theme" "8.0.0-canary.096a7a066.0"
-"@mdi/js@5.4.55":
- version "5.4.55"
- resolved "https://registry.yarnpkg.com/@mdi/js/-/js-5.4.55.tgz#7798c38da36a705ee6d635eb4507be63e914b05f"
- integrity sha512-9kWM1mGB8KiiKgGjPV1CRoF4aQifzAegvIR2zODm6VpuXDHDOVn7yOFH4D/K6imKVp9HE02N9uxHuxUKB0gjRg==
+"@mdi/js@5.5.55":
+ version "5.5.55"
+ resolved "https://registry.yarnpkg.com/@mdi/js/-/js-5.5.55.tgz#8dc97fbcc47d1f6bfa3343d4f7c7f5c0e2990151"
+ integrity sha512-vbw1QW3M9A4vObU9WmTETTG7n7feC9HSn/3up8ZYk/M3K9fGL9FPtw0+bdASRu1UOBgEsqC9eBhNW10IOcwMIg==
-"@mdi/svg@5.4.55":
- version "5.4.55"
- resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-5.4.55.tgz#3bff467d65efceba14af39027d4c7cba0115e824"
- integrity sha512-ZsVup6j9WWApjBsBtC8rM1CQ8Udu8025WJOCXVCofneVCVLKXClE5eSddYNYm565BCG/3ac9b0WPkfRV42Dh6w==
+"@mdi/svg@5.5.55":
+ version "5.5.55"
+ resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-5.5.55.tgz#758f443ed1288c13833e1d6e8008d36cb1a6e703"
+ integrity sha512-6IMyytWUsCOOgKqxBronThVrtHDbxinDtfDFl6RL26vy/L+x5jWGqYSHbMEgamtquWOy8EAV0AJXUlUHp1tamg==
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
@@ -2658,10 +2683,10 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
-"@types/mocha@^5.2.6":
- version "5.2.6"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b"
- integrity sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==
+"@types/mocha@^7.0.2":
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce"
+ integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==
"@types/node@*":
version "11.12.1"
@@ -3323,6 +3348,14 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
+anymatch@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
+ integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
append-buffer@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
@@ -3551,10 +3584,11 @@ asn1.js@^4.0.0:
minimalistic-assert "^1.0.0"
assert@^1.1.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
- integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+ integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
dependencies:
+ object-assign "^4.1.1"
util "0.10.3"
assertion-error@^1.1.0:
@@ -3689,7 +3723,12 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
-base64-js@^1.0.2, base64-js@^1.3.0:
+base64-js@^1.0.2:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
+ integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
+
+base64-js@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
@@ -3722,6 +3761,11 @@ binary-extensions@^1.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+binary-extensions@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
+ integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
+
bl@^1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
@@ -3745,11 +3789,16 @@ bmp-js@^0.1.0:
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM=
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
version "4.11.9"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
+bn.js@^5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0"
+ integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==
+
body-parser@1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
@@ -3824,7 +3873,7 @@ braces@^2.3.1, braces@^2.3.2:
split-string "^3.0.2"
to-regex "^3.0.1"
-braces@^3.0.1:
+braces@^3.0.1, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@@ -3872,7 +3921,7 @@ browserify-des@^1.0.0:
inherits "^2.0.1"
safe-buffer "^5.1.2"
-browserify-rsa@^4.0.0:
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
@@ -3881,17 +3930,19 @@ browserify-rsa@^4.0.0:
randombytes "^2.0.1"
browserify-sign@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
- integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11"
+ integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==
dependencies:
- bn.js "^4.1.1"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.2"
- elliptic "^6.0.0"
- inherits "^2.0.1"
- parse-asn1 "^5.0.0"
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.2"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
browserify-zlib@^0.2.0:
version "0.2.0"
@@ -3955,9 +4006,9 @@ buffer-xor@^1.0.3:
integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
buffer@^4.3.0:
- version "4.9.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
- integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+ integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
@@ -4231,6 +4282,21 @@ check-error@^1.0.2:
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
+chokidar@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
+ integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.2.0"
+ optionalDependencies:
+ fsevents "~2.1.1"
+
chokidar@^1.6.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
@@ -4609,11 +4675,9 @@ connect-history-api-fallback@^1.6.0:
integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
console-browserify@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
- integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
- dependencies:
- date-now "^0.1.4"
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+ integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
@@ -4759,7 +4823,7 @@ create-ecdh@^4.0.0:
bn.js "^4.1.0"
elliptic "^6.0.0"
-create-hash@^1.1.0, create-hash@^1.1.2:
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
@@ -4770,7 +4834,7 @@ create-hash@^1.1.0, create-hash@^1.1.2:
ripemd160 "^2.0.1"
sha.js "^2.4.0"
-create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
@@ -4858,11 +4922,6 @@ date-fns@^1.27.2:
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
-date-now@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
- integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
-
dateformat@^1.0.7-1.2.3:
version "1.0.12"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
@@ -5060,9 +5119,9 @@ deprecate@^1.0.0:
integrity sha512-b5dDNQYdy2vW9WXUD8+RQlfoxvqztLLhDE+T7Gd37I5E8My7nJkKu6FmhdDeRWJ8B+yjZKuwjCta8pgi8kgSqA==
des.js@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
- integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
dependencies:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
@@ -5215,7 +5274,7 @@ elegant-spinner@^1.0.1:
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
-elliptic@^6.0.0:
+elliptic@^6.0.0, elliptic@^6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
@@ -5292,7 +5351,7 @@ error-ex@^1.2.0, error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
+es-abstract@^1.12.0, es-abstract@^1.7.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
@@ -5437,10 +5496,10 @@ eslint-import-resolver-node@^0.3.2:
debug "^2.6.9"
resolve "^1.5.0"
-eslint-import-resolver-webpack@^0.12.1:
- version "0.12.1"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.1.tgz#771ae561e887ca4e53ee87605fbb36c5e290b0f5"
- integrity sha512-O/sUAXk6GWrICiN8JUkkjdt9uZpqZHP+FVnTxtEILL6EZMaPSrnP4lGPSFwcKsv7O211maqq4Nz60+dh236hVg==
+eslint-import-resolver-webpack@^0.12.2:
+ version "0.12.2"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz#769e86cd0c752a1536c19855ebd90aa14ce384ee"
+ integrity sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ==
dependencies:
array-find "^1.0.0"
debug "^2.6.9"
@@ -5653,9 +5712,9 @@ eventemitter3@3.1.0, eventemitter3@^3.0.0:
integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==
events@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
- integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
+ integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
eventsource@^1.0.7:
version "1.0.7"
@@ -6058,6 +6117,13 @@ find-root@^1.1.0:
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+find-up@3.0.0, find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -6073,13 +6139,6 @@ find-up@^2.0.0, find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"
-find-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
- integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
- dependencies:
- locate-path "^3.0.0"
-
find-up@^4.0.0, find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
@@ -6088,16 +6147,6 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
-findup-sync@2.0.0, findup-sync@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
- integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
- dependencies:
- detect-file "^1.0.0"
- is-glob "^3.1.0"
- micromatch "^3.0.4"
- resolve-dir "^1.0.1"
-
findup-sync@3.0.0, findup-sync@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
@@ -6108,6 +6157,16 @@ findup-sync@3.0.0, findup-sync@^3.0.0:
micromatch "^3.0.4"
resolve-dir "^1.0.1"
+findup-sync@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
+ integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
+ dependencies:
+ detect-file "^1.0.0"
+ is-glob "^3.1.0"
+ micromatch "^3.0.4"
+ resolve-dir "^1.0.1"
+
fined@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.1.tgz#95d88ff329123dd1a6950fdfcd321f746271e01f"
@@ -6272,6 +6331,11 @@ fsevents@^1.0.0, fsevents@^1.2.7:
nan "^2.12.1"
node-pre-gyp "^0.12.0"
+fsevents@~2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
fsevents@~2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
@@ -6397,7 +6461,7 @@ glob-parent@^5.0.0:
dependencies:
is-glob "^4.0.1"
-glob-parent@^5.1.0:
+glob-parent@^5.1.0, glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
@@ -6559,12 +6623,12 @@ google-timezones-json@^1.0.2:
resolved "https://registry.yarnpkg.com/google-timezones-json/-/google-timezones-json-1.0.2.tgz#6800000d7ebc2dd660611aad8c1c68196db78cab"
integrity sha512-UWXQ7BpSCW8erDespU2I4cri22xsKgwOCyhsJal0OJhi2tFpwJpsYNJt4vCiFPL1p2HzCGiS713LKpNR25n9Kg==
-graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.6:
version "4.1.15"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
-graceful-fs@^4.2.0:
+graceful-fs@^4.1.2, graceful-fs@^4.2.0:
version "4.2.4"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
@@ -6772,12 +6836,13 @@ has@^1.0.1, has@^1.0.3:
function-bind "^1.1.1"
hash-base@^3.0.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
- integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7"
@@ -7016,11 +7081,6 @@ indent-string@^4.0.0:
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-indexof@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
- integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
-
infer-owner@^1.0.3, infer-owner@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
@@ -7034,20 +7094,20 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+inherits@2, inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
inherits@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
-inherits@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
- integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
version "1.3.5"
@@ -7081,11 +7141,16 @@ internal-ip@^4.3.0:
default-gateway "^4.2.0"
ipaddr.js "^1.9.0"
-interpret@1.2.0, interpret@^1.1.0, interpret@^1.2.0:
+interpret@1.2.0, interpret@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
+interpret@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
intl-format-cache@^4.2.26:
version "4.2.26"
resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-4.2.26.tgz#ba5e2ee6cec25217f688b68ecdd58eec3703a827"
@@ -7188,6 +7253,13 @@ is-binary-path@^1.0.0:
dependencies:
binary-extensions "^1.0.0"
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@@ -7339,7 +7411,7 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
-is-glob@^4.0.0, is-glob@^4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
@@ -7587,15 +7659,7 @@ js-levenshtein-esm@^1.2.0:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@3.12.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
- integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-js-yaml@^3.13.0, js-yaml@^3.13.1:
+js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1:
version "3.13.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -8124,17 +8188,22 @@ lodash.values@~2.4.1:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
-lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
+lodash@^4.17.13, lodash@^4.17.14:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
-log-symbols@2.2.0, log-symbols@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
- integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+lodash@^4.17.15:
+ version "4.17.19"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
+ integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
+
+log-symbols@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
dependencies:
- chalk "^2.0.1"
+ chalk "^2.4.2"
log-symbols@^1.0.0, log-symbols@^1.0.2:
version "1.0.2"
@@ -8143,6 +8212,13 @@ log-symbols@^1.0.0, log-symbols@^1.0.2:
dependencies:
chalk "^1.0.0"
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+ dependencies:
+ chalk "^2.0.1"
+
log-update@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708"
@@ -8632,7 +8708,7 @@ mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1:
dependencies:
minimist "0.0.8"
-mkdirp@^0.5.3:
+mkdirp@0.5.5, mkdirp@^0.5.3:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -8644,34 +8720,35 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-mocha@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.0.2.tgz#cdc1a6fdf66472c079b5605bac59d29807702d2c"
- integrity sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ==
+mocha@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604"
+ integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==
dependencies:
ansi-colors "3.2.3"
browser-stdout "1.3.1"
+ chokidar "3.3.0"
debug "3.2.6"
diff "3.5.0"
escape-string-regexp "1.0.5"
- findup-sync "2.0.0"
+ find-up "3.0.0"
glob "7.1.3"
growl "1.10.5"
he "1.2.0"
- js-yaml "3.12.0"
- log-symbols "2.2.0"
+ js-yaml "3.13.1"
+ log-symbols "3.0.0"
minimatch "3.0.4"
- mkdirp "0.5.1"
+ mkdirp "0.5.5"
ms "2.1.1"
- node-environment-flags "1.0.4"
+ node-environment-flags "1.0.6"
object.assign "4.1.0"
strip-json-comments "2.0.1"
supports-color "6.0.0"
which "1.3.1"
wide-align "1.1.3"
- yargs "12.0.5"
- yargs-parser "11.1.1"
- yargs-unparser "1.5.0"
+ yargs "13.3.2"
+ yargs-parser "13.1.2"
+ yargs-unparser "1.6.0"
moment@^2.10.2, moment@^2.22.0:
version "2.24.0"
@@ -8824,48 +8901,20 @@ no-case@^2.2.0:
dependencies:
lower-case "^1.1.1"
-node-environment-flags@1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.4.tgz#0b784a6551426bfc16d3b2208424dcbc2b2ff038"
- integrity sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==
+node-environment-flags@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088"
+ integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==
dependencies:
object.getownpropertydescriptors "^2.0.3"
+ semver "^5.7.0"
node-forge@0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
-"node-libs-browser@^1.0.0 || ^2.0.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77"
- integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==
- dependencies:
- assert "^1.1.1"
- browserify-zlib "^0.2.0"
- buffer "^4.3.0"
- console-browserify "^1.1.0"
- constants-browserify "^1.0.0"
- crypto-browserify "^3.11.0"
- domain-browser "^1.1.1"
- events "^3.0.0"
- https-browserify "^1.0.0"
- os-browserify "^0.3.0"
- path-browserify "0.0.0"
- process "^0.11.10"
- punycode "^1.2.4"
- querystring-es3 "^0.2.0"
- readable-stream "^2.3.3"
- stream-browserify "^2.0.1"
- stream-http "^2.7.2"
- string_decoder "^1.0.0"
- timers-browserify "^2.0.4"
- tty-browserify "0.0.0"
- url "^0.11.0"
- util "^0.11.0"
- vm-browserify "0.0.4"
-
-node-libs-browser@^2.2.1:
+"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
@@ -8960,7 +9009,7 @@ normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
dependencies:
remove-trailing-separator "^1.0.1"
-normalize-path@^3.0.0:
+normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
@@ -9023,7 +9072,7 @@ number-is-nan@^1.0.0:
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-object-assign@^4.0.1, object-assign@^4.1.0:
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@@ -9095,12 +9144,12 @@ object.entries@^1.1.1:
has "^1.0.3"
object.getownpropertydescriptors@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
- integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
+ integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==
dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.5.1"
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.1"
object.map@^1.0.0:
version "1.0.1"
@@ -9364,16 +9413,11 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.1.0.tgz#c1a0f1030e97de018bb2c718929d2af59463e505"
integrity sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA==
-pako@^1.0.5:
+pako@^1.0.5, pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
-pako@~1.0.5:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
- integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
-
parallel-transform@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
@@ -9397,10 +9441,10 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
-parse-asn1@^5.0.0:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc"
- integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
+ integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
dependencies:
asn1.js "^4.0.0"
browserify-aes "^1.0.0"
@@ -9508,11 +9552,6 @@ pascalcase@^0.1.1:
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
-path-browserify@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
- integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=
-
path-browserify@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
@@ -9611,9 +9650,9 @@ pathval@^1.1.0:
integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
pbkdf2@^3.0.3:
- version "3.0.17"
- resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
- integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+ integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
dependencies:
create-hash "^1.1.2"
create-hmac "^1.1.4"
@@ -9626,7 +9665,7 @@ phin@^2.9.1:
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
-picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2:
+picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
@@ -9787,11 +9826,16 @@ process-nextick-args@^1.0.7:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=
-process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
+process-nextick-args@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
@@ -10031,7 +10075,7 @@ read-pkg@^4.0.1:
parse-json "^4.0.0"
pify "^3.0.0"
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -10063,6 +10107,28 @@ read-pkg@^4.0.1:
isarray "0.0.1"
string_decoder "~0.10.x"
+readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
readable-stream@~1.1.9:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
@@ -10082,6 +10148,13 @@ readdirp@^2.0.0, readdirp@^2.2.1:
micromatch "^3.1.10"
readable-stream "^2.0.2"
+readdirp@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
+ integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
+ dependencies:
+ picomatch "^2.0.4"
+
rechoir@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
@@ -10376,13 +10449,20 @@ resolve@^1.11.0:
dependencies:
path-parse "^1.0.6"
-resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2:
+resolve@^1.12.0, resolve@^1.14.2:
version "1.15.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
dependencies:
path-parse "^1.0.6"
+resolve@^1.13.1:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@@ -10546,11 +10626,16 @@ rxjs@^6.5.3:
dependencies:
tslib "^1.9.0"
-safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -10628,7 +10713,7 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-semver@^5.7.1:
+semver@^5.7.0, semver@^5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -11168,7 +11253,14 @@ string.prototype.trimstart@^1.0.0:
define-properties "^1.1.3"
es-abstract "^1.17.5"
-string_decoder@^1.0.0, string_decoder@^1.1.1:
+string_decoder@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
@@ -11534,9 +11626,9 @@ time-stamp@^1.0.0:
integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
timers-browserify@^2.0.4:
- version "2.0.10"
- resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
- integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==
+ version "2.0.11"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
+ integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
dependencies:
setimmediate "^1.0.4"
@@ -11636,10 +11728,10 @@ ts-lit-plugin@^1.2.0:
dependencies:
lit-analyzer "1.2.0"
-ts-mocha@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-6.0.0.tgz#40b8c5462ffce6f5dcee5ff729655b2958f26e50"
- integrity sha512-ZCtJK8WXxHNbFNjvUKQIXZby/+ybQQkaBcM/3QhBQUfwjpdGFE9F6iWsHhF5ifQNFV/lWiOODi2VMD5AyPcQyg==
+ts-mocha@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-7.0.0.tgz#f1549b48b46f53d7ae1dccbb26313c7879acb190"
+ integrity sha512-7WfkQw1W6JZXG5m4E1w2e945uWzBoZqmnOHvpMu0v+zvyKLdUQeTtRMfcQsVEKsUnYL6nTyH4okRt2PZucmFXQ==
dependencies:
ts-node "7.0.1"
optionalDependencies:
@@ -11680,6 +11772,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+tslib@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3"
+ integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==
+
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -12071,13 +12168,6 @@ vinyl@^2.0.0, vinyl@^2.1.0:
remove-trailing-separator "^1.0.1"
replace-ext "^1.0.0"
-vm-browserify@0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
- integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=
- dependencies:
- indexof "0.0.1"
-
vm-browserify@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
@@ -12592,11 +12682,16 @@ xss@^1.0.6:
commander "^2.9.0"
cssfilter "0.0.10"
-"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
+"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.0, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
+xtend@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
xtend@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a"
@@ -12627,7 +12722,15 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-yargs-parser@11.1.1, yargs-parser@^11.1.1:
+yargs-parser@13.1.2, yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^11.1.1:
version "11.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
@@ -12658,16 +12761,16 @@ yargs-parser@^5.0.0:
dependencies:
camelcase "^3.0.0"
-yargs-unparser@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d"
- integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==
+yargs-unparser@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+ integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
dependencies:
flat "^4.1.0"
- lodash "^4.17.11"
- yargs "^12.0.5"
+ lodash "^4.17.15"
+ yargs "^13.3.0"
-yargs@12.0.5, yargs@^12.0.5:
+yargs@12.0.5:
version "12.0.5"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
@@ -12702,6 +12805,22 @@ yargs@13.2.4:
y18n "^4.0.0"
yargs-parser "^13.1.0"
+yargs@13.3.2, yargs@^13.3.0:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
+
yargs@^15.0.0:
version "15.3.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b"