2026-04-14 17:41:39 +02:00

225 lines
8.7 KiB
JavaScript

/*
███████ ██████ ██████ ███ ███ ███████
██ ██ ██ ██ ██ ████ ████ ██
█████ ██ ██ ██████ ██ ████ ██ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██████ ██ ██ ██ ██ ███████
*/
function isThereAnyErrorInForm(event) {
event.preventDefault();
event.stopPropagation();
if (!event.target.checkValidity()) {
const invalidInputs = $(event.target).find(':invalid');
if (invalidInputs.length > 0) {
const firstInvalidInput = invalidInputs.first();
firstInvalidInput.focus();
}
$(event.target).addClass('was-validated')
swal("ERROR", `There are ${invalidInputs.length} invalid fields somewhere!`, "error");
return true;
} else {
// The timeout is needed because otherwise the was-validated class is added afterwards by the theme .js
setTimeout(() => {
$(event.target).removeClass("was-validated");
}, 0);
return false;
}
}
/*
██████ ██████ ██ ██████ ██████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██ ██████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██████ ███████ ██████ ██ ██ ███████
*/
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
/*
████████ ██████ █████ ███ ██ ███████ ██ █████ ████████ ██ ██████ ███ ██ ███████
██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██
██ ██████ ███████ ██ ██ ██ ███████ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██ ████ ███████ ███████ ██ ██ ██ ██ ██████ ██ ████ ███████
*/
let TRANSLATIONS = {};
let ENGLISH_TRANSLATIONS = {};
function translateEverything() {
$("body").find("[data-translation-id], [data-bs-toggle='tooltip']").each(function() {
let translationId = $(this).data("translationId")
if( $(this).data("bsToggle") == "tooltip" ) {
if ($(this).tooltip) {
$(this).tooltip('dispose');
}
$(this).attr("data-bs-title", getLocalizedText(translationId));
$(this).tooltip();
} else {
$(this).prop("innerHTML", getLocalizedText(translationId));
}
})
}
async function refreshTranslations(locale) {
let rawEnglishTranslations = await $.get("menu_translations/en.json");
ENGLISH_TRANSLATIONS = typeof rawEnglishTranslations == "object" ? rawEnglishTranslations : JSON.parse(rawEnglishTranslations);
let rawTranslations = await $.get(`menu_translations/${locale}.json`);
TRANSLATIONS = typeof rawTranslations == "object" ? rawTranslations : JSON.parse(rawTranslations);
translateEverything();
}
async function loadTranslations() {
const locale = await $.post(`https://${resName}/getLocale`);
refreshTranslations(locale);
} loadTranslations();
function getLocalizedText(text) {
return TRANSLATIONS[text] || ENGLISH_TRANSLATIONS[text] || text;
}
/*
██████ ██████ ██████ ██████ ██████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██████ ██ ██ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██████ ██████ ██ ██ ██████ ███████
*/
async function getCurrentCoords() {
return new Promise((resolve, reject) => {
$.post(`https://${resName}/getCurrentCoords`, {}, function(coords) {
resolve(coords);
})
});
}
async function chooseCoords() {
$("html").hide();
return new Promise((resolve, reject) => {
$.post(`https://${resName}/chooseCoordinates`, {}, function(data) {
$("html").show();
resolve(data);
})
});
}
async function getCurrentCoordsAndHeading() {
return new Promise((resolve, reject) => {
$.post(`https://${resName}/getCurrentCoordsAndHeading`, {}, function(data) {
resolve(data);
})
});
}
/*
██████ ████████ ██ ██ ███████ ██████
██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ███████ █████ ██████
██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ██ ██ ███████ ██ ██
*/
async function getJobLabel(jobName) {
return new Promise((resolve, reject) => {
$.post(`https://${resName}/getJobLabel`, JSON.stringify({ jobName: jobName }), function (jobLabel) {
resolve(jobLabel);
})
})
}
function getFramework() {
return new Promise((resolve) => {
$.post(`https://${resName}/getFramework`, {}, (framework) => {
resolve(framework)
})
})
}
function firstCharToUpperCase(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
function setTomSelectValue(id, value) {
// If id starts with #, remove it
if(id[0] == "#") id = id.substring(1);
let select = document.getElementById(id);
let control = select.tomselect;
if(!control) return;
control.setValue(value);
}
/*
███ ██ ██████ ████████ ██ ███████ ██ ██████ █████ ████████ ██ ██████ ███ ██ ███████
████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██
██ ██ ██ ██ ██ ██ ██ █████ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ████ ██████ ██ ██ ██ ██ ██████ ██ ██ ██ ██ ██████ ██ ████ ███████
*/
const cssLink = document.createElement("link");
cssLink.href = "../utils/dialogs/misc/misc.css";
cssLink.rel = "stylesheet";
cssLink.type = "text/css";
document.head.appendChild(cssLink);
async function showServerResponse(response) {
if(response == null) return;
if(response === true) {
swal("SUCCESS", "", "success");
} else {
swal("ERROR", response || "", "error");
}
}
async function confirmDeletion(message) {
const wantsToDelete = await swal({
title: getLocalizedText("menu:are_you_sure"),
text: message,
icon: "warning",
buttons: true,
dangerMode: true,
});
return wantsToDelete;
}
function teleportToCoords(coords = {}, heading) {
if(!coords.x || !coords.y || !coords.z) return;
$.post(`https://${resName}/teleportToCoords`, JSON.stringify({coords, heading}));
}