16c9fde82SSatoshi Sahara<?php 26c9fde82SSatoshi Sahara 36c9fde82SSatoshi Saharanamespace dokuwiki\Ui; 46c9fde82SSatoshi Sahara 56c9fde82SSatoshi Saharause dokuwiki\ChangeLog\PageChangeLog; 66c9fde82SSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog; 76c9fde82SSatoshi Saharause dokuwiki\Extension\Event; 86c9fde82SSatoshi Saharause dokuwiki\Form\Form; 96c9fde82SSatoshi Sahara 106c9fde82SSatoshi Sahara/** 119e316641SSatoshi Sahara * DokuWiki Revisions Interface 126c9fde82SSatoshi Sahara * 136c9fde82SSatoshi Sahara * @package dokuwiki\Ui 146c9fde82SSatoshi Sahara */ 156c9fde82SSatoshi Saharaclass Revisions extends Ui 166c9fde82SSatoshi Sahara{ 179e316641SSatoshi Sahara protected $first; 189e316641SSatoshi Sahara protected $media_id; 199e316641SSatoshi Sahara 209e316641SSatoshi Sahara /** 219e316641SSatoshi Sahara * Revisions Ui constructor 229e316641SSatoshi Sahara * 239e316641SSatoshi Sahara * @param int $first skip the first n changelog lines 249e316641SSatoshi Sahara * @param bool|string $media_id id of media, or false for current page 259e316641SSatoshi Sahara */ 269e316641SSatoshi Sahara public function __construct($first = 0, $media_id = false) 279e316641SSatoshi Sahara { 289e316641SSatoshi Sahara $this->first = $first; 299e316641SSatoshi Sahara $this->media_id = $media_id; 309e316641SSatoshi Sahara } 319e316641SSatoshi Sahara 326c9fde82SSatoshi Sahara /** 336c9fde82SSatoshi Sahara * Display list of old revisions 346c9fde82SSatoshi Sahara * 356c9fde82SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 366c9fde82SSatoshi Sahara * @author Ben Coburn <btcoburn@silicodon.net> 376c9fde82SSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 386c9fde82SSatoshi Sahara * 396c9fde82SSatoshi Sahara * @triggers HTML_REVISIONSFORM_OUTPUT 406c9fde82SSatoshi Sahara * @return void 416c9fde82SSatoshi Sahara */ 429e316641SSatoshi Sahara public function show() 436c9fde82SSatoshi Sahara { 446c9fde82SSatoshi Sahara global $ID; 456c9fde82SSatoshi Sahara global $INFO; 466c9fde82SSatoshi Sahara global $conf; 476c9fde82SSatoshi Sahara global $lang; 489e316641SSatoshi Sahara 499e316641SSatoshi Sahara $first = $this->first; 509e316641SSatoshi Sahara $media_id = $this->media_id; 519e316641SSatoshi Sahara 526c9fde82SSatoshi Sahara $id = $ID; 536c9fde82SSatoshi Sahara if ($media_id) { 546c9fde82SSatoshi Sahara $id = $media_id; 556c9fde82SSatoshi Sahara $changelog = new MediaChangeLog($id); 566c9fde82SSatoshi Sahara } else { 576c9fde82SSatoshi Sahara $changelog = new PageChangeLog($id); 586c9fde82SSatoshi Sahara } 596c9fde82SSatoshi Sahara 606c9fde82SSatoshi Sahara /* we need to get one additional log entry to be able to 616c9fde82SSatoshi Sahara * decide if this is the last page or is there another one. 626c9fde82SSatoshi Sahara * see html_recent() 636c9fde82SSatoshi Sahara */ 646c9fde82SSatoshi Sahara 656c9fde82SSatoshi Sahara $revisions = $changelog->getRevisions($first, $conf['recent'] +1); 666c9fde82SSatoshi Sahara 676c9fde82SSatoshi Sahara if (count($revisions) == 0 && $first != 0) { 686c9fde82SSatoshi Sahara $first = 0; 696c9fde82SSatoshi Sahara $revisions = $changelog->getRevisions($first, $conf['recent'] +1); 706c9fde82SSatoshi Sahara } 716c9fde82SSatoshi Sahara $hasNext = false; 726c9fde82SSatoshi Sahara if (count($revisions) > $conf['recent']) { 736c9fde82SSatoshi Sahara $hasNext = true; 746c9fde82SSatoshi Sahara array_pop($revisions); // remove extra log entry 756c9fde82SSatoshi Sahara } 766c9fde82SSatoshi Sahara 776c9fde82SSatoshi Sahara // print intro 786c9fde82SSatoshi Sahara if (!$media_id) { 796c9fde82SSatoshi Sahara print p_locale_xhtml('revisions'); 806c9fde82SSatoshi Sahara $exists = $INFO['exists']; 816c9fde82SSatoshi Sahara $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id; 826c9fde82SSatoshi Sahara if (!$display_name) { 836c9fde82SSatoshi Sahara $display_name = $id; 846c9fde82SSatoshi Sahara } 856c9fde82SSatoshi Sahara } else { 866c9fde82SSatoshi Sahara $exists = file_exists(mediaFN($id)); 876c9fde82SSatoshi Sahara $display_name = $id; 886c9fde82SSatoshi Sahara } 896c9fde82SSatoshi Sahara 906c9fde82SSatoshi Sahara // create the form 916c9fde82SSatoshi Sahara $form = new Form(['id' => 'page__revisions']); 926c9fde82SSatoshi Sahara $form->addClass('changes'); 936c9fde82SSatoshi Sahara if ($media_id) { 946c9fde82SSatoshi Sahara $form->attr('action', media_managerURL(array('image' => $media_id), '&')); 956c9fde82SSatoshi Sahara } 96*c2bf454bSSatoshi Sahara $form->addTagOpen('div')->addClass('no'); 976c9fde82SSatoshi Sahara 986c9fde82SSatoshi Sahara // start listing 996c9fde82SSatoshi Sahara $form->addTagOpen('ul'); 1006c9fde82SSatoshi Sahara 1016c9fde82SSatoshi Sahara if ($exists && $first == 0) { 1026c9fde82SSatoshi Sahara $minor = false; 1036c9fde82SSatoshi Sahara if ($media_id) { 1046c9fde82SSatoshi Sahara $date = dformat(@filemtime(mediaFN($id))); 1056c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&'); 1066c9fde82SSatoshi Sahara 1076c9fde82SSatoshi Sahara $changelog->setChunkSize(1024); 1086c9fde82SSatoshi Sahara $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id)))); 1096c9fde82SSatoshi Sahara 1106c9fde82SSatoshi Sahara $summary = $revinfo['sum']; 1116c9fde82SSatoshi Sahara $editor = $revinfo['user'] ?: $revinfo['ip']; 1126c9fde82SSatoshi Sahara $sizechange = $revinfo['sizechange']; 1136c9fde82SSatoshi Sahara } else { 1146c9fde82SSatoshi Sahara $date = dformat($INFO['lastmod']); 115269e7027SSatoshi Sahara $sizechange = null; 1166c9fde82SSatoshi Sahara if (isset($INFO['meta']) && isset($INFO['meta']['last_change'])) { 1176c9fde82SSatoshi Sahara if ($INFO['meta']['last_change']['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { 1186c9fde82SSatoshi Sahara $minor = true; 1196c9fde82SSatoshi Sahara } 1206c9fde82SSatoshi Sahara if (isset($INFO['meta']['last_change']['sizechange'])) { 1216c9fde82SSatoshi Sahara $sizechange = $INFO['meta']['last_change']['sizechange']; 1226c9fde82SSatoshi Sahara } 1236c9fde82SSatoshi Sahara } 1246c9fde82SSatoshi Sahara $pagelog = new PageChangeLog($ID); 1256c9fde82SSatoshi Sahara $latestrev = $pagelog->getRevisions(-1, 1); 1266c9fde82SSatoshi Sahara $latestrev = array_pop($latestrev); 1276c9fde82SSatoshi Sahara $href = wl($id, "rev=$latestrev", false, '&'); 1286c9fde82SSatoshi Sahara $summary = $INFO['sum']; 1296c9fde82SSatoshi Sahara $editor = $INFO['editor']; 1306c9fde82SSatoshi Sahara } 1316c9fde82SSatoshi Sahara 1326c9fde82SSatoshi Sahara $form->addTagOpen('li')->addClass($minor ? 'minor' : ''); 1336c9fde82SSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 1346c9fde82SSatoshi Sahara $form->addCheckbox('rev2[]')->val('current'); 135*c2bf454bSSatoshi Sahara $form->addHTML(' '); 1366c9fde82SSatoshi Sahara 1376c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('data'); 1386c9fde82SSatoshi Sahara $form->addHTML($date); 1396c9fde82SSatoshi Sahara $form->addTagClose('span'); 140*c2bf454bSSatoshi Sahara $form->addHTML(' '); 1416c9fde82SSatoshi Sahara 1426c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 1436c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 1446c9fde82SSatoshi Sahara 'width' => 15, 1456c9fde82SSatoshi Sahara 'height' => 11, 1466c9fde82SSatoshi Sahara 'alt' => '', 1476c9fde82SSatoshi Sahara ]); 148*c2bf454bSSatoshi Sahara $form->addHTML(' '); 1496c9fde82SSatoshi Sahara 1506c9fde82SSatoshi Sahara $form->addTagOPen('a')->attr('href', $href)->addClass('wikilink1'); 1516c9fde82SSatoshi Sahara $form->addHTML($display_name); 1526c9fde82SSatoshi Sahara $form->addTagClose('a'); 153*c2bf454bSSatoshi Sahara $form->addHTML(' '); 1546c9fde82SSatoshi Sahara 1556c9fde82SSatoshi Sahara if ($media_id) $form->addTagOpen('div'); 1566c9fde82SSatoshi Sahara 1576c9fde82SSatoshi Sahara if ($summary) { 1586c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 1596c9fde82SSatoshi Sahara if (!$media_id) $form->addHTML(' – '); 1606c9fde82SSatoshi Sahara $form->addHTML('<bdi>' . hsc($summary) . '</bdi>'); 1616c9fde82SSatoshi Sahara $form->addTagClose('span'); 1626c9fde82SSatoshi Sahara } 163*c2bf454bSSatoshi Sahara $form->addHTML(' '); 1646c9fde82SSatoshi Sahara 1656c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('user'); 1666c9fde82SSatoshi Sahara $form->addHTML( 1676c9fde82SSatoshi Sahara (empty($editor)) ? ('('.$lang['external_edit'].')') : '<bdi>'.editorinfo($editor).'</bdi>' 1686c9fde82SSatoshi Sahara ); 1696c9fde82SSatoshi Sahara $form->addTagClose('span'); 170*c2bf454bSSatoshi Sahara $form->addHTML(' '); 1716c9fde82SSatoshi Sahara 172e34d6962SSatoshi Sahara $form->addHTML(html_sizechange($sizechange)); 173*c2bf454bSSatoshi Sahara $form->addHTML(' '); 1746c9fde82SSatoshi Sahara 1756c9fde82SSatoshi Sahara $form->addHTML('('.$lang['current'].')'); 1766c9fde82SSatoshi Sahara 1776c9fde82SSatoshi Sahara if ($media_id) $form->addTagClose('div'); 1786c9fde82SSatoshi Sahara 1796c9fde82SSatoshi Sahara $form->addTagClose('div'); 1806c9fde82SSatoshi Sahara $form->addTagClose('li'); 1816c9fde82SSatoshi Sahara } 1826c9fde82SSatoshi Sahara 1836c9fde82SSatoshi Sahara foreach ($revisions as $rev) { 1846c9fde82SSatoshi Sahara $date = dformat($rev); 1856c9fde82SSatoshi Sahara $info = $changelog->getRevisionInfo($rev); 1866c9fde82SSatoshi Sahara if ($media_id) { 1876c9fde82SSatoshi Sahara $exists = file_exists(mediaFN($id, $rev)); 1886c9fde82SSatoshi Sahara } else { 1896c9fde82SSatoshi Sahara $exists = page_exists($id, $rev); 1906c9fde82SSatoshi Sahara } 1916c9fde82SSatoshi Sahara 1926c9fde82SSatoshi Sahara $class = ''; 1936c9fde82SSatoshi Sahara if ($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { 1946c9fde82SSatoshi Sahara $class = 'minor'; 1956c9fde82SSatoshi Sahara } 1966c9fde82SSatoshi Sahara 1976c9fde82SSatoshi Sahara $form->addTagOpen('li')->addClass($class); 1986c9fde82SSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 1996c9fde82SSatoshi Sahara 2006c9fde82SSatoshi Sahara if ($exists){ 2016c9fde82SSatoshi Sahara $form->addCheckbox('rev2[]')->val($rev); 2026c9fde82SSatoshi Sahara } else { 2036c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 2046c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 2056c9fde82SSatoshi Sahara 'width' => 15, 2066c9fde82SSatoshi Sahara 'height' => 11, 2076c9fde82SSatoshi Sahara 'alt' => '', 2086c9fde82SSatoshi Sahara ]); 2096c9fde82SSatoshi Sahara } 210*c2bf454bSSatoshi Sahara $form->addHTML(' '); 2116c9fde82SSatoshi Sahara 2126c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('date'); 2136c9fde82SSatoshi Sahara $form->addHTML($date); 2146c9fde82SSatoshi Sahara $form->addTagClose('span'); 215*c2bf454bSSatoshi Sahara $form->addHTML(' '); 2166c9fde82SSatoshi Sahara 2176c9fde82SSatoshi Sahara if ($exists) { 2186c9fde82SSatoshi Sahara if (!$media_id) { 2196c9fde82SSatoshi Sahara $href = wl($id, "rev=$rev,do=diff", false, '&'); 2206c9fde82SSatoshi Sahara } else { 2216c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&'); 2226c9fde82SSatoshi Sahara } 2236c9fde82SSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('diff_link'); 2246c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 2256c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/diff.png', 2266c9fde82SSatoshi Sahara 'width' => 15, 2276c9fde82SSatoshi Sahara 'height' => 11, 2286c9fde82SSatoshi Sahara 'title' => $lang['diff'], 2296c9fde82SSatoshi Sahara 'alt' => $lang['diff'], 2306c9fde82SSatoshi Sahara ]); 2316c9fde82SSatoshi Sahara $form->addTagClose('a'); 232*c2bf454bSSatoshi Sahara $form->addHTML(' '); 2336c9fde82SSatoshi Sahara 2346c9fde82SSatoshi Sahara if (!$media_id) { 2356c9fde82SSatoshi Sahara $href = wl($id, "rev=$rev", false, '&'); 2366c9fde82SSatoshi Sahara } else { 2376c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&'); 2386c9fde82SSatoshi Sahara } 2396c9fde82SSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('wikilink1'); 2406c9fde82SSatoshi Sahara $form->addHTML($display_name); 2416c9fde82SSatoshi Sahara $form->addTagClose('a'); 2426c9fde82SSatoshi Sahara } else { 2436c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 2446c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 2456c9fde82SSatoshi Sahara 'width' => 15, 2466c9fde82SSatoshi Sahara 'height' => 11, 2476c9fde82SSatoshi Sahara 'alt' => '', 2486c9fde82SSatoshi Sahara ]); 2496c9fde82SSatoshi Sahara $form->addHTML($display_name); 2506c9fde82SSatoshi Sahara } 251*c2bf454bSSatoshi Sahara $form->addHTML(' '); 2526c9fde82SSatoshi Sahara 2536c9fde82SSatoshi Sahara if ($media_id) $form->addTagOpen('div'); 2546c9fde82SSatoshi Sahara 2556c9fde82SSatoshi Sahara if ($info['sum']) { 2566c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 2576c9fde82SSatoshi Sahara if (!$media_id) $form->addHTML(' – '); 2586c9fde82SSatoshi Sahara $form->addHTML('<bdi>'. hsc($info['sum']) .'</bdi>'); 2596c9fde82SSatoshi Sahara $form->addTagClose('span'); 2606c9fde82SSatoshi Sahara } 261*c2bf454bSSatoshi Sahara $form->addHTML(' '); 2626c9fde82SSatoshi Sahara 2636c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('user'); 2646c9fde82SSatoshi Sahara if ($info['user']) { 2656c9fde82SSatoshi Sahara $form->addHTML('<bdi>'. editorinfo($info['user']) .'</bdi>'); 2666c9fde82SSatoshi Sahara if (auth_ismanager()) { 2676c9fde82SSatoshi Sahara $form->addHTML(' <bdo dir="ltr">('. $info['ip'] .')</bdo>'); 2686c9fde82SSatoshi Sahara } 2696c9fde82SSatoshi Sahara } else { 2706c9fde82SSatoshi Sahara $form->addHTML('<bdo dir="ltr">' .$info['ip'] .'</bdo>'); 2716c9fde82SSatoshi Sahara } 2726c9fde82SSatoshi Sahara $form->addTagClose('span'); 273*c2bf454bSSatoshi Sahara $form->addHTML(' '); 2746c9fde82SSatoshi Sahara 275e34d6962SSatoshi Sahara $form->addHTML(html_sizechange($info['sizechange'])); 2766c9fde82SSatoshi Sahara 2776c9fde82SSatoshi Sahara if ($media_id) $form->addTagClose('div'); 2786c9fde82SSatoshi Sahara 2796c9fde82SSatoshi Sahara $form->addTagClose('div'); 2806c9fde82SSatoshi Sahara $form->addTagClose('li'); 2816c9fde82SSatoshi Sahara } 2826c9fde82SSatoshi Sahara 2836c9fde82SSatoshi Sahara // end of revision list 2846c9fde82SSatoshi Sahara $form->addTagClose('ul'); 2856c9fde82SSatoshi Sahara 2866c9fde82SSatoshi Sahara // show button for diff view 2876c9fde82SSatoshi Sahara if (!$media_id) { 2886c9fde82SSatoshi Sahara $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit'); 2896c9fde82SSatoshi Sahara } else { 2906c9fde82SSatoshi Sahara $form->setHiddenField('mediado', 'diff'); 2916c9fde82SSatoshi Sahara $form->addButton('', $lang['diff2'])->attr('type', 'submit'); 2926c9fde82SSatoshi Sahara } 2936c9fde82SSatoshi Sahara 2946c9fde82SSatoshi Sahara $form->addTagClose('div'); // close div class=no 2956c9fde82SSatoshi Sahara 296c29600d0SSatoshi Sahara // emit HTML_REVISIONSFORM_OUTPUT event 297c29600d0SSatoshi Sahara Event::createAndTrigger('HTML_REVISIONSFORM_OUTPUT', $form, null, false); 298c29600d0SSatoshi Sahara print $form->toHTML(); 2996c9fde82SSatoshi Sahara 3006c9fde82SSatoshi Sahara print DOKU_LF; 3016c9fde82SSatoshi Sahara 3026c9fde82SSatoshi Sahara // provide navigation for pagenated revision list (of pages and/or media files) 3036c9fde82SSatoshi Sahara print '<div class="pagenav">'; 3046c9fde82SSatoshi Sahara $last = $first + $conf['recent']; 3056c9fde82SSatoshi Sahara if ($first > 0) { 3066c9fde82SSatoshi Sahara $first = $first - $conf['recent']; 3076c9fde82SSatoshi Sahara if ($first < 0) $first = 0; 3086c9fde82SSatoshi Sahara print '<div class="pagenav-prev">'; 3096c9fde82SSatoshi Sahara if ($media_id) { 3106c9fde82SSatoshi Sahara print html_btn('newer',$media_id,"p",media_managerURL(array('first' => $first), '&', false, true)); 3116c9fde82SSatoshi Sahara } else { 3126c9fde82SSatoshi Sahara print html_btn('newer',$id,"p",array('do' => 'revisions', 'first' => $first)); 3136c9fde82SSatoshi Sahara } 3146c9fde82SSatoshi Sahara print '</div>'; 3156c9fde82SSatoshi Sahara } 3166c9fde82SSatoshi Sahara if ($hasNext) { 3176c9fde82SSatoshi Sahara print '<div class="pagenav-next">'; 3186c9fde82SSatoshi Sahara if ($media_id) { 3196c9fde82SSatoshi Sahara print html_btn('older',$media_id,"n",media_managerURL(array('first' => $last), '&', false, true)); 3206c9fde82SSatoshi Sahara } else { 3216c9fde82SSatoshi Sahara print html_btn('older',$id,"n",array('do' => 'revisions', 'first' => $last)); 3226c9fde82SSatoshi Sahara } 3236c9fde82SSatoshi Sahara print '</div>'; 3246c9fde82SSatoshi Sahara } 3256c9fde82SSatoshi Sahara print '</div>'; 3266c9fde82SSatoshi Sahara 3276c9fde82SSatoshi Sahara print DOKU_LF; 3286c9fde82SSatoshi Sahara } 3296c9fde82SSatoshi Sahara 3306c9fde82SSatoshi Sahara} 331