diff --git a/app/operator_panel/index.php b/app/operator_panel/index.php index 384ea3ed74..cc3cd95515 100644 --- a/app/operator_panel/index.php +++ b/app/operator_panel/index.php @@ -428,11 +428,11 @@ body.op-dragging, body.op-dragging * { .op-ext-dnd .op-ext-icon { background-color: #f1b0b7; } .op-ext-dnd .op-ext-icon .op-ext-status-icon { color: #a71d2a; } .op-ext-dnd .op-ext-info { background-color: #fce4e7; } -/* registered (no explicit status) — green */ -.op-ext-registered { border-color: #28a745; background-color: #d4edda; } -.op-ext-registered .op-ext-icon { background-color: #c3e6cb; } -.op-ext-registered .op-ext-icon .op-ext-status-icon { color: #1e7e34; } -.op-ext-registered .op-ext-info { background-color: #eaf6ec; } +/* registered (no explicit status / no user attached) — blue */ +.op-ext-registered { border-color: #4a8cdb; background-color: #d6e9f8; } +.op-ext-registered .op-ext-icon { background-color: #c3ddf2; } +.op-ext-registered .op-ext-icon .op-ext-status-icon { color: #2b6cb0; } +.op-ext-registered .op-ext-info { background-color: #eaf3fc; } /* user status: logged out — grey */ .op-ext-logged-out { border-color: #9da5ae; background-color: #e2e3e5; } .op-ext-logged-out .op-ext-icon { background-color: #d6d8db; } diff --git a/app/operator_panel/resources/classes/operator_panel_service.php b/app/operator_panel/resources/classes/operator_panel_service.php index dee38b3434..731b6487bf 100644 --- a/app/operator_panel/resources/classes/operator_panel_service.php +++ b/app/operator_panel/resources/classes/operator_panel_service.php @@ -587,7 +587,7 @@ class operator_panel_service extends base_websocket_system_service implements we $ext['registered'] = isset($registered_map[$ext_num]); $ext['registration_count'] = $registered_map[$ext_num] ?? 0; $ext['user_uuid'] = $user_status_map[$ext_num]['user_uuid'] ?? null; - $ext['user_status'] = $user_status_map[$ext_num]['user_status'] ?? 'Logged Out'; + $ext['user_status'] = $user_status_map[$ext_num]['user_status'] ?? ''; } unset($ext); $this->debug('extensions_active trace [step6] annotation complete: extensions=' . count($extensions)); diff --git a/app/operator_panel/resources/javascript/operator_panel.js b/app/operator_panel/resources/javascript/operator_panel.js index 59b176f443..a584d5c6dd 100644 --- a/app/operator_panel/resources/javascript/operator_panel.js +++ b/app/operator_panel/resources/javascript/operator_panel.js @@ -1408,7 +1408,11 @@ function sync_status_buttons() { if (!Array.isArray(user_own_extensions) || user_own_extensions.length === 0) return; const ext = extensions_map.get(user_own_extensions[0]); if (!ext) return; - const current = (ext.user_status || '').trim(); + let current = (ext.user_status || '').trim(); + // If user has no explicit status but is registered, treat as Available + if (!current && ext.user_uuid && ext.registered === true) { + current = 'Available'; + } if (!current) return; document.querySelectorAll('.op-status-btn').forEach(b => { if (b.getAttribute('data-status') === current) { @@ -1510,8 +1514,11 @@ function render_ext_block(ext, is_mine) { css_state = 'op-ext-available'; } else if (user_status_raw === 'Logged Out') { css_state = 'op-ext-logged-out'; + } else if (ext.user_uuid && user_status_raw === '') { + // Has a user but no explicit status set — treat as Available when registered + css_state = 'op-ext-available'; } else { - // Registered with no explicit/active status — blue + // Registered with no user attached or unknown status — blue css_state = 'op-ext-registered'; } @@ -1564,7 +1571,6 @@ function render_ext_block(ext, is_mine) { } const mine_cls = is_mine ? ' op-ext-mine' : ''; - const mine_label = is_mine ? `` : ''; const data_uuid = call_uuid ? ` data-call-uuid="${esc(call_uuid)}"` : ''; // Always allow extension-to-extension drag originate; backend routing handles // availability, call forwarding, follow_me, and voicemail decisions. @@ -1620,9 +1626,12 @@ function render_ext_block(ext, is_mine) { status_hover = text['label-status_logged_out_or_unknown'] || text['label-status_logged_out'] || 'Logged Out'; break; default: - if (reg) { + if (reg && ext.user_uuid) { status_icon = 'status_available'; status_hover = text['label-status_available'] || 'Available'; + } else if (reg) { + status_icon = 'status_available'; + status_hover = text['label-status_registered'] || 'Registered'; } else { status_icon = 'status_logged_out'; status_hover = text['label-status_logged_out_or_unknown'] || text['label-status_logged_out'] || 'Logged Out'; @@ -1686,7 +1695,6 @@ function render_ext_block(ext, is_mine) { ` ondrop="on_ext_drop('${esc(num)}', event)">` + `
${esc(status_hover)}
` + `
` + - `${mine_label}` + `
${esc(num)}
` + dialpad_html + (show_name ? `
${esc(raw_name)}
` : '') +