96 lines
2.7 KiB
JavaScript
96 lines
2.7 KiB
JavaScript
const getStoredTheme = () => localStorage.getItem("theme");
|
|
const setStoredTheme = theme => localStorage.setItem("theme", theme);
|
|
const getPreferredTheme = () => window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
|
|
$('input[name="themeToggle"]').on("change", function() {
|
|
const selectedTheme = $(this).val();
|
|
setStoredTheme(selectedTheme);
|
|
setThemeIcon(selectedTheme)
|
|
applyTheme(selectedTheme);
|
|
});
|
|
|
|
function setThemeIcon(theme) {
|
|
const iconOptions = {
|
|
light: "bi-sun",
|
|
dark: "bi-moon-stars",
|
|
auto: "bi-circle-half"
|
|
}
|
|
|
|
$(".js-themeMenuBtn > i").removeClass(Object.values(iconOptions).join(" "));
|
|
$(".js-themeMenuBtn > i").addClass(iconOptions[theme]);
|
|
}
|
|
|
|
function applyTheme(theme) {
|
|
$('input[name="themeToggle"]').siblings("label").removeClass("active");
|
|
$(`input[name="themeToggle"][value="${theme}"]`).siblings("label").addClass("active");
|
|
|
|
if (!theme || theme === "auto") {
|
|
theme = getPreferredTheme();
|
|
}
|
|
|
|
$("body").attr("data-bs-theme", theme);
|
|
}
|
|
|
|
function getCurrentDateTime() {
|
|
var now = new Date();
|
|
var year = now.getFullYear();
|
|
var month = String(now.getMonth() + 1).padStart(2, '0');
|
|
var day = String(now.getDate()).padStart(2, '0');
|
|
var hours = String(now.getHours()).padStart(2, '0');
|
|
var minutes = String(now.getMinutes()).padStart(2, '0');
|
|
return `${year}-${month}-${day}T${hours}:${minutes}`;
|
|
}
|
|
|
|
// Sanitise a given string to remove HTML, making it DOM safe.
|
|
function sanitise(string) {
|
|
if (typeof string !== "string") {
|
|
return string;
|
|
}
|
|
|
|
const map = {
|
|
'&': '&',
|
|
'<': '<',
|
|
'>': '>',
|
|
'"': '"',
|
|
"'": ''',
|
|
"/": '/',
|
|
};
|
|
const reg = /[&<>"'/]/ig;
|
|
return string.replace(reg, (match) => map[match]);
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
// Activate all tooltips
|
|
$('[data-bs-toggle="tooltip"]').tooltip();
|
|
|
|
// Activate select2s
|
|
$(".select-2").each(function() {
|
|
$(this).select2({
|
|
theme: "bootstrap",
|
|
minimumResultsForSearch: 10
|
|
});
|
|
});
|
|
|
|
$.notify.addStyle("bootstrap", {
|
|
html:
|
|
'<div class="toast mt-3 overflow-hidden" role="alert">' +
|
|
'<div class="toast-body">' +
|
|
'<span data-notify-text></span>' +
|
|
'</div>' +
|
|
"</div>"
|
|
});
|
|
|
|
$.notify.defaults({
|
|
globalPosition: "bottom right",
|
|
animationType: "fade",
|
|
className: "success"
|
|
});
|
|
|
|
// Activate datepickers
|
|
// $(".input-group.date").datepicker({format: "yyyy-mm-dd"});
|
|
|
|
// Load theme
|
|
const theme = getStoredTheme();
|
|
setThemeIcon(theme);
|
|
applyTheme(theme);
|
|
}); |