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