xref: /webtrees/app/Http/RequestHandlers/TreePreferencesPage.php (revision 3faaf002227d16afd77a906db4683ac5c8df89ae)
16fd01894SGreg Roach<?php
26fd01894SGreg Roach
36fd01894SGreg Roach/**
46fd01894SGreg Roach * webtrees: online genealogy
589f7189bSGreg Roach * Copyright (C) 2021 webtrees development team
66fd01894SGreg Roach * This program is free software: you can redistribute it and/or modify
76fd01894SGreg Roach * it under the terms of the GNU General Public License as published by
86fd01894SGreg Roach * the Free Software Foundation, either version 3 of the License, or
96fd01894SGreg Roach * (at your option) any later version.
106fd01894SGreg Roach * This program is distributed in the hope that it will be useful,
116fd01894SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
126fd01894SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
136fd01894SGreg Roach * GNU General Public License for more details.
146fd01894SGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
166fd01894SGreg Roach */
176fd01894SGreg Roach
186fd01894SGreg Roachdeclare(strict_types=1);
196fd01894SGreg Roach
206fd01894SGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers;
216fd01894SGreg Roach
226fd01894SGreg Roachuse Fisharebest\Webtrees\Auth;
23*3faaf002SGreg Roachuse Fisharebest\Webtrees\Contracts\ElementInterface;
246fd01894SGreg Roachuse Fisharebest\Webtrees\Contracts\UserInterface;
256fd01894SGreg Roachuse Fisharebest\Webtrees\Date;
26*3faaf002SGreg Roachuse Fisharebest\Webtrees\Elements\UnknownElement;
276fd01894SGreg Roachuse Fisharebest\Webtrees\Http\ViewResponseTrait;
286fd01894SGreg Roachuse Fisharebest\Webtrees\I18N;
296fd01894SGreg Roachuse Fisharebest\Webtrees\Module\ModuleThemeInterface;
306b9cb339SGreg Roachuse Fisharebest\Webtrees\Registry;
316fd01894SGreg Roachuse Fisharebest\Webtrees\Services\ModuleService;
326fd01894SGreg Roachuse Fisharebest\Webtrees\Services\TreeService;
336fd01894SGreg Roachuse Fisharebest\Webtrees\Services\UserService;
346fd01894SGreg Roachuse Fisharebest\Webtrees\SurnameTradition;
356fd01894SGreg Roachuse Fisharebest\Webtrees\Tree;
3637646143SGreg Roachuse Illuminate\Support\Collection;
376fd01894SGreg Roachuse Psr\Http\Message\ResponseInterface;
386fd01894SGreg Roachuse Psr\Http\Message\ServerRequestInterface;
396fd01894SGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
406fd01894SGreg Roach
416fd01894SGreg Roachuse function app;
426fd01894SGreg Roachuse function assert;
436fd01894SGreg Roachuse function e;
446fd01894SGreg Roachuse function explode;
45*3faaf002SGreg Roachuse function in_array;
466fd01894SGreg Roach
476fd01894SGreg Roach/**
486fd01894SGreg Roach * Edit the tree preferences.
496fd01894SGreg Roach */
506fd01894SGreg Roachclass TreePreferencesPage implements RequestHandlerInterface
516fd01894SGreg Roach{
526fd01894SGreg Roach    use ViewResponseTrait;
536fd01894SGreg Roach
5437646143SGreg Roach    private const ALL_FAM_FACTS = [
5537646143SGreg Roach        'RESN', 'ANUL', 'CENS', 'DIV', 'DIVF', 'ENGA', 'MARB', 'MARC', 'MARR', 'MARL', 'MARS', 'RESI', 'EVEN',
5669cdf014SGreg Roach        'NCHI', 'SUBM', 'SLGS', 'REFN', 'RIN', 'CHAN', 'NOTE', 'SOUR', 'OBJE',
5737646143SGreg Roach        '_NMR', '_COML', '_MBON', '_MARI', '_SEPR', '_TODO',
5837646143SGreg Roach    ];
5937646143SGreg Roach
6037646143SGreg Roach    private const ALL_INDI_FACTS = [
6137646143SGreg Roach        'RESN', 'NAME', 'SEX', 'BIRT', 'CHR', 'DEAT', 'BURI', 'CREM', 'ADOP', 'BAPM', 'BARM', 'BASM',
6237646143SGreg Roach        'BLES', 'CHRA', 'CONF', 'FCOM', 'ORDN', 'NATU', 'EMIG', 'IMMI', 'CENS', 'PROB', 'WILL',
6337646143SGreg Roach        'GRAD', 'RETI', 'EVEN', 'CAST', 'DSCR', 'EDUC', 'IDNO', 'NATI', 'NCHI', 'NMR', 'OCCU', 'PROP',
6437646143SGreg Roach        'RELI', 'RESI', 'SSN', 'TITL', 'FACT', 'BAPL', 'CONL', 'ENDL', 'SLGC', 'SUBM', 'ASSO',
6569cdf014SGreg Roach        'ALIA', 'ANCI', 'DESI', 'RFN', 'AFN', 'REFN', 'RIN', 'CHAN', 'NOTE', 'SOUR', 'OBJE',
6637646143SGreg Roach        '_BRTM', '_DEG', '_DNA', '_EYEC', '_FNRL', '_HAIR', '_HEIG', '_HNM', '_HOL', '_INTE', '_MDCL',
6737646143SGreg Roach        '_MEDC', '_MILI', '_MILT', '_NAME', '_NAMS', '_NLIV', '_NMAR', '_PRMN', '_TODO', '_UID', '_WEIG', '_YART',
6837646143SGreg Roach    ];
6937646143SGreg Roach
7037646143SGreg Roach    private const ALL_NAME_FACTS = [
7137646143SGreg Roach        'FONE', 'ROMN', '_HEB', '_AKA', '_MARNM',
7237646143SGreg Roach    ];
7337646143SGreg Roach
7437646143SGreg Roach    private const ALL_PLAC_FACTS = [
7537646143SGreg Roach        'FONE', 'ROMN', '_GOV', '_HEB',
7637646143SGreg Roach    ];
7737646143SGreg Roach
7837646143SGreg Roach    private const ALL_REPO_FACTS = [
7969cdf014SGreg Roach        'NAME', 'ADDR', 'PHON', 'EMAIL', 'FAX', 'WWW', 'NOTE', 'REFN', 'RIN', 'CHAN', 'RESN',
8037646143SGreg Roach    ];
8137646143SGreg Roach
8237646143SGreg Roach    private const ALL_SOUR_FACTS = [
8337646143SGreg Roach        'DATA', 'AUTH', 'TITL', 'ABBR', 'PUBL', 'TEXT', 'REPO', 'REFN', 'RIN',
8469cdf014SGreg Roach        'CHAN', 'NOTE', 'OBJE', 'RESN',
8537646143SGreg Roach    ];
8637646143SGreg Roach
87c4943cffSGreg Roach    private ModuleService $module_service;
886fd01894SGreg Roach
89c4943cffSGreg Roach    private TreeService $tree_service;
906fd01894SGreg Roach
91c4943cffSGreg Roach    private UserService $user_service;
926fd01894SGreg Roach
936fd01894SGreg Roach    public function __construct(
946fd01894SGreg Roach        ModuleService $module_service,
956fd01894SGreg Roach        TreeService $tree_service,
966fd01894SGreg Roach        UserService $user_service
976fd01894SGreg Roach    ) {
986fd01894SGreg Roach        $this->module_service = $module_service;
996fd01894SGreg Roach        $this->tree_service   = $tree_service;
1006fd01894SGreg Roach        $this->user_service   = $user_service;
1016fd01894SGreg Roach    }
1026fd01894SGreg Roach
1036fd01894SGreg Roach    /**
1046fd01894SGreg Roach     * @param ServerRequestInterface $request
1056fd01894SGreg Roach     *
1066fd01894SGreg Roach     * @return ResponseInterface
1076fd01894SGreg Roach     */
1086fd01894SGreg Roach    public function handle(ServerRequestInterface $request): ResponseInterface
1096fd01894SGreg Roach    {
1106fd01894SGreg Roach        $this->layout = 'layouts/administration';
1116fd01894SGreg Roach
1126fd01894SGreg Roach        $tree = $request->getAttribute('tree');
1136fd01894SGreg Roach        assert($tree instanceof Tree);
1146fd01894SGreg Roach
1156b9cb339SGreg Roach        $data_folder = Registry::filesystem()->dataName();
1166fd01894SGreg Roach
1176fd01894SGreg Roach        $french_calendar_start    = new Date('22 SEP 1792');
1186fd01894SGreg Roach        $french_calendar_end      = new Date('31 DEC 1805');
1196fd01894SGreg Roach        $gregorian_calendar_start = new Date('15 OCT 1582');
1206fd01894SGreg Roach
1216fd01894SGreg Roach        $surname_list_styles = [
1226fd01894SGreg Roach            /* I18N: Layout option for lists of names */
1236fd01894SGreg Roach            'style1' => I18N::translate('list'),
1246fd01894SGreg Roach            /* I18N: Layout option for lists of names */
1256fd01894SGreg Roach            'style2' => I18N::translate('table'),
1266fd01894SGreg Roach            /* I18N: Layout option for lists of names */
1276fd01894SGreg Roach            'style3' => I18N::translate('tag cloud'),
1286fd01894SGreg Roach        ];
1296fd01894SGreg Roach
1306fd01894SGreg Roach        $page_layouts = [
1316fd01894SGreg Roach            /* I18N: page orientation */
1326fd01894SGreg Roach            0 => I18N::translate('Portrait'),
1336fd01894SGreg Roach            /* I18N: page orientation */
1346fd01894SGreg Roach            1 => I18N::translate('Landscape'),
1356fd01894SGreg Roach        ];
1366fd01894SGreg Roach
1376fd01894SGreg Roach        $formats = [
1386fd01894SGreg Roach            /* I18N: None of the other options */
1396fd01894SGreg Roach            ''         => I18N::translate('none'),
1406fd01894SGreg Roach            /* I18N: https://en.wikipedia.org/wiki/Markdown */
1416fd01894SGreg Roach            'markdown' => I18N::translate('markdown'),
1426fd01894SGreg Roach        ];
1436fd01894SGreg Roach
1446fd01894SGreg Roach        $source_types = [
1456fd01894SGreg Roach            0 => I18N::translate('none'),
1466fd01894SGreg Roach            1 => I18N::translate('facts'),
1476fd01894SGreg Roach            2 => I18N::translate('records'),
1486fd01894SGreg Roach        ];
1496fd01894SGreg Roach
1506fd01894SGreg Roach        $theme_options = $this->module_service
1516fd01894SGreg Roach            ->findByInterface(ModuleThemeInterface::class)
1526fd01894SGreg Roach            ->map($this->module_service->titleMapper())
1536fd01894SGreg Roach            ->prepend(I18N::translate('<default theme>'), '');
1546fd01894SGreg Roach
1556fd01894SGreg Roach        $privacy_options = [
1566fd01894SGreg Roach            Auth::PRIV_USER => I18N::translate('Show to members'),
1576fd01894SGreg Roach            Auth::PRIV_NONE => I18N::translate('Show to managers'),
1586fd01894SGreg Roach            Auth::PRIV_HIDE => I18N::translate('Hide from everyone'),
1596fd01894SGreg Roach        ];
1606fd01894SGreg Roach
1616fd01894SGreg Roach        // For historical reasons, we have two fields in one
1626fd01894SGreg Roach        $calendar_formats = explode('_and_', $tree->getPreference('CALENDAR_FORMAT') . '_and_');
1636fd01894SGreg Roach
1646fd01894SGreg Roach        // Split into separate fields
1656fd01894SGreg Roach        $relatives_events = explode(',', $tree->getPreference('SHOW_RELATIVES_EVENTS'));
1666fd01894SGreg Roach
1676b9cb339SGreg Roach        $pedigree_individual = Registry::individualFactory()->make($tree->getPreference('PEDIGREE_ROOT_ID'), $tree);
1686fd01894SGreg Roach
1696fd01894SGreg Roach        $members = $this->user_service->all()->filter(static function (UserInterface $user) use ($tree): bool {
1706fd01894SGreg Roach            return Auth::isMember($tree, $user);
1716fd01894SGreg Roach        });
1726fd01894SGreg Roach
173*3faaf002SGreg Roach        $ignore_facts = ['CHAN', 'CHIL', 'FAMC', 'FAMS', 'HUSB', 'NOTE', 'OBJE', 'SOUR', 'SUBM', 'WIFE'];
174*3faaf002SGreg Roach
175*3faaf002SGreg Roach        $all_family_facts = Collection::make(Registry::elementFactory()->make('FAM')->subtags())
176*3faaf002SGreg Roach            ->filter(static fn (string $value, string $key): bool => !in_array($key, $ignore_facts, true))
177*3faaf002SGreg Roach            ->mapWithKeys(static fn (string $value, string $key): array => [$key => 'FAM:' . $key])
178*3faaf002SGreg Roach            ->map(static fn (string $tag): ElementInterface => Registry::elementFactory()->make($tag))
179*3faaf002SGreg Roach            ->filter(static fn (ElementInterface $element): bool => !$element instanceof UnknownElement)
180*3faaf002SGreg Roach            ->map(static fn (ElementInterface $element): string => $element->label())
18137646143SGreg Roach            ->sort(I18N::comparator());
18237646143SGreg Roach
183*3faaf002SGreg Roach        $all_individual_facts = Collection::make(Registry::elementFactory()->make('INDI')->subtags())
184*3faaf002SGreg Roach            ->filter(static fn (string $value, string $key): bool => !in_array($key, $ignore_facts, true))
185*3faaf002SGreg Roach            ->mapWithKeys(static fn (string $value, string $key): array => [$key => 'INDI:' . $key])
186*3faaf002SGreg Roach            ->map(static fn (string $tag): ElementInterface => Registry::elementFactory()->make($tag))
187*3faaf002SGreg Roach            ->filter(static fn (ElementInterface $element): bool => !$element instanceof UnknownElement)
188*3faaf002SGreg Roach            ->map(static fn (ElementInterface $element): string => $element->label())
18937646143SGreg Roach            ->sort(I18N::comparator());
1906fd01894SGreg Roach
1916fd01894SGreg Roach        $all_surname_traditions = SurnameTradition::allDescriptions();
1926fd01894SGreg Roach
1936fd01894SGreg Roach        $tree_count = $this->tree_service->all()->count();
1946fd01894SGreg Roach
1956fd01894SGreg Roach        $title = I18N::translate('Preferences') . ' — ' . e($tree->title());
1966fd01894SGreg Roach
1976fd01894SGreg Roach        $base_url = app(ServerRequestInterface::class)->getAttribute('base_url');
1986fd01894SGreg Roach
1996fd01894SGreg Roach        return $this->viewResponse('admin/trees-preferences', [
200*3faaf002SGreg Roach            'all_family_facts'         => $all_family_facts,
201*3faaf002SGreg Roach            'all_individual_facts'     => $all_individual_facts,
2026fd01894SGreg Roach            'all_surname_traditions'   => $all_surname_traditions,
2036fd01894SGreg Roach            'base_url'                 => $base_url,
2046fd01894SGreg Roach            'calendar_formats'         => $calendar_formats,
2056fd01894SGreg Roach            'data_folder'              => $data_folder,
2066fd01894SGreg Roach            'formats'                  => $formats,
2076fd01894SGreg Roach            'french_calendar_end'      => $french_calendar_end,
2086fd01894SGreg Roach            'french_calendar_start'    => $french_calendar_start,
2096fd01894SGreg Roach            'gregorian_calendar_start' => $gregorian_calendar_start,
2106fd01894SGreg Roach            'members'                  => $members,
2116fd01894SGreg Roach            'page_layouts'             => $page_layouts,
2126fd01894SGreg Roach            'pedigree_individual'      => $pedigree_individual,
2136fd01894SGreg Roach            'privacy_options'          => $privacy_options,
2146fd01894SGreg Roach            'relatives_events'         => $relatives_events,
2156fd01894SGreg Roach            'source_types'             => $source_types,
2166fd01894SGreg Roach            'surname_list_styles'      => $surname_list_styles,
2176fd01894SGreg Roach            'theme_options'            => $theme_options,
2186fd01894SGreg Roach            'title'                    => $title,
2196fd01894SGreg Roach            'tree'                     => $tree,
2206fd01894SGreg Roach            'tree_count'               => $tree_count,
2216fd01894SGreg Roach        ]);
2226fd01894SGreg Roach    }
2236fd01894SGreg Roach}
224