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