xref: /webtrees/resources/views/lists/locations-table.phtml (revision d97083fe315dad9b7d0a150d4fb5f563e57d1869)
1e8ded2caSGreg Roach<?php
2e8ded2caSGreg Roach
3e8ded2caSGreg Roachuse Fisharebest\Webtrees\I18N;
4e8ded2caSGreg Roachuse Fisharebest\Webtrees\Location;
5e8ded2caSGreg Roachuse Fisharebest\Webtrees\Tree;
6e8ded2caSGreg Roachuse Illuminate\Database\Capsule\Manager as DB;
7e8ded2caSGreg Roachuse Illuminate\Database\Query\Expression;
8e8ded2caSGreg Roachuse Illuminate\Database\Query\JoinClause;
9e8ded2caSGreg Roachuse Illuminate\Support\Collection;
10e8ded2caSGreg Roach
11e8ded2caSGreg Roach/**
1236779af1SGreg Roach * @var Collection<int,Location> $locations
13e8ded2caSGreg Roach * @var Tree                     $tree
14e8ded2caSGreg Roach */
15e8ded2caSGreg Roach
16e8ded2caSGreg Roach?>
17e8ded2caSGreg Roach
18e8ded2caSGreg Roach<?php
19e8ded2caSGreg Roach// Count the number of linked records. These numbers include private records.
20e8ded2caSGreg Roach// It is not good to bypass privacy, but many servers do not have the resources
21e8ded2caSGreg Roach// to process privacy for every record in the tree
22e8ded2caSGreg Roach$count_individuals = DB::table('individuals')
23e8ded2caSGreg Roach    ->join('link', static function (JoinClause $join): void {
24e8ded2caSGreg Roach        $join->on('l_from', '=', 'i_id');
25e8ded2caSGreg Roach        $join->on('l_file', '=', 'i_file');
26e8ded2caSGreg Roach    })
27e8ded2caSGreg Roach    ->where('l_type', '=', '_LOC')
28e8ded2caSGreg Roach    ->where('l_file', '=', $tree->id())
29e8ded2caSGreg Roach    ->groupBy(['l_to'])
30e8ded2caSGreg Roach    ->select(['l_to', new Expression('COUNT(*) AS total')])
31e8ded2caSGreg Roach    ->pluck('total', 'l_to')
32e8ded2caSGreg Roach    ->all();
33e8ded2caSGreg Roach
34e8ded2caSGreg Roach$count_families = DB::table('families')
35e8ded2caSGreg Roach    ->join('link', static function (JoinClause $join): void {
36e8ded2caSGreg Roach        $join->on('l_from', '=', 'f_id');
37e8ded2caSGreg Roach        $join->on('l_file', '=', 'f_file');
38e8ded2caSGreg Roach    })
39e8ded2caSGreg Roach    ->where('l_type', '=', '_LOC')
40e8ded2caSGreg Roach    ->where('l_file', '=', $tree->id())
41e8ded2caSGreg Roach    ->groupBy(['l_to'])
42e8ded2caSGreg Roach    ->select(['l_to', new Expression('COUNT(*) AS total')])
43e8ded2caSGreg Roach    ->pluck('total', 'l_to')
44e8ded2caSGreg Roach    ->all();
45e8ded2caSGreg Roach?>
46e8ded2caSGreg Roach
47e8ded2caSGreg Roach<table
48e8ded2caSGreg Roach    class="table table-bordered table-sm wt-table-location datatables d-none"
49e8ded2caSGreg Roach    <?= view('lists/datatables-attributes') ?>
50e8ded2caSGreg Roach    data-columns="<?= e(json_encode([
51eef4add8SGreg Roach        ['type' => 'html'],
52e8ded2caSGreg Roach        ['visible' => array_sum($count_individuals) > 0],
53e8ded2caSGreg Roach        ['visible' => array_sum($count_families) > 0],
54e8ded2caSGreg Roach        ['visible' => (bool) $tree->getPreference('SHOW_LAST_CHANGE'), 'searchable' => false],
55728c8c27SGreg Roach    ], JSON_THROW_ON_ERROR)) ?>"
56e8ded2caSGreg Roach>
57315eb316SGreg Roach    <caption class="visually-hidden">
58e8ded2caSGreg Roach        <?= $caption ?? I18N::translate('Locations') ?>
59e8ded2caSGreg Roach    </caption>
60e8ded2caSGreg Roach
61e8ded2caSGreg Roach    <thead>
62e8ded2caSGreg Roach        <tr>
63e8ded2caSGreg Roach            <th><?= I18N::translate('Location') ?></th>
64e8ded2caSGreg Roach            <th><?= I18N::translate('Individuals') ?></th>
65e8ded2caSGreg Roach            <th><?= I18N::translate('Families') ?></th>
66e8ded2caSGreg Roach            <th><?= I18N::translate('Last change') ?></th>
67e8ded2caSGreg Roach        </tr>
68e8ded2caSGreg Roach    </thead>
69e8ded2caSGreg Roach
70e8ded2caSGreg Roach    <tbody>
71e8ded2caSGreg Roach        <?php foreach ($locations as $location) : ?>
72e8ded2caSGreg Roach            <tr class="<?= $location->isPendingAddition() ? 'wt-new' : '' ?> <?= $location->isPendingDeletion() ? 'wt-old' : '' ?>">
73e8ded2caSGreg Roach                <!-- Location name -->
74e8ded2caSGreg Roach                <td data-sort="<?= e($location->sortName()) ?>">
75e8ded2caSGreg Roach                    <a href="<?= e($location->url()) ?>">
76e8ded2caSGreg Roach                        <?= $location->fullName() ?>
77e8ded2caSGreg Roach                    </a>
78e8ded2caSGreg Roach                </td>
79e8ded2caSGreg Roach
80e8ded2caSGreg Roach                <!-- Count of linked individuals -->
81e8ded2caSGreg Roach                <td class="text-center" data-sort="<?= $count_individuals[$location->xref()] ?? 0 ?>">
82e8ded2caSGreg Roach                    <?= I18N::number($count_individuals[$location->xref()] ?? 0) ?>
83e8ded2caSGreg Roach                </td>
84e8ded2caSGreg Roach
85e8ded2caSGreg Roach                <!-- Count of linked families -->
86e8ded2caSGreg Roach                <td class="text-center" data-sort="<?= $count_families[$location->xref()] ?? 0 ?>">
87e8ded2caSGreg Roach                    <?= I18N::number($count_families[$location->xref()] ?? 0) ?>
88e8ded2caSGreg Roach                </td>
89e8ded2caSGreg Roach
90e8ded2caSGreg Roach                <!-- Last change -->
91*d97083feSGreg Roach                <td data-sort="<?= $location->lastChangeTimestamp()->timestamp() ?>">
92e8ded2caSGreg Roach                    <?= view('components/datetime', ['timestamp' => $location->lastChangeTimestamp()]) ?>
93e8ded2caSGreg Roach                </td>
94e8ded2caSGreg Roach            </tr>
95e8ded2caSGreg Roach        <?php endforeach ?>
96e8ded2caSGreg Roach    </tbody>
97e8ded2caSGreg Roach</table>
98