bpb-website/admin.js
chris 91885d5ff5 Fix: Use relative URL for API requests in admin UI
Changed the  request URL in  from an absolute path
() to a relative path
().

This ensures that the API request is always sent to the same domain
that the admin page is loaded from, resolving CORS and NetworkError
issues when accessing the UI from a production FQDN or a live server
with a different port. This change relies on a correctly configured
reverse proxy in the production environment.
2025-11-12 15:07:05 -05:00

112 lines
4.3 KiB
JavaScript

document.addEventListener('DOMContentLoaded', () => {
const scrollingMessageInput = document.getElementById('scrolling-message');
const isClosedCheckbox = document.getElementById('is-closed-checkbox');
const closedMessageField = document.getElementById('closed-message-field');
const closedMessageTextarea = document.getElementById('closed-message');
const passwordInput = document.getElementById('password');
const saveButton = document.getElementById('save-button');
const spinner = document.getElementById('spinner');
const feedbackMessage = document.getElementById('feedback-message');
let initialData = {};
// --- UI Logic ---
isClosedCheckbox.addEventListener('change', () => {
closedMessageField.style.display = isClosedCheckbox.checked ? 'block' : 'none';
});
function checkForChanges() {
const currentData = {
message: scrollingMessageInput.value,
isClosed: isClosedCheckbox.checked,
closedMessage: closedMessageTextarea.value
};
const hasChanged = JSON.stringify(initialData) !== JSON.stringify(currentData);
saveButton.disabled = !hasChanged;
}
[scrollingMessageInput, isClosedCheckbox, closedMessageTextarea].forEach(el => {
el.addEventListener('input', checkForChanges);
el.addEventListener('change', checkForChanges);
});
// --- Data Handling ---
function loadInitialData() {
fetch('update.json')
.then(response => response.json())
.then(data => {
const update = data[0];
initialData = { ...update }; // Store initial state
scrollingMessageInput.value = update.message;
isClosedCheckbox.checked = update.isClosed;
closedMessageTextarea.value = update.closedMessage;
isClosedCheckbox.dispatchEvent(new Event('change'));
saveButton.disabled = true; // Start with button disabled
})
.catch(error => {
console.error('Error loading initial data:', error);
showFeedback('Error loading current status. Please check the console.', 'is-danger');
});
}
function showFeedback(message, type) {
feedbackMessage.textContent = message;
feedbackMessage.className = `notification ${type}`;
feedbackMessage.classList.remove('is-hidden');
setTimeout(() => {
feedbackMessage.classList.add('is-hidden');
}, 5000);
}
saveButton.addEventListener('click', () => {
const password = passwordInput.value;
if (!password) {
showFeedback('Please enter the password to save changes.', 'is-warning');
return;
}
// Show loading state
saveButton.disabled = true;
spinner.style.display = 'inline-block';
const newUpdateData = [
{
message: scrollingMessageInput.value,
isClosed: isClosedCheckbox.checked,
closedMessage: closedMessageTextarea.value
}
];
fetch('/api/update-status', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ password: password, data: newUpdateData }),
})
.then(response => response.json())
.then(result => {
if (result.success) {
showFeedback('Success! The store status has been updated.', 'is-success');
initialData = { ...newUpdateData[0] }; // Update initial state to current
passwordInput.value = ''; // Clear password field
} else {
showFeedback(`Error: ${result.message}`, 'is-danger');
}
})
.catch(error => {
console.error('Error sending update:', error);
showFeedback('An error occurred. Check the console and make sure the server is running.', 'is-danger');
})
.finally(() => {
// Hide loading state
spinner.style.display = 'none';
// Re-enable button only if there are still changes (e.g. if save failed)
checkForChanges();
});
});
// Load the data when the page loads
loadInitialData();
});