Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 148
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzRolePageParams
n/a
0 / 0
n/a
0 / 0
0
n/a
0 / 0
OlzRolePage
0.00% covered (danger)
0.00%
0 / 148
0.00% covered (danger)
0.00%
0 / 4
600
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
 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
 getHtmlWhenHasAccess
0.00% covered (danger)
0.00%
0 / 132
0.00% covered (danger)
0.00%
0 / 1
342
1<?php
2
3namespace Olz\Roles\Components\OlzRolePage;
4
5use Olz\Components\Common\OlzRootComponent;
6use Olz\Components\Page\OlzFooter\OlzFooter;
7use Olz\Components\Page\OlzHeader\OlzHeader;
8use Olz\Entity\Roles\Role;
9use Olz\Users\Components\OlzUserInfoModal\OlzUserInfoModal;
10use Olz\Utils\HttpParams;
11
12/** @extends HttpParams<array{von?: ?string}> */
13class OlzRolePageParams extends HttpParams {
14}
15
16/** @extends OlzRootComponent<array<string, mixed>> */
17class OlzRolePage extends OlzRootComponent {
18    public function hasAccess(): bool {
19        return true;
20    }
21
22    public function getSearchTitle(): string {
23        return 'Ressorts';
24    }
25
26    public function getSearchResults(array $terms): array {
27        $results = [];
28        $code_href = $this->envUtils()->getCodeHref();
29        $role_repo = $this->entityManager()->getRepository(Role::class);
30        $roles = $role_repo->search($terms);
31        foreach ($roles as $role) {
32            $ident = $role->getUsername();
33            $results[] = $this->searchUtils()->getScoredSearchResult([
34                'link' => "{$code_href}verein/{$ident}",
35                'icon' => "{$code_href}assets/icns/link_role_16.svg",
36                'date' => null,
37                'title' => $role->getName() ?: '?',
38                'text' => strip_tags("{$role->getUsername()} {$role->getOldUsername()} {$role->getDescription()}") ?: null,
39            ], $terms);
40        }
41        return $results;
42    }
43
44    public function getHtmlWhenHasAccess(mixed $args): string {
45        $this->httpUtils()->validateGetParams(OlzRolePageParams::class);
46        $is_member = $this->authUtils()->hasPermission('member');
47        $entityManager = $this->dbUtils()->getEntityManager();
48        $code_href = $this->envUtils()->getCodeHref();
49        $role_repo = $entityManager->getRepository(Role::class);
50        $role_username = $args['ressort'];
51        $role_repo = $entityManager->getRepository(Role::class);
52        $role = $role_repo->findOneBy(['username' => $role_username, 'on_off' => 1]);
53
54        if (!$role) {
55            $this->httpUtils()->dieWithHttpError(404);
56            throw new \Exception('should already have failed');
57        }
58
59        // TODO: Remove again, after all ressort descriptions have been updated.
60        // This is just temporary logic!
61        $no_robots = ($role->getGuide() === '');
62
63        $role_description = $role->getDescription();
64        $end_of_first_line = strpos($role_description, "\n");
65        $first_line = $end_of_first_line
66            ? substr($role_description, 0, $end_of_first_line)
67            : $role_description;
68        $description_html = $this->htmlUtils()->renderMarkdown($first_line);
69        $role_short_description = strip_tags($description_html);
70
71        $role_id = $role->getId();
72        $role_name = $role->getName();
73        $role_description = $role->getDescription();
74        $parent_role_id = $role->getParentRoleId();
75        $parent_role = $role_repo->findOneBy(['id' => $parent_role_id]);
76        $can_have_child_roles = $role->getCanHaveChildRoles();
77
78        $parent_chain = [];
79        $parent = $role;
80        while ($parent) {
81            $parent_id = $parent->getParentRoleId();
82            if ($parent_id) {
83                $parent = $role_repo->findOneBy(['id' => $parent_id]);
84                array_unshift($parent_chain, $parent);
85            } else {
86                $parent = null;
87            }
88        }
89
90        $out = OlzHeader::render([
91            'back_link' => "{$code_href}verein",
92            'title' => $role_name,
93            'description' => "{$role_short_description} - Ressort {$role_name} der OL Zimmerberg.",
94            'norobots' => $no_robots,
95            'canonical_url' => "{$code_href}verein/{$role_username}",
96        ]);
97
98        $out .= "<div class='content-full olz-role-page'>";
99        $out .= "<nav aria-label='breadcrumb'>";
100        $out .= "<ol class='breadcrumb'>";
101        $out .= "<li class='breadcrumb-item'><a href='{$code_href}verein'>OL Zimmerberg</a></li>";
102        foreach ($parent_chain as $breadcrumb) {
103            $username = $breadcrumb?->getUsername();
104            $name = $breadcrumb?->getName();
105            $out .= "<li class='breadcrumb-item'><a href='{$code_href}verein/{$username}'>{$name}</a></li>";
106        }
107        $out .= "<li class='breadcrumb-item active' aria-current='page'>{$role_name}</li>";
108        $out .= "</ol>";
109        $out .= "</nav>";
110
111        $edit_admin = '';
112        $add_membership_admin = '';
113        $add_child_role_admin = '';
114        $is_parent_superior = $this->authUtils()->hasRoleEditPermission($parent_role_id);
115        $is_parent_owner = $parent_role && $this->entityUtils()->canUpdateOlzEntity($parent_role, null, 'roles');
116        $can_parent_edit = $is_parent_superior || $is_parent_owner;
117        $is_superior = $this->authUtils()->hasRoleEditPermission($role_id);
118        $is_owner = $this->entityUtils()->canUpdateOlzEntity($role, null, 'roles');
119        $can_edit = $is_superior || $is_owner;
120        if ($can_edit) {
121            $json_id = json_encode($role_id);
122            $json_can_parent_edit = json_encode(boolval($can_parent_edit));
123            $edit_admin = <<<ZZZZZZZZZZ
124                <div>
125                    <button
126                        id='edit-role-button'
127                        class='btn btn-primary'
128                        onclick='return olz.editRole({$json_id}{$json_can_parent_edit})'
129                    >
130                        <img src='{$code_href}assets/icns/edit_white_16.svg' class='noborder' />
131                        Bearbeiten
132                    </button>
133                </div>
134                ZZZZZZZZZZ;
135            $add_membership_admin = <<<ZZZZZZZZZZ
136                <div>
137                    <button
138                        id='add-role-user-button'
139                        class='btn btn-primary'
140                        onclick='return olz.addRoleUser({$json_id})'
141                    >
142                        <img src='{$code_href}assets/icns/new_white_16.svg' class='noborder' />
143                        Neuer Verantwortlicher
144                    </button>
145                </div>
146                ZZZZZZZZZZ;
147            if ($can_have_child_roles) {
148                $add_child_role_admin = <<<ZZZZZZZZZZ
149                    <div>
150                        <button
151                            id='add-sub-role-button'
152                            class='btn btn-primary'
153                            onclick='return olz.addChildRole({$json_id})'
154                        >
155                            <img src='{$code_href}assets/icns/new_white_16.svg' class='noborder' />
156                            Neues Unter-Ressort
157                        </button>
158                    </div>
159                    ZZZZZZZZZZ;
160            }
161        }
162
163        $out .= "<div>{$edit_admin}</div>";
164        $description_html = $this->htmlUtils()->renderMarkdown($role->getDescription());
165        $description_html = $role->replaceImagePaths($description_html);
166        $description_html = $role->replaceFilePaths($description_html);
167        $out .= $description_html;
168
169        $assignees = $role->getUsers();
170        $num_assignees = count($assignees);
171        $out .= "<br/><h2>Verantwortlich</h2>";
172        if ($num_assignees === 0) {
173            $out .= "<p><i>Keine Ressort-Verantwortlichen</i></p>";
174            $out .= $add_membership_admin;
175        } else {
176            $out .= "<div class='role-assignees'>";
177            foreach ($assignees as $assignee) {
178                $out .= "<div class='assignee'>";
179                if ($is_superior || $is_owner) {
180                    $json_role_id = json_encode(intval($role_id));
181                    $json_user_id = json_encode(intval($assignee->getId()));
182                    $out .= <<<ZZZZZZZZZZ
183                            <button
184                                id='delete-role-user-button'
185                                class='btn btn-danger'
186                                onclick='return olz.deleteRoleUser({$json_role_id}{$json_user_id})'
187                            >
188                                <img src='{$code_href}assets/icns/delete_white_16.svg' class='noborder' />
189                                Entfernen
190                            </button>
191                        ZZZZZZZZZZ;
192                }
193                $out .= OlzUserInfoModal::render([
194                    'user' => $assignee,
195                    'mode' => 'name_picture',
196                ]);
197                $out .= "</div>";
198            }
199            $out .= $add_membership_admin;
200            $out .= "</div>";
201        }
202
203        $child_roles = $role_repo->findBy([
204            'parent_role' => $role_id,
205            'on_off' => 1,
206        ], ['position_within_parent' => 'ASC']);
207        $num_child_roles = count($child_roles);
208        $out .= "<br/><h2>Unter-Ressorts</h2>";
209        if ($num_child_roles === 0) {
210            $out .= "<p id='sub-roles'><i>Keine Unter-Ressorts</i></p>";
211        } else {
212            $out .= "<ul id='sub-roles' class='no-style'>";
213            foreach ($child_roles as $child_role) {
214                $child_role_name = $child_role->getName();
215                $child_role_username = $child_role->getUsername();
216                $out .= "<li><a href='{$code_href}verein/{$child_role_username}' class='linkint'><b>{$child_role_name}</b></a></li>";
217            }
218            $out .= "</ul>";
219            $out .= $add_child_role_admin;
220        }
221
222        if ($is_member) {
223            $guide_html = $this->htmlUtils()->renderMarkdown($role->getGuide());
224            $guide_html = $role->replaceImagePaths($guide_html);
225            $guide_html = $role->replaceFilePaths($guide_html);
226            $out .= "<br/><br/><h2>Aufgaben (nur für OLZ-Mitglieder sichtbar)</h2>";
227            $out .= $guide_html;
228        }
229
230        $out .= "</div>";
231        $out .= OlzFooter::render();
232
233        return $out;
234    }
235}