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-3"> 311 <?= $label ?> 312 </dt> 313 <dd class="col-sm-9"> 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 </dd> 321 <?php endif ?> 322 <?php endforeach ?> 323 </dl> 324 325 <div class="row"> 326 <div class="col-sm-6"> 327 <ul class="fa-ul"> 328 <li> 329 <span class="fa-li"><?= view('icons/preferences') ?></span> 330 <a href="<?= e(route('admin-users')) ?>"> 331 <?= I18N::translate('User administration') ?> 332 </a> 333 </li> 334 <li> 335 <span class="fa-li"><?= view('icons/add') ?></span> 336 <a href="<?= e(route('admin-users-create')) ?>"> 337 <?= I18N::translate('Add a user') ?> 338 </a> 339 </li> 340 <li> 341 <span class="fa-li"><?= view('icons/delete') ?></span> 342 <a href="<?= e(route('admin-users-cleanup')) ?>"> 343 <?= I18N::translate('Delete inactive users') ?> 344 </a> 345 </li> 346 <li> 347 <span class="fa-li"><?= view('icons/block') ?></span> 348 <a href="<?= e(route('user-page-default-edit')) ?>"> 349 <?= I18N::translate('Set the default blocks for new users') ?> 350 </a> 351 </li> 352 </ul> 353 </div> 354 <div class="col-sm-6"> 355 <ul class="fa-ul"> 356 <li> 357 <span class="fa-li"><?= view('icons/email') ?></span> 358 <a href="<?= e(route(BroadcastPage::class, ['to' => 'all'])) ?>"> 359 <?= I18N::translate('Send a message to all users') ?> 360 </a> 361 </li> 362 <li> 363 <span class="fa-li"><?= view('icons/email') ?></span> 364 <a href="<?= e(route(BroadcastPage::class, ['to' => 'never_logged'])) ?>"> 365 <?= I18N::translate('Send a message to users who have never signed in') ?> 366 </a> 367 </li> 368 <li> 369 <span class="fa-li"><?= view('icons/email') ?></span> 370 <a href="<?= e(route(BroadcastPage::class, ['to' => 'last_6mo'])) ?>"> 371 <?= I18N::translate('Send a message to users who have not signed in for 6 months') ?> 372 </a> 373 </li> 374 </ul> 375 </div> 376 </div> 377 </div> 378</div> 379 380<!-- MODULES --> 381<div class="card mb-4"> 382 <div class="card-header"> 383 <h2 class="mb-0"> 384 <?= I18N::translate('Modules') ?> 385 <?= view('components/badge', ['count' => $all_modules_enabled->count(), 'total' => $all_modules_disabled->count(), 'context' => 'secondary']) ?> 386 </h2> 387 </div> 388 389 <div class="card-body"> 390 <ul class="fa-ul"> 391 <li> 392 <span class="fa-li"><?= view('icons/module') ?></span> 393 <a href="<?= e(route('modules')) ?>"> 394 <?= I18N::translate('All modules') ?> 395 </a> 396 <?= view('components/badge', ['count' => $all_modules_enabled->count(), 'total' => $all_modules_disabled->count(), 'context' => 'primary']) ?> 397 </li> 398 </ul> 399 400 <div class="row"> 401 <div class="col-sm-4"> 402 <h3> 403 <?= I18N::translate('Genealogy') ?> 404 </h3> 405 406 <ul class="fa-ul"> 407 <li> 408 <span class="fa-li"><?= view('icons/menu') ?></span> 409 <a href="<?= e(route('menus')) ?>"> 410 <?= I18N::translate('Menus') ?> 411 </a> 412 <?= view('components/badge', ['count' => $menu_modules_enabled->count(), 'total' => $menu_modules_disabled->count(), 'context' => 'primary']) ?> 413 </li> 414 <li> 415 <span class="fa-li"><?= view('icons/chart') ?></span> 416 <a href="<?= e(route('charts')) ?>"> 417 <?= I18N::translate('Charts') ?> 418 </a> 419 <?= view('components/badge', ['count' => $chart_modules_enabled->count(), 'total' => $chart_modules_disabled->count(), 'context' => 'primary']) ?> 420 </li> 421 <li> 422 <span class="fa-li"><?= view('icons/list') ?></span> 423 <a href="<?= e(route('lists')) ?>"> 424 <?= I18N::translate('Lists') ?> 425 </a> 426 <?= view('components/badge', ['count' => $list_modules_enabled->count(), 'total' => $list_modules_disabled->count(), 'context' => 'primary']) ?> 427 </li> 428 <li> 429 <span class="fa-li"><?= view('icons/report') ?></span> 430 <a href="<?= e(route('reports')) ?>"> 431 <?= I18N::translate('Reports') ?> 432 </a> 433 <?= view('components/badge', ['count' => $report_modules_enabled->count(), 'total' => $report_modules_disabled->count(), 'context' => 'primary']) ?> 434 </li> 435 </ul> 436 437 <h3> 438 <?= I18N::translate('Website') ?> 439 </h3> 440 441 <ul class="fa-ul"> 442 <li> 443 <span class="fa-li"><?= view('icons/footer') ?></span> 444 <a href="<?= e(route('footers')) ?>"> 445 <?= I18N::translate('Footers') ?> 446 </a> 447 <?= view('components/badge', ['count' => $footer_modules_enabled->count(), 'total' => $footer_modules_disabled->count(), 'context' => 'primary']) ?> 448 </li> 449 <li> 450 <span class="fa-li"><?= view('icons/analytics') ?></span> 451 <a href="<?= e(route('analytics')) ?>"> 452 <?= I18N::translate('Tracking and analytics') ?> 453 </a> 454 <?= view('components/badge', ['count' => $analytics_modules_enabled->count(), 'total' => $analytics_modules_disabled->count(), 'context' => 'primary']) ?> 455 </li> 456 <li> 457 <span class="fa-li"><?= view('icons/theme') ?></span> 458 <a href="<?= e(route('themes')) ?>"> 459 <?= I18N::translate('Themes') ?> 460 </a> 461 <?= view('components/badge', ['count' => $theme_modules_enabled->count(), 'total' => $theme_modules_disabled->count(), 'context' => 'primary']) ?> 462 </li> 463 <li> 464 <span class="fa-li"><?= view('icons/language') ?></span> 465 <a href="<?= e(route('languages')) ?>"> 466 <?= I18N::translate('Languages') ?> 467 </a> 468 <?= view('components/badge', ['count' => $language_modules_enabled->count(), 'total' => $language_modules_disabled->count(), 'context' => 'primary']) ?> 469 </li> 470 </ul> 471 472 </div> 473 474 <div class="col-sm-4"> 475 476 <h3> 477 <?= I18N::translate('Home page') ?> 478 </h3> 479 480 <ul class="fa-ul"> 481 <li> 482 <span class="fa-li"><?= view('icons/block') ?></span> 483 <a href="<?= e(route('blocks')) ?>"> 484 <?= I18N::translate('Blocks') ?> 485 </a> 486 <?= view('components/badge', ['count' => $block_modules_enabled->count(), 'total' => $block_modules_disabled->count(), 'context' => 'primary']) ?> 487 </li> 488 </ul> 489 490 <h3> 491 <?= I18N::translate('Individual page') ?> 492 </h3> 493 494 <ul class="fa-ul"> 495 <li> 496 <span class="fa-li"><?= view('icons/tab') ?></span> 497 <a href="<?= e(route('tabs')) ?>"> 498 <?= I18N::translate('Tabs') ?> 499 <?= view('components/badge', ['count' => $tab_modules_enabled->count(), 'total' => $tab_modules_disabled->count(), 'context' => 'primary']) ?> 500 </a> 501 </li> 502 <li> 503 <span class="fa-li"><?= view('icons/sidebar') ?></span> 504 <a href="<?= e(route('sidebars')) ?>"> 505 <?= I18N::translate('Sidebars') ?> 506 </a> 507 <?= view('components/badge', ['count' => $sidebar_modules_enabled->count(), 'total' => $sidebar_modules_disabled->count(), 'context' => 'primary']) ?> 508 </li> 509 <li> 510 <span class="fa-li"><?= view('icons/history') ?></span> 511 <a href="<?= e(route('history')) ?>"> 512 <?= I18N::translate('Historic events') ?> 513 </a> 514 <?= view('components/badge', ['count' => $history_modules_enabled->count(), 'total' => $history_modules_disabled->count(), 'context' => 'primary']) ?> 515 </li> 516 </ul> 517 518 </div> 519 520 <div class="col-sm-4"> 521 522 <h3> 523 <?= I18N::translate('Other') ?> 524 </h3> 525 526 <ul class="fa-ul"> 527 <?php foreach ($other_modules as $module) : ?> 528 <li> 529 <span class="fa-li"><?= view('icons/module') ?></span> 530 531 <?php if ($module->isEnabled()): ?> 532 <?php if ($module instanceof ModuleConfigInterface): ?> 533 <a href="<?= e($module->getConfigLink()) ?>"> 534 <?= $module->title() ?> 535 <span class="fa"><?= view('icons/preferences') ?></span> 536 </a> 537 <?php else : ?> 538 <?= $module->title() ?> 539 <?php endif ?> 540 <?php else : ?> 541 <span class="text-muted"> 542 <span class="fa-li"><?= view('icons/module') ?></span> 543 <?= $module->title() ?> 544 <?php if ($module instanceof ModuleConfigInterface): ?> 545 <span class="fa"><?= view('icons/preferences') ?></span> 546 <?php endif ?> 547 </span> 548 </span> 549 <?php endif ?> 550 551 <?php if ($module instanceof ModuleCustomInterface): ?> 552 <?= view('admin/custom-module-info', ['module' => $module]) ?> 553 <?php endif ?> 554 </li> 555 <?php endforeach ?> 556 </ul> 557 </div> 558 </div> 559 </div> 560</div> 561 562<!-- MEDIA --> 563<div class="card mb-4"> 564 <div class="card-header"> 565 <h2 class="mb-0"> 566 <?= I18N::translate('Media') ?> 567 </h2> 568 </div> 569 <div class="card-body"> 570 <ul class="fa-ul"> 571 <li> 572 <span class="fa-li"><?= view('icons/preferences') ?></span> 573 <a href="<?= e(route('admin-media')) ?>"> 574 <?= I18N::translate('Manage media') ?> 575 </a> 576 </li> 577 <li> 578 <span class="fa-li"><?= view('icons/upload') ?></span> 579 <a href="<?= e(route('admin-media-upload')) ?>"> 580 <?= I18N::translate('Upload media files') ?> 581 </a> 582 </li> 583 <li> 584 <span class="fa-li"><?= view('icons/link') ?></span> 585 <a href="<?= e(route('admin-fix-level-0-media')) ?>"> 586 <?= I18N::translate('Link media objects to facts and events') ?> 587 </a> 588 </li> 589 <li> 590 <span class="fa-li"><?= view('icons/upload') ?></span> 591 <a href="<?= e(route('admin-webtrees1-thumbs')) ?>"> 592 <?= I18N::translate('Import custom thumbnails from webtrees version 1') ?> 593 </a> 594 </li> 595 </ul> 596 </div> 597</div> 598 599<!-- MAPS --> 600<div class="card mb-4"> 601 <div class="card-header"> 602 <h2 class="mb-0"> 603 <?= I18N::translate('Map') ?> 604 </h2> 605 </div> 606 <div class="card-body"> 607 <div class="row"> 608 <div class="col-sm-6"> 609 <ul class="fa-ul"> 610 <li> 611 <span class="fa-li"><?= view('icons/location') ?></span> 612 <a href="<?= e(route('map-data')) ?>"> 613 <?= I18N::translate('Geographic data') ?> 614 </a> 615 </li> 616 </ul> 617 </div> 618 <div class="col-sm-6"> 619 <ul class="fa-ul"> 620 <li> 621 <span class="fa-li"><?= view('icons/map') ?></span> 622 <a href="<?= e(route('map-provider')) ?>"> 623 <?= I18N::translate('Map provider') ?> 624 </a> 625 </li> 626 </ul> 627 </div> 628 </div> 629 </div> 630</div> 631 632<!-- OLD FILES --> 633<?php if (!empty($files_to_delete)) : ?> 634 <div class="card mb-4 card-outline-danger"> 635 <div class="card-header"> 636 <h2 class="mb-0"> 637 <?= I18N::translate('Old files found') ?> 638 </h2> 639 </div> 640 <div class="card-body"> 641 <p> 642 <?= I18N::translate('Files have been found from a previous version of webtrees. Old files can sometimes be a security risk. You should delete them.') ?> 643 </p> 644 <ul class="list-unstyled"> 645 <?php foreach ($files_to_delete as $file_to_delete) : ?> 646 <li dir="ltr"> 647 <code><?= e($file_to_delete) ?></code> 648 </li> 649 <?php endforeach ?> 650 </ul> 651 </div> 652 </div> 653<?php endif ?> 654