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