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