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
272
0.00% covered (danger)
0.00%
0 / 1
 getSearchTitle
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSearchResults
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
20
 getHtml
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;
11
12/** @extends OlzRootComponent<array<string, mixed>> */
13class OlzKarteDetail extends OlzRootComponent {
14    public function getSearchTitle(): string {
15        return 'Karten';
16    }
17
18    public function getSearchResults(array $terms): array {
19        $results = [];
20        $code_href = $this->envUtils()->getCodeHref();
21        $karte_repo = $this->entityManager()->getRepository(Karte::class);
22        $karten = $karte_repo->search($terms);
23        foreach ($karten as $karte) {
24            $id = $karte->getId();
25            $results[] = $this->searchUtils()->getScoredSearchResult([
26                'link' => "{$code_href}karten/{$id}",
27                'icon' => "{$code_href}assets/icns/link_map_16.svg",
28                'date' => null,
29                'title' => $karte->getName() ?: '?',
30                'text' => $karte->getPlace() ?: null,
31            ], $terms);
32        }
33        return $results;
34    }
35
36    public function getHtml(mixed $args): string {
37        $code_href = $this->envUtils()->getCodeHref();
38        $data_href = $this->envUtils()->getDataHref();
39        $karten_repo = $this->entityManager()->getRepository(Karte::class);
40        $user = $this->authUtils()->getCurrentUser();
41        $id = $args['id'] ?? null;
42
43        $karte = $karten_repo->findOneBy([
44            'id' => $id,
45            'on_off' => 1,
46        ]);
47
48        if (!$karte) {
49            $this->httpUtils()->dieWithHttpError(404);
50            throw new \Exception('should already have failed');
51        }
52
53        $name = $karte->getName();
54        $kind = $karte->getKind();
55        $scale = $karte->getScale();
56        $year = $karte->getYear();
57        $place = $karte->getPlace();
58        $kartennr = $karte->getKartenNr();
59        $latitude = $karte->getLatitude();
60        $longitude = $karte->getLongitude();
61        $preview_image_id = $karte->getPreviewImageId();
62
63        $pretty_kind = [
64            'ol' => "🌳 Wald-OL-Karte",
65            'stadt' => "🏘️ Stadt-OL-Karte",
66            'scool' => "🏫 sCOOL-Schulhaus-Karte",
67        ][$kind] ?? "Unbekannter Kartentyp";
68
69        $title = $karte->getName();
70        $back_link = "{$code_href}karten";
71        $maybe_place = $place ? "Ort: {$place}" : '';
72        $out = OlzHeader::render([
73            'back_link' => $back_link,
74            'title' => "{$title} - Karten",
75            'description' => "OL-Karte {$name} ({$pretty_kind}), Masstab: {$scale}, Stand {$year}{$maybe_place}Herausgeber: OL Zimmerberg.",
76        ]);
77
78        $out .= <<<'ZZZZZZZZZZ'
79            <div class='content-right'>
80            </div>
81            <div class='content-middle'>
82            ZZZZZZZZZZ;
83        $out .= "<div class='olz-karte-detail'>";
84
85        $out .= OlzLocationMap::render([
86            'name' => $name,
87            'latitude' => $latitude,
88            'longitude' => $longitude,
89            'zoom' => 12,
90        ]);
91
92        // Editing Tools
93        $is_owner = $user && intval($karte->getOwnerUser()?->getId() ?? 0) === intval($user->getId());
94        $has_karten_permissions = $this->authUtils()->hasPermission('karten');
95        $can_edit = $is_owner || $has_karten_permissions;
96        if ($can_edit) {
97            $json_id = json_encode($id);
98            $out .= <<<ZZZZZZZZZZ
99                <div>
100                    <button
101                        id='edit-karte-button'
102                        class='btn btn-primary'
103                        onclick='return olz.editKarte({$json_id})'
104                    >
105                        <img src='{$code_href}assets/icns/edit_white_16.svg' class='noborder' />
106                        Bearbeiten
107                    </button>
108                </div>
109                ZZZZZZZZZZ;
110        }
111
112        $maybe_place = $place ? "<div>Ort: {$place}</div>" : '';
113
114        $maybe_solv_link = '';
115        if ($kartennr) {
116            // SOLV-Kartenverzeichnis-Link zeigen
117            $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";
118        }
119
120        $maybe_omap_link = '';
121        if ($latitude !== null && $longitude !== null) {
122            // OMap-Kartenverzeichnis-Link zeigen
123            $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";
124        }
125
126        $out .= <<<ZZZZZZZZZZ
127            <h1>OL-Karte {$name}</h1>
128            <div><b>{$pretty_kind}</b></div>
129            <div>Masstab: {$scale}</div>
130            <div>Stand: {$year}</div>
131            {$maybe_place}
132            {$maybe_solv_link}
133            {$maybe_omap_link}
134            <div>Herausgeber: OL Zimmerberg</div>
135            ZZZZZZZZZZ;
136
137        if ($preview_image_id) {
138            $img_href = "{$data_href}img/karten/{$id}/img/{$preview_image_id}";
139
140            $out .= <<<ZZZZZZZZZZ
141                <h3>Vorschau</h3>
142                <div class='olz-karte-preview'>
143                    <img
144                        src='{$img_href}'
145                        alt='OL-Karte {$name}'
146                        class='noborder'
147                    />
148                </div>
149                ZZZZZZZZZZ;
150        }
151
152        $out .= "<h2>Kartenverkauf</h2>";
153        $out .= OlzEditableText::render(['snippet_id' => 12]);
154
155        $out .= "</div>"; // olz-karte-detail
156        $out .= "</div>"; // content-middle
157
158        $out .= OlzFooter::render();
159
160        return $out;
161    }
162}