Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 79
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialAllEvents
0.00% covered (danger)
0.00%
0 / 79
0.00% covered (danger)
0.00%
0 / 4
42
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 showFormAndEvents
0.00% covered (danger)
0.00%
0 / 65
0.00% covered (danger)
0.00%
0 / 1
12
 getGroupName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3declare( strict_types=1 );
4
5namespace MediaWiki\Extension\CampaignEvents\Special;
6
7use HTMLForm;
8use MediaWiki\Extension\CampaignEvents\Event\EventRegistration;
9use MediaWiki\Extension\CampaignEvents\Pager\EventsPagerFactory;
10use MediaWiki\SpecialPage\SpecialPage;
11
12class SpecialAllEvents extends SpecialPage {
13    public const PAGE_NAME = 'AllEvents';
14    private EventsPagerFactory $eventsPagerFactory;
15
16    /**
17     * @param EventsPagerFactory $eventsPagerFactory
18     */
19    public function __construct(
20        EventsPagerFactory $eventsPagerFactory
21    ) {
22        parent::__construct( self::PAGE_NAME );
23        $this->eventsPagerFactory = $eventsPagerFactory;
24    }
25
26    /**
27     * @inheritDoc
28     */
29    public function execute( $subPage ): void {
30        $this->setHeaders();
31        $this->addHelpLink( 'Extension:CampaignEvents' );
32        $this->getOutput()->addModuleStyles( [
33            'ext.campaignEvents.specialeventslist.styles',
34            'oojs-ui.styles.icons-location',
35            'oojs-ui.styles.icons-interactions',
36            'oojs-ui.styles.icons-user',
37            'oojs-ui.styles.icons-editing-advanced'
38        ] );
39        $this->getOutput()->addModules( [ 'ext.campaignEvents.specialeventslist' ] );
40        $this->showFormAndEvents();
41    }
42
43    private function showFormAndEvents(): void {
44        $request = $this->getRequest();
45        $searchedVal = $request->getVal( 'wpSearch', '' );
46        $meetingType = $request->getIntOrNull( 'wpMeetingType' );
47        $startDate = $request->getVal( 'wpStartDate', date( 'Y-m-d' ) );
48        $startTime = $startDate !== '' ? $startDate . ' 00:00:00' : $startDate;
49        $endDate = $request->getVal( 'wpEndDate', '' );
50        $endTime = $endDate !== '' ? $endDate . ' 23:59:59' : $endDate;
51
52        $pager = $this->eventsPagerFactory->newListPager(
53            $searchedVal,
54            $meetingType,
55            $startTime,
56            $endTime
57        );
58
59        $formDescriptor = [
60            'Search' => [
61                'type' => 'text',
62                'label-message' => 'campaignevents-allevents-label-search',
63                'default' => $searchedVal,
64                'cssclass' => 'ext-campaignevents-allevents-search-field'
65            ],
66            'MeetingType' => [
67                'type' => 'select',
68                'label-message' => 'campaignevents-allevents-label-meeting-type',
69                'options-messages' => [
70                    'campaignevents-eventslist-location-all-events' => null,
71                    'campaignevents-eventslist-location-online' => EventRegistration::MEETING_TYPE_ONLINE,
72                    'campaignevents-eventslist-location-in-person' => EventRegistration::MEETING_TYPE_IN_PERSON,
73                    'campaignevents-eventslist-location-online-and-in-person' =>
74                        EventRegistration::MEETING_TYPE_ONLINE_AND_IN_PERSON
75                ],
76                'default' => $meetingType,
77                'cssclass' => 'ext-campaignevents-allevents-meetingtype-field'
78            ],
79            'StartDate' => [
80                'type' => 'date',
81                'label-message' => 'campaignevents-allevents-label-start-date',
82                'icon' => 'calendar',
83                'cssclass' => 'ext-campaignevents-allevents-calendar-field',
84                'default' => $startDate,
85            ],
86            'EndDate' => [
87                'type' => 'date',
88                'label-message' => 'campaignevents-allevents-label-end-date',
89                'icon' => 'calendar',
90                'cssclass' => 'ext-campaignevents-allevents-calendar-field',
91                'default' => '',
92            ],
93            'Limit' => [
94                // NOTE: This has to be called 'limit' because the pager expects that name.
95                'name' => 'limit',
96                'type' => 'select',
97                'label-message' => 'campaignevents-allevents-label-events-per-page',
98                'default' => $pager->getLimit(),
99                'options' => $pager->getLimitSelectList(),
100                'cssclass' => 'ext-campaignevents-allevents-filter-field'
101            ],
102        ];
103        HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
104            ->setWrapperLegendMsg( 'campaignevents-allevents-filter-legend' )
105            ->setSubmitTextMsg( 'campaignevents-allevents-label-submit' )
106            ->setMethod( 'get' )
107            ->setId( 'ext-campaignevents-allevents-form' )
108            ->setSubmitCallback( fn () => true )
109            ->showAlways();
110        $navigation = $pager->getNavigationBar();
111        $this->getOutput()->addHTML( $navigation . $pager->getBody() . $navigation );
112    }
113
114    /**
115     * @inheritDoc
116     */
117    protected function getGroupName(): string {
118        return 'campaignevents';
119    }
120}