13d7df1dcSSatoshi Sahara<?php 23d7df1dcSSatoshi Sahara 33d7df1dcSSatoshi Saharanamespace dokuwiki\Ui; 43d7df1dcSSatoshi Sahara 53d7df1dcSSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog; 63d7df1dcSSatoshi Saharause dokuwiki\Extension\Event; 73d7df1dcSSatoshi Saharause dokuwiki\Form\Form; 83d7df1dcSSatoshi Sahara 93d7df1dcSSatoshi Sahara/** 10*9e316641SSatoshi Sahara * DokuWiki Recent Interface 113d7df1dcSSatoshi Sahara * 123d7df1dcSSatoshi Sahara * @package dokuwiki\Ui 133d7df1dcSSatoshi Sahara */ 143d7df1dcSSatoshi Saharaclass Recent extends Ui 153d7df1dcSSatoshi Sahara{ 16*9e316641SSatoshi Sahara protected $first; 17*9e316641SSatoshi Sahara protected $show_changes; 18*9e316641SSatoshi Sahara 19*9e316641SSatoshi Sahara /** 20*9e316641SSatoshi Sahara * Recent Ui constructor 21*9e316641SSatoshi Sahara * 22*9e316641SSatoshi Sahara * @param int $first skip the first n changelog lines 23*9e316641SSatoshi Sahara * @param string $show_changes type of changes to show; pages, mediafiles, or both 24*9e316641SSatoshi Sahara */ 25*9e316641SSatoshi Sahara public function __construct($first = 0, $show_changes = 'both') 26*9e316641SSatoshi Sahara { 27*9e316641SSatoshi Sahara $this->first = $first; 28*9e316641SSatoshi Sahara $this->show_changes = $show_changes; 29*9e316641SSatoshi Sahara } 30*9e316641SSatoshi Sahara 313d7df1dcSSatoshi Sahara /** 323d7df1dcSSatoshi Sahara * Display recent changes 333d7df1dcSSatoshi Sahara * 343d7df1dcSSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 353d7df1dcSSatoshi Sahara * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 363d7df1dcSSatoshi Sahara * @author Ben Coburn <btcoburn@silicodon.net> 373d7df1dcSSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 383d7df1dcSSatoshi Sahara * 393d7df1dcSSatoshi Sahara * @triggers HTML_RECENTFORM_OUTPUT 403d7df1dcSSatoshi Sahara * @return void 413d7df1dcSSatoshi Sahara */ 42*9e316641SSatoshi Sahara public function show() 433d7df1dcSSatoshi Sahara { 443d7df1dcSSatoshi Sahara global $conf; 453d7df1dcSSatoshi Sahara global $lang; 463d7df1dcSSatoshi Sahara global $ID; 473d7df1dcSSatoshi Sahara 48*9e316641SSatoshi Sahara $first = $this->first; 49*9e316641SSatoshi Sahara $show_changes = $this->show_changes; 50*9e316641SSatoshi Sahara 513d7df1dcSSatoshi Sahara /* we need to get one additionally log entry to be able to 523d7df1dcSSatoshi Sahara * decide if this is the last page or is there another one. 533d7df1dcSSatoshi Sahara * This is the cheapest solution to get this information. 543d7df1dcSSatoshi Sahara */ 553d7df1dcSSatoshi Sahara $flags = 0; 563d7df1dcSSatoshi Sahara if ($show_changes == 'mediafiles' && $conf['mediarevisions']) { 573d7df1dcSSatoshi Sahara $flags = RECENTS_MEDIA_CHANGES; 583d7df1dcSSatoshi Sahara } elseif ($show_changes == 'pages') { 593d7df1dcSSatoshi Sahara $flags = 0; 603d7df1dcSSatoshi Sahara } elseif ($conf['mediarevisions']) { 613d7df1dcSSatoshi Sahara $show_changes = 'both'; 623d7df1dcSSatoshi Sahara $flags = RECENTS_MEDIA_PAGES_MIXED; 633d7df1dcSSatoshi Sahara } 643d7df1dcSSatoshi Sahara 653d7df1dcSSatoshi Sahara $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); 663d7df1dcSSatoshi Sahara if (count($recents) == 0 && $first != 0) { 673d7df1dcSSatoshi Sahara $first = 0; 683d7df1dcSSatoshi Sahara $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); 693d7df1dcSSatoshi Sahara } 703d7df1dcSSatoshi Sahara 713d7df1dcSSatoshi Sahara $hasNext = false; 723d7df1dcSSatoshi Sahara if (count($recents) > $conf['recent']) { 733d7df1dcSSatoshi Sahara $hasNext = true; 743d7df1dcSSatoshi Sahara array_pop($recents); // remove extra log entry 753d7df1dcSSatoshi Sahara } 763d7df1dcSSatoshi Sahara 773d7df1dcSSatoshi Sahara // print intro 783d7df1dcSSatoshi Sahara print p_locale_xhtml('recent'); 793d7df1dcSSatoshi Sahara 803d7df1dcSSatoshi Sahara if (getNS($ID) != '') { 813d7df1dcSSatoshi Sahara print '<div class="level1"><p>' 823d7df1dcSSatoshi Sahara . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) 833d7df1dcSSatoshi Sahara .'</p></div>'; 843d7df1dcSSatoshi Sahara } 853d7df1dcSSatoshi Sahara 863d7df1dcSSatoshi Sahara // create the form 873d7df1dcSSatoshi Sahara $form = new Form(['id' => 'dw__recent', 'method' => 'GET', 'action'=>wl($ID)]); 883d7df1dcSSatoshi Sahara $form->addClass('changes'); 893d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('no'); 903d7df1dcSSatoshi Sahara $form->setHiddenField('sectok', null); 913d7df1dcSSatoshi Sahara $form->setHiddenField('do', 'recent'); 923d7df1dcSSatoshi Sahara $form->setHiddenField('id', $ID); 933d7df1dcSSatoshi Sahara 943d7df1dcSSatoshi Sahara // show dropdown selector, whether include not only recent pages but also recent media files? 953d7df1dcSSatoshi Sahara if ($conf['mediarevisions']) { 963d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('changeType'); 973d7df1dcSSatoshi Sahara $options = array( 983d7df1dcSSatoshi Sahara 'pages' => $lang['pages_changes'], 993d7df1dcSSatoshi Sahara 'mediafiles' => $lang['media_changes'], 1003d7df1dcSSatoshi Sahara 'both' => $lang['both_changes'], 1013d7df1dcSSatoshi Sahara ); 1023d7df1dcSSatoshi Sahara $form->addDropdown('show_changes', $options, $lang['changes_type']) 1033d7df1dcSSatoshi Sahara ->val($show_changes)->addClass('quickselect'); 1043d7df1dcSSatoshi Sahara $form->addButton('do[recent]', $lang['btn_apply'])->attr('type','submit'); 1053d7df1dcSSatoshi Sahara $form->addTagClose('div'); 1063d7df1dcSSatoshi Sahara } 1073d7df1dcSSatoshi Sahara 1083d7df1dcSSatoshi Sahara // start listing 1093d7df1dcSSatoshi Sahara $form->addTagOpen('ul'); 1103d7df1dcSSatoshi Sahara 1113d7df1dcSSatoshi Sahara foreach ($recents as $recent) { 1123d7df1dcSSatoshi Sahara $date = dformat($recent['date']); 1133d7df1dcSSatoshi Sahara $class = ($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor': ''; 1143d7df1dcSSatoshi Sahara 1153d7df1dcSSatoshi Sahara $form->addTagOpen('li')->addClass($class); 1163d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 1173d7df1dcSSatoshi Sahara 1183d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 1193d7df1dcSSatoshi Sahara $form->addHTML(media_printicon($recent['id'])); 1203d7df1dcSSatoshi Sahara } else { 1213d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 1223d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/fileicons/file.png', 1233d7df1dcSSatoshi Sahara 'alt' => $recent['id'] 1243d7df1dcSSatoshi Sahara ])->addClass('icon'); 1253d7df1dcSSatoshi Sahara } 1263d7df1dcSSatoshi Sahara 1273d7df1dcSSatoshi Sahara $form->addTagOpen('span')->addClass('date'); 1283d7df1dcSSatoshi Sahara $form->addHTML($date); 1293d7df1dcSSatoshi Sahara $form->addTagClose('span'); 1303d7df1dcSSatoshi Sahara 1313d7df1dcSSatoshi Sahara $diff = false; 1323d7df1dcSSatoshi Sahara $href = ''; 1333d7df1dcSSatoshi Sahara 1343d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 1353d7df1dcSSatoshi Sahara $changelog = new MediaChangeLog($recent['id']); 1363d7df1dcSSatoshi Sahara $revs = $changelog->getRevisions(0, 1); 1373d7df1dcSSatoshi Sahara $diff = (count($revs) && file_exists(mediaFN($recent['id']))); 1383d7df1dcSSatoshi Sahara if ($diff) { 1393d7df1dcSSatoshi Sahara $href = media_managerURL( 1403d7df1dcSSatoshi Sahara array( 1413d7df1dcSSatoshi Sahara 'tab_details' => 'history', 1423d7df1dcSSatoshi Sahara 'mediado' => 'diff', 1433d7df1dcSSatoshi Sahara 'image' => $recent['id'], 1443d7df1dcSSatoshi Sahara 'ns' => getNS($recent['id']) 1453d7df1dcSSatoshi Sahara ), '&' 1463d7df1dcSSatoshi Sahara ); 1473d7df1dcSSatoshi Sahara } 1483d7df1dcSSatoshi Sahara } else { 1493d7df1dcSSatoshi Sahara $href = wl($recent['id'], "do=diff", false, '&'); 1503d7df1dcSSatoshi Sahara } 1513d7df1dcSSatoshi Sahara 1523d7df1dcSSatoshi Sahara if (!empty($recent['media']) && !$diff) { 1533d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 1543d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/blank.gif', 1553d7df1dcSSatoshi Sahara 'width' => 15, 1563d7df1dcSSatoshi Sahara 'height' => 11, 1573d7df1dcSSatoshi Sahara 'alt' => '', 1583d7df1dcSSatoshi Sahara ]); 1593d7df1dcSSatoshi Sahara } else { 1603d7df1dcSSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('diff_link'); 1613d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 1623d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/diff.png', 1633d7df1dcSSatoshi Sahara 'width' => 15, 1643d7df1dcSSatoshi Sahara 'height' => 11, 1653d7df1dcSSatoshi Sahara 'title' => $lang['diff'], 1663d7df1dcSSatoshi Sahara 'alt' => $lang['diff'], 1673d7df1dcSSatoshi Sahara ]); 1683d7df1dcSSatoshi Sahara $form->addTagClose('a'); 1693d7df1dcSSatoshi Sahara } 1703d7df1dcSSatoshi Sahara 1713d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 1723d7df1dcSSatoshi Sahara $href = media_managerURL( 1733d7df1dcSSatoshi Sahara array( 1743d7df1dcSSatoshi Sahara 'tab_details' => 'history', 1753d7df1dcSSatoshi Sahara 'image' => $recent['id'], 1763d7df1dcSSatoshi Sahara 'ns' => getNS($recent['id']) 1773d7df1dcSSatoshi Sahara ), '&' 1783d7df1dcSSatoshi Sahara ); 1793d7df1dcSSatoshi Sahara } else { 1803d7df1dcSSatoshi Sahara $href = wl($recent['id'], "do=revisions", false, '&'); 1813d7df1dcSSatoshi Sahara } 1823d7df1dcSSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('revisions_link'); 1833d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 1843d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/history.png', 1853d7df1dcSSatoshi Sahara 'width' => 12, 1863d7df1dcSSatoshi Sahara 'height' => 14, 1873d7df1dcSSatoshi Sahara 'title' => $lang['btn_revs'], 1883d7df1dcSSatoshi Sahara 'alt' => $lang['btn_revs'] 1893d7df1dcSSatoshi Sahara ]); 1903d7df1dcSSatoshi Sahara $form->addTagClose('a'); 1913d7df1dcSSatoshi Sahara 1923d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 1933d7df1dcSSatoshi Sahara $href = media_managerURL( 1943d7df1dcSSatoshi Sahara array( 1953d7df1dcSSatoshi Sahara 'tab_details' => 'view', 1963d7df1dcSSatoshi Sahara 'image' => $recent['id'], 1973d7df1dcSSatoshi Sahara 'ns' => getNS($recent['id']) 1983d7df1dcSSatoshi Sahara ), '&' 1993d7df1dcSSatoshi Sahara ); 2003d7df1dcSSatoshi Sahara $class = file_exists(mediaFN($recent['id'])) ? 'wikilink1' : 'wikilink2'; 2013d7df1dcSSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass($class); 2023d7df1dcSSatoshi Sahara $form->addHTML($recent['id']); 2033d7df1dcSSatoshi Sahara $form->addTagClose('a'); 2043d7df1dcSSatoshi Sahara } else { 2053d7df1dcSSatoshi Sahara $form->addHTML(html_wikilink(':'. $recent['id'], useHeading('navigation') ? null : $recent['id'])); 2063d7df1dcSSatoshi Sahara } 2073d7df1dcSSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 2083d7df1dcSSatoshi Sahara $form->addHTML(' – '. hsc($recent['sum'])); 2093d7df1dcSSatoshi Sahara $form->addTagClose('span'); 2103d7df1dcSSatoshi Sahara 2113d7df1dcSSatoshi Sahara $form->addTagOPen('span')->addClass('user'); 2123d7df1dcSSatoshi Sahara if ($recent['user']) { 2133d7df1dcSSatoshi Sahara $form->addHTML('<bdi>'. editorinfo($recent['user']) .'</bdi>'); 2143d7df1dcSSatoshi Sahara if (auth_ismanager()) { 2153d7df1dcSSatoshi Sahara $form->addHTML(' <bdo dir="ltr">('. $recent['ip'] .')</bdo>'); 2163d7df1dcSSatoshi Sahara } 2173d7df1dcSSatoshi Sahara } else { 2183d7df1dcSSatoshi Sahara $form->addHTML('<bdo dir="ltr">'. $recent['ip'] .'</bdo>'); 2193d7df1dcSSatoshi Sahara } 2203d7df1dcSSatoshi Sahara $form->addTagClose('span'); 2213d7df1dcSSatoshi Sahara 2223d7df1dcSSatoshi Sahara html_sizechange($recent['sizechange'], $form); 2233d7df1dcSSatoshi Sahara 2243d7df1dcSSatoshi Sahara $form->addTagClose('div'); 2253d7df1dcSSatoshi Sahara $form->addTagClose('li'); 2263d7df1dcSSatoshi Sahara } 2273d7df1dcSSatoshi Sahara 2283d7df1dcSSatoshi Sahara $form->addTagClose('ul'); 2293d7df1dcSSatoshi Sahara 2303d7df1dcSSatoshi Sahara // provide navigation for pagenated cecent list (of pages and/or media files) 2313d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('pagenav'); 2323d7df1dcSSatoshi Sahara $last = $first + $conf['recent']; 2333d7df1dcSSatoshi Sahara if ($first > 0) { 2346c9fde82SSatoshi Sahara $first = $first - $conf['recent']; 2353d7df1dcSSatoshi Sahara if ($first < 0) $first = 0; 2363d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('pagenav-prev'); 2373d7df1dcSSatoshi Sahara $form->addTagOpen('button')->attrs([ 2383d7df1dcSSatoshi Sahara 'type' => 'submit', 2393d7df1dcSSatoshi Sahara 'name' => 'first['. $first .']', 2403d7df1dcSSatoshi Sahara 'accesskey' => 'n', 2413d7df1dcSSatoshi Sahara 'title' => $lang['btn_newer'] .' [N]', 2423d7df1dcSSatoshi Sahara ])->addClass('button show'); 2433d7df1dcSSatoshi Sahara $form->addHTML($lang['btn_newer']); 2443d7df1dcSSatoshi Sahara $form->addTagClose('button'); 2453d7df1dcSSatoshi Sahara $form->addTagClose('div'); 2463d7df1dcSSatoshi Sahara } 2473d7df1dcSSatoshi Sahara if ($hasNext) { 2483d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('pagenav-next'); 2493d7df1dcSSatoshi Sahara $form->addTagOpen('button')->attrs([ 2503d7df1dcSSatoshi Sahara 'type' => 'submit', 2513d7df1dcSSatoshi Sahara 'name' => 'first['. $last .']', 2523d7df1dcSSatoshi Sahara 'accesskey' => 'p', 2533d7df1dcSSatoshi Sahara 'title' => $lang['btn_older'] .' [P]', 2543d7df1dcSSatoshi Sahara ])->addClass('button show'); 2553d7df1dcSSatoshi Sahara $form->addHTML($lang['btn_older']); 2563d7df1dcSSatoshi Sahara $form->addTagClose('button'); 2573d7df1dcSSatoshi Sahara $form->addTagClose('div'); 2583d7df1dcSSatoshi Sahara } 2593d7df1dcSSatoshi Sahara $form->addTagClose('div'); 2603d7df1dcSSatoshi Sahara 2613d7df1dcSSatoshi Sahara $form->addTagClose('div'); // close div class=no 2623d7df1dcSSatoshi Sahara 2633d7df1dcSSatoshi Sahara // emit HTML_CRECENTFORM_OUTPUT event, print the form 2643d7df1dcSSatoshi Sahara Event::createAndTrigger('HTML_RECENTFORM_OUTPUT', $form, 'html_form_output', false); 2653d7df1dcSSatoshi Sahara 2663d7df1dcSSatoshi Sahara print DOKU_LF; 2673d7df1dcSSatoshi Sahara } 2683d7df1dcSSatoshi Sahara 2693d7df1dcSSatoshi Sahara} 270