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