diff --git a/.travis.yml b/.travis.yml
index 24433d2e24..bbe715a830 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,15 +13,6 @@ script:
- npm run test
# - xvfb-run wct --module-resolution=node --npm
# - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct --module-resolution=node --npm --plugin sauce; fi'
-services:
- - docker
-before_deploy:
- - "docker pull lokalise/lokalise-cli@sha256:2198814ebddfda56ee041a4b427521757dd57f75415ea9693696a64c550cef21"
-deploy:
- provider: script
- script: script/travis_deploy
- "on":
- branch: master
dist: trusty
addons:
sauce_connect: true
diff --git a/azure-pipelines-translation.yml b/azure-pipelines-translation.yml
new file mode 100644
index 0000000000..133f110ea8
--- /dev/null
+++ b/azure-pipelines-translation.yml
@@ -0,0 +1,70 @@
+# https://dev.azure.com/home-assistant
+
+trigger:
+ batch: true
+ branches:
+ include:
+ - dev
+ paths:
+ include:
+ - translation/en.json
+pr: none
+schedules:
+ - cron: "30 0 * * *"
+ displayName: "translation update"
+ branches:
+ include:
+ - dev
+ always: true
+variables:
+- group: translation
+resources:
+ repositories:
+ - repository: azure
+ type: github
+ name: 'home-assistant/ci-azure'
+ endpoint: 'home-assistant'
+
+
+jobs:
+
+- job: 'Upload'
+ pool:
+ vmImage: 'ubuntu-latest'
+ steps:
+ - task: NodeTool@0
+ displayName: 'Use Node 12.x'
+ inputs:
+ versionSpec: '12.x'
+ - script: |
+ export LOKALISE_TOKEN="$(lokaliseToken)"
+ export AZURE_BRANCH="$(Build.SourceBranchName)"
+
+ ./script/translations_upload_base
+ displayName: 'Upload Translation'
+
+- job: 'Download'
+ dependsOn:
+ - 'Upload'
+ condition: or(eq(variables['Build.Reason'], 'Schedule'), eq(variables['Build.Reason'], 'Manual'))
+ pool:
+ vmImage: 'ubuntu-latest'
+ steps:
+ - task: NodeTool@0
+ displayName: 'Use Node 12.x'
+ inputs:
+ versionSpec: '12.x'
+ - template: templates/azp-step-git-init.yaml@azure
+ - script: |
+ export LOKALISE_TOKEN="$(lokaliseToken)"
+ export AZURE_BRANCH="$(Build.SourceBranchName)"
+
+ npm install
+ ./script/translations_download
+ displayName: 'Download Translation'
+ - script: |
+ git checkout dev
+ git add translation
+ git commit -am "[ci skip] Translation update"
+ git push
+ displayName: 'Update translation'
diff --git a/build-scripts/webpack.js b/build-scripts/webpack.js
index ac04587333..d3c57b3c2a 100644
--- a/build-scripts/webpack.js
+++ b/build-scripts/webpack.js
@@ -91,7 +91,7 @@ const createWebpackConfig = ({
),
].filter(Boolean),
resolve: {
- extensions: [".ts", ".js", ".json", ".tsx"],
+ extensions: [".ts", ".js", ".json"],
alias: {
react: "preact-compat",
"react-dom": "preact-compat",
diff --git a/hassio/src/addon-view/hassio-addon-info.js b/hassio/src/addon-view/hassio-addon-info.js
index 449b85a8cc..1ef1386ecb 100644
--- a/hassio/src/addon-view/hassio-addon-info.js
+++ b/hassio/src/addon-view/hassio-addon-info.js
@@ -373,19 +373,21 @@ class HassioAddonInfo extends EventsMixin(PolymerElement) {
-
@@ -610,6 +612,10 @@ class HassioAddonInfo extends EventsMixin(PolymerElement) {
return !addon.ingress || !this._computeHA92plus(hass);
}
+ _computeUsesProtectedOptions(addon) {
+ return addon.docker_api || addon.full_access || addon.host_pid;
+ }
+
_computeHA92plus(hass) {
const [major, minor] = hass.config.version.split(".", 2);
return Number(major) > 0 || (major === "0" && Number(minor) >= 92);
diff --git a/package.json b/package.json
index 9f111f9e4e..17670b2b1b 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"version": "1.0.0",
"scripts": {
"build": "script/build_frontend",
- "lint": "eslint src hassio/src gallery/src && tslint 'src/**/*.ts' 'src/**/*.tsx' 'hassio/src/**/*.ts' 'gallery/src/**/*.ts' 'cast/src/**/*.ts' 'test-mocha/**/*.ts' && tsc",
+ "lint": "eslint src hassio/src gallery/src && tslint 'src/**/*.ts' 'hassio/src/**/*.ts' 'gallery/src/**/*.ts' 'cast/src/**/*.ts' 'test-mocha/**/*.ts' && tsc",
"mocha": "node_modules/.bin/ts-mocha -p test-mocha/tsconfig.test.json --opts test-mocha/mocha.opts",
"test": "npm run lint && npm run mocha",
"docker_build": "sh ./script/docker_run.sh build $npm_package_version",
@@ -26,7 +26,7 @@
"@material/mwc-fab": "^0.10.0",
"@material/mwc-ripple": "^0.10.0",
"@material/mwc-switch": "^0.10.0",
- "@mdi/svg": "4.6.95",
+ "@mdi/svg": "4.7.95",
"@polymer/app-layout": "^3.0.2",
"@polymer/app-localize-behavior": "^3.0.1",
"@polymer/app-route": "^3.0.2",
@@ -99,7 +99,6 @@
"regenerator-runtime": "^0.13.2",
"roboto-fontface": "^0.10.0",
"superstruct": "^0.6.1",
- "copy-to-clipboard": "^1.0.9",
"tslib": "^1.10.0",
"unfetch": "^4.1.0",
"web-animations-js": "^2.3.1",
diff --git a/script/translations_upload_base b/script/translations_upload_base
index 56593acd17..2c76d300bb 100755
--- a/script/translations_upload_base
+++ b/script/translations_upload_base
@@ -26,8 +26,8 @@ LANG_ISO=en
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
-if [ "${CURRENT_BRANCH-}" != "master" ] && [ "${TRAVIS_BRANCH-}" != "master" ] ; then
- echo "Please only run the translations upload script from a clean checkout of master."
+if [ "${CURRENT_BRANCH-}" != "dev" ] && [ "${AZURE_BRANCH-}" != "dev" ] ; then
+ echo "Please only run the translations upload script from a clean checkout of dev."
exit 1
fi
diff --git a/script/travis_deploy b/script/travis_deploy
deleted file mode 100755
index 4875362c2f..0000000000
--- a/script/travis_deploy
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# Safe bash settings
-# -e Exit on command fail
-# -u Exit on unset variable
-# -o pipefail Exit if piped command has error code
-set -eu -o pipefail
-
-cd "$(dirname "$0")/.."
-
-script/translations_upload_base
diff --git a/setup.py b/setup.py
index c36ba08115..4a82f955d5 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
- version="20191204.1",
+ version="20200107.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/dom/dynamic-content-directive.ts b/src/common/dom/dynamic-element-directive.ts
similarity index 66%
rename from src/common/dom/dynamic-content-directive.ts
rename to src/common/dom/dynamic-element-directive.ts
index 31a8a1ead7..25ca9cfec8 100644
--- a/src/common/dom/dynamic-content-directive.ts
+++ b/src/common/dom/dynamic-element-directive.ts
@@ -1,7 +1,7 @@
import { directive, Part, NodePart } from "lit-html";
-export const dynamicContentDirective = directive(
- (tag: string, properties: { [key: string]: any }) => (part: Part): void => {
+export const dynamicElement = directive(
+ (tag: string, properties?: { [key: string]: any }) => (part: Part): void => {
if (!(part instanceof NodePart)) {
throw new Error(
"dynamicContentDirective can only be used in content bindings"
@@ -14,16 +14,20 @@ export const dynamicContentDirective = directive(
element !== undefined &&
tag.toUpperCase() === (element as HTMLElement).tagName
) {
- Object.entries(properties).forEach(([key, value]) => {
- element![key] = value;
- });
+ if (properties) {
+ Object.entries(properties).forEach(([key, value]) => {
+ element![key] = value;
+ });
+ }
return;
}
element = document.createElement(tag);
- Object.entries(properties).forEach(([key, value]) => {
- element![key] = value;
- });
+ if (properties) {
+ Object.entries(properties).forEach(([key, value]) => {
+ element![key] = value;
+ });
+ }
part.setValue(element);
}
);
diff --git a/src/common/preact/event.ts b/src/common/preact/event.ts
deleted file mode 100644
index a35d1969e4..0000000000
--- a/src/common/preact/event.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-// interface OnChangeComponent {
-// props: {
-// index: number;
-// onChange(index: number, data: object);
-// };
-// }
-
-// export function onChangeEvent(this: OnChangeComponent, prop, ev) {
-export function onChangeEvent(this: any, prop, ev) {
- if (!this.initialized) {
- return;
- }
-
- const origData = this.props[prop];
- if (ev.target.value === origData[ev.target.name]) {
- return;
- }
-
- const data = { ...origData };
-
- if (ev.target.value) {
- data[ev.target.name] = ev.target.value;
- } else {
- delete data[ev.target.name];
- }
-
- this.props.onChange(this.props.index, data);
-}
diff --git a/src/common/preact/unmount.ts b/src/common/preact/unmount.ts
deleted file mode 100644
index 8d7fa510ea..0000000000
--- a/src/common/preact/unmount.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { render } from "preact";
-
-export default function unmount(mountEl) {
- render(
- // @ts-ignore
- () => null,
- mountEl
- );
-}
diff --git a/src/common/search/search-input.ts b/src/common/search/search-input.ts
index 65b29881e9..2c3e772c42 100644
--- a/src/common/search/search-input.ts
+++ b/src/common/search/search-input.ts
@@ -14,7 +14,11 @@ import "@material/mwc-button";
@customElement("search-input")
class SearchInput extends LitElement {
- @property() private filter?: string;
+ @property() public filter?: string;
+
+ public focus() {
+ this.shadowRoot!.querySelector("paper-input")!.focus();
+ }
protected render(): TemplateResult | void {
return html`
diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts
index ea7f0e59ac..7827938381 100644
--- a/src/components/data-table/ha-data-table.ts
+++ b/src/components/data-table/ha-data-table.ts
@@ -75,7 +75,7 @@ export interface DataTableSortColumnData {
export interface DataTableColumnData extends DataTableSortColumnData {
title: string;
type?: "numeric" | "icon";
- template?:
(data: any, row: T) => TemplateResult;
+ template?: (data: any, row: T) => TemplateResult | string;
}
export interface DataTableRowData {
@@ -88,11 +88,11 @@ export class HaDataTable extends BaseElement {
@property({ type: Array }) public data: DataTableRowData[] = [];
@property({ type: Boolean }) public selectable = false;
@property({ type: String }) public id = "id";
+ @property({ type: String }) public filter = "";
protected mdcFoundation!: MDCDataTableFoundation;
protected readonly mdcFoundationClass = MDCDataTableFoundation;
@query(".mdc-data-table") protected mdcRoot!: HTMLElement;
@queryAll(".mdc-data-table__row") protected rowElements!: HTMLElement[];
- @query("#header-checkbox") private _headerCheckbox!: HaCheckbox;
@property({ type: Boolean }) private _filterable = false;
@property({ type: Boolean }) private _headerChecked = false;
@property({ type: Boolean }) private _headerIndeterminate = false;
@@ -108,13 +108,19 @@ export class HaDataTable extends BaseElement {
private _worker: any | undefined;
private _debounceSearch = debounce(
- (ev) => {
- this._filter = ev.detail.value;
+ (value: string) => {
+ this._filter = value;
},
200,
false
);
+ public clearSelection(): void {
+ this._headerChecked = false;
+ this._headerIndeterminate = false;
+ this.mdcFoundation.handleHeaderRowCheckboxChange();
+ }
+
protected firstUpdated() {
super.firstUpdated();
this._worker = sortFilterWorker();
@@ -146,6 +152,10 @@ export class HaDataTable extends BaseElement {
this._sortColumns = clonedColumns;
}
+ if (properties.has("filter")) {
+ this._debounceSearch(this.filter);
+ }
+
if (
properties.has("data") ||
properties.has("columns") ||
@@ -159,14 +169,18 @@ export class HaDataTable extends BaseElement {
protected render() {
return html`
- ${this._filterable
- ? html`
-
- `
- : ""}
+
+ ${this._filterable
+ ? html`
+
+ `
+ : ""}
+