xref: /webtrees/resources/views/admin/control-panel.phtml (revision 7d87487f074b1444941aa12f5f9e7376e64ac81a)
1beefaa8eSGreg Roach<?php
2beefaa8eSGreg Roach
310e06497SGreg Roachdeclare(strict_types=1);
410e06497SGreg Roach
5*bfd5083cSGreg Roachuse Fisharebest\Webtrees\Contracts\TimestampInterface;
6e381f98dSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\BroadcastPage;
7*bfd5083cSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\CheckForNewVersionNow;
8fd6c003fSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\CleanDataFolder;
9b1a54200SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ControlPanel;
105afbc57aSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\CreateTreePage;
1164d12f7bSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\EmailPreferencesPage;
124b3ef6caSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\FixLevel0MediaPage;
138ce3bd73SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ManageMediaPage;
146fd01894SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ManageTrees;
1594e35917SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\MapDataList;
166fd01894SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\MergeTreesPage;
1741170634SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesAllPage;
189f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesAnalyticsPage;
199f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesBlocksPage;
209f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesChartsPage;
219f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesDataFixesPage;
229f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesFootersPage;
239f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesHistoricEventsPage;
249f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesLanguagesPage;
259f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesListsPage;
26c9c6f2ecSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesMapAutocompletePage;
27c9c6f2ecSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesMapGeoLocationsPage;
2836779af1SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesMapLinksPage;
29c9c6f2ecSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesMapProvidersPage;
309f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesMenusPage;
319f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesReportsPage;
32853f2b8aSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesSharesPage;
339f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesSidebarsPage;
349f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesTabsPage;
359f667ff2SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\ModulesThemesPage;
3622e73debSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\PendingChanges;
37b1a54200SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\PhpInformation;
3857bfa969SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\SiteLogsPage;
39c7aa856bSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\SitePreferencesPage;
40c7aa856bSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\SiteRegistrationPage;
41c8183f29SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\SiteTagsPage;
4236779af1SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\TreePageDefaultEdit;
434b3ef6caSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\UpgradeWizardPage;
448ce3bd73SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\UploadMediaPage;
454c3563c0SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\UserAddPage;
464c3563c0SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\UserEditPage;
474c3563c0SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\UserListPage;
488e0e1b25SGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\UserPageDefaultEdit;
492474349cSGreg Roachuse Fisharebest\Webtrees\Http\RequestHandlers\UsersCleanupPage;
50beefaa8eSGreg Roachuse Fisharebest\Webtrees\I18N;
51b1a54200SGreg Roachuse Fisharebest\Webtrees\Module\FamilyListModule;
52b1a54200SGreg Roachuse Fisharebest\Webtrees\Module\IndividualListModule;
53b1a54200SGreg Roachuse Fisharebest\Webtrees\Module\MediaListModule;
5441170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleAnalyticsInterface;
5541170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleBlockInterface;
5641170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleChartInterface;
57beefaa8eSGreg Roachuse Fisharebest\Webtrees\Module\ModuleConfigInterface;
58beefaa8eSGreg Roachuse Fisharebest\Webtrees\Module\ModuleCustomInterface;
5941170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleDataFixInterface;
6041170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleFooterInterface;
6141170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface;
6241170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleInterface;
6341170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleLanguageInterface;
6441170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleListInterface;
65c9c6f2ecSGreg Roachuse Fisharebest\Webtrees\Module\ModuleMapAutocompleteInterface;
66c9c6f2ecSGreg Roachuse Fisharebest\Webtrees\Module\ModuleMapGeoLocationInterface;
67e3544cb2SGreg Roachuse Fisharebest\Webtrees\Module\ModuleMapLinkInterface;
68c9c6f2ecSGreg Roachuse Fisharebest\Webtrees\Module\ModuleMapProviderInterface;
6941170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleMenuInterface;
7041170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleReportInterface;
71853f2b8aSGreg Roachuse Fisharebest\Webtrees\Module\ModuleShareInterface;
7241170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleSidebarInterface;
7341170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleTabInterface;
7441170634SGreg Roachuse Fisharebest\Webtrees\Module\ModuleThemeInterface;
75b1a54200SGreg Roachuse Fisharebest\Webtrees\Module\NoteListModule;
76b1a54200SGreg Roachuse Fisharebest\Webtrees\Module\RepositoryListModule;
77b1a54200SGreg Roachuse Fisharebest\Webtrees\Module\SourceListModule;
78e72c24d6SGreg Roachuse Fisharebest\Webtrees\Module\SubmitterListModule;
7941170634SGreg Roachuse Fisharebest\Webtrees\Tree;
8041170634SGreg Roachuse Fisharebest\Webtrees\User;
81beefaa8eSGreg Roachuse Fisharebest\Webtrees\Webtrees;
82beefaa8eSGreg Roachuse Illuminate\Support\Collection;
83beefaa8eSGreg Roach
84beefaa8eSGreg Roach/**
8536779af1SGreg Roach * @var Collection<int,User>                           $administrators
8636779af1SGreg Roach * @var Collection<int,ModuleInterface>                $all_modules_disabled
8736779af1SGreg Roach * @var Collection<int,ModuleInterface>                $all_modules_enabled
8836779af1SGreg Roach * @var Collection<int,Tree>                           $all_trees
8936779af1SGreg Roach * @var Collection<int,User>                           $all_users
9036779af1SGreg Roach * @var Collection<int,ModuleAnalyticsInterface>       $analytics_modules_disabled
9136779af1SGreg Roach * @var Collection<int,ModuleAnalyticsInterface>       $analytics_modules_enabled
9236779af1SGreg Roach * @var Collection<int,ModuleBlockInterface>           $block_modules_disabled
9336779af1SGreg Roach * @var Collection<int,ModuleBlockInterface>           $block_modules_enabled
9441170634SGreg Roach * @var array<string,int>                              $changes
9536779af1SGreg Roach * @var Collection<int,ModuleChartInterface>           $chart_modules_disabled
9636779af1SGreg Roach * @var Collection<int,ModuleChartInterface>           $chart_modules_enabled
9736779af1SGreg Roach * @var Collection<int,ModuleCustomInterface>          $custom_updates
9836779af1SGreg Roach * @var Collection<int,ModuleDataFixInterface>         $data_fix_modules_disabled
9936779af1SGreg Roach * @var Collection<int,ModuleDataFixInterface>         $data_fix_modules_enabled
10036779af1SGreg Roach * @var Collection<array-key,int>                      $families
10141170634SGreg Roach * @var FamilyListModule|null                          $family_list_module
10236779af1SGreg Roach * @var Collection<int,ModuleFooterInterface>          $footer_modules_disabled
10336779af1SGreg Roach * @var Collection<int,ModuleFooterInterface>          $footer_modules_enabled
10436779af1SGreg Roach * @var Collection<int,ModuleHistoricEventsInterface>  $history_modules_disabled
10536779af1SGreg Roach * @var Collection<int,ModuleHistoricEventsInterface>  $history_modules_enabled
10636779af1SGreg Roach * @var Collection<array-key,int>                      $individuals
10741170634SGreg Roach * @var IndividualListModule|null                      $individual_list_module
10836779af1SGreg Roach * @var Collection<int,ModuleLanguageInterface>        $language_modules_disabled
10936779af1SGreg Roach * @var Collection<int,ModuleLanguageInterface>        $language_modules_enabled
110beefaa8eSGreg Roach * @var string                                         $latest_version
111*bfd5083cSGreg Roach * @var string                                         $latest_version_error
112*bfd5083cSGreg Roach * @var TimestampInterface                             $latest_version_timestamp
11336779af1SGreg Roach * @var Collection<int,ModuleListInterface>            $list_modules_disabled
11436779af1SGreg Roach * @var Collection<int,ModuleListInterface>            $list_modules_enabled
11536779af1SGreg Roach * @var Collection<int,ModuleMapLinkInterface>         $map_link_modules_disabled
11636779af1SGreg Roach * @var Collection<int,ModuleMapLinkInterface>         $map_link_modules_enabled
11736779af1SGreg Roach * @var Collection<int,ModuleMapAutocompleteInterface> $map_autocomplete_modules_disabled
11836779af1SGreg Roach * @var Collection<int,ModuleMapAutocompleteInterface> $map_autocomplete_modules_enabled
11936779af1SGreg Roach * @var Collection<int,ModuleMapProviderInterface>     $map_provider_modules_disabled
12036779af1SGreg Roach * @var Collection<int,ModuleMapProviderInterface>     $map_provider_modules_enabled
12136779af1SGreg Roach * @var Collection<int,ModuleMapGeoLocationInterface>  $map_search_modules_disabled
12236779af1SGreg Roach * @var Collection<int,ModuleMapGeoLocationInterface>  $map_search_modules_enabled
12336779af1SGreg Roach * @var Collection<int,User>                           $managers
12436779af1SGreg Roach * @var Collection<array-key,int>                      $media
12541170634SGreg Roach * @var MediaListModule|null                           $media_list_module
12636779af1SGreg Roach * @var Collection<int,ModuleMenuInterface>            $menu_modules_disabled
12736779af1SGreg Roach * @var Collection<int,ModuleMenuInterface>            $menu_modules_enabled
12836779af1SGreg Roach * @var Collection<int,User>                           $moderators
12936779af1SGreg Roach * @var Collection<array-key,int>                      $notes
13041170634SGreg Roach * @var NoteListModule|null                            $note_list_module
13136779af1SGreg Roach * @var Collection<int,ModuleInterface>                $other_modules
132a46dd5a6SGreg Roach * @var array<string,string>                           $recipients
13336779af1SGreg Roach * @var Collection<int,ModuleReportInterface>          $report_modules_disabled
13436779af1SGreg Roach * @var Collection<int,ModuleReportInterface>          $report_modules_enabled
13536779af1SGreg Roach * @var Collection<array-key,int>                      $repositories
13641170634SGreg Roach * @var RepositoryListModule|null                      $repository_list_module
13736779af1SGreg Roach * @var Collection<int,string>                         $server_errors
13836779af1SGreg Roach * @var Collection<int,string>                         $server_warnings
1396fd01894SGreg Roach * @var bool                                           $show_synchronize
14036779af1SGreg Roach * @var Collection<int,ModuleShareInterface>           $share_modules_disabled
14136779af1SGreg Roach * @var Collection<int,ModuleShareInterface>           $share_modules_enabled
14236779af1SGreg Roach * @var Collection<int,ModuleSidebarInterface>         $sidebar_modules_disabled
14336779af1SGreg Roach * @var Collection<int,ModuleSidebarInterface>         $sidebar_modules_enabled
14436779af1SGreg Roach * @var Collection<array-key,int>                      $sources
14541170634SGreg Roach * @var SourceListModule|null                          $source_list_module
14636779af1SGreg Roach * @var Collection<array-key,int>                      $submitters
14741170634SGreg Roach * @var SubmitterListModule|null                       $submitter_list_module
14836779af1SGreg Roach * @var Collection<int,ModuleTabInterface>             $tab_modules_disabled
14936779af1SGreg Roach * @var Collection<int,ModuleTabInterface>             $tab_modules_enabled
15036779af1SGreg Roach * @var Collection<int,ModuleThemeInterface>           $theme_modules_disabled
15136779af1SGreg Roach * @var Collection<int,ModuleThemeInterface>           $theme_modules_enabled
15241170634SGreg Roach * @var string                                         $title
15336779af1SGreg Roach * @var Collection<int,User>                           $unapproved
15436779af1SGreg Roach * @var Collection<int,User>                           $unverified
155beefaa8eSGreg Roach */
156beefaa8eSGreg Roach
157beefaa8eSGreg Roach?>
158dd6b2bfcSGreg Roach
159dd6b2bfcSGreg Roach<h1><?= $title ?></h1>
160dd6b2bfcSGreg Roach
161dd6b2bfcSGreg Roach<!-- WEBSITE / WEBTREES -->
162dd6b2bfcSGreg Roach<div class="card mb-4">
163dd6b2bfcSGreg Roach    <div class="card-header">
164dd6b2bfcSGreg Roach        <h2 class="mb-0">
165dd6b2bfcSGreg Roach            <?= I18N::translate('Website') ?>
1664ab569c4SGreg Roach            <span class="badge bg-secondary" dir="ltr">
1678d0ebef0SGreg Roach                <?= e(Webtrees::VERSION) ?>
168dd6b2bfcSGreg Roach            </span>
169dd6b2bfcSGreg Roach        </h2>
170dd6b2bfcSGreg Roach    </div>
171dd6b2bfcSGreg Roach    <div class="card-body">
172b7059dccSGreg Roach        <?php foreach ($server_errors as $server_error) : ?>
173b7059dccSGreg Roach            <p class="alert alert-danger"><?= $server_error ?></p>
174b7059dccSGreg Roach        <?php endforeach ?>
175b7059dccSGreg Roach
176dd6b2bfcSGreg Roach        <?php foreach ($server_warnings as $server_warning) : ?>
177dd6b2bfcSGreg Roach            <p class="alert alert-warning"><?= $server_warning ?></p>
178dd6b2bfcSGreg Roach        <?php endforeach ?>
179dd6b2bfcSGreg Roach
180dd6b2bfcSGreg Roach        <p class="card-text">
181dd6b2bfcSGreg Roach            <?= /* I18N: %s is a URL/link to the project website */
182dd6b2bfcSGreg Roach            I18N::translate('Support and documentation can be found at %s.', '<a href="https://webtrees.net/">webtrees.net</a>') ?>
183dd6b2bfcSGreg Roach        </p>
1846f1992b4SGreg Roach
185*bfd5083cSGreg Roach        <?php if ($latest_version_error !== '') : ?>
186*bfd5083cSGreg Roach            <p class="alert alert-danger">
187*bfd5083cSGreg Roach                <?= I18N::translate('There was an error checking for a new version.') ?>
188*bfd5083cSGreg Roach                <br>
189*bfd5083cSGreg Roach                <?= $latest_version_error ?>
190*bfd5083cSGreg Roach                <br>
191*bfd5083cSGreg Roach                <?= /* I18N: Last checked X hours ago. */ I18N::translate('Last checked %s.', $latest_version_timestamp->diffForHumans()) ?>
192*bfd5083cSGreg Roach                <a href="#" class="btn btn-primary" data-wt-post-url="<?= e(route(CheckForNewVersionNow::class)) ?>">
193*bfd5083cSGreg Roach                    <?= /* I18N: button label */ I18N::translate('check now') ?>
194*bfd5083cSGreg Roach                </a>
195*bfd5083cSGreg Roach            </p>
196*bfd5083cSGreg Roach        <?php elseif ($latest_version === '') : ?>
1976f1992b4SGreg Roach            <p class="card-text">
198dd6b2bfcSGreg Roach                <?= I18N::translate('No upgrade information is available.') ?>
1996f1992b4SGreg Roach            </p>
2008d0ebef0SGreg Roach        <?php elseif (version_compare(Webtrees::VERSION, $latest_version) < 0) : ?>
2016f1992b4SGreg Roach            <p class="card-text alert alert-info">
202dd6b2bfcSGreg Roach                <?= I18N::translate('A new version of webtrees is available.') ?>
2034b3ef6caSGreg Roach                <a href="<?= e(route(UpgradeWizardPage::class)) ?>" class="alert-link">
204dd6b2bfcSGreg Roach                    <?= /* I18N: %s is a version number */
205dd6b2bfcSGreg Roach                    I18N::translate('Upgrade to webtrees %s.', e($latest_version)) ?>
206dd6b2bfcSGreg Roach                </a>
207dd6b2bfcSGreg Roach            </p>
2086f1992b4SGreg Roach        <?php else : ?>
2096f1992b4SGreg Roach            <p class="card-text">
2106f1992b4SGreg Roach                <?= I18N::translate('This is the latest version of webtrees. No upgrade is available.') ?>
211*bfd5083cSGreg Roach                <?= /* I18N: Last checked X hours ago. */ I18N::translate('Last checked %s.', $latest_version_timestamp->diffForHumans()) ?>
212*bfd5083cSGreg Roach                <?php if ($latest_version_timestamp->timestamp() + 60 < time()) : ?>
213*bfd5083cSGreg Roach                    <a href="#" class="btn btn-primary" data-wt-post-url="<?= e(route(CheckForNewVersionNow::class)) ?>">
214*bfd5083cSGreg Roach                        <?= /* I18N: button label */ I18N::translate('check now') ?>
215*bfd5083cSGreg Roach                    </a>
216*bfd5083cSGreg Roach                <?php endif ?>
2176f1992b4SGreg Roach            </p>
2186f1992b4SGreg Roach        <?php endif ?>
219dd6b2bfcSGreg Roach
22064d12f7bSGreg Roach        <?php foreach ($custom_updates as $module) : ?>
22164d12f7bSGreg Roach        <div class="alert alert-info">
22264d12f7bSGreg Roach            <?= view('icons/information') ?>
22364d12f7bSGreg Roach            <?= I18N::translate('An upgrade is available.') ?>
22464d12f7bSGreg Roach            <br>
22564d12f7bSGreg Roach            <?= $module->title() ?><?= e($module->customModuleVersion()) ?><?= e($module->customModuleLatestVersion()) ?>
226a2f808d2SGreg Roach            <?php if ($module->customModuleSupportUrl() !== '') : ?>
227a2f808d2SGreg Roach                <br>
228a2f808d2SGreg Roach                <?= I18N::translate('For more information, see %s.', '<a href="' . e($module->customModuleSupportUrl()) . '">' . e($module->customModuleSupportUrl()) . '</a>') ?>
229a2f808d2SGreg Roach            <?php endif ?>
23064d12f7bSGreg Roach        </div>
23164d12f7bSGreg Roach        <?php endforeach ?>
23264d12f7bSGreg Roach
233dd6b2bfcSGreg Roach        <div class="row">
234c8183f29SGreg Roach            <div class="col-sm">
235315eb316SGreg Roach                <ul class="fa-ul mx-0">
236dd6b2bfcSGreg Roach                    <li>
237dd6b2bfcSGreg Roach                        <span class="fa-li"><?= view('icons/preferences') ?></span>
238c7aa856bSGreg Roach                        <a href="<?= e(route(SitePreferencesPage::class)) ?>">
239dd6b2bfcSGreg Roach                            <?= I18N::translate('Website preferences') ?>
240dd6b2bfcSGreg Roach                        </a>
241dd6b2bfcSGreg Roach                    </li>
242dd6b2bfcSGreg Roach                    <li>
243a24f7142SGreg Roach                        <span class="fa-li"><?= view('icons/email') ?></span>
244b4144a6dSGreg Roach                        <a href="<?= e(route(EmailPreferencesPage::class)) ?>">
245dd6b2bfcSGreg Roach                            <?= I18N::translate('Sending email') ?>
246dd6b2bfcSGreg Roach                        </a>
247dd6b2bfcSGreg Roach                    </li>
248dd6b2bfcSGreg Roach                    <li>
249a24f7142SGreg Roach                        <span class="fa-li"><?= view('icons/user') ?></span>
250c7aa856bSGreg Roach                        <a href="<?= e(route(SiteRegistrationPage::class)) ?>">
251dd6b2bfcSGreg Roach                            <?= I18N::translate('Sign-in and registration') ?>
252dd6b2bfcSGreg Roach                        </a>
253dd6b2bfcSGreg Roach                    </li>
254dd6b2bfcSGreg Roach                </ul>
255dd6b2bfcSGreg Roach            </div>
256c8183f29SGreg Roach            <div class="col-sm">
257315eb316SGreg Roach                <ul class="fa-ul mx-0">
258dd6b2bfcSGreg Roach                    <li>
259a24f7142SGreg Roach                        <span class="fa-li"><?= view('icons/list') ?></span>
26057bfa969SGreg Roach                        <a href="<?= e(route(SiteLogsPage::class)) ?>">
261dd6b2bfcSGreg Roach                            <?= I18N::translate('Website logs') ?>
262dd6b2bfcSGreg Roach                        </a>
263dd6b2bfcSGreg Roach                    </li>
264dd6b2bfcSGreg Roach                    <li>
265a24f7142SGreg Roach                        <span class="fa-li"><?= view('icons/delete') ?></span>
266fd6c003fSGreg Roach                        <a href="<?= e(route(CleanDataFolder::class)) ?>">
267dd6b2bfcSGreg Roach                            <?= I18N::translate('Clean up data folder') ?>
268dd6b2bfcSGreg Roach                        </a>
269dd6b2bfcSGreg Roach                    </li>
270dd6b2bfcSGreg Roach                    <li>
27128281361SGreg Roach                        <span class="fa-li"><?= view('icons/server') ?></span>
272b1a54200SGreg Roach                        <a href="<?= e(route(PhpInformation::class)) ?>">
273dd6b2bfcSGreg Roach                            <?= I18N::translate('Server information') ?>
274dd6b2bfcSGreg Roach                        </a>
275dd6b2bfcSGreg Roach                    </li>
276dd6b2bfcSGreg Roach                </ul>
277dd6b2bfcSGreg Roach            </div>
278c8183f29SGreg Roach            <div class="col-sm">
279315eb316SGreg Roach                <ul class="fa-ul mx-0">
280c8183f29SGreg Roach                    <li>
281c8183f29SGreg Roach                        <span class="fa-li"><?= view('icons/tag') ?></span>
282c8183f29SGreg Roach                        <a href="<?= e(route(SiteTagsPage::class)) ?>">
283c8183f29SGreg Roach                            <?= I18N::translate('GEDCOM tags') ?>
284c8183f29SGreg Roach                        </a>
285c8183f29SGreg Roach                    </li>
286c8183f29SGreg Roach                </ul>
287c8183f29SGreg Roach            </div>
288dd6b2bfcSGreg Roach        </div>
289dd6b2bfcSGreg Roach    </div>
290dd6b2bfcSGreg Roach</div>
291dd6b2bfcSGreg Roach
292dd6b2bfcSGreg Roach<!-- FAMILY TREES -->
2934e73f0bdSGreg Roach<div class="card mb-4 <?= array_sum($changes) ? 'card-outline-danger' : '' ?>">
294dd6b2bfcSGreg Roach    <div class="card-header">
295dd6b2bfcSGreg Roach        <h2 class="mb-0">
296dd6b2bfcSGreg Roach            <?= I18N::translate('Family trees') ?>
2974ab569c4SGreg Roach            <span class="badge bg-secondary">
29841170634SGreg Roach                    <?= I18N::number($all_trees->count()) ?>
299dd6b2bfcSGreg Roach                </span>
300dd6b2bfcSGreg Roach        </h2>
301dd6b2bfcSGreg Roach    </div>
3026fd01894SGreg Roach
303dd6b2bfcSGreg Roach    <div class="card-body">
304e218f363SGreg Roach        <?php if ($all_trees->isEmpty()) : ?>
305e218f363SGreg Roach            <p class="alert alert-info">
306e218f363SGreg Roach                <?= I18N::translate('You need to create a family tree.') ?>
307e218f363SGreg Roach            </p>
308e218f363SGreg Roach        <?php endif ?>
309e218f363SGreg Roach
310315eb316SGreg Roach        <ul class="fa-ul mx-0">
3115afbc57aSGreg Roach            <li>
3125afbc57aSGreg Roach                <span class="fa-li"><?= view('icons/add') ?></span>
3135afbc57aSGreg Roach                <a href="<?= e(route(CreateTreePage::class)) ?>">
3145afbc57aSGreg Roach                    <?= I18N::translate('Create a family tree') ?>
3155afbc57aSGreg Roach                </a>
3165afbc57aSGreg Roach            </li>
3175afbc57aSGreg Roach            <li>
3185afbc57aSGreg Roach                <span class="fa-li"><?= view('icons/block') ?></span>
3198e0e1b25SGreg Roach                <a href="<?= e(route(TreePageDefaultEdit::class)) ?>">
3205afbc57aSGreg Roach                    <?= I18N::translate('Set the default blocks for new family trees') ?>
3215afbc57aSGreg Roach                </a>
3225afbc57aSGreg Roach            </li>
3235afbc57aSGreg Roach            <?php if (count($all_trees) > 1) : ?>
3245afbc57aSGreg Roach                <li>
3255afbc57aSGreg Roach                    <span class="fa-li"><?= view('icons/merge') ?></span>
3266fd01894SGreg Roach                    <a href="<?= e(route(MergeTreesPage::class)) ?>">
3275afbc57aSGreg Roach                        <?= I18N::translate('Merge family trees') ?>
3285afbc57aSGreg Roach                    </a>
3295afbc57aSGreg Roach                </li>
3305afbc57aSGreg Roach            <?php endif ?>
3315afbc57aSGreg Roach        </ul>
3325afbc57aSGreg Roach
333dd6b2bfcSGreg Roach        <table class="table table-sm">
334315eb316SGreg Roach            <caption class="visually-hidden">
335dd6b2bfcSGreg Roach                <?= I18N::translate('Family trees') ?>
336dd6b2bfcSGreg Roach            </caption>
3377039fd97SGreg Roach
338dd6b2bfcSGreg Roach            <thead>
339dd6b2bfcSGreg Roach                <tr>
340dd6b2bfcSGreg Roach                    <th><?= I18N::translate('Family tree') ?></th>
341e72c24d6SGreg Roach                    <th class="align-digits"><?= I18N::translate('Pending changes') ?></th>
342e72c24d6SGreg Roach                    <th class="d-none d-sm-table-cell align-digits"><?= I18N::translate('Individuals') ?></th>
343e72c24d6SGreg Roach                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Families') ?></th>
344e72c24d6SGreg Roach                    <th class="d-none d-sm-table-cell align-digits"><?= I18N::translate('Sources') ?></th>
345e72c24d6SGreg Roach                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Repositories') ?></th>
346e72c24d6SGreg Roach                    <th class="d-none d-sm-table-cell align-digits"><?= I18N::translate('Media') ?></th>
347e72c24d6SGreg Roach                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Notes') ?></th>
348e72c24d6SGreg Roach                    <th class="d-none d-lg-table-cell align-digits"><?= I18N::translate('Submitters') ?></th>
349dd6b2bfcSGreg Roach                </tr>
350dd6b2bfcSGreg Roach            </thead>
3517039fd97SGreg Roach
352dd6b2bfcSGreg Roach            <tbody>
353b1a54200SGreg Roach                <?php foreach ($all_trees as $tree) : ?>
354b1a54200SGreg Roach                    <tr class="<?= $changes[$tree->id()] ? 'danger' : '' ?>">
355b1a54200SGreg Roach                        <th scope="row">
356b1a54200SGreg Roach                            <?= view('icons/preferences') ?>
3576fd01894SGreg Roach                            <a href="<?= e(route(ManageTrees::class, ['tree' => $tree->name()])) ?>">
358b1a54200SGreg Roach                                <?= e($tree->name()) ?>
359b1a54200SGreg Roach                                -
360b1a54200SGreg Roach                                <?= e($tree->title()) ?>
361b1a54200SGreg Roach                            </a>
362b1a54200SGreg Roach                        </th>
363b1a54200SGreg Roach                        <td style="text-align: right;">
364b1a54200SGreg Roach                            <?php if ($changes[$tree->id()]) : ?>
36522e73debSGreg Roach                                <a href="<?= e(route(PendingChanges::class, ['tree' => $tree->name(), 'url' => route(ControlPanel::class)])) ?>">
366b1a54200SGreg Roach                                    <?= I18N::number($changes[$tree->id()]) ?>
367315eb316SGreg Roach                                    <span class="visually-hidden"><?= I18N::translate('Pending changes') ?> <?= e($tree->title()) ?></span>
368b1a54200SGreg Roach                                </a>
369b1a54200SGreg Roach                            <?php else : ?>
370b1a54200SGreg Roach                                -
371b1a54200SGreg Roach                            <?php endif ?>
372b1a54200SGreg Roach                        </td>
373b1a54200SGreg Roach                        <td class="d-none d-sm-table-cell align-digits">
374b1a54200SGreg Roach                            <?php if ($individuals[$tree->id()] > 0) : ?>
375b1a54200SGreg Roach                                <?php if ($individual_list_module instanceof IndividualListModule) : ?>
376b1a54200SGreg Roach                                    <a href="<?= e($individual_list_module->listUrl($tree)) ?>"><?= I18N::number($individuals[$tree->id()]) ?></a>
377b1a54200SGreg Roach                                <?php else : ?>
378b1a54200SGreg Roach                                    <?= I18N::number($individuals[$tree->id()]) ?>
379b1a54200SGreg Roach                                <?php endif ?>
380b1a54200SGreg Roach                            <?php else : ?>
381b1a54200SGreg Roach                                -
382b1a54200SGreg Roach                            <?php endif ?>
383b1a54200SGreg Roach                        </td>
384b1a54200SGreg Roach                        <td class="d-none d-lg-table-cell align-digits">
385b1a54200SGreg Roach                            <?php if ($families[$tree->id()] > 0) : ?>
386b1a54200SGreg Roach                                <?php if ($family_list_module instanceof FamilyListModule) : ?>
387b1a54200SGreg Roach                                    <a href="<?= e($family_list_module->listUrl($tree)) ?>"><?= I18N::number($families[$tree->id()]) ?></a>
388b1a54200SGreg Roach                                <?php else : ?>
389b1a54200SGreg Roach                                    <?= I18N::number($families[$tree->id()]) ?>
390b1a54200SGreg Roach                                <?php endif ?>
391b1a54200SGreg Roach                            <?php else : ?>
392b1a54200SGreg Roach                                -
393b1a54200SGreg Roach                            <?php endif ?>
394b1a54200SGreg Roach                        </td>
395b1a54200SGreg Roach                        <td class="d-none d-sm-table-cell align-digits">
396b1a54200SGreg Roach                            <?php if ($sources[$tree->id()] > 0) : ?>
397b1a54200SGreg Roach                                <?php if ($source_list_module instanceof SourceListModule) : ?>
398b1a54200SGreg Roach                                    <a href="<?= e($source_list_module->listUrl($tree)) ?>"><?= I18N::number($sources[$tree->id()]) ?></a>
399b1a54200SGreg Roach                                <?php else : ?>
400b1a54200SGreg Roach                                    <?= I18N::number($sources[$tree->id()]) ?>
401b1a54200SGreg Roach                                <?php endif ?>
402b1a54200SGreg Roach                            <?php else : ?>
403b1a54200SGreg Roach                                -
404b1a54200SGreg Roach                            <?php endif ?>
405b1a54200SGreg Roach                        </td>
406b1a54200SGreg Roach                        <td class="d-none d-lg-table-cell align-digits">
407b1a54200SGreg Roach                            <?php if ($repositories[$tree->id()] > 0) : ?>
408b1a54200SGreg Roach                                <?php if ($repository_list_module instanceof RepositoryListModule) : ?>
409b1a54200SGreg Roach                                    <a href="<?= e($repository_list_module->listUrl($tree)) ?>"><?= I18N::number($repositories[$tree->id()]) ?></a>
410b1a54200SGreg Roach                                <?php else : ?>
411b1a54200SGreg Roach                                    <?= I18N::number($repositories[$tree->id()]) ?>
412b1a54200SGreg Roach                                <?php endif ?>
413b1a54200SGreg Roach                            <?php else : ?>
414b1a54200SGreg Roach                                -
415b1a54200SGreg Roach                            <?php endif ?>
416b1a54200SGreg Roach                        </td>
417b1a54200SGreg Roach                        <td class="d-none d-sm-table-cell align-digits">
418b1a54200SGreg Roach                            <?php if ($media[$tree->id()] > 0) : ?>
419b1a54200SGreg Roach                                <?php if ($media_list_module instanceof MediaListModule) : ?>
420b1a54200SGreg Roach                                    <a href="<?= e($media_list_module->listUrl($tree)) ?>"><?= I18N::number($media[$tree->id()]) ?></a>
421b1a54200SGreg Roach                                <?php else : ?>
422b1a54200SGreg Roach                                    <?= I18N::number($media[$tree->id()]) ?>
423b1a54200SGreg Roach                                <?php endif ?>
424b1a54200SGreg Roach                            <?php else : ?>
425b1a54200SGreg Roach                                -
426b1a54200SGreg Roach                            <?php endif ?>
427b1a54200SGreg Roach                        </td>
428b1a54200SGreg Roach                        <td class="d-none d-lg-table-cell align-digits">
429b1a54200SGreg Roach                            <?php if ($notes[$tree->id()] > 0) : ?>
430b1a54200SGreg Roach                                <?php if ($note_list_module instanceof NoteListModule) : ?>
431b1a54200SGreg Roach                                    <a href="<?= e($note_list_module->listUrl($tree)) ?>"><?= I18N::number($notes[$tree->id()]) ?></a>
432b1a54200SGreg Roach                                <?php else : ?>
433b1a54200SGreg Roach                                    <?= I18N::number($notes[$tree->id()]) ?>
434b1a54200SGreg Roach                                <?php endif ?>
435b1a54200SGreg Roach                            <?php else : ?>
436b1a54200SGreg Roach                                -
437b1a54200SGreg Roach                            <?php endif ?>
438b1a54200SGreg Roach                        </td>
439e72c24d6SGreg Roach                         <td class="d-none d-lg-table-cell align-digits">
440e72c24d6SGreg Roach                            <?php if ($submitters[$tree->id()] > 0) : ?>
441e72c24d6SGreg Roach                                <?php if ($submitter_list_module instanceof SubmitterListModule) : ?>
442e72c24d6SGreg Roach                                    <a href="<?= e($submitter_list_module->listUrl($tree)) ?>"><?= I18N::number($submitters[$tree->id()]) ?></a>
443e72c24d6SGreg Roach                                <?php else : ?>
444e72c24d6SGreg Roach                                    <?= I18N::number($submitters[$tree->id()]) ?>
445e72c24d6SGreg Roach                                <?php endif ?>
446e72c24d6SGreg Roach                            <?php else : ?>
447e72c24d6SGreg Roach                                -
448e72c24d6SGreg Roach                            <?php endif ?>
449e72c24d6SGreg Roach                        </td>
450b1a54200SGreg Roach                    </tr>
451ce42304aSGreg Roach                <?php endforeach ?>
452ce42304aSGreg Roach            </tbody>
4537039fd97SGreg Roach
454dd6b2bfcSGreg Roach            <tfoot>
455dd6b2bfcSGreg Roach                <tr>
456dd6b2bfcSGreg Roach                    <th scope="row">
457dd6b2bfcSGreg Roach                        <?= I18N::translate('Total') ?>
458dd6b2bfcSGreg Roach                    </th>
459dbffae50SGreg Roach                    <td class="align-digits">
460dd6b2bfcSGreg Roach                        <?= I18N::number(array_sum($changes)) ?>
461dd6b2bfcSGreg Roach                    </td>
462dbffae50SGreg Roach                    <td class="d-none d-sm-table-cell align-digits">
4632078eafaSGreg Roach                        <?= I18N::number($individuals->sum()) ?>
464dd6b2bfcSGreg Roach                    </td>
465dbffae50SGreg Roach                    <td class="d-none d-lg-table-cell align-digits">
4662078eafaSGreg Roach                        <?= I18N::number($families->sum()) ?>
467dd6b2bfcSGreg Roach                    </td>
468dbffae50SGreg Roach                    <td class="d-none d-sm-table-cell align-digits">
4692078eafaSGreg Roach                        <?= I18N::number($sources->sum()) ?>
470dd6b2bfcSGreg Roach                    </td>
471dbffae50SGreg Roach                    <td class="d-none d-lg-table-cell align-digits">
4722078eafaSGreg Roach                        <?= I18N::number($repositories->sum()) ?>
473dd6b2bfcSGreg Roach                    </td>
474dbffae50SGreg Roach                    <td class="d-none d-sm-table-cell align-digits">
4752078eafaSGreg Roach                        <?= I18N::number($media->sum()) ?>
476dd6b2bfcSGreg Roach                    </td>
477dbffae50SGreg Roach                    <td class="d-none d-lg-table-cell align-digits">
4782078eafaSGreg Roach                        <?= I18N::number($notes->sum()) ?>
479dd6b2bfcSGreg Roach                    </td>
480c194657aSGreg Roach                    <td class="d-none d-lg-table-cell align-digits">
481c194657aSGreg Roach                        <?= I18N::number($submitters->sum()) ?>
482c194657aSGreg Roach                    </td>
483dd6b2bfcSGreg Roach                </tr>
484dd6b2bfcSGreg Roach            </tfoot>
485dd6b2bfcSGreg Roach        </table>
486dd6b2bfcSGreg Roach    </div>
487dd6b2bfcSGreg Roach</div>
488dd6b2bfcSGreg Roach
4896fd01894SGreg Roach<?php if ($show_synchronize) : ?>
4906fd01894SGreg Roach    <?= view('admin/synchronize-trees') ?>
4916fd01894SGreg Roach<?php endif ?>
4926fd01894SGreg Roach
493dd6b2bfcSGreg Roach<!-- USERS -->
494dd6b2bfcSGreg Roach<div class="card mb-4 <?= $unapproved || $unverified ? 'card-outline-danger' : '' ?>">
495dd6b2bfcSGreg Roach    <div class="card-header">
496dd6b2bfcSGreg Roach        <h2 class="mb-0">
497dd6b2bfcSGreg Roach            <?= I18N::translate('Users') ?>
4984ab569c4SGreg Roach            <span class="badge bg-secondary">
499dd6b2bfcSGreg Roach                    <?= I18N::number(count($all_users)) ?>
500dd6b2bfcSGreg Roach                </span>
501dd6b2bfcSGreg Roach        </h2>
502dd6b2bfcSGreg Roach    </div>
503dd6b2bfcSGreg Roach    <div class="card-body">
504dd6b2bfcSGreg Roach        <dl class="row">
505dd6b2bfcSGreg Roach            <?php foreach ([I18N::translate('Administrators') => $administrators, I18N::translate('Managers') => $managers, I18N::translate('Moderators') => $moderators, I18N::translate('Not verified by the user') => $unverified, I18N::translate('Not approved by an administrator') => $unapproved] as $label => $list) : ?>
506040e7dbaSGreg Roach                <dt class="col-sm-6">
507dd6b2bfcSGreg Roach                    <?= $label ?>
508dd6b2bfcSGreg Roach                </dt>
509040e7dbaSGreg Roach                <dd class="col-sm-6">
510dd6b2bfcSGreg Roach                    <?php foreach ($list as $n => $user) : ?>
511dd6b2bfcSGreg Roach                        <?= $n ? I18N::$list_separator : '' ?>
5124c3563c0SGreg Roach                        <a href="<?= e(route(UserEditPage::class, ['user_id' => $user->id()])) ?>" dir="auto">
513e5a6b4d4SGreg Roach                            <?= e($user->realName()) ?>
514dd6b2bfcSGreg Roach                        </a>
515dd6b2bfcSGreg Roach                    <?php endforeach ?>
516040e7dbaSGreg Roach                    <?php if ($list->isEmpty()) : ?>
517040e7dbaSGreg Roach518040e7dbaSGreg Roach                    <?php endif ?>
519dd6b2bfcSGreg Roach                </dd>
520dd6b2bfcSGreg Roach            <?php endforeach ?>
521dd6b2bfcSGreg Roach        </dl>
522dd6b2bfcSGreg Roach
523dd6b2bfcSGreg Roach        <div class="row">
524dd6b2bfcSGreg Roach            <div class="col-sm-6">
525315eb316SGreg Roach                <ul class="fa-ul mx-0">
526dd6b2bfcSGreg Roach                    <li>
527dd6b2bfcSGreg Roach                        <span class="fa-li"><?= view('icons/preferences') ?></span>
5284c3563c0SGreg Roach                        <a href="<?= e(route(UserListPage::class)) ?>">
529dd6b2bfcSGreg Roach                            <?= I18N::translate('User administration') ?>
530dd6b2bfcSGreg Roach                        </a>
531dd6b2bfcSGreg Roach                    </li>
532dd6b2bfcSGreg Roach                    <li>
533a24f7142SGreg Roach                        <span class="fa-li"><?= view('icons/add') ?></span>
5344c3563c0SGreg Roach                        <a href="<?= e(route(UserAddPage::class)) ?>">
535dd6b2bfcSGreg Roach                            <?= I18N::translate('Add a user') ?>
536dd6b2bfcSGreg Roach                        </a>
537dd6b2bfcSGreg Roach                    </li>
538dd6b2bfcSGreg Roach                    <li>
539a24f7142SGreg Roach                        <span class="fa-li"><?= view('icons/delete') ?></span>
5402474349cSGreg Roach                        <a href="<?= e(route(UsersCleanupPage::class)) ?>">
541dd6b2bfcSGreg Roach                            <?= I18N::translate('Delete inactive users') ?>
542dd6b2bfcSGreg Roach                        </a>
543dd6b2bfcSGreg Roach                    </li>
544dd6b2bfcSGreg Roach                    <li>
545a24f7142SGreg Roach                        <span class="fa-li"><?= view('icons/block') ?></span>
5468e0e1b25SGreg Roach                        <a href="<?= e(route(UserPageDefaultEdit::class)) ?>">
547dd6b2bfcSGreg Roach                            <?= I18N::translate('Set the default blocks for new users') ?>
548dd6b2bfcSGreg Roach                        </a>
549dd6b2bfcSGreg Roach                    </li>
550dd6b2bfcSGreg Roach                </ul>
551dd6b2bfcSGreg Roach            </div>
552dd6b2bfcSGreg Roach            <div class="col-sm-6">
553315eb316SGreg Roach                <ul class="fa-ul mx-0">
554a46dd5a6SGreg Roach                    <?php foreach ($recipients as $to => $recipient) : ?>
555dd6b2bfcSGreg Roach                    <li>
556dd6b2bfcSGreg Roach                        <span class="fa-li"><?= view('icons/email') ?></span>
557a46dd5a6SGreg Roach                        <a href="<?= e(route(BroadcastPage::class, ['to' => $to])) ?>">
558a46dd5a6SGreg Roach                            <?= $recipient ?>
559dd6b2bfcSGreg Roach                        </a>
560dd6b2bfcSGreg Roach                    </li>
561a46dd5a6SGreg Roach                    <?php endforeach ?>
562dd6b2bfcSGreg Roach                </ul>
563dd6b2bfcSGreg Roach            </div>
564dd6b2bfcSGreg Roach        </div>
565dd6b2bfcSGreg Roach    </div>
566dd6b2bfcSGreg Roach</div>
567dd6b2bfcSGreg Roach
568dd6b2bfcSGreg Roach<!-- MODULES -->
569dd6b2bfcSGreg Roach<div class="card mb-4">
570dd6b2bfcSGreg Roach    <div class="card-header">
571dd6b2bfcSGreg Roach        <h2 class="mb-0">
572dd6b2bfcSGreg Roach            <?= I18N::translate('Modules') ?>
5739d627a9eSGreg Roach            <?= view('components/badge', ['count' => $all_modules_enabled->count(), 'total' => $all_modules_disabled->count(), 'context' => 'secondary']) ?>
574dd6b2bfcSGreg Roach        </h2>
575dd6b2bfcSGreg Roach    </div>
5760cb66f86SGreg Roach
577dd6b2bfcSGreg Roach    <div class="card-body">
578315eb316SGreg Roach        <ul class="fa-ul mx-0">
5790cb66f86SGreg Roach            <li>
5809d627a9eSGreg Roach                <span class="fa-li"><?= view('icons/module') ?></span>
5819f667ff2SGreg Roach                <a href="<?= e(route(ModulesAllPage::class)) ?>">
5829d627a9eSGreg Roach                    <?= I18N::translate('All modules') ?>
5830cb66f86SGreg Roach                </a>
5849d627a9eSGreg Roach                <?= view('components/badge', ['count' => $all_modules_enabled->count(), 'total' => $all_modules_disabled->count(), 'context' => 'primary']) ?>
5850cb66f86SGreg Roach            </li>
5860cb66f86SGreg Roach        </ul>
5870cb66f86SGreg Roach
588dd6b2bfcSGreg Roach        <div class="row">
589abafa13cSGreg Roach            <div class="col-sm-4">
5909d627a9eSGreg Roach                <h3>
591c9c6f2ecSGreg Roach                    <?= I18N::translate('Website') ?>
592c9c6f2ecSGreg Roach                </h3>
593c9c6f2ecSGreg Roach
594315eb316SGreg Roach                <ul class="fa-ul mx-0">
595c9c6f2ecSGreg Roach                    <li>
596c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/footer') ?></span>
597c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesFootersPage::class)) ?>">
598c9c6f2ecSGreg Roach                            <?= I18N::translate('Footers') ?>
599c9c6f2ecSGreg Roach                        </a>
600c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $footer_modules_enabled->count(), 'total' => $footer_modules_disabled->count(), 'context' => 'primary']) ?>
601c9c6f2ecSGreg Roach                    </li>
602c9c6f2ecSGreg Roach                    <li>
603c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/analytics') ?></span>
604c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesAnalyticsPage::class)) ?>">
605c9c6f2ecSGreg Roach                            <?= I18N::translate('Tracking and analytics') ?>
606c9c6f2ecSGreg Roach                        </a>
607c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $analytics_modules_enabled->count(), 'total' => $analytics_modules_disabled->count(), 'context' => 'primary']) ?>
608c9c6f2ecSGreg Roach                    </li>
609c9c6f2ecSGreg Roach                    <li>
610c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/theme') ?></span>
611c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesThemesPage::class)) ?>">
612c9c6f2ecSGreg Roach                            <?= I18N::translate('Themes') ?>
613c9c6f2ecSGreg Roach                        </a>
614c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $theme_modules_enabled->count(), 'total' => $theme_modules_disabled->count(), 'context' => 'primary']) ?>
615c9c6f2ecSGreg Roach                    </li>
616c9c6f2ecSGreg Roach                    <li>
617c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/language') ?></span>
618c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesLanguagesPage::class)) ?>">
619c9c6f2ecSGreg Roach                            <?= I18N::translate('Languages') ?>
620c9c6f2ecSGreg Roach                        </a>
621c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $language_modules_enabled->count(), 'total' => $language_modules_disabled->count(), 'context' => 'primary']) ?>
622c9c6f2ecSGreg Roach                    </li>
623c9c6f2ecSGreg Roach                </ul>
624c9c6f2ecSGreg Roach
625c9c6f2ecSGreg Roach                <h3>
626c9c6f2ecSGreg Roach                    <?= I18N::translate('Home page') ?>
627c9c6f2ecSGreg Roach                </h3>
628c9c6f2ecSGreg Roach
629315eb316SGreg Roach                <ul class="fa-ul mx-0">
630c9c6f2ecSGreg Roach                    <li>
631c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/block') ?></span>
632c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesBlocksPage::class)) ?>">
633c9c6f2ecSGreg Roach                            <?= I18N::translate('Blocks') ?>
634c9c6f2ecSGreg Roach                        </a>
635c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $block_modules_enabled->count(), 'total' => $block_modules_disabled->count(), 'context' => 'primary']) ?>
636c9c6f2ecSGreg Roach                    </li>
637c9c6f2ecSGreg Roach                </ul>
638c9c6f2ecSGreg Roach
639c9c6f2ecSGreg Roach                <h3>
640c9c6f2ecSGreg Roach                    <?= I18N::translate('Geographic data') ?>
641c9c6f2ecSGreg Roach                </h3>
642c9c6f2ecSGreg Roach
643315eb316SGreg Roach                <ul class="fa-ul mx-0">
644c9c6f2ecSGreg Roach                    <li>
645c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/search') ?></span>
646c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesMapAutocompletePage::class)) ?>">
6475b71d802SGreg Roach                            <?= /* I18N: Automatic suggestions when you type */ I18N::translate('Autocomplete') ?>
648c9c6f2ecSGreg Roach                        </a>
649c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $map_autocomplete_modules_enabled->count(), 'total' => $map_autocomplete_modules_disabled->count(), 'context' => 'primary']) ?>
650c9c6f2ecSGreg Roach                    </li>
651c9c6f2ecSGreg Roach                    <li>
652c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/search-location') ?></span>
653c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesMapGeoLocationsPage::class)) ?>">
6549fb58c9eSGreg Roach                            <?= /* I18N: find latitude/longitude for a place */ I18N::translate('Geolocation') ?>
655c9c6f2ecSGreg Roach                        </a>
656c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $map_search_modules_enabled->count(), 'total' => $map_search_modules_disabled->count(), 'context' => 'primary']) ?>
657c9c6f2ecSGreg Roach                    </li>
658c9c6f2ecSGreg Roach                    <li>
659c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/location') ?></span>
660c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesMapLinksPage::class)) ?>">
6615b71d802SGreg Roach                            <?= /* I18N: Links to maps */ I18N::translate('Map links') ?>
662c9c6f2ecSGreg Roach                        </a>
663c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $map_link_modules_enabled->count(), 'total' => $map_link_modules_disabled->count(), 'context' => 'primary']) ?>
664c9c6f2ecSGreg Roach                    </li>
665c9c6f2ecSGreg Roach                    <li>
666c9c6f2ecSGreg Roach                        <span class="fa-li"><?= view('icons/map') ?></span>
667c9c6f2ecSGreg Roach                        <a href="<?= e(route(ModulesMapProvidersPage::class)) ?>">
6689fb58c9eSGreg Roach                            <?= I18N::translate('Map providers') ?>
669c9c6f2ecSGreg Roach                        </a>
670c9c6f2ecSGreg Roach                        <?= view('components/badge', ['count' => $map_provider_modules_enabled->count(), 'total' => $map_provider_modules_disabled->count(), 'context' => 'primary']) ?>
671c9c6f2ecSGreg Roach                    </li>
672c9c6f2ecSGreg Roach                </ul>
673c9c6f2ecSGreg Roach            </div>
674c9c6f2ecSGreg Roach
675c9c6f2ecSGreg Roach            <div class="col-sm-4">
676c9c6f2ecSGreg Roach                <h3>
6779d627a9eSGreg Roach                    <?= I18N::translate('Genealogy') ?>
6789d627a9eSGreg Roach                </h3>
67909fbf3e5SGreg Roach
680315eb316SGreg Roach                <ul class="fa-ul mx-0">
681dd6b2bfcSGreg Roach                    <li>
682dd6b2bfcSGreg Roach                        <span class="fa-li"><?= view('icons/menu') ?></span>
6839f667ff2SGreg Roach                        <a href="<?= e(route(ModulesMenusPage::class)) ?>">
684dd6b2bfcSGreg Roach                            <?= I18N::translate('Menus') ?>
685dd6b2bfcSGreg Roach                        </a>
6869d627a9eSGreg Roach                        <?= view('components/badge', ['count' => $menu_modules_enabled->count(), 'total' => $menu_modules_disabled->count(), 'context' => 'primary']) ?>
687dd6b2bfcSGreg Roach                    </li>
688dd6b2bfcSGreg Roach                    <li>
689dd6b2bfcSGreg Roach                        <span class="fa-li"><?= view('icons/chart') ?></span>
6909f667ff2SGreg Roach                        <a href="<?= e(route(ModulesChartsPage::class)) ?>">
691dd6b2bfcSGreg Roach                            <?= I18N::translate('Charts') ?>
692dd6b2bfcSGreg Roach                        </a>
6939d627a9eSGreg Roach                        <?= view('components/badge', ['count' => $chart_modules_enabled->count(), 'total' => $chart_modules_disabled->count(), 'context' => 'primary']) ?>
694dd6b2bfcSGreg Roach                    </li>
695dd6b2bfcSGreg Roach                    <li>
69667992b6aSRichard Cissee                        <span class="fa-li"><?= view('icons/list') ?></span>
6979f667ff2SGreg Roach                        <a href="<?= e(route(ModulesListsPage::class)) ?>">
69867992b6aSRichard Cissee                            <?= I18N::translate('Lists') ?>
69967992b6aSRichard Cissee                        </a>
7009d627a9eSGreg Roach                        <?= view('components/badge', ['count' => $list_modules_enabled->count(), 'total' => $list_modules_disabled->count(), 'context' => 'primary']) ?>
70167992b6aSRichard Cissee                    </li>
70267992b6aSRichard Cissee                    <li>
703dd6b2bfcSGreg Roach                        <span class="fa-li"><?= view('icons/report') ?></span>
7049f667ff2SGreg Roach                        <a href="<?= e(route(ModulesReportsPage::class)) ?>">
705dd6b2bfcSGreg Roach                            <?= I18N::translate('Reports') ?>
706dd6b2bfcSGreg Roach                        </a>
7079d627a9eSGreg Roach                        <?= view('components/badge', ['count' => $report_modules_enabled->count(), 'total' => $report_modules_disabled->count(), 'context' => 'primary']) ?>
708dd6b2bfcSGreg Roach                    </li>
709ce42304aSGreg Roach                    <li>
710ce42304aSGreg Roach                        <span class="fa-li"><?= view('icons/data-fix') ?></span>
7119f667ff2SGreg Roach                        <a href="<?= e(route(ModulesDataFixesPage::class)) ?>">
712ce42304aSGreg Roach                            <?= I18N::translate('Data fixes') ?>
713ce42304aSGreg Roach                        </a>
714ce42304aSGreg Roach                        <?= view('components/badge', ['count' => $data_fix_modules_enabled->count(), 'total' => $data_fix_modules_disabled->count(), 'context' => 'primary']) ?>
715ce42304aSGreg Roach                    </li>
7169d627a9eSGreg Roach                </ul>
71709fbf3e5SGreg Roach
7189d627a9eSGreg Roach                <h3>
7199d627a9eSGreg Roach                    <?= I18N::translate('Individual page') ?>
7209d627a9eSGreg Roach                </h3>
72109fbf3e5SGreg Roach
722315eb316SGreg Roach                <ul class="fa-ul mx-0">
7239d627a9eSGreg Roach                    <li>
7249d627a9eSGreg Roach                        <span class="fa-li"><?= view('icons/tab') ?></span>
7259f667ff2SGreg Roach                        <a href="<?= e(route(ModulesTabsPage::class)) ?>">
7269d627a9eSGreg Roach                            <?= I18N::translate('Tabs') ?>
7279d627a9eSGreg Roach                            <?= view('components/badge', ['count' => $tab_modules_enabled->count(), 'total' => $tab_modules_disabled->count(), 'context' => 'primary']) ?>
7289d627a9eSGreg Roach                        </a>
7299d627a9eSGreg Roach                    </li>
7309d627a9eSGreg Roach                    <li>
7319d627a9eSGreg Roach                        <span class="fa-li"><?= view('icons/sidebar') ?></span>
7329f667ff2SGreg Roach                        <a href="<?= e(route(ModulesSidebarsPage::class)) ?>">
7339d627a9eSGreg Roach                            <?= I18N::translate('Sidebars') ?>
7349d627a9eSGreg Roach                        </a>
7359d627a9eSGreg Roach                        <?= view('components/badge', ['count' => $sidebar_modules_enabled->count(), 'total' => $sidebar_modules_disabled->count(), 'context' => 'primary']) ?>
7369d627a9eSGreg Roach                    </li>
7379d627a9eSGreg Roach                    <li>
7389d627a9eSGreg Roach                        <span class="fa-li"><?= view('icons/history') ?></span>
7399f667ff2SGreg Roach                        <a href="<?= e(route(ModulesHistoricEventsPage::class)) ?>">
7409d627a9eSGreg Roach                            <?= I18N::translate('Historic events') ?>
7419d627a9eSGreg Roach                        </a>
7429d627a9eSGreg Roach                        <?= view('components/badge', ['count' => $history_modules_enabled->count(), 'total' => $history_modules_disabled->count(), 'context' => 'primary']) ?>
7439d627a9eSGreg Roach                    </li>
744853f2b8aSGreg Roach                    <li>
745853f2b8aSGreg Roach                        <span class="fa-li"><?= view('icons/share') ?></span>
746853f2b8aSGreg Roach                        <a href="<?= e(route(ModulesSharesPage::class)) ?>">
747853f2b8aSGreg Roach                            <?= /* I18N: plural noun - things that can be shared */  I18N::translate('Shares') ?>
748853f2b8aSGreg Roach                        </a>
749853f2b8aSGreg Roach                        <?= view('components/badge', ['count' => $share_modules_enabled->count(), 'total' => $share_modules_disabled->count(), 'context' => 'primary']) ?>
750853f2b8aSGreg Roach                    </li>
75135a8a96dSGreg Roach                </ul>
752abafa13cSGreg Roach            </div>
753abafa13cSGreg Roach
754abafa13cSGreg Roach            <div class="col-sm-4">
755abafa13cSGreg Roach
7569d627a9eSGreg Roach                <h3>
7579d627a9eSGreg Roach                    <?= I18N::translate('Other') ?>
7589d627a9eSGreg Roach                </h3>
75909fbf3e5SGreg Roach
760315eb316SGreg Roach                <ul class="fa-ul mx-0">
76109fbf3e5SGreg Roach                    <?php foreach ($other_modules as $module) : ?>
762dd6b2bfcSGreg Roach                        <li>
7638d6560c4SGreg Roach                            <?php if ($module->isEnabled()) : ?>
76409f65a51SGreg Roach                                <span class="fa-li"><?= view('icons/module') ?></span>
7658d6560c4SGreg Roach                                <?php if ($module instanceof ModuleConfigInterface) : ?>
766dd6b2bfcSGreg Roach                                    <a href="<?= e($module->getConfigLink()) ?>">
76749a243cbSGreg Roach                                    <?= $module->title() ?>
768852bddbeSGreg Roach                                    <?= view('icons/preferences') ?>
769dd6b2bfcSGreg Roach                                    </a>
77009fbf3e5SGreg Roach                                <?php else : ?>
7718d6560c4SGreg Roach                                    <?= $module->title() ?>
77209fbf3e5SGreg Roach                                <?php endif ?>
7738d6560c4SGreg Roach                            <?php else : ?>
7748d6560c4SGreg Roach                                <span class="text-muted">
77509f65a51SGreg Roach                                    <span class="fa-li"><?= view('icons/module') ?></span>
7768d6560c4SGreg Roach                                    <?= $module->title() ?>
7778d6560c4SGreg Roach                                    <?php if ($module instanceof ModuleConfigInterface) : ?>
778852bddbeSGreg Roach                                        <?= view('icons/preferences') ?>
7798d6560c4SGreg Roach                                    <?php endif ?>
7808d6560c4SGreg Roach                                </span>
7818d6560c4SGreg Roach                            <?php endif ?>
7828d6560c4SGreg Roach
783beefaa8eSGreg Roach                            <?php if ($module instanceof ModuleCustomInterface) : ?>
784beefaa8eSGreg Roach                                <?= view('admin/custom-module-info', ['module' => $module]) ?>
785beefaa8eSGreg Roach                            <?php endif ?>
786dd6b2bfcSGreg Roach                        </li>
787dd6b2bfcSGreg Roach                    <?php endforeach ?>
788dd6b2bfcSGreg Roach                </ul>
789dd6b2bfcSGreg Roach            </div>
790dd6b2bfcSGreg Roach        </div>
791dd6b2bfcSGreg Roach    </div>
792dd6b2bfcSGreg Roach</div>
793dd6b2bfcSGreg Roach
794dd6b2bfcSGreg Roach<!-- MEDIA -->
795dd6b2bfcSGreg Roach<div class="card mb-4">
796dd6b2bfcSGreg Roach    <div class="card-header">
797dd6b2bfcSGreg Roach        <h2 class="mb-0">
798dd6b2bfcSGreg Roach            <?= I18N::translate('Media') ?>
799dd6b2bfcSGreg Roach        </h2>
800dd6b2bfcSGreg Roach    </div>
801dd6b2bfcSGreg Roach    <div class="card-body">
802315eb316SGreg Roach        <ul class="fa-ul mx-0">
803dd6b2bfcSGreg Roach            <li>
804dd6b2bfcSGreg Roach                <span class="fa-li"><?= view('icons/preferences') ?></span>
8058ce3bd73SGreg Roach                <a href="<?= e(route(ManageMediaPage::class)) ?>">
806dd6b2bfcSGreg Roach                    <?= I18N::translate('Manage media') ?>
807dd6b2bfcSGreg Roach                </a>
808dd6b2bfcSGreg Roach            </li>
809dd6b2bfcSGreg Roach            <li>
810a24f7142SGreg Roach                <span class="fa-li"><?= view('icons/upload') ?></span>
8118ce3bd73SGreg Roach                <a href="<?= e(route(UploadMediaPage::class)) ?>">
812dd6b2bfcSGreg Roach                    <?= I18N::translate('Upload media files') ?>
813dd6b2bfcSGreg Roach                </a>
814dd6b2bfcSGreg Roach            </li>
815dd6b2bfcSGreg Roach            <li>
816a24f7142SGreg Roach                <span class="fa-li"><?= view('icons/link') ?></span>
8174b3ef6caSGreg Roach                <a href="<?= e(route(FixLevel0MediaPage::class)) ?>">
818dd6b2bfcSGreg Roach                    <?= I18N::translate('Link media objects to facts and events') ?>
819dd6b2bfcSGreg Roach                </a>
820dd6b2bfcSGreg Roach            </li>
821dd6b2bfcSGreg Roach        </ul>
822dd6b2bfcSGreg Roach    </div>
823dd6b2bfcSGreg Roach</div>
824dd6b2bfcSGreg Roach
825dd6b2bfcSGreg Roach<!-- MAPS -->
826dd6b2bfcSGreg Roach<div class="card mb-4">
827dd6b2bfcSGreg Roach    <div class="card-header">
828dd6b2bfcSGreg Roach        <h2 class="mb-0">
829dd6b2bfcSGreg Roach            <?= I18N::translate('Map') ?>
830dd6b2bfcSGreg Roach        </h2>
831dd6b2bfcSGreg Roach    </div>
832dd6b2bfcSGreg Roach    <div class="card-body">
833dd6b2bfcSGreg Roach        <div class="row">
834c9c6f2ecSGreg Roach            <div class="col-sm-12">
835315eb316SGreg Roach                <ul class="fa-ul mx-0">
836dd6b2bfcSGreg Roach                    <li>
837dd6b2bfcSGreg Roach                        <span class="fa-li"><?= view('icons/location') ?></span>
83894e35917SGreg Roach                        <a href="<?= e(route(MapDataList::class)) ?>">
839dd6b2bfcSGreg Roach                            <?= I18N::translate('Geographic data') ?>
840dd6b2bfcSGreg Roach                        </a>
841dd6b2bfcSGreg Roach                    </li>
842dd6b2bfcSGreg Roach                </ul>
843dd6b2bfcSGreg Roach            </div>
844dd6b2bfcSGreg Roach        </div>
845dd6b2bfcSGreg Roach    </div>
846dd6b2bfcSGreg Roach</div>
847dd6b2bfcSGreg Roach
848dd6b2bfcSGreg Roach<!-- OLD FILES -->
849dd6b2bfcSGreg Roach<?php if (!empty($files_to_delete)) : ?>
850dd6b2bfcSGreg Roach    <div class="card mb-4 card-outline-danger">
851dd6b2bfcSGreg Roach        <div class="card-header">
852dd6b2bfcSGreg Roach            <h2 class="mb-0">
853dd6b2bfcSGreg Roach                <?= I18N::translate('Old files found') ?>
854dd6b2bfcSGreg Roach            </h2>
855dd6b2bfcSGreg Roach        </div>
856dd6b2bfcSGreg Roach        <div class="card-body">
857dd6b2bfcSGreg Roach            <p>
858dd6b2bfcSGreg Roach                <?= I18N::translate('Files have been found from a previous version of webtrees. Old files can sometimes be a security risk. You should delete them.') ?>
859dd6b2bfcSGreg Roach            </p>
860dd6b2bfcSGreg Roach            <ul class="list-unstyled">
861dd6b2bfcSGreg Roach                <?php foreach ($files_to_delete as $file_to_delete) : ?>
862beefaa8eSGreg Roach                    <li dir="ltr">
863beefaa8eSGreg Roach                        <code><?= e($file_to_delete) ?></code>
864beefaa8eSGreg Roach                    </li>
865dd6b2bfcSGreg Roach                <?php endforeach ?>
866dd6b2bfcSGreg Roach            </ul>
867dd6b2bfcSGreg Roach        </div>
868dd6b2bfcSGreg Roach    </div>
869dd6b2bfcSGreg Roach<?php endif ?>
870