Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 91 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 1 |
OlzTermineListItem | |
0.00% |
0 / 91 |
|
0.00% |
0 / 2 |
506 | |
0.00% |
0 / 1 |
getHtml | |
0.00% |
0 / 88 |
|
0.00% |
0 / 1 |
342 | |||
getTimeText | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
20 |
1 | <?php |
2 | |
3 | namespace Olz\Termine\Components\OlzTermineListItem; |
4 | |
5 | use Olz\Components\Common\OlzComponent; |
6 | use Olz\Entity\Termine\TerminLabel; |
7 | use Olz\Termine\Components\OlzDateCalendar\OlzDateCalendar; |
8 | use Olz\Termine\Utils\TermineFilterUtils; |
9 | |
10 | /** @extends OlzComponent<array<string, mixed>> */ |
11 | class OlzTermineListItem extends OlzComponent { |
12 | public function getHtml(mixed $args): string { |
13 | $db = $this->dbUtils()->getDb(); |
14 | $code_path = $this->envUtils()->getCodePath(); |
15 | $code_href = $this->envUtils()->getCodeHref(); |
16 | $termine_utils = TermineFilterUtils::fromEnv()->loadTypeOptions(); |
17 | |
18 | $out = ''; |
19 | $current_filter = json_decode($_GET['filter'] ?? '{}', true); |
20 | $filter_arg = ''; |
21 | if ($current_filter !== $termine_utils->getDefaultFilter()) { |
22 | $enc_current_filter = urlencode($_GET['filter'] ?? '{}'); |
23 | $filter_arg = "?filter={$enc_current_filter}"; |
24 | } |
25 | |
26 | $id = $args['id']; |
27 | $owner_user_id = $args['owner_user_id']; |
28 | $start_date = $args['start_date']; |
29 | $start_time = $args['start_time']; |
30 | $end_date = $args['end_date']; |
31 | $end_time = $args['end_time']; |
32 | $title = $args['title']; |
33 | $text = $args['text']; |
34 | $labels = $args['labels']; |
35 | $termin_location_id = $args['location_id']; |
36 | $image_ids = $args['image_ids']; |
37 | $is_deadline = count($labels) > 0 && $labels[0]->getIdent() === 'meldeschluss'; |
38 | |
39 | $link = "{$code_href}termine/{$id}{$filter_arg}"; |
40 | $type_imgs = implode('', array_map(function (TerminLabel $label) use ($code_path, $code_href) { |
41 | $ident = $label->getIdent(); |
42 | // TODO: Remove fallback mechanism? |
43 | $fallback_path = "{$code_path}assets/icns/termine_type_{$ident}_20.svg"; |
44 | $fallback_href = is_file($fallback_path) |
45 | ? "{$code_href}assets/icns/termine_type_{$ident}_20.svg" : null; |
46 | $icon_href = $label->getIcon() ? $label->getFileHref($label->getIcon()) : $fallback_href; |
47 | return $icon_href ? "<img src='{$icon_href}' alt='' class='type-icon'>" : ''; |
48 | }, $labels)); |
49 | $start_icon = OlzDateCalendar::render([ |
50 | 'date' => $start_date, |
51 | 'size' => 'S', |
52 | ]); |
53 | $end_icon = ($end_date && $end_date !== $start_date) |
54 | ? ' – '.OlzDateCalendar::render([ |
55 | 'date' => $end_date, |
56 | 'size' => 'S', |
57 | ]) |
58 | : null; |
59 | $start_time_text = $this->getTimeText($start_time); |
60 | if ($is_deadline && $start_time_text === '23:59') { |
61 | $start_time_text = null; |
62 | } |
63 | $end_time_text = $this->getTimeText($end_time); |
64 | $time_text = $start_time_text ? ( |
65 | $end_time_text |
66 | ? "{$start_time_text} – {$end_time_text}" |
67 | : "{$start_time_text}" |
68 | ) : null; |
69 | if ($termin_location_id) { |
70 | $sane_termin_location_id = intval($termin_location_id); |
71 | $result_location = $db->query("SELECT name FROM termin_locations WHERE id='{$sane_termin_location_id}'"); |
72 | // @phpstan-ignore-next-line |
73 | $row_location = $result_location->fetch_assoc(); |
74 | $location_name = $row_location['name'] ?? null; |
75 | $text = "{$location_name} {$text}"; |
76 | } |
77 | $text = strip_tags($this->htmlUtils()->renderMarkdown($text)); |
78 | $image = ''; |
79 | if (count($image_ids ?? []) > 0) { |
80 | $image = $this->imageUtils()->olzImage( |
81 | 'termine', |
82 | $id, |
83 | $image_ids[0], |
84 | 64, |
85 | 'image' |
86 | ); |
87 | } |
88 | |
89 | $user = $this->authUtils()->getCurrentUser(); |
90 | $is_owner = $user && $owner_user_id && intval($owner_user_id) === intval($user->getId()); |
91 | $has_all_permissions = $this->authUtils()->hasPermission('all'); |
92 | $can_edit = $is_owner || $has_all_permissions; |
93 | $edit_admin = ''; |
94 | if ($can_edit) { |
95 | $json_id = json_encode($id); |
96 | $edit_admin = <<<ZZZZZZZZZZ |
97 | <button |
98 | class='btn btn-secondary-outline btn-sm edit-termin-list-button' |
99 | onclick='return olz.termineListItemEditTermin({$json_id})' |
100 | > |
101 | <img src='{$code_href}assets/icns/edit_16.svg' class='noborder' /> |
102 | </button> |
103 | ZZZZZZZZZZ; |
104 | } |
105 | |
106 | $out .= <<<ZZZZZZZZZZ |
107 | <div class='olz-termine-list-item'> |
108 | <a class='link' href='{$link}'></a> |
109 | <div class='content'> |
110 | <div class='date-container'> |
111 | <div class='date-calendars'>{$start_icon}{$end_icon}</div> |
112 | <div class='time-text'>{$time_text}</div> |
113 | </div> |
114 | <div class='title-text-container'> |
115 | <div class='title'>{$title}{$edit_admin} {$type_imgs}</div> |
116 | <div class='text'>{$text}</div> |
117 | </div> |
118 | <div class='image-container'> |
119 | {$image} |
120 | </div> |
121 | </div> |
122 | </div> |
123 | ZZZZZZZZZZ; |
124 | return $out; |
125 | } |
126 | |
127 | protected function getTimeText(?string $iso_time): ?string { |
128 | if (!$iso_time || $iso_time === '00:00:00') { |
129 | return null; |
130 | } |
131 | return date("H:i", strtotime($iso_time) ?: 0); |
132 | } |
133 | } |