Newer
Older
smart-home-server / webclient / src / js / components / editable-string.js
function template(originalText) {
	return `
		<div class="editable-string-content">
			<span class="editable-string">${originalText}</span>
			<button class="btn-icon without-hover edit-text-btn"><i class="ph ph-pencil-simple"></i></button>
		</div>
		<div class="editable-string-form d-none">
			<div class="form-group">
				<label class="label">
					<input type="text" class="input" placeholder="Write something">
				</label>
			</div>
			<button class="btn-icon without-hover apply-changes-btn"><i class="ph ph-check"></i></button>
			<button class="btn-icon without-hover cancel-changes-btn"><i class="ph ph-x"></i></button>
		</div>
	`;
}

export default function editableString(stringContainer) {
	const originalText = stringContainer.innerHTML;

	const component = Helper.template.createElement("div", {
		"class": "component editable-string-component"
	}, template(originalText));

	stringContainer.innerHTML = "";
	stringContainer.append(component);

	const editBtn = component.querySelector(".edit-text-btn");
	const applyBtn = component.querySelector(".apply-changes-btn");
	const cancelBtn = component.querySelector(".cancel-changes-btn");
	const content = component.querySelector(".editable-string-content");
	const editableString = component.querySelector(".editable-string");
	const form = component.querySelector(".editable-string-form");
	const input = component.querySelector(".input");

	component.editableString = {
		formIsDisplaying: false,
		value: originalText,
		input: input,
		eventsHandlers: {
			onChange: [],
			onSwitch: [],
		},
		switch: () => {
			if(component.formIsDisplaying) {
				form.classList.add("d-none");
				content.classList.remove("d-none");
				editableString.innerText = component.editableString.value;
			} else {
				form.classList.remove("d-none");
				content.classList.add("d-none");
				input.value = component.editableString.value;
			}

			component.formIsDisplaying = !component.formIsDisplaying;
			component.editableString.runEventHandler("onSwitch");
		},
		onChange: cb => {
			component.editableString.eventsHandlers.onChange.push(cb);
		},
		onSwitch: cb => {
			component.editableString.eventsHandlers.onSwitch.push(cb);
		},
		runEventHandler: evName => {
			component.editableString.eventsHandlers[evName].forEach(handler => handler(component.editableString));
		} 
	}

	editBtn.addEventListener("click", e => {
		component.editableString.switch();
	});

	cancelBtn.addEventListener("click", e => {
		component.editableString.switch();
	});

	applyBtn.addEventListener("click", e => {
		component.editableString.value = input.value;
		component.editableString.switch();
		component.editableString.runEventHandler("onChange");
	});

	return component;
}