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