From 020558f14f3a66ac822f7af570a7b72e91fbb5ee Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 3 Jul 2026 18:25:28 -0300 Subject: [PATCH] Novo recurso: controle da logo do login (custom/original/ocultar) + caixa de CSS grande MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dropdown 'Logo' na seção Login Page: custom (imagem enviada ou logo do tema — comportamento legado, default), original (força logo GLPI) e hide (oculta via CSS injetado no display_login). - Campos de CSS custom agora são textarea de 14 linhas sempre visível (monospace, 100%); o Monaco só assume se window.GLPI.Monaco existir (melhoria progressiva — antes o fallback dependia de JS e o campo podia ficar escondido/curto). - Traduções pt_BR novas + pt_BR.mo recompilado (msgfmt indisponível; compilado com script Python puro). Co-Authored-By: Claude Fable 5 --- hook.php | 20 +++++++++++++++--- locales/pt_BR.mo | Bin 1204 -> 918 bytes locales/pt_BR.po | 8 ++++++++ src/Config.php | 52 +++++++++++++++++++++++++++++++---------------- 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/hook.php b/hook.php index 230d1bf..5f26111 100644 --- a/hook.php +++ b/hook.php @@ -17,10 +17,16 @@ function plugin_butterfly_display_login() { $themeInfo = \GlpiPlugin\Butterfly\Theme::getThemeInfo($theme); } - $loginPicture = \GlpiPlugin\Butterfly\Config::getConfig('login_picture'); + // Logo do login: custom (imagem enviada ou do tema) / original / hide + $logoDisplay = \GlpiPlugin\Butterfly\Config::getConfig('login_logo_display', 'custom'); - if (!$loginPicture && $themeInfo && !empty($themeInfo['login-logo'])) { - $loginPicture = $themeInfo['login-logo'] . '&theme=' . $themeInfo['id']; + $loginPicture = null; + if ($logoDisplay === 'custom') { + $loginPicture = \GlpiPlugin\Butterfly\Config::getConfig('login_picture'); + + if (!$loginPicture && $themeInfo && !empty($themeInfo['login-logo'])) { + $loginPicture = $themeInfo['login-logo'] . '&theme=' . $themeInfo['id']; + } } $loginCss = \GlpiPlugin\Butterfly\Scss::getLoginCSS($requestedTheme); @@ -29,6 +35,14 @@ function plugin_butterfly_display_login() { } ?> + + + LeoVO0cdJBd* z+i)G;gQ3skdOe04s7KIjbNp;rXyp>hZS1Q;%y#9y6od58bozaY4s$V`s`Q%GP_xQY zn7VW$SKJJmLa}ZtX?gjaw^bC&Pw}5}^Uo(uJ5Jn`>A{ z1JjeDR19y&jCU3*rly@8A@0C(!lczSFG>`BGe&NhFkd`?axVDa{Dh*(CtsyVLKDs> zA54Vg&|j&j7aqk`>bWqz$vb4nR0le*G3qqckgb}CGj=2F4#6T<%stOEk%4u#K#Pp= Xzr>vLIDF|WS1w5ZkJW`(GvxXQ@pI#- literal 1204 zcmZ9KJ#Q2-5Qfb+EMG~GKoJy!1X4ga_kje_Mkz=j;-s8%x@>5Xv+L}c?Aj~a3rR#x zMN3CRNr6O5ODcW<4FwGiJwE_m=Z;HY6zB2Gt>>Mw=lj(0Hw-p`bq(t+)|Ie7f`71W za0=W3PlK<)li(Zh68ILJ1V4`ApTV>6zktWVui$y`8yJB=s(;=IClXn*g34wcd(!zv{CxlLd~I$pt*00BHhZZsdYw` zN_}l5TUuMAWT(QWcHWdDPzY}tOE+6L99tI8RcbT|oJ*81BwIGdOFII2x$W6wl}Xmo z2y0PLPvnxVm|W@Mwl7mtmQrUjBd2y{Jj~pePI{IMWGPua zwgX9Pp{AKo(5+eOO6MRE6YE*?Os1Z9GX6wbr;Lut|4l`$+2(9B>dVSl&$}*H8DFe( z#}gCN!28O@jYh8gpx&5;RzqgFuvv-ZO1MT|REm#tHI#F;bWv}W_vLdHl=ws8QA4}g zZt-S|-)&OsUfjOVn|GVdXhk^B(Uf+D@W#gUpvDCYuToJIJCsW;EskgSQ0Fz8;fWMw zOxkEUj>S~@r;Gil+vz?!=nq{*O9pqXp@7Fj$9RH9RS2c$DIExlYh74RmigSlccGF^ zY560anoQ|DrnwE}qh3*4QSfDBO9%04-*pS^c^YmPW;9)2pw_MVh;>SoSyCox6EkF3 zqAC+SybSB%@(rF|?F#%7-l{qrp-Ncs?>I?H_CEN!FsyGfQSH5F3A#W+Lv|EcP3yu7 z%X)k7FiL_(^ELLNy+33u5v9-r91L@YF+&aG5zFMJ(#j%xDGp6pN2j6^yP^K!m '', 'page_footer_display' => 'original', 'page_footer_text' => '', + 'login_logo_display' => 'custom', 'login_picture' => '', 'login_picture_max_width' => '240px', 'login_picture_max_height' => '130px', @@ -237,45 +238,49 @@ class Config extends \CommonDBTM { echo ""; $rand = mt_rand(); + $textareaId = $fullName . '_' . $rand; $containerId = $fullName . '_editor_' . $rand; $value = rtrim($this->fields[$fullName]); - // Editor Monaco do core (GLPI 11) com fallback: o textarea escondido - // mantém o name/valor e é sincronizado no submit via evento formdata + // Caixa de texto longa sempre visível; o Monaco do core (GLPI 11) só + // assume se a lib estiver carregada — aí esconde o textarea e passa a + // sincronizar o valor no submit via evento formdata echo sprintf( ''; - echo '
'; + echo '
'; echo \Html::scriptBlock(' $(function() { if (window.GLPI === undefined || window.GLPI.Monaco === undefined) { - $("#' . $fullName . '_' . $rand . '").removeClass("d-none").attr({rows: 15, spellcheck: false}); - $("#' . $containerId . '").remove(); - return; + return; // sem Monaco nesta página — fica o textarea } - window.GLPI.Monaco.createEditor( - ' . json_encode($containerId, JSON_HEX_TAG | JSON_HEX_AMP) . ', - "scss", - ' . json_encode($value, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP) . ', - [] - ).then(() => { - $("#' . $containerId . '").closest("form").on("formdata", (e) => { + var taId = ' . json_encode($textareaId, JSON_HEX_TAG | JSON_HEX_AMP) . '; + var containerId = ' . json_encode($containerId, JSON_HEX_TAG | JSON_HEX_AMP) . '; + var fieldName = ' . json_encode($fullName, JSON_HEX_TAG | JSON_HEX_AMP) . '; + window.GLPI.Monaco.createEditor(containerId, "scss", $("#" + taId).val(), []).then(() => { + $("#" + containerId).removeClass("d-none"); + $("#" + taId).addClass("d-none").prop("disabled", true); + $("#" + containerId).closest("form").on("formdata", (e) => { const editors = window.monaco.editor.getEditors().filter( - (editor) => editor._domElement.id === ' . json_encode($containerId, JSON_HEX_TAG | JSON_HEX_AMP) . ' + (editor) => editor._domElement.id === containerId ); if (editors.length) { - e.originalEvent.formData.delete(' . json_encode($fullName, JSON_HEX_TAG | JSON_HEX_AMP) . '); - e.originalEvent.formData.append(' . json_encode($fullName, JSON_HEX_TAG | JSON_HEX_AMP) . ', editors[0].getValue()); + e.originalEvent.formData.delete(fieldName); + e.originalEvent.formData.append(fieldName, editors[0].getValue()); } }); + }).catch(() => { + // editor falhou — mantém o textarea funcional }); }); '); @@ -534,6 +539,17 @@ class Config extends \CommonDBTM { } } + echo ""; + echo "" . t_butterfly('Logo') . ""; + echo ""; + \Dropdown::showFromArray('login_logo_display', [ + 'custom' => t_butterfly('Custom (uploaded picture or theme logo)'), + 'original' => __('Original'), + 'hide' => t_butterfly('Hide'), + ], ['value' => $this->fields['login_logo_display']]); + echo ""; + echo "\n"; + echo ""; echo "" . __('Picture') . ""; $this->buildPictureLine('login_picture', '145px x 80px');