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