import BaseUIElement from "../BaseUIElement" import { InputElement } from "./InputElement" import { UIEventSource } from "../../Logic/UIEventSource" export default class FileSelectorButton extends InputElement { private static _nextid IsSelected: UIEventSource private readonly _value = new UIEventSource(undefined) private readonly _label: BaseUIElement private readonly _acceptType: string private readonly allowMultiple: boolean constructor( label: BaseUIElement, options?: { acceptType: "image/*" | string allowMultiple: true | boolean } ) { super() this._label = label this._acceptType = options?.acceptType ?? "image/*" this.SetClass("block cursor-pointer") label.SetClass("cursor-pointer") this.allowMultiple = options?.allowMultiple ?? true } GetValue(): UIEventSource { return this._value } IsValid(t: FileList): boolean { return true } protected InnerConstructElement(): HTMLElement { const self = this const el = document.createElement("form") const label = document.createElement("label") label.appendChild(this._label.ConstructElement()) el.appendChild(label) const actualInputElement = document.createElement("input") actualInputElement.style.cssText = "display:none" actualInputElement.type = "file" actualInputElement.accept = this._acceptType actualInputElement.name = "picField" actualInputElement.multiple = this.allowMultiple actualInputElement.id = "fileselector" + FileSelectorButton._nextid FileSelectorButton._nextid++ label.htmlFor = actualInputElement.id actualInputElement.onchange = () => { if (actualInputElement.files !== null) { self._value.setData(actualInputElement.files) } } el.addEventListener("submit", (e) => { if (actualInputElement.files !== null) { self._value.setData(actualInputElement.files) } e.preventDefault() }) el.appendChild(actualInputElement) el.addEventListener("dragover", (event) => { event.stopPropagation() event.preventDefault() // Style the drag-and-drop as a "copy file" operation. event.dataTransfer.dropEffect = "copy" }) el.addEventListener("drop", (event) => { event.stopPropagation() event.preventDefault() const fileList = event.dataTransfer.files this._value.setData(fileList) }) return el } }