Newer
Older
smart-home-server / webclient / src / js / components / screens / areas / areas-details-modal.js
import { placeInArea } from "./areas-placeto-component.js";

function initEditedFields(sh_api, area, modal) {
	const editedFields = [
		{
			payloadFieldName: "display_name",
			selector: ".display-name",
			methName: "update_display_name",
			originalValue: area.display_name,
			isMultiString: false
		},
		{
			payloadFieldName: "new_alias",
			selector: ".alias",
			methName: "update_alias",
			originalValue: area.alias,
			isMultiString: false
		},
	];

	for(let editedField of editedFields) {
		const edit = editableString(modal.querySelector(editedField.selector));
		edit.editableString.onChange(component => {
			const payload = {
				area_id: area.id,
			};

			payload[editedField.payloadFieldName] = component.value;

			sh_api.areas[editedField.methName](payload, (err, resp, meta) => {
				if(err || !resp || !resp.status) {
					console.error(`sh_api.areas.${editedField.methName}`, err);
					edit.editableString.setValue(editedField.originalValue);

					return Toasts.createError(
						err?.message ?? "Error updating", 
						err.raw?.msg ?? `Error of ${editedField.payloadFieldName} updating`
					).show();
				}

				if(resp.status == true) {
					Screens.reinit();
				}
			});
		});
	}
}

export function areaDetailsModal(area, sh_api) {
	area = Screens.currentScreen.DOMObject.provideData[area.id] ?? area;

	console.log("areaDetailsModal", area);

	return Modals.create("area-details-modal", {
		title: `<i class="ph ph-map-trifold normalize"></i> ${area.display_name}`,
		body: modal => {
			const entityData = area;

			const fieldClassMap = {
				parent_id: "place-in-area-container",
				display_name: "display-name",
				alias: "alias-view-container"
			};

			const wrapToContainer = (field, value) => {
				const map = {
					alias: `<i class="ph ph-link-simple-break"></i> <span class="alias">{{value}}</span>`,
					create_at: value => Helper.unification.formatDate(value),
					update_at: value => Helper.unification.formatDate(value),
					schema: "<span class='text-mute'>Nothing yet</span>",
				}

				return map[field] 
					? (typeof map[field] == "function" ? map[field](value) : map[field].replaceAll("{{value}}", value))
					: value; 
			}

			let properties = "";
			for(let field in entityData) {
				let fieldValueClass = fieldClassMap[field] ?? "";

				properties += `
					<tr class="table-row">
						<th>${field}: </th>
						<td class="${fieldValueClass}">${wrapToContainer(field, entityData[field])}</td>
					</tr>
				`;
			}

			return `
				<table class="table" style="border: 0">
					<tbody class="table-body">
						${properties}
					</tbody>
				</table>
			`;
		},
		actions: modal => {
			const btnCancel = Helper.template.createElement("button", {
				class: "btn btn-primary"
			}, "Close");

			const btnRemove = Helper.template.createElement("button", {
				class: "btn btn-danger with-icon"
			}, `<i class="ph ph-trash"></i> Remove`);

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

			btnRemove.addEventListener("click", e => {
				Helper.states.btnLoadingState(btnRemove, true);

				confirmPopup(
					`Are you sure you want to remove this area? <b>${area.display_name}</b>`, 
					() => {
						sh_api.areas.remove(
							area.id,
							(err, data, meta) => {
								
								Helper.states.btnLoadingState(btnRemove, false);
								console.log("Was removed");

								modal.close();
								Screens.reinit();

								setTimeout(() => {
									Toasts.createSuccess(
										"Removed",
										`Area: ${area.display_name}`
									).show();
								}, 300);
							}
						);
				}, 
				() => {
					Helper.states.btnLoadingState(btnRemove, false);
					console.log("CANCELED");
				});
			});

			return [ btnCancel, btnRemove ];
		},
		onready: modal => {
			placeInArea(
				sh_api,
				modal.querySelector(".place-in-area-container"),
				"area",
				area.id,
				area.parent_id
			);

			initEditedFields(sh_api, area, modal);
		}
	});
}