diff --git a/data/dealspace.db-shm b/data/dealspace.db-shm index f0702fc..4a0d389 100644 Binary files a/data/dealspace.db-shm and b/data/dealspace.db-shm differ diff --git a/portal/static/app.css b/portal/static/app.css index 0117045..e8df83b 100644 --- a/portal/static/app.css +++ b/portal/static/app.css @@ -215,6 +215,19 @@ input:focus, textarea:focus, select:focus { border-color: var(--ds-ac) !importan /* ===== TREE TABLE ===== */ #reqTree { border-collapse: collapse; width: 100%; font-size: 13px; } + +/* ===== TYPE HIERARCHY ===== */ +/* Level 1 — Logo / Page title : 2xl (19.5px) — set inline */ +/* Level 2 — Project name in header : xl (16.25px) — set inline */ +/* Level 3 — Section / group labels : 13px bold — set inline in renderTree */ +/* Level 4 — Body / table rows : 13px — base */ +/* Level 5 — Metadata / counts / dates : 11px — set inline */ +/* Tabs, sidebar links : text-base (13px) */ +/* Badges, labels, pill text : 11px */ +.tab { font-size: 13px; } +.sidebar-link { font-size: 13px; } +#reqTree th { font-size: 11px; font-weight: 600; letter-spacing: .05em; text-transform: uppercase; } +#reqTree td { font-size: 13px; } #reqTree th { text-align: left; padding: 6px 10px; diff --git a/portal/templates/app/project.html b/portal/templates/app/project.html index 0f4b405..5755dbb 100644 --- a/portal/templates/app/project.html +++ b/portal/templates/app/project.html @@ -2,9 +2,10 @@
Dealspace / - Projects - / - Loading... +
{{end}} @@ -28,8 +29,8 @@
- - + +
@@ -330,7 +331,25 @@ const d = parseData(p.data_text); const name = d.name || p.summary_text || p.summary || 'Untitled'; document.title = name + ' — Dealspace'; - document.getElementById('projectName').textContent = name; + // Populate project switcher + const sel = document.getElementById('projectSwitcher'); + const opt = document.getElementById('projectName'); + opt.value = projectID; + opt.textContent = name; + // Load all projects for switcher + fetchAPI('/api/projects').then(r=>r.json()).then(projects=>{ + sel.innerHTML = ''; + (projects||[]).forEach(p=>{ + const o = document.createElement('option'); + o.value = p.entry_id; + const d = p.data_text ? (()=>{try{return JSON.parse(p.data_text)}catch{return{}}})() : {}; + o.textContent = d.name || p.search_key || p.entry_id; + if(p.entry_id === projectID) o.selected = true; + sel.appendChild(o); + }); + }).catch(()=>{ + sel.innerHTML = ``; + }); // projectTitle removed — name shown in header breadcrumb only document.getElementById('projectDesc').textContent = d.description || ''; const status = d.status || 'active'; @@ -417,7 +436,7 @@ ${chevron} - ${escHtml(name)} + ${escHtml(name)} ${visBadge} ${childCount} items @@ -431,7 +450,7 @@ ${escHtml(num)} ${chevron} - ${escHtml(name)} + ${escHtml(name)} ${item.children_count||0} requests `; @@ -878,6 +897,10 @@ loadGlobalOrgs(); } + function switchProject(pid) { + if (pid && pid !== projectID) window.location.href = '/app/projects/' + pid; + } + function closeAddOrgModal() { document.getElementById('addOrgModal').classList.add('hidden'); document.getElementById('orgNameDropdown').classList.add('hidden');