mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-23 17:26:42 +00:00
commit
2586590bd9
2
setup.py
2
setup.py
@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
||||
|
||||
setup(
|
||||
name="home-assistant-frontend",
|
||||
version="20190315.1",
|
||||
version="20190316.0",
|
||||
description="The Home Assistant frontend",
|
||||
url="https://github.com/home-assistant/home-assistant-polymer",
|
||||
author="The Home Assistant Authors",
|
||||
|
@ -58,15 +58,13 @@ class MoreInfoCamera extends UpdatingElement {
|
||||
videoEl.muted = true;
|
||||
|
||||
// tslint:disable-next-line
|
||||
let Hls: HLSModule | undefined;
|
||||
|
||||
let hlsSupported =
|
||||
videoEl.canPlayType("application/vnd.apple.mpegurl") !== "";
|
||||
const Hls = ((await import(/* webpackChunkName: "hls.js" */ "hls.js")) as any)
|
||||
.default as HLSModule;
|
||||
let hlsSupported = Hls.isSupported();
|
||||
|
||||
if (!hlsSupported) {
|
||||
Hls = ((await import(/* webpackChunkName: "hls.js" */ "hls.js")) as any)
|
||||
.default as HLSModule;
|
||||
hlsSupported = Hls.isSupported();
|
||||
hlsSupported =
|
||||
videoEl.canPlayType("application/vnd.apple.mpegurl") !== "";
|
||||
}
|
||||
|
||||
if (hlsSupported) {
|
||||
@ -76,7 +74,7 @@ class MoreInfoCamera extends UpdatingElement {
|
||||
this.stateObj.entity_id
|
||||
);
|
||||
|
||||
if (Hls) {
|
||||
if (Hls.isSupported()) {
|
||||
this._renderHLSPolyfill(videoEl, Hls, url);
|
||||
} else {
|
||||
this._renderHLSNative(videoEl, url);
|
||||
|
@ -8,6 +8,7 @@ import {
|
||||
CSSResult,
|
||||
css,
|
||||
} from "lit-element";
|
||||
import { removeInitSkeleton } from "../util/init-skeleton";
|
||||
|
||||
class HaInitPage extends LitElement {
|
||||
public error?: boolean;
|
||||
@ -35,6 +36,10 @@ class HaInitPage extends LitElement {
|
||||
`;
|
||||
}
|
||||
|
||||
protected firstUpdated() {
|
||||
removeInitSkeleton();
|
||||
}
|
||||
|
||||
private _retry() {
|
||||
location.reload();
|
||||
}
|
||||
|
@ -52,7 +52,9 @@ export class HassRouterPage extends UpdatingElement {
|
||||
super.update(changedProps);
|
||||
|
||||
if (!changedProps.has("route")) {
|
||||
if (this.lastChild) {
|
||||
// Do not update if we have a currentLoadProm, because that means
|
||||
// that there is still an old panel shown and we're moving to a new one.
|
||||
if (this.lastChild && !this._currentLoadProm) {
|
||||
this.updatePageEl(this.lastChild, changedProps);
|
||||
}
|
||||
return;
|
||||
@ -214,11 +216,11 @@ export class HassRouterPage extends UpdatingElement {
|
||||
const dividerPos = route.path.indexOf("/", 1);
|
||||
return dividerPos === -1
|
||||
? {
|
||||
prefix: route.path,
|
||||
prefix: route.prefix + route.path,
|
||||
path: "",
|
||||
}
|
||||
: {
|
||||
prefix: route.path.substr(0, dividerPos),
|
||||
prefix: route.prefix + route.path.substr(0, dividerPos),
|
||||
path: route.path.substr(dividerPos),
|
||||
};
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import {
|
||||
RouterOptions,
|
||||
RouteOptions,
|
||||
} from "./hass-router-page";
|
||||
import { removeInitSkeleton } from "../util/init-skeleton";
|
||||
|
||||
const CACHE_COMPONENTS = ["lovelace", "states"];
|
||||
const COMPONENTS = {
|
||||
@ -113,11 +114,7 @@ class PartialPanelResolver extends HassRouterPage {
|
||||
this.routerOptions = getRoutes(this.hass!.panels);
|
||||
await this.rebuild();
|
||||
await this.pageRendered;
|
||||
|
||||
const initEl = document.getElementById("ha-init-skeleton");
|
||||
if (initEl) {
|
||||
initEl.parentElement!.removeChild(initEl);
|
||||
}
|
||||
removeInitSkeleton();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44,6 +44,7 @@ class DialogAreaDetail extends LitElement {
|
||||
if (!this._params) {
|
||||
return html``;
|
||||
}
|
||||
const entry = this._params.entry;
|
||||
const nameInvalid = this._name.trim() === "";
|
||||
return html`
|
||||
<paper-dialog
|
||||
@ -52,8 +53,8 @@ class DialogAreaDetail extends LitElement {
|
||||
@opened-changed="${this._openedChanged}"
|
||||
>
|
||||
<h2>
|
||||
${this._params.entry
|
||||
? this._params.entry.name
|
||||
${entry
|
||||
? entry.name
|
||||
: this.hass.localize(
|
||||
"ui.panel.config.area_registry.editor.default_name"
|
||||
)}
|
||||
@ -65,17 +66,23 @@ class DialogAreaDetail extends LitElement {
|
||||
`
|
||||
: ""}
|
||||
<div class="form">
|
||||
${entry
|
||||
? html`
|
||||
<div>Area ID: ${entry.area_id}</div>
|
||||
`
|
||||
: ""}
|
||||
|
||||
<paper-input
|
||||
.value=${this._name}
|
||||
@value-changed=${this._nameChanged}
|
||||
.label=${this.hass.localize("ui.dialogs.more_info_settings.name")}
|
||||
label="Name"
|
||||
error-message="Name is required"
|
||||
.invalid=${nameInvalid}
|
||||
></paper-input>
|
||||
</div>
|
||||
</paper-dialog-scrollable>
|
||||
<div class="paper-dialog-buttons">
|
||||
${this._params.entry
|
||||
${entry
|
||||
? html`
|
||||
<mwc-button
|
||||
class="warning"
|
||||
@ -92,7 +99,7 @@ class DialogAreaDetail extends LitElement {
|
||||
@click="${this._updateEntry}"
|
||||
.disabled=${nameInvalid || this._submitting}
|
||||
>
|
||||
${this._params.entry
|
||||
${entry
|
||||
? this.hass.localize(
|
||||
"ui.panel.config.area_registry.editor.update"
|
||||
)
|
||||
|
@ -18,13 +18,13 @@ class HaConfigAutomation extends PolymerElement {
|
||||
</style>
|
||||
<app-route
|
||||
route="[[route]]"
|
||||
pattern="/automation/edit/:automation"
|
||||
pattern="/edit/:automation"
|
||||
data="{{_routeData}}"
|
||||
active="{{_edittingAutomation}}"
|
||||
></app-route>
|
||||
<app-route
|
||||
route="[[route]]"
|
||||
pattern="/automation/new"
|
||||
pattern="/new"
|
||||
active="{{_creatingNew}}"
|
||||
></app-route>
|
||||
|
||||
|
@ -11,12 +11,8 @@ import "./ha-config-cloud-login";
|
||||
import "./ha-config-cloud-register";
|
||||
import NavigateMixin from "../../../mixins/navigate-mixin";
|
||||
|
||||
const LOGGED_IN_URLS = ["/cloud/account"];
|
||||
const NOT_LOGGED_IN_URLS = [
|
||||
"/cloud/login",
|
||||
"/cloud/register",
|
||||
"/cloud/forgot-password",
|
||||
];
|
||||
const LOGGED_IN_URLS = ["/account"];
|
||||
const NOT_LOGGED_IN_URLS = ["/login", "/register", "/forgot-password"];
|
||||
|
||||
/*
|
||||
* @appliesMixin NavigateMixin
|
||||
@ -26,7 +22,7 @@ class HaConfigCloud extends NavigateMixin(PolymerElement) {
|
||||
return html`
|
||||
<app-route
|
||||
route="[[route]]"
|
||||
pattern="/cloud/:page"
|
||||
pattern="/:page"
|
||||
data="{{_routeData}}"
|
||||
tail="{{_routeTail}}"
|
||||
></app-route>
|
||||
@ -121,8 +117,6 @@ class HaConfigCloud extends NavigateMixin(PolymerElement) {
|
||||
}
|
||||
|
||||
_checkRoute(route) {
|
||||
if (!route || route.path.substr(0, 6) !== "/cloud") return;
|
||||
|
||||
this._debouncer = Debouncer.debounce(
|
||||
this._debouncer,
|
||||
timeOut.after(0),
|
||||
|
@ -121,7 +121,7 @@ class HaPanelConfig extends HassRouterPage {
|
||||
}
|
||||
|
||||
protected updatePageEl(el) {
|
||||
el.route = this.route;
|
||||
el.route = this.routeTail;
|
||||
el.hass = this.hass;
|
||||
el.isWide = this.hass.dockedSidebar ? this._wideSidebar : this._wide;
|
||||
el.cloudStatus = this._cloudStatus;
|
||||
|
@ -15,7 +15,7 @@ class HaConfigIntegrations extends NavigateMixin(PolymerElement) {
|
||||
return html`
|
||||
<app-route
|
||||
route="[[route]]"
|
||||
pattern="/integrations/:page"
|
||||
pattern="/:page"
|
||||
data="{{_routeData}}"
|
||||
tail="{{_routeTail}}"
|
||||
></app-route>
|
||||
@ -90,12 +90,12 @@ class HaConfigIntegrations extends NavigateMixin(PolymerElement) {
|
||||
|
||||
ready() {
|
||||
super.ready();
|
||||
this._loadData();
|
||||
this.addEventListener("hass-reload-entries", () => this._loadData());
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback();
|
||||
this._loadData();
|
||||
|
||||
this.hass.connection
|
||||
.subscribeEvents(() => {
|
||||
|
@ -19,13 +19,13 @@ class HaConfigScript extends PolymerElement {
|
||||
</style>
|
||||
<app-route
|
||||
route="[[route]]"
|
||||
pattern="/script/edit/:script"
|
||||
pattern="/edit/:script"
|
||||
data="{{_routeData}}"
|
||||
active="{{_edittingScript}}"
|
||||
></app-route>
|
||||
<app-route
|
||||
route="[[route]]"
|
||||
pattern="/script/new"
|
||||
pattern="/new"
|
||||
active="{{_creatingNew}}"
|
||||
></app-route>
|
||||
|
||||
|
@ -19,7 +19,7 @@ class HaConfigUsers extends NavigateMixin(PolymerElement) {
|
||||
return html`
|
||||
<app-route
|
||||
route="[[route]]"
|
||||
pattern="/users/:user"
|
||||
pattern="/:user"
|
||||
data="{{_routeData}}"
|
||||
></app-route>
|
||||
|
||||
@ -72,8 +72,6 @@ class HaConfigUsers extends NavigateMixin(PolymerElement) {
|
||||
}
|
||||
|
||||
_checkRoute(route) {
|
||||
if (!route || route.path.substr(0, 6) !== "/users") return;
|
||||
|
||||
// prevent list getting under toolbar
|
||||
fireEvent(this, "iron-resize");
|
||||
|
||||
@ -81,8 +79,8 @@ class HaConfigUsers extends NavigateMixin(PolymerElement) {
|
||||
this._debouncer,
|
||||
timeOut.after(0),
|
||||
() => {
|
||||
if (route.path === "/users") {
|
||||
this.navigate("/config/users/picker", true);
|
||||
if (route.path === "") {
|
||||
this.navigate(`${route.prefix}/picker`, true);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -38,7 +38,7 @@ class HaPanelCustom extends NavigateMixin(EventsMixin(PolymerElement)) {
|
||||
delete window.customPanel;
|
||||
this._setProperties = null;
|
||||
while (this.lastChild) {
|
||||
this.remove(this.lastChild);
|
||||
this.removeChild(this.lastChild);
|
||||
}
|
||||
|
||||
const config = panel.config._panel_custom;
|
||||
@ -95,7 +95,7 @@ It will have access to all data in Home Assistant.
|
||||
}
|
||||
</style>
|
||||
<iframe></iframe>
|
||||
`;
|
||||
`.trim();
|
||||
const iframeDoc = this.querySelector("iframe").contentWindow.document;
|
||||
iframeDoc.open();
|
||||
iframeDoc.write(`<script src='${window.customPanelJS}'></script>`);
|
||||
|
6
src/util/init-skeleton.ts
Normal file
6
src/util/init-skeleton.ts
Normal file
@ -0,0 +1,6 @@
|
||||
export const removeInitSkeleton = () => {
|
||||
const initEl = document.getElementById("ha-init-skeleton");
|
||||
if (initEl) {
|
||||
initEl.parentElement!.removeChild(initEl);
|
||||
}
|
||||
};
|
@ -1084,7 +1084,7 @@
|
||||
"sun": {
|
||||
"elevation": "Височина",
|
||||
"rising": "Изгрев",
|
||||
"setting": "Настройка"
|
||||
"setting": "Залез"
|
||||
},
|
||||
"updater": {
|
||||
"title": "Инструкции за актуализиране"
|
||||
|
@ -384,7 +384,7 @@
|
||||
"alias": "Назва",
|
||||
"triggers": {
|
||||
"header": "Тригери",
|
||||
"introduction": "Тригери - це те, що починає обробляти правило автоматизації. Можна вказати декілька тригерів для одного і того ж правила. Після запуску тригера, Home Assistant перевірить умови, якщо такі є, і викликає дію. \n\n [Докладніше про тригери.] (Https:\/\/home-assistant.io\/docs\/automation\/trigger\/)",
|
||||
"introduction": "Тригери - це те, що починає обробляти правило автоматизації. Можна вказати декілька тригерів для одного і того ж правила. Після запуску тригера, Home Assistant перевірить умови, якщо такі є, і викликає дію. \n\n [Докладніше про тригери.] (https:\/\/home-assistant.io\/docs\/automation\/trigger\/)",
|
||||
"add": "Додати тригер",
|
||||
"duplicate": "Дублювати",
|
||||
"delete": "Видалити",
|
||||
@ -466,7 +466,7 @@
|
||||
},
|
||||
"conditions": {
|
||||
"header": "Умови",
|
||||
"introduction": "Умови є необов'язковою частиною правила автоматизації і можуть використовуватися для запобігання дії, що відбувається під час запуску. Умови виглядають дуже схоже на тригери, але вони різні. Тригер буде дивитися на події, що відбуваються в системі, в той час як умова тільки дивиться на те, як система виглядає зараз. Тригер може спостерігати, що перемикач включений. Умова може бачити тільки, якщо перемикач ввімкнено або вимкнено. \n\n [Докладніше про умови.] (Https:\/\/home-assistant.io\/docs\/scripts\/conditions\/)",
|
||||
"introduction": "Умови є необов'язковою частиною правила автоматизації і можуть використовуватися для запобігання дії, що відбувається під час запуску. Умови виглядають дуже схоже на тригери, але вони різні. Тригер буде дивитися на події, що відбуваються в системі, в той час як умова тільки дивиться на те, як система виглядає зараз. Тригер може спостерігати, що перемикач включений. Умова може бачити тільки, якщо перемикач ввімкнено або вимкнено. \n\n [Докладніше про умови.] (https:\/\/home-assistant.io\/docs\/scripts\/conditions\/)",
|
||||
"add": "Додати умову",
|
||||
"duplicate": "Дублювати",
|
||||
"delete": "Видалити",
|
||||
@ -504,7 +504,7 @@
|
||||
},
|
||||
"actions": {
|
||||
"header": "Дії",
|
||||
"introduction": "Що Home Assistant буде робити, коли автоматизація спрацьовує. \n\n [Докладніше про дії.] (Https:\/\/home-assistant.io\/docs\/automation\/action\/)",
|
||||
"introduction": "Що Home Assistant буде робити, коли автоматизація спрацьовує. \n\n [Докладніше про дії.] (https:\/\/home-assistant.io\/docs\/automation\/action\/)",
|
||||
"add": "Додати дію",
|
||||
"duplicate": "Дублювати",
|
||||
"delete": "Видалити",
|
||||
@ -513,7 +513,7 @@
|
||||
"type_select": "Тип дії",
|
||||
"type": {
|
||||
"service": {
|
||||
"label": "Викликати послугу",
|
||||
"label": "Викликати сервіс",
|
||||
"service_data": "Дані послуги "
|
||||
},
|
||||
"delay": {
|
||||
@ -807,7 +807,8 @@
|
||||
},
|
||||
"create_account": "Створити обліковий запис",
|
||||
"error": {
|
||||
"required_fields": "Заповніть усі необхідні поля"
|
||||
"required_fields": "Заповніть усі необхідні поля",
|
||||
"password_not_match": "Паролі не збігаються"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -1129,5 +1130,9 @@
|
||||
"auto": "Авто"
|
||||
}
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"system-admin": "Адміністратори",
|
||||
"system-users": "Користувачі"
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user