Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | n/a |
0 / 0 |
n/a |
0 / 0 |
CRAP | n/a |
0 / 0 |
|||
BackendController | n/a |
0 / 0 |
n/a |
0 / 0 |
57 | n/a |
0 / 0 |
|||
viewForgot | n/a |
0 / 0 |
n/a |
0 / 0 |
1 | |||||
viewEmptyCommand | n/a |
0 / 0 |
n/a |
0 / 0 |
1 | |||||
viewAccountList | n/a |
0 / 0 |
n/a |
0 / 0 |
7 | |||||
viewAccountSettings | n/a |
0 / 0 |
n/a |
0 / 0 |
8 | |||||
viewAccountCreate | n/a |
0 / 0 |
n/a |
0 / 0 |
1 | |||||
viewGroupList | n/a |
0 / 0 |
n/a |
0 / 0 |
7 | |||||
viewGroupSettings | n/a |
0 / 0 |
n/a |
0 / 0 |
3 | |||||
viewGroupCreate | n/a |
0 / 0 |
n/a |
0 / 0 |
1 | |||||
viewModuleList | n/a |
0 / 0 |
n/a |
0 / 0 |
2 | |||||
viewModuleInfo | n/a |
0 / 0 |
n/a |
0 / 0 |
6 | |||||
viewModuleLog | n/a |
0 / 0 |
n/a |
0 / 0 |
3 | |||||
viewModuleRouteList | n/a |
0 / 0 |
n/a |
0 / 0 |
6 | |||||
viewModuleHookList | n/a |
0 / 0 |
n/a |
0 / 0 |
6 | |||||
viewModuleSettings | n/a |
0 / 0 |
n/a |
0 / 0 |
5 |
1 | <?php |
2 | /** |
3 | * Jingga |
4 | * |
5 | * PHP Version 8.1 |
6 | * |
7 | * @package Modules\Admin |
8 | * @copyright Dennis Eichhorn |
9 | * @license OMS License 2.0 |
10 | * @version 1.0.0 |
11 | * @link https://jingga.app |
12 | */ |
13 | declare(strict_types=1); |
14 | |
15 | namespace Modules\Admin\Controller; |
16 | |
17 | use Model\SettingMapper; |
18 | use Modules\Admin\Models\AccountMapper; |
19 | use Modules\Admin\Models\AccountPermissionMapper; |
20 | use Modules\Admin\Models\AppMapper; |
21 | use Modules\Admin\Models\GroupMapper; |
22 | use Modules\Admin\Models\GroupPermissionMapper; |
23 | use Modules\Admin\Models\LocalizationMapper; |
24 | use Modules\Admin\Models\ModuleMapper; |
25 | use Modules\Admin\Models\SettingsEnum; |
26 | use Modules\Auditor\Models\AuditMapper; |
27 | use Modules\Media\Models\MediaMapper; |
28 | use Modules\Organization\Models\UnitMapper; |
29 | use phpOMS\Asset\AssetType; |
30 | use phpOMS\Autoloader; |
31 | use phpOMS\Contract\RenderableInterface; |
32 | use phpOMS\DataStorage\Database\Query\OrderType; |
33 | use phpOMS\Message\RequestAbstract; |
34 | use phpOMS\Message\ResponseAbstract; |
35 | use phpOMS\Utils\Parser\Markdown\Markdown; |
36 | use phpOMS\Utils\StringUtils; |
37 | use phpOMS\Views\View; |
38 | use Web\Backend\Views\TableView; |
39 | |
40 | /** |
41 | * Admin controller class. |
42 | * |
43 | * This class is responsible for the basic admin activities such as managing accounts, groups, permissions and modules. |
44 | * |
45 | * @package Modules\Admin |
46 | * @license OMS License 2.0 |
47 | * @link https://jingga.app |
48 | * @since 1.0.0 |
49 | * @codeCoverageIgnore |
50 | */ |
51 | final class BackendController extends Controller |
52 | { |
53 | /** |
54 | * Method which shows the password forgotten |
55 | * |
56 | * @param RequestAbstract $request Request |
57 | * @param ResponseAbstract $response Response |
58 | * @param array $data Generic data |
59 | * |
60 | * @return RenderableInterface Response can be rendered |
61 | * |
62 | * @since 1.0.0 |
63 | */ |
64 | public function viewForgot(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
65 | { |
66 | return new View(); |
67 | } |
68 | |
69 | /** |
70 | * Method which generates the general settings view. |
71 | * |
72 | * In this view general settings for the entire application can be seen and adjusted. Settings which can be modified |
73 | * here are localization, password, database, etc. |
74 | * |
75 | * @param RequestAbstract $request Request |
76 | * @param ResponseAbstract $response Response |
77 | * @param array $data Generic data |
78 | * |
79 | * @return RenderableInterface Response can be rendered |
80 | * |
81 | * @since 1.0.0 |
82 | */ |
83 | public function viewEmptyCommand(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
84 | { |
85 | $view = new View($this->app->l11nManager, $request, $response); |
86 | $view->setTemplate('/Modules/Admin/Theme/Cli/empty-command'); |
87 | |
88 | return $view; |
89 | } |
90 | |
91 | /** |
92 | * Method which generates the account list view. |
93 | * |
94 | * @param RequestAbstract $request Request |
95 | * @param ResponseAbstract $response Response |
96 | * @param array $data Generic data |
97 | * |
98 | * @return RenderableInterface Response can be rendered |
99 | * |
100 | * @since 1.0.0 |
101 | */ |
102 | public function viewAccountList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
103 | { |
104 | $view = new View($this->app->l11nManager, $request, $response); |
105 | $view->setTemplate('/Modules/Admin/Theme/Backend/accounts-list'); |
106 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response); |
107 | |
108 | $searchFieldData = $request->getLike('.*\-p\-.*'); |
109 | $searchField = []; |
110 | foreach ($searchFieldData as $key => $data) { |
111 | if ($data === '1') { |
112 | $split = \explode('-', $key); |
113 | $member = \end($split); |
114 | |
115 | $searchField[] = $member; |
116 | } |
117 | } |
118 | |
119 | $filterFieldData = $request->getLike('.*\-f\-.*?\-t'); |
120 | $filterField = []; |
121 | foreach ($filterFieldData as $key => $type) { |
122 | $split = \explode('-', $key); |
123 | \end($split); |
124 | |
125 | $member = \prev($split); |
126 | |
127 | if ($request->hasData('accountslist-f-' . $member . '-f1')) { |
128 | $filterField[$member] = [ |
129 | 'type' => $type, |
130 | 'value1' => $request->getData('accountslist-f-' . $member . '-f1'), |
131 | 'logic1' => $request->getData('accountslist-f-' . $member . '-o1'), |
132 | 'value2' => $request->getData('accountslist-f-' . $member . '-f2'), |
133 | 'logic2' => $request->getData('accountslist-f-' . $member . '-o2'), |
134 | ]; |
135 | } |
136 | } |
137 | |
138 | $pageLimit = 25; |
139 | $view->data['pageLimit'] = $pageLimit; |
140 | |
141 | $mapper = AccountMapper::getAll()->with('createdBy'); |
142 | $list = AccountMapper::find( |
143 | search: $request->getDataString('search'), |
144 | mapper: $mapper, |
145 | id: $request->getDataInt('id') ?? 0, |
146 | secondaryId: $request->getDataString('subid') ?? '', |
147 | type: $request->getDataString('pType'), |
148 | pageLimit: empty($request->getDataInt('limit') ?? 0) ? 100 : ((int) $request->getData('limit')), |
149 | sortBy: $request->getDataString('sort_by') ?? '', |
150 | sortOrder: $request->getDataString('sort_order') ?? OrderType::DESC, |
151 | searchFields: $searchField, |
152 | filters: $filterField |
153 | ); |
154 | |
155 | $view->data['accounts'] = $list['data']; |
156 | |
157 | /** @var \Model\Setting[] $exportTemplates */ |
158 | $exportTemplates = $this->app->appSettings->get( |
159 | names: [ |
160 | SettingsEnum::DEFAULT_LIST_EXPORTS, |
161 | ], |
162 | module: 'Admin' |
163 | ); |
164 | |
165 | $templateIds = []; |
166 | foreach ($exportTemplates as $template) { |
167 | $templateIds[] = (int) $template->content; |
168 | } |
169 | |
170 | /** @var \Modules\Media\Models\Media[] $mediaTemplates */ |
171 | $mediaTemplates = MediaMapper::getAll() |
172 | ->where('id', $templateIds, 'in') |
173 | ->execute(); |
174 | |
175 | $tableView = new TableView($this->app->l11nManager, $request, $response); |
176 | $tableView->module = 'Admin'; |
177 | $tableView->theme = 'Backend'; |
178 | $tableView->setTitleTemplate('/Web/Backend/Themes/table-title'); |
179 | $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data'); |
180 | $tableView->setExportTemplates($mediaTemplates); |
181 | $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table'); |
182 | $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table'); |
183 | $tableView->setSortTemplate('/Web/Backend/Themes/sort-table'); |
184 | $tableView->setData('hasPrevious', $list['hasPrevious']); |
185 | $tableView->setData('hasNext', $list['hasNext']); |
186 | |
187 | $view->data['tableView'] = $tableView; |
188 | |
189 | return $view; |
190 | } |
191 | |
192 | /** |
193 | * Method which generates the account view of a single account. |
194 | * |
195 | * @param RequestAbstract $request Request |
196 | * @param ResponseAbstract $response Response |
197 | * @param array $data Generic data |
198 | * |
199 | * @return RenderableInterface Response can be rendered |
200 | * |
201 | * @since 1.0.0 |
202 | */ |
203 | public function viewAccountSettings(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
204 | { |
205 | $view = new View($this->app->l11nManager, $request, $response); |
206 | $view->setTemplate('/Modules/Admin/Theme/Backend/accounts-single'); |
207 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response); |
208 | |
209 | /** @var \Modules\Admin\Models\Account $account */ |
210 | $account = AccountMapper::get()->with('groups')->with('l11n')->where('id', (int) $request->getData('id'))->execute(); |
211 | if ($account->l11n->id === 0) { |
212 | $account->l11n->loadFromLanguage($request->header->l11n->language); |
213 | } |
214 | |
215 | $view->data['account'] = $account; |
216 | |
217 | /** @var \Modules\Admin\Models\AccountPermission[] $permissions */ |
218 | $permissions = AccountPermissionMapper::getAll() |
219 | ->where('account', (int) $request->getData('id')) |
220 | ->execute(); |
221 | |
222 | $view->data['permissions'] = $permissions; |
223 | |
224 | $view->data['units'] = UnitMapper::getAll()->execute(); |
225 | $view->data['apps'] = AppMapper::getAll()->execute(); |
226 | $view->data['modules'] = ModuleMapper::getAll()->execute(); |
227 | |
228 | $accGrpSelector = new \Modules\Admin\Theme\Backend\Components\GroupTagSelector\GroupTagSelectorView($this->app->l11nManager, $request, $response); |
229 | $view->data['grpSelector'] = $accGrpSelector; |
230 | |
231 | // Auditor log |
232 | $searchFieldData = $request->getLike('.*\-p\-.*'); |
233 | $searchField = []; |
234 | foreach ($searchFieldData as $key => $data) { |
235 | if ($data === '1') { |
236 | $split = \explode('-', $key); |
237 | $member = \end($split); |
238 | |
239 | $searchField[] = $member; |
240 | } |
241 | } |
242 | |
243 | $filterFieldData = $request->getLike('.*\-f\-.*?\-t'); |
244 | $filterField = []; |
245 | foreach ($filterFieldData as $key => $type) { |
246 | $split = \explode('-', $key); |
247 | \end($split); |
248 | |
249 | $member = \prev($split); |
250 | |
251 | if ($request->hasData('auditlist-f-' . $member . '-f1')) { |
252 | $filterField[$member] = [ |
253 | 'type' => $type, |
254 | 'value1' => $request->getData('auditlist-f-' . $member . '-f1'), |
255 | 'logic1' => $request->getData('auditlist-f-' . $member . '-o1'), |
256 | 'value2' => $request->getData('auditlist-f-' . $member . '-f2'), |
257 | 'logic2' => $request->getData('auditlist-f-' . $member . '-o2'), |
258 | ]; |
259 | } |
260 | } |
261 | |
262 | $pageLimit = 25; |
263 | $view->data['pageLimit'] = $pageLimit; |
264 | |
265 | $mapper = AuditMapper::getAll()->with('createdBy'); |
266 | |
267 | /** @var \Modules\Auditor\Models\Audit[] $list */ |
268 | $list = AuditMapper::find( |
269 | search: $request->getDataString('search'), |
270 | mapper: $mapper, |
271 | id: $request->getDataInt('id') ?? 0, |
272 | secondaryId: $request->getDataString('subid') ?? '', |
273 | type: $request->getDataString('pType'), |
274 | pageLimit: empty($request->getDataInt('limit') ?? 0) ? 100 : $request->getDataInt('limit'), |
275 | sortBy: $request->getDataString('sort_by') ?? '', |
276 | sortOrder: $request->getDataString('sort_order') ?? OrderType::DESC, |
277 | searchFields: $searchField, |
278 | filters: $filterField |
279 | ); |
280 | |
281 | $view->data['audits'] = $list['data']; |
282 | |
283 | /** @var \Model\Setting[] $exportTemplates */ |
284 | $exportTemplates = $this->app->appSettings->get( |
285 | names: [SettingsEnum::DEFAULT_LIST_EXPORTS], |
286 | module: 'Admin' |
287 | ); |
288 | |
289 | $templateIds = []; |
290 | foreach ($exportTemplates as $template) { |
291 | $templateIds[] = (int) $template->content; |
292 | } |
293 | |
294 | /** @var \Modules\Media\Models\Media[] $mediaTemplates */ |
295 | $mediaTemplates = MediaMapper::getAll() |
296 | ->where('id', $templateIds, 'in') |
297 | ->execute(); |
298 | |
299 | $tableView = new TableView($this->app->l11nManager, $request, $response); |
300 | $tableView->module = 'Auditor'; |
301 | $tableView->theme = 'Backend'; |
302 | $tableView->setTitleTemplate('/Web/Backend/Themes/table-title'); |
303 | $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data'); |
304 | $tableView->setExportTemplates($mediaTemplates); |
305 | $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table'); |
306 | $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table'); |
307 | $tableView->setSortTemplate('/Web/Backend/Themes/sort-table'); |
308 | $tableView->setData('hasPrevious', $list['hasPrevious']); |
309 | $tableView->setData('hasNext', $list['hasNext']); |
310 | |
311 | $view->data['tableView'] = $tableView; |
312 | |
313 | return $view; |
314 | } |
315 | |
316 | /** |
317 | * Method which generates the create account view. |
318 | * |
319 | * @param RequestAbstract $request Request |
320 | * @param ResponseAbstract $response Response |
321 | * @param array $data Generic data |
322 | * |
323 | * @return RenderableInterface Response can be rendered |
324 | * |
325 | * @since 1.0.0 |
326 | */ |
327 | public function viewAccountCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
328 | { |
329 | $view = new View($this->app->l11nManager, $request, $response); |
330 | $view->setTemplate('/Modules/Admin/Theme/Backend/accounts-create'); |
331 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response); |
332 | |
333 | return $view; |
334 | } |
335 | |
336 | /** |
337 | * Method which generates the group list view. |
338 | * |
339 | * @param RequestAbstract $request Request |
340 | * @param ResponseAbstract $response Response |
341 | * @param array $data Generic data |
342 | * |
343 | * @return RenderableInterface Response can be rendered |
344 | * |
345 | * @since 1.0.0 |
346 | */ |
347 | public function viewGroupList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
348 | { |
349 | $view = new View($this->app->l11nManager, $request, $response); |
350 | $view->setTemplate('/Modules/Admin/Theme/Backend/groups-list'); |
351 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000103001, $request, $response); |
352 | |
353 | $searchFieldData = $request->getLike('.*\-p\-.*'); |
354 | $searchField = []; |
355 | foreach ($searchFieldData as $key => $data) { |
356 | if ($data === '1') { |
357 | $split = \explode('-', $key); |
358 | $member = \end($split); |
359 | |
360 | $searchField[] = $member; |
361 | } |
362 | } |
363 | |
364 | $filterFieldData = $request->getLike('.*\-f\-.*?\-t'); |
365 | $filterField = []; |
366 | foreach ($filterFieldData as $key => $type) { |
367 | $split = \explode('-', $key); |
368 | \end($split); |
369 | |
370 | $member = \prev($split); |
371 | |
372 | if ($request->hasData('groupslist-f-' . $member . '-f1')) { |
373 | $filterField[$member] = [ |
374 | 'type' => $type, |
375 | 'value1' => $request->getData('groupslist-f-' . $member . '-f1'), |
376 | 'logic1' => $request->getData('groupslist-f-' . $member . '-o1'), |
377 | 'value2' => $request->getData('groupslist-f-' . $member . '-f2'), |
378 | 'logic2' => $request->getData('groupslist-f-' . $member . '-o2'), |
379 | ]; |
380 | } |
381 | } |
382 | |
383 | $pageLimit = 25; |
384 | $view->data['pageLimit'] = $pageLimit; |
385 | |
386 | $mapper = GroupMapper::getAll()->with('createdBy'); |
387 | $list = GroupMapper::find( |
388 | search: $request->getDataString('search'), |
389 | mapper: $mapper, |
390 | id: $request->getDataInt('id') ?? 0, |
391 | secondaryId: $request->getDataString('subid') ?? '', |
392 | type: $request->getDataString('pType'), |
393 | pageLimit: empty($request->getDataInt('limit') ?? 0) ? 100 : ((int) $request->getData('limit')), |
394 | sortBy: $request->getDataString('sort_by') ?? '', |
395 | sortOrder: $request->getDataString('sort_order') ?? OrderType::DESC, |
396 | searchFields: $searchField, |
397 | filters: $filterField |
398 | ); |
399 | |
400 | $view->data['groups'] = $list['data']; |
401 | |
402 | $memberCount = GroupMapper::countMembers(); |
403 | $view->data['memberCount'] = $memberCount; |
404 | |
405 | /** @var \Model\Setting[] $exportTemplates */ |
406 | $exportTemplates = $this->app->appSettings->get( |
407 | names: [ |
408 | SettingsEnum::DEFAULT_LIST_EXPORTS, |
409 | ], |
410 | module: 'Admin' |
411 | ); |
412 | |
413 | $templateIds = []; |
414 | foreach ($exportTemplates as $template) { |
415 | $templateIds[] = (int) $template->content; |
416 | } |
417 | |
418 | /** @var \Modules\Media\Models\Media[] $mediaTemplates */ |
419 | $mediaTemplates = MediaMapper::getAll() |
420 | ->where('id', $templateIds, 'in') |
421 | ->execute(); |
422 | |
423 | $tableView = new TableView($this->app->l11nManager, $request, $response); |
424 | $tableView->module = 'Admin'; |
425 | $tableView->theme = 'Backend'; |
426 | $tableView->setTitleTemplate('/Web/Backend/Themes/table-title'); |
427 | $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data'); |
428 | $tableView->setExportTemplates($mediaTemplates); |
429 | $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table'); |
430 | $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table'); |
431 | $tableView->setSortTemplate('/Web/Backend/Themes/sort-table'); |
432 | $tableView->setData('hasPrevious', $list['hasPrevious']); |
433 | $tableView->setData('hasNext', $list['hasNext']); |
434 | |
435 | $view->data['tableView'] = $tableView; |
436 | |
437 | return $view; |
438 | } |
439 | |
440 | /** |
441 | * Method which generates the group view of a single group. |
442 | * |
443 | * @param RequestAbstract $request Request |
444 | * @param ResponseAbstract $response Response |
445 | * @param array $data Generic data |
446 | * |
447 | * @return RenderableInterface Response can be rendered |
448 | * |
449 | * @since 1.0.0 |
450 | */ |
451 | public function viewGroupSettings(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
452 | { |
453 | $view = new View($this->app->l11nManager, $request, $response); |
454 | $view->setTemplate('/Modules/Admin/Theme/Backend/groups-single'); |
455 | |
456 | $view->data['nav'] = $this->app->moduleManager->get('Navigation') |
457 | ->createNavigationMid(1000103001, $request, $response); |
458 | |
459 | $view->data['group'] = GroupMapper::get() |
460 | ->with('accounts') |
461 | ->where('id', (int) $request->getData('id')) |
462 | ->execute(); |
463 | |
464 | /** @var \Modules\Admin\Models\GroupPermission[] $permissions */ |
465 | $permissions = GroupPermissionMapper::getAll() |
466 | ->where('group', (int) $request->getData('id')) |
467 | ->execute(); |
468 | |
469 | $view->data['permissions'] = $permissions; |
470 | |
471 | $view->data['units'] = UnitMapper::getAll()->execute(); |
472 | $view->data['apps'] = AppMapper::getAll()->execute(); |
473 | $view->data['modules'] = ModuleMapper::getAll()->execute(); |
474 | |
475 | $accGrpSelector = new \Modules\Profile\Theme\Backend\Components\AccountGroupSelector\BaseView($this->app->l11nManager, $request, $response); |
476 | $view->data['accGrpSelector'] = $accGrpSelector; |
477 | |
478 | $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); |
479 | $view->data['editor'] = $editor; |
480 | |
481 | $mapperQuery = AuditMapper::getAll() |
482 | ->with('createdBy') |
483 | ->where('module', self::NAME) |
484 | ->where('type', StringUtils::intHash(GroupMapper::class)) |
485 | ->where('ref', $request->getDataString('id') ?? '0') |
486 | ->limit(25); |
487 | |
488 | // audit log |
489 | if ($request->getData('ptype') === 'p') { |
490 | $view->data['auditlogs'] = $mapperQuery->where('id', $request->getDataInt('audit') ?? 0, '<')->limit(25)->execute(); |
491 | } elseif ($request->getData('ptype') === 'n') { |
492 | $view->data['auditlogs'] = $mapperQuery->where('id', $request->getDataInt('audit') ?? 0, '>')->limit(25)->execute(); |
493 | } else { |
494 | $view->data['auditlogs'] = $mapperQuery->where('id', 0, '>')->limit(25)->execute(); |
495 | } |
496 | |
497 | return $view; |
498 | } |
499 | |
500 | /** |
501 | * Method which generates the group create view. |
502 | * |
503 | * @param RequestAbstract $request Request |
504 | * @param ResponseAbstract $response Response |
505 | * @param array $data Generic data |
506 | * |
507 | * @return RenderableInterface Response can be rendered |
508 | * |
509 | * @since 1.0.0 |
510 | */ |
511 | public function viewGroupCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
512 | { |
513 | $view = new View($this->app->l11nManager, $request, $response); |
514 | $view->setTemplate('/Modules/Admin/Theme/Backend/groups-create'); |
515 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000103001, $request, $response); |
516 | |
517 | $editor = new \Modules\Editor\Theme\Backend\Components\Editor\BaseView($this->app->l11nManager, $request, $response); |
518 | $view->data['editor'] = $editor; |
519 | |
520 | return $view; |
521 | } |
522 | |
523 | /** |
524 | * Method which generates the module list view. |
525 | * |
526 | * @param RequestAbstract $request Request |
527 | * @param ResponseAbstract $response Response |
528 | * @param array $data Generic data |
529 | * |
530 | * @return RenderableInterface Response can be rendered |
531 | * |
532 | * @since 1.0.0 |
533 | */ |
534 | public function viewModuleList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
535 | { |
536 | /** @var \phpOMS\Model\Html\Head $head */ |
537 | $head = $response->data['Content']->head; |
538 | $head->addAsset(AssetType::CSS, 'Modules/Admin/Theme/Backend/css/styles.css?v=1.0.0'); |
539 | |
540 | $view = new View($this->app->l11nManager, $request, $response); |
541 | $view->setTemplate('/Modules/Admin/Theme/Backend/modules-list'); |
542 | |
543 | $view->data['modules'] = $this->app->moduleManager->getAllModules(); |
544 | $view->data['active'] = $this->app->moduleManager->getActiveModules(); |
545 | $view->data['installed'] = $this->app->moduleManager->getInstalledModules(); |
546 | |
547 | /** @var \Model\Setting[] $exportTemplates */ |
548 | $exportTemplates = $this->app->appSettings->get( |
549 | names: [ |
550 | SettingsEnum::DEFAULT_LIST_EXPORTS, |
551 | ], |
552 | module: 'Admin' |
553 | ); |
554 | |
555 | $templateIds = []; |
556 | foreach ($exportTemplates as $template) { |
557 | $templateIds[] = (int) $template->content; |
558 | } |
559 | |
560 | /** @var \Modules\Media\Models\Media[] $mediaTemplates */ |
561 | $mediaTemplates = MediaMapper::getAll() |
562 | ->where('id', $templateIds, 'in') |
563 | ->execute(); |
564 | |
565 | $tableView = new TableView($this->app->l11nManager, $request, $response); |
566 | $tableView->module = 'Admin'; |
567 | $tableView->theme = 'Backend'; |
568 | $tableView->setTitleTemplate('/Web/Backend/Themes/table-title'); |
569 | $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data'); |
570 | $tableView->setExportTemplates($mediaTemplates); |
571 | $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table'); |
572 | $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table'); |
573 | $tableView->setSortTemplate('/Web/Backend/Themes/sort-table'); |
574 | |
575 | $view->data['tableView'] = $tableView; |
576 | |
577 | return $view; |
578 | } |
579 | |
580 | /** |
581 | * Method which generates the module profile view. |
582 | * |
583 | * @param RequestAbstract $request Request |
584 | * @param ResponseAbstract $response Response |
585 | * @param array $data Generic data |
586 | * |
587 | * @return RenderableInterface Response can be rendered |
588 | * |
589 | * @since 1.0.0 |
590 | */ |
591 | public function viewModuleInfo(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
592 | { |
593 | $view = new View($this->app->l11nManager, $request, $response); |
594 | $view->setTemplate('/Modules/Admin/Theme/Backend/modules-info'); |
595 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response); |
596 | |
597 | $id = $request->getDataString('id') ?? ''; |
598 | $view->data['modules'] = $this->app->moduleManager->getAllModules(); |
599 | $view->data['active'] = $this->app->moduleManager->getActiveModules(); |
600 | $view->data['installed'] = $this->app->moduleManager->getInstalledModules(); |
601 | $view->data['id'] = $id; |
602 | |
603 | $type = 'Help'; |
604 | $page = 'introduction'; |
605 | $basePath = __DIR__ . '/../../' . $request->getData('id') . '/Docs/' . $type . '/' . $request->header->l11n->language; |
606 | $path = \realpath($basePath . '/' . $page . '.md'); |
607 | |
608 | if ($path === false) { |
609 | $basePath = __DIR__ . '/../../' . $request->getData('id') . '/Docs/' . $type . '/' . $this->app->l11nServer->language; |
610 | $path = \realpath($basePath . '/' . $page . '.md'); |
611 | } |
612 | |
613 | if ($path === false) { |
614 | $basePath = __DIR__ . '/../../' . $request->getData('id') . '/Docs/' . $type . '/en'; |
615 | $path = \realpath($basePath . '/' . $page . '.md'); |
616 | } |
617 | |
618 | if ($path === false) { |
619 | $path = \realpath($basePath . '/introduction.md'); |
620 | } |
621 | |
622 | $toParse = $path === false ? '' : \file_get_contents($path); |
623 | $content = Markdown::parse($toParse === false ? '' : $toParse); |
624 | |
625 | $view->data['introduction'] = $content; |
626 | |
627 | return $view; |
628 | } |
629 | |
630 | /** |
631 | * Method which generates the module profile view. |
632 | * |
633 | * @param RequestAbstract $request Request |
634 | * @param ResponseAbstract $response Response |
635 | * @param array $data Generic data |
636 | * |
637 | * @return RenderableInterface Response can be rendered |
638 | * |
639 | * @since 1.0.0 |
640 | */ |
641 | public function viewModuleLog(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
642 | { |
643 | $view = new View($this->app->l11nManager, $request, $response); |
644 | $view->setTemplate('/Modules/Admin/Theme/Backend/modules-log'); |
645 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response); |
646 | |
647 | $id = $request->getDataString('id') ?? ''; |
648 | |
649 | $queryMapper = AuditMapper::getAll() |
650 | ->with('createdBy') |
651 | ->where('module', $id); |
652 | |
653 | // audit log |
654 | if ($request->getData('ptype') === 'p') { |
655 | $view->data['auditlogs'] = $queryMapper->where('id', (int) $request->getData('audit'), '<')->limit(25)->execute(); |
656 | } elseif ($request->getData('ptype') === 'n') { |
657 | $view->data['auditlogs'] = $queryMapper->where('id', (int) $request->getData('audit'), '>')->limit(25)->execute(); |
658 | } else { |
659 | $view->data['auditlogs'] = $queryMapper->where('id', 0, '>')->limit(25)->execute(); |
660 | } |
661 | |
662 | return $view; |
663 | } |
664 | |
665 | /** |
666 | * Method which generates the module profile view. |
667 | * |
668 | * @param RequestAbstract $request Request |
669 | * @param ResponseAbstract $response Response |
670 | * @param array $data Generic data |
671 | * |
672 | * @return RenderableInterface Response can be rendered |
673 | * |
674 | * @since 1.0.0 |
675 | */ |
676 | public function viewModuleRouteList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
677 | { |
678 | $view = new View($this->app->l11nManager, $request, $response); |
679 | $view->setTemplate('/Modules/Admin/Theme/Backend/modules-route-list'); |
680 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response); |
681 | |
682 | $module = $request->getDataString('id') ?? ''; |
683 | $view->data['module'] = $module; |
684 | |
685 | $appPath = __DIR__ . '/../../../Web'; |
686 | $activeRoutes = []; |
687 | |
688 | $apps = \scandir($appPath); |
689 | if ($apps === false) { |
690 | $apps = []; |
691 | } |
692 | |
693 | foreach ($apps as $app) { |
694 | if (!\is_file(__DIR__ . '/../../../Web/' . $app . '/Routes.php')) { |
695 | continue; |
696 | } |
697 | |
698 | $activeRoutes['Web/' . $app] = include __DIR__ . '/../../../Web/' . $app . '/Routes.php'; |
699 | } |
700 | |
701 | if (\is_file(__DIR__ . '/../../../Cli/Routes.php')) { |
702 | $activeRoutes['Cli'] = include __DIR__ . '/../../../Cli/Routes.php'; |
703 | } |
704 | |
705 | if (\is_file(__DIR__ . '/../../../Socket/Routes.php')) { |
706 | $activeRoutes['Socket'] = include __DIR__ . '/../../../Socket/Routes.php'; |
707 | } |
708 | |
709 | $view->data['routes'] = $activeRoutes; |
710 | |
711 | return $view; |
712 | } |
713 | |
714 | /** |
715 | * Method which generates the module profile view. |
716 | * |
717 | * @param RequestAbstract $request Request |
718 | * @param ResponseAbstract $response Response |
719 | * @param array $data Generic data |
720 | * |
721 | * @return RenderableInterface Response can be rendered |
722 | * |
723 | * @since 1.0.0 |
724 | */ |
725 | public function viewModuleHookList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
726 | { |
727 | $view = new View($this->app->l11nManager, $request, $response); |
728 | $view->setTemplate('/Modules/Admin/Theme/Backend/modules-hook-list'); |
729 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response); |
730 | |
731 | $module = $request->getDataString('id') ?? ''; |
732 | $view->data['module'] = $module; |
733 | |
734 | $appPath = __DIR__ . '/../../../Web'; |
735 | $activeHooks = []; |
736 | |
737 | $apps = \scandir($appPath); |
738 | if ($apps === false) { |
739 | $apps = []; |
740 | } |
741 | |
742 | foreach ($apps as $app) { |
743 | if (!\is_file(__DIR__ . '/../../../Web/' . $app . '/Hooks.php')) { |
744 | continue; |
745 | } |
746 | |
747 | $activeHooks['Web/' . $app] = include __DIR__ . '/../../../Web/' . $app . '/Hooks.php'; |
748 | } |
749 | |
750 | if (\is_file(__DIR__ . '/../../../Cli/Hooks.php')) { |
751 | $activeHooks['Cli'] = include __DIR__ . '/../../../Cli/Hooks.php'; |
752 | } |
753 | |
754 | if (\is_file(__DIR__ . '/../../../Socket/Hooks.php')) { |
755 | $activeHooks['Socket'] = include __DIR__ . '/../../../Socket/Hooks.php'; |
756 | } |
757 | |
758 | $view->data['hooks'] = $activeHooks; |
759 | |
760 | return $view; |
761 | } |
762 | |
763 | /** |
764 | * Method which generates the module profile view. |
765 | * |
766 | * @param RequestAbstract $request Request |
767 | * @param ResponseAbstract $response Response |
768 | * @param array $data Generic data |
769 | * |
770 | * @return RenderableInterface Response can be rendered |
771 | * |
772 | * @since 1.0.0 |
773 | */ |
774 | public function viewModuleSettings(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface |
775 | { |
776 | $view = new View($this->app->l11nManager, $request, $response); |
777 | $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1000105001, $request, $response); |
778 | |
779 | $id = $request->getDataString('id') ?? ''; |
780 | |
781 | /** @var \Model\Setting[] $settings */ |
782 | $settings = SettingMapper::getAll()->where('module', $id)->execute(); |
783 | if (empty($settings)) { |
784 | $view->data['settings'] = $settings; |
785 | } |
786 | |
787 | $class = '\\Modules\\' . $request->getData('id') . '\\Models\\SettingsEnum'; |
788 | if (!Autoloader::exists($class)) { |
789 | $class = null; |
790 | } |
791 | |
792 | $view->data['settings_class'] = $class; |
793 | |
794 | if ($request->getData('id') === 'Admin') { |
795 | $view->setTemplate('/Modules/' . $request->getData('id') . '/Admin/Settings/Theme/Backend/settings'); |
796 | } elseif (\is_file(__DIR__ . '/../../' . ($request->getDataString('id') ?? '') . '/Admin/Settings/Theme/Backend/settings.tpl.php')) { |
797 | return $this->app->moduleManager->get($request->getDataString('id') ?? '') |
798 | ->viewModuleSettings($request, $response, $data); |
799 | } else { |
800 | $view->setTemplate('/Modules/Admin/Theme/Backend/modules-settings'); |
801 | } |
802 | |
803 | /** @var \Model\Setting[] $generalSettings */ |
804 | $generalSettings = $this->app->appSettings->get( |
805 | names: [ |
806 | SettingsEnum::PASSWORD_PATTERN, SettingsEnum::LOGIN_TIMEOUT, SettingsEnum::PASSWORD_INTERVAL, SettingsEnum::PASSWORD_HISTORY, SettingsEnum::LOGIN_TRIES, SettingsEnum::LOGGING_STATUS, SettingsEnum::LOGGING_PATH, SettingsEnum::DEFAULT_UNIT, |
807 | SettingsEnum::LOGIN_STATUS, SettingsEnum::DEFAULT_LOCALIZATION, SettingsEnum::MAIL_SERVER_ADDR, |
808 | ], |
809 | module: 'Admin' |
810 | ); |
811 | |
812 | $view->data['generalSettings'] = $generalSettings; |
813 | $view->data['defaultlocalization'] = LocalizationMapper::get()->where('id', (int) $generalSettings[SettingsEnum::DEFAULT_LOCALIZATION]->content)->execute(); |
814 | |
815 | return $view; |
816 | } |
817 | } |