ILIAS  trunk Revision v13.0_alpha-52-g21c366bbdd4
Tile.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
21namespace ILIAS\Badge;
22
23use Closure;
24use ilBadge;
25use ilDateTime;
32
33class Tile
34{
35 private readonly BadgeParent $parent;
36 private readonly Modal $modal;
37
39 private readonly Closure $format_date;
41
45 public function __construct(
46 private readonly Container $container,
47 ?BadgeParent $parent = null,
48 ?Modal $modal = null,
49 ?Closure $format_date = null,
50 ) {
51 $this->parent = $parent ?? new BadgeParent($this->container);
52 $this->modal = $modal ?? new Modal($this->container);
53 if (!$format_date) {
54 class_exists(ilDateTime::class); // Ensure ilDateTime is loaded as IL_CAL_UNIX is defined in ilDateTime.php.
55 $format_date = static fn($date, int $format = IL_CAL_UNIX): string =>
57 ;
58 }
59 $this->format_date = $format_date;
60 $this->badge_image_service = new ilBadgeImage($container->resourceStorage(), $container->upload(), $container->ui()->mainTemplate());
61 }
62
66 public function inDeck(ilBadge $badge, ilBadgeAssignment $assignment, string $gui): array
67 {
68 $parent = $this->parent->asComponent($badge);
69 $badge_sections = $parent ? [$parent] : [];
70 $badge_sections[] = $this->profileButton($badge, $assignment, $gui);
71
72 $content = $this->modalContentWithAssignment($badge, $assignment);
73 $card = $this->card($content);
74 $modal = $this->modal($card);
75 $image = $this->image($modal, $badge);
76 $card = $card->withSections($badge_sections)
77 ->withImage($image)
78 ->withTitleAction($modal->getShowSignal());
79
80 return [
81 'card' => $card,
82 'modal' => $modal,
83 ];
84 }
85
89 public function asTitleWithLeadingImage(ModalContent $content): array
90 {
91 $modal = $this->modal($this->card($content));
92
93 return [
94 $modal,
95 $this->image($modal, $content->badge()),
96 $this->title($modal, $content->badge()),
97 ];
98 }
99
103 public function asImage(ModalContent $content, int $size = ilBadgeImage::IMAGE_SIZE_M): array
104 {
105 $modal = $this->modal($this->card($content));
106
107 return [
108 $modal,
109 $this->image($modal, $content->badge(), $size),
110 ];
111 }
112
116 public function asTitle(ModalContent $content): array
117 {
118 $modal = $this->modal($this->card($content));
119
120 return [
121 $modal,
122 $this->title($modal, $content->badge()),
123 ];
124 }
125
126 private function card(ModalContent $content): Component
127 {
128 return $this->container
129 ->ui()
130 ->factory()
131 ->card()
132 ->standard($content->badge()->getTitle())
133 ->withHiddenSections($this->modal->components($content));
134 }
135
136 private function modal(Card $card): Component
137 {
138 return $this->container->ui()->factory()->modal()->lightbox(
139 $this->container->ui()->factory()->modal()->lightboxCardPage($card)
140 );
141 }
142
143 private function image(Component $modal, ilBadge $badge, int $size = ilBadgeImage::IMAGE_SIZE_M): Component
144 {
145 $image_src = $this->badge_image_service->getImageFromBadge($badge, $size);
146
147 return $this->container
148 ->ui()
149 ->factory()
150 ->image()
151 ->responsive($image_src, $badge->getTitle())
152 ->withAction($modal->getShowSignal());
153 }
154
155 private function title(Component $modal, ilBadge $badge): Component
156 {
157 return $this->container
158 ->ui()
159 ->factory()
160 ->button()
161 ->shy($badge->getTitle(), $modal->getShowSignal());
162 }
163
164 public function modalContent(ilBadge $badge): ModalContent
165 {
166 $awarded_by = $this->parent->asProperty($badge);
167
168 return new ModalContent($badge, [
169 $this->txt('criteria') => $badge->getCriteria(),
170 ...($awarded_by !== null ? [$this->txt('awarded_by') => $awarded_by] : []),
171 $this->txt('valid_until') => $this->tryFormating($badge->getValid()),
172 ]);
173 }
174
176 {
177 return $this->addAssignment($this->modalContent($badge), $assignment);
178 }
179
180 public function addAssignment(ModalContent $content, ilBadgeAssignment $assignment): ModalContent
181 {
182 return $content->withAdditionalProperties([
183 $this->txt('badge_issued_on') => ($this->format_date)($assignment->getTimestamp()),
184 ]);
185 }
186
187 private function txt(string $key): string
188 {
189 return $this->container->language()->txt($key);
190 }
191
192 private function tryFormating(string $valid): string
193 {
194 if (!$valid) {
195 return $this->txt('endless');
196 }
197
198 try {
199 return ($this->format_date)($valid, IL_CAL_DATE);
200 } catch (ilDateTimeException) {
201 return $valid;
202 }
203 }
204
205 private function profileButton(ilBadge $badge, ilBadgeAssignment $assignment, string $gui): Component
206 {
207 $active = $assignment->getPosition();
208
209 $this->container->ctrl()->setParameterByClass($gui, 'badge_id', $badge->getId());
210
211 $url = $this->container->ctrl()->getLinkTargetByClass(
212 $gui,
213 $active ? 'deactivateInCard' : 'activateInCard'
214 );
215
216 $this->container->ctrl()->setParameterByClass($gui, 'badge_id', '');
217
218 return $this->container->ui()->factory()->button()->standard(
219 $this->txt($active ? 'badge_remove_from_profile' : 'badge_add_to_profile'),
220 $url
221 );
222 }
223}
asComponent(ilBadge $badge)
Definition: BadgeParent.php:55
withAdditionalProperties(array $properties)
title(Component $modal, ilBadge $badge)
Definition: Tile.php:155
modalContentWithAssignment(ilBadge $badge, ilBadgeAssignment $assignment)
Definition: Tile.php:175
modal(Card $card)
Definition: Tile.php:136
card(ModalContent $content)
Definition: Tile.php:126
profileButton(ilBadge $badge, ilBadgeAssignment $assignment, string $gui)
Definition: Tile.php:205
asImage(ModalContent $content, int $size=ilBadgeImage::IMAGE_SIZE_M)
Definition: Tile.php:103
txt(string $key)
Definition: Tile.php:187
image(Component $modal, ilBadge $badge, int $size=ilBadgeImage::IMAGE_SIZE_M)
Definition: Tile.php:143
asTitleWithLeadingImage(ModalContent $content)
Definition: Tile.php:89
inDeck(ilBadge $badge, ilBadgeAssignment $assignment, string $gui)
Definition: Tile.php:66
readonly Modal $modal
Definition: Tile.php:36
addAssignment(ModalContent $content, ilBadgeAssignment $assignment)
Definition: Tile.php:180
modalContent(ilBadge $badge)
Definition: Tile.php:164
__construct(private readonly Container $container, ?BadgeParent $parent=null, ?Modal $modal=null, ?Closure $format_date=null,)
Definition: Tile.php:45
asTitle(ModalContent $content)
Definition: Tile.php:116
readonly BadgeParent $parent
Definition: Tile.php:35
readonly Closure $format_date
Definition: Tile.php:39
readonly ilBadgeImage $badge_image_service
Definition: Tile.php:40
tryFormating(string $valid)
Definition: Tile.php:192
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:38
const IL_CAL_DATE
const IL_CAL_UNIX
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class for date presentation.
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ?ilObjUser $user=null,)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
@classDescription Date and time handling
A component is the most general form of an entity in the UI.
Definition: Component.php:28
$container
@noRector
Definition: wac.php:39