Passed
Pull Request — main (#55)
by Thierry
05:38
created

Member   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 137
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 56
dl 0
loc 137
rs 10
c 1
b 0
f 0
wmc 14

8 Methods

Rating   Name   Duplication   Size   Complexity  
A togglePresence() 0 14 2
A page() 0 36 4
A _home() 0 10 1
A search() 0 5 1
A home() 0 7 1
A getSession() 0 8 3
A __construct() 0 3 1
A show() 0 7 1
1
<?php
2
3
namespace App\Ajax\Web\Meeting\Presence;
4
5
use App\Ajax\CallableClass;
6
use App\Ajax\Web\Meeting\Presence;
7
use Siak\Tontine\Model\Session as SessionModel;
8
use Siak\Tontine\Service\Meeting\PresenceService;
9
use Siak\Tontine\Service\Tontine\MemberService;
10
11
use function Jaxon\jq;
12
13
/**
14
 * @databag presence
15
 * @before getSession
16
 */
17
class Member extends CallableClass
18
{
19
    /**
20
     * @var bool
21
     */
22
    private $fromHome = false;
23
24
    /**
25
     * @var SessionModel|null
26
     */
27
    protected ?SessionModel $session = null;
28
29
    /**
30
     * @param MemberService $memberService
31
     * @param PresenceService $presenceService
32
     */
33
    public function __construct(private MemberService $memberService,
34
        private PresenceService $presenceService)
35
    {}
36
37
    protected function getSession()
38
    {
39
        if($this->target()->method() === 'home' ||
40
            ($sessionId = $this->bag('presence')->get('session.id')) === 0)
41
        {
42
            return;
43
        }
44
        $this->session = $this->presenceService->getSession($sessionId);
0 ignored issues
show
Bug introduced by
It seems like $sessionId can also be of type null; however, parameter $sessionId of Siak\Tontine\Service\Mee...ceService::getSession() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

44
        $this->session = $this->presenceService->getSession(/** @scrutinizer ignore-type */ $sessionId);
Loading history...
45
    }
46
47
    /**
48
     * @exclude
49
     */
50
    public function show(SessionModel $session)
51
    {
52
        $this->session = $session;
53
        $this->bag('presence')->set('session.id', $session->id);
54
        $this->bag('presence')->set('member.page', 1);
55
56
        return $this->_home();
57
    }
58
59
    public function home()
60
    {
61
        $this->fromHome = true;
62
        $this->bag('presence')->set('session.id', 0);
63
        $this->bag('presence')->set('member.page', 1);
64
65
        return $this->_home();
66
    }
67
68
    private function _home()
69
    {
70
        $html = $this->render('pages.meeting.presence.member.home', [
71
            'session' => $this->session, // Is null when showing presences by members.
72
        ]);
73
        $this->response->html('content-home-members', $html);
0 ignored issues
show
Bug introduced by
It seems like $html can also be of type null; however, parameter $sData of Jaxon\Response\Response::html() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

73
        $this->response->html('content-home-members', /** @scrutinizer ignore-type */ $html);
Loading history...
74
75
        $this->jq('#btn-presence-members-refresh')->click($this->rq()->page());
76
77
        return $this->page();
78
    }
79
80
    /**
81
     * @param int $pageNumber
82
     *
83
     * @return mixed
84
     */
85
    public function page(int $pageNumber = 0)
86
    {
87
        $search = trim($this->bag('presence')->get('member.search', ''));
88
        $memberCount = $this->presenceService->getMemberCount($search);
89
        [$pageNumber, $perPage] = $this->pageNumber($pageNumber, $memberCount,
90
            'presence', 'member.page');
91
        $members = $this->presenceService->getMembers($search, $pageNumber);
92
        $pagination = $this->rq()->page()->paginate($pageNumber, $perPage, $memberCount);
93
        $absences = !$this->session ? null :
94
            $this->presenceService->getSessionAbsences($this->session);
95
96
        $html = $this->render('pages.meeting.presence.member.page', [
97
            'session' => $this->session, // Is null when showing presences by members.
98
            'search' => $search,
99
            'members' => $members,
100
            'absences' => $absences,
101
            'pagination' => $pagination,
102
            'sessionCount' => $this->presenceService->getSessionCount(),
103
            'memberCount' => $memberCount,
104
        ]);
105
        $this->response->html('content-page-members', $html);
0 ignored issues
show
Bug introduced by
It seems like $html can also be of type null; however, parameter $sData of Jaxon\Response\Response::html() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

105
        $this->response->html('content-page-members', /** @scrutinizer ignore-type */ $html);
Loading history...
106
107
        $this->jq('#btn-presence-members-search')
108
            ->click($this->rq()->search(jq('#txt-presence-members-search')->val()));
109
        $memberId = jq()->parent()->attr('data-member-id')->toInt();
110
        $this->jq('.btn-toggle-member-presence')->click($this->rq()->togglePresence($memberId));
111
        $this->jq('.btn-show-member-presences')
112
            ->click($this->cl(Presence::class)->rq()->selectMember($memberId));
113
114
        if($this->fromHome && $members->count() > 0)
115
        {
116
            $member = $members->first();
117
            $this->cl(Session::class)->show($member);
118
        }
119
120
        return $this->response;
121
    }
122
123
    public function search(string $search)
124
    {
125
        $this->bag('presence')->set('member.search', trim($search));
126
127
        return $this->page();
128
    }
129
130
    // public function toggleFilter()
131
    // {
132
    //     $filter = $this->bag('presence')->get('member.filter', null);
133
    //     // Switch between null, true and false
134
    //     $filter = $filter === null ? true : ($filter === true ? false : null);
135
    //     $this->bag('presence')->set('member.filter', $filter);
136
137
    //     return $this->page();
138
    // }
139
140
    public function togglePresence(int $memberId)
141
    {
142
        $member = $this->memberService->getMember($memberId);
143
        if(!$member)
144
        {
145
            return $this->response;
146
        }
147
148
        $this->presenceService->togglePresence($this->session, $member);
0 ignored issues
show
Bug introduced by
It seems like $this->session can also be of type null; however, parameter $session of Siak\Tontine\Service\Mee...rvice::togglePresence() does only seem to accept Siak\Tontine\Model\Session, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

148
        $this->presenceService->togglePresence(/** @scrutinizer ignore-type */ $this->session, $member);
Loading history...
149
        // Refresh the session counters
150
        $this->session = $this->presenceService->getSession($this->session->id);
151
152
        $this->cl(Session::class)->page();
153
        return $this->page();
154
    }
155
}
156