xref: /webtrees/app/Http/RequestHandlers/CalendarPage.php (revision 7f85bc3751be8b3a965a91c738eb2b1a2554007e)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2021 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Http\RequestHandlers;
21
22use Fisharebest\Webtrees\Date;
23use Fisharebest\Webtrees\Http\ViewResponseTrait;
24use Fisharebest\Webtrees\I18N;
25use Fisharebest\Webtrees\Services\CalendarService;
26use Fisharebest\Webtrees\Services\LocalizationService;
27use Fisharebest\Webtrees\Tree;
28use Psr\Http\Message\ResponseInterface;
29use Psr\Http\Message\ServerRequestInterface;
30use Psr\Http\Server\RequestHandlerInterface;
31
32use function assert;
33
34/**
35 * Show anniversaries for events in a given day/month/year.
36 */
37class CalendarPage implements RequestHandlerInterface
38{
39    use ViewResponseTrait;
40
41    /** @var CalendarService */
42    private $calendar_service;
43
44    /** @var LocalizationService */
45    private $localization_service;
46
47    /**
48     * CalendarPage constructor.
49     *
50     * @param CalendarService     $calendar_service
51     * @param LocalizationService $localization_service
52     */
53    public function __construct(CalendarService $calendar_service, LocalizationService $localization_service)
54    {
55        $this->calendar_service     = $calendar_service;
56        $this->localization_service = $localization_service;
57    }
58
59    /**
60     * A form to request the page parameters.
61     *
62     * @param ServerRequestInterface $request
63     *
64     * @return ResponseInterface
65     */
66    public function handle(ServerRequestInterface $request): ResponseInterface
67    {
68        $tree = $request->getAttribute('tree');
69        assert($tree instanceof Tree);
70
71        $view     = $request->getAttribute('view');
72        $cal      = $request->getQueryParams()['cal'] ?? '';
73        $day      = $request->getQueryParams()['day'] ?? '';
74        $month    = $request->getQueryParams()['month'] ?? '';
75        $year     = $request->getQueryParams()['year'] ?? '';
76        $filterev = $request->getQueryParams()['filterev'] ?? 'BIRT-MARR-DEAT';
77        $filterof = $request->getQueryParams()['filterof'] ?? 'all';
78        $filtersx = $request->getQueryParams()['filtersx'] ?? '';
79
80        if ($cal . $day . $month . $year === '') {
81            // No date specified? Use the most likely calendar
82            $cal = $this->localization_service->calendar(I18N::locale())->gedcomCalendarEscape();
83        }
84
85        // need BC to parse date
86        if (str_starts_with($year, '-')) {
87            $year = substr($year, 1) . ' B.C.';
88        }
89        $ged_date = new Date("{$cal} {$day} {$month} {$year}");
90        // need negative year for year entry field.
91        $year     = $ged_date->minimumDate()->year;
92        $cal_date = $ged_date->minimumDate();
93
94        // Fill in any missing bits with todays date
95        $today = $cal_date->today();
96        if ($cal_date->day === 0) {
97            $cal_date->day = $today->day;
98        }
99        if ($cal_date->month === 0) {
100            $cal_date->month = $today->month;
101        }
102        if ($cal_date->year === 0) {
103            $cal_date->year = $today->year;
104        }
105
106        $cal_date->setJdFromYmd();
107
108        if ($year === 0) {
109            $year = $cal_date->year;
110        }
111
112        // Extract values from date
113        $days_in_month = $cal_date->daysInMonth();
114        $cal_month     = $cal_date->format('%O');
115        $today_month   = $today->format('%O');
116
117        // Invalid dates? Go to monthly view, where they'll be found.
118        if ($cal_date->day > $days_in_month && $view === 'day') {
119            $view = 'month';
120        }
121
122        $title = I18N::translate('Anniversary calendar');
123
124        switch ($view) {
125            case 'day':
126                $title = I18N::translate('On this day…') . ' ' . $ged_date->display(false);
127                break;
128            case 'month':
129                $title = I18N::translate('In this month…') . ' ' . $ged_date->display(false, '%F %Y');
130                break;
131            case 'year':
132                $title = I18N::translate('In this year…') . ' ' . $ged_date->display(false, '%Y');
133                break;
134        }
135
136        return $this->viewResponse('calendar-page', [
137            'cal'           => $cal,
138            'cal_date'      => $cal_date,
139            'cal_month'     => $cal_month,
140            'day'           => $day,
141            'days_in_month' => $days_in_month,
142            'filterev'      => $filterev,
143            'filterof'      => $filterof,
144            'filtersx'      => $filtersx,
145            'month'         => $month,
146            'months'        => $this->calendar_service->calendarMonthsInYear($cal, $year),
147            'title'         => $title,
148            'today'         => $today,
149            'today_month'   => $today_month,
150            'tree'          => $tree,
151            'view'          => $view,
152            'year'          => $year,
153        ]);
154    }
155}
156