Completed
Push — develop ( 6184bf...9623b5 )
by Mohamed
02:44
created

Project   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 168
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 90.7%

Importance

Changes 10
Bugs 2 Features 0
Metric Value
wmc 14
c 10
b 2
f 0
lcom 1
cbo 3
dl 0
loc 168
ccs 78
cts 86
cp 0.907
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A actions() 0 19 2
A fields() 0 52 2
B getKanbanColumnsField() 0 38 6
A getKanbanColumnField() 0 9 1
A rules() 0 9 1
A getRedirectUrl() 0 8 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 Tinyissue\Model\Project as ProjectModel;
15
use Tinyissue\Model\Tag as TagModel;
16
use Tinyissue\Model\Tag;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, Tinyissue\Form\Tag.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
17
18
/**
19
 * Project is a class to defines fields & rules for add/edit project form.
20
 *
21
 * @author Mohamed Alsharaf <[email protected]>
22
 */
23
class Project extends FormAbstract
24
{
25
    /**
26
     * @return array
27
     */
28 4
    public function actions()
29
    {
30 4
        if ($this->isEditing()) {
31
            return [
32 3
                'submit' => 'update',
33
                'delete' => [
34 3
                    'type'         => 'danger_submit',
35 3
                    'label'        => trans('tinyissue.delete_something', ['name' => $this->getModel()->name]),
36 3
                    'class'        => 'delete-project',
37 3
                    'name'         => 'delete-project',
38 3
                    'data-message' => trans('tinyissue.delete_project_confirm'),
39 3
                ],
40 3
            ];
41
        }
42
43
        return [
44 1
            'submit' => 'create_project',
45 1
        ];
46
    }
47
48
    /**
49
     * @return array
50
     */
51 4
    public function fields()
52
    {
53
        $fields = [
54
            'name' => [
55 4
                'type'  => 'text',
56 4
                'label' => 'name',
57 4
            ],
58
            'private' => [
59 4
                'type'    => 'select',
60 4
                'label'   => 'visibility',
61
                'options' => [
62 4
                    ProjectModel::INTERNAL_YES => trans('tinyissue.internal'),
63 4
                    ProjectModel::PRIVATE_YES  => trans('tinyissue.private'),
64 4
                    ProjectModel::PRIVATE_NO   => trans('tinyissue.public'),
65 4
                ],
66 4
            ],
67
            'default_assignee' => [
68 4
                'type' => 'hidden',
69 4
                'id'   => 'default_assignee-id',
70 4
            ],
71 4
        ];
72
73
        // On create project can assign users
74
        // On edit project can change status or default assignee
75 4
        if (!$this->isEditing()) {
76 1
            $fields['user'] = [
77 1
                'type'        => 'selectUser',
78 1
                'label'       => 'assign_users',
79 1
                'id'          => 'add-user-project',
80 1
                'placeholder' => trans('tinyissue.assign_a_user'),
81
            ];
82 1
        } else {
83 3
            $fields['status'] = [
84 3
                'type'    => 'select',
85 3
                'label'   => 'status',
86 3
                'options' => [ProjectModel::STATUS_OPEN => trans('tinyissue.open'), ProjectModel::STATUS_ARCHIVED => trans('tinyissue.archived')],
87
            ];
88 3
            $fields['default_assignee'] = [
89 3
                'type'    => 'select',
90 3
                'label'   => 'default_assignee',
91 3
                'options' => [0 => ''] + $this->getModel()->usersCanFixIssue()->get()->lists('fullname', 'id')->all(),
92
            ];
93
        }
94
95 4
        $fields['kanban_board'] = [
96 4
            'type' => 'legend',
97
        ];
98
99 4
        $fields += $this->getKanbanColumnsField();
100
101 4
        return $fields;
102
    }
103
104
    /**
105
     * Return Kanban columns field.
106
     *
107
     * @return array
108
     */
109 4
    protected function getKanbanColumnsField()
110
    {
111 4
        $fields = [];
112
113
        // All of the status tags
114 4
        $statusTags = (new Tag())->getStatusTags()->get();
0 ignored issues
show
Bug introduced by
The call to get() misses a required argument $key.

This check looks for function calls that miss required arguments.

Loading history...
115
116
        // Get selected status tags on editing a project
117 4
        $selectTags = [];
118 4
        if ($this->isEditing()) {
119 3
            $selectTags = $this->getModel()->kanbanTags()->get()->lists('id');
120 3
        }
121
122
        // An array for checkboxes
123 4
        $options = [];
124 4
        foreach ($selectTags as $tagId) {
125
            $tag = $statusTags->find($tagId);
126
            if ($tag) {
127
                $options[ucwords($tag->name)] = $this->getKanbanColumnField($tag, true);
128
            }
129 4
        }
130
131 4
        foreach ($statusTags as $tag) {
132 4
            if (!isset($options[ucwords($tag->name)])) {
133 4
                $options[ucwords($tag->name)] = $this->getKanbanColumnField($tag);
134 4
            }
135 4
        }
136
137
        // The checkbox button element
138 4
        $fields['columns[]'] = [
139 4
            'label'      => 'columns',
140 4
            'type'       => 'checkboxButton',
141 4
            'checkboxes' => $options,
142 4
            'grouped'    => true,
143
        ];
144
145 4
        return $fields;
146
    }
147
148
    /**
149
     * Returns an array structure for a checkbox button in the kanban field.
150
     *
151
     * @param Tag  $tag
152
     * @param bool $checked
153
     *
154
     * @return array
155
     */
156 4
    protected function getKanbanColumnField(Tag $tag, $checked = false)
157
    {
158
        return [
159 4
            'value'     => $tag->id,
160 4
            'data-tags' => $tag->id,
161 4
            'color'     => $tag->bgcolor,
162 4
            'checked'   => $checked,
163 4
        ];
164
    }
165
166
    /**
167
     * @return array
168
     */
169 4
    public function rules()
170
    {
171
        $rules = [
172 4
            'name' => 'required|max:250',
173 4
            'user' => 'array|min:1',
174 4
        ];
175
176 4
        return $rules;
177
    }
178
179
    /**
180
     * @return string
181
     */
182
    public function getRedirectUrl()
183
    {
184
        if ($this->isEditing()) {
185
            return $this->getModel()->to('edit');
186
        }
187
188
        return 'projects/new';
189
    }
190
}
191