Passed
Push — master ( 5da13c...489a75 )
by Andreas
23:20
created

midgard_admin_asgard_handler_welcome   A

Complexity

Total Complexity 32

Size/Duplication

Total Lines 216
Duplicated Lines 0 %

Test Coverage

Coverage 69.17%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 118
dl 0
loc 216
ccs 83
cts 120
cp 0.6917
rs 9.84
c 1
b 0
f 0
wmc 32

7 Methods

Rating   Name   Duplication   Size   Complexity  
B _list_revised() 0 47 9
A _mass_delete() 0 11 4
A _populate_toolbar() 0 41 2
A _mass_approve() 0 13 5
A _handler_welcome() 0 41 5
A _show_welcome() 0 4 2
A _prepare_tabledata() 0 30 5
1
<?php
2
/**
3
 * @package midgard.admin.asgard
4
 * @author The Midgard Project, http://www.midgard-project.org
5
 * @copyright The Midgard Project, http://www.midgard-project.org
6
 * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
7
 */
8
9
use midcom\grid\provider;
10
use Symfony\Component\HttpFoundation\Request;
11
12
/**
13
 * Welcome interface
14
 *
15
 * @package midgard.admin.asgard
16
 */
17
class midgard_admin_asgard_handler_welcome extends midcom_baseclasses_components_handler
18
{
19
    use midgard_admin_asgard_handler;
20
21 1
    private function _list_revised($since, $type = null, $only_mine = false) : array
22
    {
23 1
        $classes = [];
24 1
        $revised = [];
25
26
        // List installed MgdSchema types and convert to DBA classes
27 1
        foreach ($this->_request_data['schema_types'] as $schema_type) {
28 1
            if (   $type !== null
29 1
                && $schema_type != $type) {
30
                // Skip
31
                continue;
32
            }
33
34 1
            $mgdschema_class = midcom_helper_reflector::class_rewrite($schema_type);
35 1
            $dummy_object = new $mgdschema_class();
36 1
            $midcom_dba_classname = midcom::get()->dbclassloader->get_midcom_class_name_for_mgdschema_object($dummy_object);
37 1
            if (empty($midcom_dba_classname)) {
38 1
                continue;
39
            }
40
41 1
            $classes[] = $midcom_dba_classname;
42
        }
43
44
        // List all revised objects
45 1
        foreach ($classes as $class) {
46 1
            $qb_callback = [$class, 'new_query_builder'];
47 1
            $qb = call_user_func($qb_callback);
48 1
            $qb->add_constraint('metadata.revised', '>=', $since);
49
50 1
            if (   $only_mine
51 1
                && midcom::get()->auth->user) {
52
                $qb->add_constraint('metadata.authors', 'LIKE', '|' . midcom::get()->auth->user->guid . '|');
53
            }
54
55 1
            $qb->add_order('metadata.revision', 'DESC');
56
57 1
            foreach ($qb->execute() as $object) {
58 1
                $revised["{$object->metadata->revised}_{$object->guid}_{$object->metadata->revision}"] = [
59 1
                    'object' => $object,
60 1
                    'revisor' => midcom::get()->auth->get_user($object->metadata->revisor)
61
                ];
62
            }
63
        }
64
65 1
        krsort($revised);
66
67 1
        return $revised;
68
    }
69
70
    /**
71
     * Object editing view
72
     */
73 1
    public function _handler_welcome(Request $request, array &$data)
74
    {
75 1
        $data['schema_types'] = array_diff(midcom_connection::get_schema_types(), $this->_config->get('skip_in_filter'));
0 ignored issues
show
Bug introduced by
It seems like $this->_config->get('skip_in_filter') can also be of type false; however, parameter $array2 of array_diff() does only seem to accept array, 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

75
        $data['schema_types'] = array_diff(midcom_connection::get_schema_types(), /** @scrutinizer ignore-type */ $this->_config->get('skip_in_filter'));
Loading history...
76
77 1
        $data['view_title'] = $this->_l10n->get('asgard');
78
79 1
        if ($request->request->has('action') && $request->request->has('entries')) {
80
            $method_name = '_mass_' . $request->request->get('action');
81
            $this->$method_name($request->request->get('entries'));
82
        }
83
84 1
        if ($request->query->has('revised_after')) {
85
            $data['revised_after'] = date('Y-m-d', $request->query->get('revised_after'));
86
87
            $data['type_filter'] = null;
88
            if ($request->query->get('type_filter', 'any') != 'any') {
89
                $data['type_filter'] = $request->query->get('type_filter');
90
            }
91
92
            $data['only_mine'] = $request->query->getBoolean('only_mine');
93
94
            $objects = $this->_list_revised($data['revised_after'], $data['type_filter'], $data['only_mine']);
95
        } else {
96 1
            $data['revised_after'] = date('Y-m-d', strtotime('yesterday'));
97 1
            $objects = $this->_list_revised($data['revised_after']);
98
        }
99
100 1
        $this->_prepare_tabledata($objects);
101
102 1
        $data['action_options'] = [
103 1
            'none' => ['label' => $this->_l10n->get('apply to selected')],
104
            'delete' => [
105 1
                'label' => $this->_l10n_midcom->get('delete'),
106
            ],
107
            'approve' => [
108 1
                'label' => $this->_l10n_midcom->get('approve'),
109
            ]
110
        ];
111
112 1
        $this->_populate_toolbar();
113 1
        return $this->get_response();
114
    }
115
116 1
    private function _prepare_tabledata(array $objects)
117
    {
118 1
        $rows = [];
119 1
        foreach ($objects as $data) {
120 1
            $object = $data['object'];
121 1
            $reflector = midcom_helper_reflector::get($object);
122
123
            $row = [
124 1
                'revision' => $object->metadata->revision,
125 1
                'revised' => $object->metadata->revised,
126 1
                'id' => $object->guid,
127 1
                'class' => get_class($object),
128
            ];
129
130 1
            $row['approved'] = ($object->is_approved()) ? strftime('%x %X', $object->metadata->approved) : $this->_l10n->get('not approved');
131
132 1
            $title = $reflector->get_object_label($object);
133 1
            $link = $this->router->generate('object_' . $this->_request_data['default_mode'], ['guid' => $object->guid]);
134 1
            $row['index_title'] = ($title) ?: '[' . $this->_l10n->get('no title') . ']';
135 1
            $row['title'] = '<a href="' . $link . '" title="' . $row['class'] . '">' . $reflector->get_object_icon($object) . ' ' . $row['index_title'] . '</a>';
136
137 1
            if (empty($data['revisor'])) {
138
                $row['revisor'] = $this->_l10n_midcom->get('unknown');
139
            } else {
140 1
                $row['revisor'] = $data['revisor']->name;
141
            }
142 1
            $rows[] = $row;
143
        }
144 1
        $provider = new provider($rows, 'local');
145 1
        $this->_request_data['grid'] = $provider->get_grid('revised');
146 1
    }
147
148 1
    private function _populate_toolbar()
149
    {
150 1
        $buttons = [];
151 1
        $buttons[] = [
152 1
            MIDCOM_TOOLBAR_URL => $this->router->generate('preferences'),
153 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('user preferences'),
154 1
            MIDCOM_TOOLBAR_GLYPHICON => 'sliders',
155
        ];
156
157 1
        if (midcom::get()->auth->admin) {
158
            $buttons[] = [
159
                MIDCOM_TOOLBAR_URL => $this->router->generate('shell'),
160
                MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('shell'),
161
                MIDCOM_TOOLBAR_GLYPHICON => 'terminal',
162
            ];
163
            $buttons[] = [
164
                MIDCOM_TOOLBAR_URL => $this->router->generate('trash'),
165
                MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('trash'),
166
                MIDCOM_TOOLBAR_GLYPHICON => 'trash',
167
            ];
168
        }
169
170 1
        $buttons[] = [
171 1
            MIDCOM_TOOLBAR_URL => $this->router->generate('components'),
172 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('components'),
173 1
            MIDCOM_TOOLBAR_GLYPHICON => 'puzzle-piece',
174
        ];
175
176
        // Add link to site
177 1
        $buttons[] = [
178 1
            MIDCOM_TOOLBAR_URL => midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX),
179 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('back to site'),
180 1
            MIDCOM_TOOLBAR_GLYPHICON => 'home',
181
        ];
182
183 1
        $buttons[] = [
184 1
            MIDCOM_TOOLBAR_URL => midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX) . "midcom-logout-",
0 ignored issues
show
Bug introduced by
Are you sure midcom_core_context::get...M_CONTEXT_ANCHORPREFIX) of type false|mixed can be used in concatenation? ( Ignorable by Annotation )

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

