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