Newer
Older
smart-home-server / webclient / src / js / components / screens / scripts / scripts-actions-screen.js
import { sidebarTemplate } from "./scripts-funcs.js";
import { actionDetailsPopup } from "./scripts-action-popup.js";

function prepareData(data) {
	const preparedData = [];

	for(let script of data.scripts) {
		preparedData.push({
			alias: script.alias,
			author: script.created_by,
			name: script.name,
			icon: script.icon ?? '<i class="ph ph-play"></i>',
			description: script.description,
			filename: `${script.filename}<br><code><small>${script.path}</small></code>`,
			state: script.state,
			code: script.code
		});
	}

	return preparedData;
}

function renderingMainGrid(scr, data, total) {
	let grid = `<div class="f-grid g-5 w-100">`;

	const provideSciptsData = {};

	for(let item of data) {
		provideSciptsData[item.alias] = item;

		const cardColor = item.state == "enabled" ? "primary" : "warning";
		grid += `
			<div class="card device-action card-${cardColor}">
				<span class="card-title">${item.name}</span>

				<div class="card-content">
					<div class="device-icon-container">
						<div class="device-icon">
							${item.icon}
						</div>
					</div>

					<div class="device-name mb-2">${item.description}</div>
					<button 
						class="btn btn-primary btn-small with-icon action-details-btn" 
						data-alias='${item.alias}'
					>
						<i class="ph ph-folder-open"></i> details
					</button>
				</div>
			</div>
		`;
	}
	grid += `</div>`;

	const mainContainer = scr.currentScreen.DOMObject.querySelector(".main-container");
	mainContainer.innerHTML = grid;
	scr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;
}

function initMainTableInteractiveElements(scr, sh_api) {
	// scr.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(btn => {
	// 	btn.addEventListener("click", e => {
	// 		const btn = e.currentTarget;
	// 		if(btn.getAttribute("disabled")) {
	// 			return ;
	// 		}

	// 		const methName = btn.dataset.value == "enable"
	// 			? "regular_enable"
	// 			: "regular_disable"

	// 		const script = JSON.parse(btn.dataset.script);
	// 		Helper.states.btnLoadingState(btn, true);
	// 		sh_api.scripts[methName](script.alias, (err, data, meta) => {
	// 			Helper.states.btnLoadingState(btn, false);

	// 			if(data) {
	// 				setTimeout(() => Screens.reinit(), 250);
	// 				Toasts.createSuccess(
	// 					`Request Success`,
	// 					`State of <b>${script.alias}</b> was changed`
	// 				).show();
	// 			} else {
	// 				Toasts.createError(
	// 					"Request failed",
	// 					`Regular script state not changed`
	// 				).show();
	// 			}

	// 		});
	// 	});
	// });

	scr.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(btn => {
		btn.addEventListener("click", e => {
			const btn = e.currentTarget;
			const script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};

			console.log("SCRIPT", script);
			actionDetailsPopup(script, sh_api).show();
		});
	});
}

function actions(sh_api) {
	return {
		title: "Scripts Actions",
		alias: "scripts-actions",
		renderer: () => {
			return Helper.template.mainTemplate(sidebarTemplate("actions"));
		},
		initer: scr => {
			sh_api.scripts.actions_list((err, resp, meta) => {
				console.log("sh_api.scripts.regular_list", err, resp, meta);

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

				renderingMainGrid(scr, prepareData(resp.data), resp.data.total);
				initMainTableInteractiveElements(scr, sh_api);

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

export {
	actions
}