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