1*2c3dad18SGreg Roach<?php 2*2c3dad18SGreg Roachuse Fisharebest\Webtrees\Auth; 3*2c3dad18SGreg Roachuse Fisharebest\Webtrees\Functions\FunctionsPrint; 4*2c3dad18SGreg Roachuse Fisharebest\Webtrees\I18N; 5*2c3dad18SGreg Roachuse Fisharebest\Webtrees\Individual; 6*2c3dad18SGreg Roachuse Fisharebest\Webtrees\View; 7*2c3dad18SGreg Roachuse Illuminate\Support\Collection; 8*2c3dad18SGreg Roach 9*2c3dad18SGreg Roach/** 10*2c3dad18SGreg Roach * @var Individual $individual 11*2c3dad18SGreg Roach * @var string $user_link 12*2c3dad18SGreg Roach * @var int $count_names 13*2c3dad18SGreg Roach * @var int $count_sex 14*2c3dad18SGreg Roach * @var Collection $sidebars 15*2c3dad18SGreg Roach * @var Collection $name_records 16*2c3dad18SGreg Roach * @var Collection $sex_records 17*2c3dad18SGreg Roach * @var Collection $tabs 18*2c3dad18SGreg Roach */ 19*2c3dad18SGreg Roach?> 20dd6b2bfcSGreg Roach 21dd6b2bfcSGreg Roach<?php if ($individual->isPendingDeletion()) : ?> 22f4afa648SGreg Roach <?php if (Auth::isModerator($individual->tree())) : ?> 23dd6b2bfcSGreg Roach <?= view('components/alert-warning-dismissible', [ 24dd6b2bfcSGreg Roach 'alert' => /* I18N: %1$s is “accept”, %2$s is “reject”. These are links. */ 25f4afa648SGreg Roach I18N::translate('This individual has been deleted. You should review the deletion and then %1$s or %2$s it.', '<a href="#" class="alert-link" onclick="accept_changes(\'' . e($individual->xref()) . '\', \'' . e($individual->tree()->name()) . '\');">' . I18N::translateContext('You should review the deletion and then accept or reject it.', 'accept') . '</a>', '<a href="#" class="alert-link" onclick="reject_changes(\'' . e($individual->xref()) . '\', \'' . e($individual->tree()->name()) . '\');">' . I18N::translateContext('You should review the deletion and then accept or reject it.', 'reject') . '</a>') . ' ' . FunctionsPrint::helpLink('pending_changes'), 26dd6b2bfcSGreg Roach ]) ?> 27f4afa648SGreg Roach <?php elseif (Auth::isEditor($individual->tree())) : ?> 28dd6b2bfcSGreg Roach <?= view('components/alert-warning-dismissible', ['alert' => I18N::translate('This individual has been deleted. The deletion will need to be reviewed by a moderator.') . ' ' . FunctionsPrint::helpLink('pending_changes')]) ?> 29dd6b2bfcSGreg Roach <?php endif ?> 30dd6b2bfcSGreg Roach<?php elseif ($individual->isPendingAddition()) : ?> 31f4afa648SGreg Roach <?php if (Auth::isModerator($individual->tree())) : ?> 32dd6b2bfcSGreg Roach <?= view('components/alert-warning-dismissible', [ 33dd6b2bfcSGreg Roach 'alert' => /* I18N: %1$s is “accept”, %2$s is “reject”. These are links. */ 34f4afa648SGreg Roach I18N::translate('This individual has been edited. You should review the changes and then %1$s or %2$s them.', '<a href="#" class="alert-link" onclick="accept_changes(\'' . e($individual->xref()) . '\', \'' . e($individual->tree()->name()) . '\');">' . I18N::translateContext('You should review the changes and then accept or reject them.', 'accept') . '</a>', '<a href="#" class="alert-link" onclick="reject_changes(\'' . e($individual->xref()) . '\', \'' . e($individual->tree()->name()) . '\');">' . I18N::translateContext('You should review the changes and then accept or reject them.', 'reject') . '</a>') . ' ' . FunctionsPrint::helpLink('pending_changes'), 35dd6b2bfcSGreg Roach ]) ?> 36f4afa648SGreg Roach <?php elseif (Auth::isEditor($individual->tree())) : ?> 37dd6b2bfcSGreg Roach <?= view('components/alert-warning-dismissible', ['alert' => I18N::translate('This individual has been edited. The changes need to be reviewed by a moderator.') . ' ' . FunctionsPrint::helpLink('pending_changes')]) ?> 38dd6b2bfcSGreg Roach <?php endif ?> 39dd6b2bfcSGreg Roach<?php endif ?> 40dd6b2bfcSGreg Roach 41dd6b2bfcSGreg Roach<div class="d-flex mb-4"> 42dd6b2bfcSGreg Roach <h2 class="wt-page-title mx-auto"> 4339ca88baSGreg Roach <?= $individual->fullName() ?><?= $user_link ?>, <?= $individual->getLifeSpan() ?> <?= $age ?> 44dd6b2bfcSGreg Roach </h2> 451450f098SGreg Roach <?php if ($individual->canEdit()) : ?> 46dd6b2bfcSGreg Roach <?= view('individual-page-menu', ['individual' => $individual, 'count_names' => $count_names, 'count_sex' => $count_sex]) ?> 47dd6b2bfcSGreg Roach <?php endif ?> 48dd6b2bfcSGreg Roach</div> 49dd6b2bfcSGreg Roach 50dd6b2bfcSGreg Roach<div class="row"> 518d38dd5aSGreg Roach <div class="<?= $sidebars->isEmpty() ? 'col-sm-12' : 'col-sm-8' ?>"> 52dd6b2bfcSGreg Roach <div class="row mb-4"> 53dd6b2bfcSGreg Roach <!-- Individual images --> 54dd6b2bfcSGreg Roach <div class="col-sm-3"> 55dd6b2bfcSGreg Roach <?php if (empty($individual_media)) : ?> 5639ca88baSGreg Roach <i class="wt-individual-silhouette wt-individual-silhouette-<?= strtolower($individual->sex()) ?>"></i> 57dd6b2bfcSGreg Roach <?php elseif (count($individual_media) === 1) : ?> 58dd6b2bfcSGreg Roach <?= $individual_media[0]->displayImage(200, 260, 'crop', ['class' => 'img-thumbnail img-fluid w-100']) ?> 59dd6b2bfcSGreg Roach <?php else : ?> 60dd6b2bfcSGreg Roach <div id="individual-images" class="carousel slide" data-ride="carousel" data-interval="false"> 61dd6b2bfcSGreg Roach <div class="carousel-inner"> 62dd6b2bfcSGreg Roach <?php foreach ($individual_media as $n => $media_file) : ?> 63dd6b2bfcSGreg Roach <div class="carousel-item <?= $n === 0 ? 'active' : '' ?>"> 64dd6b2bfcSGreg Roach <?= $media_file->displayImage(200, 260, 'crop', ['class' => 'img-thumbnail img-fluid w-100']) ?> 65dd6b2bfcSGreg Roach </div> 66dd6b2bfcSGreg Roach <?php endforeach ?> 67dd6b2bfcSGreg Roach </div> 68dd6b2bfcSGreg Roach <a class="carousel-control-prev" href="#individual-images" role="button" data-slide="prev"> 69dd6b2bfcSGreg Roach <span class="carousel-control-prev-icon" aria-hidden="true"></span> 70dd6b2bfcSGreg Roach <span class="sr-only"><?= I18N::translate('previous') ?></span> 71dd6b2bfcSGreg Roach </a> 72dd6b2bfcSGreg Roach <a class="carousel-control-next" href="#individual-images" role="button" data-slide="next"> 73dd6b2bfcSGreg Roach <span class="carousel-control-next-icon" aria-hidden="true"></span> 74dd6b2bfcSGreg Roach <span class="sr-only"><?= I18N::translate('next') ?></span> 75dd6b2bfcSGreg Roach </a> 76dd6b2bfcSGreg Roach </div> 77dd6b2bfcSGreg Roach 78dd6b2bfcSGreg Roach <?php endif ?> 79dd6b2bfcSGreg Roach 80f4afa648SGreg Roach <?php if (Auth::isEditor($individual->tree())) : ?> 8139ca88baSGreg Roach <?php if ($individual->facts(['OBJE'])->count() > 1) : ?> 82dd6b2bfcSGreg Roach <div> 83f4afa648SGreg Roach <a href="<?= e(route('reorder-media', ['ged' => $individual->tree()->name(), 'xref' => $individual->xref()])) ?>"> 84e39fd5c6SGreg Roach <?= view('icons/reorder') ?> 85dd6b2bfcSGreg Roach <?= I18N::translate('Re-order media') ?> 86dd6b2bfcSGreg Roach </a> 87dd6b2bfcSGreg Roach </div> 88dd6b2bfcSGreg Roach <?php endif ?> 89dd6b2bfcSGreg Roach 90f4afa648SGreg Roach <?php if ($individual->tree()->getPreference('MEDIA_UPLOAD') >= Auth::accessLevel($individual->tree())) : ?> 91dd6b2bfcSGreg Roach <div> 92f4afa648SGreg Roach <a href="<?= e(route('add-fact', ['ged' => $individual->tree()->name(), 'xref' => $individual->xref(), 'fact' => 'OBJE'])) ?>"> 93dd6b2bfcSGreg Roach <?= I18N::translate('Add a media object') ?> 94dd6b2bfcSGreg Roach </a> 95dd6b2bfcSGreg Roach </div> 96dd6b2bfcSGreg Roach <?php endif ?> 97dd6b2bfcSGreg Roach <?php endif ?> 98dd6b2bfcSGreg Roach </div> 99dd6b2bfcSGreg Roach 100dd6b2bfcSGreg Roach <!-- Name accordion --> 101dd6b2bfcSGreg Roach <div class="col-sm-9" id="individual-names" role="tablist"> 102dd6b2bfcSGreg Roach <?php foreach ($name_records as $name_record) : ?> 103dd6b2bfcSGreg Roach <?= $name_record ?> 104dd6b2bfcSGreg Roach <?php endforeach ?> 105dd6b2bfcSGreg Roach 106dd6b2bfcSGreg Roach <?php foreach ($sex_records as $sex_record) : ?> 107dd6b2bfcSGreg Roach <?= $sex_record ?> 108dd6b2bfcSGreg Roach <?php endforeach ?> 109dd6b2bfcSGreg Roach </div> 110dd6b2bfcSGreg Roach </div> 111dd6b2bfcSGreg Roach 1124a2590a5SGreg Roach <div class="wt-tabs-individual" id="individual-tabs"> 113dd6b2bfcSGreg Roach <ul class="nav nav-tabs flex-wrap"> 114dd6b2bfcSGreg Roach <?php foreach ($tabs as $tab) : ?> 115dd6b2bfcSGreg Roach <li class="nav-item"> 116677aaceaSGreg Roach <a class="nav-link<?= $tab->isGrayedOut($individual) ? ' text-muted' : '' ?>" data-toggle="tab" role="tab" data-href="<?= e(route('individual-tab', ['xref' => $individual->xref(), 'ged' => $individual->tree()->name(), 'module' => $tab->name()])) ?>" href="#<?= $tab->name() ?>"> 117defb8071SRichard Cissée <?= $tab->tabTitle() ?> 118dd6b2bfcSGreg Roach </a> 119dd6b2bfcSGreg Roach </li> 120dd6b2bfcSGreg Roach <?php endforeach ?> 121dd6b2bfcSGreg Roach </ul> 122dd6b2bfcSGreg Roach <div class="tab-content"> 123dd6b2bfcSGreg Roach <?php foreach ($tabs as $tab) : ?> 124677aaceaSGreg Roach <div id="<?= $tab->name() ?>" class="tab-pane fade wt-ajax-load" role="tabpanel"><?php if (!$tab->canLoadAjax()) : 125dd6b2bfcSGreg Roach ?><?= $tab->getTabContent($individual) ?><?php 126dd6b2bfcSGreg Roach endif ?></div> 127dd6b2bfcSGreg Roach <?php endforeach ?> 128dd6b2bfcSGreg Roach </div> 129dd6b2bfcSGreg Roach </div> 130dd6b2bfcSGreg Roach </div> 131c72fc94cSGreg Roach <?php if ($sidebars->isNotEmpty()) : ?> 132dd6b2bfcSGreg Roach <div class="col-sm-4" id="sidebar" role="tablist"> 133dd6b2bfcSGreg Roach <?php foreach ($sidebars as $sidebar) : ?> 134dd6b2bfcSGreg Roach <div class="card"> 135677aaceaSGreg Roach <div class="card-header" role="tab" id="sidebar-header-<?= $sidebar->name() ?>"> 136dd6b2bfcSGreg Roach <div class="card-title mb-0"> 137677aaceaSGreg Roach <a data-toggle="collapse" data-parent="#sidebar" href="#sidebar-content-<?= $sidebar->name() ?>" aria-expanded="<?= $sidebar->name() === 'family_nav' ? 'true' : 'false' ?>" aria-controls="sidebar-content-<?= $sidebar->name() ?>"> 138defb8071SRichard Cissée <?= $sidebar->sidebarTitle() ?> 139dd6b2bfcSGreg Roach </a> 140dd6b2bfcSGreg Roach </div> 141dd6b2bfcSGreg Roach </div> 142677aaceaSGreg Roach <div id="sidebar-content-<?= $sidebar->name() ?>" class="collapse<?= $sidebar->name() === 'family_nav' ? ' show' : '' ?>" role="tabpanel" aria-labelledby="sidebar-header-<?= $sidebar->name() ?>"> 143dd6b2bfcSGreg Roach <div class="card-body"> 144dd6b2bfcSGreg Roach <?= $sidebar->getSidebarContent($individual) ?></div> 145dd6b2bfcSGreg Roach </div> 146dd6b2bfcSGreg Roach </div> 147dd6b2bfcSGreg Roach <?php endforeach ?> 148dd6b2bfcSGreg Roach </div> 149c72fc94cSGreg Roach <?php endif ?> 150dd6b2bfcSGreg Roach</div> 151dd6b2bfcSGreg Roach 152dd6b2bfcSGreg Roach<?php View::push('javascript') ?> 153dd6b2bfcSGreg Roach<script> 154dd6b2bfcSGreg Roach "use strict"; 155dd6b2bfcSGreg Roach 156dd6b2bfcSGreg Roach // Bootstrap tabs - load content dynamically using AJAX 157dd6b2bfcSGreg Roach $('a[data-toggle="tab"][data-href]').on('show.bs.tab', function () { 158dd6b2bfcSGreg Roach $(this.getAttribute('href') + ':empty').load($(this).data('href')); 159dd6b2bfcSGreg Roach }); 160dd6b2bfcSGreg Roach 161dd6b2bfcSGreg Roach // If the URL contains a fragment, then activate the corresponding tab. 162dd6b2bfcSGreg Roach // Use a prefix on the fragment, to prevent scrolling to the element. 163dd6b2bfcSGreg Roach var target = window.location.hash.replace("tab-", ""); 164dd6b2bfcSGreg Roach var tab = $("#individual-tabs .nav-link[href='" + target + "']"); 165dd6b2bfcSGreg Roach // If not, then activate the first tab. 166dd6b2bfcSGreg Roach if (tab.length === 0) { 167dd6b2bfcSGreg Roach tab = $("#individual-tabs .nav-link:first"); 168dd6b2bfcSGreg Roach } 169dd6b2bfcSGreg Roach tab.tab("show"); 170dd6b2bfcSGreg Roach 171dd6b2bfcSGreg Roach // If the user selects a tab, update the URL to reflect this 172dd6b2bfcSGreg Roach $('#individual-tabs a[data-toggle="tab"]').on('shown.bs.tab', function (e) { 173dd6b2bfcSGreg Roach window.location.hash = "tab-" + e.target.href.substring(e.target.href.indexOf('#') + 1); 174dd6b2bfcSGreg Roach }); 175dd6b2bfcSGreg Roach</script> 176dd6b2bfcSGreg Roach<?php View::endpush() ?> 177dd6b2bfcSGreg Roach 178dd6b2bfcSGreg Roach<?= view('modals/ajax') ?> 179