Newer
Older
smart-home-server / webclient / src / js / components / screens / areas / areas-tree-screen.js
import { sidebarTemplate } from "./areas-funcs.js";
import { areaDevicesModal } from "./areas-devices-modal.js";

function makeTree(data) {
	const items = data.areas;

	const map = {};
  const roots = [];

  for (const item of items) {
    map[item.id] = { ...item, children: [] };
  }

  for (const item of items) {
    const node = map[item.id];

    if (item.parent_id && map[item.parent_id]) {
      map[item.parent_id].children.push(node);
    } else {
      roots.push(node);
    }
  }

  return roots;
}

function prepareData(data) {
	const tree = makeTree(data);
	return tree;
}

function renderingBranch(branch) {
	let html = `<div class="branch">`;
	html += `
		<div class="branch">
			<div class="branch-container">
				<div class="branch-info">
					<span class="title"><i class="ph ph-map-trifold normalize"></i> ${branch.display_name}</span>
					[
					<span class="text-muted area-type">${branch.type}</span>
					<span><i class="ph ph-link-simple-break normalize"></i> ${branch.alias}</span>
					]
				</div>

				<div class="row g-4">
					<button 
						class="btn btn-accent btn-small with-icon"
						data-area-id="${branch.id}"
						data-area-name="${branch.display_name}"
					><i class="ph ph-brackets-curly"></i> Scripts</button>
					<button 
						class="btn btn-accent btn-small with-icon devices" 
						data-area-id="${branch.id}"
						data-area-name="${branch.display_name}"
					><i class="ph ph-cpu"></i> Devices</button>
					<button 
						class="btn btn-small btn-primary"
					>Details</button>
				</div>
			</div>
		</div>
	`;

	if(branch.children?.length) {
		for(let childBranch of branch.children) {
			html += renderingBranch(childBranch);
		}
	}

	html += "</div>";
	return html;
}

function renderingAreasTree(scr, tree) {
	console.log("TREE", tree);
	let html = `<div class="tree">`;
	for(let branch of tree) {
		html += renderingBranch(branch);
	}
	html += "</div>";

	scr.currentScreen.DOMObject.querySelector(".main-container").innerHTML = html;
}

function initAreasTree(scr, sh_api) {
	scr.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(btn => {
		btn.addEventListener("click", e => {
			const btn = e.currentTarget;
			const areaId = btn.dataset.areaId;
			const name = btn.dataset.areaName;

			areaDevicesModal({ id: areaId, name }, sh_api).show();
		});
	});

	scr.ready();
}

function areasTree(sh_api) {
	return {
		title: "Areas Tree",
		alias: "areas-tree",
		renderer: () => {
			return Helper.template.mainTemplate(sidebarTemplate("areas-tree"));
		},
		initer: scr => {
			sh_api.areas.list((err, resp, meta) => {
				console.log("sh_api.areas.list", err, resp, meta);

				if(meta.status_code != 200) {
					return scr.error("Server API ERROR", "");
				}

				renderingAreasTree(scr, prepareData(resp.data));
				initAreasTree(scr, sh_api);

				scr.ready();
			});			
		}
	}
}

export {
	areasTree
}