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