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