xref: /webtrees/resources/views/individual-page.phtml (revision 2c3dad1813c5811b493ead1d21d66de181d13f0b)
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