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