diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php index 671d14847..4cec8e222 100644 --- a/application/ui.extkeywidget.class.inc.php +++ b/application/ui.extkeywidget.class.inc.php @@ -251,7 +251,7 @@ class UIExtKeyWidget $aOption['picture_url'] = $oImage->GetDisplayURL($sClassAllowed, $oObj->GetKey(), $sObjectImageAttCode); $aOption['initials'] = ''; } else { - $aOption['initials'] = utils::ToAcronym($oObj->Get('friendlyname')); + $aOption['initials'] = utils::FormatInitialsForMedallion(utils::ToAcronym($oObj->Get('friendlyname'))); } } array_push($aOptions, $aOption); @@ -829,7 +829,7 @@ JS } if (array_key_exists('initials', $aValue)) { - $aElt['initials'] = $aValue['initials']; + $aElt['initials'] = utils::FormatInitialsForMedallion($aValue['initials']); if (array_key_exists('picture_url', $aValue)) { $aElt['picture_url'] = $aValue['picture_url']; } diff --git a/application/utils.inc.php b/application/utils.inc.php index 98a09758f..469c9dd22 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -3050,6 +3050,20 @@ HTML; return $aMentionedObjects; } + /** + * Note: This method is not ideal, but other solutions seemed even less ideal: + * * Add a "$sMaxLength" param. to utils::ToAcronym(): Does not work for every use cases (see corresponding ticket) as in some parts utils::ToAcronym isn't necessarly meant to be used in a medallion. + * + * @param string $sInitials + * + * @return string Truncates $sInitials so it can fit in medallions + * @since 3.0.1 N°4913 + */ + public static function FormatInitialsForMedallion(string $sInitials): string + { + return mb_substr($sInitials, 0, 3); + } + /** * @param $sUrl * @param string $sParamName diff --git a/pages/ajax.render.php b/pages/ajax.render.php index d029f79b7..db3e34c24 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -2539,7 +2539,7 @@ EOF } else { // If no image found, fallback on initials $aMatch['picture_style'] = ''; - $aMatch['initials'] = utils::ToAcronym($oObject->Get('friendlyname')); + $aMatch['initials'] = utils::FormatInitialsForMedallion(utils::ToAcronym($oObject->Get('friendlyname'))); } } diff --git a/sources/Renderer/Bootstrap/FieldRenderer/BsSimpleFieldRenderer.php b/sources/Renderer/Bootstrap/FieldRenderer/BsSimpleFieldRenderer.php index 495223db5..aedd0918c 100644 --- a/sources/Renderer/Bootstrap/FieldRenderer/BsSimpleFieldRenderer.php +++ b/sources/Renderer/Bootstrap/FieldRenderer/BsSimpleFieldRenderer.php @@ -648,7 +648,7 @@ HTML // Open medallion from profile picture or first name letter $bEntryHasMedallionPicture = (empty($aContactPicturesCache[$iEntryUserId]) === false); $sEntryMedallionStyle = $bEntryHasMedallionPicture ? ' background-image: url(\''.$aContactPicturesCache[$iEntryUserId].'\');' : ''; - $sEntryMedallionContent = $bEntryHasMedallionPicture ? '' : UserRights::GetUserInitials($sEntryUserLogin); + $sEntryMedallionContent = $bEntryHasMedallionPicture ? '' : utils::FormatInitialsForMedallion(UserRights::GetUserInitials($sEntryUserLogin)); // - Entry tooltip $sEntryMedallionTooltip = utils::HtmlEntities($sEntryUserLogin); $sEntryMedallionTooltipPlacement = ($iEntryUserId === $iCurrentUserId) ? 'left' : 'right'; diff --git a/templates/base/layouts/activity-panel/activity-entry/layout.html.twig b/templates/base/layouts/activity-panel/activity-entry/layout.html.twig index bae577579..d7fa10811 100644 --- a/templates/base/layouts/activity-panel/activity-entry/layout.html.twig +++ b/templates/base/layouts/activity-panel/activity-entry/layout.html.twig @@ -10,7 +10,7 @@ {% if oUIBlock.GetAuthorPictureAbsUrl() is not empty %} {{ oUIBlock.GetAuthorInitials() }} {% else %} -
{{ oUIBlock.GetAuthorInitials() }}
+
{{ oUIBlock.GetAuthorInitials()|slice(0, 3) }}
{% endif %} {% endblock %} diff --git a/test/application/UtilsTest.php b/test/application/UtilsTest.php index 9be069475..1b425ccda 100644 --- a/test/application/UtilsTest.php +++ b/test/application/UtilsTest.php @@ -554,6 +554,40 @@ class UtilsTest extends \Combodo\iTop\Test\UnitTest\ItopTestCase ]; } + /** + * @dataProvider FormatInitialsForMedallionProvider + * @covers utils::FormatInitialsForMedallion + * + * @param string $sInput + * @param string $sExpected + */ + public function testFormatInitialsForMedallion(string $sInput, string $sExpected) + { + $sTested = utils::FormatInitialsForMedallion($sInput); + $this->assertEquals($sExpected, $sTested); + } + + /** + * @since 3.0.1 + */ + public function FormatInitialsForMedallionProvider() + { + return [ + 'All letters kept (2)' => [ + 'AB', + 'AB', + ], + 'All letters kept (3)' => [ + 'ABC', + 'ABC', + ], + 'Only 3 first letters kept (4)' => [ + 'ABCD', + 'ABC', + ], + ]; + } + /** * @param string $sExpressionToConvert * @param int $iExpectedConvertedValue