xref: /webtrees/app/Module/OnThisDayModule.php (revision 5f2ae57322ecd2d23660294256ca8376fd889348)
18c2e8227SGreg Roach<?php
28c2e8227SGreg Roach/**
38c2e8227SGreg Roach * webtrees: online genealogy
41062a142SGreg Roach * Copyright (C) 2018 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;
218d0ebef0SGreg Roachuse Fisharebest\Webtrees\Gedcom;
2212664b30SGreg Roachuse Fisharebest\Webtrees\GedcomTag;
230e62c4b8SGreg Roachuse Fisharebest\Webtrees\I18N;
24f0a11419SGreg Roachuse Fisharebest\Webtrees\Services\CalendarService;
25e490cd80SGreg Roachuse Fisharebest\Webtrees\Tree;
26a45f9889SGreg Roachuse Symfony\Component\HttpFoundation\Request;
278c2e8227SGreg Roach
288c2e8227SGreg Roach/**
298c2e8227SGreg Roach * Class OnThisDayModule
308c2e8227SGreg Roach */
31c1010edaSGreg Roachclass OnThisDayModule extends AbstractModule implements ModuleBlockInterface
32c1010edaSGreg Roach{
3312664b30SGreg Roach    // All standard GEDCOM 5.5.1 events except CENS, RESI and EVEN
3412664b30SGreg Roach    const ALL_EVENTS = [
3512664b30SGreg Roach        'ADOP',
3612664b30SGreg Roach        'ANUL',
3712664b30SGreg Roach        'BAPM',
3812664b30SGreg Roach        'BARM',
3912664b30SGreg Roach        'BASM',
4012664b30SGreg Roach        'BIRT',
4112664b30SGreg Roach        'BLES',
4212664b30SGreg Roach        'BURI',
4312664b30SGreg Roach        'CHR',
4412664b30SGreg Roach        'CHRA',
4512664b30SGreg Roach        'CONF',
4612664b30SGreg Roach        'CREM',
4712664b30SGreg Roach        'DEAT',
4812664b30SGreg Roach        'DIV',
4912664b30SGreg Roach        'DIVF',
5012664b30SGreg Roach        'EMIG',
5112664b30SGreg Roach        'ENGA',
5212664b30SGreg Roach        'FCOM',
5312664b30SGreg Roach        'GRAD',
5412664b30SGreg Roach        'IMMI',
5512664b30SGreg Roach        'MARB',
5612664b30SGreg Roach        'MARC',
5712664b30SGreg Roach        'MARL',
5812664b30SGreg Roach        'MARR',
5912664b30SGreg Roach        'MARS',
6012664b30SGreg Roach        'NATU',
6112664b30SGreg Roach        'ORDN',
6212664b30SGreg Roach        'PROB',
6312664b30SGreg Roach        'RETI',
6412664b30SGreg Roach        'WILL',
6512664b30SGreg Roach    ];
6612664b30SGreg Roach
6712664b30SGreg Roach    const DEFAULT_EVENTS = [
6812664b30SGreg Roach        'BIRT',
6912664b30SGreg Roach        'MARR',
7012664b30SGreg Roach        'DEAT',
7112664b30SGreg Roach    ];
7212664b30SGreg Roach
7312664b30SGreg Roach    /**
7412664b30SGreg Roach     * How should this module be labelled on tabs, menus, etc.?
7512664b30SGreg Roach     *
7612664b30SGreg Roach     * @return string
7712664b30SGreg Roach     */
788f53f488SRico Sonntag    public function getTitle(): string
79c1010edaSGreg Roach    {
80bbb76c12SGreg Roach        /* I18N: Name of a module */
81bbb76c12SGreg Roach        return I18N::translate('On this day');
828c2e8227SGreg Roach    }
838c2e8227SGreg Roach
8412664b30SGreg Roach    /**
8512664b30SGreg Roach     * A sentence describing what this module does.
8612664b30SGreg Roach     *
8712664b30SGreg Roach     * @return string
8812664b30SGreg Roach     */
898f53f488SRico Sonntag    public function getDescription(): string
90c1010edaSGreg Roach    {
91bbb76c12SGreg Roach        /* I18N: Description of the “On this day” module */
92bbb76c12SGreg Roach        return I18N::translate('A list of the anniversaries that occur today.');
938c2e8227SGreg Roach    }
948c2e8227SGreg Roach
9576692c8bSGreg Roach    /**
9676692c8bSGreg Roach     * Generate the HTML content of this block.
9776692c8bSGreg Roach     *
98e490cd80SGreg Roach     * @param Tree     $tree
9976692c8bSGreg Roach     * @param int      $block_id
100*5f2ae573SGreg Roach     * @param string   $ctype
101727f238cSGreg Roach     * @param string[] $cfg
10276692c8bSGreg Roach     *
10376692c8bSGreg Roach     * @return string
10476692c8bSGreg Roach     */
105*5f2ae573SGreg Roach    public function getBlock(Tree $tree, int $block_id, string $ctype = '', array $cfg = []): string
106c1010edaSGreg Roach    {
107f0a11419SGreg Roach        $calendar_service = new CalendarService();
108f0a11419SGreg Roach
10912664b30SGreg Roach        $default_events = implode(',', self::DEFAULT_EVENTS);
11012664b30SGreg Roach
11112664b30SGreg Roach        $filter    = (bool) $this->getBlockSetting($block_id, 'filter', '1');
112e2a378d3SGreg Roach        $infoStyle = $this->getBlockSetting($block_id, 'infoStyle', 'table');
113e2a378d3SGreg Roach        $sortStyle = $this->getBlockSetting($block_id, 'sortStyle', 'alpha');
11412664b30SGreg Roach        $events    = $this->getBlockSetting($block_id, 'events', $default_events);
1158c2e8227SGreg Roach
116c385536dSGreg Roach        extract($cfg, EXTR_OVERWRITE);
1178c2e8227SGreg Roach
11812664b30SGreg Roach        $event_array = explode(',', $events);
11912664b30SGreg Roach
12012664b30SGreg Roach        // If we are only showing living individuals, then we don't need to search for DEAT events.
12112664b30SGreg Roach        if ($filter) {
1228d0ebef0SGreg Roach            $event_array  = array_diff($event_array, Gedcom::DEATH_EVENTS);
12312664b30SGreg Roach        }
12412664b30SGreg Roach
12512664b30SGreg Roach        $events_filter = implode('|', $event_array);
12612664b30SGreg Roach
12712664b30SGreg Roach        $startjd = WT_CLIENT_JD;
12812664b30SGreg Roach        $endjd   = WT_CLIENT_JD;
12912664b30SGreg Roach
130f0a11419SGreg Roach        $facts = $calendar_service->getEventsList($startjd, $endjd, $events_filter, $filter, $sortStyle, $tree);
13112664b30SGreg Roach
13212664b30SGreg Roach        if (empty($facts)) {
133147e99aaSGreg Roach            $content = view('modules/todays_events/empty');
134147e99aaSGreg Roach        } elseif ($infoStyle === 'list') {
135147e99aaSGreg Roach            $content = view('modules/todays_events/list', [
136147e99aaSGreg Roach                'facts' => $facts,
1370280f44aSGreg Roach            ]);
138d8189b6aSDavid Drury        } else {
139147e99aaSGreg Roach            $content = view('modules/todays_events/table', [
140d8189b6aSDavid Drury                'facts' => $facts,
1410280f44aSGreg Roach            ]);
1420280f44aSGreg Roach        }
1438c2e8227SGreg Roach
144*5f2ae573SGreg Roach        if ($ctype) {
145e490cd80SGreg Roach            if ($ctype === 'gedcom' && Auth::isManager($tree)) {
146c1010edaSGreg Roach                $config_url = route('tree-page-block-edit', [
147c1010edaSGreg Roach                    'block_id' => $block_id,
148aa6f03bbSGreg Roach                    'ged'      => $tree->name(),
149c1010edaSGreg Roach                ]);
150397e599aSGreg Roach            } elseif ($ctype === 'user' && Auth::check()) {
151c1010edaSGreg Roach                $config_url = route('user-page-block-edit', [
152c1010edaSGreg Roach                    'block_id' => $block_id,
153aa6f03bbSGreg Roach                    'ged'      => $tree->name(),
154c1010edaSGreg Roach                ]);
1559c6524dcSGreg Roach            } else {
1569c6524dcSGreg Roach                $config_url = '';
1579c6524dcSGreg Roach            }
1589c6524dcSGreg Roach
159147e99aaSGreg Roach            return view('modules/block-template', [
1609c6524dcSGreg Roach                'block'      => str_replace('_', '-', $this->getName()),
1619c6524dcSGreg Roach                'id'         => $block_id,
1629c6524dcSGreg Roach                'config_url' => $config_url,
1639c6524dcSGreg Roach                'title'      => $this->getTitle(),
1649c6524dcSGreg Roach                'content'    => $content,
16512664b30SGreg Roach            ]);
1668c2e8227SGreg Roach        }
167b2ce94c6SRico Sonntag
168b2ce94c6SRico Sonntag        return $content;
1698c2e8227SGreg Roach    }
1708c2e8227SGreg Roach
1718c2e8227SGreg Roach    /** {@inheritdoc} */
172c1010edaSGreg Roach    public function loadAjax(): bool
173c1010edaSGreg Roach    {
1748c2e8227SGreg Roach        return true;
1758c2e8227SGreg Roach    }
1768c2e8227SGreg Roach
1778c2e8227SGreg Roach    /** {@inheritdoc} */
178c1010edaSGreg Roach    public function isUserBlock(): bool
179c1010edaSGreg Roach    {
1808c2e8227SGreg Roach        return true;
1818c2e8227SGreg Roach    }
1828c2e8227SGreg Roach
1838c2e8227SGreg Roach    /** {@inheritdoc} */
184c1010edaSGreg Roach    public function isGedcomBlock(): bool
185c1010edaSGreg Roach    {
1868c2e8227SGreg Roach        return true;
1878c2e8227SGreg Roach    }
1888c2e8227SGreg Roach
18976692c8bSGreg Roach    /**
190a45f9889SGreg Roach     * Update the configuration for a block.
191a45f9889SGreg Roach     *
192a45f9889SGreg Roach     * @param Request $request
193a45f9889SGreg Roach     * @param int     $block_id
194a45f9889SGreg Roach     *
195a45f9889SGreg Roach     * @return void
196a45f9889SGreg Roach     */
197a45f9889SGreg Roach    public function saveBlockConfiguration(Request $request, int $block_id)
198a45f9889SGreg Roach    {
199a45f9889SGreg Roach        $this->setBlockSetting($block_id, 'filter', $request->get('filter', '1'));
200a45f9889SGreg Roach        $this->setBlockSetting($block_id, 'infoStyle', $request->get('infoStyle', 'table'));
201a45f9889SGreg Roach        $this->setBlockSetting($block_id, 'sortStyle', $request->get('sortStyle', 'alpha'));
202a45f9889SGreg Roach        $this->setBlockSetting($block_id, 'events', implode(',', (array) $request->get('events')));
203a45f9889SGreg Roach    }
204a45f9889SGreg Roach
205a45f9889SGreg Roach    /**
20676692c8bSGreg Roach     * An HTML form to edit block settings
20776692c8bSGreg Roach     *
208e490cd80SGreg Roach     * @param Tree $tree
20976692c8bSGreg Roach     * @param int  $block_id
210a9430be8SGreg Roach     *
211a9430be8SGreg Roach     * @return void
21276692c8bSGreg Roach     */
213a45f9889SGreg Roach    public function editBlockConfiguration(Tree $tree, int $block_id)
214c1010edaSGreg Roach    {
21512664b30SGreg Roach        $default_events = implode(',', self::DEFAULT_EVENTS);
21612664b30SGreg Roach
217e2a378d3SGreg Roach        $filter    = $this->getBlockSetting($block_id, 'filter', '1');
218e2a378d3SGreg Roach        $infoStyle = $this->getBlockSetting($block_id, 'infoStyle', 'table');
219e2a378d3SGreg Roach        $sortStyle = $this->getBlockSetting($block_id, 'sortStyle', 'alpha');
22012664b30SGreg Roach        $events    = $this->getBlockSetting($block_id, 'events', $default_events);
2218c2e8227SGreg Roach
22212664b30SGreg Roach        $event_array = explode(',', $events);
22312664b30SGreg Roach
22412664b30SGreg Roach        $all_events = [];
22512664b30SGreg Roach        foreach (self::ALL_EVENTS as $event) {
22612664b30SGreg Roach            $all_events[$event] = GedcomTag::getLabel($event);
22712664b30SGreg Roach        }
22812664b30SGreg Roach
229c385536dSGreg Roach        $info_styles = [
230bbb76c12SGreg Roach            /* I18N: An option in a list-box */
231bbb76c12SGreg Roach            'list'  => I18N::translate('list'),
232bbb76c12SGreg Roach            /* I18N: An option in a list-box */
233bbb76c12SGreg Roach            'table' => I18N::translate('table'),
234c385536dSGreg Roach        ];
2358c2e8227SGreg Roach
236c385536dSGreg Roach        $sort_styles = [
237bbb76c12SGreg Roach            /* I18N: An option in a list-box */
238bbb76c12SGreg Roach            'alpha' => I18N::translate('sort by name'),
239bbb76c12SGreg Roach            /* I18N: An option in a list-box */
240bbb76c12SGreg Roach            'anniv' => I18N::translate('sort by date'),
241c385536dSGreg Roach        ];
242d8189b6aSDavid Drury
243147e99aaSGreg Roach        echo view('modules/todays_events/config', [
244c385536dSGreg Roach            'all_events'  => $all_events,
245c385536dSGreg Roach            'event_array' => $event_array,
246c385536dSGreg Roach            'filter'      => $filter,
247c385536dSGreg Roach            'infoStyle'   => $infoStyle,
248c385536dSGreg Roach            'info_styles' => $info_styles,
249c385536dSGreg Roach            'sortStyle'   => $sortStyle,
250c385536dSGreg Roach            'sort_styles' => $sort_styles,
251c385536dSGreg Roach        ]);
2528c2e8227SGreg Roach    }
2538c2e8227SGreg Roach}
254