admin_plugin_issuelinks_repoadmin::handle()   A
last analyzed

Complexity

Conditions 5
Paths 6

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 15
c 1
b 0
f 0
nc 6
nop 0
dl 0
loc 24
ccs 0
cts 19
cp 0
crap 30
rs 9.4555
1
<?php
2
/**
3
 * DokuWiki Plugin IssueLinks (Admin Component)
4
 *
5
 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6
 * @author  Andreas Gohr, Michael Große <[email protected]>
7
 */
8
9
// must be run within Dokuwiki
10
use dokuwiki\plugin\issuelinks\classes\ServiceProvider;
11
use dokuwiki\plugin\issuelinks\services\ServiceInterface;
12
13
class admin_plugin_issuelinks_repoadmin extends DokuWiki_Admin_Plugin
14
{
15
16
    private $orgs = [];
17
    private $configNeeded = [];
18
19
    /**
20
     * @return int sort number in admin menu
21
     */
22
    public function getMenuSort()
23
    {
24
        return 500;
25
    }
26
27
    /**
28
     * Return the text that is displayed at the main admin menu
29
     * (Default localized language string 'menu' is returned, override this function for setting another name)
30
     *
31
     * @param string $language language code
32
     *
33
     * @return string menu string
34
     */
35
    public function getMenuText($language)
36
    {
37
        return $this->getLang('menu:repo-admin');
38
    }
39
40
    public function getMenuIcon()
41
    {
42
        $plugin = $this->getPluginName();
43
        return DOKU_PLUGIN . $plugin . '/images/issue-opened.svg';
44
    }
45
46
    /**
47
     * @return bool true if only access for superuser, false is for superusers and moderators
48
     */
49
    public function forAdminOnly()
50
    {
51
        return true;
52
    }
53
54
    /**
55
     * Should carry out any processing required by the plugin.
56
     */
57
    public function handle()
58
    {
59
        global $INPUT;
60
61
        $serviceProvider = ServiceProvider::getInstance();
62
        /** @var ServiceInterface[] $services */
63
        $services = $serviceProvider->getServices();
64
65
        if ($INPUT->has('authorize')) {
66
            $serviceID = $INPUT->str('authorize');
67
            $service = $services[$serviceID]::getInstance();
68
            $service->handleAuthorization();
69
        }
70
71
        foreach ($services as $serviceID => $serviceClass) {
72
            $service = $serviceClass::getInstance();
73
            $this->orgs[$serviceID] = [];
74
            if ($INPUT->str('reconfigureService') === $serviceID || !$service->isConfigured()) {
75
                $this->configNeeded[] = $serviceID;
76
                continue;
77
            }
78
79
            $this->orgs[$serviceID] = $service->getListOfAllUserOrganisations();
80
            sort($this->orgs[$serviceID]);
81
        }
82
    }
83
84
    /**
85
     * Render HTML output, e.g. helpful text and a form
86
     */
87
    public function html()
88
    {
89
        $activeServices = array_keys($this->orgs);
90
        $html = "<div id='plugin__issuelinks_repoadmin'>";
91
        $html .= "<div><ul class='tabs'>";
92
        $html = array_reduce($activeServices, [$this, 'appendServiceTab'], $html);
93
        $html .= '</ul></div>';
94
        $html = array_reduce($activeServices, [$this, 'appendServicePage'], $html);
95
96
        $html .= '</div>'; // <div id='plugin__issuelinks_repoadmin'>
97
98
        echo $html;
99
    }
100
101
    /**
102
     * Callback to append a `<li>`-tab for services like GitLab or GitHub to a tabbar
103
     *
104
     * @param string $html the html to which we append the tab
105
     * @param string $serviceID
106
     *
107
     * @return string
108
     */
109
    protected function appendServiceTab($html, $serviceID)
110
    {
111
        $serviceProvider = ServiceProvider::getInstance();
112
        $services = $serviceProvider->getServices();
113
        $service = $services[$serviceID];
114
        $serviceName = $service::DISPLAY_NAME;
115
        return $html . "<li><a data-service='$serviceID'>" . $serviceName . '</a></li>';
116
    }
117
118
    /**
119
     * Callback creating and appending a service's page for adjusting its webhooks
120
     *
121
     * @param string $html the html to which we append the page
122
     * @param string $serviceID
123
     *
124
     * @return string
125
     */
126
    protected function appendServicePage($html, $serviceID)
127
    {
128
        $serviceProvider = ServiceProvider::getInstance();
129
        $services = $serviceProvider->getServices();
130
        $service = $services[$serviceID]::getInstance();
131
        $serviceName = $service::DISPLAY_NAME;
132
133
        $html .= "<div data-service='$serviceID' class='service_wrapper'>";
134
135
        if (in_array($serviceID, $this->configNeeded)) {
136
            $configForm = new \dokuwiki\Form\Form();
137
            $configForm->addClass('plugin__repoadmin_serviceConfig');
138
            $configForm->setHiddenField('authorize', $serviceID);
139
            $configForm->addFieldsetOpen();
140
            $service->hydrateConfigForm($configForm);
141
            $configForm->addButton('', $this->getLang('btn:Submit'))->attr('type', 'submit');
142
            $configForm->addFieldsetClose();
143
            $html .= $configForm->toHTML();
144
        } elseif (count($this->orgs[$serviceID]) === 0) {
145
            $html .= '<p>No organisations available for ' . $serviceName . '</p>';
146
        } else {
147
            global $INPUT;
148
            $reconfigureURL = $INPUT->server->str('REQUEST_URI') . '&reconfigureService=' . $serviceID;
149
            $reconfigureLink = "<a href=\"$reconfigureURL\">{$this->getLang('label: reconfigure service')}</a>";
150
            $authorizedUserLabel = sprintf($this->getLang('label: authorized with user'), $service->getUserString());
151
            $form = new \dokuwiki\Form\Form(['data-service' => $serviceID]);
152
            $form->addFieldsetOpen($this->getLang('legend:user'));
153
            $form->addTagOpen('p');
154
            $form->addHTML($authorizedUserLabel . ' ' . $reconfigureLink);
155
            $form->addTagClose('p');
156
            $form->addFieldsetClose();
157
            $form->addFieldsetOpen($this->getLang("legend:group $serviceID"));
158
            $form->addDropdown(
159
                'mm_organisation',
160
                array_merge([''], $this->orgs[$serviceID]),
161
                $this->getLang("label $serviceID:choose organisation")
162
            );
163
            $form->addFieldsetClose();
164
            $html .= $form->toHTML();
165
            $html .= "<div data-service='$serviceID' class='repo_area'></div>";
166
        }
167
        $html .= '</div>'; // <div data-service='$servicename' class='service_area'>
168
        return $html;
169
    }
170
}
171
172
// vim:ts=4:sw=4:et:
173