xref: /plugin/approve/helper/tpl.php (revision bd8f4058bfaf24abbea588997aefe0313b9cc50b)
14438242dSSzymon Olewniczak<?php
24438242dSSzymon Olewniczak
34438242dSSzymon Olewniczakuse dokuwiki\Extension\Plugin;
44438242dSSzymon Olewniczak
54438242dSSzymon Olewniczakclass helper_plugin_approve_tpl extends Plugin
64438242dSSzymon Olewniczak{
7*bd8f4058SAnna Dabrowska    /**
8*bd8f4058SAnna Dabrowska     * Check if banner should be displayed
9*bd8f4058SAnna Dabrowska     *
10*bd8f4058SAnna Dabrowska     * @return bool
11*bd8f4058SAnna Dabrowska     */
12*bd8f4058SAnna Dabrowska    public function shouldDisplay() {
13*bd8f4058SAnna Dabrowska        global $ACT;
144438242dSSzymon Olewniczak        global $INFO;
154438242dSSzymon Olewniczak
16*bd8f4058SAnna Dabrowska        if ($ACT != 'show' || !$INFO['exists']) return false;
174438242dSSzymon Olewniczak
18*bd8f4058SAnna Dabrowska        /* Return false if banner should not be displayed for users with or below read only permission. */
194438242dSSzymon Olewniczak        if (auth_quickaclcheck($INFO['id']) <= AUTH_READ && !$this->getConf('display_banner_for_readonly')) {
20*bd8f4058SAnna Dabrowska            return false;
214438242dSSzymon Olewniczak        }
224438242dSSzymon Olewniczak
234438242dSSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
244438242dSSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
25*bd8f4058SAnna Dabrowska        if (!$acl->useApproveHere($INFO['id'])) return false;
26*bd8f4058SAnna Dabrowska
27*bd8f4058SAnna Dabrowska        return true;
28*bd8f4058SAnna Dabrowska    }
29*bd8f4058SAnna Dabrowska
30*bd8f4058SAnna Dabrowska    /**
31*bd8f4058SAnna Dabrowska     * Do all checks and return banner html
32*bd8f4058SAnna Dabrowska     *
33*bd8f4058SAnna Dabrowska     * @param string $action
34*bd8f4058SAnna Dabrowska     * @return string
35*bd8f4058SAnna Dabrowska     */
36*bd8f4058SAnna Dabrowska    public function banner($action) {
37*bd8f4058SAnna Dabrowska        global $INFO;
38*bd8f4058SAnna Dabrowska
39*bd8f4058SAnna Dabrowska        $html = '';
40*bd8f4058SAnna Dabrowska
41*bd8f4058SAnna Dabrowska        if (!$this->shouldDisplay($action)) return $html;
42*bd8f4058SAnna Dabrowska
43*bd8f4058SAnna Dabrowska        /** @var helper_plugin_approve_acl $acl */
44*bd8f4058SAnna Dabrowska        $acl = $this->loadHelper('approve_acl');
454438242dSSzymon Olewniczak
464438242dSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
474438242dSSzymon Olewniczak        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
484438242dSSzymon Olewniczak
494438242dSSzymon Olewniczak
504438242dSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
514438242dSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
524438242dSSzymon Olewniczak
534438242dSSzymon Olewniczak        $page_revision = $db->getPageRevision($INFO['id'], $rev);
544438242dSSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
554438242dSSzymon Olewniczak
56*bd8f4058SAnna Dabrowska        $classes = $this->getStatusClasses($page_revision['status'], $rev, $last_approved_rev);
574438242dSSzymon Olewniczak
58*bd8f4058SAnna Dabrowska        $html .= '<div id="plugin__approve" class="' . implode(' ', $classes) . '">';
594438242dSSzymon Olewniczak
604438242dSSzymon Olewniczak
614438242dSSzymon Olewniczak        if ($page_revision['status'] == 'approved') {
62*bd8f4058SAnna Dabrowska            $html .=  '<strong>'.$this->getLang('approved').'</strong>';
63*bd8f4058SAnna Dabrowska            $html .=  ' ' . dformat(strtotime($page_revision['approved']));
644438242dSSzymon Olewniczak
654438242dSSzymon Olewniczak            if ($this->getConf('banner_long')) {
66*bd8f4058SAnna Dabrowska                $html .=  ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true);
67*bd8f4058SAnna Dabrowska                $html .=  ' (' . $this->getLang('version') .  ': ' . $page_revision['version'] . ')';
684438242dSSzymon Olewniczak            }
694438242dSSzymon Olewniczak
704438242dSSzymon Olewniczak            //not the newest page
71*bd8f4058SAnna Dabrowska            $noprintContent = '';
724438242dSSzymon Olewniczak            if ($rev != $last_change_date) {
734438242dSSzymon Olewniczak                // we can see drafts
744438242dSSzymon Olewniczak                if ($acl->clientCanSeeDrafts($INFO['id'])) {
75*bd8f4058SAnna Dabrowska                    $noprintContent .= ' <a href="' . wl($INFO['id']) . '">';
76*bd8f4058SAnna Dabrowska                    $noprintContent .= $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft');
77*bd8f4058SAnna Dabrowska                    $noprintContent .= '</a>';
784438242dSSzymon Olewniczak                    // we cannot see link to draft but there is some newer approved version
794438242dSSzymon Olewniczak                } elseif ($last_approved_rev != $rev) {
804438242dSSzymon Olewniczak                    $urlParameters = [];
814438242dSSzymon Olewniczak                    if ($last_approved_rev != $last_change_date) {
824438242dSSzymon Olewniczak                        $urlParameters['rev'] = $last_approved_rev;
834438242dSSzymon Olewniczak                    }
84*bd8f4058SAnna Dabrowska                    $noprintContent .= ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
85*bd8f4058SAnna Dabrowska                    $noprintContent .= $this->getLang('newest_approved');
86*bd8f4058SAnna Dabrowska                    $noprintContent .= '</a>';
874438242dSSzymon Olewniczak                }
884438242dSSzymon Olewniczak            }
894438242dSSzymon Olewniczak
90*bd8f4058SAnna Dabrowska            $html .= $this->noprint($noprintContent);
91*bd8f4058SAnna Dabrowska
924438242dSSzymon Olewniczak        } else {
934438242dSSzymon Olewniczak            if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
94*bd8f4058SAnna Dabrowska                // alternative print status (only approved or otherwise draft)
95*bd8f4058SAnna Dabrowska                $html .= '<span class="plugin__approve_printonly"><strong>' . $this->getLang('draft').'</strong></span>';
96*bd8f4058SAnna Dabrowska                $noprintContent = '<strong>'.$this->getLang('marked_approve_ready').'</strong>';
97*bd8f4058SAnna Dabrowska                $noprintContent .= ' ' . dformat(strtotime($page_revision['ready_for_approval']));
98*bd8f4058SAnna Dabrowska                $noprintContent .= ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true);
99*bd8f4058SAnna Dabrowska                $html .= $this->noprint($noprintContent);
1004438242dSSzymon Olewniczak            } else {
101*bd8f4058SAnna Dabrowska                $html .= '<strong>'.$this->getLang('draft').'</strong>';
1024438242dSSzymon Olewniczak            }
1034438242dSSzymon Olewniczak
1044438242dSSzymon Olewniczak            // not exists approve for current page
105*bd8f4058SAnna Dabrowska            $noprintContent = '';
1064438242dSSzymon Olewniczak            if ($last_approved_rev == null) {
1074438242dSSzymon Olewniczak                // not the newest page
1084438242dSSzymon Olewniczak                if ($rev != $last_change_date) {
109*bd8f4058SAnna Dabrowska                    $noprintContent .= ' <a href="'.wl($INFO['id']).'">';
110*bd8f4058SAnna Dabrowska                    $noprintContent .= $this->getLang('newest_draft');
111*bd8f4058SAnna Dabrowska                    $noprintContent .= '</a>';
1124438242dSSzymon Olewniczak                }
1134438242dSSzymon Olewniczak            } else {
1144438242dSSzymon Olewniczak                $urlParameters = [];
1154438242dSSzymon Olewniczak                if ($last_approved_rev != $last_change_date) {
1164438242dSSzymon Olewniczak                    $urlParameters['rev'] = $last_approved_rev;
1174438242dSSzymon Olewniczak                }
118*bd8f4058SAnna Dabrowska                $noprintContent .= ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
119*bd8f4058SAnna Dabrowska                $noprintContent .= $this->getLang('newest_approved');
120*bd8f4058SAnna Dabrowska                $noprintContent .= '</a>';
1214438242dSSzymon Olewniczak            }
1224438242dSSzymon Olewniczak
1234438242dSSzymon Olewniczak            //we are in current page
1244438242dSSzymon Olewniczak            if ($rev == $last_change_date) {
1254438242dSSzymon Olewniczak                if ($this->getConf('ready_for_approval') &&
1264438242dSSzymon Olewniczak                    $acl->clientCanMarkReadyForApproval($INFO['id']) &&
1274438242dSSzymon Olewniczak                    $page_revision['status'] != 'ready_for_approval') {
1284438242dSSzymon Olewniczak
1294438242dSSzymon Olewniczak                    $urlParameters = [
1304438242dSSzymon Olewniczak                        'rev' => $last_approved_rev,
1314438242dSSzymon Olewniczak                        'do' => 'diff',
1324438242dSSzymon Olewniczak                        'ready_for_approval' => 'ready_for_approval'
1334438242dSSzymon Olewniczak                    ];
134*bd8f4058SAnna Dabrowska                    $noprintContent .= ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
135*bd8f4058SAnna Dabrowska                    $noprintContent .= $this->getLang('approve_ready');
136*bd8f4058SAnna Dabrowska                    $noprintContent .= '</a>';
1374438242dSSzymon Olewniczak                }
1384438242dSSzymon Olewniczak
1394438242dSSzymon Olewniczak                if ($acl->clientCanApprove($INFO['id'])) {
1404438242dSSzymon Olewniczak                    $urlParameters = [
1414438242dSSzymon Olewniczak                        'rev' => $last_approved_rev,
1424438242dSSzymon Olewniczak                        'do' => 'diff',
1434438242dSSzymon Olewniczak                        'approve' => 'approve'
1444438242dSSzymon Olewniczak                    ];
145*bd8f4058SAnna Dabrowska                    $noprintContent .= ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
146*bd8f4058SAnna Dabrowska                    $noprintContent .= $this->getLang('approve');
147*bd8f4058SAnna Dabrowska                    $noprintContent .= '</a>';
1484438242dSSzymon Olewniczak                }
1494438242dSSzymon Olewniczak            }
150*bd8f4058SAnna Dabrowska
151*bd8f4058SAnna Dabrowska            $html .= $this->noprint($noprintContent);
1524438242dSSzymon Olewniczak        }
1534438242dSSzymon Olewniczak
1544438242dSSzymon Olewniczak
1554438242dSSzymon Olewniczak        if ($this->getConf('banner_long')) {
1564438242dSSzymon Olewniczak            $page_metadata = $db->getPageMetadata($INFO['id']);
1574438242dSSzymon Olewniczak            if (isset($page_metadata['approver'])) {
158*bd8f4058SAnna Dabrowska                $html .= $this->noprint(
159*bd8f4058SAnna Dabrowska                    ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true)
160*bd8f4058SAnna Dabrowska                );
1614438242dSSzymon Olewniczak            }
1624438242dSSzymon Olewniczak        }
1634438242dSSzymon Olewniczak
164*bd8f4058SAnna Dabrowska        $html .= '</div>';
165*bd8f4058SAnna Dabrowska
166*bd8f4058SAnna Dabrowska        return $html;
167*bd8f4058SAnna Dabrowska    }
168*bd8f4058SAnna Dabrowska
169*bd8f4058SAnna Dabrowska    /**
170*bd8f4058SAnna Dabrowska     * @param $status
171*bd8f4058SAnna Dabrowska     * @param $rev
172*bd8f4058SAnna Dabrowska     * @param int|null $last_approved_rev
173*bd8f4058SAnna Dabrowska     * @return array
174*bd8f4058SAnna Dabrowska     */
175*bd8f4058SAnna Dabrowska    protected function getStatusClasses($status, $rev, ?int $last_approved_rev): array
176*bd8f4058SAnna Dabrowska    {
177*bd8f4058SAnna Dabrowska        $classes = [];
178*bd8f4058SAnna Dabrowska        if ($status == 'approved' && $rev == $last_approved_rev) {
179*bd8f4058SAnna Dabrowska            $classes[] = 'plugin__approve_approved';
180*bd8f4058SAnna Dabrowska        } elseif ($status == 'approved') {
181*bd8f4058SAnna Dabrowska            $classes[] = 'plugin__approve_old_approved';
182*bd8f4058SAnna Dabrowska        } elseif ($this->getConf('ready_for_approval') && $status == 'ready_for_approval') {
183*bd8f4058SAnna Dabrowska            $classes[] = 'plugin__approve_ready';
184*bd8f4058SAnna Dabrowska        } else {
185*bd8f4058SAnna Dabrowska            $classes[] = 'plugin__approve_draft';
186*bd8f4058SAnna Dabrowska        }
187*bd8f4058SAnna Dabrowska        return $classes;
188*bd8f4058SAnna Dabrowska    }
189*bd8f4058SAnna Dabrowska
190*bd8f4058SAnna Dabrowska    /**
191*bd8f4058SAnna Dabrowska     * Wrap string in noprint span
192*bd8f4058SAnna Dabrowska     * @param $content
193*bd8f4058SAnna Dabrowska     * @return string
194*bd8f4058SAnna Dabrowska     */
195*bd8f4058SAnna Dabrowska    protected function noprint($content)
196*bd8f4058SAnna Dabrowska    {
197*bd8f4058SAnna Dabrowska        return '<span class="plugin__approve_noprint">' . $content . '</span>';
1984438242dSSzymon Olewniczak    }
1994438242dSSzymon Olewniczak}
200