diff --git a/src/Bundle/ChillMainBundle/Templating/Entity/UserRender.php b/src/Bundle/ChillMainBundle/Templating/Entity/UserRender.php index 053e8d611..50fe26a3f 100644 --- a/src/Bundle/ChillMainBundle/Templating/Entity/UserRender.php +++ b/src/Bundle/ChillMainBundle/Templating/Entity/UserRender.php @@ -13,8 +13,6 @@ namespace Chill\MainBundle\Templating\Entity; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; -use DateTime; -use DateTimeImmutable; use Symfony\Component\Clock\ClockInterface; use Symfony\Contracts\Translation\TranslatorInterface; use Twig\Error\LoaderError; @@ -26,11 +24,17 @@ use Twig\Error\SyntaxError; */ class UserRender implements ChillEntityRenderInterface { + public const SPLIT_LINE_BEFORE_CHARACTER = 'split_lines_before_characters'; final public const DEFAULT_OPTIONS = [ 'main_scope' => true, 'user_job' => true, 'absence' => true, 'at_date' => null, // instanceof DateTimeInterface + /* + * when set, the jobs and service will be splitted in multiple lines. The line will be splitted + * before the given character. Only for renderString, renderBox is not concerned. + */ + self::SPLIT_LINE_BEFORE_CHARACTER => null, ]; public function __construct( @@ -65,8 +69,6 @@ class UserRender implements ChillEntityRenderInterface { $opts = \array_merge(self::DEFAULT_OPTIONS, $options); - // $immutableAtDate = $opts['at_date'] instanceOf DateTime ? DateTimeImmutable::createFromMutable($opts['at_date']) : $opts['at_date']; - if (null === $opts['at_date']) { $opts['at_date'] = $this->clock->now(); } elseif ($opts['at_date'] instanceof \DateTime) { @@ -89,6 +91,28 @@ class UserRender implements ChillEntityRenderInterface $str .= ' ('.$this->translator->trans('absence.Absent').')'; } + if (null !== $opts[self::SPLIT_LINE_BEFORE_CHARACTER]) { + if (!is_int($opts[self::SPLIT_LINE_BEFORE_CHARACTER])) { + throw new \InvalidArgumentException('Only integer for option split_lines_before_characters is allowed'); + } + + $characterPerLine = $opts[self::SPLIT_LINE_BEFORE_CHARACTER]; + $exploded = explode(' ', $str); + $charOnLine = 0; + $str = ''; + foreach ($exploded as $word) { + if ($charOnLine + strlen($word) > $characterPerLine) { + $str .= "\n"; + $charOnLine = 0; + } + if ($charOnLine > 0) { + $str .= ' '; + } + $str .= $word; + $charOnLine += strlen($word); + } + } + return $str; } diff --git a/src/Bundle/ChillMainBundle/Tests/Templating/Entity/UserRenderTest.php b/src/Bundle/ChillMainBundle/Tests/Templating/Entity/UserRenderTest.php index 2b0e07732..b22580569 100644 --- a/src/Bundle/ChillMainBundle/Tests/Templating/Entity/UserRenderTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Templating/Entity/UserRenderTest.php @@ -35,7 +35,6 @@ class UserRenderTest extends TestCase public function testRenderUserWithJobAndScopeAtCertainDate(): void { // Create a user with a certain user job - $user = new User(); $userJobA = new UserJob(); $scopeA = new Scope(); @@ -106,4 +105,52 @@ class UserRenderTest extends TestCase $expectedStringC = 'BOB ISLA (directrice) (service B)'; $this->assertEquals($expectedStringC, $renderer->renderString($user, $optionsNoDate)); } + + public function testRenderStringWithSplitLines(): void + { + + // Create a user with a certain user job + $user = new User(); + $userJobA = new UserJob(); + $scopeA = new Scope(); + + $userJobA->setLabel(['fr' => 'assistant social en maison de service accompagné']) + ->setActive(true); + $scopeA->setName(['fr' => 'service de l\'assistant professionnel']); + $user->setLabel('Robert Van Zorrizzeen Gorikke'); + + $userJobHistoryA = (new User\UserJobHistory()) + ->setUser($user) + ->setJob($userJobA) + ->setStartDate(new \DateTimeImmutable('2023-11-01 12:00:00')) + ->setEndDate(new \DateTimeImmutable('2023-11-30 00:00:00')); + + $userScopeHistoryA = (new User\UserScopeHistory()) + ->setUser($user) + ->setScope($scopeA) + ->setStartDate(new \DateTimeImmutable('2023-11-01 12:00:00')) + ->setEndDate(new \DateTimeImmutable('2023-11-30 00:00:00')); + + $user->getUserJobHistories()->add($userJobHistoryA); + $user->getUserScopeHistories()->add($userScopeHistoryA); + + // Create renderer + $translatableStringHelperMock = $this->prophesize(TranslatableStringHelperInterface::class); + $translatableStringHelperMock->localize(Argument::type('array'))->will(fn ($args) => $args[0]['fr']); + + $engineMock = $this->createMock(Environment::class); + $translatorMock = $this->createMock(TranslatorInterface::class); + $clock = new MockClock(new \DateTimeImmutable('2023-11-15 12:00:00')); + + $renderer = new UserRender($translatableStringHelperMock->reveal(), $engineMock, $translatorMock, $clock); + + $actual = $renderer->renderString($user, ['split_lines_before_characters' => 30]); + self::assertEquals(<<<'STR' + Robert Van Zorrizzeen Gorikke + (assistant social en maison de + service accompagné) (service de + l'assistant professionnel) + STR, $actual); + + } }