xref: /webtrees/app/Http/RequestHandlers/TreePreferencesPage.php (revision c4943cff72f95a28fbb9404e3c20b169ff098e5c)
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;
236fd01894SGreg Roachuse Fisharebest\Webtrees\Contracts\UserInterface;
246fd01894SGreg Roachuse Fisharebest\Webtrees\Date;
256fd01894SGreg Roachuse Fisharebest\Webtrees\Http\ViewResponseTrait;
266fd01894SGreg Roachuse Fisharebest\Webtrees\I18N;
276fd01894SGreg Roachuse Fisharebest\Webtrees\Module\ModuleThemeInterface;
286b9cb339SGreg Roachuse Fisharebest\Webtrees\Registry;
296fd01894SGreg Roachuse Fisharebest\Webtrees\Services\ModuleService;
306fd01894SGreg Roachuse Fisharebest\Webtrees\Services\TreeService;
316fd01894SGreg Roachuse Fisharebest\Webtrees\Services\UserService;
326fd01894SGreg Roachuse Fisharebest\Webtrees\SurnameTradition;
336fd01894SGreg Roachuse Fisharebest\Webtrees\Tree;
3437646143SGreg Roachuse Illuminate\Support\Collection;
356fd01894SGreg Roachuse Psr\Http\Message\ResponseInterface;
366fd01894SGreg Roachuse Psr\Http\Message\ServerRequestInterface;
376fd01894SGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
386fd01894SGreg Roach
396fd01894SGreg Roachuse function app;
406fd01894SGreg Roachuse function assert;
416fd01894SGreg Roachuse function e;
426fd01894SGreg Roachuse function explode;
436fd01894SGreg Roach
446fd01894SGreg Roach/**
456fd01894SGreg Roach * Edit the tree preferences.
466fd01894SGreg Roach */
476fd01894SGreg Roachclass TreePreferencesPage implements RequestHandlerInterface
486fd01894SGreg Roach{
496fd01894SGreg Roach    use ViewResponseTrait;
506fd01894SGreg Roach
5137646143SGreg Roach    private const ALL_FAM_FACTS = [
5237646143SGreg Roach        'RESN', 'ANUL', 'CENS', 'DIV', 'DIVF', 'ENGA', 'MARB', 'MARC', 'MARR', 'MARL', 'MARS', 'RESI', 'EVEN',
5369cdf014SGreg Roach        'NCHI', 'SUBM', 'SLGS', 'REFN', 'RIN', 'CHAN', 'NOTE', 'SOUR', 'OBJE',
5437646143SGreg Roach        '_NMR', '_COML', '_MBON', '_MARI', '_SEPR', '_TODO',
5537646143SGreg Roach    ];
5637646143SGreg Roach
5737646143SGreg Roach    private const ALL_INDI_FACTS = [
5837646143SGreg Roach        'RESN', 'NAME', 'SEX', 'BIRT', 'CHR', 'DEAT', 'BURI', 'CREM', 'ADOP', 'BAPM', 'BARM', 'BASM',
5937646143SGreg Roach        'BLES', 'CHRA', 'CONF', 'FCOM', 'ORDN', 'NATU', 'EMIG', 'IMMI', 'CENS', 'PROB', 'WILL',
6037646143SGreg Roach        'GRAD', 'RETI', 'EVEN', 'CAST', 'DSCR', 'EDUC', 'IDNO', 'NATI', 'NCHI', 'NMR', 'OCCU', 'PROP',
6137646143SGreg Roach        'RELI', 'RESI', 'SSN', 'TITL', 'FACT', 'BAPL', 'CONL', 'ENDL', 'SLGC', 'SUBM', 'ASSO',
6269cdf014SGreg Roach        'ALIA', 'ANCI', 'DESI', 'RFN', 'AFN', 'REFN', 'RIN', 'CHAN', 'NOTE', 'SOUR', 'OBJE',
6337646143SGreg Roach        '_BRTM', '_DEG', '_DNA', '_EYEC', '_FNRL', '_HAIR', '_HEIG', '_HNM', '_HOL', '_INTE', '_MDCL',
6437646143SGreg Roach        '_MEDC', '_MILI', '_MILT', '_NAME', '_NAMS', '_NLIV', '_NMAR', '_PRMN', '_TODO', '_UID', '_WEIG', '_YART',
6537646143SGreg Roach    ];
6637646143SGreg Roach
6737646143SGreg Roach    private const ALL_NAME_FACTS = [
6837646143SGreg Roach        'FONE', 'ROMN', '_HEB', '_AKA', '_MARNM',
6937646143SGreg Roach    ];
7037646143SGreg Roach
7137646143SGreg Roach    private const ALL_PLAC_FACTS = [
7237646143SGreg Roach        'FONE', 'ROMN', '_GOV', '_HEB',
7337646143SGreg Roach    ];
7437646143SGreg Roach
7537646143SGreg Roach    private const ALL_REPO_FACTS = [
7669cdf014SGreg Roach        'NAME', 'ADDR', 'PHON', 'EMAIL', 'FAX', 'WWW', 'NOTE', 'REFN', 'RIN', 'CHAN', 'RESN',
7737646143SGreg Roach    ];
7837646143SGreg Roach
7937646143SGreg Roach    private const ALL_SOUR_FACTS = [
8037646143SGreg Roach        'DATA', 'AUTH', 'TITL', 'ABBR', 'PUBL', 'TEXT', 'REPO', 'REFN', 'RIN',
8169cdf014SGreg Roach        'CHAN', 'NOTE', 'OBJE', 'RESN',
8237646143SGreg Roach    ];
8337646143SGreg Roach
84*c4943cffSGreg Roach    private ModuleService $module_service;
856fd01894SGreg Roach
86*c4943cffSGreg Roach    private TreeService $tree_service;
876fd01894SGreg Roach
88*c4943cffSGreg Roach    private UserService $user_service;
896fd01894SGreg Roach
906fd01894SGreg Roach    public function __construct(
916fd01894SGreg Roach        ModuleService $module_service,
926fd01894SGreg Roach        TreeService $tree_service,
936fd01894SGreg Roach        UserService $user_service
946fd01894SGreg Roach    ) {
956fd01894SGreg Roach        $this->module_service = $module_service;
966fd01894SGreg Roach        $this->tree_service   = $tree_service;
976fd01894SGreg Roach        $this->user_service   = $user_service;
986fd01894SGreg Roach    }
996fd01894SGreg Roach
1006fd01894SGreg Roach    /**
1016fd01894SGreg Roach     * @param ServerRequestInterface $request
1026fd01894SGreg Roach     *
1036fd01894SGreg Roach     * @return ResponseInterface
1046fd01894SGreg Roach     */
1056fd01894SGreg Roach    public function handle(ServerRequestInterface $request): ResponseInterface
1066fd01894SGreg Roach    {
1076fd01894SGreg Roach        $this->layout = 'layouts/administration';
1086fd01894SGreg Roach
1096fd01894SGreg Roach        $tree = $request->getAttribute('tree');
1106fd01894SGreg Roach        assert($tree instanceof Tree);
1116fd01894SGreg Roach
1126b9cb339SGreg Roach        $data_folder = Registry::filesystem()->dataName();
1136fd01894SGreg Roach
1146fd01894SGreg Roach        $french_calendar_start    = new Date('22 SEP 1792');
1156fd01894SGreg Roach        $french_calendar_end      = new Date('31 DEC 1805');
1166fd01894SGreg Roach        $gregorian_calendar_start = new Date('15 OCT 1582');
1176fd01894SGreg Roach
1186fd01894SGreg Roach        $surname_list_styles = [
1196fd01894SGreg Roach            /* I18N: Layout option for lists of names */
1206fd01894SGreg Roach            'style1' => I18N::translate('list'),
1216fd01894SGreg Roach            /* I18N: Layout option for lists of names */
1226fd01894SGreg Roach            'style2' => I18N::translate('table'),
1236fd01894SGreg Roach            /* I18N: Layout option for lists of names */
1246fd01894SGreg Roach            'style3' => I18N::translate('tag cloud'),
1256fd01894SGreg Roach        ];
1266fd01894SGreg Roach
1276fd01894SGreg Roach        $page_layouts = [
1286fd01894SGreg Roach            /* I18N: page orientation */
1296fd01894SGreg Roach            0 => I18N::translate('Portrait'),
1306fd01894SGreg Roach            /* I18N: page orientation */
1316fd01894SGreg Roach            1 => I18N::translate('Landscape'),
1326fd01894SGreg Roach        ];
1336fd01894SGreg Roach
1346fd01894SGreg Roach        $formats = [
1356fd01894SGreg Roach            /* I18N: None of the other options */
1366fd01894SGreg Roach            ''         => I18N::translate('none'),
1376fd01894SGreg Roach            /* I18N: https://en.wikipedia.org/wiki/Markdown */
1386fd01894SGreg Roach            'markdown' => I18N::translate('markdown'),
1396fd01894SGreg Roach        ];
1406fd01894SGreg Roach
1416fd01894SGreg Roach        $source_types = [
1426fd01894SGreg Roach            0 => I18N::translate('none'),
1436fd01894SGreg Roach            1 => I18N::translate('facts'),
1446fd01894SGreg Roach            2 => I18N::translate('records'),
1456fd01894SGreg Roach        ];
1466fd01894SGreg Roach
1476fd01894SGreg Roach        $theme_options = $this->module_service
1486fd01894SGreg Roach            ->findByInterface(ModuleThemeInterface::class)
1496fd01894SGreg Roach            ->map($this->module_service->titleMapper())
1506fd01894SGreg Roach            ->prepend(I18N::translate('<default theme>'), '');
1516fd01894SGreg Roach
1526fd01894SGreg Roach        $privacy_options = [
1536fd01894SGreg Roach            Auth::PRIV_USER => I18N::translate('Show to members'),
1546fd01894SGreg Roach            Auth::PRIV_NONE => I18N::translate('Show to managers'),
1556fd01894SGreg Roach            Auth::PRIV_HIDE => I18N::translate('Hide from everyone'),
1566fd01894SGreg Roach        ];
1576fd01894SGreg Roach
1586fd01894SGreg Roach        // For historical reasons, we have two fields in one
1596fd01894SGreg Roach        $calendar_formats = explode('_and_', $tree->getPreference('CALENDAR_FORMAT') . '_and_');
1606fd01894SGreg Roach
1616fd01894SGreg Roach        // Split into separate fields
1626fd01894SGreg Roach        $relatives_events = explode(',', $tree->getPreference('SHOW_RELATIVES_EVENTS'));
1636fd01894SGreg Roach
1646b9cb339SGreg Roach        $pedigree_individual = Registry::individualFactory()->make($tree->getPreference('PEDIGREE_ROOT_ID'), $tree);
1656fd01894SGreg Roach
1666fd01894SGreg Roach        $members = $this->user_service->all()->filter(static function (UserInterface $user) use ($tree): bool {
1676fd01894SGreg Roach            return Auth::isMember($tree, $user);
1686fd01894SGreg Roach        });
1696fd01894SGreg Roach
17037646143SGreg Roach        $all_fam_facts = Collection::make(self::ALL_FAM_FACTS)
17137646143SGreg Roach            ->mapWithKeys(static function (string $tag): array {
17237646143SGreg Roach                return [$tag => Registry::elementFactory()->make('FAM:' . $tag)->label()];
17337646143SGreg Roach            })
17437646143SGreg Roach            ->sort(I18N::comparator());
17537646143SGreg Roach
17637646143SGreg Roach        $all_indi_facts = Collection::make(self::ALL_INDI_FACTS)
17737646143SGreg Roach            ->mapWithKeys(static function (string $tag): array {
17837646143SGreg Roach                return [$tag => Registry::elementFactory()->make('INDI:' . $tag)->label()];
17937646143SGreg Roach            })
18037646143SGreg Roach            ->sort(I18N::comparator());
18137646143SGreg Roach
18237646143SGreg Roach        $all_name_facts = Collection::make(self::ALL_NAME_FACTS)
18337646143SGreg Roach            ->mapWithKeys(static function (string $tag): array {
18437646143SGreg Roach                return [$tag => Registry::elementFactory()->make('INDI:NAME:' . $tag)->label()];
18537646143SGreg Roach            })
18637646143SGreg Roach            ->sort(I18N::comparator());
18737646143SGreg Roach
18837646143SGreg Roach        $all_plac_facts = Collection::make(self::ALL_PLAC_FACTS)
18937646143SGreg Roach            ->mapWithKeys(static function (string $tag): array {
19037646143SGreg Roach                return [$tag => Registry::elementFactory()->make('INDI:FACT:PLAC:' . $tag)->label()];
19137646143SGreg Roach            })
19237646143SGreg Roach            ->sort(I18N::comparator());
19337646143SGreg Roach
19437646143SGreg Roach        $all_repo_facts = Collection::make(self::ALL_REPO_FACTS)
19537646143SGreg Roach            ->mapWithKeys(static function (string $tag): array {
19669cdf014SGreg Roach                return [$tag => Registry::elementFactory()->make('REPO:' . $tag)->label()];
19737646143SGreg Roach            })
19837646143SGreg Roach            ->sort(I18N::comparator());
19937646143SGreg Roach
20037646143SGreg Roach        $all_sour_facts = Collection::make(self::ALL_SOUR_FACTS)
20137646143SGreg Roach            ->mapWithKeys(static function (string $tag): array {
20237646143SGreg Roach                return [$tag => Registry::elementFactory()->make('SOUR:' . $tag)->label()];
20337646143SGreg Roach            })
20437646143SGreg Roach            ->sort(I18N::comparator());
2056fd01894SGreg Roach
2066fd01894SGreg Roach        $all_surname_traditions = SurnameTradition::allDescriptions();
2076fd01894SGreg Roach
2086fd01894SGreg Roach        $tree_count = $this->tree_service->all()->count();
2096fd01894SGreg Roach
2106fd01894SGreg Roach        $title = I18N::translate('Preferences') . ' — ' . e($tree->title());
2116fd01894SGreg Roach
2126fd01894SGreg Roach        $base_url = app(ServerRequestInterface::class)->getAttribute('base_url');
2136fd01894SGreg Roach
2146fd01894SGreg Roach        return $this->viewResponse('admin/trees-preferences', [
2156fd01894SGreg Roach            'all_fam_facts'            => $all_fam_facts,
2166fd01894SGreg Roach            'all_indi_facts'           => $all_indi_facts,
2176fd01894SGreg Roach            'all_name_facts'           => $all_name_facts,
2186fd01894SGreg Roach            'all_plac_facts'           => $all_plac_facts,
2196fd01894SGreg Roach            'all_repo_facts'           => $all_repo_facts,
2206fd01894SGreg Roach            'all_sour_facts'           => $all_sour_facts,
2216fd01894SGreg Roach            'all_surname_traditions'   => $all_surname_traditions,
2226fd01894SGreg Roach            'base_url'                 => $base_url,
2236fd01894SGreg Roach            'calendar_formats'         => $calendar_formats,
2246fd01894SGreg Roach            'data_folder'              => $data_folder,
2256fd01894SGreg Roach            'formats'                  => $formats,
2266fd01894SGreg Roach            'french_calendar_end'      => $french_calendar_end,
2276fd01894SGreg Roach            'french_calendar_start'    => $french_calendar_start,
2286fd01894SGreg Roach            'gregorian_calendar_start' => $gregorian_calendar_start,
2296fd01894SGreg Roach            'members'                  => $members,
2306fd01894SGreg Roach            'page_layouts'             => $page_layouts,
2316fd01894SGreg Roach            'pedigree_individual'      => $pedigree_individual,
2326fd01894SGreg Roach            'privacy_options'          => $privacy_options,
2336fd01894SGreg Roach            'relatives_events'         => $relatives_events,
2346fd01894SGreg Roach            'source_types'             => $source_types,
2356fd01894SGreg Roach            'surname_list_styles'      => $surname_list_styles,
2366fd01894SGreg Roach            'theme_options'            => $theme_options,
2376fd01894SGreg Roach            'title'                    => $title,
2386fd01894SGreg Roach            'tree'                     => $tree,
2396fd01894SGreg Roach            'tree_count'               => $tree_count,
2406fd01894SGreg Roach        ]);
2416fd01894SGreg Roach    }
2426fd01894SGreg Roach}
243