18c2e8227SGreg Roach<?php 28c2e8227SGreg Roach/** 38c2e8227SGreg Roach * webtrees: online genealogy 48fcd0d32SGreg Roach * Copyright (C) 2019 webtrees development team 58c2e8227SGreg Roach * This program is free software: you can redistribute it and/or modify 68c2e8227SGreg Roach * it under the terms of the GNU General Public License as published by 78c2e8227SGreg Roach * the Free Software Foundation, either version 3 of the License, or 88c2e8227SGreg Roach * (at your option) any later version. 98c2e8227SGreg Roach * This program is distributed in the hope that it will be useful, 108c2e8227SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 118c2e8227SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 128c2e8227SGreg Roach * GNU General Public License for more details. 138c2e8227SGreg Roach * You should have received a copy of the GNU General Public License 148c2e8227SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>. 158c2e8227SGreg Roach */ 16e7f56f2aSGreg Roachdeclare(strict_types=1); 17e7f56f2aSGreg Roach 1876692c8bSGreg Roachnamespace Fisharebest\Webtrees\Module; 1976692c8bSGreg Roach 200e62c4b8SGreg Roachuse Fisharebest\Webtrees\Auth; 21*4459dc9aSGreg Roachuse Fisharebest\Webtrees\Carbon; 228d0ebef0SGreg Roachuse Fisharebest\Webtrees\Gedcom; 2312664b30SGreg Roachuse Fisharebest\Webtrees\GedcomTag; 240e62c4b8SGreg Roachuse Fisharebest\Webtrees\I18N; 25f0a11419SGreg Roachuse Fisharebest\Webtrees\Services\CalendarService; 26e490cd80SGreg Roachuse Fisharebest\Webtrees\Tree; 27a45f9889SGreg Roachuse Symfony\Component\HttpFoundation\Request; 288c2e8227SGreg Roach 298c2e8227SGreg Roach/** 308c2e8227SGreg Roach * Class OnThisDayModule 318c2e8227SGreg Roach */ 3237eb8894SGreg Roachclass OnThisDayModule extends AbstractModule implements ModuleBlockInterface 33c1010edaSGreg Roach{ 3449a243cbSGreg Roach use ModuleBlockTrait; 3549a243cbSGreg Roach 3612664b30SGreg Roach // All standard GEDCOM 5.5.1 events except CENS, RESI and EVEN 3716d6367aSGreg Roach private const ALL_EVENTS = [ 3812664b30SGreg Roach 'ADOP', 3912664b30SGreg Roach 'ANUL', 4012664b30SGreg Roach 'BAPM', 4112664b30SGreg Roach 'BARM', 4212664b30SGreg Roach 'BASM', 4312664b30SGreg Roach 'BIRT', 4412664b30SGreg Roach 'BLES', 4512664b30SGreg Roach 'BURI', 4612664b30SGreg Roach 'CHR', 4712664b30SGreg Roach 'CHRA', 4812664b30SGreg Roach 'CONF', 4912664b30SGreg Roach 'CREM', 5012664b30SGreg Roach 'DEAT', 5112664b30SGreg Roach 'DIV', 5212664b30SGreg Roach 'DIVF', 5312664b30SGreg Roach 'EMIG', 5412664b30SGreg Roach 'ENGA', 5512664b30SGreg Roach 'FCOM', 5612664b30SGreg Roach 'GRAD', 5712664b30SGreg Roach 'IMMI', 5812664b30SGreg Roach 'MARB', 5912664b30SGreg Roach 'MARC', 6012664b30SGreg Roach 'MARL', 6112664b30SGreg Roach 'MARR', 6212664b30SGreg Roach 'MARS', 6312664b30SGreg Roach 'NATU', 6412664b30SGreg Roach 'ORDN', 6512664b30SGreg Roach 'PROB', 6612664b30SGreg Roach 'RETI', 6712664b30SGreg Roach 'WILL', 6812664b30SGreg Roach ]; 6912664b30SGreg Roach 7016d6367aSGreg Roach private const DEFAULT_EVENTS = [ 7112664b30SGreg Roach 'BIRT', 7212664b30SGreg Roach 'MARR', 7312664b30SGreg Roach 'DEAT', 7412664b30SGreg Roach ]; 7512664b30SGreg Roach 7612664b30SGreg Roach /** 7712664b30SGreg Roach * How should this module be labelled on tabs, menus, etc.? 7812664b30SGreg Roach * 7912664b30SGreg Roach * @return string 8012664b30SGreg Roach */ 8149a243cbSGreg Roach public function title(): string 82c1010edaSGreg Roach { 83bbb76c12SGreg Roach /* I18N: Name of a module */ 84bbb76c12SGreg Roach return I18N::translate('On this day'); 858c2e8227SGreg Roach } 868c2e8227SGreg Roach 8712664b30SGreg Roach /** 8812664b30SGreg Roach * A sentence describing what this module does. 8912664b30SGreg Roach * 9012664b30SGreg Roach * @return string 9112664b30SGreg Roach */ 9249a243cbSGreg Roach public function description(): string 93c1010edaSGreg Roach { 94bbb76c12SGreg Roach /* I18N: Description of the “On this day” module */ 95bbb76c12SGreg Roach return I18N::translate('A list of the anniversaries that occur today.'); 968c2e8227SGreg Roach } 978c2e8227SGreg Roach 9876692c8bSGreg Roach /** 9976692c8bSGreg Roach * Generate the HTML content of this block. 10076692c8bSGreg Roach * 101e490cd80SGreg Roach * @param Tree $tree 10276692c8bSGreg Roach * @param int $block_id 1035f2ae573SGreg Roach * @param string $ctype 104727f238cSGreg Roach * @param string[] $cfg 10576692c8bSGreg Roach * 10676692c8bSGreg Roach * @return string 10776692c8bSGreg Roach */ 1085f2ae573SGreg Roach public function getBlock(Tree $tree, int $block_id, string $ctype = '', array $cfg = []): string 109c1010edaSGreg Roach { 110f0a11419SGreg Roach $calendar_service = new CalendarService(); 111f0a11419SGreg Roach 11212664b30SGreg Roach $default_events = implode(',', self::DEFAULT_EVENTS); 11312664b30SGreg Roach 11412664b30SGreg Roach $filter = (bool) $this->getBlockSetting($block_id, 'filter', '1'); 115e2a378d3SGreg Roach $infoStyle = $this->getBlockSetting($block_id, 'infoStyle', 'table'); 116e2a378d3SGreg Roach $sortStyle = $this->getBlockSetting($block_id, 'sortStyle', 'alpha'); 11712664b30SGreg Roach $events = $this->getBlockSetting($block_id, 'events', $default_events); 1188c2e8227SGreg Roach 119c385536dSGreg Roach extract($cfg, EXTR_OVERWRITE); 1208c2e8227SGreg Roach 12112664b30SGreg Roach $event_array = explode(',', $events); 12212664b30SGreg Roach 12312664b30SGreg Roach // If we are only showing living individuals, then we don't need to search for DEAT events. 12412664b30SGreg Roach if ($filter) { 1258d0ebef0SGreg Roach $event_array = array_diff($event_array, Gedcom::DEATH_EVENTS); 12612664b30SGreg Roach } 12712664b30SGreg Roach 12812664b30SGreg Roach $events_filter = implode('|', $event_array); 12912664b30SGreg Roach 130*4459dc9aSGreg Roach $startjd = Carbon::now()->julianDay(); 131269fd10dSGreg Roach $endjd = $startjd; 13212664b30SGreg Roach 133f0a11419SGreg Roach $facts = $calendar_service->getEventsList($startjd, $endjd, $events_filter, $filter, $sortStyle, $tree); 13412664b30SGreg Roach 13512664b30SGreg Roach if (empty($facts)) { 136147e99aaSGreg Roach $content = view('modules/todays_events/empty'); 137147e99aaSGreg Roach } elseif ($infoStyle === 'list') { 138147e99aaSGreg Roach $content = view('modules/todays_events/list', [ 139147e99aaSGreg Roach 'facts' => $facts, 1400280f44aSGreg Roach ]); 141d8189b6aSDavid Drury } else { 142147e99aaSGreg Roach $content = view('modules/todays_events/table', [ 143d8189b6aSDavid Drury 'facts' => $facts, 1440280f44aSGreg Roach ]); 1450280f44aSGreg Roach } 1468c2e8227SGreg Roach 1476a8879feSGreg Roach if ($ctype !== '') { 148e490cd80SGreg Roach if ($ctype === 'gedcom' && Auth::isManager($tree)) { 149c1010edaSGreg Roach $config_url = route('tree-page-block-edit', [ 150c1010edaSGreg Roach 'block_id' => $block_id, 151aa6f03bbSGreg Roach 'ged' => $tree->name(), 152c1010edaSGreg Roach ]); 153397e599aSGreg Roach } elseif ($ctype === 'user' && Auth::check()) { 154c1010edaSGreg Roach $config_url = route('user-page-block-edit', [ 155c1010edaSGreg Roach 'block_id' => $block_id, 156aa6f03bbSGreg Roach 'ged' => $tree->name(), 157c1010edaSGreg Roach ]); 1589c6524dcSGreg Roach } else { 1599c6524dcSGreg Roach $config_url = ''; 1609c6524dcSGreg Roach } 1619c6524dcSGreg Roach 162147e99aaSGreg Roach return view('modules/block-template', [ 16326684e68SGreg Roach 'block' => str_replace('_', '-', $this->name()), 1649c6524dcSGreg Roach 'id' => $block_id, 1659c6524dcSGreg Roach 'config_url' => $config_url, 16649a243cbSGreg Roach 'title' => $this->title(), 1679c6524dcSGreg Roach 'content' => $content, 16812664b30SGreg Roach ]); 1698c2e8227SGreg Roach } 170b2ce94c6SRico Sonntag 171b2ce94c6SRico Sonntag return $content; 1728c2e8227SGreg Roach } 1738c2e8227SGreg Roach 1748c2e8227SGreg Roach /** {@inheritdoc} */ 175c1010edaSGreg Roach public function loadAjax(): bool 176c1010edaSGreg Roach { 1778c2e8227SGreg Roach return true; 1788c2e8227SGreg Roach } 1798c2e8227SGreg Roach 1808c2e8227SGreg Roach /** {@inheritdoc} */ 181c1010edaSGreg Roach public function isUserBlock(): bool 182c1010edaSGreg Roach { 1838c2e8227SGreg Roach return true; 1848c2e8227SGreg Roach } 1858c2e8227SGreg Roach 1868c2e8227SGreg Roach /** {@inheritdoc} */ 18763276d8fSGreg Roach public function isTreeBlock(): bool 188c1010edaSGreg Roach { 1898c2e8227SGreg Roach return true; 1908c2e8227SGreg Roach } 1918c2e8227SGreg Roach 19276692c8bSGreg Roach /** 193a45f9889SGreg Roach * Update the configuration for a block. 194a45f9889SGreg Roach * 195a45f9889SGreg Roach * @param Request $request 196a45f9889SGreg Roach * @param int $block_id 197a45f9889SGreg Roach * 198a45f9889SGreg Roach * @return void 199a45f9889SGreg Roach */ 200a45f9889SGreg Roach public function saveBlockConfiguration(Request $request, int $block_id) 201a45f9889SGreg Roach { 202a45f9889SGreg Roach $this->setBlockSetting($block_id, 'filter', $request->get('filter', '1')); 203a45f9889SGreg Roach $this->setBlockSetting($block_id, 'infoStyle', $request->get('infoStyle', 'table')); 204a45f9889SGreg Roach $this->setBlockSetting($block_id, 'sortStyle', $request->get('sortStyle', 'alpha')); 205a45f9889SGreg Roach $this->setBlockSetting($block_id, 'events', implode(',', (array) $request->get('events'))); 206a45f9889SGreg Roach } 207a45f9889SGreg Roach 208a45f9889SGreg Roach /** 20976692c8bSGreg Roach * An HTML form to edit block settings 21076692c8bSGreg Roach * 211e490cd80SGreg Roach * @param Tree $tree 21276692c8bSGreg Roach * @param int $block_id 213a9430be8SGreg Roach * 214a9430be8SGreg Roach * @return void 21576692c8bSGreg Roach */ 216a45f9889SGreg Roach public function editBlockConfiguration(Tree $tree, int $block_id) 217c1010edaSGreg Roach { 21812664b30SGreg Roach $default_events = implode(',', self::DEFAULT_EVENTS); 21912664b30SGreg Roach 220e2a378d3SGreg Roach $filter = $this->getBlockSetting($block_id, 'filter', '1'); 221e2a378d3SGreg Roach $infoStyle = $this->getBlockSetting($block_id, 'infoStyle', 'table'); 222e2a378d3SGreg Roach $sortStyle = $this->getBlockSetting($block_id, 'sortStyle', 'alpha'); 22312664b30SGreg Roach $events = $this->getBlockSetting($block_id, 'events', $default_events); 2248c2e8227SGreg Roach 22512664b30SGreg Roach $event_array = explode(',', $events); 22612664b30SGreg Roach 22712664b30SGreg Roach $all_events = []; 22812664b30SGreg Roach foreach (self::ALL_EVENTS as $event) { 22912664b30SGreg Roach $all_events[$event] = GedcomTag::getLabel($event); 23012664b30SGreg Roach } 23112664b30SGreg Roach 232c385536dSGreg Roach $info_styles = [ 233bbb76c12SGreg Roach /* I18N: An option in a list-box */ 234bbb76c12SGreg Roach 'list' => I18N::translate('list'), 235bbb76c12SGreg Roach /* I18N: An option in a list-box */ 236bbb76c12SGreg Roach 'table' => I18N::translate('table'), 237c385536dSGreg Roach ]; 2388c2e8227SGreg Roach 239c385536dSGreg Roach $sort_styles = [ 240bbb76c12SGreg Roach /* I18N: An option in a list-box */ 241bbb76c12SGreg Roach 'alpha' => I18N::translate('sort by name'), 242bbb76c12SGreg Roach /* I18N: An option in a list-box */ 243bbb76c12SGreg Roach 'anniv' => I18N::translate('sort by date'), 244c385536dSGreg Roach ]; 245d8189b6aSDavid Drury 246147e99aaSGreg Roach echo view('modules/todays_events/config', [ 247c385536dSGreg Roach 'all_events' => $all_events, 248c385536dSGreg Roach 'event_array' => $event_array, 249c385536dSGreg Roach 'filter' => $filter, 250c385536dSGreg Roach 'infoStyle' => $infoStyle, 251c385536dSGreg Roach 'info_styles' => $info_styles, 252c385536dSGreg Roach 'sortStyle' => $sortStyle, 253c385536dSGreg Roach 'sort_styles' => $sort_styles, 254c385536dSGreg Roach ]); 2558c2e8227SGreg Roach } 2568c2e8227SGreg Roach} 257