Skip to content

Commit b375753

Browse files
authored
Merge pull request #17 from web3dev1337/feature/master-pr13-stabilize-release
fix: stabilize post-PR13 UI and prep v0.9.5 release
2 parents 3ad4c2f + 554a7cc commit b375753

File tree

7 files changed

+64
-14
lines changed

7 files changed

+64
-14
lines changed

index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
<button class="nav-tab nav-dropdown-toggle" data-tooltip="More options">
8484
<span class="material-icons">more_horiz</span>
8585
<span class="nav-label">More</span>
86+
<span class="badge hidden" id="more-badge">0</span>
8687
<span class="material-icons nav-dropdown-arrow">expand_more</span>
8788
</button>
8889
<div class="nav-dropdown-menu">

js/app.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const elements = {
5050
townName: document.getElementById('town-name'),
5151
connectionStatus: document.getElementById('connection-status'),
5252
mailBadge: document.getElementById('mail-badge'),
53+
moreBadge: document.getElementById('more-badge'),
5354
hookStatus: document.getElementById('hook-status'),
5455
statusMessage: document.getElementById('status-message'),
5556
agentTree: document.getElementById('agent-tree'),
@@ -257,8 +258,15 @@ function switchView(viewId) {
257258
tab.classList.toggle('active', tab.dataset.view === viewId);
258259
});
259260

261+
let hasActiveDropdownView = false;
260262
document.querySelectorAll('.nav-dropdown-item').forEach(item => {
261-
item.classList.toggle('active', item.dataset.view === viewId);
263+
const isActive = item.dataset.view === viewId;
264+
item.classList.toggle('active', isActive);
265+
if (isActive) hasActiveDropdownView = true;
266+
});
267+
268+
document.querySelectorAll('.nav-dropdown-toggle').forEach(toggle => {
269+
toggle.classList.toggle('active', hasActiveDropdownView);
262270
});
263271

264272
views.forEach(view => {
@@ -762,8 +770,14 @@ function subscribeToState() {
762770

763771
// Update badge
764772
const unread = mail.filter(m => !m.read).length;
765-
elements.mailBadge.textContent = unread;
766-
elements.mailBadge.classList.toggle('hidden', unread === 0);
773+
if (elements.mailBadge) {
774+
elements.mailBadge.textContent = unread;
775+
elements.mailBadge.classList.toggle('hidden', unread === 0);
776+
}
777+
if (elements.moreBadge) {
778+
elements.moreBadge.textContent = unread;
779+
elements.moreBadge.classList.toggle('hidden', unread === 0);
780+
}
767781
});
768782
}
769783

js/components/dashboard.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ function renderGettingStarted() {
288288
</div>
289289
</div>
290290
`;
291+
}
291292

292293
/**
293294
* Calculate dashboard metrics

js/components/modals.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,13 @@ export function initModals() {
9999
btn.addEventListener('click', closeAllModals);
100100
});
101101

102-
// Open buttons
103-
document.querySelectorAll('[data-modal-open]').forEach(btn => {
104-
btn.addEventListener('click', () => {
105-
const modalId = btn.dataset.modalOpen;
106-
openModal(modalId);
107-
});
102+
// Open buttons (delegated so dynamically rendered content works too)
103+
document.addEventListener('click', (e) => {
104+
const btn = e.target.closest('[data-modal-open]');
105+
if (!btn) return;
106+
const modalId = btn.dataset.modalOpen;
107+
if (!modalId) return;
108+
openModal(modalId);
108109
});
109110

110111
// Form submissions

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "gastown-gui",
3-
"version": "0.9.4",
3+
"version": "0.9.5",
44
"description": "Web GUI for Gas Town multi-agent orchestrator - A companion interface for steveyegge/gastown",
55
"type": "module",
66
"main": "server.js",

test/setup.js

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,41 @@ export async function waitForConnection(page) {
113113
* Click a navigation tab and wait for view to switch
114114
*/
115115
export async function switchView(page, viewName) {
116-
await page.waitForSelector(`[data-view="${viewName}"]`, { timeout: 5000 });
117-
await page.click(`[data-view="${viewName}"]`);
116+
const selector = `[data-view="${viewName}"]`;
117+
await page.waitForSelector(selector, { timeout: 5000 });
118+
119+
const clickVisibleTarget = async () => {
120+
return page.evaluate((target) => {
121+
const nodes = Array.from(document.querySelectorAll(`[data-view="${target}"]`));
122+
const visible = nodes.find((el) => {
123+
const rect = el.getBoundingClientRect();
124+
const style = window.getComputedStyle(el);
125+
return rect.width > 0 && rect.height > 0 && style.visibility !== 'hidden' && style.display !== 'none';
126+
});
127+
if (!visible) return false;
128+
visible.click();
129+
return true;
130+
}, viewName);
131+
};
132+
133+
let clicked = await clickVisibleTarget();
134+
if (!clicked) {
135+
await page.waitForSelector('.nav-dropdown-toggle', { timeout: 5000 });
136+
await page.click('.nav-dropdown-toggle');
137+
const dropdownItemSelector = `.nav-dropdown.open .nav-dropdown-item[data-view="${viewName}"]`;
138+
await page.waitForSelector(dropdownItemSelector, { timeout: 5000 });
139+
await page.evaluate((target) => {
140+
const item = document.querySelector(`.nav-dropdown-item[data-view="${target}"]`);
141+
if (!item) return;
142+
item.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
143+
}, viewName);
144+
clicked = true;
145+
}
146+
147+
if (!clicked) {
148+
throw new Error(`Unable to click a visible nav item for view: ${viewName}`);
149+
}
150+
118151
await page.waitForSelector(`#view-${viewName}.active`, { timeout: 5000 });
119152
}
120153

0 commit comments

Comments
 (0)