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