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

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

	for(let script of data.scripts) {
		const state = script.state == "enabled"
			? `<span class="badge badge-success">Enabled</span>`
			: `<span class="badge badge-primary">Disabled</span>`;

		const btnSwitch = script.state == "disabled"
			? `<button 
					class="btn btn-success btn-small change-state-btn" 
					data-script='${JSON.stringify(script)}'
					type="button"
					data-value="enable"
				>Enable</button>`
			: `<button 
					class="btn btn-warning btn-small change-state-btn" 
					data-script='${JSON.stringify(script)}'
					type="button"
					data-value="disable"
				>Disable</button>`;

		preparedData.push({
			alias: `${script.alias}<br><small class="text-muted">by ${script.created_by}</small>`,
			name: `${script.name}<div class="mt-1"><small>${script.description}</small></div>`,
			filename: `${script.filename}<br><code><small>${script.path}</small></code>`,
			state: state,
			actions: `
				${btnSwitch}
			`
		});
	}

	return preparedData;
}

function renderingRegularScriptsTable(scr, data, total) {
	console.log("renderingRegularScriptsTable", data);

	scr.currentScreen.DOMObject.querySelector(".main-container").innerHTML = Helper.template.table(
		"Regular scripts list", 
		{
			alias: "Alias", 
			name: "Script name",  
			filename: "Filename", 
			state: "Status", 
			actions: "Actions"
		},
		data,
		`<span class="table-meta">Total: <span class="total">${total}</span> scripts</span>`
	);
}

function initTableInteractiveElements(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();
				}

			});
		});
	});
}

function regular(sh_api) {
	return {
		title: "Scripts Regular",
		alias: "scripts-regular",
		renderer: () => {
			const sidebar = sidebarTemplate("regular");

			return `
				<div class="container">
					<div class="row g-6">
						<div class="col sidebar-container">
							${sidebar}
						</div>
						<div class="col main-container w-100"></div>
					</div>
				</div>
			`;
		},
		initer: scr => {
			sh_api.scripts.regular_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", "");
				}

				renderingRegularScriptsTable(scr, prepareData(resp.data), resp.data.total);
				initTableInteractiveElements(scr, sh_api);

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

export {
	regular
}