1<?php use Fisharebest\Webtrees\I18N; ?> 2<?php use Fisharebest\Webtrees\Webtrees; ?> 3 4<h1><?= $title ?></h1> 5 6<!-- WEBSITE / WEBTREES --> 7<div class="card mb-4"> 8 <div class="card-header"> 9 <h2 class="mb-0"> 10 <?= I18N::translate('Website') ?> 11 <span class="badge badge-secondary"> 12 <?= e(Webtrees::VERSION) ?> 13 </span> 14 </h2> 15 </div> 16 <div class="card-body"> 17 <?php foreach ($server_errors as $server_error) : ?> 18 <p class="alert alert-danger"><?= $server_error ?></p> 19 <?php endforeach ?> 20 21 <?php foreach ($server_warnings as $server_warning) : ?> 22 <p class="alert alert-warning"><?= $server_warning ?></p> 23 <?php endforeach ?> 24 25 <p class="card-text"> 26 <?= /* I18N: %s is a URL/link to the project website */ 27 I18N::translate('Support and documentation can be found at %s.', '<a href="https://webtrees.net/">webtrees.net</a>') ?> 28 </p> 29 <p class="card-text "> 30 <?php if ($latest_version === '') : ?> 31 <?= I18N::translate('No upgrade information is available.') ?> 32 <?php elseif (version_compare(Webtrees::VERSION, $latest_version) < 0) : ?> 33 <?= I18N::translate('A new version of webtrees is available.') ?> 34 <a href="<?= e(route('upgrade')) ?>" class="error"> 35 <?= /* I18N: %s is a version number */ 36 I18N::translate('Upgrade to webtrees %s.', e($latest_version)) ?> 37 </a> 38 <?php else : ?> 39 <?= I18N::translate('This is the latest version of webtrees. No upgrade is available.') ?> 40 <?php endif ?> 41 </p> 42 43 <div class="row"> 44 <div class="col-sm-6"> 45 <ul class="fa-ul"> 46 <li> 47 <span class="fa-li"><?= view('icons/preferences') ?></span> 48 <a href="<?= e(route('admin-site-preferences')) ?>"> 49 <?= I18N::translate('Website preferences') ?> 50 </a> 51 </li> 52 <li> 53 <span class="fa-li"><?= view('icons/preferences') ?></span> 54 <a href="<?= e(route('admin-site-mail')) ?>"> 55 <?= I18N::translate('Sending email') ?> 56 </a> 57 </li> 58 <li> 59 <span class="fa-li"><?= view('icons/preferences') ?></span> 60 <a href="<?= e(route('admin-site-registration')) ?>"> 61 <?= I18N::translate('Sign-in and registration') ?> 62 </a> 63 </li> 64 <li> 65 <span class="fa-li"><?= view('icons/preferences') ?></span> 66 <a href="<?= e(route('admin-site-languages')) ?>"> 67 <?= I18N::translate('Languages') ?> 68 </a> 69 </li> 70 </ul> 71 </div> 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-logs')) ?>"> 77 <?= I18N::translate('Website logs') ?> 78 </a> 79 </li> 80 <li> 81 <span class="fa-li"><?= view('icons/preferences') ?></span> 82 <a href="<?= e(route('admin-clean-data')) ?>"> 83 <?= I18N::translate('Clean up data folder') ?> 84 </a> 85 </li> 86 <li> 87 <span class="fa-li"><?= view('icons/preferences') ?></span> 88 <a href="<?= e(route('admin-site-information')) ?>"> 89 <?= I18N::translate('Server information') ?> 90 </a> 91 </li> 92 </ul> 93 </div> 94 </div> 95 </div> 96</div> 97 98<!-- FAMILY TREES --> 99<div class="card mb-4 <?= array_sum($changes) ? 'card-outline-danger' : '' ?>"> 100 <div class="card-header"> 101 <h2 class="mb-0"> 102 <?= I18N::translate('Family trees') ?> 103 <span class="badge badge-secondary"> 104 <?= I18N::number(count($all_trees)) ?> 105 </span> 106 </h2> 107 </div> 108 <div class="card-body"> 109 <table class="table table-sm"> 110 <caption class="sr-only"> 111 <?= I18N::translate('Family trees') ?> 112 </caption> 113 <thead> 114 <tr> 115 <th><?= I18N::translate('Family tree') ?></th> 116 <th><span class="sr-only"><?= I18N::translate('Manage family trees') ?></span></th> 117 <th class="text-right"><?= I18N::translate('Pending changes') ?></th> 118 <th class="d-none d-sm-table-cell text-right"><?= I18N::translate('Individuals') ?></th> 119 <th class="d-none d-lg-table-cell text-right"><?= I18N::translate('Families') ?></th> 120 <th class="d-none d-sm-table-cell text-right"><?= I18N::translate('Sources') ?></th> 121 <th class="d-none d-lg-table-cell text-right"><?= I18N::translate('Repositories') ?></th> 122 <th class="d-none d-sm-table-cell text-right"><?= I18N::translate('Media') ?></th> 123 <th class="d-none d-lg-table-cell text-right"><?= I18N::translate('Notes') ?></th> 124 </tr> 125 </thead> 126 <tbody> 127 <?= view('admin/control-panel-tree-list', [ 128 'all_trees' => $all_trees, 129 'changes' => $changes, 130 'individuals' => $individuals, 131 'families' => $families, 132 'sources' => $sources, 133 'repositories' => $repositories, 134 'media' => $media, 135 'notes' => $notes, 136 ]); ?> 137 </tbody> 138 <tfoot> 139 <tr> 140 <th scope="row"> 141 <?= I18N::translate('Total') ?> 142 </th> 143 <td></td> 144 <td class="text-right"> 145 <?= I18N::number(array_sum($changes)) ?> 146 </td> 147 <td class="d-none d-sm-table-cell text-right"> 148 <?= I18N::number($individuals->sum()) ?> 149 </td> 150 <td class="d-none d-lg-table-cell text-right"> 151 <?= I18N::number($families->sum()) ?> 152 </td> 153 <td class="d-none d-sm-table-cell text-right"> 154 <?= I18N::number($sources->sum()) ?> 155 </td> 156 <td class="d-none d-lg-table-cell text-right"> 157 <?= I18N::number($repositories->sum()) ?> 158 </td> 159 <td class="d-none d-sm-table-cell text-right"> 160 <?= I18N::number($media->sum()) ?> 161 </td> 162 <td class="d-none d-lg-table-cell text-right"> 163 <?= I18N::number($notes->sum()) ?> 164 </td> 165 </tr> 166 </tfoot> 167 </table> 168 169 <ul class="fa-ul"> 170 <li> 171 <span class="fa-li"><?= view('icons/preferences') ?></span> 172 <a href="<?= e(route('admin-trees')) ?>"> 173 <?= I18N::translate('Manage family trees') ?> 174 </a> 175 </li> 176 <li> 177 <span class="fa-li"><?= view('icons/preferences') ?></span> 178 <a href="<?= e(route('tree-page-default-edit')) ?>"> 179 <?= I18N::translate('Set the default blocks for new family trees') ?> 180 </a> 181 </li> 182 <?php if (count($all_trees) > 1) : ?> 183 <li> 184 <span class="fa-li"><?= view('icons/preferences') ?></span> 185 <a href="<?= e(route('admin-trees-merge')) ?>"> 186 <?= I18N::translate('Merge family trees') ?> 187 </a> 188 </li> 189 <?php endif ?> 190 </ul> 191 </div> 192</div> 193 194<!-- USERS --> 195<div class="card mb-4 <?= $unapproved || $unverified ? 'card-outline-danger' : '' ?>"> 196 <div class="card-header"> 197 <h2 class="mb-0"> 198 <?= I18N::translate('Users') ?> 199 <span class="badge badge-secondary"> 200 <?= I18N::number(count($all_users)) ?> 201 </span> 202 </h2> 203 </div> 204 <div class="card-body"> 205 <dl class="row"> 206 <?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) : ?> 207 <?php if (!empty($list)) : ?> 208 <dt class="col-sm-3"> 209 <?= $label ?> 210 </dt> 211 <dd class="col-sm-9"> 212 <?php foreach ($list as $n => $user) : ?> 213 <?= $n ? I18N::$list_separator : '' ?> 214 <a href="<?= e(route('admin-users-edit', ['user_id' => $user->id()])) ?>" dir="auto"> 215 <?= e($user->realName()) ?> 216 </a> 217 <?php endforeach ?> 218 </dd> 219 <?php endif ?> 220 <?php endforeach ?> 221 </dl> 222 223 <div class="row"> 224 <div class="col-sm-6"> 225 <ul class="fa-ul"> 226 <li> 227 <span class="fa-li"><?= view('icons/preferences') ?></span> 228 <a href="<?= e(route('admin-users')) ?>"> 229 <?= I18N::translate('User administration') ?> 230 </a> 231 </li> 232 <li> 233 <span class="fa-li"><?= view('icons/preferences') ?></span> 234 <a href="<?= e(route('admin-users-create')) ?>"> 235 <?= I18N::translate('Add a user') ?> 236 </a> 237 </li> 238 <li> 239 <span class="fa-li"><?= view('icons/preferences') ?></span> 240 <a href="<?= e(route('admin-users-cleanup')) ?>"> 241 <?= I18N::translate('Delete inactive users') ?> 242 </a> 243 </li> 244 <li> 245 <span class="fa-li"><?= view('icons/preferences') ?></span> 246 <a href="<?= e(route('user-page-default-edit')) ?>"> 247 <?= I18N::translate('Set the default blocks for new users') ?> 248 </a> 249 </li> 250 </ul> 251 </div> 252 <div class="col-sm-6"> 253 <ul class="fa-ul"> 254 <li> 255 <span class="fa-li"><?= view('icons/email') ?></span> 256 <a href="<?= e(route('broadcast', ['to' => 'all'])) ?>"> 257 <?= I18N::translate('Send a message to all users') ?> 258 </a> 259 </li> 260 <li> 261 <span class="fa-li"><?= view('icons/email') ?></span> 262 <a href="<?= e(route('broadcast', ['to' => 'never_logged'])) ?>"> 263 <?= I18N::translate('Send a message to users who have never signed in') ?> 264 </a> 265 </li> 266 <li> 267 <span class="fa-li"><?= view('icons/email') ?></span> 268 <a href="<?= e(route('broadcast', ['to' => 'last_6mo'])) ?>"> 269 <?= I18N::translate('Send a message to users who have not signed in for 6 months') ?> 270 </a> 271 </li> 272 </ul> 273 </div> 274 </div> 275 </div> 276</div> 277 278<!-- MODULES --> 279<div class="card mb-4"> 280 <div class="card-header"> 281 <h2 class="mb-0"> 282 <?= I18N::translate('Modules') ?> 283 <span class="badge badge-secondary"> 284 <?= I18N::number(count($all_modules)) ?> 285 </span> 286 </h2> 287 </div> 288 289 <div class="card-body"> 290 <ul class="fa-ul"> 291 <li> 292 <span class="fa-li"><?= view('icons/preferences') ?></span> 293 <a href="<?= e(route('modules')) ?>"> 294 <?= I18N::translate('Module administration') ?> 295 </a> 296 </li> 297 </ul> 298 299 <div class="row"> 300 <div class="col-sm-6"> 301 <ul class="fa-ul"> 302 <li> 303 <span class="fa-li"><?= view('icons/menu') ?></span> 304 <a href="<?= e(route('menus')) ?>"> 305 <?= I18N::translate('Menus') ?> 306 </a> 307 <?= view('components/badge', ['count' => $menu_modules->count(), 'context' => 'primary']) ?> 308 </li> 309 <li> 310 <span class="fa-li"><?= view('icons/tab') ?></span> 311 <a href="<?= e(route('tabs')) ?>"> 312 <?= I18N::translate('Tabs') ?> 313 <?= view('components/badge', ['count' => $tab_modules->count(), 'context' => 'primary']) ?> 314 </a> 315 </li> 316 <li> 317 <span class="fa-li"><?= view('icons/block') ?></span> 318 <a href="<?= e(route('blocks')) ?>"> 319 <?= I18N::translate('Blocks') ?> 320 </a> 321 <?= view('components/badge', ['count' => $block_modules->count(), 'context' => 'primary']) ?> 322 </li> 323 <li> 324 <span class="fa-li"><?= view('icons/sidebar') ?></span> 325 <a href="<?= e(route('sidebars')) ?>"> 326 <?= I18N::translate('Sidebars') ?> 327 </a> 328 <?= view('components/badge', ['count' => $sidebar_modules->count(), 'context' => 'primary']) ?> 329 </li> 330 <li> 331 <span class="fa-li"><?= view('icons/chart') ?></span> 332 <a href="<?= e(route('charts')) ?>"> 333 <?= I18N::translate('Charts') ?> 334 </a> 335 <?= view('components/badge', ['count' => $chart_modules->count(), 'context' => 'primary']) ?> 336 </li> 337 <li> 338 <span class="fa-li"><?= view('icons/list') ?></span> 339 <a href="<?= e(route('lists')) ?>"> 340 <?= I18N::translate('Lists') ?> 341 </a> 342 <?= view('components/badge', ['count' => $list_modules->count(), 'context' => 'primary']) ?> 343 </li> 344 <li> 345 <span class="fa-li"><?= view('icons/report') ?></span> 346 <a href="<?= e(route('reports')) ?>"> 347 <?= I18N::translate('Reports') ?> 348 </a> 349 <?= view('components/badge', ['count' => $report_modules->count(), 'context' => 'primary']) ?> 350 </li> 351 <li> 352 <span class="fa-li"><?= view('icons/footer') ?></span> 353 <a href="<?= e(route('footers')) ?>"> 354 <?= I18N::translate('Footers') ?> 355 </a> 356 <?= view('components/badge', ['count' => $footer_modules->count(), 'context' => 'primary']) ?> 357 </li> 358 <li> 359 <span class="fa-li"><?= view('icons/analytics') ?></span> 360 <a href="<?= e(route('analytics')) ?>"> 361 <?= I18N::translate('Tracking and analytics') ?> 362 </a> 363 <?= view('components/badge', ['count' => $analytics_modules->count(), 'context' => 'primary']) ?> 364 </li> 365 <li> 366 <span class="fa-li"><?= view('icons/history') ?></span> 367 <a href="<?= e(route('history')) ?>"> 368 <?= I18N::translate('Historic events') ?> 369 </a> 370 <?= view('components/badge', ['count' => $history_modules->count(), 'context' => 'primary']) ?> 371 </li> 372 <li> 373 <span class="fa-li"><?= view('icons/theme') ?></span> 374 <a href="<?= e(route('themes')) ?>"> 375 <?= I18N::translate('Themes') ?> 376 </a> 377 <?= view('components/badge', ['count' => $theme_modules->count(), 'context' => 'primary']) ?> 378 </li> 379 <li> 380 <span class="fa-li"><?= view('icons/language') ?></span> 381 <a href="<?= e(route('languages')) ?>"> 382 <?= I18N::translate('Languages') ?> 383 </a> 384 <?= view('components/badge', ['count' => $language_modules->count(), 'context' => 'primary']) ?> 385 </li> 386 </ul> 387 </div> 388 <div class="col-sm-6"> 389 <ul class="fa-ul"> 390 <?php foreach ($config_modules as $module) : ?> 391 <li> 392 <span class="fa-li"><?= view('icons/preferences') ?></span> 393 <a href="<?= e($module->getConfigLink()) ?>"> 394 <?= $module->title() ?> 395 </a> 396 </li> 397 <?php endforeach ?> 398 </ul> 399 </div> 400 </div> 401 </div> 402</div> 403 404<!-- MEDIA --> 405<div class="card mb-4"> 406 <div class="card-header"> 407 <h2 class="mb-0"> 408 <?= I18N::translate('Media') ?> 409 </h2> 410 </div> 411 <div class="card-body"> 412 <ul class="fa-ul"> 413 <li> 414 <span class="fa-li"><?= view('icons/preferences') ?></span> 415 <a href="<?= e(route('admin-media')) ?>"> 416 <?= I18N::translate('Manage media') ?> 417 </a> 418 </li> 419 <li> 420 <span class="fa-li"><?= view('icons/preferences') ?></span> 421 <a href="<?= e(route('admin-media-upload')) ?>"> 422 <?= I18N::translate('Upload media files') ?> 423 </a> 424 </li> 425 <li> 426 <span class="fa-li"><?= view('icons/preferences') ?></span> 427 <a href="<?= e(route('admin-fix-level-0-media')) ?>"> 428 <?= I18N::translate('Link media objects to facts and events') ?> 429 </a> 430 </li> 431 <li> 432 <span class="fa-li"><?= view('icons/preferences') ?></span> 433 <a href="<?= e(route('admin-webtrees1-thumbs')) ?>"> 434 <?= I18N::translate('Import custom thumbnails from webtrees version 1') ?> 435 </a> 436 </li> 437 </ul> 438 </div> 439</div> 440 441<!-- MAPS --> 442<div class="card mb-4"> 443 <div class="card-header"> 444 <h2 class="mb-0"> 445 <?= I18N::translate('Map') ?> 446 </h2> 447 </div> 448 <div class="card-body"> 449 <div class="row"> 450 <div class="col-sm-6"> 451 <ul class="fa-ul"> 452 <li> 453 <span class="fa-li"><?= view('icons/location') ?></span> 454 <a href="<?= e(route('map-data')) ?>"> 455 <?= I18N::translate('Geographic data') ?> 456 </a> 457 </li> 458 </ul> 459 </div> 460 <div class="col-sm-6"> 461 <ul class="fa-ul"> 462 <li> 463 <span class="fa-li"><?= view('icons/map') ?></span> 464 <a href="<?= e(route('map-provider')) ?>"> 465 <?= I18N::translate('Map provider') ?> 466 </a> 467 </li> 468 </ul> 469 </div> 470 </div> 471 </div> 472</div> 473 474<!-- OLD FILES --> 475<?php if (!empty($files_to_delete)) : ?> 476 <div class="card mb-4 card-outline-danger"> 477 <div class="card-header"> 478 <h2 class="mb-0"> 479 <?= I18N::translate('Old files found') ?> 480 </h2> 481 </div> 482 <div class="card-body"> 483 <p> 484 <?= I18N::translate('Files have been found from a previous version of webtrees. Old files can sometimes be a security risk. You should delete them.') ?> 485 </p> 486 <ul class="list-unstyled"> 487 <?php foreach ($files_to_delete as $file_to_delete) : ?> 488 <li dir="ltr"><code><?= e($file_to_delete) ?></code></li> 489 <?php endforeach ?> 490 </ul> 491 </div> 492 </div> 493<?php endif ?> 494