update flasher
This commit is contained in:
@@ -136,6 +136,28 @@
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.output-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.output-toggle {
|
||||
background: #f0f0f0;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
padding: 8px 16px;
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
color: #333;
|
||||
transition: background 0.3s;
|
||||
}
|
||||
|
||||
.output-toggle:hover {
|
||||
background: #e0e0e0;
|
||||
}
|
||||
|
||||
.output-box {
|
||||
background: #1e1e1e;
|
||||
color: #d4d4d4;
|
||||
@@ -148,6 +170,11 @@
|
||||
line-height: 1.6;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.output-box.expanded {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.output-box:empty::before {
|
||||
@@ -173,6 +200,10 @@
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
width: 0%;
|
||||
transition: width 0.3s ease-out;
|
||||
}
|
||||
|
||||
.progress-bar-fill.indeterminate {
|
||||
animation: progress 2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@@ -182,6 +213,19 @@
|
||||
100% { width: 0%; }
|
||||
}
|
||||
|
||||
.progress-text {
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
color: #667eea;
|
||||
font-weight: 600;
|
||||
margin-top: 5px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.progress-text.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.status-message {
|
||||
padding: 12px;
|
||||
border-radius: 8px;
|
||||
@@ -270,14 +314,18 @@
|
||||
</button>
|
||||
|
||||
<div class="progress-bar" id="progressBar">
|
||||
<div class="progress-bar-fill"></div>
|
||||
<div class="progress-bar-fill" id="progressBarFill"></div>
|
||||
</div>
|
||||
<div class="progress-text" id="progressText">0%</div>
|
||||
|
||||
<div class="status-message" id="statusMessage"></div>
|
||||
</form>
|
||||
|
||||
<div class="output-section">
|
||||
<label>Output Log</label>
|
||||
<div class="output-header">
|
||||
<label>Output Log</label>
|
||||
<button type="button" class="output-toggle" id="outputToggle" onclick="toggleOutput()">▼ Show Details</button>
|
||||
</div>
|
||||
<div class="output-box" id="output"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -287,6 +335,20 @@
|
||||
let socket = null;
|
||||
let heartbeatInterval = null;
|
||||
|
||||
// Toggle output visibility
|
||||
function toggleOutput() {
|
||||
const output = document.getElementById('output');
|
||||
const toggle = document.getElementById('outputToggle');
|
||||
|
||||
if (output.classList.contains('expanded')) {
|
||||
output.classList.remove('expanded');
|
||||
toggle.textContent = '▼ Show Details';
|
||||
} else {
|
||||
output.classList.add('expanded');
|
||||
toggle.textContent = '▲ Hide Details';
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize Socket.IO connection
|
||||
function initWebSocket() {
|
||||
socket = io();
|
||||
@@ -368,14 +430,23 @@
|
||||
|
||||
const flashBtn = document.getElementById('flashBtn');
|
||||
const progressBar = document.getElementById('progressBar');
|
||||
const progressBarFill = document.getElementById('progressBarFill');
|
||||
const progressText = document.getElementById('progressText');
|
||||
const output = document.getElementById('output');
|
||||
const outputToggle = document.getElementById('outputToggle');
|
||||
const statusMessage = document.getElementById('statusMessage');
|
||||
|
||||
// Disable form
|
||||
flashBtn.disabled = true;
|
||||
flashBtn.textContent = '⚡ Flashing...';
|
||||
progressBar.classList.add('active');
|
||||
progressBarFill.classList.add('indeterminate');
|
||||
progressBarFill.style.width = '0%';
|
||||
progressText.classList.add('active');
|
||||
progressText.textContent = '0%';
|
||||
output.textContent = '';
|
||||
output.classList.remove('expanded');
|
||||
outputToggle.textContent = '▼ Show Details';
|
||||
statusMessage.style.display = 'none';
|
||||
statusMessage.className = 'status-message';
|
||||
|
||||
@@ -413,6 +484,16 @@
|
||||
output.textContent = data.output.join('\n');
|
||||
output.scrollTop = output.scrollHeight;
|
||||
|
||||
// Update progress bar
|
||||
const progressBarFill = document.getElementById('progressBarFill');
|
||||
const progressText = document.getElementById('progressText');
|
||||
if (data.progress !== undefined && data.progress > 0) {
|
||||
// Switch from indeterminate to determinate
|
||||
progressBarFill.classList.remove('indeterminate');
|
||||
progressBarFill.style.width = data.progress + '%';
|
||||
progressText.textContent = data.progress.toFixed(1) + '%';
|
||||
}
|
||||
|
||||
// Check if complete
|
||||
if (!data.running && statusCheckInterval) {
|
||||
clearInterval(statusCheckInterval);
|
||||
@@ -420,11 +501,15 @@
|
||||
|
||||
const statusMessage = document.getElementById('statusMessage');
|
||||
if (data.success === true) {
|
||||
statusMessage.textContent = '✓ Firmware flashed successfully!';
|
||||
progressBarFill.style.width = '100%';
|
||||
progressText.textContent = '100%';
|
||||
statusMessage.textContent = '✓ Flash completed successfully!';
|
||||
statusMessage.className = 'status-message success';
|
||||
statusMessage.style.display = 'block';
|
||||
} else if (data.success === false) {
|
||||
statusMessage.textContent = '✗ Flash operation failed. Check the output log for details.';
|
||||
statusMessage.className = 'status-message error';
|
||||
statusMessage.style.display = 'block';
|
||||
}
|
||||
|
||||
resetForm();
|
||||
@@ -441,15 +526,25 @@
|
||||
const statusMessage = document.getElementById('statusMessage');
|
||||
statusMessage.textContent = '✗ ' + message;
|
||||
statusMessage.className = 'status-message error';
|
||||
statusMessage.style.display = 'block';
|
||||
}
|
||||
|
||||
function resetForm() {
|
||||
const flashBtn = document.getElementById('flashBtn');
|
||||
const progressBar = document.getElementById('progressBar');
|
||||
const progressBarFill = document.getElementById('progressBarFill');
|
||||
const progressText = document.getElementById('progressText');
|
||||
|
||||
flashBtn.disabled = false;
|
||||
flashBtn.textContent = '⚡ Flash Firmware';
|
||||
progressBar.classList.remove('active');
|
||||
|
||||
// Delay hiding progress to let user see completion
|
||||
setTimeout(() => {
|
||||
progressBar.classList.remove('active');
|
||||
progressText.classList.remove('active');
|
||||
progressBarFill.classList.remove('indeterminate');
|
||||
progressBarFill.style.width = '0%';
|
||||
}, 2000);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user