Passed
Push — master ( 899c62...34dd63 )
by Andreas
23:35
created

_handler_trash()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 14
nc 3
nop 1
dl 0
loc 24
ccs 15
cts 15
cp 1
crap 3
rs 9.7998
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 Symfony\Component\HttpFoundation\Request;
10
use midgard\portable\api\mgdobject;
11
12
/**
13
 * Undelete/purge interface
14
 *
15
 * @package midgard.admin.asgard
16
 */
17
class midgard_admin_asgard_handler_undelete extends midcom_baseclasses_components_handler
18
{
19
    use midgard_admin_asgard_handler;
20
21
    private $type = '';
22
23 3
    public function _on_initialize()
24
    {
25 3
        midcom::get()->head->add_jsfile(MIDCOM_STATIC_URL . '/jQuery/jquery.tablesorter.pack.js');
26 3
        midcom::get()->head->add_jsfile(MIDCOM_STATIC_URL . '/midgard.admin.asgard/jquery.batch_process.js');
27 3
        $this->add_stylesheet(MIDCOM_STATIC_URL . '/midgard.admin.asgard/tablewidget.css');
28 3
    }
29
30
    /**
31
     * Trash view
32
     */
33 1
    public function _handler_trash(array &$data)
34
    {
35 1
        midcom::get()->auth->require_admin_user();
36
37 1
        $data['view_title'] = $this->_l10n->get('trash');
38
39 1
        $data['types'] = [];
40 1
        foreach (midcom_connection::get_schema_types() as $type) {
41
            // Objects that don't have metadata should not be shown in trash.
42 1
            if (!midgard_reflector_object::has_metadata_class($type)) {
43 1
                debug_add("{$type} has no metadata, skipping");
44 1
                continue;
45
            }
46
47 1
            $qb = new midgard_query_builder($type);
48 1
            $qb->include_deleted();
49 1
            $qb->add_constraint('metadata.deleted', '=', true);
50 1
            $data['types'][$type] = $qb->count();
51
        }
52
53
        // Set the breadcrumb data
54 1
        $this->add_breadcrumb($this->router->generate('welcome'), $this->_l10n->get('midgard.admin.asgard'));
55 1
        $this->add_breadcrumb($this->router->generate('trash'), $this->_l10n->get('trash'));
56 1
        return $this->get_response('midgard_admin_asgard_trash');
57
    }
58
59
    /**
60
     * Trash view
61
     */
62 2
    public function _handler_trash_type(Request $request, string $type, array &$data)
63
    {
64 2
        midcom::get()->auth->require_admin_user();
65
66 2
        $this->type = $type;
67
68 2
        $data['view_title'] = sprintf($this->_l10n->get('%s trash'), midgard_admin_asgard_plugin::get_type_label($type));
69
70 2
        $data['type'] = $type;
71
72 2
        if ($guids = $request->request->get('undelete')) {
73 1
            return $this->process_request($guids, $request->request->has('purge'));
74
        }
75
76 1
        $qb = new org_openpsa_qbpager_direct($data['type'], "{$data['type']}_trash");
77 1
        $qb->include_deleted();
78 1
        $qb->add_constraint('metadata.deleted', '=', true);
79 1
        $qb->add_order('metadata.revised', 'DESC');
80 1
        $data['qb'] = $qb;
81 1
        $data['trash'] = $qb->execute_unchecked();
82
83
        // Set the breadcrumb data
84 1
        $this->add_breadcrumb($this->router->generate('welcome'), $this->_l10n->get($this->_component));
85 1
        $this->add_breadcrumb($this->router->generate('trash'), $this->_l10n->get('trash'));
86 1
        $this->add_breadcrumb($this->router->generate('trash_type', ['type' => $type]), midgard_admin_asgard_plugin::get_type_label($type));
87
88 1
        $data['current_type'] = $this->type;
89 1
        $data['handler'] = $this;
90
91 1
        return $this->get_response('midgard_admin_asgard_trash_type');
92
    }
93
94 1
    private function process_request(array $guids, bool $purge) : midcom_response_relocate
95
    {
96 1
        if ($purge) {
97 1
            $size = midcom_baseclasses_core_dbobject::purge($guids, $this->type);
98 1
            $message = 'in total %s purged';
99
        } else {
100
            $size = midcom_baseclasses_core_dbobject::undelete($guids);
101
            $message = 'in total %s undeleted';
102
        }
103 1
        midcom::get()->uimessages->add($this->_l10n->get($this->_component), sprintf($this->_l10n->get($message), midcom_helper_misc::filesize_to_string($size)), 'info');
104 1
        return new midcom_response_relocate($this->router->generate('trash_type', ['type' => $this->_request_data['type']]));
105
    }
106
107
    public function show_type(mgdobject $object, int $indent = 0, string $prefix = '', bool $enable_undelete = true)
108
    {
109
        static $shown = [];
110
        static $url_prefix = '';
111
        if (!$url_prefix) {
112
            $url_prefix = midcom_core_context::get()->get_key(MIDCOM_CONTEXT_ANCHORPREFIX);
113
        }
114
115
        if (isset($shown[$object->guid])) {
116
            return;
117
        }
118
119
        $revisor = midcom::get()->auth->get_user($object->metadata->revisor);
120
121
        $reflector = midcom_helper_reflector_tree::get($object);
122
        $icon = $reflector->get_object_icon($object);
123
124
        echo "{$prefix}<tr>\n";
125
126
        $disabled = '';
127
        if (!$enable_undelete) {
128
            $disabled = ' disabled="disabled"';
129
        }
130
131
        $object_label = $reflector->get_object_label($object);
132
        if (empty($object_label)) {
133
            $object_label = $object->guid;
134
        }
135
        echo "{$prefix}    <td class=\"checkbox\"><input type=\"checkbox\" name=\"undelete[]\"{$disabled} value=\"{$object->guid}\" id=\"guid_{$object->guid}\" /></td>\n";
136
        echo "{$prefix}    <td class=\"label\" style=\"padding-left: {$indent}px\"><a href=\"". $this->router->generate('object_deleted', ['guid' =>$object->guid]) . "\">{$icon} " . $object_label . "</a></td>\n";
137
        echo "{$prefix}    <td class=\"nowrap\">" . strftime('%x %X', strtotime($object->metadata->revised)) . "</td>\n";
138
139
        if (!empty($revisor->guid)) {
140
            echo "{$prefix}    <td><a href=\"{$url_prefix}__mfa/asgard/object/view/{$revisor->guid}/\">{$revisor->name}</a></td>\n";
141
        } else {
142
            echo "{$prefix}    <td>&nbsp;</td>\n";
143
        }
144
        echo "{$prefix}    <td>" . midcom_helper_misc::filesize_to_string($object->metadata->size) . "</td>\n";
145
        echo "{$prefix}</tr>\n";
146
147
        if ($child_types = midcom_helper_reflector_tree::get_child_objects($object, true)) {
148
            $child_indent = $indent + 20;
149
            echo "{$prefix}<tbody class=\"children\">\n";
150
            foreach ($child_types as $type => $children) {
151
                if (   count($children) < 10
152
                    || isset($_GET['show_children'][$object->guid][$type])) {
153
                        foreach ($children as $child) {
154
                            $this->show_type($child, $child_indent, "{$prefix}    ", false);
155
                        }
156
                    } else {
157
                        echo "{$prefix}    <tr>\n";
158
                        echo "{$prefix}        <td class=\"label\" style=\"padding-left: {$child_indent}px\" colspan=\"5\"><a href=\"?show_children[{$object->guid}][{$type}]=1\">" . sprintf($this->_i18n->get_string('show %s %s children', 'midgard.admin.asgard'), count($children), midgard_admin_asgard_plugin::get_type_label($type)) . "</a></td>\n";
159
                        echo "{$prefix}    </tr>\n";
160
                    }
161
            }
162
163
            echo "{$prefix}</tbody>\n";
164
        }
165
        $shown[$object->guid] = true;
166
    }
167
}
168