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