xref: /plugin/approve/helper/tpl.php (revision bd8f4058bfaf24abbea588997aefe0313b9cc50b)
1<?php
2
3use dokuwiki\Extension\Plugin;
4
5class helper_plugin_approve_tpl extends Plugin
6{
7    /**
8     * Check if banner should be displayed
9     *
10     * @return bool
11     */
12    public function shouldDisplay() {
13        global $ACT;
14        global $INFO;
15
16        if ($ACT != 'show' || !$INFO['exists']) return false;
17
18        /* Return false if banner should not be displayed for users with or below read only permission. */
19        if (auth_quickaclcheck($INFO['id']) <= AUTH_READ && !$this->getConf('display_banner_for_readonly')) {
20            return false;
21        }
22
23        /** @var helper_plugin_approve_acl $acl */
24        $acl = $this->loadHelper('approve_acl');
25        if (!$acl->useApproveHere($INFO['id'])) return false;
26
27        return true;
28    }
29
30    /**
31     * Do all checks and return banner html
32     *
33     * @param string $action
34     * @return string
35     */
36    public function banner($action) {
37        global $INFO;
38
39        $html = '';
40
41        if (!$this->shouldDisplay($action)) return $html;
42
43        /** @var helper_plugin_approve_acl $acl */
44        $acl = $this->loadHelper('approve_acl');
45
46        $last_change_date = @filemtime(wikiFN($INFO['id']));
47        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
48
49
50        /** @var helper_plugin_approve_db $db */
51        $db = $this->loadHelper('approve_db');
52
53        $page_revision = $db->getPageRevision($INFO['id'], $rev);
54        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
55
56        $classes = $this->getStatusClasses($page_revision['status'], $rev, $last_approved_rev);
57
58        $html .= '<div id="plugin__approve" class="' . implode(' ', $classes) . '">';
59
60
61        if ($page_revision['status'] == 'approved') {
62            $html .=  '<strong>'.$this->getLang('approved').'</strong>';
63            $html .=  ' ' . dformat(strtotime($page_revision['approved']));
64
65            if ($this->getConf('banner_long')) {
66                $html .=  ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true);
67                $html .=  ' (' . $this->getLang('version') .  ': ' . $page_revision['version'] . ')';
68            }
69
70            //not the newest page
71            $noprintContent = '';
72            if ($rev != $last_change_date) {
73                // we can see drafts
74                if ($acl->clientCanSeeDrafts($INFO['id'])) {
75                    $noprintContent .= ' <a href="' . wl($INFO['id']) . '">';
76                    $noprintContent .= $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft');
77                    $noprintContent .= '</a>';
78                    // we cannot see link to draft but there is some newer approved version
79                } elseif ($last_approved_rev != $rev) {
80                    $urlParameters = [];
81                    if ($last_approved_rev != $last_change_date) {
82                        $urlParameters['rev'] = $last_approved_rev;
83                    }
84                    $noprintContent .= ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
85                    $noprintContent .= $this->getLang('newest_approved');
86                    $noprintContent .= '</a>';
87                }
88            }
89
90            $html .= $this->noprint($noprintContent);
91
92        } else {
93            if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
94                // alternative print status (only approved or otherwise draft)
95                $html .= '<span class="plugin__approve_printonly"><strong>' . $this->getLang('draft').'</strong></span>';
96                $noprintContent = '<strong>'.$this->getLang('marked_approve_ready').'</strong>';
97                $noprintContent .= ' ' . dformat(strtotime($page_revision['ready_for_approval']));
98                $noprintContent .= ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true);
99                $html .= $this->noprint($noprintContent);
100            } else {
101                $html .= '<strong>'.$this->getLang('draft').'</strong>';
102            }
103
104            // not exists approve for current page
105            $noprintContent = '';
106            if ($last_approved_rev == null) {
107                // not the newest page
108                if ($rev != $last_change_date) {
109                    $noprintContent .= ' <a href="'.wl($INFO['id']).'">';
110                    $noprintContent .= $this->getLang('newest_draft');
111                    $noprintContent .= '</a>';
112                }
113            } else {
114                $urlParameters = [];
115                if ($last_approved_rev != $last_change_date) {
116                    $urlParameters['rev'] = $last_approved_rev;
117                }
118                $noprintContent .= ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
119                $noprintContent .= $this->getLang('newest_approved');
120                $noprintContent .= '</a>';
121            }
122
123            //we are in current page
124            if ($rev == $last_change_date) {
125                if ($this->getConf('ready_for_approval') &&
126                    $acl->clientCanMarkReadyForApproval($INFO['id']) &&
127                    $page_revision['status'] != 'ready_for_approval') {
128
129                    $urlParameters = [
130                        'rev' => $last_approved_rev,
131                        'do' => 'diff',
132                        'ready_for_approval' => 'ready_for_approval'
133                    ];
134                    $noprintContent .= ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
135                    $noprintContent .= $this->getLang('approve_ready');
136                    $noprintContent .= '</a>';
137                }
138
139                if ($acl->clientCanApprove($INFO['id'])) {
140                    $urlParameters = [
141                        'rev' => $last_approved_rev,
142                        'do' => 'diff',
143                        'approve' => 'approve'
144                    ];
145                    $noprintContent .= ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
146                    $noprintContent .= $this->getLang('approve');
147                    $noprintContent .= '</a>';
148                }
149            }
150
151            $html .= $this->noprint($noprintContent);
152        }
153
154
155        if ($this->getConf('banner_long')) {
156            $page_metadata = $db->getPageMetadata($INFO['id']);
157            if (isset($page_metadata['approver'])) {
158                $html .= $this->noprint(
159                    ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true)
160                );
161            }
162        }
163
164        $html .= '</div>';
165
166        return $html;
167    }
168
169    /**
170     * @param $status
171     * @param $rev
172     * @param int|null $last_approved_rev
173     * @return array
174     */
175    protected function getStatusClasses($status, $rev, ?int $last_approved_rev): array
176    {
177        $classes = [];
178        if ($status == 'approved' && $rev == $last_approved_rev) {
179            $classes[] = 'plugin__approve_approved';
180        } elseif ($status == 'approved') {
181            $classes[] = 'plugin__approve_old_approved';
182        } elseif ($this->getConf('ready_for_approval') && $status == 'ready_for_approval') {
183            $classes[] = 'plugin__approve_ready';
184        } else {
185            $classes[] = 'plugin__approve_draft';
186        }
187        return $classes;
188    }
189
190    /**
191     * Wrap string in noprint span
192     * @param $content
193     * @return string
194     */
195    protected function noprint($content)
196    {
197        return '<span class="plugin__approve_noprint">' . $content . '</span>';
198    }
199}
200