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