import {HTMLBuilderBlock} from "./types";
export default class HTMLBuilder {
element: HTMLElement;
constructor(data: HTMLBuilderBlock) {
this.element = document.createElement(data.element);
this.setId(data.id ?? data.element + '-custom-element-' + Math.floor(Math.random() * 1000000));
if (data.class) this.setClasses(data.class);
if (data.attributes) this.setAttributes(data.attributes);
if (data.style) this.setStyles(data.style);
if (data.mouseClickEvent) this.setMouseClickListener(data.mouseClickEvent);
if (data.mouseMoveEvent) this.setMouseMoveListener(data.mouseMoveEvent);
if (data.mouseDownEvent) this.setMouseDownListener(data.mouseDownEvent);
if (data.mouseUpEvent) this.setMouseUpListener(data.mouseUpEvent);
if (data.keyUpEvent) this.setKeyUpListener(data.keyUpEvent);
if (data.changeListener) this.setChangeListener(data.changeListener);
if (data.content) this.setContent(data.content);
}
setId(id: string) {
this.element.id = id;
}
setClasses(classes: string | string[]) {
if (typeof classes === 'string') {
this.addClass(classes);
} else {
for(let className of classes) {
this.addClass(className);
}
}
}
addClass(className: string) {
this.element.classList.add(className);
}
setAttributes(attributes: {[key: string]: string}) {
for(let key in attributes) {
if (!attributes[key]) continue;
this.addAttribute(key, attributes[key]);
}
}
addAttribute(key: string, value: string) {
this.element.setAttribute(key, value);
}
setStyles(style: Partial) {
for (const key in style) {
this.addStyle(key, style[key] || '');
}
}
addStyle(key: string, value: string) {
this.element.style.setProperty(key, value);
}
setMouseClickListener(cb: Function) {
this.element.addEventListener('click', () => cb());
}
setContent(content: (HTMLBuilderBlock|string|HTMLElement)[]) {
for (let block of content) {
this.addContent(block);
}
}
addContent(content: HTMLBuilderBlock|string|HTMLElement) {
if (typeof content === 'string') {
this.element.innerHTML += content;
} else {
if (content instanceof HTMLElement) {
this.element.appendChild(content);
} else {
const el = new HTMLBuilder(content);
this.element.appendChild(el.element)
}
}
}
setMouseMoveListener(cb: Function) {
this.element.addEventListener('mousemove', () => cb());
}
setMouseDownListener(cb: Function) {
this.element.addEventListener('mousedown', () => cb());
}
setMouseUpListener(cb: Function) {
this.element.addEventListener('mouseup', () => cb());
}
setKeyUpListener(cb: Function) {
this.element.addEventListener('keyup', () => cb(this.element.innerHTML));
}
setChangeListener(cb: Function) {
this.element.addEventListener('change', (e) => cb(e));
}
getElement() {
return this.element;
}
remove() {
this.element.remove();
}
}