Passed
Push — master ( 526cb1...f4a739 )
by Andreas
18:51
created

_show_welcome()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 2
nc 2
nop 2
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 2
rs 10
c 0
b 0
f 0
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(string $since, ?string $type = null, bool $only_mine = false) : array
22
    {
23 1
        $types = ($type !== null) ? [$type] : $this->_request_data['schema_types'];
24 1
        $revised = [];
25
26
        // List installed MgdSchema types and convert to DBA classes
27 1
        foreach ($types as $schema_type) {
28 1
            $midcom_dba_classname = midcom::get()->dbclassloader->get_midcom_class_name_for_mgdschema_object(new $schema_type);
29 1
            if (!empty($midcom_dba_classname)) {
30
                // List all revised objects
31 1
                $qb = new midcom_core_querybuilder($midcom_dba_classname);
32 1
                $qb->add_constraint('metadata.revised', '>=', $since);
33
34 1
                if (   $only_mine
35 1
                    && midcom::get()->auth->user) {
36
                    $qb->add_constraint('metadata.authors', 'LIKE', '|' . midcom::get()->auth->user->guid . '|');
37
                }
38
39 1
                foreach ($qb->execute() as $object) {
40 1
                    $revised["{$object->metadata->revised}_{$object->guid}_{$object->metadata->revision}"] = [
41 1
                        'object' => $object,
42 1
                        'revisor' => midcom::get()->auth->get_user($object->metadata->revisor)
43
                    ];
44
                }
45
            }
46
        }
47
48 1
        krsort($revised);
49 1
        return $revised;
50
    }
51
52
    /**
53
     * Object editing view
54
     */
55 1
    public function _handler_welcome(Request $request, array &$data)
56
    {
57 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 $excludes 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

57
        $data['schema_types'] = array_diff(midcom_connection::get_schema_types(), /** @scrutinizer ignore-type */ $this->_config->get('skip_in_filter'));
Loading history...
58
59 1
        $data['view_title'] = $this->_l10n->get('asgard');
60
61 1
        if ($request->request->has('action') && $request->request->has('entries')) {
62
            $method_name = '_mass_' . $request->request->get('action');
63
            $this->$method_name($request->request->get('entries'));
64
        }
65
66 1
        if ($request->query->has('revised_after')) {
67
            $data['revised_after'] = date('Y-m-d', $request->query->get('revised_after'));
68
69
            $data['type_filter'] = null;
70
            if ($request->query->get('type_filter', 'any') != 'any') {
71
                $data['type_filter'] = $request->query->get('type_filter');
72
            }
73
74
            $data['only_mine'] = $request->query->getBoolean('only_mine');
75
76
            $objects = $this->_list_revised($data['revised_after'], $data['type_filter'], $data['only_mine']);
77
        } else {
78 1
            $data['revised_after'] = date('Y-m-d', strtotime('yesterday'));
79 1
            $objects = $this->_list_revised($data['revised_after']);
80
        }
81
82 1
        $this->_prepare_tabledata($objects);
83
84 1
        $data['action_options'] = [
85 1
            'none' => ['label' => $this->_l10n->get('apply to selected')],
86
            'delete' => [
87 1
                'label' => $this->_l10n_midcom->get('delete'),
88
            ],
89
            'approve' => [
90 1
                'label' => $this->_l10n_midcom->get('approve'),
91
            ]
92
        ];
93
94 1
        $this->_populate_toolbar();
95 1
        return $this->get_response();
96
    }
97
98 1
    private function _prepare_tabledata(array $objects)
99
    {
100 1
        $rows = [];
101 1
        foreach ($objects as $data) {
102 1
            $object = $data['object'];
103 1
            $reflector = midcom_helper_reflector::get($object);
104
105
            $row = [
106 1
                'revision' => $object->metadata->revision,
107 1
                'revised' => $object->metadata->revised,
108 1
                'id' => $object->guid,
109 1
                'class' => get_class($object),
110
            ];
111
112 1
            $row['approved'] = ($object->is_approved()) ? strftime('%x %X', $object->metadata->approved) : $this->_l10n->get('not approved');
113
114 1
            $row['index_title'] = $reflector->get_object_label($object) ?: '[' . $this->_l10n->get('no title') . ']';
115 1
            $link = $this->router->generate('object_' . $this->_request_data['default_mode'], ['guid' => $object->guid]);
116 1
            $row['title'] = '<a href="' . $link . '" title="' . $row['class'] . '">' . $reflector->get_object_icon($object) . ' ' . $row['index_title'] . '</a>';
117
118 1
            if (empty($data['revisor'])) {
119
                $row['revisor'] = $this->_l10n_midcom->get('unknown');
120
            } else {
121 1
                $row['revisor'] = $data['revisor']->name;
122
            }
123 1
            $rows[] = $row;
124
        }
125 1
        $provider = new provider($rows, 'local');
126 1
        $this->_request_data['grid'] = $provider->get_grid('revised');
127 1
    }
