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