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