mirror of
https://github.com/ellite/Wallos.git
synced 2026-07-31 10:16:03 -04:00
feat: option for the week to start on sunday feat: redesign login / registration pages feat: more statistics feat: declarative oidc settings feat: grid view for subscriptions feat: subscription details popup feat: translate categories with ai feat: google image search with serpapi feat: selfh.st image search feat: dashboard icons image search fix: improve background removal feature for logos feat: v2.0 api - write endpoints fix: include todays subscriptions on amount due this month fix: calendar occurrences to respect subscription start date fix: honor configured outbound proxy for logo search without reopening httpoxy SSRF bypass fix: remove hardcode string from the admin page fix: ssrf via http proxy env var in payments logo search fix: require cron auth guard on storetotalyearlycost.php fix: validate per-user smtp host against ssrf fix: escape iCal property values to prevent crlf injection
192 lines
5.6 KiB
JavaScript
192 lines
5.6 KiB
JavaScript
function setCookie(name, value, days) {
|
|
var expires = "";
|
|
if (days) {
|
|
var date = new Date();
|
|
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
expires = "; expires=" + date.toUTCString();
|
|
}
|
|
document.cookie = name + "=" + value + expires + "; SameSite=Lax";
|
|
}
|
|
|
|
function storeFormFieldValue(fieldId) {
|
|
var fieldElement = document.getElementById(fieldId);
|
|
if (fieldElement) {
|
|
localStorage.setItem(fieldId, fieldElement.value);
|
|
}
|
|
}
|
|
|
|
function storeFormFields() {
|
|
storeFormFieldValue('username');
|
|
storeFormFieldValue('firstname');
|
|
storeFormFieldValue('lastname');
|
|
storeFormFieldValue('email');
|
|
storeFormFieldValue('password');
|
|
storeFormFieldValue('confirm_password');
|
|
storeFormFieldValue('currency');
|
|
}
|
|
|
|
function restoreFormFieldValue(fieldId) {
|
|
var fieldElement = document.getElementById(fieldId);
|
|
if (localStorage.getItem(fieldId)) {
|
|
fieldElement.value = localStorage.getItem(fieldId) || '';
|
|
}
|
|
}
|
|
|
|
function restoreFormFields() {
|
|
restoreFormFieldValue('username');
|
|
restoreFormFieldValue('firstname');
|
|
restoreFormFieldValue('lastname');
|
|
restoreFormFieldValue('email');
|
|
restoreFormFieldValue('password');
|
|
restoreFormFieldValue('confirm_password');
|
|
restoreFormFieldValue('currency');
|
|
}
|
|
|
|
function removeFromStorage() {
|
|
localStorage.removeItem('username');
|
|
localStorage.removeItem('firstname');
|
|
localStorage.removeItem('lastname');
|
|
localStorage.removeItem('email');
|
|
localStorage.removeItem('password');
|
|
localStorage.removeItem('confirm_password');
|
|
localStorage.removeItem('currency');
|
|
}
|
|
|
|
function changeLanguage(selectedLanguage) {
|
|
storeFormFields();
|
|
setCookie("language", selectedLanguage, 365);
|
|
location.reload();
|
|
}
|
|
|
|
|
|
function showErrorMessage(message) {
|
|
const toast = document.querySelector(".toast#errorToast");
|
|
(closeIcon = document.querySelector(".close-error")),
|
|
(errorMessage = document.querySelector(".errorMessage")),
|
|
(progress = document.querySelector(".progress.error"));
|
|
let timer1, timer2;
|
|
errorMessage.textContent = message;
|
|
toast.classList.add("active");
|
|
progress.classList.add("active");
|
|
timer1 = setTimeout(() => {
|
|
toast.classList.remove("active");
|
|
closeIcon.removeEventListener("click", () => { });
|
|
}, 5000);
|
|
|
|
timer2 = setTimeout(() => {
|
|
progress.classList.remove("active");
|
|
}, 5300);
|
|
|
|
closeIcon.addEventListener("click", () => {
|
|
toast.classList.remove("active");
|
|
|
|
setTimeout(() => {
|
|
progress.classList.remove("active");
|
|
}, 300);
|
|
|
|
clearTimeout(timer1);
|
|
clearTimeout(timer2);
|
|
closeIcon.removeEventListener("click", () => { });
|
|
});
|
|
}
|
|
|
|
function showSuccessMessage(message) {
|
|
const toast = document.querySelector(".toast#successToast");
|
|
(closeIcon = document.querySelector(".close-success")),
|
|
(successMessage = document.querySelector(".successMessage")),
|
|
(progress = document.querySelector(".progress.success"));
|
|
let timer1, timer2;
|
|
successMessage.textContent = message;
|
|
toast.classList.add("active");
|
|
progress.classList.add("active");
|
|
timer1 = setTimeout(() => {
|
|
toast.classList.remove("active");
|
|
closeIcon.removeEventListener("click", () => { });
|
|
}, 5000);
|
|
|
|
timer2 = setTimeout(() => {
|
|
progress.classList.remove("active");
|
|
}, 5300);
|
|
|
|
closeIcon.addEventListener("click", () => {
|
|
toast.classList.remove("active");
|
|
|
|
setTimeout(() => {
|
|
progress.classList.remove("active");
|
|
}, 300);
|
|
|
|
clearTimeout(timer1);
|
|
clearTimeout(timer2);
|
|
closeIcon.removeEventListener("click", () => { });
|
|
});
|
|
}
|
|
|
|
|
|
function openRestoreModal() {
|
|
document.getElementById('restoreModalBackdrop').classList.add('is-open');
|
|
}
|
|
|
|
function closeRestoreModal() {
|
|
document.getElementById('restoreModalBackdrop').classList.remove('is-open');
|
|
}
|
|
|
|
function openRestoreDBFileSelect() {
|
|
document.getElementById('restoreDBFile').click();
|
|
};
|
|
|
|
function onRestoreFileSelected() {
|
|
const input = document.getElementById('restoreDBFile');
|
|
const label = document.getElementById('restoreFileName');
|
|
label.textContent = input.files[0] ? input.files[0].name : '';
|
|
}
|
|
|
|
function restoreDB() {
|
|
const input = document.getElementById('restoreDBFile');
|
|
const file = input.files[0];
|
|
|
|
if (!file) {
|
|
showErrorMessage('No file selected');
|
|
return;
|
|
}
|
|
|
|
const formData = new FormData();
|
|
formData.append('file', file);
|
|
formData.append('setup_token', document.getElementById('setupToken').value.trim());
|
|
|
|
fetch('endpoints/db/import.php', {
|
|
method: 'POST',
|
|
body: formData
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.success) {
|
|
closeRestoreModal();
|
|
showSuccessMessage(data.message);
|
|
setTimeout(() => {
|
|
window.location.href = 'logout.php';
|
|
}, 1500);
|
|
} else {
|
|
showErrorMessage(data.message);
|
|
}
|
|
})
|
|
.catch(error => showErrorMessage('Error:', error));
|
|
}
|
|
|
|
function checkThemeNeedsUpdate() {
|
|
if (window.update_theme_settings) {
|
|
const prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
const themePreference = prefersDarkMode ? 'dark' : 'light';
|
|
const darkThemeCss = document.querySelector("#dark-theme");
|
|
darkThemeCss.disabled = themePreference === 'light';
|
|
document.body.className = themePreference;
|
|
const themeColorMetaTag = document.querySelector('meta[name="theme-color"]');
|
|
themeColorMetaTag.setAttribute('content', themePreference === 'dark' ? '#12151C' : '#FFFFFF');
|
|
}
|
|
}
|
|
|
|
window.onload = function () {
|
|
restoreFormFields();
|
|
removeFromStorage();
|
|
checkThemeNeedsUpdate();
|
|
};
|