-
-
-
+
+ ${this._showDescription
+ ? html`
+
+ `
+ : html`
+
+
+
+ `}
${this.stateObj
? html`
@@ -173,15 +199,14 @@ export class HaBlueprintAutomationEditor extends LitElement {
value?.default}
@value-changed=${this._inputChanged}
>`
- : html``}
+ @input=${this._inputChanged}
+ >`}
`
)
: html`
@@ -221,7 +246,7 @@ export class HaBlueprintAutomationEditor extends LitElement {
ev.stopPropagation();
const target = ev.target as any;
const key = target.key;
- const value = ev.detail.value;
+ const value = ev.detail?.value || target.value;
if (
(this.config.use_blueprint.input &&
this.config.use_blueprint.input[key] === value) ||
@@ -262,6 +287,10 @@ export class HaBlueprintAutomationEditor extends LitElement {
});
}
+ private _addDescription() {
+ this._showDescription = true;
+ }
+
static get styles(): CSSResultGroup {
return [
haStyle,
@@ -273,9 +302,16 @@ export class HaBlueprintAutomationEditor extends LitElement {
.padding {
padding: 16px;
}
+ .link-button-row {
+ padding: 14px;
+ }
.blueprint-picker-container {
padding: 0 16px 16px;
}
+ ha-textarea,
+ ha-textfield {
+ display: block;
+ }
h3 {
margin: 16px;
}
@@ -292,9 +328,7 @@ export class HaBlueprintAutomationEditor extends LitElement {
--paper-time-input-justify-content: flex-end;
border-top: 1px solid var(--divider-color);
}
- :host(:not([narrow])) ha-settings-row paper-input {
- width: 60%;
- }
+ :host(:not([narrow])) ha-settings-row ha-textfield,
:host(:not([narrow])) ha-settings-row ha-selector {
width: 60%;
}
diff --git a/src/panels/config/automation/thingtalk/dialog-thingtalk.ts b/src/panels/config/automation/thingtalk/dialog-thingtalk.ts
index 46cc842c5a..8eae2ce4b6 100644
--- a/src/panels/config/automation/thingtalk/dialog-thingtalk.ts
+++ b/src/panels/config/automation/thingtalk/dialog-thingtalk.ts
@@ -1,10 +1,11 @@
import "@material/mwc-button";
-import "@polymer/paper-input/paper-input";
-import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
-import { customElement, property, state, query } from "lit/decorators";
+import { customElement, property, query, state } from "lit/decorators";
import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-circular-progress";
+import "../../../../components/ha-dialog";
+import "../../../../components/ha-textfield";
+import type { HaTextField } from "../../../../components/ha-textfield";
import type { AutomationConfig } from "../../../../data/automation";
import { convertThingTalk } from "../../../../data/cloud";
import { haStyle, haStyleDialog } from "../../../../resources/styles";
@@ -12,7 +13,6 @@ import type { HomeAssistant } from "../../../../types";
import "./ha-thingtalk-placeholders";
import type { PlaceholderValues } from "./ha-thingtalk-placeholders";
import type { ThingtalkDialogParams } from "./show-dialog-thingtalk";
-import "../../../../components/ha-dialog";
export interface Placeholder {
name: string;
@@ -38,7 +38,7 @@ class DialogThingtalk extends LitElement {
@state() private _placeholders?: PlaceholderContainer;
- @query("#input") private _input?: PaperInputElement;
+ @query("#input") private _input?: HaTextField;
private _value?: string;
@@ -58,7 +58,7 @@ class DialogThingtalk extends LitElement {
this._placeholders = undefined;
this._params = undefined;
if (this._input) {
- this._input.value = null;
+ this._input.value = "";
}
fireEvent(this, "dialog-closed", { dialog: this.localName });
}
@@ -127,13 +127,13 @@ class DialogThingtalk extends LitElement {
-
+ >
diff --git a/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts
index b018af2959..1dc48f780f 100644
--- a/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts
+++ b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts
@@ -1,11 +1,12 @@
import "@material/mwc-button";
-import "@polymer/paper-input/paper-input";
-import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import { css, CSSResultGroup, html, LitElement } from "lit";
-import { state } from "lit/decorators";
+import { query, state } from "lit/decorators";
import { fireEvent } from "../../../../common/dom/fire_event";
+import { copyToClipboard } from "../../../../common/util/copy-clipboard";
+import type { HaTextField } from "../../../../components/ha-textfield";
+import "../../../../components/ha-textfield";
import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box";
-import { haStyle } from "../../../../resources/styles";
+import { haStyle, haStyleDialog } from "../../../../resources/styles";
import { HomeAssistant } from "../../../../types";
import { documentationUrl } from "../../../../util/documentation-url";
import { WebhookDialogParams } from "./show-dialog-manage-cloudhook";
@@ -17,6 +18,8 @@ export class DialogManageCloudhook extends LitElement {
@state() private _params?: WebhookDialogParams;
+ @query("ha-textfield") _input!: HaTextField;
+
public showDialog(params: WebhookDialogParams) {
this._params = params;
}
@@ -53,12 +56,12 @@ export class DialogManageCloudhook extends LitElement {
"ui.panel.config.cloud.dialog_cloudhook.available_at"
)}
-
+ >
${cloudhook.managed
? html`
@@ -98,10 +101,6 @@ export class DialogManageCloudhook extends LitElement {
`;
}
- private get _paperInput(): PaperInputElement {
- return this.shadowRoot!.querySelector("paper-input")!;
- }
-
private async _disableWebhook() {
showConfirmationDialog(this, {
text: this.hass!.localize(
@@ -117,14 +116,10 @@ export class DialogManageCloudhook extends LitElement {
}
private _copyClipboard(ev: FocusEvent) {
- // paper-input -> iron-input -> input
- const paperInput = ev.currentTarget as PaperInputElement;
- const input = (paperInput.inputElement as any)
- .inputElement as HTMLInputElement;
- input.setSelectionRange(0, input.value.length);
+ const textField = ev.currentTarget as HaTextField;
try {
- document.execCommand("copy");
- paperInput.label = this.hass!.localize(
+ copyToClipboard(textField.value);
+ textField.label = this.hass!.localize(
"ui.panel.config.cloud.dialog_cloudhook.copied_to_clipboard"
);
} catch (err: any) {
@@ -133,18 +128,19 @@ export class DialogManageCloudhook extends LitElement {
}
private _restoreLabel() {
- this._paperInput.label = inputLabel;
+ this._input.label = inputLabel;
}
static get styles(): CSSResultGroup {
return [
haStyle,
+ haStyleDialog,
css`
ha-dialog {
width: 650px;
}
- paper-input {
- margin-top: -8px;
+ ha-textfield {
+ display: block;
}
button.link {
color: var(--primary-color);
diff --git a/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts b/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts
index b180c5f151..8a3b57d427 100644
--- a/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts
+++ b/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts
@@ -19,6 +19,7 @@ import "../../../../components/entity/ha-statistic-picker";
import "../../../../components/entity/ha-entity-picker";
import "../../../../components/ha-radio";
import "../../../../components/ha-formfield";
+import "../../../../components/ha-textfield";
import type { HaRadio } from "../../../../components/ha-radio";
@customElement("dialog-energy-gas-settings")
@@ -188,20 +189,19 @@ export class DialogEnergyGasSettings
>
${this._costs === "number"
- ? html`
- ${this.hass.config.currency}/${unit}
- `
+ `
: ""}
@@ -223,10 +223,10 @@ export class DialogEnergyGasSettings
this._costs = input.value as any;
}
- private _numberPriceChanged(ev: CustomEvent) {
+ private _numberPriceChanged(ev) {
this._source = {
...this._source!,
- number_energy_price: Number(ev.detail.value),
+ number_energy_price: Number(ev.target.value),
entity_energy_price: null,
stat_cost: null,
};
@@ -295,13 +295,10 @@ export class DialogEnergyGasSettings
ha-formfield {
display: block;
}
- ha-statistic-picker {
- width: 100%;
- }
.price-options {
display: block;
padding-left: 52px;
- margin-top: -16px;
+ margin-top: -8px;
}
`,
];
diff --git a/src/panels/config/energy/dialogs/dialog-energy-grid-flow-settings.ts b/src/panels/config/energy/dialogs/dialog-energy-grid-flow-settings.ts
index d32e57f505..2599f61ee3 100644
--- a/src/panels/config/energy/dialogs/dialog-energy-grid-flow-settings.ts
+++ b/src/panels/config/energy/dialogs/dialog-energy-grid-flow-settings.ts
@@ -190,24 +190,21 @@ export class DialogEnergyGridFlowSettings
>
${this._costs === "number"
- ? html`
- ${this.hass.localize(
- `ui.panel.config.energy.grid.flow_dialog.${this._params.direction}.cost_number_suffix`,
- { currency: this.hass.config.currency }
- )}
- `
+ `
: ""}
@@ -302,13 +299,10 @@ export class DialogEnergyGridFlowSettings
ha-formfield {
display: block;
}
- ha-statistic-picker {
- width: 100%;
- }
.price-options {
display: block;
padding-left: 52px;
- margin-top: -16px;
+ margin-top: -8px;
}
`,
];
diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts
index f58a797a36..5255d1197e 100644
--- a/src/panels/config/integrations/ha-config-integrations.ts
+++ b/src/panels/config/integrations/ha-config-integrations.ts
@@ -30,6 +30,7 @@ import "../../../components/ha-check-list-item";
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
import { ConfigEntry, getConfigEntries } from "../../../data/config_entries";
import {
+ getConfigFlowHandlers,
getConfigFlowInProgressCollection,
localizeConfigFlowTitle,
subscribeConfigFlowInProgress,
@@ -51,7 +52,10 @@ import {
} from "../../../data/integration";
import { scanUSBDevices } from "../../../data/usb";
import { showConfigFlowDialog } from "../../../dialogs/config-flow/show-dialog-config-flow";
-import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box";
+import {
+ showAlertDialog,
+ showConfirmationDialog,
+} from "../../../dialogs/generic/show-dialog-box";
import "../../../layouts/hass-loading-screen";
import "../../../layouts/hass-tabs-subpage";
import { SubscribeMixin } from "../../../mixins/subscribe-mixin";
@@ -652,6 +656,19 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
if (!domain) {
return;
}
+ const handlers = await getConfigFlowHandlers(this.hass);
+
+ if (!handlers.includes(domain)) {
+ showAlertDialog(this, {
+ title: this.hass.localize(
+ "ui.panel.config.integrations.config_flow.error"
+ ),
+ text: this.hass.localize(
+ "ui.panel.config.integrations.config_flow.no_config_flow"
+ ),
+ });
+ return;
+ }
const localize = await localizePromise;
if (
!(await showConfirmationDialog(this, {
diff --git a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts
index 4c9603ba0a..c1a75807c7 100644
--- a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts
+++ b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts
@@ -1,7 +1,5 @@
import "@material/mwc-button/mwc-button";
import { mdiAlertCircle, mdiCheckCircle, mdiQrcodeScan } from "@mdi/js";
-import "@polymer/paper-input/paper-input";
-import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import { UnsubscribeFunc } from "home-assistant-js-websocket";
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
import { customElement, property, query, state } from "lit/decorators";
@@ -11,28 +9,30 @@ import { HaCheckbox } from "../../../../../components/ha-checkbox";
import "../../../../../components/ha-circular-progress";
import { createCloseHeading } from "../../../../../components/ha-dialog";
import "../../../../../components/ha-formfield";
+import "../../../../../components/ha-qr-scanner";
import "../../../../../components/ha-radio";
import "../../../../../components/ha-switch";
+import "../../../../../components/ha-textfield";
+import type { HaTextField } from "../../../../../components/ha-textfield";
import {
- zwaveGrantSecurityClasses,
InclusionStrategy,
MINIMUM_QR_STRING_LENGTH,
- zwaveParseQrCode,
+ PlannedProvisioningEntry,
provisionZwaveSmartStartNode,
QRProvisioningInformation,
RequestedGrant,
SecurityClass,
stopZwaveInclusion,
subscribeAddZwaveNode,
+ ZWaveFeature,
+ zwaveGrantSecurityClasses,
+ zwaveParseQrCode,
zwaveSupportsFeature,
zwaveValidateDskAndEnterPin,
- ZWaveFeature,
- PlannedProvisioningEntry,
} from "../../../../../data/zwave_js";
import { haStyle, haStyleDialog } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { ZWaveJSAddNodeDialogParams } from "./show-dialog-zwave_js-add-node";
-import "../../../../../components/ha-qr-scanner";
export interface ZWaveJSAddNodeDevice {
id: string;
@@ -98,7 +98,7 @@ class DialogZWaveJSAddNode extends LitElement {
this._startInclusion();
}
- @query("#pin-input") private _pinInput?: PaperInputElement;
+ @query("#pin-input") private _pinInput?: HaTextField;
protected render(): TemplateResult {
if (!this._entryId) {
@@ -202,12 +202,11 @@ class DialogZWaveJSAddNode extends LitElement {
: ""
}
${item.metadata.unit
? html`${item.metadata.unit}`
: ""}
- `;
+ `;
}
if (item.configuration_value_type === "enumerated") {
@@ -492,7 +493,7 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) {
font-size: 1.3em;
}
- :host(:not([narrow])) ha-settings-row paper-input {
+ :host(:not([narrow])) ha-settings-row ha-textfield {
width: 30%;
text-align: right;
}
diff --git a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts
index 39b449d3d7..75db9e031c 100644
--- a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts
+++ b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts
@@ -1,20 +1,18 @@
import "@material/mwc-button/mwc-button";
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
import { customElement, property, state } from "lit/decorators";
+import memoizeOne from "memoize-one";
+import { fireEvent } from "../../../../common/dom/fire_event";
import { slugify } from "../../../../common/string/slugify";
-import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import { createCloseHeading } from "../../../../components/ha-dialog";
-import "../../../../components/ha-formfield";
-import "../../../../components/ha-icon-picker";
-import "../../../../components/ha-switch";
-import type { HaSwitch } from "../../../../components/ha-switch";
+import "../../../../components/ha-form/ha-form";
+import { HaFormSchema } from "../../../../components/ha-form/types";
+import { CoreFrontendUserData } from "../../../../data/frontend";
import {
LovelaceDashboard,
LovelaceDashboardCreateParams,
- LovelaceDashboardMutableParams,
} from "../../../../data/lovelace";
import { DEFAULT_PANEL, setDefaultPanel } from "../../../../data/panel";
-import { PolymerChangedEvent } from "../../../../polymer-types";
import { haStyleDialog } from "../../../../resources/styles";
import { HomeAssistant } from "../../../../types";
import { LovelaceDashboardDetailsDialogParams } from "./show-dialog-lovelace-dashboard-detail";
@@ -25,62 +23,54 @@ export class DialogLovelaceDashboardDetail extends LitElement {
@state() private _params?: LovelaceDashboardDetailsDialogParams;
- @state() private _urlPath!: LovelaceDashboard["url_path"];
+ @state() private _urlPathChanged = false;
- @state() private _showInSidebar!: boolean;
+ @state() private _data?: Partial;
- @state() private _icon!: string;
-
- @state() private _title!: string;
-
- @state()
- private _requireAdmin!: LovelaceDashboard["require_admin"];
-
- @state() private _error?: string;
+ @state() private _error?: Record;
@state() private _submitting = false;
- public async showDialog(
- params: LovelaceDashboardDetailsDialogParams
- ): Promise {
+ public showDialog(params: LovelaceDashboardDetailsDialogParams): void {
this._params = params;
this._error = undefined;
- this._urlPath = this._params.urlPath || "";
+ this._urlPathChanged = false;
if (this._params.dashboard) {
- this._showInSidebar = !!this._params.dashboard.show_in_sidebar;
- this._icon = this._params.dashboard.icon || "";
- this._title = this._params.dashboard.title || "";
- this._requireAdmin = this._params.dashboard.require_admin || false;
+ this._data = this._params.dashboard;
} else {
- this._showInSidebar = true;
- this._icon = "";
- this._title = "";
- this._requireAdmin = false;
+ this._data = {
+ show_in_sidebar: true,
+ icon: "",
+ title: "",
+ require_admin: false,
+ mode: "storage",
+ };
}
- await this.updateComplete;
+ }
+
+ public closeDialog(): void {
+ this._params = undefined;
+ this._data = undefined;
+ fireEvent(this, "dialog-closed", { dialog: this.localName });
}
protected render(): TemplateResult {
- if (!this._params) {
+ if (!this._params || !this._data) {
return html``;
}
const defaultPanelUrlPath = this.hass.defaultPanel;
- const urlInvalid =
- this._params.urlPath !== "lovelace" &&
- !/^[a-zA-Z0-9_-]+-[a-zA-Z0-9_-]+$/.test(this._urlPath);
- const titleInvalid = !this._title.trim();
- const dir = computeRTLDirection(this.hass);
+ const titleInvalid = !this._data.title || !this._data.title.trim();
return html`
${this._error}