184
            MIDCOM_TOOLBAR_URL => /** @scrutinizer ignore-type */ midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX) . "midcom-logout-",
Loading history...
185 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n_midcom->get('logout'),
186 1
            MIDCOM_TOOLBAR_GLYPHICON => 'sign-out',
187
        ];
188 1
        $this->_request_data['asgard_toolbar']->add_items($buttons);
189 1
    }
190
191
    private function _mass_delete(array $guids)
192
    {
193
        foreach ($guids as $guid) {
194
            try {
195
                $object = midcom::get()->dbfactory->get_object_by_guid($guid);
196
            } catch (midcom_error $e) {
197
                continue;
198
            }
199
200
            if ($object->delete()) {
201
                midcom::get()->uimessages->add($this->_l10n->get('midgard.admin.asgard'), sprintf($this->_l10n->get('object %s removed'), $object->guid));
202
            }
203
        }
204
    }
205
206
    private function _mass_approve(array $guids)
207
    {
208
        foreach ($guids as $guid) {
209
            try {
210
                $object = midcom::get()->dbfactory->get_object_by_guid($guid);
211
            } catch (midcom_error $e) {
212
                continue;
213
            }
214
215
            if (   $object->can_do('midgard:update')
216
                && $object->can_do('midcom:approve')) {
217
                $object->metadata->approve();
218
                midcom::get()->uimessages->add($this->_l10n->get('midgard.admin.asgard'), sprintf($this->_l10n->get('object %s approved'), $object->guid));
219
            }
220
        }
221
    }
222
223
    /**
224
     * Shows the loaded object in editor.
225
     *
226
     * @param mixed $handler_id The ID of the handler.
227
     * @param array $data The local request data.
228
     */
229 1
    public function _show_welcome($handler_id, array &$data)
230
    {
231 1
        if (midcom::get()->auth->can_user_do('midgard.admin.asgard:manage_objects', null, 'midgard_admin_asgard_plugin')) {
232 1
            midcom_show_style('midgard_admin_asgard_welcome');
233
        }
234 1
    }
235
}
236