128
129 1
    private function _populate_toolbar()
130
    {
131 1
        $buttons = [];
132 1
        $buttons[] = [
133 1
            MIDCOM_TOOLBAR_URL => $this->router->generate('preferences'),
134 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('user preferences'),
135 1
            MIDCOM_TOOLBAR_GLYPHICON => 'sliders',
136
        ];
137
138 1
        if (midcom::get()->auth->admin) {
139
            $buttons[] = [
140
                MIDCOM_TOOLBAR_URL => $this->router->generate('shell'),
141
                MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('shell'),
142
                MIDCOM_TOOLBAR_GLYPHICON => 'terminal',
143
            ];
144
            $buttons[] = [
145
                MIDCOM_TOOLBAR_URL => $this->router->generate('trash'),
146
                MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('trash'),
147
                MIDCOM_TOOLBAR_GLYPHICON => 'trash',
148
            ];
149
        }
150
151 1
        $buttons[] = [
152 1
            MIDCOM_TOOLBAR_URL => $this->router->generate('components'),
153 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('components'),
154 1
            MIDCOM_TOOLBAR_GLYPHICON => 'puzzle-piece',
155
        ];
156
157
        // Add link to site
158 1
        $buttons[] = [
159 1
            MIDCOM_TOOLBAR_URL => midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX),
160 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('back to site'),
161 1
            MIDCOM_TOOLBAR_GLYPHICON => 'home',
162
        ];
163
164 1
        $buttons[] = [
165 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

165
            MIDCOM_TOOLBAR_URL => /** @scrutinizer ignore-type */ midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX) . "midcom-logout-",
Loading history...
166 1
            MIDCOM_TOOLBAR_LABEL => $this->_l10n_midcom->get('logout'),
167 1
            MIDCOM_TOOLBAR_GLYPHICON => 'sign-out',
168
        ];
169 1
        $this->_request_data['asgard_toolbar']->add_items($buttons);
170 1
    }
171
172
    private function _mass_delete(array $guids)
173
    {
174
        foreach ($guids as $guid) {
175
            try {
176
                $object = midcom::get()->dbfactory->get_object_by_guid($guid);
177
            } catch (midcom_error $e) {
178
                continue;
179
            }
180
181
            if ($object->delete()) {
182
                midcom::get()->uimessages->add($this->_l10n->get('midgard.admin.asgard'), sprintf($this->_l10n->get('object %s removed'), $object->guid));
183
            }
184
        }
185
    }
186
187
    private function _mass_approve(array $guids)
188
    {
189
        foreach ($guids as $guid) {
190
            try {
191
                $object = midcom::get()->dbfactory->get_object_by_guid($guid);
192
            } catch (midcom_error $e) {
193
                continue;
194
            }
195
196
            if (   $object->can_do('midgard:update')
197
                && $object->can_do('midcom:approve')) {
198
                $object->metadata->approve();
199
                midcom::get()->uimessages->add($this->_l10n->get('midgard.admin.asgard'), sprintf($this->_l10n->get('object %s approved'), $object->guid));
200
            }
201
        }
202
    }
203
204
    /**
205
     * Shows the loaded object in editor.
206
     *
207
     * @param array $data The local request data.
208
     */
209 1
    public function _show_welcome(string $handler_id, array &$data)
210
    {
211 1
        if (midcom::get()->auth->can_user_do('midgard.admin.asgard:manage_objects', null, 'midgard_admin_asgard_plugin')) {
212 1
            midcom_show_style('midgard_admin_asgard_welcome');
213
        }
214 1
    }
215
}
216