forked from Simnation/Main
204 lines
6.8 KiB
JavaScript
204 lines
6.8 KiB
JavaScript
![]() |
let formInputs = {};
|
||
|
|
||
|
const OpenMenu = (data) => {
|
||
|
if (data == null || data == "") {
|
||
|
console.log("No data detected");
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
$(`.main-wrapper`).fadeIn(0);
|
||
|
|
||
|
let form = ["<form id='qb-input-form'>", `<div class="heading">${data.header != null ? data.header : "Form Title"}</div>`];
|
||
|
|
||
|
data.inputs.forEach((item, index) => {
|
||
|
switch (item.type) {
|
||
|
case "text":
|
||
|
form.push(renderTextInput(item));
|
||
|
break;
|
||
|
case "password":
|
||
|
form.push(renderPasswordInput(item));
|
||
|
break;
|
||
|
case "number":
|
||
|
form.push(renderNumberInput(item));
|
||
|
break;
|
||
|
case "radio":
|
||
|
form.push(renderRadioInput(item));
|
||
|
break;
|
||
|
case "select":
|
||
|
form.push(renderSelectInput(item));
|
||
|
break;
|
||
|
case "checkbox":
|
||
|
form.push(renderCheckboxInput(item));
|
||
|
break;
|
||
|
case "color":
|
||
|
form.push(renderColorInput(item));
|
||
|
break;
|
||
|
default:
|
||
|
form.push(`<div class="label">${item.text}</div>`);
|
||
|
}
|
||
|
});
|
||
|
form.push(`<div class="footer"><button type="submit" class="btn btn-success" id="submit">${data.submitText ? data.submitText : "Submit"}</button></div>`);
|
||
|
|
||
|
form.push("</form>");
|
||
|
|
||
|
$(".main-wrapper").html(form.join(" "));
|
||
|
|
||
|
$("#qb-input-form").on("change", function (event) {
|
||
|
if ($(event.target).attr("type") == "checkbox") {
|
||
|
const value = $(event.target).is(":checked") ? "true" : "false";
|
||
|
formInputs[$(event.target).attr("value")] = value;
|
||
|
} else {
|
||
|
formInputs[$(event.target).attr("name")] = $(event.target).val();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$("#qb-input-form").on("submit", async function (event) {
|
||
|
if (event != null) {
|
||
|
event.preventDefault();
|
||
|
}
|
||
|
await $.post(`https://${GetParentResourceName()}/buttonSubmit`, JSON.stringify({ data: formInputs }));
|
||
|
CloseMenu();
|
||
|
});
|
||
|
};
|
||
|
|
||
|
const renderTextInput = (item) => {
|
||
|
const { text, name } = item;
|
||
|
formInputs[name] = item.default ? item.default : "";
|
||
|
const isRequired = item.isRequired == "true" || item.isRequired ? "required" : "";
|
||
|
const defaultValue = item.default ? `value="${item.default}"` : "";
|
||
|
|
||
|
return ` <input placeholder="${text}" type="text" class="form-control" name="${name}" ${defaultValue} ${isRequired}/>`;
|
||
|
};
|
||
|
const renderPasswordInput = (item) => {
|
||
|
const { text, name } = item;
|
||
|
formInputs[name] = item.default ? item.default : "";
|
||
|
const isRequired = item.isRequired == "true" || item.isRequired ? "required" : "";
|
||
|
const defaultValue = item.default ? `value="${item.default}"` : "";
|
||
|
|
||
|
return ` <input placeholder="${text}" type="password" class="form-control" name="${name}" ${defaultValue} ${isRequired}/>`;
|
||
|
};
|
||
|
const renderNumberInput = (item) => {
|
||
|
try {
|
||
|
const { text, name } = item;
|
||
|
formInputs[name] = item.default ? item.default : "";
|
||
|
const isRequired = item.isRequired == "true" || item.isRequired ? "required" : "";
|
||
|
const defaultValue = item.default ? `value="${item.default}"` : "";
|
||
|
|
||
|
return `<input placeholder="${text}" type="number" class="form-control" name="${name}" ${defaultValue} ${isRequired}/>`;
|
||
|
} catch (err) {
|
||
|
console.log(err);
|
||
|
return "";
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const renderRadioInput = (item) => {
|
||
|
const { options, name, text } = item;
|
||
|
formInputs[name] = options[0].value;
|
||
|
|
||
|
let div = `<div class="form-input-group"> <div class="form-group-title">${text}</div>`;
|
||
|
div += '<div class="input-group">';
|
||
|
options.forEach((option, index) => {
|
||
|
div += `<label for="radio_${name}_${index}"> <input type="radio" id="radio_${name}_${index}" name="${name}" value="${option.value}"
|
||
|
${(item.default ? item.default == option.value : index == 0) ? "checked" : ""}> ${option.text}</label>`;
|
||
|
});
|
||
|
|
||
|
div += "</div>";
|
||
|
div += "</div>";
|
||
|
return div;
|
||
|
};
|
||
|
|
||
|
const renderCheckboxInput = (item) => {
|
||
|
const { options, name, text } = item;
|
||
|
|
||
|
let div = `<div class="form-input-group"> <div class="form-group-title">${text}</div>`;
|
||
|
div += '<div class="input-group-chk">';
|
||
|
|
||
|
options.forEach((option, index) => {
|
||
|
div += `<label for="chk_${name}_${index}">${option.text} <input type="checkbox" id="chk_${name}_${index}" name="${name}" value="${option.value}" ${option.checked ? "checked" : ""}></label>`;
|
||
|
formInputs[option.value] = option.checked ? "true" : "false";
|
||
|
});
|
||
|
|
||
|
div += "</div>";
|
||
|
div += "</div>";
|
||
|
return div;
|
||
|
};
|
||
|
|
||
|
const renderSelectInput = (item) => {
|
||
|
const { options, name, text } = item;
|
||
|
let div = `<div class="select-title">${text}</div>`;
|
||
|
|
||
|
div += `<select class="form-select" name="${name}" title="${text}">`;
|
||
|
formInputs[name] = options[0].value;
|
||
|
|
||
|
options.forEach((option, index) => {
|
||
|
const isDefaultValue = item.default == option.value;
|
||
|
div += `<option value="${option.value}" ${isDefaultValue ? "selected" : ""}>${option.text}</option>`;
|
||
|
if (isDefaultValue) {
|
||
|
formInputs[name] = option.value;
|
||
|
}
|
||
|
});
|
||
|
div += "</select>";
|
||
|
return div;
|
||
|
};
|
||
|
|
||
|
const renderColorInput = (item) => {
|
||
|
const { text, name } = item;
|
||
|
formInputs[name] = item.default ? item.default : "#ffffff";
|
||
|
const isRequired = item.isRequired == "true" || item.isRequired ? "required" : "";
|
||
|
const defaultValue = item.default ? `value="${item.default}"` : "";
|
||
|
return ` <input placeholder="${text}" type="color" class="form-control" name="${name}" ${defaultValue} ${isRequired}/>`;
|
||
|
};
|
||
|
|
||
|
const CloseMenu = () => {
|
||
|
$(`.main-wrapper`).fadeOut(0);
|
||
|
$("#qb-input-form").remove();
|
||
|
formInputs = {};
|
||
|
};
|
||
|
|
||
|
const SetStyle = (style) => {
|
||
|
var stylesheet = $("<link>", {
|
||
|
rel: "stylesheet",
|
||
|
type: "text/css",
|
||
|
href: `./styles/${style}.css`,
|
||
|
});
|
||
|
stylesheet.appendTo("head");
|
||
|
};
|
||
|
|
||
|
const CancelMenu = () => {
|
||
|
$.post(`https://${GetParentResourceName()}/closeMenu`);
|
||
|
return CloseMenu();
|
||
|
};
|
||
|
|
||
|
window.addEventListener("message", (event) => {
|
||
|
const data = event.data;
|
||
|
const info = data.data;
|
||
|
const action = data.action;
|
||
|
switch (action) {
|
||
|
case "SET_STYLE":
|
||
|
return SetStyle(info);
|
||
|
case "OPEN_MENU":
|
||
|
return OpenMenu(info);
|
||
|
case "CLOSE_MENU":
|
||
|
return CloseMenu();
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
document.onkeyup = function (event) {
|
||
|
const charCode = event.key;
|
||
|
if (charCode == "Escape") {
|
||
|
CancelMenu();
|
||
|
} else if (charCode == "Enter") {
|
||
|
SubmitData();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// IDK why this is a thing ? what if they misclick?
|
||
|
$(document).click(function (event) {
|
||
|
var $target = $(event.target);
|
||
|
if (!$target.closest(".main-wrapper").length && $(".main-wrapper").is(":visible")) {
|
||
|
CancelMenu();
|
||
|
}
|
||
|
});
|