import { $ } from "mdui"
export default class MduiPatchedTextAreaElement extends HTMLElement {
static observedAttributes = ['value', 'placeholder']
declare inputDiv?: HTMLDivElement
declare inputContainerDiv?: HTMLDivElement
declare placeholder?: string | number | null
constructor() {
super()
this.attachShadow({ mode: 'open' })
}
_lastValue = ''
connectedCallback() {
const shadow = this.shadowRoot as ShadowRoot
this.inputContainerDiv = new DOMParser().parseFromString(`
`, 'text/html').body.firstChild as HTMLDivElement
this.inputDiv = this.inputContainerDiv.children[0] as HTMLDivElement
this.inputDiv.addEventListener('blur', () => {
if (this._lastValue !== this.value) {
this._lastValue = this.value || ''
this.dispatchEvent(new Event('change', { bubbles: true }))
}
})
this.inputDiv.addEventListener('paste', (e: ClipboardEvent) => {
e.preventDefault()
document.execCommand('insertText', false, e.clipboardData?.getData("text/plain") || '')
})
this.inputDiv.style.width = '100%'
$(this.inputDiv).attr('data-placeholder', $(this).attr('placeholder'))
shadow.appendChild(this.inputContainerDiv)
}
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
console.log(this.inputDiv, name, oldValue, newValue)
switch (name) {
case 'value': {
this.value = newValue || ''
break
}
case 'placeholder': {
this.inputDiv && $(this.inputDiv).attr('data-placeholder', newValue)
break
}
}
}
focus() {
this.inputDiv?.focus()
}
blur() {
this.inputDiv?.blur()
}
checkValidity() {
// TODO: implment this method
return true
}
get value() {
return this.inputDiv?.textContent || ''
}
set value(v) {
this.inputDiv && (this.inputDiv.textContent = v)
}
}
customElements.define('mdui-patched-textarea', MduiPatchedTextAreaElement)