Completed
Push — master ( 91f8d9...64265e )
by Mohamed
09:45 queued 06:57
created

Project::getKanbanColumnsField()   C

Complexity

Conditions 7
Paths 18

Size

Total Lines 40
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 7.1429

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 0
loc 40
ccs 18
cts 21
cp 0.8571
rs 6.7272
cc 7
eloc 21
nc 18
nop 0
crap 7.1429
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 3
    public function actions()
29
    {
30 3
        if ($this->isEditing()) {
31
            return [
32 2
                'submit' => 'update',
33
                'delete' => [
34 2
                    'type'         => 'danger_submit',
35 2
                    'label'        => trans('tinyissue.delete_something', ['name' => $this->getModel()->name]),
36 2
                    'class'        => 'delete-project',
37 2
                    'name'         => 'delete-project',
38 2
                    'data-message' => trans('tinyissue.delete_project_confirm'),
39
                ],
40
            ];
41
        }
42
43
        return [
44 1
            'submit' => 'create_project',
45
        ];
46
    }
47
48
    /**
49
     * @return array
50
     */
51 3
    public function fields()
52
    {
53
        $fields = [
54
            'name' => [
55
                'type'  => 'text',
56
                'label' => 'name',
57 3
            ],
58
            'private' => [
59 3
                'type'    => 'select',
60 3
                'label'   => 'visibility',
61 3
                'options' => [ProjectModel::PRIVATE_YES => trans('tinyissue.private'), ProjectModel::PRIVATE_NO => trans('tinyissue.public')],
62
            ],
63
            'default_assignee' => [
64
                'type' => 'hidden',
65
                'id'   => 'default_assignee-id',
66
            ],
67
        ];
68
69
        // On create project can assign users
70
        // On edit project can change status or default assignee
71 3
        if (!$this->isEditing()) {
72 1
            $fields['user'] = [
73 1
                'type'        => 'selectUser',
74 1
                'label'       => 'assign_users',
75 1
                'id'          => 'add-user-project',
76 1
                'placeholder' => trans('tinyissue.assign_a_user'),
77
            ];
78
        } else {
79 2
            $fields['status'] = [
80 2
                'type'    => 'select',
81 2
                'label'   => 'status',
82 2
                'options' => [ProjectModel::STATUS_OPEN => trans('tinyissue.open'), ProjectModel::STATUS_ARCHIVED => trans('tinyissue.archived')],
83
            ];
84 2
            $fields['default_assignee'] = [
85 2
                'type'    => 'select',
86 2
                'label'   => 'default_assignee',
87 2
                'options' => [0 => ''] + $this->getModel()->usersCanFixIssue()->get()->lists('fullname', 'id')->all(),
88
            ];
89
        }
90
91 3
        $fields['kanban_board'] = [
92
            'type' => 'legend',
93
        ];
94
95 3
        $fields += $this->getKanbanColumnsField();
96
97 3
        return $fields;
98
    }
99
100
    /**
101
     * Return Kanban columns field.
102
     *
103
     * @return array
104
     */
105 3
    protected function getKanbanColumnsField()
106
    {
107 3
        $fields = [];
108
109
        // All of the status tags
110 3
        $statusTags = (new Tag())->getStatusTags()->get()->filter(function (TagModel $tag) {
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...
111 3
            return !($tag->name == TagModel::STATUS_OPEN || $tag->name == TagModel::STATUS_CLOSED);
112 3
        });
113
114
        // Get selected status tags on editing a project
115 3
        $selectTags = [];
116 3
        if ($this->isEditing()) {
117 2
            $selectTags = $this->getModel()->kanbanTags()->get()->lists('id');
118
        }
119
120
        // An array for checkboxes
121 3
        $options = [];
122 3
        foreach ($selectTags as $tagId) {
123
            $tag = $statusTags->find($tagId);
124
            if ($tag) {
125
                $options[ucwords($tag->name)] = $this->getKanbanColumnField($tag, true);
126
            }
127
        }
128
129 3
        foreach ($statusTags as $tag) {
130 3
            if (!isset($options[ucwords($tag->name)])) {
131 3
                $options[ucwords($tag->name)] = $this->getKanbanColumnField($tag);
132
            }
133
        }
134
135
        // The checkbox button element
136 3
        $fields['columns[]'] = [
137 3
            'label'      => 'columns',
138 3
            'type'       => 'checkboxButton',
139 3
            'checkboxes' => $options,
140
            'grouped'    => true,
141
        ];
142
143 3
        return $fields;
144
    }
145
146
    /**
147
     * Returns an array structure for a checkbox button in the kanban field.
148
     *
149
     * @param Tag  $tag
150
     * @param bool $checked
151
     *
152
     * @return array
153
     */
154 3
    protected function getKanbanColumnField(Tag $tag, $checked = false)
155
    {
156
        return [
157 3
            'value'     => $tag->id,
158 3
            'data-tags' => $tag->id,
159 3
            'color'     => $tag->bgcolor,
160 3
            'checked'   => $checked,
161
        ];
162
    }
163
164
    /**
165
     * @return array
166
     */
167 3
    public function rules()
168
    {
169
        $rules = [
170 3
            'name' => 'required|max:250',
171
            'user' => 'array|min:1',
172
        ];
173
174 3
        return $rules;
175
    }
176
177
    /**
178
     * @return string
179
     */
180
    public function getRedirectUrl()
181
    {
182
        if ($this->isEditing()) {
183
            return $this->getModel()->to('edit');
184
        }
185
186
        return 'projects/new';
187
    }
188
}
189