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