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