Passed
Push — master ( 409c3f...e5371a )
by Andreas
09:22
created

midgard_admin_asgard_handler_undelete   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 144
Duplicated Lines 0 %

Test Coverage

Coverage 54.32%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 82
dl 0
loc 144
ccs 44
cts 81
cp 0.5432
rs 10
c 2
b 0
f 0
wmc 18

5 Methods

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