Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 95
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzKarteDetail
0.00% covered (danger)
0.00%
0 / 95
0.00% covered (danger)
0.00%
0 / 3
182
0.00% covered (danger)
0.00%
0 / 1
 hasAccess
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 searchSqlWhenHasAccess
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
2
 getHtmlWhenHasAccess
0.00% covered (danger)
0.00%
0 / 80
0.00% covered (danger)
0.00%
0 / 1
132
1<?php
2
3namespace Olz\Karten\Components\OlzKarteDetail;
4
5use Olz\Components\Common\OlzEditableText\OlzEditableText;
6use Olz\Components\Common\OlzLocationMap\OlzLocationMap;
7use Olz\Components\Common\OlzRootComponent;
8use Olz\Components\Page\OlzFooter\OlzFooter;
9use Olz\Components\Page\OlzHeader\OlzHeader;
10use Olz\Entity\Karten\Karte;
11use Olz\Repository\Snippets\PredefinedSnippet;
12
13/** @extends OlzRootComponent<array<string, mixed>> */
14class OlzKarteDetail extends OlzRootComponent {
15    public function hasAccess(): bool {
16        return true;
17    }
18
19    public function searchSqlWhenHasAccess(array $terms): string|array|null {
20        $code_href = $this->envUtils()->getCodeHref();
21        $pretty_typ_sql = <<<'ZZZZZZZZZZ'
22            CASE 
23                WHEN k.typ = 'ol' THEN 'OL-Karte'
24                WHEN k.typ = 'stadt' THEN 'Stadt-OL-Karte'
25                WHEN k.typ = 'scool' THEN 'Schulhaus-Karte'
26                ELSE k.typ
27            END
28            ZZZZZZZZZZ;
29        $where = implode(' AND ', array_map(
30            fn ($term) => "(k.name LIKE '%{$term}%' OR k.ort LIKE '%{$term}%')",
31            $terms,
32        ));
33        return <<<ZZZZZZZZZZ
34            SELECT
35                CONCAT('{$code_href}karten/', k.id) AS link,
36                '{$code_href}assets/icns/link_map_16.svg' AS icon,
37                NULL AS date,
38                CONCAT({$pretty_typ_sql}, ': ', k.name) AS title,
39                k.ort AS text,
40                1.0 AS time_relevance
41            FROM karten k
42            WHERE
43                k.on_off = '1' AND {$where}
44            ZZZZZZZZZZ;
45    }
46
47    public function getHtmlWhenHasAccess(mixed $args): string {
48        $code_href = $this->envUtils()->getCodeHref();
49        $data_href = $this->envUtils()->getDataHref();
50        $karten_repo = $this->entityManager()->getRepository(Karte::class);
51        $user = $this->authUtils()->getCurrentUser();
52        $id = $args['id'] ?? null;
53
54        $karte = $karten_repo->findOneBy([
55            'id' => $id,
56            'on_off' => 1,
57        ]);
58
59        if (!$karte) {
60            $this->httpUtils()->dieWithHttpError(404);
61            throw new \Exception('should already have failed');
62        }
63
64        $name = $karte->getName();
65        $kind = $karte->getKind();
66        $scale = $karte->getScale();
67        $year = $karte->getYear();
68        $place = $karte->getPlace();
69        $kartennr = $karte->getKartenNr();
70        $latitude = $karte->getLatitude();
71        $longitude = $karte->getLongitude();
72        $preview_image_id = $karte->getPreviewImageId();
73
74        $pretty_kind = [
75            'ol' => "🌳 Wald-OL-Karte",
76            'stadt' => "🏘️ Stadt-OL-Karte",
77            'scool' => "🏫 sCOOL-Schulhaus-Karte",
78        ][$kind] ?? "Unbekannter Kartentyp";
79
80        $title = $karte->getName();
81        $back_link = "{$code_href}karten";
82        $maybe_place = $place ? "Ort: {$place}" : '';
83        $out = OlzHeader::render([
84            'back_link' => $back_link,
85            'title' => "{$title} - Karten",
86            'description' => "OL-Karte {$name} ({$pretty_kind}), Masstab: {$scale}, Stand {$year}{$maybe_place}Herausgeber: OL Zimmerberg.",
87        ]);
88
89        $out .= <<<'ZZZZZZZZZZ'
90            <div class='content-right'>
91            </div>
92            <div class='content-middle'>
93            ZZZZZZZZZZ;
94        $out .= "<div class='olz-karte-detail'>";
95
96        $out .= OlzLocationMap::render([
97            'name' => $name,
98            'latitude' => $latitude,
99            'longitude' => $longitude,
100            'zoom' => 12,
101        ]);
102
103        // Editing Tools
104        $is_owner = $user && intval($karte->getOwnerUser()?->getId() ?? 0) === intval($user->getId());
105        $has_karten_permissions = $this->authUtils()->hasPermission('karten');
106        $can_edit = $is_owner || $has_karten_permissions;
107        if ($can_edit) {
108            $json_id = json_encode($id);
109            $out .= <<<ZZZZZZZZZZ
110                <div>
111                    <button
112                        id='edit-karte-button'
113                        class='btn btn-primary'
114                        onclick='return olz.editKarte({$json_id})'
115                    >
116                        <img src='{$code_href}assets/icns/edit_white_16.svg' class='noborder' />
117                        Bearbeiten
118                    </button>
119                </div>
120                ZZZZZZZZZZ;
121        }
122
123        $maybe_place = $place ? "<div>Ort: {$place}</div>" : '';
124
125        $maybe_solv_link = '';
126        if ($kartennr) {
127            // SOLV-Kartenverzeichnis-Link zeigen
128            $maybe_solv_link .= "<div><a href='https://www.swiss-orienteering.ch/karten/kartedetail.php?kid={$kartennr}' target='_blank' class='linkol'>SOLV Karten-Nr. {$kartennr}</a></div>\n";
129        }
130
131        $maybe_omap_link = '';
132        if ($latitude !== null && $longitude !== null) {
133            // OMap-Kartenverzeichnis-Link zeigen
134            $maybe_omap_link .= "<div><a href='https://omap.ch/map.php#7/{$latitude}/{$longitude}' target='_blank' class='linkol'>Karte auf omap.ch</a></div>\n";
135        }
136
137        $out .= <<<ZZZZZZZZZZ
138            <h1>OL-Karte {$name}</h1>
139            <div><b>{$pretty_kind}</b></div>
140            <div>Masstab: {$scale}</div>
141            <div>Stand: {$year}</div>
142            {$maybe_place}
143            {$maybe_solv_link}
144            {$maybe_omap_link}
145            <div>Herausgeber: OL Zimmerberg</div>
146            ZZZZZZZZZZ;
147
148        if ($preview_image_id) {
149            $img_href = "{$data_href}img/karten/{$id}/img/{$preview_image_id}";
150
151            $out .= <<<ZZZZZZZZZZ
152                <h3>Vorschau</h3>
153                <div class='olz-karte-preview'>
154                    <img
155                        src='{$img_href}'
156                        alt='OL-Karte {$name}'
157                        class='noborder'
158                    />
159                </div>
160                ZZZZZZZZZZ;
161        }
162
163        $out .= "<h2>Kartenverkauf</h2>";
164        $out .= OlzEditableText::render(['snippet' => PredefinedSnippet::KartenVerkauf]);
165
166        $out .= "</div>"; // olz-karte-detail
167        $out .= "</div>"; // content-middle
168
169        $out .= OlzFooter::render();
170
171        return $out;
172    }
173}