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