Newer
Older
smart-home-server / webclient / src / js / components / modals.js
function template(id, title, footer) {
	return `
		<div class="modal" aria-hidden="true" id="${id}">
      <div class="modal-backdrop"></div>

      <div class="modal-panel" role="dialog" aria-modal="true" aria-labelledby="modal-title-basic">
        <header class="modal-header">
          <h4 class="modal-title" id="modal-title-basic">${title}</h4>
          <button class="btn-icon modal-close" type="button" aria-label="Close">✕</button>
        </header>

        <div class="modal-body"></div>
        <footer class="modal-footer">${footer}</footer>
      </div>
    </div>
	`;
}

function init(modal) {
	modal.show = function() {
		document.querySelector("body").append(modal);

		setTimeout(() => {
			this.classList.add("a-show");
		}, 10);
	}

	modal.close = function() {
		this.classList.add("a-hide");
		setTimeout(() => {
			this.remove();
		}, 300);
	}

	modal.querySelector(".modal-close").addEventListener("click", e => {
		modal.close();
	});

	return modal;
}

	/**
	 * Create new modal window;
	 * @param  {string} id    Uniq id (selector)
	 * @param  {string} title Display title
	 * @param  {object} props { body: modal => {}, actions => modal => {} }
	 * @return {object}       DOM object
	 */
function create(id, props) {
	const title = props.title || "";
	const footer = props.footer || "";

	const div = document.createElement("div");
	div.innerHTML = template(id, title, footer);
	const modal = div.childNodes[1];

	const modalBody = modal.querySelector(".modal-body");
	const modalFooter = modal.querySelector(".modal-footer");

	if(typeof props.actions == "function") {
		const actionsResult = props.actions(modal);

		if(typeof actionsResult[0] == "object") {
			const actions = document.createElement("div");
			actions.classList.add("actions");
			for(let actionElement of actionsResult) {
				actions.append(actionElement);
			}

			modalFooter.append(actions);
		}
	}

	if(typeof props.body == "function") {
		const bodyResult = props.body(modal);

		if(typeof bodyResult == "object") {
			modalBody.append(bodyResult);
		} else if(typeof bodyResult == "string") {
			modalBody.innerHTML = bodyResult;
		}
	}

	return init(modal);
}

export default {
	create
}