Convert file upload to mdc (#11906)

This commit is contained in:
Bram Kragten 2022-03-07 15:42:40 +01:00 committed by GitHub
parent 4b8b14a69d
commit 0dac10aa23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 129 additions and 85 deletions

View File

@ -1,6 +1,5 @@
import { styles } from "@material/mwc-textfield/mwc-textfield.css";
import { mdiClose } from "@mdi/js"; import { mdiClose } from "@mdi/js";
import "@polymer/iron-input/iron-input";
import "@polymer/paper-input/paper-input-container";
import { css, html, LitElement, PropertyValues, TemplateResult } from "lit"; import { css, html, LitElement, PropertyValues, TemplateResult } from "lit";
import { customElement, property, query, state } from "lit/decorators"; import { customElement, property, query, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map"; import { classMap } from "lit/directives/class-map";
@ -21,7 +20,7 @@ export class HaFileUpload extends LitElement {
@property() public accept!: string; @property() public accept!: string;
@property() public icon!: string; @property() public icon?: string;
@property() public label!: string; @property() public label!: string;
@ -39,15 +38,7 @@ export class HaFileUpload extends LitElement {
protected firstUpdated(changedProperties: PropertyValues) { protected firstUpdated(changedProperties: PropertyValues) {
super.firstUpdated(changedProperties); super.firstUpdated(changedProperties);
if (this.autoOpenFileDialog) { if (this.autoOpenFileDialog) {
this._input?.click(); this._openFilePicker();
}
}
protected updated(changedProperties: PropertyValues) {
if (changedProperties.has("_drag") && !this.uploading) {
(
this.shadowRoot!.querySelector("paper-input-container") as any
)._setFocused(this._drag);
} }
} }
@ -60,31 +51,52 @@ export class HaFileUpload extends LitElement {
active active
></ha-circular-progress>` ></ha-circular-progress>`
: html` : html`
<label for="input"> <label
<paper-input-container for="input"
.alwaysFloatLabel=${Boolean(this.value)} class="mdc-text-field mdc-text-field--filled ${classMap({
"mdc-text-field--focused": this._drag,
"mdc-text-field--with-leading-icon": Boolean(this.icon),
"mdc-text-field--with-trailing-icon": Boolean(this.value),
})}"
@drop=${this._handleDrop} @drop=${this._handleDrop}
@dragenter=${this._handleDragStart} @dragenter=${this._handleDragStart}
@dragover=${this._handleDragStart} @dragover=${this._handleDragStart}
@dragleave=${this._handleDragEnd} @dragleave=${this._handleDragEnd}
@dragend=${this._handleDragEnd} @dragend=${this._handleDragEnd}
class=${classMap({
dragged: this._drag,
})}
> >
<label for="input" slot="label"> ${this.label} </label> <span class="mdc-text-field__ripple"></span>
<iron-input slot="input"> <span
class="mdc-floating-label ${this.value || this._drag
? "mdc-floating-label--float-above"
: ""}"
id="label"
>${this.label}</span
>
${this.icon
? html`<span
class="mdc-text-field__icon mdc-text-field__icon--leading"
tabindex="-1"
>
<ha-icon-button
@click=${this._openFilePicker}
.path=${this.icon}
></ha-icon-button>
</span>`
: ""}
<div class="value">${this.value}</div>
<input <input
id="input" id="input"
type="file" type="file"
class="file" class="mdc-text-field__input file"
accept=${this.accept} accept=${this.accept}
@change=${this._handleFilePicked} @change=${this._handleFilePicked}
aria-labelledby="label"
/> />
${this.value}
</iron-input>
${this.value ${this.value
? html` ? html`<span
class="mdc-text-field__icon mdc-text-field__icon--trailing"
tabindex="1"
>
<ha-icon-button <ha-icon-button
slot="suffix" slot="suffix"
@click=${this._clearValue} @click=${this._clearValue}
@ -92,19 +104,22 @@ export class HaFileUpload extends LitElement {
"close"} "close"}
.path=${mdiClose} .path=${mdiClose}
></ha-icon-button> ></ha-icon-button>
` </span>`
: html` : ""}
<ha-icon-button <span
slot="suffix" class="mdc-line-ripple ${this._drag
.path=${this.icon} ? "mdc-line-ripple--active"
></ha-icon-button> : ""}"
`} ></span>
</paper-input-container>
</label> </label>
`} `}
`; `;
} }
private _openFilePicker() {
this._input?.click();
}
private _handleDrop(ev: DragEvent) { private _handleDrop(ev: DragEvent) {
ev.preventDefault(); ev.preventDefault();
ev.stopPropagation(); ev.stopPropagation();
@ -137,13 +152,35 @@ export class HaFileUpload extends LitElement {
} }
static get styles() { static get styles() {
return css` return [
paper-input-container { styles,
position: relative; css`
padding: 8px; :host {
margin: 0 -8px; display: block;
} }
paper-input-container.dragged:before { .mdc-text-field--filled {
height: auto;
padding-top: 16px;
cursor: pointer;
}
.mdc-text-field--filled.mdc-text-field--with-trailing-icon {
padding-top: 28px;
}
.mdc-text-field:not(.mdc-text-field--disabled) .mdc-text-field__icon {
color: var(--secondary-text-color);
}
.mdc-text-field--filled.mdc-text-field--with-trailing-icon
.mdc-text-field__icon {
align-self: flex-end;
}
.mdc-text-field__icon--leading {
margin-bottom: 12px;
}
.mdc-text-field--filled .mdc-floating-label--float-above {
transform: scale(0.75);
top: 8px;
}
.dragged:before {
position: var(--layout-fit_-_position); position: var(--layout-fit_-_position);
top: var(--layout-fit_-_top); top: var(--layout-fit_-_top);
right: var(--layout-fit_-_right); right: var(--layout-fit_-_right);
@ -155,11 +192,14 @@ export class HaFileUpload extends LitElement {
pointer-events: none; pointer-events: none;
border-radius: 4px; border-radius: 4px;
} }
.value {
width: 100%;
}
input.file { input.file {
display: none; display: none;
} }
img { img {
max-width: 125px; max-width: 100%;
max-height: 125px; max-height: 125px;
} }
ha-icon-button { ha-icon-button {
@ -170,7 +210,8 @@ export class HaFileUpload extends LitElement {
display: block; display: block;
text-align-last: center; text-align-last: center;
} }
`; `,
];
} }
} }

View File

@ -464,6 +464,9 @@ class DialogPersonDetail extends LitElement {
ha-textfield { ha-textfield {
display: block; display: block;
} }
ha-picture-upload {
margin-top: 16px;
}
ha-formfield { ha-formfield {
display: block; display: block;
padding: 16px 0; padding: 16px 0;