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