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