Add extreme measures to ensure update button visibility

- Implemented an aggressive 1-second interval to force-check & show update button
- Added bold red styling with \!important flags to make button impossible to miss
- Implemented MutationObserver to detect & counteract any hiding attempts
- Added detailed console logging for debugging visibility issues
- Applied inline styles with \!important flags to override any CSS cascades
- Increased z-index to 9999 to ensure button appears above all other elements
- Set multiple CSS properties (display, visibility, opacity) to ensure visibility

🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
MasterDraco 2025-03-10 17:51:01 +00:00
parent 5261f7b4f4
commit dc4131f04c

View File

@ -65,15 +65,37 @@ function initSystemStatus() {
// Set status text // Set status text
updateStatusElement.innerHTML = '<i class="fas fa-exclamation-circle text-warning"></i> Update available'; updateStatusElement.innerHTML = '<i class="fas fa-exclamation-circle text-warning"></i> Update available';
// Show alert box // Show alert box with extreme prejudice
const alertBox = updateAvailableDiv.querySelector('.alert'); const alertBox = updateAvailableDiv.querySelector('.alert');
if (alertBox) { if (alertBox) {
alertBox.style.display = 'block'; // Add important inline styles to override any CSS
// Update message alertBox.setAttribute('style',
'display: block !important; ' +
'visibility: visible !important; ' +
'opacity: 1 !important; ' +
'margin-top: 10px !important; ' +
'border: 3px solid red !important; ' +
'background-color: #ffeeee !important; ' +
'color: #990000 !important; ' +
'font-weight: bold !important; ' +
'box-shadow: 0 4px 8px rgba(0,0,0,0.3) !important; ' +
'position: relative !important; ' +
'z-index: 9999 !important;'
);
// Update message with important style
const spanElement = alertBox.querySelector('span'); const spanElement = alertBox.querySelector('span');
if (spanElement) { if (spanElement) {
spanElement.textContent = `A new version is available: ${currentVersion}${remoteVersion}`; spanElement.textContent = `A new version is available: ${currentVersion}${remoteVersion}`;
spanElement.setAttribute('style', 'color: #990000 !important; font-weight: bold !important;');
} }
// Also ensure the parent div is visible
updateAvailableDiv.style.display = 'block';
updateAvailableDiv.style.visibility = 'visible';
// Log that we've shown the update button
console.log('Update alert shown:', currentVersion, '->', remoteVersion);
} }
// Store in localStorage // Store in localStorage
@ -95,7 +117,7 @@ function initSystemStatus() {
localStorage.removeItem(REMOTE_VERSION_KEY); localStorage.removeItem(REMOTE_VERSION_KEY);
} }
// Check localStorage on init // Check localStorage on init and set up MutationObserver to prevent hiding
(function checkStoredUpdateStatus() { (function checkStoredUpdateStatus() {
const isUpdateAvailable = localStorage.getItem(UPDATE_KEY) === 'true'; const isUpdateAvailable = localStorage.getItem(UPDATE_KEY) === 'true';
if (isUpdateAvailable) { if (isUpdateAvailable) {
@ -103,6 +125,38 @@ function initSystemStatus() {
const remoteVersion = localStorage.getItem(REMOTE_VERSION_KEY); const remoteVersion = localStorage.getItem(REMOTE_VERSION_KEY);
if (currentVersion && remoteVersion) { if (currentVersion && remoteVersion) {
showUpdateAlert(currentVersion, remoteVersion); showUpdateAlert(currentVersion, remoteVersion);
// Set up mutation observer to detect and revert any attempts to hide the update alert
const alertBox = updateAvailableDiv.querySelector('.alert');
if (alertBox) {
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === 'attributes' &&
(mutation.attributeName === 'style' ||
mutation.attributeName === 'class')) {
// If display is being changed to hide the element, force it back to visible
if (alertBox.style.display !== 'block' ||
alertBox.classList.contains('d-none') ||
alertBox.style.visibility === 'hidden' ||
alertBox.style.opacity === '0') {
console.log('Detected attempt to hide update button, forcing display');
showUpdateAlert(currentVersion, remoteVersion);
}
}
});
});
// Observe style and class attribute changes
observer.observe(alertBox, {
attributes: true,
attributeFilter: ['style', 'class']
});
// Store observer in window object to prevent garbage collection
window._updateButtonObserver = observer;
}
} }
} }
})(); })();
@ -342,10 +396,47 @@ function initSystemStatus() {
}); });
} }
// Persistent update button - force display every second if update is available
function forceShowUpdateButton() {
const isUpdateAvailable = localStorage.getItem(UPDATE_KEY) === 'true';
if (isUpdateAvailable) {
const alertBox = updateAvailableDiv.querySelector('.alert');
if (alertBox && alertBox.style.display !== 'block') {
console.log('Forcing update button display');
alertBox.style.display = 'block';
alertBox.style.visibility = 'visible';
alertBox.style.opacity = '1';
// Add important inline styles to override any CSS
alertBox.setAttribute('style',
'display: block !important; ' +
'visibility: visible !important; ' +
'opacity: 1 !important; ' +
'margin-top: 10px !important; ' +
'border: 3px solid red !important; ' +
'background-color: #ffeeee !important; ' +
'color: #990000 !important; ' +
'font-weight: bold !important; ' +
'box-shadow: 0 4px 8px rgba(0,0,0,0.3) !important; ' +
'position: relative !important; ' +
'z-index: 9999 !important;'
);
// Also ensure the parent div is visible
updateAvailableDiv.style.display = 'block';
updateAvailableDiv.style.visibility = 'visible';
}
}
}
// Initialize // Initialize
loadSystemStatus(); loadSystemStatus();
checkForUpdates(); checkForUpdates();
// Force check the update button status every second
setInterval(forceShowUpdateButton, 1000);
// Set interval to refresh uptime every minute // Set interval to refresh uptime every minute
setInterval(loadSystemStatus, 60000); setInterval(loadSystemStatus, 60000);
} }