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 } 966c9fde82SSatoshi Sahara 976c9fde82SSatoshi Sahara // start listing 986c9fde82SSatoshi Sahara $form->addTagOpen('ul'); 996c9fde82SSatoshi Sahara 1006c9fde82SSatoshi Sahara if ($exists && $first == 0) { 1016c9fde82SSatoshi Sahara $minor = false; 1026c9fde82SSatoshi Sahara if ($media_id) { 1036c9fde82SSatoshi Sahara $date = dformat(@filemtime(mediaFN($id))); 1046c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&'); 1056c9fde82SSatoshi Sahara 1066c9fde82SSatoshi Sahara $changelog->setChunkSize(1024); 1076c9fde82SSatoshi Sahara $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id)))); 1086c9fde82SSatoshi Sahara 1096c9fde82SSatoshi Sahara $summary = $revinfo['sum']; 1106c9fde82SSatoshi Sahara $editor = $revinfo['user'] ?: $revinfo['ip']; 1116c9fde82SSatoshi Sahara $sizechange = $revinfo['sizechange']; 1126c9fde82SSatoshi Sahara } else { 1136c9fde82SSatoshi Sahara $date = dformat($INFO['lastmod']); 114*269e7027SSatoshi Sahara $sizechange = null; 1156c9fde82SSatoshi Sahara if (isset($INFO['meta']) && isset($INFO['meta']['last_change'])) { 1166c9fde82SSatoshi Sahara if ($INFO['meta']['last_change']['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { 1176c9fde82SSatoshi Sahara $minor = true; 1186c9fde82SSatoshi Sahara } 1196c9fde82SSatoshi Sahara if (isset($INFO['meta']['last_change']['sizechange'])) { 1206c9fde82SSatoshi Sahara $sizechange = $INFO['meta']['last_change']['sizechange']; 1216c9fde82SSatoshi Sahara } 1226c9fde82SSatoshi Sahara } 1236c9fde82SSatoshi Sahara $pagelog = new PageChangeLog($ID); 1246c9fde82SSatoshi Sahara $latestrev = $pagelog->getRevisions(-1, 1); 1256c9fde82SSatoshi Sahara $latestrev = array_pop($latestrev); 1266c9fde82SSatoshi Sahara $href = wl($id, "rev=$latestrev", false, '&'); 1276c9fde82SSatoshi Sahara $summary = $INFO['sum']; 1286c9fde82SSatoshi Sahara $editor = $INFO['editor']; 1296c9fde82SSatoshi Sahara } 1306c9fde82SSatoshi Sahara 1316c9fde82SSatoshi Sahara $form->addTagOpen('li')->addClass($minor ? 'minor' : ''); 1326c9fde82SSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 1336c9fde82SSatoshi Sahara $form->addCheckbox('rev2[]')->val('current'); 1346c9fde82SSatoshi Sahara 1356c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('data'); 1366c9fde82SSatoshi Sahara $form->addHTML($date); 1376c9fde82SSatoshi Sahara $form->addTagClose('span'); 1386c9fde82SSatoshi Sahara 1396c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 1406c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 1416c9fde82SSatoshi Sahara 'width' => 15, 1426c9fde82SSatoshi Sahara 'height' => 11, 1436c9fde82SSatoshi Sahara 'alt' => '', 1446c9fde82SSatoshi Sahara ]); 1456c9fde82SSatoshi Sahara 1466c9fde82SSatoshi Sahara $form->addTagOPen('a')->attr('href', $href)->addClass('wikilink1'); 1476c9fde82SSatoshi Sahara $form->addHTML($display_name); 1486c9fde82SSatoshi Sahara $form->addTagClose('a'); 1496c9fde82SSatoshi Sahara 1506c9fde82SSatoshi Sahara if ($media_id) $form->addTagOpen('div'); 1516c9fde82SSatoshi Sahara 1526c9fde82SSatoshi Sahara if ($summary) { 1536c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 1546c9fde82SSatoshi Sahara if (!$media_id) $form->addHTML(' – '); 1556c9fde82SSatoshi Sahara $form->addHTML('<bdi>' . hsc($summary) . '</bdi>'); 1566c9fde82SSatoshi Sahara $form->addTagClose('span'); 1576c9fde82SSatoshi Sahara } 1586c9fde82SSatoshi Sahara 1596c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('user'); 1606c9fde82SSatoshi Sahara $form->addHTML( 1616c9fde82SSatoshi Sahara (empty($editor)) ? ('('.$lang['external_edit'].')') : '<bdi>'.editorinfo($editor).'</bdi>' 1626c9fde82SSatoshi Sahara ); 1636c9fde82SSatoshi Sahara $form->addTagClose('span'); 1646c9fde82SSatoshi Sahara 1656c9fde82SSatoshi Sahara 1666c9fde82SSatoshi Sahara html_sizechange($sizechange, $form); 1676c9fde82SSatoshi Sahara 1686c9fde82SSatoshi Sahara $form->addHTML('('.$lang['current'].')'); 1696c9fde82SSatoshi Sahara 1706c9fde82SSatoshi Sahara if ($media_id) $form->addTagClose('div'); 1716c9fde82SSatoshi Sahara 1726c9fde82SSatoshi Sahara $form->addTagClose('div'); 1736c9fde82SSatoshi Sahara $form->addTagClose('li'); 1746c9fde82SSatoshi Sahara } 1756c9fde82SSatoshi Sahara 1766c9fde82SSatoshi Sahara foreach ($revisions as $rev) { 1776c9fde82SSatoshi Sahara $date = dformat($rev); 1786c9fde82SSatoshi Sahara $info = $changelog->getRevisionInfo($rev); 1796c9fde82SSatoshi Sahara if ($media_id) { 1806c9fde82SSatoshi Sahara $exists = file_exists(mediaFN($id, $rev)); 1816c9fde82SSatoshi Sahara } else { 1826c9fde82SSatoshi Sahara $exists = page_exists($id, $rev); 1836c9fde82SSatoshi Sahara } 1846c9fde82SSatoshi Sahara 1856c9fde82SSatoshi Sahara $class = ''; 1866c9fde82SSatoshi Sahara if ($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { 1876c9fde82SSatoshi Sahara $class = 'minor'; 1886c9fde82SSatoshi Sahara } 1896c9fde82SSatoshi Sahara 1906c9fde82SSatoshi Sahara $form->addTagOpen('li')->addClass($class); 1916c9fde82SSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 1926c9fde82SSatoshi Sahara 1936c9fde82SSatoshi Sahara if ($exists){ 1946c9fde82SSatoshi Sahara $form->addCheckbox('rev2[]')->val($rev); 1956c9fde82SSatoshi Sahara } else { 1966c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 1976c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 1986c9fde82SSatoshi Sahara 'width' => 15, 1996c9fde82SSatoshi Sahara 'height' => 11, 2006c9fde82SSatoshi Sahara 'alt' => '', 2016c9fde82SSatoshi Sahara ]); 2026c9fde82SSatoshi Sahara } 2036c9fde82SSatoshi Sahara 2046c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('date'); 2056c9fde82SSatoshi Sahara $form->addHTML($date); 2066c9fde82SSatoshi Sahara $form->addTagClose('span'); 2076c9fde82SSatoshi Sahara 2086c9fde82SSatoshi Sahara if ($exists) { 2096c9fde82SSatoshi Sahara if (!$media_id) { 2106c9fde82SSatoshi Sahara $href = wl($id, "rev=$rev,do=diff", false, '&'); 2116c9fde82SSatoshi Sahara } else { 2126c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&'); 2136c9fde82SSatoshi Sahara } 2146c9fde82SSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('diff_link'); 2156c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 2166c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/diff.png', 2176c9fde82SSatoshi Sahara 'width' => 15, 2186c9fde82SSatoshi Sahara 'height' => 11, 2196c9fde82SSatoshi Sahara 'title' => $lang['diff'], 2206c9fde82SSatoshi Sahara 'alt' => $lang['diff'], 2216c9fde82SSatoshi Sahara ]); 2226c9fde82SSatoshi Sahara $form->addTagClose('a'); 2236c9fde82SSatoshi Sahara 2246c9fde82SSatoshi Sahara if (!$media_id) { 2256c9fde82SSatoshi Sahara $href = wl($id, "rev=$rev", false, '&'); 2266c9fde82SSatoshi Sahara } else { 2276c9fde82SSatoshi Sahara $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&'); 2286c9fde82SSatoshi Sahara } 2296c9fde82SSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('wikilink1'); 2306c9fde82SSatoshi Sahara $form->addHTML($display_name); 2316c9fde82SSatoshi Sahara $form->addTagClose('a'); 2326c9fde82SSatoshi Sahara } else { 2336c9fde82SSatoshi Sahara $form->addTag('img')->attrs([ 2346c9fde82SSatoshi Sahara 'src' => DOKU_BASE.'lib/images/blank.gif', 2356c9fde82SSatoshi Sahara 'width' => 15, 2366c9fde82SSatoshi Sahara 'height' => 11, 2376c9fde82SSatoshi Sahara 'alt' => '', 2386c9fde82SSatoshi Sahara ]); 2396c9fde82SSatoshi Sahara $form->addHTML($display_name); 2406c9fde82SSatoshi Sahara } 2416c9fde82SSatoshi Sahara 2426c9fde82SSatoshi Sahara if ($media_id) $form->addTagOpen('div'); 2436c9fde82SSatoshi Sahara 2446c9fde82SSatoshi Sahara if ($info['sum']) { 2456c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 2466c9fde82SSatoshi Sahara if (!$media_id) $form->addHTML(' – '); 2476c9fde82SSatoshi Sahara $form->addHTML('<bdi>'. hsc($info['sum']) .'</bdi>'); 2486c9fde82SSatoshi Sahara $form->addTagClose('span'); 2496c9fde82SSatoshi Sahara } 2506c9fde82SSatoshi Sahara 2516c9fde82SSatoshi Sahara $form->addTagOpen('span')->addClass('user'); 2526c9fde82SSatoshi Sahara if ($info['user']) { 2536c9fde82SSatoshi Sahara $form->addHTML('<bdi>'. editorinfo($info['user']) .'</bdi>'); 2546c9fde82SSatoshi Sahara if (auth_ismanager()) { 2556c9fde82SSatoshi Sahara $form->addHTML(' <bdo dir="ltr">('. $info['ip'] .')</bdo>'); 2566c9fde82SSatoshi Sahara } 2576c9fde82SSatoshi Sahara } else { 2586c9fde82SSatoshi Sahara $form->addHTML('<bdo dir="ltr">' .$info['ip'] .'</bdo>'); 2596c9fde82SSatoshi Sahara } 2606c9fde82SSatoshi Sahara $form->addTagClose('span'); 2616c9fde82SSatoshi Sahara 2626c9fde82SSatoshi Sahara html_sizechange($info['sizechange'], $form); 2636c9fde82SSatoshi Sahara 2646c9fde82SSatoshi Sahara if ($media_id) $form->addTagClose('div'); 2656c9fde82SSatoshi Sahara 2666c9fde82SSatoshi Sahara $form->addTagClose('div'); 2676c9fde82SSatoshi Sahara $form->addTagClose('li'); 2686c9fde82SSatoshi Sahara } 2696c9fde82SSatoshi Sahara 2706c9fde82SSatoshi Sahara // end of revision list 2716c9fde82SSatoshi Sahara $form->addTagClose('ul'); 2726c9fde82SSatoshi Sahara 2736c9fde82SSatoshi Sahara // show button for diff view 2746c9fde82SSatoshi Sahara if (!$media_id) { 2756c9fde82SSatoshi Sahara $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit'); 2766c9fde82SSatoshi Sahara } else { 2776c9fde82SSatoshi Sahara $form->setHiddenField('mediado', 'diff'); 2786c9fde82SSatoshi Sahara $form->addButton('', $lang['diff2'])->attr('type', 'submit'); 2796c9fde82SSatoshi Sahara } 2806c9fde82SSatoshi Sahara 2816c9fde82SSatoshi Sahara $form->addTagClose('div'); // close div class=no 2826c9fde82SSatoshi Sahara 2836c9fde82SSatoshi Sahara // emit HTML_REVISIONSFORM_OUTPUT event, print the form 2846c9fde82SSatoshi Sahara Event::createAndTrigger('HTML_REVISIONSFORM_OUTPUT', $form, 'html_form_output', false); 2856c9fde82SSatoshi Sahara 2866c9fde82SSatoshi Sahara print DOKU_LF; 2876c9fde82SSatoshi Sahara 2886c9fde82SSatoshi Sahara // provide navigation for pagenated revision list (of pages and/or media files) 2896c9fde82SSatoshi Sahara print '<div class="pagenav">'; 2906c9fde82SSatoshi Sahara $last = $first + $conf['recent']; 2916c9fde82SSatoshi Sahara if ($first > 0) { 2926c9fde82SSatoshi Sahara $first = $first - $conf['recent']; 2936c9fde82SSatoshi Sahara if ($first < 0) $first = 0; 2946c9fde82SSatoshi Sahara print '<div class="pagenav-prev">'; 2956c9fde82SSatoshi Sahara if ($media_id) { 2966c9fde82SSatoshi Sahara print html_btn('newer',$media_id,"p",media_managerURL(array('first' => $first), '&', false, true)); 2976c9fde82SSatoshi Sahara } else { 2986c9fde82SSatoshi Sahara print html_btn('newer',$id,"p",array('do' => 'revisions', 'first' => $first)); 2996c9fde82SSatoshi Sahara } 3006c9fde82SSatoshi Sahara print '</div>'; 3016c9fde82SSatoshi Sahara } 3026c9fde82SSatoshi Sahara if ($hasNext) { 3036c9fde82SSatoshi Sahara print '<div class="pagenav-next">'; 3046c9fde82SSatoshi Sahara if ($media_id) { 3056c9fde82SSatoshi Sahara print html_btn('older',$media_id,"n",media_managerURL(array('first' => $last), '&', false, true)); 3066c9fde82SSatoshi Sahara } else { 3076c9fde82SSatoshi Sahara print html_btn('older',$id,"n",array('do' => 'revisions', 'first' => $last)); 3086c9fde82SSatoshi Sahara } 3096c9fde82SSatoshi Sahara print '</div>'; 3106c9fde82SSatoshi Sahara } 3116c9fde82SSatoshi Sahara print '</div>'; 3126c9fde82SSatoshi Sahara 3136c9fde82SSatoshi Sahara print DOKU_LF; 3146c9fde82SSatoshi Sahara } 3156c9fde82SSatoshi Sahara 3166c9fde82SSatoshi Sahara} 317