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