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