ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilBadgeTableGUI.php
Go to the documentation of this file.
1 <?php
2 
18 declare(strict_types=1);
19 
20 namespace ILIAS\Badge;
21 
26 use ilLanguage;
33 use Generator;
36 use ilBadge;
37 use ilBadgeAuto;
40 
42 {
43  private readonly Factory $factory;
44  private readonly Renderer $renderer;
45  private readonly \ILIAS\Refinery\Factory $refinery;
47  private readonly Services $http;
48  private readonly int $parent_id;
49  private readonly string $parent_type;
50  private readonly ilLanguage $lng;
51  private readonly ilGlobalTemplateInterface $tpl;
52  private readonly \ILIAS\ResourceStorage\Services $irss;
66  private ?array $cached_records = null;
67 
68  public function __construct(int $parent_obj_id, string $parent_obj_type, protected bool $has_write = false)
69  {
70  global $DIC;
71 
72  $this->lng = $DIC->language();
73  $this->tpl = $DIC->ui()->mainTemplate();
74  $this->factory = $DIC->ui()->factory();
75  $this->renderer = $DIC->ui()->renderer();
76  $this->refinery = $DIC->refinery();
77  $this->request = $DIC->http()->request();
78  $this->http = $DIC->http();
79  $this->irss = $DIC->resourceStorage();
80 
81  $this->parent_id = $parent_obj_id;
82  $this->parent_type = $parent_obj_type;
83  $this->badge_image_service = new ilBadgeImage(
84  $this->irss,
85  $DIC->upload(),
86  $DIC->ui()->mainTemplate()
87  );
88  }
89 
100  private function getRecords(): array
101  {
102  if ($this->cached_records !== null) {
103  return $this->cached_records;
104  }
105 
106  $rows = [];
107  foreach (ilBadge::getInstancesByParentId($this->parent_id) as $badge) {
108  $rows[] = [
109  'id' => $badge->getId(),
110  'badge' => $badge,
111  'active' => $badge->isActive(),
112  'type' => $this->parent_type !== 'bdga'
113  ? ilBadge::getExtendedTypeCaption($badge->getTypeInstance())
114  : $badge->getTypeInstance()->getCaption(),
115  'manual' => !$badge->getTypeInstance() instanceof ilBadgeAuto,
116  'title_sortable' => $badge->getTitle()
117  ];
118  }
119 
120  $this->cached_records = $rows;
121 
122  return $rows;
123  }
124 
145  private function enrichRecord(ModalBuilder $modal_builder, array $record): array
146  {
147  $badge = $record['badge'];
148 
149  $images = [
150  'rendered' => null,
151  'large' => null,
152  ];
153 
154  $image_src = $this->badge_image_service->getImageFromBadge($badge);
155  if ($image_src !== '') {
156  $images['rendered'] = $this->renderer->render(
157  $this->factory->image()->responsive(
158  $image_src,
159  $badge->getTitle()
160  )
161  );
162 
163  $image_src_large = $this->badge_image_service->getImageFromBadge(
164  $badge,
166  );
167  if ($image_src_large !== '') {
168  $images['large'] = $this->factory->image()->responsive(
169  $image_src_large,
170  $badge->getTitle()
171  );
172  }
173  }
174 
175  $modal = $modal_builder->constructModal(
176  $images['large'],
177  $badge->getTitle(),
178  [
179  'description' => $badge->getDescription(),
180  'badge_criteria' => $badge->getCriteria(),
181  ]
182  );
183 
184  $record['image'] = $images['rendered']
185  ? $modal_builder->renderShyButton($images['rendered'], $modal) . ' '
186  : '';
187  $record['title'] = implode('', [
188  $modal_builder->renderShyButton($badge->getTitle(), $modal),
189  $modal_builder->renderModal($modal)
190  ]);
191 
192  return $record;
193  }
194 
195 
196  public function getRows(
197  DataRowBuilder $row_builder,
198  array $visible_column_ids,
199  Range $range,
200  Order $order,
201  ?array $filter_data,
202  ?array $additional_parameters
203  ): Generator {
204  $records = $this->getRecords();
205 
206  if ($order) {
207  [$order_field, $order_direction] = $order->join(
208  [],
209  fn($ret, $key, $value) => [$key, $value]
210  );
211 
212  usort($records, static function (array $left, array $right) use ($order_field): int {
213  if (\in_array($order_field, ['title', 'type'], true)) {
214  if ($order_field === 'title') {
215  $order_field .= '_sortable';
216  }
217 
218  return \ilStr::strCmp(
219  $left[$order_field],
220  $right[$order_field]
221  );
222  }
223 
224  if ($order_field === 'active') {
225  return $right[$order_field] <=> $left[$order_field];
226  }
227 
228  return $left[$order_field] <=> $right[$order_field];
229  });
230 
231  if ($order_direction === Order::DESC) {
232  $records = array_reverse($records);
233  }
234  }
235 
236  if ($range) {
237  $records = \array_slice($records, $range->getStart(), $range->getLength());
238  }
239 
240  $identifications = [];
241  foreach ($records as $record) {
242  if ($record['badge']->getImageRid() !== null && $record['badge']->getImageRid() !== '') {
243  $identifications[] = $record['badge']->getImageRid();
244  }
245  }
246 
247  $this->irss->preload($identifications);
248 
249  $modal_container = new ModalBuilder();
250  foreach ($records as $record) {
251  $record = $this->enrichRecord($modal_container, $record);
252 
253  yield $row_builder
254  ->buildDataRow((string) $record['id'], $record)
255  ->withDisabledAction(
256  'award_revoke_badge',
257  !$record['manual'] || !$record['active']
258  );
259  }
260  }
261 
262  public function getTotalRowCount(
263  ?array $filter_data,
264  ?array $additional_parameters
265  ): ?int {
266  return \count($this->getRecords());
267  }
268 
272  private function getColumns(): array
273  {
274  return [
275  'image' => $this->factory->table()->column()->text($this->lng->txt('image'))->withIsSortable(false),
276  'title' => $this->factory->table()->column()->text($this->lng->txt('title')),
277  'type' => $this->factory->table()->column()->text($this->lng->txt('type')),
278  'active' => $this->factory->table()->column()->boolean(
279  $this->lng->txt('active'),
280  $this->lng->txt('yes'),
281  $this->lng->txt('no')
282  )->withOrderingLabels(
283  $this->lng->txt('badge_sort_active_badges_first'),
284  $this->lng->txt('badge_sort_active_badges_last')
285  )
286  ];
287  }
288 
292  private function getActions(
293  URLBuilder $url_builder,
294  URLBuilderToken $action_parameter_token,
295  URLBuilderToken $row_id_token,
296  ): array {
297  return $this->has_write ? [
298  'badge_table_activate' =>
299  $this->factory->table()->action()->multi(
300  $this->lng->txt('activate'),
301  $url_builder->withParameter($action_parameter_token, 'badge_table_activate'),
302  $row_id_token
303  ),
304  'badge_table_deactivate' =>
305  $this->factory->table()->action()->multi(
306  $this->lng->txt('deactivate'),
307  $url_builder->withParameter($action_parameter_token, 'badge_table_deactivate'),
308  $row_id_token
309  ),
310  'badge_table_edit' => $this->factory->table()->action()->single(
311  $this->lng->txt('edit'),
312  $url_builder->withParameter($action_parameter_token, 'badge_table_edit'),
313  $row_id_token
314  ),
315  'badge_table_delete' =>
316  $this->factory->table()->action()->standard(
317  $this->lng->txt('delete'),
318  $url_builder->withParameter($action_parameter_token, 'badge_table_delete'),
319  $row_id_token
320  ),
321  'award_revoke_badge' =>
322  $this->factory->table()->action()->single(
323  $this->lng->txt('badge_award_revoke'),
324  $url_builder->withParameter($action_parameter_token, 'award_revoke_badge'),
325  $row_id_token
326  )
327  ] : [];
328  }
329 
330  public function renderTable(string $url): void
331  {
332  $df = new \ILIAS\Data\Factory();
333 
334  $table_uri = $df->uri($url);
335  $url_builder = new URLBuilder($table_uri);
336  $query_params_namespace = ['tid'];
337 
338  [$url_builder, $action_parameter_token, $row_id_token] = $url_builder->acquireParameters(
339  $query_params_namespace,
340  'table_action',
341  'id',
342  );
343 
344  $table = $this->factory
345  ->table()
346  ->data($this->lng->txt('obj_bdga'), $this->getColumns(), $this)
347  ->withId(self::class . '_' . $this->parent_id)
348  ->withOrder(new Order('title', Order::ASC))
349  ->withActions($this->getActions($url_builder, $action_parameter_token, $row_id_token))
350  ->withRequest($this->request);
351  $out = [$table];
352 
353  $query = $this->http->wrapper()->query();
354 
355  if ($query->has($action_parameter_token->getName())) {
356  $action = $query->retrieve($action_parameter_token->getName(), $this->refinery->to()->string());
357  $ids = $query->retrieve($row_id_token->getName(), $this->refinery->custom()->transformation(fn($v) => $v));
358 
359  if ($action === 'delete') {
360  $items = [];
361  foreach ($ids as $id) {
362  $items[] = $this->factory->modal()->interruptiveItem()->keyValue(
363  $id,
364  $row_id_token->getName(),
365  $id
366  );
367  }
368 
369  $this->http->saveResponse(
370  $this->http
371  ->response()
372  ->withBody(
373  Streams::ofString($this->renderer->renderAsync([
374  $this->factory->modal()->interruptive(
375  $this->lng->txt('badge_deletion'),
376  $this->lng->txt('badge_deletion_confirmation'),
377  '#'
378  )->withAffectedItems($items)
379  ]))
380  )
381  );
382  $this->http->sendResponse();
383  $this->http->close();
384  }
385  }
386 
387  $this->tpl->setContent($this->renderer->render($out));
388  }
389 }
constructModal(?Image $badge_image, string $badge_title, array $badge_properties=[])
readonly ilGlobalTemplateInterface $tpl
getActions(URLBuilder $url_builder, URLBuilderToken $action_parameter_token, URLBuilderToken $row_id_token,)
renderModal(Modal $modal)
__construct(int $parent_obj_id, string $parent_obj_type, protected bool $has_write=false)
$url
Definition: shib_logout.php:63
readonly ILIAS Refinery Factory $refinery
readonly ilBadgeImage $badge_image_service
static http()
Fetches the global http state from ILIAS.
static getExtendedTypeCaption(ilBadgeType $a_type)
getTotalRowCount(?array $filter_data, ?array $additional_parameters)
Mainly for the purpose of pagination-support, it is important to know about the total number of recor...
getRows(DataRowBuilder $row_builder, array $visible_column_ids, Range $range, Order $order, ?array $filter_data, ?array $additional_parameters)
static getInstancesByParentId(int $a_parent_id, array $a_filter=null)
$out
Definition: buildRTE.php:24
global $DIC
Definition: shib_login.php:25
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41
readonly ServerRequestInterface RequestInterface $request
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:24
enrichRecord(ModalBuilder $modal_builder, array $record)
renderShyButton(string $label, Modal $modal)
const DESC
Definition: Order.php:15
readonly ILIAS ResourceStorage Services $irss