Merge remote changes: update process_products return type signature

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-01 22:28:20 -04:00
13 changed files with 814 additions and 493 deletions
+29
View File
@@ -784,6 +784,9 @@ async function loadControlPanel() {
// Render scrapers grid
renderScrapersGrid(state.scrapers);
// Load Chrome Extension status
loadExtensionStatus();
// Setup event listeners for control panel buttons
setupControlPanelListeners();
@@ -796,10 +799,36 @@ async function loadControlPanel() {
updateMonitorStatus(newState);
renderScrapersGrid(newState.scrapers);
}
loadExtensionStatus();
}
}, 5000);
}
async function loadExtensionStatus() {
const badge = document.getElementById('extensionBadge');
const productCount = document.getElementById('extProductCount');
const skuCount = document.getElementById('extSkuCount');
const lastSync = document.getElementById('extLastSync');
const stats = await api('/extension/stats');
if (stats && stats.last_sync) {
// Extension has synced data
badge.textContent = 'Connected';
badge.className = 'extension-badge connected';
productCount.textContent = stats.total_products || 0;
skuCount.textContent = stats.total_skus || 0;
lastSync.textContent = formatTime(new Date(stats.last_sync));
} else {
// No sync yet
badge.textContent = 'No Data';
badge.className = 'extension-badge disconnected';
productCount.textContent = '-';
skuCount.textContent = '-';
lastSync.textContent = 'Never';
}
}
function updateMonitorStatus(state) {
const badge = document.getElementById('monitorBadge');
const statusText = document.getElementById('monitorStatusText');
+51
View File
@@ -1103,6 +1103,57 @@ h3 {
grid-column: span 2;
}
/* Chrome Extension Card */
.extension-card {
grid-column: span 2;
border-color: #ffcb05;
}
.extension-badge {
padding: 4px 12px;
border-radius: 12px;
font-size: 12px;
font-weight: 600;
}
.extension-badge.connected {
background: rgba(0, 255, 0, 0.2);
color: #00ff00;
}
.extension-badge.disconnected {
background: rgba(255, 100, 100, 0.2);
color: #ff6464;
}
.extension-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
margin-top: 10px;
}
.extension-stat {
background: var(--bg-primary);
padding: 12px;
border-radius: 8px;
text-align: center;
}
.extension-stat .stat-label {
display: block;
font-size: 12px;
color: var(--text-secondary);
margin-bottom: 5px;
}
.extension-stat .stat-value {
display: block;
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
}
.scrapers-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+31
View File
@@ -274,6 +274,37 @@
</div>
</div>
<!-- Chrome Extension Status (Pokemon Center) -->
<div class="control-card extension-card">
<div class="control-card-header">
<h3>Pokemon Center (Chrome Extension)</h3>
<span class="extension-badge" id="extensionBadge">Unknown</span>
</div>
<div class="control-card-body">
<p class="help-text">Pokemon Center is monitored via the Chrome Extension, not a Python scraper.</p>
<div id="extensionStatus">
<div class="extension-stats">
<div class="extension-stat">
<span class="stat-label">Products Tracked:</span>
<span class="stat-value" id="extProductCount">-</span>
</div>
<div class="extension-stat">
<span class="stat-label">SKUs Detected:</span>
<span class="stat-value" id="extSkuCount">-</span>
</div>
<div class="extension-stat">
<span class="stat-label">Last Sync:</span>
<span class="stat-value" id="extLastSync">Never</span>
</div>
</div>
</div>
<p class="help-text" style="margin-top: 10px;">
<a href="chrome-extension://YOUR_EXTENSION_ID/popup.html" target="_blank">Open Extension</a> |
Install from <code>chrome-extension/</code> folder
</p>
</div>
</div>
<!-- Scraper Controls -->
<div class="control-card scrapers-card">
<div class="control-card-header">