Sync cezen-portal/ from live working copy (V1.0 GA polish + search-icon ordering fix)
Brings the ISO-packaged portal copy current with the live cezen-portal/ working directory, which had drifted across the entire V1.0 GA polish initiative (Phases 1-10) plus this session's topnav icon-order bugfix. - 52 existing files updated, 2 new pages added (about.html, health.html) - cgit/cezen-portal/ is now byte-identical to cezen-portal/ - Backend files (rag_ingest.py, cezen_license.py) already in sync; main.py intentionally left as-is (cgit is ahead there with workstation-category commercial-fit logic not yet backported to the live working copy) Next: rebuild the ISO (bash autoinstall/build-iso.sh) to bake this in.
This commit is contained in:
1 parent
7540da04a8
commit
b3eec34158
57 files changed
+2832
-1354
No files matched your search
+13
-18
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Teams — Nexus One AI</title>
|
||||
<link rel="stylesheet" href="style.css?v=4">
|
||||
<link rel="stylesheet" href="style.css?v=12">
|
||||
<style>
|
||||
.tm-layout { display: grid; grid-template-columns: 1fr 380px; min-height: calc(100vh - 64px); }
|
||||
@media(max-width:960px){ .tm-layout { grid-template-columns: 1fr; } .tm-detail { display:none; } }
|
||||
@@ -183,6 +183,7 @@
|
||||
<a href="dashboard.html">Dashboard</a>
|
||||
<a href="analytics.html">Usage Analytics</a>
|
||||
<a href="audit.html">Governance & Audit</a>
|
||||
<a href="health.html">Health Center</a>
|
||||
<a href="feedback.html">Feedback & Ratings</a>
|
||||
<span class="nav-drop-cat">MANAGE /</span>
|
||||
<a href="users.html">Users</a>
|
||||
@@ -221,7 +222,7 @@
|
||||
<a href="chatrooms.html">Chat Rooms</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="notifications.html" style="position:relative">🔔</a>
|
||||
<a href="notifications.html" class="nav-icon-btn" style="position:relative" aria-label="Notifications"><span class="icon-svg icon-sm" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 1 0-12 0v3.2a2 2 0 0 1-.6 1.4L4 17h5"/><path d="M10 17a2 2 0 0 0 4 0"/></svg></span></a>
|
||||
</nav>
|
||||
<span class="badge" data-brand="tier">Basic Tier</span>
|
||||
<div id="nav-org-logo" class="nav-org-logo"></div>
|
||||
@@ -231,7 +232,7 @@
|
||||
<!-- Left: Team list -->
|
||||
<div class="tm-list-panel">
|
||||
<div class="tm-header">
|
||||
<div class="tm-title">👥 Teams & Departments</div>
|
||||
<div class="tm-title">Teams & Departments</div>
|
||||
<button class="tm-add-btn" onclick="openCreateModal()">+ New Team</button>
|
||||
</div>
|
||||
<div class="tm-grid" id="tm-grid">
|
||||
@@ -242,7 +243,7 @@
|
||||
<!-- Right: Detail -->
|
||||
<div class="tm-detail" id="tm-detail">
|
||||
<div class="tm-detail-empty">
|
||||
<div style="font-size:38px;opacity:.3">👥</div>
|
||||
<div style="font-size:38px;opacity:.3">TM</div>
|
||||
<p style="font-size:14px;color:var(--lt)">Select a team to manage it</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -333,10 +334,10 @@ function renderGrid() {
|
||||
</div>
|
||||
</div>
|
||||
<div class="tm-card-stats">
|
||||
<div class="tm-card-stat">👤 <strong>${t.member_count}</strong> members</div>
|
||||
<div class="tm-card-stat">🤖 <strong>${models.length || 'All'}</strong> models</div>
|
||||
<div class="tm-card-stat">📚 <strong>${kbs.length || 'All'}</strong> KBs</div>
|
||||
${quota ? `<div class="tm-card-stat">🔤 <strong>${(quota/1000).toFixed(0)}k</strong> tok/mo</div>` : ''}
|
||||
<div class="tm-card-stat"><strong>${t.member_count}</strong> members</div>
|
||||
<div class="tm-card-stat"><strong>${models.length || 'All'}</strong> models</div>
|
||||
<div class="tm-card-stat"><strong>${kbs.length || 'All'}</strong> KBs</div>
|
||||
${quota ? `<div class="tm-card-stat"><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/></svg></span> <strong>${(quota/1000).toFixed(0)}k</strong> tok/mo</div>` : ''}
|
||||
</div>
|
||||
<div class="tm-card-actions">
|
||||
<button class="tm-sm-btn" onclick="event.stopPropagation();selectTeam(${t.id})">Manage</button>
|
||||
@@ -380,7 +381,7 @@ function renderDetail(t) {
|
||||
<div class="tm-member-email">${m.email}</div>
|
||||
</div>
|
||||
<span class="tm-role-badge ${m.team_role}">${m.team_role}</span>
|
||||
<button class="tm-remove-btn" onclick="removeMember(${t.id},${m.id})" title="Remove">✕</button>
|
||||
<button class="tm-remove-btn" onclick="removeMember(${t.id},${m.id})" title="Remove">Remove</button>
|
||||
</div>
|
||||
`).join('') : '<p style="font-size:13px;color:var(--lt)">No members yet.</p>'}
|
||||
<div class="tm-add-member">
|
||||
@@ -430,7 +431,7 @@ function renderDetail(t) {
|
||||
<label>Monthly Token Limit (0 = unlimited)</label>
|
||||
<input id="tm-quota" type="number" min="0" step="50000" value="${quota}" placeholder="e.g. 1000000">
|
||||
</div>
|
||||
<button class="tm-save-settings-btn" onclick="saveSettings(${t.id})">💾 Save Settings</button>
|
||||
<button class="tm-save-settings-btn" onclick="saveSettings(${t.id})">Save Settings</button>
|
||||
</div>
|
||||
|
||||
</div>`;
|
||||
@@ -508,7 +509,7 @@ async function deleteTeam(id) {
|
||||
teams = teams.filter(t => t.id !== id);
|
||||
if (selectedTeamId === id) {
|
||||
selectedTeamId = null;
|
||||
document.getElementById('tm-detail').innerHTML = `<div class="tm-detail-empty"><div style="font-size:38px;opacity:.3">👥</div><p style="font-size:14px;color:var(--lt)">Select a team to manage it</p></div>`;
|
||||
document.getElementById('tm-detail').innerHTML = `<div class="tm-detail-empty"><div style="font-size:38px;opacity:.3">TM</div><p style="font-size:14px;color:var(--lt)">Select a team to manage it</p></div>`;
|
||||
}
|
||||
renderGrid();
|
||||
showToast('Team deleted');
|
||||
@@ -539,17 +540,11 @@ async function createTeam() {
|
||||
showToast('Team created');
|
||||
}
|
||||
|
||||
function showToast(msg) {
|
||||
const t = document.getElementById('tm-toast');
|
||||
t.textContent = msg; t.classList.add('show');
|
||||
setTimeout(() => t.classList.remove('show'), 2200);
|
||||
}
|
||||
|
||||
loadTeams();
|
||||
loadUsers();
|
||||
</script>
|
||||
|
||||
<script src="auth.js"></script>
|
||||
<script src="branding.js"></script>
|
||||
<script src="branding.js?v=3"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user