xref: /webtrees/resources/views/admin/control-panel.phtml (revision 12c7ed82c7e25446dd8688409aa59afeeefd9433)
1<?php
2
3use Fisharebest\Webtrees\Http\RequestHandlers\BroadcastPage;
4use Fisharebest\Webtrees\Http\RequestHandlers\CleanDataFolder;
5use Fisharebest\Webtrees\Http\RequestHandlers\ControlPanel;
6use Fisharebest\Webtrees\Http\RequestHandlers\CreateTreePage;
7use Fisharebest\Webtrees\Http\RequestHandlers\EmailPreferencesPage;
8use Fisharebest\Webtrees\Http\RequestHandlers\PendingChanges;
9use Fisharebest\Webtrees\Http\RequestHandlers\PhpInformation;
10use Fisharebest\Webtrees\Http\RequestHandlers\SiteLogsPage;
11use Fisharebest\Webtrees\Http\RequestHandlers\TreePageDefaultEdit;
12use Fisharebest\Webtrees\Http\RequestHandlers\UserPageDefaultEdit;
13use Fisharebest\Webtrees\Http\RequestHandlers\UsersCleanupPage;
14use Fisharebest\Webtrees\I18N;
15use Fisharebest\Webtrees\Module\FamilyListModule;
16use Fisharebest\Webtrees\Module\IndividualListModule;
17use Fisharebest\Webtrees\Module\MediaListModule;
18use Fisharebest\Webtrees\Module\ModuleConfigInterface;
19use Fisharebest\Webtrees\Module\ModuleCustomInterface;
20use Fisharebest\Webtrees\Module\NoteListModule;
21use Fisharebest\Webtrees\Module\RepositoryListModule;
22use Fisharebest\Webtrees\Module\SourceListModule;
23use Fisharebest\Webtrees\Module\SubmitterListModule;
24use Fisharebest\Webtrees\Webtrees;
25use Illuminate\Support\Collection;
26
27/**
28 * @var Collection<ModuleCustomInterface> $custom_updates
29 * @var string                            $latest_version
30 * @var string                            $title
31 * @var Collection<string>                $server_errors
32 * @var Collection<string>                $server_warnings
33 */
34
35?>
36
37<h1><?= $title ?></h1>
38
39<!-- WEBSITE / WEBTREES -->
40<div class="card mb-4">
41    <div class="card-header">
42        <h2 class="mb-0">
43            <?= I18N::translate('Website') ?>
44            <span class="badge badge-secondary" dir="ltr">
45                <?= e(Webtrees::VERSION) ?>
46            </span>
47        </h2>
48    </div>
49    <div class="card-body">
50        <?php foreach ($server_errors as $server_error) : ?>
51            <p class="alert alert-danger"><?= $server_error ?></p>
52        <?php endforeach ?>
53
54        <?php foreach ($server_warnings as $server_warning) : ?>
55            <p class="alert alert-warning"><?= $server_warning ?></p>
56        <?php endforeach ?>
57
58        <p class="card-text">
59            <?= /* I18N: %s is a URL/link to the project website */
60            I18N::translate('Support and documentation can be found at %s.', '<a href="https://webtrees.net/">webtrees.net</a>') ?>
61        </p>
62        <p class="card-text">
63            <?php if ($latest_version === '') : ?>
64                <?= I18N::translate('No upgrade information is available.') ?>
65            <?php elseif (version_compare(Webtrees::VERSION, $latest_version) < 0) : ?>
66                <div class="alert alert-info">
67                    <?= I18N::translate('A new version of webtrees is available.') ?>
68                    <a href="<?= e(route('upgrade')) ?>" class="alert-link">
69                        <?= /* I18N: %s is a version number */
70                        I18N::translate('Upgrade to webtrees %s.', e($latest_version)) ?>
71                    </a>
72                </div>
73            <?php else : ?>
74                <?= I18N::translate('This is the latest version of webtrees. No upgrade is available.') ?>
75            <?php endif ?>
76        </p>
77
78        <?php foreach ($custom_updates as $module) : ?>
79        <div class="alert alert-info">
80            <?= view('icons/information') ?>
81            <?= I18N::translate('An upgrade is available.') ?>
82            <br>
83            <?= $module->title() ?><?= e($module->customModuleVersion()) ?><?= e($module->customModuleLatestVersion()) ?>
84        </div>
85        <?php endforeach ?>
86
87        <div class="row">
88            <div class="col-sm-6">
89                <ul class="fa-ul">
90                    <li>
91                        <span class="fa-li"><?= view('icons/preferences') ?></span>
92                        <a href="<?= e(route('admin-site-preferences')) ?>">
93                            <?= I18N::translate('Website preferences') ?>
94                        </a>
95                    </li>
96                    <li>
97                        <span class="fa-li"><?= view('icons/email') ?></span>
98                        <a href="<?= e(route(EmailPreferencesPage::class)) ?>">
99                            <?= I18N::translate('Sending email') ?>
100                        </a>
101                    </li>
102                    <li>
103                        <span class="fa-li"><?= view('icons/user') ?></span>
104                        <a href="<?= e(route('admin-site-registration')) ?>">
105                            <?= I18N::translate('Sign-in and registration') ?>
106                        </a>
107                    </li>
108                </ul>
109            </div>
110            <div class="col-sm-6">
111                <ul class="fa-ul">
112                    <li>
113                        <span class="fa-li"><?= view('icons/list') ?></span>
114                        <a href="<?= e(route(SiteLogsPage::class)) ?>">
115                            <?= I18N::translate('Website logs') ?>
116                        </a>
117                    </li>
118                    <li>
119                        <span class="fa-li"><?= view('icons/delete') ?></span>
120                        <a href="<?= e(route(CleanDataFolder::class)) ?>">
121                            <?= I18N::translate('Clean up data folder') ?>
122                        </a>
123                    </li>
124                    <li>
125                        <span class="fa-li"><?= view('icons/help') ?></span>
126                        <a href="<?= e(route(PhpInformation::class)) ?>">
127                            <?= I18N::translate('Server information') ?>
128                        </a>
129                    </li>
130                </ul>
131            </div>
132        </div>
133    </div>
134</div>
135
136<!-- FAMILY TREES -->
137<div class="card mb-4 <?= array_sum($changes) ? 'card-outline-danger' : '' ?>">
138    <div class="card-header">
139        <h2 class="mb-0">
140            <?= I18N::translate('Family trees') ?>
141            <span class="badge badge-secondary">
142                    <?= I18N::number(count($all_trees)) ?>
143                </span>
144        </h2>
145    </div>
146    <div class="card-body">
147        <?php if ($all_trees->isEmpty()) : ?>
148            <p class="alert alert-info">
149                <?= I18N::translate('You need to create a family tree.') ?>
150            </p>
151        <?php endif ?>
152
153        <ul class="fa-ul">
154            <li>
155                <span class="fa-li"><?= view('icons/add') ?></span>
156                <a href="<?= e(route(CreateTreePage::class)) ?>">
157                    <?= I18N::translate('Create a family tree') ?>
158                </a>
159            </li>
160            <li>
161                <span class="fa-li"><?= view('icons/block') ?></span>
162                <a href="<?= e(route(TreePageDefaultEdit::class)) ?>">
163                    <?= I18N::translate('Set the default blocks for new family trees') ?>
164                </a>
165            </li>
166            <?php if (count($all_trees) > 1) : ?>
167                <li>
168                    <span class="fa-li"><?= view('icons/merge') ?></span>
169                    <a href="<?= e(route('admin-trees-merge')) ?>">
170                        <?= I18N::translate('Merge family trees') ?>
171                    </a>
172                </li>
173            <?php endif ?>
174        </ul>
175
176        <table class="table table-sm">
177            <caption class="sr-only">
178                <?= I18N::translate('Family trees') ?>
179            </caption>
180            <thead>
181                <tr>
182                    <th><?= I18N::translate('Family tree') ?></th>
183                    <th class="align-digits"><?= I18N::translate('Pending changes') ?></th>
184                    <th class="d-none d-sm-table-cell align-digits"><?= I18N::translate('Individuals') ?></th>
185                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Families') ?></th>
186                    <th class="d-none d-sm-table-cell align-digits"><?= I18N::translate('Sources') ?></th>
187                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Repositories') ?></th>
188                    <th class="d-none d-sm-table-cell align-digits"><?= I18N::translate('Media') ?></th>
189                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Notes') ?></th>
190                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Submitters') ?></th>
191                </tr>
192            </thead>
193            <tbody>
194                <?php foreach ($all_trees as $tree) : ?>
195                    <tr class="<?= $changes[$tree->id()] ? 'danger' : '' ?>">
196                        <th scope="row">
197                            <a href="<?= e(route('manage-trees', ['tree' => $tree->name()])) ?>">
198                                <?= view('icons/preferences') ?>
199                                <?= e($tree->name()) ?>
200                                -
201                                <?= e($tree->title()) ?>
202                            </a>
203                        </th>
204                        <td style="text-align: right;">
205                            <?php if ($changes[$tree->id()]) : ?>
206                                <a href="<?= e(route(PendingChanges::class, ['tree' => $tree->name(), 'url' => route(ControlPanel::class)])) ?>">
207                                    <?= I18N::number($changes[$tree->id()]) ?>
208                                    <span class="sr-only"><?= I18N::translate('Pending changes') ?> <?= e($tree->title()) ?></span>
209                                </a>
210                            <?php else : ?>
211                                -
212                            <?php endif ?>
213                        </td>
214                        <td class="d-none d-sm-table-cell align-digits">
215                            <?php if ($individuals[$tree->id()] > 0) : ?>
216                                <?php if ($individual_list_module instanceof IndividualListModule) : ?>
217                                    <a href="<?= e($individual_list_module->listUrl($tree)) ?>"><?= I18N::number($individuals[$tree->id()]) ?></a>
218                                <?php else : ?>
219                                    <?= I18N::number($individuals[$tree->id()]) ?>
220                                <?php endif ?>
221                            <?php else : ?>
222                                -
223                            <?php endif ?>
224                        </td>
225                        <td class="d-none d-lg-table-cell align-digits">
226                            <?php if ($families[$tree->id()] > 0) : ?>
227                                <?php if ($family_list_module instanceof FamilyListModule) : ?>
228                                    <a href="<?= e($family_list_module->listUrl($tree)) ?>"><?= I18N::number($families[$tree->id()]) ?></a>
229                                <?php else : ?>
230                                    <?= I18N::number($families[$tree->id()]) ?>
231                                <?php endif ?>
232                            <?php else : ?>
233                                -
234                            <?php endif ?>
235                        </td>
236                        <td class="d-none d-sm-table-cell align-digits">
237                            <?php if ($sources[$tree->id()] > 0) : ?>
238                                <?php if ($source_list_module instanceof SourceListModule) : ?>
239                                    <a href="<?= e($source_list_module->listUrl($tree)) ?>"><?= I18N::number($sources[$tree->id()]) ?></a>
240                                <?php else : ?>
241                                    <?= I18N::number($sources[$tree->id()]) ?>
242                                <?php endif ?>
243                            <?php else : ?>
244                                -
245                            <?php endif ?>
246                        </td>
247                        <td class="d-none d-lg-table-cell align-digits">
248                            <?php if ($repositories[$tree->id()] > 0) : ?>
249                                <?php if ($repository_list_module instanceof RepositoryListModule) : ?>
250                                    <a href="<?= e($repository_list_module->listUrl($tree)) ?>"><?= I18N::number($repositories[$tree->id()]) ?></a>
251                                <?php else : ?>
252                                    <?= I18N::number($repositories[$tree->id()]) ?>
253                                <?php endif ?>
254                            <?php else : ?>
255                                -
256                            <?php endif ?>
257                        </td>
258                        <td class="d-none d-sm-table-cell align-digits">
259                            <?php if ($media[$tree->id()] > 0) : ?>
260                                <?php if ($media_list_module instanceof MediaListModule) : ?>
261                                    <a href="<?= e($media_list_module->listUrl($tree)) ?>"><?= I18N::number($media[$tree->id()]) ?></a>
262                                <?php else : ?>
263                                    <?= I18N::number($media[$tree->id()]) ?>
264                                <?php endif ?>
265                            <?php else : ?>
266                                -
267                            <?php endif ?>
268                        </td>
269                        <td class="d-none d-lg-table-cell align-digits">
270                            <?php if ($notes[$tree->id()] > 0) : ?>
271                                <?php if ($note_list_module instanceof NoteListModule) : ?>
272                                    <a href="<?= e($note_list_module->listUrl($tree)) ?>"><?= I18N::number($notes[$tree->id()]) ?></a>
273                                <?php else : ?>
274                                    <?= I18N::number($notes[$tree->id()]) ?>
275                                <?php endif ?>
276                            <?php else : ?>
277                                -
278                            <?php endif ?>
279                        </td>
280                         <td class="d-none d-lg-table-cell align-digits">
281                            <?php if ($submitters[$tree->id()] > 0) : ?>
282                                <?php if ($submitter_list_module instanceof SubmitterListModule) : ?>
283                                    <a href="<?= e($submitter_list_module->listUrl($tree)) ?>"><?= I18N::number($submitters[$tree->id()]) ?></a>
284                                <?php else : ?>
285                                    <?= I18N::number($submitters[$tree->id()]) ?>
286                                <?php endif ?>
287                            <?php else : ?>
288                                -
289                            <?php endif ?>
290                        </td>
291                    </tr>
292                <?php endforeach ?>
293            </tbody>
294            <tfoot>
295                <tr>
296                    <th scope="row">
297                        <?= I18N::translate('Total') ?>
298                    </th>
299                    <td class="align-digits">
300                        <?= I18N::number(array_sum($changes)) ?>
301                    </td>
302                    <td class="d-none d-sm-table-cell align-digits">
303                        <?= I18N::number($individuals->sum()) ?>
304                    </td>
305                    <td class="d-none d-lg-table-cell align-digits">
306                        <?= I18N::number($families->sum()) ?>
307                    </td>
308                    <td class="d-none d-sm-table-cell align-digits">
309                        <?= I18N::number($sources->sum()) ?>
310                    </td>
311                    <td class="d-none d-lg-table-cell align-digits">
312                        <?= I18N::number($repositories->sum()) ?>
313                    </td>
314                    <td class="d-none d-sm-table-cell align-digits">
315                        <?= I18N::number($media->sum()) ?>
316                    </td>
317                    <td class="d-none d-lg-table-cell align-digits">
318                        <?= I18N::number($notes->sum()) ?>
319                    </td>
320                </tr>
321            </tfoot>
322        </table>
323    </div>
324</div>
325
326<!-- USERS -->
327<div class="card mb-4 <?= $unapproved || $unverified ? 'card-outline-danger' : '' ?>">
328    <div class="card-header">
329        <h2 class="mb-0">
330            <?= I18N::translate('Users') ?>
331            <span class="badge badge-secondary">
332                    <?= I18N::number(count($all_users)) ?>
333                </span>
334        </h2>
335    </div>
336    <div class="card-body">
337        <dl class="row">
338            <?php foreach ([I18N::translate('Administrators') => $administrators, I18N::translate('Managers') => $managers, I18N::translate('Moderators') => $moderators, I18N::translate('Not verified by the user') => $unverified, I18N::translate('Not approved by an administrator') => $unapproved] as $label => $list) : ?>
339                <?php if (!empty($list)) : ?>
340                    <dt class="col-sm-6">
341                        <?= $label ?>
342                    </dt>
343                    <dd class="col-sm-6">
344                        <?php foreach ($list as $n => $user) : ?>
345                            <?= $n ? I18N::$list_separator : '' ?>
346                            <a href="<?= e(route('admin-users-edit', ['user_id' => $user->id()])) ?>" dir="auto">
347                                <?= e($user->realName()) ?>
348                            </a>
349                        <?php endforeach ?>
350                        <?php if ($list->isEmpty()) : ?>
351352                        <?php endif ?>
353                    </dd>
354                <?php endif ?>
355            <?php endforeach ?>
356        </dl>
357
358        <div class="row">
359            <div class="col-sm-6">
360                <ul class="fa-ul">
361                    <li>
362                        <span class="fa-li"><?= view('icons/preferences') ?></span>
363                        <a href="<?= e(route('admin-users')) ?>">
364                            <?= I18N::translate('User administration') ?>
365                        </a>
366                    </li>
367                    <li>
368                        <span class="fa-li"><?= view('icons/add') ?></span>
369                        <a href="<?= e(route('admin-users-create')) ?>">
370                            <?= I18N::translate('Add a user') ?>
371                        </a>
372                    </li>
373                    <li>
374                        <span class="fa-li"><?= view('icons/delete') ?></span>
375                        <a href="<?= e(route(UsersCleanupPage::class)) ?>">
376                            <?= I18N::translate('Delete inactive users') ?>
377                        </a>
378                    </li>
379                    <li>
380                        <span class="fa-li"><?= view('icons/block') ?></span>
381                        <a href="<?= e(route(UserPageDefaultEdit::class)) ?>">
382                            <?= I18N::translate('Set the default blocks for new users') ?>
383                        </a>
384                    </li>
385                </ul>
386            </div>
387            <div class="col-sm-6">
388                <ul class="fa-ul">
389                    <li>
390                        <span class="fa-li"><?= view('icons/email') ?></span>
391                        <a href="<?= e(route(BroadcastPage::class, ['to' => 'all'])) ?>">
392                            <?= I18N::translate('Send a message to all users') ?>
393                        </a>
394                    </li>
395                    <li>
396                        <span class="fa-li"><?= view('icons/email') ?></span>
397                        <a href="<?= e(route(BroadcastPage::class, ['to' => 'never_logged'])) ?>">
398                            <?= I18N::translate('Send a message to users who have never signed in') ?>
399                        </a>
400                    </li>
401                    <li>
402                        <span class="fa-li"><?= view('icons/email') ?></span>
403                        <a href="<?= e(route(BroadcastPage::class, ['to' => 'last_6mo'])) ?>">
404                            <?= I18N::translate('Send a message to users who have not signed in for 6 months') ?>
405                        </a>
406                    </li>
407                </ul>
408            </div>
409        </div>
410    </div>
411</div>
412
413<!-- MODULES -->
414<div class="card mb-4">
415    <div class="card-header">
416        <h2 class="mb-0">
417            <?= I18N::translate('Modules') ?>
418            <?= view('components/badge', ['count' => $all_modules_enabled->count(), 'total' => $all_modules_disabled->count(), 'context' => 'secondary']) ?>
419        </h2>
420    </div>
421
422    <div class="card-body">
423        <ul class="fa-ul">
424            <li>
425                <span class="fa-li"><?= view('icons/module') ?></span>
426                <a href="<?= e(route('modules')) ?>">
427                    <?= I18N::translate('All modules') ?>
428                </a>
429                <?= view('components/badge', ['count' => $all_modules_enabled->count(), 'total' => $all_modules_disabled->count(), 'context' => 'primary']) ?>
430            </li>
431        </ul>
432
433        <div class="row">
434            <div class="col-sm-4">
435                <h3>
436                    <?= I18N::translate('Genealogy') ?>
437                </h3>
438
439                <ul class="fa-ul">
440                    <li>
441                        <span class="fa-li"><?= view('icons/menu') ?></span>
442                        <a href="<?= e(route('menus')) ?>">
443                            <?= I18N::translate('Menus') ?>
444                        </a>
445                        <?= view('components/badge', ['count' => $menu_modules_enabled->count(), 'total' => $menu_modules_disabled->count(), 'context' => 'primary']) ?>
446                    </li>
447                    <li>
448                        <span class="fa-li"><?= view('icons/chart') ?></span>
449                        <a href="<?= e(route('charts')) ?>">
450                            <?= I18N::translate('Charts') ?>
451                        </a>
452                        <?= view('components/badge', ['count' => $chart_modules_enabled->count(), 'total' => $chart_modules_disabled->count(), 'context' => 'primary']) ?>
453                    </li>
454                    <li>
455                        <span class="fa-li"><?= view('icons/list') ?></span>
456                        <a href="<?= e(route('lists')) ?>">
457                            <?= I18N::translate('Lists') ?>
458                        </a>
459                        <?= view('components/badge', ['count' => $list_modules_enabled->count(), 'total' => $list_modules_disabled->count(), 'context' => 'primary']) ?>
460                    </li>
461                    <li>
462                        <span class="fa-li"><?= view('icons/report') ?></span>
463                        <a href="<?= e(route('reports')) ?>">
464                            <?= I18N::translate('Reports') ?>
465                        </a>
466                        <?= view('components/badge', ['count' => $report_modules_enabled->count(), 'total' => $report_modules_disabled->count(), 'context' => 'primary']) ?>
467                    </li>
468                    <li>
469                        <span class="fa-li"><?= view('icons/data-fix') ?></span>
470                        <a href="<?= e(route('data-fixes')) ?>">
471                            <?= I18N::translate('Data fixes') ?>
472                        </a>
473                        <?= view('components/badge', ['count' => $data_fix_modules_enabled->count(), 'total' => $data_fix_modules_disabled->count(), 'context' => 'primary']) ?>
474                    </li>
475                </ul>
476
477                <h3>
478                    <?= I18N::translate('Website') ?>
479                </h3>
480
481                <ul class="fa-ul">
482                    <li>
483                        <span class="fa-li"><?= view('icons/footer') ?></span>
484                        <a href="<?= e(route('footers')) ?>">
485                            <?= I18N::translate('Footers') ?>
486                        </a>
487                        <?= view('components/badge', ['count' => $footer_modules_enabled->count(), 'total' => $footer_modules_disabled->count(), 'context' => 'primary']) ?>
488                    </li>
489                    <li>
490                        <span class="fa-li"><?= view('icons/analytics') ?></span>
491                        <a href="<?= e(route('analytics')) ?>">
492                            <?= I18N::translate('Tracking and analytics') ?>
493                        </a>
494                        <?= view('components/badge', ['count' => $analytics_modules_enabled->count(), 'total' => $analytics_modules_disabled->count(), 'context' => 'primary']) ?>
495                    </li>
496                    <li>
497                        <span class="fa-li"><?= view('icons/theme') ?></span>
498                        <a href="<?= e(route('themes')) ?>">
499                            <?= I18N::translate('Themes') ?>
500                        </a>
501                        <?= view('components/badge', ['count' => $theme_modules_enabled->count(), 'total' => $theme_modules_disabled->count(), 'context' => 'primary']) ?>
502                    </li>
503                    <li>
504                        <span class="fa-li"><?= view('icons/language') ?></span>
505                        <a href="<?= e(route('languages')) ?>">
506                            <?= I18N::translate('Languages') ?>
507                        </a>
508                        <?= view('components/badge', ['count' => $language_modules_enabled->count(), 'total' => $language_modules_disabled->count(), 'context' => 'primary']) ?>
509                    </li>
510                </ul>
511
512            </div>
513
514            <div class="col-sm-4">
515
516                <h3>
517                    <?= I18N::translate('Home page') ?>
518                </h3>
519
520                <ul class="fa-ul">
521                    <li>
522                        <span class="fa-li"><?= view('icons/block') ?></span>
523                        <a href="<?= e(route('blocks')) ?>">
524                            <?= I18N::translate('Blocks') ?>
525                        </a>
526                        <?= view('components/badge', ['count' => $block_modules_enabled->count(), 'total' => $block_modules_disabled->count(), 'context' => 'primary']) ?>
527                    </li>
528                </ul>
529
530                <h3>
531                    <?= I18N::translate('Individual page') ?>
532                </h3>
533
534                <ul class="fa-ul">
535                    <li>
536                        <span class="fa-li"><?= view('icons/tab') ?></span>
537                        <a href="<?= e(route('tabs')) ?>">
538                            <?= I18N::translate('Tabs') ?>
539                            <?= view('components/badge', ['count' => $tab_modules_enabled->count(), 'total' => $tab_modules_disabled->count(), 'context' => 'primary']) ?>
540                        </a>
541                    </li>
542                    <li>
543                        <span class="fa-li"><?= view('icons/sidebar') ?></span>
544                        <a href="<?= e(route('sidebars')) ?>">
545                            <?= I18N::translate('Sidebars') ?>
546                        </a>
547                        <?= view('components/badge', ['count' => $sidebar_modules_enabled->count(), 'total' => $sidebar_modules_disabled->count(), 'context' => 'primary']) ?>
548                    </li>
549                    <li>
550                        <span class="fa-li"><?= view('icons/history') ?></span>
551                        <a href="<?= e(route('history')) ?>">
552                            <?= I18N::translate('Historic events') ?>
553                        </a>
554                        <?= view('components/badge', ['count' => $history_modules_enabled->count(), 'total' => $history_modules_disabled->count(), 'context' => 'primary']) ?>
555                    </li>
556                </ul>
557
558            </div>
559
560            <div class="col-sm-4">
561
562                <h3>
563                    <?= I18N::translate('Other') ?>
564                </h3>
565
566                <ul class="fa-ul">
567                    <?php foreach ($other_modules as $module) : ?>
568                        <li>
569                            <span class="fa-li"><?= view('icons/module') ?></span>
570
571                            <?php if ($module->isEnabled()) : ?>
572                                <?php if ($module instanceof ModuleConfigInterface) : ?>
573                                    <a href="<?= e($module->getConfigLink()) ?>">
574                                    <?= $module->title() ?>
575                                    <?= view('icons/preferences') ?>
576                                    </a>
577                                <?php else : ?>
578                                    <?= $module->title() ?>
579                                <?php endif ?>
580                            <?php else : ?>
581                                <span class="text-muted">
582                                    <span class="fa-li"><?= view('icons/module') ?></span>
583                                     <?= $module->title() ?>
584                                    <?php if ($module instanceof ModuleConfigInterface) : ?>
585                                        <?= view('icons/preferences') ?>
586                                    <?php endif ?>
587                                    </span>
588                                </span>
589                            <?php endif ?>
590
591                            <?php if ($module instanceof ModuleCustomInterface) : ?>
592                                <?= view('admin/custom-module-info', ['module' => $module]) ?>
593                            <?php endif ?>
594                        </li>
595                    <?php endforeach ?>
596                </ul>
597            </div>
598        </div>
599    </div>
600</div>
601
602<!-- MEDIA -->
603<div class="card mb-4">
604    <div class="card-header">
605        <h2 class="mb-0">
606            <?= I18N::translate('Media') ?>
607        </h2>
608    </div>
609    <div class="card-body">
610        <ul class="fa-ul">
611            <li>
612                <span class="fa-li"><?= view('icons/preferences') ?></span>
613                <a href="<?= e(route('admin-media')) ?>">
614                    <?= I18N::translate('Manage media') ?>
615                </a>
616            </li>
617            <li>
618                <span class="fa-li"><?= view('icons/upload') ?></span>
619                <a href="<?= e(route('admin-media-upload')) ?>">
620                    <?= I18N::translate('Upload media files') ?>
621                </a>
622            </li>
623            <li>
624                <span class="fa-li"><?= view('icons/link') ?></span>
625                <a href="<?= e(route('admin-fix-level-0-media')) ?>">
626                    <?= I18N::translate('Link media objects to facts and events') ?>
627                </a>
628            </li>
629            <li>
630                <span class="fa-li"><?= view('icons/upload') ?></span>
631                <a href="<?= e(route('admin-webtrees1-thumbs')) ?>">
632                    <?= I18N::translate('Import custom thumbnails from webtrees version 1') ?>
633                </a>
634            </li>
635        </ul>
636    </div>
637</div>
638
639<!-- MAPS -->
640<div class="card mb-4">
641    <div class="card-header">
642        <h2 class="mb-0">
643            <?= I18N::translate('Map') ?>
644        </h2>
645    </div>
646    <div class="card-body">
647        <div class="row">
648            <div class="col-sm-6">
649                <ul class="fa-ul">
650                    <li>
651                        <span class="fa-li"><?= view('icons/location') ?></span>
652                        <a href="<?= e(route('map-data')) ?>">
653                            <?= I18N::translate('Geographic data') ?>
654                        </a>
655                    </li>
656                </ul>
657            </div>
658            <div class="col-sm-6">
659                <ul class="fa-ul">
660                    <li>
661                        <span class="fa-li"><?= view('icons/map') ?></span>
662                        <a href="<?= e(route('map-provider')) ?>">
663                            <?= I18N::translate('Map provider') ?>
664                        </a>
665                    </li>
666                </ul>
667            </div>
668        </div>
669    </div>
670</div>
671
672<!-- OLD FILES -->
673<?php if (!empty($files_to_delete)) : ?>
674    <div class="card mb-4 card-outline-danger">
675        <div class="card-header">
676            <h2 class="mb-0">
677                <?= I18N::translate('Old files found') ?>
678            </h2>
679        </div>
680        <div class="card-body">
681            <p>
682                <?= I18N::translate('Files have been found from a previous version of webtrees. Old files can sometimes be a security risk. You should delete them.') ?>
683            </p>
684            <ul class="list-unstyled">
685                <?php foreach ($files_to_delete as $file_to_delete) : ?>
686                    <li dir="ltr">
687                        <code><?= e($file_to_delete) ?></code>
688                    </li>
689                <?php endforeach ?>
690            </ul>
691        </div>
692    </div>
693<?php endif ?>
694