xref: /webtrees/resources/views/modules/relatives/family.phtml (revision 9e18e23b968678b192e5541acd3252e4978d69c3)
1<?php use Fisharebest\Webtrees\Date; ?>
2<?php use Fisharebest\Webtrees\Functions\Functions; ?>
3<?php use Fisharebest\Webtrees\Gedcom; ?>
4<?php use Fisharebest\Webtrees\GedcomTag; ?>
5<?php use Fisharebest\Webtrees\Http\RequestHandlers\AddNewFact;
6use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenPage;
7use Fisharebest\Webtrees\I18N; ?>
8<?php use Fisharebest\Webtrees\Individual; ?>
9
10<table class="table table-sm wt-facts-table">
11    <caption>
12        <i class="icon-cfamily"></i>
13        <a href="<?= e($family->url()) ?>"><?= $label ?></a>
14    </caption>
15
16    <tbody>
17        <?php
18        $found = false;
19        foreach ($family->facts(['HUSB'], false, $fam_access_level) as $fact) {
20            $found |= !$fact->isPendingDeletion();
21            $person = $fact->target();
22            if ($person instanceof Individual) {
23                $row_class = 'wt-gender-' . $person->sex();
24                if ($fact->isPendingAddition()) {
25                    $row_class .= ' new';
26                } elseif ($fact->isPendingDeletion()) {
27                    $row_class .= ' old';
28                }
29                ?>
30                <tr class="<?= $row_class ?>">
31                    <th scope="row">
32                        <?= $individual === $person ? '<i class="icon-selected"></i>' : '' ?>
33                        <?= Functions::getCloseRelationshipName($individual, $person) ?>
34                    </th>
35                    <td class="border-0 p-0">
36                        <?= view('chart-box', ['individual' => $person]) ?>
37                    </td>
38                </tr>
39                <?php
40            }
41        }
42        if (!$found && $family->canEdit()) {
43            ?>
44            <tr>
45                <th scope="row"></th>
46                <td>
47                    <a href="<?= e(route('add-spouse-to-family', ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'famtag' => 'HUSB'])) ?>">
48                        <?= I18N::translate('Add a husband') ?>
49                    </a>
50                </td>
51            </tr>
52            <?php
53        }
54
55        $found = false;
56        foreach ($family->facts(['WIFE'], false, $fam_access_level) as $fact) {
57            $person = $fact->target();
58            if ($person instanceof Individual) {
59                $found |= !$fact->isPendingDeletion();
60                $row_class = 'wt-gender-' . $person->sex();
61                if ($fact->isPendingAddition()) {
62                    $row_class .= ' new';
63                } elseif ($fact->isPendingDeletion()) {
64                    $row_class .= ' old';
65                }
66                ?>
67
68                <tr class="<?= $row_class ?>">
69                    <th scope="row">
70                        <?= $individual === $person ? '<i class="icon-selected"></i>' : '' ?>
71                        <?= Functions::getCloseRelationshipName($individual, $person) ?>
72                    </th>
73                    <td class="border-0 p-0">
74                        <?= view('chart-box', ['individual' => $person]) ?>
75                    </td>
76                </tr>
77                <?php
78            }
79        }
80        if (!$found && $family->canEdit()) { ?>
81            <tr>
82                <th scope="row"></th>
83                <td>
84                    <a href="<?= e(route('add-spouse-to-family', ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'famtag' => 'WIFE'])) ?>">
85                        <?= I18N::translate('Add a wife') ?>
86                    </a>
87                </td>
88            </tr>
89
90        <?php } ?>
91
92        <?php
93        ///// MARR /////
94        $found = false;
95        $prev  = new Date('');
96        foreach ($family->facts(array_merge(Gedcom::MARRIAGE_EVENTS, Gedcom::DIVORCE_EVENTS), true) as $fact) {
97            $found |= !$fact->isPendingDeletion();
98            if ($fact->isPendingAddition()) {
99                $row_class = 'wt-new';
100            } elseif ($fact->isPendingDeletion()) {
101                $row_class = 'wt-old';
102            } else {
103                $row_class = '';
104            }
105            ?>
106
107            <tr class="<?= $row_class ?>">
108                <th scope="row">
109                </th>
110                <td>
111                    <?= GedcomTag::getLabelValue($fact->getTag(), $fact->date()->display() . ' — ' . $fact->place()->fullName()) ?>
112                </td>
113            </tr>
114
115            <?php
116            if (!$prev->isOK() && $fact->date()->isOK()) {
117                $prev = $fact->date();
118            }
119        }
120
121        if (!$found && $family->canShow() && $family->canEdit()) {
122            ?>
123            <tr>
124                <th scope="row">
125                </th>
126                <td>
127                    <a href="<?= e(route(AddNewFact::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'fact' => 'MARR'])) ?>">
128                        <?= I18N::translate('Add marriage details') ?>
129                    </a>
130                </td>
131            </tr>
132            <?php
133        }
134
135        ///// CHIL /////
136        $child_number = 0;
137        foreach ($family->facts(['CHIL'], false, $fam_access_level) as $fact) {
138            $person = $fact->target();
139            if ($person instanceof Individual) {
140                $row_class = 'wt-gender-' . $person->sex();
141                if ($fact->isPendingAddition()) {
142                    $child_number++;
143                    $row_class .= ' new';
144                } elseif ($fact->isPendingDeletion()) {
145                    $row_class .= ' old';
146                } else {
147                    $child_number++;
148                }
149                $next = new Date('');
150                foreach ($person->facts(Gedcom::BIRTH_EVENTS, true) as $bfact) {
151                    if ($bfact->date()->isOK()) {
152                        $next = $bfact->date();
153                        break;
154                    }
155                }
156                ?>
157
158                <tr class="<?= $row_class ?>">
159                    <th scope="row">
160                        <?php if ($individual === $person) : ?>
161                            <i class="icon-selected"></i>
162                        <?php endif ?>
163
164                        <?php if ($prev->isOK() && $next->isOK()) : ?>
165                            <div class="wt-date-difference collapse small">
166                                <?php $days = $next->maximumJulianDay() - $prev->minimumJulianDay(); ?>
167                                <?php if ($days < 0 || $child_number > 1 && $days > 1 && $days < 240) : ?>
168                                    <?= view('icons/warning') ?>
169                                <?php endif ?>
170
171                                <?php $months = round($days / 30); ?>
172                                <?php if (abs($months) === 12 || abs($months) >= 24) : ?>
173                                    <?= I18N::plural('%s year', '%s years', round($months / 12), I18N::number(round($months / 12))) ?>
174                                <?php elseif ($months !== 0) : ?>
175                                    <?= I18N::plural('%s month', '%s months', $months, I18N::number($months)) ?>
176                                <?php endif ?>
177                            </div>
178                        <?php endif ?>
179
180                        <?= Functions::getCloseRelationshipName($individual, $person) ?>
181                    </th>
182                    <td class="border-0 p-0">
183                        <?= view('chart-box', ['individual' => $person]) ?>
184                    </td>
185                </tr>
186                <?php
187                $prev = $next;
188            }
189        } ?>
190
191        <?php if ($family->canEdit()) : ?>
192            <tr>
193                <th scope="row">
194                    <?php if ($family->children()->count() > 1) : ?>
195                        <a href="<?= e(route(ReorderChildrenPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>">
196                            <?= view('icons/reorder') ?>
197                            <?= I18N::translate('Re-order children') ?>
198                        </a>
199                    <?php endif; ?>
200                </th>
201                <td>
202                    <a href="<?= e(route('add-child-to-family', ['gender' => 'U', 'tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>">
203                        <?php if ($type === 'FAMS') : ?>
204                            <?= I18N::translate('Add a son or daughter') ?>
205                        <?php else : ?>
206                            <?= I18N::translate('Add a brother or sister') ?>
207                        <?php endif ?>
208                    </a>
209
210                    <a href="<?= e(route('add-child-to-family', ['gender' => 'M', 'tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>" class="icon-sex_m_15x15"></a>
211
212                    <a href="<?= e(route('add-child-to-family', ['gender' => 'F', 'tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>" class="icon-sex_f_15x15"></a>
213                </td>
214            </tr>
215        <?php endif ?>
216    </tbody>
217</table>
218