Completed
Push — master ( 195b94...7a36f1 )
by Mohamed
04:50
created

UserMessagesSettings   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 3
Bugs 2 Features 2
Metric Value
wmc 9
lcom 1
cbo 6
dl 0
loc 118
rs 10
c 3
b 2
f 2

6 Methods

Rating   Name   Duplication   Size   Complexity  
A setProjects() 0 6 1
A actions() 0 6 1
B fields() 0 25 1
A getMessages() 0 8 2
A getDefaultMessage() 0 9 2
A getSelectedMessage() 0 13 2
1
<?php
2
3
/*
4
 * This file is part of the Tinyissue package.
5
 *
6
 * (c) Mohamed Alsharaf <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Tinyissue\Form;
13
14
use Illuminate\Support\Collection;
15
use Tinyissue\Model\Message;
16
use Tinyissue\Model\Project as ProjectModel;
17
18
/**
19
 * UserMessagesSettings is a class to defines fields & rules for edit user message settings form.
20
 *
21
 * @author Mohamed Alsharaf <[email protected]>
22
 */
23
class UserMessagesSettings extends FormAbstract
24
{
25
    /**
26
     * @var Collection
27
     */
28
    protected $projects;
29
30
    /**
31
     * @var Collection
32
     */
33
    protected $messages;
34
35
    /**
36
     * @var Message
37
     */
38
    protected $defaultMessage;
39
40
    /**
41
     * @param Collection $projects
42
     *
43
     * @return $this
44
     */
45
    public function setProjects(Collection $projects)
46
    {
47
        $this->projects = $projects;
48
49
        return $this;
50
    }
51
52
    /**
53
     * @return array
54
     */
55
    public function actions()
56
    {
57
        return [
58
            'submit' => 'update',
59
        ];
60
    }
61
62
    /**
63
     * @return array
64
     */
65
    public function fields()
66
    {
67
        $fields = [];
68
69
        // Change label widths
70
        \Former::setOption('TwitterBootstrap3.labelWidths', ['large' => 4, 'small' => 4]);
71
72
        /** @var Collection $messages Available message options */
73
        $messages = $this->getMessages()->lists('name', 'id');
74
75
        // Create field for each project
76
        $this->projects->each(function (ProjectModel $project) use (&$fields, $messages) {
77
            $messageId = $this->getSelectedMessage($project);
78
79
            $fields['projects[' . $project->id . ']'] = [
80
                'type'    => 'select',
81
                'label'   => $project->name,
82
                'options' => $messages,
83
                'value'   => $messageId,
84
                'help'    => trans('tinyissue.messages_' . strtolower($messages->get($messageId) . '_help')),
85
            ];
86
        });
87
88
        return $fields;
89
    }
90
91
    /**
92
     * Returns collection of all messages options.
93
     *
94
     * @return Collection
95
     */
96
    protected function getMessages()
97
    {
98
        if (null === $this->messages) {
99
            $this->messages = Message::orderBy('id');
100
        }
101
102
        return $this->messages;
103
    }
104
105
    /**
106
     * Return default message for the current logged user based on the role.
107
     *
108
     * @return Message
109
     */
110
    protected function getDefaultMessage()
111
    {
112
        if (null === $this->defaultMessage) {
113
            $name                 = Message::$defaultMessageToRole[$this->getLoggedUser()->role->role];
114
            $this->defaultMessage = $this->getMessages()->where('name', $name)->first();
115
        }
116
117
        return $this->defaultMessage;
118
    }
119
120
    /**
121
     * Return value of selected message for a project.
122
     *
123
     * @param ProjectModel $project
124
     *
125
     * @return int
126
     */
127
    protected function getSelectedMessage(ProjectModel $project)
128
    {
129
        $selected = $project->projectUsers()
130
            ->where('user_id', '=', $this->getLoggedUser()->id)
131
            ->first()
132
            ->message_id;
133
134
        if ($selected <= 0) {
135
            $selected = $this->getDefaultMessage()->id;
136
        }
137
138
        return $selected;
139
    }
140
}
141