fisharebest/webtrees

View on GitHub
resources/views/modules/relatives/family.phtml

Summary

Maintainability
Test Coverage
<?php

declare(strict_types=1);

use Fisharebest\Webtrees\Date;
use Fisharebest\Webtrees\Family;
use Fisharebest\Webtrees\Gedcom;
use Fisharebest\Webtrees\Http\RequestHandlers\AddChildToFamilyPage;
use Fisharebest\Webtrees\Http\RequestHandlers\AddNewFact;
use Fisharebest\Webtrees\Http\RequestHandlers\AddSpouseToFamilyPage;
use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenPage;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\RelationshipService;

/**
 * @var Family     $family
 * @var int        $fam_access_level
 * @var Individual $individual
 * @var string     $label
 * @var string     $type
 */

?>

<table class="table table-sm wt-facts-table">
    <caption>
        <a href="<?= e($family->url()) ?>"><?= $label ?></a>
    </caption>

    <tbody>
        <?php
        $found = false;
        foreach ($family->facts(['HUSB'], false, $fam_access_level) as $fact) {
            $found |= !$fact->isPendingDeletion();
            $person = $fact->target();
            if ($person instanceof Individual) {
                $row_class = 'wt-sex-' . strtolower($person->sex());
                if ($fact->isPendingAddition()) {
                    $row_class .= ' wt-new';
                } elseif ($fact->isPendingDeletion()) {
                    $row_class .= ' wt-old';
                }
                ?>
                <tr class="<?= $row_class ?>">
                    <th scope="row">
                        <?= $individual === $person ? '<i class="icon-selected"></i>' : '' ?>
                        <?= Registry::container()->get(RelationshipService::class)->getCloseRelationshipName($individual, $person) ?>
                    </th>
                    <td class="border-0 p-0">
                        <?= view('chart-box', ['individual' => $person]) ?>
                    </td>
                </tr>
                <?php
            }
        }
        if (!$found && $family->canEdit()) {
            ?>
            <tr>
                <th scope="row"></th>
                <td>
                    <a href="<?= e(route(AddSpouseToFamilyPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'sex' => 'M', 'url' => $individual->url() . '#tab-relatives'])) ?>">
                        <?= I18N::translate('Add a husband') ?>
                    </a>
                </td>
            </tr>
            <?php
        }

        $found = false;
        foreach ($family->facts(['WIFE'], false, $fam_access_level) as $fact) {
            $person = $fact->target();
            if ($person instanceof Individual) {
                $found |= !$fact->isPendingDeletion();
                $row_class = 'wt-sex-' . strtolower($person->sex());
                if ($fact->isPendingAddition()) {
                    $row_class .= ' wt-new';
                } elseif ($fact->isPendingDeletion()) {
                    $row_class .= ' wt-old';
                }
                ?>

                <tr class="<?= $row_class ?>">
                    <th scope="row">
                        <?= $individual === $person ? '<i class="icon-selected"></i>' : '' ?>
                        <?= Registry::container()->get(RelationshipService::class)->getCloseRelationshipName($individual, $person) ?>
                    </th>
                    <td class="border-0 p-0">
                        <?= view('chart-box', ['individual' => $person]) ?>
                    </td>
                </tr>
                <?php
            }
        }
        if (!$found && $family->canEdit()) { ?>
            <tr>
                <th scope="row"></th>
                <td>
                    <a href="<?= e(route(AddSpouseToFamilyPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'sex' => 'F', 'url' => $individual->url() . '#tab-relatives'])) ?>">
                        <?= I18N::translate('Add a wife') ?>
                    </a>
                </td>
            </tr>

        <?php } ?>

        <?php
        ///// MARR /////
        $found = false;
        $prev  = new Date('');
        foreach ($family->facts(array_merge(Gedcom::MARRIAGE_EVENTS, Gedcom::DIVORCE_EVENTS), true) as $fact) {
            $found |= !$fact->isPendingDeletion();
            if ($fact->isPendingAddition()) {
                $row_class = 'wt-new';
            } elseif ($fact->isPendingDeletion()) {
                $row_class = 'wt-old';
            } else {
                $row_class = '';
            }
            ?>

            <tr class="<?= $row_class ?>">
                <th scope="row">
                    <span class="visually-hidden"><?= $fact->label() ?></span>
                </th>

                <td>
                    <span class="label"><?= $fact->label() ?></span>
                    —
                    <span class="field"><?= $fact->date()->display() ?> — <?= $fact->place()->fullName() ?></span>
                </td>
            </tr>

            <?php
            if (!$prev->isOK() && $fact->date()->isOK()) {
                $prev = $fact->date();
            }
        }

        if (!$found && $family->canShow() && $family->canEdit()) {
            ?>
            <tr>
                <th scope="row">
                    <span class="visually-hidden"><?= I18N::translate('Marriage') ?></span>
                </th>

                <td>
                    <a href="<?= e(route(AddNewFact::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'fact' => 'MARR'])) ?>">
                        <?= I18N::translate('Add marriage details') ?>
                    </a>
                </td>
            </tr>
            <?php
        }

        ///// CHIL /////
        $child_number = 0;
        foreach ($family->facts(['CHIL'], false, $fam_access_level) as $fact) {
            $person = $fact->target();
            if ($person instanceof Individual) {
                $row_class = 'wt-sex-' . strtolower($person->sex());
                if ($fact->isPendingAddition()) {
                    $child_number++;
                    $row_class .= ' new';
                } elseif ($fact->isPendingDeletion()) {
                    $row_class .= ' old';
                } else {
                    $child_number++;
                }
                $next = new Date('');
                foreach ($person->facts(Gedcom::BIRTH_EVENTS, true) as $bfact) {
                    if ($bfact->date()->isOK()) {
                        $next = $bfact->date();
                        break;
                    }
                }
                ?>

                <tr class="<?= $row_class ?>">
                    <th scope="row">
                        <?php if ($individual === $person) : ?>
                            <i class="icon-selected"></i>
                        <?php endif ?>

                        <?php if ($prev->isOK() && $next->isOK()) : ?>
                            <div class="wt-date-difference collapse small">
                                <?php $days = $next->maximumJulianDay() - $prev->minimumJulianDay(); ?>
                                <?php if ($days < 0 || $child_number > 1 && $days > 1 && $days < 240) : ?>
                                    <?= view('icons/warning') ?>
                                <?php endif ?>

                                <?php $months = intdiv($days + 15, 30); ?>
                                <?php if (abs($months) === 12 || abs($months) >= 24) : ?>
                                    <?= I18N::plural('%s year', '%s years', intdiv($months, 12), I18N::number(round($months / 12))) ?>
                                <?php elseif ($months !== 0) : ?>
                                    <?= I18N::plural('%s month', '%s months', $months, I18N::number($months)) ?>
                                <?php endif ?>
                            </div>
                        <?php endif ?>

                        <?= Registry::container()->get(RelationshipService::class)->getCloseRelationshipName($individual, $person) ?>
                    </th>
                    <td class="border-0 p-0">
                        <?= view('chart-box', ['individual' => $person]) ?>
                    </td>
                </tr>
                <?php
                $prev = $next;
            }
        } ?>

        <?php if ($family->canEdit()) : ?>
            <tr>
                <th scope="row">
                    <span class="visually-hidden"><?= I18N::translate('Children') ?></span>
                </th>

                <td>
                    <a href="<?= e(route(AddChildToFamilyPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'sex' => 'M', 'url' => $individual->url() . '#tab-relatives'])) ?>">
                        <?= $type === 'FAMS' ? I18N::translate('Add a son') : I18N::translate('Add a brother') ?>
                    </a>
                    |
                    <a href="<?= e(route(AddChildToFamilyPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'sex' => 'F', 'url' => $individual->url() . '#tab-relatives'])) ?>">
                        <?= $type === 'FAMS' ? I18N::translate('Add a daughter') : I18N::translate('Add a sister') ?>
                    </a>
                    |
                    <a href="<?= e(route(AddChildToFamilyPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'sex' => 'U', 'url' => $individual->url() . '#tab-relatives'])) ?>">
                        <?= $type === 'FAMS' ? I18N::translate('Add a child') : I18N::translate('Add a sibling') ?>
                    </a>

                    <?php if ($family->children()->count() > 1) : ?>
                        <br>
                        <a href="<?= e(route(ReorderChildrenPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref(), 'url' => $individual->url() . '#tab-relatives'])) ?>">
                            <?= I18N::translate('Re-order children') ?>
                        </a>
                    <?php endif; ?>
                </td>
            </tr>
        <?php endif ?>
    </tbody>
</table>