Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 99
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzKarteDetail
0.00% covered (danger)
0.00%
0 / 99
0.00% covered (danger)
0.00%
0 / 5
240
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
 getPageTitle
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getPageDescription
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getHtmlWhenHasAccess
0.00% covered (danger)
0.00%
0 / 82
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 getPageTitle(): string {
48        return "";
49    }
50
51    public function getPageDescription(): string {
52        return "";
53    }
54
55    public function getHtmlWhenHasAccess(mixed $args): string {
56        $code_href = $this->envUtils()->getCodeHref();
57        $data_href = $this->envUtils()->getDataHref();
58        $karten_repo = $this->entityManager()->getRepository(Karte::class);
59        $user = $this->authUtils()->getCurrentUser();
60        $id = $args['id'] ?? null;
61
62        $karte = $karten_repo->findOneBy([
63            'id' => $id,
64            'on_off' => 1,
65        ]);
66
67        if (!$karte) {
68            $this->httpUtils()->dieWithHttpError(404);
69            throw new \Exception('should already have failed');
70        }
71
72        $name = $karte->getName();
73        $kind = $karte->getKind();
74        $scale = $karte->getScale();
75        $year = $karte->getYear();
76        $place = $karte->getPlace();
77        $kartennr = $karte->getKartenNr();
78        $latitude = $karte->getLatitude();
79        $longitude = $karte->getLongitude();
80        $preview_image_id = $karte->getPreviewImageId();
81
82        $pretty_kind = [
83            'ol' => "🌳 Wald-OL-Karte",
84            'stadt' => "🏘️ Stadt-OL-Karte",
85            'scool' => "🏫 sCOOL-Schulhaus-Karte",
86        ][$kind] ?? "Unbekannter Kartentyp";
87
88        $title = $karte->getName();
89        $back_link = "{$code_href}karten";
90        $maybe_place = $place ? "Ort: {$place}" : '';
91        $out = OlzHeader::render([
92            'back_link' => $back_link,
93            'title' => "{$title} - Karten",
94            'description' => "OL-Karte {$name} ({$pretty_kind}), Masstab: {$scale}, Stand {$year}{$maybe_place}Herausgeber: OL Zimmerberg.",
95        ]);
96
97        $out .= <<<'ZZZZZZZZZZ'
98            <div class='content-right'>
99            </div>
100            <div class='content-middle'>
101            ZZZZZZZZZZ;
102        $out .= "<div class='olz-karte-detail'>";
103
104        $out .= OlzLocationMap::render([
105            'name' => $name,
106            'latitude' => $latitude,
107            'longitude' => $longitude,
108            'zoom' => 12,
109        ]);
110
111        // Editing Tools
112        $is_owner = $user && intval($karte->getOwnerUser()?->getId() ?? 0) === intval($user->getId());
113        $has_karten_permissions = $this->authUtils()->hasPermission('karten');
114        $can_edit = $is_owner || $has_karten_permissions;
115        if ($can_edit) {
116            $json_id = json_encode($id);
117            $out .= <<<ZZZZZZZZZZ
118                <div>
119                    <button
120                        id='edit-karte-button'
121                        class='btn btn-primary'
122                        onclick='return olz.editKarte({$json_id})'
123                    >
124                        <img src='{$code_href}assets/icns/edit_white_16.svg' class='noborder' />
125                        Bearbeiten
126                    </button>
127                </div>
128                ZZZZZZZZZZ;
129        }
130
131        $maybe_place = $place ? "<div>Ort: {$place}</div>" : '';
132
133        $maybe_solv_link = '';
134        if ($kartennr) {
135            // SOLV-Kartenverzeichnis-Link zeigen
136            $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";
137        }
138
139        $maybe_omap_link = '';
140        if ($latitude !== null && $longitude !== null) {
141            // OMap-Kartenverzeichnis-Link zeigen
142            $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";
143        }
144
145        $out .= <<<ZZZZZZZZZZ
146            <h1>OL-Karte {$name}</h1>
147            <div><b>{$pretty_kind}</b></div>
148            <div>Masstab: {$scale}</div>
149            <div>Stand: {$year}</div>
150            {$maybe_place}
151            {$maybe_solv_link}
152            {$maybe_omap_link}
153            <div>Herausgeber: OL Zimmerberg</div>
154            ZZZZZZZZZZ;
155
156        if ($preview_image_id) {
157            $img_href = "{$data_href}img/karten/{$id}/img/{$preview_image_id}";
158
159            $out .= <<<ZZZZZZZZZZ
160                <h3>Vorschau</h3>
161                <div class='olz-karte-preview'>
162                    <img
163                        src='{$img_href}'
164                        alt='OL-Karte {$name}'
165                        class='noborder'
166                    />
167                </div>
168                ZZZZZZZZZZ;
169        }
170
171        $out .= "<h2>Kartenverkauf</h2>";
172        $out .= OlzEditableText::render(['snippet' => PredefinedSnippet::KartenVerkauf]);
173
174        $out .= "</div>"; // olz-karte-detail
175        $out .= "</div>"; // content-middle
176
177        $out .= OlzFooter::render();
178
179        return $out;
180    }
181}