From 9ec9c7e56be126ee4c21cc5fcc83ae756daa40b2 Mon Sep 17 00:00:00 2001
From: Wendelin <12148533+wendevlin@users.noreply.github.com>
Date: Thu, 9 Jan 2025 09:25:09 +0100
Subject: [PATCH] Simplify dashboard background upload (#23633)
---
src/components/ha-file-upload.ts | 36 +++----
.../ha-selector/ha-selector-background.ts | 96 +++++++++++++++++++
src/components/ha-selector/ha-selector.ts | 1 +
src/data/selector.ts | 5 +
.../view-editor/hui-view-background-editor.ts | 4 +-
src/translations/en.json | 3 +
6 files changed, 126 insertions(+), 19 deletions(-)
create mode 100644 src/components/ha-selector/ha-selector-background.ts
diff --git a/src/components/ha-file-upload.ts b/src/components/ha-file-upload.ts
index 7b588d09b0..06937d5c82 100644
--- a/src/components/ha-file-upload.ts
+++ b/src/components/ha-file-upload.ts
@@ -1,7 +1,7 @@
import "@material/mwc-linear-progress/mwc-linear-progress";
import { mdiDelete, mdiFileUpload } from "@mdi/js";
import type { PropertyValues, TemplateResult } from "lit";
-import { LitElement, css, html } from "lit";
+import { LitElement, css, html, nothing } from "lit";
import { customElement, property, query, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
import { fireEvent } from "../common/dom/fire_event";
@@ -76,7 +76,7 @@ export class HaFileUpload extends LitElement {
return html`
${this.uploading
? html`
-
+
${this.progress
- ? html`
${this.progress}${blankBeforePercent(
- this.hass!.locale
- )}%`
- : ""}
+ ? html`
+ ${this.progress}${blankBeforePercent(this.hass!.locale)}%
+
`
+ : nothing}
+ ${this.yamlBackground
+ ? html`
+
+ ${this.hass.localize(
+ `ui.components.selectors.background.yaml_info`
+ )}
+
+ ${this.hass.localize(
+ `ui.components.picture-upload.clear_picture`
+ )}
+
+
+ `
+ : html`
+
+ `}
+
+ `;
+ }
+
+ private _pictureChanged(ev) {
+ const value = (ev.target as HaPictureUpload).value;
+
+ fireEvent(this, "value-changed", { value: value ?? undefined });
+ }
+
+ private _clearValue() {
+ fireEvent(this, "value-changed", { value: undefined });
+ }
+
+ static get styles(): CSSResultGroup {
+ return css`
+ :host {
+ display: block;
+ position: relative;
+ }
+ div {
+ display: flex;
+ flex-direction: column;
+ }
+ ha-button {
+ white-space: nowrap;
+ --mdc-theme-primary: var(--primary-color);
+ }
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "ha-selector-background": HaBackgroundSelector;
+ }
+}
diff --git a/src/components/ha-selector/ha-selector.ts b/src/components/ha-selector/ha-selector.ts
index 6b50b9329f..dd45f13d8d 100644
--- a/src/components/ha-selector/ha-selector.ts
+++ b/src/components/ha-selector/ha-selector.ts
@@ -34,6 +34,7 @@ const LOAD_ELEMENTS = {
floor: () => import("./ha-selector-floor"),
label: () => import("./ha-selector-label"),
image: () => import("./ha-selector-image"),
+ background: () => import("./ha-selector-background"),
language: () => import("./ha-selector-language"),
navigation: () => import("./ha-selector-navigation"),
number: () => import("./ha-selector-number"),
diff --git a/src/data/selector.ts b/src/data/selector.ts
index 40fb7e36ce..2514e176f7 100644
--- a/src/data/selector.ts
+++ b/src/data/selector.ts
@@ -46,6 +46,7 @@ export type Selector =
| IconSelector
| LabelSelector
| ImageSelector
+ | BackgroundSelector
| LanguageSelector
| LocationSelector
| MediaSelector
@@ -275,6 +276,10 @@ export interface ImageSelector {
image: { original?: boolean; crop?: CropOptions } | null;
}
+export interface BackgroundSelector {
+ background: { original?: boolean; crop?: CropOptions } | null;
+}
+
export interface LabelSelector {
label: {
multiple?: boolean;
diff --git a/src/panels/lovelace/editor/view-editor/hui-view-background-editor.ts b/src/panels/lovelace/editor/view-editor/hui-view-background-editor.ts
index 41d2a5084f..d4ff9efe91 100644
--- a/src/panels/lovelace/editor/view-editor/hui-view-background-editor.ts
+++ b/src/panels/lovelace/editor/view-editor/hui-view-background-editor.ts
@@ -6,7 +6,7 @@ import { customElement, property, state } from "lit/decorators";
import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-form/ha-form";
import type { SchemaUnion } from "../../../../components/ha-form/types";
-import "../../../../components/ha-selector/ha-selector-image";
+import "../../../../components/ha-selector/ha-selector-background";
import type { LovelaceViewConfig } from "../../../../data/lovelace/config/view";
import type { HomeAssistant } from "../../../../types";
@@ -26,7 +26,7 @@ export class HuiViewBackgroundEditor extends LitElement {
private _schema = memoizeOne((showSettings: boolean) => [
{
name: "image",
- selector: { image: { original: true } },
+ selector: { background: { original: true } },
},
...(showSettings
? ([
diff --git a/src/translations/en.json b/src/translations/en.json
index a902e580cc..488f6dd463 100644
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -392,6 +392,9 @@
"upload": "Upload picture",
"url": "Local path or web URL"
},
+ "background": {
+ "yaml_info": "Background image is set via yaml editor."
+ },
"location": {
"latitude": "[%key:ui::panel::config::zone::detail::latitude%]",
"longitude": "[%key:ui::panel::config::zone::detail::longitude%]",