diff --git a/public/api.php b/public/api.php index 974fe0c..7c9ad3d 100644 --- a/public/api.php +++ b/public/api.php @@ -1802,30 +1802,53 @@ try { case 'save_company_branding': $company_name = trim((string)($payload['company_name'] ?? '')); $company_logo = trim((string)($payload['company_logo'] ?? '')); + $ucp_logo = trim((string)($payload['ucp_logo'] ?? '')); - if ($company_logo !== '' && !preg_match('/^data:image\/(png|jpeg|jpg|webp|svg\+xml|gif);base64,/i', $company_logo)) { - throw new InvalidArgumentException("Format d'image invalide (utilisez PNG, SVG, JPG ou WebP)."); - } - if (strlen($company_logo) > 2 * 1024 * 1024) { - throw new InvalidArgumentException("Le logo est trop volumineux (max 1.5 Mo)."); + foreach (['company_logo' => $company_logo, 'ucp_logo' => $ucp_logo] as $fieldKey => $logoVal) { + if (!array_key_exists($fieldKey, $payload)) { + continue; + } + if ($logoVal !== '' && !preg_match('/^data:image\/(png|jpeg|jpg|webp|svg\+xml|gif);base64,/i', $logoVal)) { + throw new InvalidArgumentException("Format d'image invalide (utilisez PNG, SVG, JPG ou WebP)."); + } + if (strlen($logoVal) > 2 * 1024 * 1024) { + throw new InvalidArgumentException("Le logo est trop volumineux (max 1.5 Mo)."); + } } - if (array_key_exists('company_name', $payload) && array_key_exists('company_logo', $payload)) { - $stmt = $db->prepare('UPDATE settings SET company_name = :cn, company_logo = :cl, updated_at = CURRENT_TIMESTAMP WHERE id = 1'); - $stmt->execute([':cn' => $company_name, ':cl' => $company_logo]); - } elseif (array_key_exists('company_logo', $payload)) { - $stmt = $db->prepare('UPDATE settings SET company_logo = :cl, updated_at = CURRENT_TIMESTAMP WHERE id = 1'); - $stmt->execute([':cl' => $company_logo]); - } elseif (array_key_exists('company_name', $payload)) { - $stmt = $db->prepare('UPDATE settings SET company_name = :cn, updated_at = CURRENT_TIMESTAMP WHERE id = 1'); - $stmt->execute([':cn' => $company_name]); + $sets = []; + $params = []; + if (array_key_exists('company_name', $payload)) { + $sets[] = 'company_name = :cn'; + $params[':cn'] = $company_name; + } + if (array_key_exists('company_logo', $payload)) { + $sets[] = 'company_logo = :cl'; + $params[':cl'] = $company_logo; + } + if (array_key_exists('ucp_logo', $payload)) { + $sets[] = 'ucp_logo = :ul'; + $params[':ul'] = $ucp_logo; + } + + if ($sets) { + $sets[] = 'updated_at = CURRENT_TIMESTAMP'; + $stmt = $db->prepare('UPDATE settings SET ' . implode(', ', $sets) . ' WHERE id = 1'); + $stmt->execute($params); + } + + $msg = 'Logo et identité entreprise mis à jour sur NexusPBX !'; + if (array_key_exists('ucp_logo', $payload) && !array_key_exists('company_logo', $payload) && !array_key_exists('company_name', $payload)) { + $msg = $ucp_logo === '' + ? 'Logo UCP réinitialisé (hérite du logo principal).' + : 'Logo spécifique UCP mis à jour !'; + } elseif (array_key_exists('company_logo', $payload) && $company_logo === '' && !array_key_exists('company_name', $payload) && !array_key_exists('ucp_logo', $payload)) { + $msg = 'Logo entreprise réinitialisé.'; } echo json_encode([ 'success' => true, - 'message' => $company_logo === '' && !array_key_exists('company_name', $payload) - ? 'Logo entreprise réinitialisé.' - : 'Logo et identité entreprise mis à jour sur NexusPBX !', + 'message' => $msg, ]); break; diff --git a/public/assets/app.js b/public/assets/app.js index c45f5ed..fa4e86a 100644 --- a/public/assets/app.js +++ b/public/assets/app.js @@ -243,6 +243,7 @@ function renderAll() { function renderCompanyBranding() { const s = appState.settings || {}; const logo = (s.company_logo || '').trim(); + const ucpLogo = (s.ucp_logo || '').trim(); const name = (s.company_name || '').trim(); const emptyBox = document.getElementById('sidebar-company-empty'); @@ -270,6 +271,21 @@ function renderCompanyBranding() { } } + const ucpPreviewImg = document.getElementById('settings-ucp-preview-img'); + const ucpPreviewEmpty = document.getElementById('settings-ucp-preview-empty'); + if (ucpPreviewImg && ucpPreviewEmpty) { + if (ucpLogo) { + ucpPreviewImg.src = ucpLogo; + ucpPreviewImg.classList.remove('hidden'); + ucpPreviewEmpty.classList.add('hidden'); + } else { + ucpPreviewImg.src = ''; + ucpPreviewImg.classList.add('hidden'); + ucpPreviewEmpty.textContent = logo ? 'Hérite du logo principal' : 'NexusPBX par défaut'; + ucpPreviewEmpty.classList.remove('hidden'); + } + } + if (logo || name) { emptyBox?.classList.add('hidden'); filledBox?.classList.remove('hidden'); @@ -321,7 +337,11 @@ function triggerCompanyLogoPicker() { document.getElementById('company-logo-file-input')?.click(); } -function handleCompanyLogoUpload(input) { +function triggerUcpLogoPicker() { + document.getElementById('ucp-logo-file-input')?.click(); +} + +function uploadBrandingLogo(input, fieldName) { const file = input?.files?.[0]; if (!file) return; @@ -335,7 +355,7 @@ function handleCompanyLogoUpload(input) { reader.onload = async (ev) => { const dataUrl = String(ev.target?.result || ''); try { - const res = await apiCall('save_company_branding', { company_logo: dataUrl }); + const res = await apiCall('save_company_branding', { [fieldName]: dataUrl }); showToast(res.message, 'success'); await loadState(); } catch (err) { @@ -347,9 +367,17 @@ function handleCompanyLogoUpload(input) { reader.readAsDataURL(file); } -async function clearCompanyLogo() { +function handleCompanyLogoUpload(input) { + uploadBrandingLogo(input, 'company_logo'); +} + +function handleUcpLogoUpload(input) { + uploadBrandingLogo(input, 'ucp_logo'); +} + +async function clearBrandingLogo(fieldName) { try { - const res = await apiCall('save_company_branding', { company_logo: '' }); + const res = await apiCall('save_company_branding', { [fieldName]: '' }); showToast(res.message, 'info'); await loadState(); } catch (err) { @@ -357,6 +385,14 @@ async function clearCompanyLogo() { } } +function clearCompanyLogo() { + clearBrandingLogo('company_logo'); +} + +function clearUcpLogo() { + clearBrandingLogo('ucp_logo'); +} + function renderSummaryCards() { const exts = appState.extensions || []; const grps = appState.groups || []; diff --git a/public/index.php b/public/index.php index b37e137..5e9e758 100644 --- a/public/index.php +++ b/public/index.php @@ -1648,6 +1648,7 @@ $isDevEnv = file_exists(__DIR__ . '/../.dev')