viberadar 0.3.39 → 0.3.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/dashboard.html +62 -43
- package/package.json +1 -1
package/dist/ui/dashboard.html
CHANGED
|
@@ -234,7 +234,8 @@
|
|
|
234
234
|
.type-count { margin-left: auto; font-size: 11px; color: var(--dim); }
|
|
235
235
|
|
|
236
236
|
/* ── Content area ────────────────────────────────────────────────────────── */
|
|
237
|
-
.content { flex: 1; overflow-y: auto; padding: 18px 20px; }
|
|
237
|
+
.content { flex: 1; overflow-y: auto; padding: 18px 20px; transition: padding-bottom 0.25s ease; }
|
|
238
|
+
.content.panel-open { padding-bottom: 300px; }
|
|
238
239
|
|
|
239
240
|
/* ── Feature cards ───────────────────────────────────────────────────────── */
|
|
240
241
|
.features-grid {
|
|
@@ -481,59 +482,56 @@
|
|
|
481
482
|
|
|
482
483
|
/* ── Test-type cards inside feature detail ───────────────────────────────── */
|
|
483
484
|
.test-type-grid {
|
|
484
|
-
display:
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
485
|
+
display: flex;
|
|
486
|
+
gap: 8px;
|
|
487
|
+
margin-bottom: 14px;
|
|
488
|
+
flex-wrap: wrap;
|
|
489
|
+
align-items: center;
|
|
488
490
|
}
|
|
489
491
|
.test-type-card {
|
|
492
|
+
display: flex;
|
|
493
|
+
align-items: center;
|
|
494
|
+
gap: 8px;
|
|
490
495
|
background: var(--bg-card);
|
|
491
496
|
border: 1px solid var(--border);
|
|
497
|
+
border-left: 3px solid transparent;
|
|
492
498
|
border-radius: 8px;
|
|
493
|
-
padding:
|
|
499
|
+
padding: 7px 12px;
|
|
494
500
|
cursor: pointer;
|
|
495
501
|
transition: background 0.15s, border-color 0.15s;
|
|
496
|
-
|
|
497
|
-
overflow: hidden;
|
|
498
|
-
}
|
|
499
|
-
.test-type-card:hover { background: var(--bg-hover); border-color: var(--dim); }
|
|
500
|
-
.test-type-card .tt-accent {
|
|
501
|
-
position: absolute; top: 0; left: 0; right: 0; height: 3px;
|
|
502
|
+
flex-shrink: 0;
|
|
502
503
|
}
|
|
504
|
+
.test-type-card:hover { background: var(--bg-hover); }
|
|
505
|
+
.test-type-card .tt-accent { display: none; } /* replaced by border-left */
|
|
503
506
|
.test-type-card .tt-label {
|
|
504
507
|
font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px;
|
|
505
|
-
color: var(--muted);
|
|
508
|
+
color: var(--muted); white-space: nowrap;
|
|
506
509
|
}
|
|
507
510
|
.test-type-card .tt-count {
|
|
508
|
-
font-size:
|
|
509
|
-
margin-bottom: 4px;
|
|
511
|
+
font-size: 18px; font-weight: 700; line-height: 1;
|
|
510
512
|
}
|
|
511
513
|
.test-type-card .tt-sub {
|
|
512
|
-
font-size: 11px; color: var(--dim);
|
|
513
|
-
}
|
|
514
|
-
.test-type-card.tt-empty .tt-count { color: var(--dim); }
|
|
515
|
-
.test-type-card.tt-empty { opacity: 0.7; }
|
|
516
|
-
.test-type-card.tt-active {
|
|
517
|
-
background: var(--bg-hover);
|
|
518
|
-
border-width: 2px;
|
|
514
|
+
font-size: 11px; color: var(--dim); white-space: nowrap;
|
|
519
515
|
}
|
|
516
|
+
.test-type-card.tt-empty { opacity: 0.65; }
|
|
517
|
+
.test-type-card.tt-active { background: var(--bg-hover); }
|
|
520
518
|
.test-type-card.tt-failed {
|
|
521
519
|
border-color: var(--red) !important;
|
|
522
|
-
border-width: 2px;
|
|
523
520
|
background: rgba(248, 81, 73, 0.06);
|
|
524
521
|
}
|
|
522
|
+
.tt-chip-actions { display: flex; gap: 4px; margin-left: 4px; }
|
|
525
523
|
.tt-run-btn {
|
|
526
|
-
display: block;
|
|
527
|
-
padding: 3px
|
|
524
|
+
display: inline-block; margin: 0;
|
|
525
|
+
padding: 3px 9px;
|
|
528
526
|
background: transparent; border: 1px solid var(--border);
|
|
529
527
|
border-radius: 4px; color: var(--muted); font-size: 10px;
|
|
530
|
-
cursor: pointer;
|
|
528
|
+
cursor: pointer; white-space: nowrap;
|
|
531
529
|
transition: background 0.1s, color 0.1s, border-color 0.1s;
|
|
532
530
|
}
|
|
533
531
|
.tt-run-btn:hover { background: var(--bg-hover); color: var(--text); border-color: var(--dim); }
|
|
534
532
|
.tt-run-btn:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
535
|
-
.tt-fix-btn { border-color: var(--
|
|
536
|
-
.tt-fix-btn:hover { background: rgba(
|
|
533
|
+
.tt-fix-btn { border-color: var(--yellow); color: var(--yellow); font-weight: 600; }
|
|
534
|
+
.tt-fix-btn:hover { background: rgba(255,200,0,0.1); color: var(--yellow); border-color: var(--yellow); }
|
|
537
535
|
.file-rows { display: flex; flex-direction: column; gap: 2px; }
|
|
538
536
|
.file-row {
|
|
539
537
|
display: flex;
|
|
@@ -1510,27 +1508,29 @@ function renderFeatureCards(c) {
|
|
|
1510
1508
|
function testTypeCard(type, label, icon, color, count, active, featureKey, failedCount = 0) {
|
|
1511
1509
|
const empty = count === 0 && type !== 'source';
|
|
1512
1510
|
const hasFailed = failedCount > 0 && type !== 'source';
|
|
1513
|
-
const subLabel =
|
|
1511
|
+
const subLabel = type === 'source' ? 'файлов' : (empty ? 'нет тестов' : pluralFiles(count));
|
|
1512
|
+
const accentColor = hasFailed ? 'var(--red)' : color;
|
|
1513
|
+
const countColor = hasFailed ? 'var(--red)' : (active || !empty ? color : 'var(--dim)');
|
|
1514
|
+
|
|
1514
1515
|
const runBtn = !empty && type !== 'source' && featureKey
|
|
1515
1516
|
? `<button class="tt-run-btn" onclick="event.stopPropagation();runTests('${featureKey}','${type}')">▶ запустить</button>`
|
|
1516
1517
|
: '';
|
|
1517
1518
|
const fixAllBtn = hasFailed && D.agent && featureKey
|
|
1518
|
-
? `<button class="tt-run-btn tt-fix-btn" onclick="event.stopPropagation();runAgentTask('fix-tests-all','${featureKey}','${type}')">🔧
|
|
1519
|
+
? `<button class="tt-run-btn tt-fix-btn" onclick="event.stopPropagation();runAgentTask('fix-tests-all','${featureKey}','${type}')">🔧 починить</button>`
|
|
1519
1520
|
: '';
|
|
1520
|
-
const
|
|
1521
|
-
|
|
1522
|
-
const failedNote = hasFailed
|
|
1523
|
-
? `<div style="font-size:11px;color:var(--red);margin-top:2px;font-weight:600">❌ ${failedCount} упало</div>`
|
|
1521
|
+
const failedBadge = hasFailed
|
|
1522
|
+
? `<span style="font-size:10px;color:var(--red);font-weight:700;white-space:nowrap">❌ ${failedCount}</span>`
|
|
1524
1523
|
: '';
|
|
1524
|
+
const actions = (runBtn || fixAllBtn) ? `<div class="tt-chip-actions">${runBtn}${fixAllBtn}</div>` : '';
|
|
1525
|
+
|
|
1525
1526
|
return `
|
|
1526
1527
|
<div class="test-type-card${empty ? ' tt-empty' : ''}${active ? ' tt-active' : ''}${hasFailed ? ' tt-failed' : ''}"
|
|
1527
|
-
data-testtype="${type}" style="${active ? 'border-color:' + color : ''}">
|
|
1528
|
-
<
|
|
1529
|
-
<
|
|
1530
|
-
<
|
|
1531
|
-
|
|
1532
|
-
${
|
|
1533
|
-
${fixAllBtn || runBtn}
|
|
1528
|
+
data-testtype="${type}" style="border-left-color:${accentColor}${active ? ';border-color:' + color : ''}">
|
|
1529
|
+
<span class="tt-label">${icon} ${label}</span>
|
|
1530
|
+
<span class="tt-count" style="color:${countColor}">${count}</span>
|
|
1531
|
+
<span class="tt-sub">${subLabel}</span>
|
|
1532
|
+
${failedBadge}
|
|
1533
|
+
${actions}
|
|
1534
1534
|
</div>`;
|
|
1535
1535
|
}
|
|
1536
1536
|
|
|
@@ -2186,6 +2186,11 @@ function connectSSE() {
|
|
|
2186
2186
|
setAgentRunning(true);
|
|
2187
2187
|
const { title, queueLength = 0 } = JSON.parse(e.data);
|
|
2188
2188
|
updateQueueBadge(queueLength);
|
|
2189
|
+
// Close previous session (queue case: agent-done not fired between tasks)
|
|
2190
|
+
if (runningSessionId) {
|
|
2191
|
+
const prev = consoleSessions.find(s => s.id === runningSessionId);
|
|
2192
|
+
if (prev && prev.status === 'running') updateSessionStatus(runningSessionId, 'ok');
|
|
2193
|
+
}
|
|
2189
2194
|
const id = createSession(title);
|
|
2190
2195
|
runningSessionId = id;
|
|
2191
2196
|
document.getElementById('agentPanelTitle').textContent = '🤖 ' + title;
|
|
@@ -2236,7 +2241,13 @@ function connectSSE() {
|
|
|
2236
2241
|
${files.map(f => `<div style="font-size:11px;color:var(--dim);margin-top:3px">📄 ${f}</div>`).join('')}
|
|
2237
2242
|
`;
|
|
2238
2243
|
const targetId = runningSessionId || activeSessionId;
|
|
2239
|
-
if (targetId)
|
|
2244
|
+
if (targetId) {
|
|
2245
|
+
appendToSession(targetId, box);
|
|
2246
|
+
// Mark session status from test results immediately
|
|
2247
|
+
if (runningSessionId === targetId) {
|
|
2248
|
+
updateSessionStatus(targetId, failed > 0 ? 'error' : 'ok');
|
|
2249
|
+
}
|
|
2250
|
+
}
|
|
2240
2251
|
});
|
|
2241
2252
|
|
|
2242
2253
|
es.addEventListener('agent-error', (e) => {
|
|
@@ -2309,7 +2320,15 @@ function connectSSE() {
|
|
|
2309
2320
|
};
|
|
2310
2321
|
}
|
|
2311
2322
|
|
|
2312
|
-
init().then(() => {
|
|
2323
|
+
init().then(() => {
|
|
2324
|
+
restoreSessions();
|
|
2325
|
+
connectSSE();
|
|
2326
|
+
// Sync content padding with terminal panel open state automatically
|
|
2327
|
+
new MutationObserver(() => {
|
|
2328
|
+
const isOpen = document.getElementById('agentPanel').classList.contains('open');
|
|
2329
|
+
document.getElementById('content').classList.toggle('panel-open', isOpen);
|
|
2330
|
+
}).observe(document.getElementById('agentPanel'), { attributes: true, attributeFilter: ['class'] });
|
|
2331
|
+
});
|
|
2313
2332
|
</script>
|
|
2314
2333
|
</body>
|
|
2315
2334
|
</html>
|