Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 91
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 / 91
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 / 88
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\Termine\Components\OlzDateCalendar\OlzDateCalendar;
8use Olz\Termine\Utils\TermineFilterUtils;
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        $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            ? ' &ndash; '.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} &ndash; {$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}