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
+20
-19
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Chat Rooms — Nexus One AI</title>
|
||||
<link rel="stylesheet" href="style.css?v=4">
|
||||
<link rel="stylesheet" href="style.css?v=12">
|
||||
<style>
|
||||
/* ── Full-height layout ── */
|
||||
body { overflow: hidden; }
|
||||
@@ -170,6 +170,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>
|
||||
@@ -209,7 +210,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<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>
|
||||
<span class="badge" data-brand="tier">Basic Tier</span>
|
||||
<div id="nav-org-logo" class="nav-org-logo"></div>
|
||||
</header>
|
||||
@@ -220,10 +221,10 @@
|
||||
<aside class="cr-sidebar">
|
||||
<div class="cr-sidebar-header">
|
||||
<h3>Chat Rooms</h3>
|
||||
<button class="cr-new-btn" onclick="openCreateModal()">+ New Room</button>
|
||||
<button class="cr-new-btn" onclick="openCreateModal()">New Room</button>
|
||||
</div>
|
||||
<div class="cr-room-list" id="room-list">
|
||||
<div style="padding:16px;font-size:12px;color:var(--lt);text-align:center">No rooms yet</div>
|
||||
<div class="cezen-list-empty">No rooms yet — <a onclick="openCreateModal()">create your first one</a>.</div>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
@@ -232,15 +233,15 @@
|
||||
|
||||
<!-- Empty state -->
|
||||
<div class="cr-empty" id="cr-empty">
|
||||
<div class="cr-empty-icon">💬</div>
|
||||
<div class="cr-empty-icon">Chat</div>
|
||||
<div class="cr-empty-title">Secure Chat Rooms</div>
|
||||
<div class="cr-empty-sub">
|
||||
Collaborate with your team in topic-based rooms. Type <strong>@AI</strong> anywhere in a message to get an instant AI response. All conversations stay on-premises.
|
||||
</div>
|
||||
<div style="margin-top:24px;display:flex;gap:12px;justify-content:center;flex-wrap:wrap">
|
||||
<button class="btn btn-primary" onclick="openCreateModal('general')">💼 General</button>
|
||||
<button class="btn btn-ghost" onclick="openCreateModal('procurement')">📋 Procurement</button>
|
||||
<button class="btn btn-ghost" onclick="openCreateModal('legal')">⚖️ Legal</button>
|
||||
<button class="btn btn-primary" onclick="openCreateModal('general')">General</button>
|
||||
<button class="btn btn-ghost" onclick="openCreateModal('procurement')">Procurement</button>
|
||||
<button class="btn btn-ghost" onclick="openCreateModal('legal')">Legal</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -251,12 +252,12 @@
|
||||
<div class="cr-chat-title" id="chat-title">Room Name</div>
|
||||
<div class="cr-chat-desc" id="chat-desc"></div>
|
||||
</div>
|
||||
<button class="cr-header-btn" onclick="togglePanel()">⚙️ Settings</button>
|
||||
<button class="cr-header-btn" onclick="togglePanel()">Settings</button>
|
||||
</div>
|
||||
|
||||
<div class="cr-messages" id="cr-messages">
|
||||
<div class="cr-typing" id="cr-typing">
|
||||
<div style="width:30px;height:30px;border-radius:50%;background:var(--navy);color:var(--ink);display:flex;align-items:center;justify-content:center;font-size:13px;flex-shrink:0">🤖</div>
|
||||
<div style="width:30px;height:30px;border-radius:50%;background:var(--navy);color:var(--ink);display:flex;align-items:center;justify-content:center;font-size:13px;flex-shrink:0">AI</div>
|
||||
<div>
|
||||
<div style="font-size:11px;font-weight:600;color:var(--lt);margin-bottom:4px">AI Assistant</div>
|
||||
<div class="cr-typing-dots"><span></span><span></span><span></span></div>
|
||||
@@ -268,7 +269,7 @@
|
||||
<div class="cr-input-row">
|
||||
<textarea id="cr-input" placeholder="Message… type @AI to ask the assistant" rows="1"
|
||||
onkeydown="onKeyDown(event)" oninput="autoResize(this)"></textarea>
|
||||
<button class="cr-send-btn" onclick="sendMessage()">➤</button>
|
||||
<button class="cr-send-btn" onclick="sendMessage()">Send</button>
|
||||
</div>
|
||||
<div class="cr-hint">Press <kbd>Enter</kbd> to send · <kbd>Shift+Enter</kbd> for new line · type <kbd>@AI</kbd> to invoke AI</div>
|
||||
</div>
|
||||
@@ -280,7 +281,7 @@
|
||||
<div class="cr-panel" id="cr-panel">
|
||||
<div class="cr-panel-header">
|
||||
<span class="cr-panel-title">Room Settings</span>
|
||||
<button class="cr-panel-close" onclick="togglePanel()">✕</button>
|
||||
<button class="cr-panel-close" onclick="togglePanel()">Close</button>
|
||||
</div>
|
||||
<div class="cr-panel-body">
|
||||
|
||||
@@ -316,8 +317,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-primary" style="width:100%;margin-bottom:14px" onclick="saveRoomSettings()">💾 Save Settings</button>
|
||||
<button class="btn btn-ghost" style="width:100%;color:#B91C1C;border-color:#FCA5A5" onclick="deleteRoom()">🗑 Delete Room</button>
|
||||
<button class="btn btn-primary" style="width:100%;margin-bottom:14px" onclick="saveRoomSettings()">Save Settings</button>
|
||||
<button class="btn btn-ghost" style="width:100%;color:#B91C1C;border-color:#FCA5A5" onclick="deleteRoom()">Delete Room</button>
|
||||
|
||||
<div class="cr-panel-section" style="margin-top:24px">
|
||||
<div class="cr-panel-label">Members</div>
|
||||
@@ -405,13 +406,13 @@ async function loadRooms() {
|
||||
function renderSidebar() {
|
||||
const el = document.getElementById('room-list');
|
||||
if (!rooms.length) {
|
||||
el.innerHTML = '<div style="padding:16px;font-size:12px;color:var(--lt);text-align:center">No rooms yet — create one!</div>';
|
||||
el.innerHTML = '<div class="cezen-list-empty">No rooms yet — <a onclick="openCreateModal()">create your first one</a>.</div>';
|
||||
return;
|
||||
}
|
||||
el.innerHTML = rooms.map(r => `
|
||||
<div class="cr-room-item${r.id === currentRoom?.id ? ' active':''}" onclick="selectRoom(${r.id})">
|
||||
<div class="cr-room-name">
|
||||
${r.ai_auto ? '🤖' : '💬'} ${esc(r.name)}
|
||||
${r.ai_auto ? 'AI' : 'Chat'} ${esc(r.name)}
|
||||
</div>
|
||||
<div class="cr-room-meta">${r.member_count} member${r.member_count !== 1 ? 's':''}</div>
|
||||
</div>
|
||||
@@ -490,7 +491,7 @@ function appendMessage(m) {
|
||||
} else if (m.sender_role === 'assistant') {
|
||||
div.className = 'cr-msg ai';
|
||||
div.innerHTML = `
|
||||
<div class="cr-avatar">🤖</div>
|
||||
<div class="cr-avatar">AI</div>
|
||||
<div class="cr-bubble-wrap">
|
||||
<div class="cr-sender">AI Assistant</div>
|
||||
<div class="cr-bubble">${esc(m.content)}</div>
|
||||
@@ -567,7 +568,7 @@ function renderPanelMembers(members) {
|
||||
<div class="cr-member-avatar">${m.username[0].toUpperCase()}</div>
|
||||
<div class="cr-member-name">${esc(m.username)}</div>
|
||||
<div class="cr-member-role">${m.role}</div>
|
||||
${m.role !== 'admin' ? `<button class="cr-member-del" onclick="removeMember(${m.user_id})">✕</button>` : ''}
|
||||
${m.role !== 'admin' ? `<button class="cr-member-del" onclick="removeMember(${m.user_id})">Remove</button>` : ''}
|
||||
</div>
|
||||
`).join('') || '<div style="font-size:12px;color:var(--lt)">No members</div>';
|
||||
}
|
||||
@@ -716,6 +717,6 @@ function fmtTime(iso) {
|
||||
</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