1*3d7df1dcSSatoshi Sahara<?php 2*3d7df1dcSSatoshi Sahara 3*3d7df1dcSSatoshi Saharanamespace dokuwiki\Ui; 4*3d7df1dcSSatoshi Sahara 5*3d7df1dcSSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog; 6*3d7df1dcSSatoshi Saharause dokuwiki\Extension\Event; 7*3d7df1dcSSatoshi Saharause dokuwiki\Form\Form; 8*3d7df1dcSSatoshi Sahara 9*3d7df1dcSSatoshi Sahara/** 10*3d7df1dcSSatoshi Sahara * DokuWiki Recent Insterface 11*3d7df1dcSSatoshi Sahara * 12*3d7df1dcSSatoshi Sahara * @package dokuwiki\Ui 13*3d7df1dcSSatoshi Sahara */ 14*3d7df1dcSSatoshi Saharaclass Recent extends Ui 15*3d7df1dcSSatoshi Sahara{ 16*3d7df1dcSSatoshi Sahara /** 17*3d7df1dcSSatoshi Sahara * Display recent changes 18*3d7df1dcSSatoshi Sahara * 19*3d7df1dcSSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 20*3d7df1dcSSatoshi Sahara * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net> 21*3d7df1dcSSatoshi Sahara * @author Ben Coburn <btcoburn@silicodon.net> 22*3d7df1dcSSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 23*3d7df1dcSSatoshi Sahara * 24*3d7df1dcSSatoshi Sahara * @triggers HTML_RECENTFORM_OUTPUT 25*3d7df1dcSSatoshi Sahara * @param int $first skip the first n changelog lines 26*3d7df1dcSSatoshi Sahara * @param string $show_changes 27*3d7df1dcSSatoshi Sahara * @return void 28*3d7df1dcSSatoshi Sahara */ 29*3d7df1dcSSatoshi Sahara public function show($first = 0, $show_changes = 'both') 30*3d7df1dcSSatoshi Sahara { 31*3d7df1dcSSatoshi Sahara global $conf; 32*3d7df1dcSSatoshi Sahara global $lang; 33*3d7df1dcSSatoshi Sahara global $ID; 34*3d7df1dcSSatoshi Sahara 35*3d7df1dcSSatoshi Sahara /* we need to get one additionally log entry to be able to 36*3d7df1dcSSatoshi Sahara * decide if this is the last page or is there another one. 37*3d7df1dcSSatoshi Sahara * This is the cheapest solution to get this information. 38*3d7df1dcSSatoshi Sahara */ 39*3d7df1dcSSatoshi Sahara $flags = 0; 40*3d7df1dcSSatoshi Sahara if ($show_changes == 'mediafiles' && $conf['mediarevisions']) { 41*3d7df1dcSSatoshi Sahara $flags = RECENTS_MEDIA_CHANGES; 42*3d7df1dcSSatoshi Sahara } elseif ($show_changes == 'pages') { 43*3d7df1dcSSatoshi Sahara $flags = 0; 44*3d7df1dcSSatoshi Sahara } elseif ($conf['mediarevisions']) { 45*3d7df1dcSSatoshi Sahara $show_changes = 'both'; 46*3d7df1dcSSatoshi Sahara $flags = RECENTS_MEDIA_PAGES_MIXED; 47*3d7df1dcSSatoshi Sahara } 48*3d7df1dcSSatoshi Sahara 49*3d7df1dcSSatoshi Sahara $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); 50*3d7df1dcSSatoshi Sahara if (count($recents) == 0 && $first != 0) { 51*3d7df1dcSSatoshi Sahara $first = 0; 52*3d7df1dcSSatoshi Sahara $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); 53*3d7df1dcSSatoshi Sahara } 54*3d7df1dcSSatoshi Sahara 55*3d7df1dcSSatoshi Sahara $hasNext = false; 56*3d7df1dcSSatoshi Sahara if (count($recents) > $conf['recent']) { 57*3d7df1dcSSatoshi Sahara $hasNext = true; 58*3d7df1dcSSatoshi Sahara array_pop($recents); // remove extra log entry 59*3d7df1dcSSatoshi Sahara } 60*3d7df1dcSSatoshi Sahara 61*3d7df1dcSSatoshi Sahara // print intro 62*3d7df1dcSSatoshi Sahara print p_locale_xhtml('recent'); 63*3d7df1dcSSatoshi Sahara 64*3d7df1dcSSatoshi Sahara if (getNS($ID) != '') { 65*3d7df1dcSSatoshi Sahara print '<div class="level1"><p>' 66*3d7df1dcSSatoshi Sahara . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) 67*3d7df1dcSSatoshi Sahara .'</p></div>'; 68*3d7df1dcSSatoshi Sahara } 69*3d7df1dcSSatoshi Sahara 70*3d7df1dcSSatoshi Sahara // create the form 71*3d7df1dcSSatoshi Sahara $form = new Form(['id' => 'dw__recent', 'method' => 'GET', 'action'=>wl($ID)]); 72*3d7df1dcSSatoshi Sahara $form->addClass('changes'); 73*3d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('no'); 74*3d7df1dcSSatoshi Sahara $form->setHiddenField('sectok', null); 75*3d7df1dcSSatoshi Sahara $form->setHiddenField('do', 'recent'); 76*3d7df1dcSSatoshi Sahara $form->setHiddenField('id', $ID); 77*3d7df1dcSSatoshi Sahara 78*3d7df1dcSSatoshi Sahara // show dropdown selector, whether include not only recent pages but also recent media files? 79*3d7df1dcSSatoshi Sahara if ($conf['mediarevisions']) { 80*3d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('changeType'); 81*3d7df1dcSSatoshi Sahara $options = array( 82*3d7df1dcSSatoshi Sahara 'pages' => $lang['pages_changes'], 83*3d7df1dcSSatoshi Sahara 'mediafiles' => $lang['media_changes'], 84*3d7df1dcSSatoshi Sahara 'both' => $lang['both_changes'], 85*3d7df1dcSSatoshi Sahara ); 86*3d7df1dcSSatoshi Sahara $form->addDropdown('show_changes', $options, $lang['changes_type']) 87*3d7df1dcSSatoshi Sahara ->val($show_changes)->addClass('quickselect'); 88*3d7df1dcSSatoshi Sahara $form->addButton('do[recent]', $lang['btn_apply'])->attr('type','submit'); 89*3d7df1dcSSatoshi Sahara $form->addTagClose('div'); 90*3d7df1dcSSatoshi Sahara } 91*3d7df1dcSSatoshi Sahara 92*3d7df1dcSSatoshi Sahara // start listing 93*3d7df1dcSSatoshi Sahara $form->addTagOpen('ul'); 94*3d7df1dcSSatoshi Sahara 95*3d7df1dcSSatoshi Sahara foreach ($recents as $recent) { 96*3d7df1dcSSatoshi Sahara $date = dformat($recent['date']); 97*3d7df1dcSSatoshi Sahara $class = ($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor': ''; 98*3d7df1dcSSatoshi Sahara 99*3d7df1dcSSatoshi Sahara $form->addTagOpen('li')->addClass($class); 100*3d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 101*3d7df1dcSSatoshi Sahara 102*3d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 103*3d7df1dcSSatoshi Sahara $form->addHTML(media_printicon($recent['id'])); 104*3d7df1dcSSatoshi Sahara } else { 105*3d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 106*3d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/fileicons/file.png', 107*3d7df1dcSSatoshi Sahara 'alt' => $recent['id'] 108*3d7df1dcSSatoshi Sahara ])->addClass('icon'); 109*3d7df1dcSSatoshi Sahara } 110*3d7df1dcSSatoshi Sahara 111*3d7df1dcSSatoshi Sahara $form->addTagOpen('span')->addClass('date'); 112*3d7df1dcSSatoshi Sahara $form->addHTML($date); 113*3d7df1dcSSatoshi Sahara $form->addTagClose('span'); 114*3d7df1dcSSatoshi Sahara 115*3d7df1dcSSatoshi Sahara $diff = false; 116*3d7df1dcSSatoshi Sahara $href = ''; 117*3d7df1dcSSatoshi Sahara 118*3d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 119*3d7df1dcSSatoshi Sahara $changelog = new MediaChangeLog($recent['id']); 120*3d7df1dcSSatoshi Sahara $revs = $changelog->getRevisions(0, 1); 121*3d7df1dcSSatoshi Sahara $diff = (count($revs) && file_exists(mediaFN($recent['id']))); 122*3d7df1dcSSatoshi Sahara if ($diff) { 123*3d7df1dcSSatoshi Sahara $href = media_managerURL( 124*3d7df1dcSSatoshi Sahara array( 125*3d7df1dcSSatoshi Sahara 'tab_details' => 'history', 126*3d7df1dcSSatoshi Sahara 'mediado' => 'diff', 127*3d7df1dcSSatoshi Sahara 'image' => $recent['id'], 128*3d7df1dcSSatoshi Sahara 'ns' => getNS($recent['id']) 129*3d7df1dcSSatoshi Sahara ), '&' 130*3d7df1dcSSatoshi Sahara ); 131*3d7df1dcSSatoshi Sahara } 132*3d7df1dcSSatoshi Sahara } else { 133*3d7df1dcSSatoshi Sahara $href = wl($recent['id'], "do=diff", false, '&'); 134*3d7df1dcSSatoshi Sahara } 135*3d7df1dcSSatoshi Sahara 136*3d7df1dcSSatoshi Sahara if (!empty($recent['media']) && !$diff) { 137*3d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 138*3d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/blank.gif', 139*3d7df1dcSSatoshi Sahara 'width' => 15, 140*3d7df1dcSSatoshi Sahara 'height' => 11, 141*3d7df1dcSSatoshi Sahara 'alt' => '', 142*3d7df1dcSSatoshi Sahara ]); 143*3d7df1dcSSatoshi Sahara } else { 144*3d7df1dcSSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('diff_link'); 145*3d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 146*3d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/diff.png', 147*3d7df1dcSSatoshi Sahara 'width' => 15, 148*3d7df1dcSSatoshi Sahara 'height' => 11, 149*3d7df1dcSSatoshi Sahara 'title' => $lang['diff'], 150*3d7df1dcSSatoshi Sahara 'alt' => $lang['diff'], 151*3d7df1dcSSatoshi Sahara ]); 152*3d7df1dcSSatoshi Sahara $form->addTagClose('a'); 153*3d7df1dcSSatoshi Sahara } 154*3d7df1dcSSatoshi Sahara 155*3d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 156*3d7df1dcSSatoshi Sahara $href = media_managerURL( 157*3d7df1dcSSatoshi Sahara array( 158*3d7df1dcSSatoshi Sahara 'tab_details' => 'history', 159*3d7df1dcSSatoshi Sahara 'image' => $recent['id'], 160*3d7df1dcSSatoshi Sahara 'ns' => getNS($recent['id']) 161*3d7df1dcSSatoshi Sahara ), '&' 162*3d7df1dcSSatoshi Sahara ); 163*3d7df1dcSSatoshi Sahara } else { 164*3d7df1dcSSatoshi Sahara $href = wl($recent['id'], "do=revisions", false, '&'); 165*3d7df1dcSSatoshi Sahara } 166*3d7df1dcSSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass('revisions_link'); 167*3d7df1dcSSatoshi Sahara $form->addTag('img')->attrs([ 168*3d7df1dcSSatoshi Sahara 'src' => DOKU_BASE .'lib/images/history.png', 169*3d7df1dcSSatoshi Sahara 'width' => 12, 170*3d7df1dcSSatoshi Sahara 'height' => 14, 171*3d7df1dcSSatoshi Sahara 'title' => $lang['btn_revs'], 172*3d7df1dcSSatoshi Sahara 'alt' => $lang['btn_revs'] 173*3d7df1dcSSatoshi Sahara ]); 174*3d7df1dcSSatoshi Sahara $form->addTagClose('a'); 175*3d7df1dcSSatoshi Sahara 176*3d7df1dcSSatoshi Sahara if (!empty($recent['media'])) { 177*3d7df1dcSSatoshi Sahara $href = media_managerURL( 178*3d7df1dcSSatoshi Sahara array( 179*3d7df1dcSSatoshi Sahara 'tab_details' => 'view', 180*3d7df1dcSSatoshi Sahara 'image' => $recent['id'], 181*3d7df1dcSSatoshi Sahara 'ns' => getNS($recent['id']) 182*3d7df1dcSSatoshi Sahara ), '&' 183*3d7df1dcSSatoshi Sahara ); 184*3d7df1dcSSatoshi Sahara $class = file_exists(mediaFN($recent['id'])) ? 'wikilink1' : 'wikilink2'; 185*3d7df1dcSSatoshi Sahara $form->addTagOpen('a')->attr('href', $href)->addClass($class); 186*3d7df1dcSSatoshi Sahara $form->addHTML($recent['id']); 187*3d7df1dcSSatoshi Sahara $form->addTagClose('a'); 188*3d7df1dcSSatoshi Sahara } else { 189*3d7df1dcSSatoshi Sahara $form->addHTML(html_wikilink(':'. $recent['id'], useHeading('navigation') ? null : $recent['id'])); 190*3d7df1dcSSatoshi Sahara } 191*3d7df1dcSSatoshi Sahara $form->addTagOpen('span')->addClass('sum'); 192*3d7df1dcSSatoshi Sahara $form->addHTML(' – '. hsc($recent['sum'])); 193*3d7df1dcSSatoshi Sahara $form->addTagClose('span'); 194*3d7df1dcSSatoshi Sahara 195*3d7df1dcSSatoshi Sahara $form->addTagOPen('span')->addClass('user'); 196*3d7df1dcSSatoshi Sahara if ($recent['user']) { 197*3d7df1dcSSatoshi Sahara $form->addHTML('<bdi>'. editorinfo($recent['user']) .'</bdi>'); 198*3d7df1dcSSatoshi Sahara if (auth_ismanager()) { 199*3d7df1dcSSatoshi Sahara $form->addHTML(' <bdo dir="ltr">('. $recent['ip'] .')</bdo>'); 200*3d7df1dcSSatoshi Sahara } 201*3d7df1dcSSatoshi Sahara } else { 202*3d7df1dcSSatoshi Sahara $form->addHTML('<bdo dir="ltr">'. $recent['ip'] .'</bdo>'); 203*3d7df1dcSSatoshi Sahara } 204*3d7df1dcSSatoshi Sahara $form->addTagClose('span'); 205*3d7df1dcSSatoshi Sahara 206*3d7df1dcSSatoshi Sahara html_sizechange($recent['sizechange'], $form); 207*3d7df1dcSSatoshi Sahara 208*3d7df1dcSSatoshi Sahara $form->addTagClose('div'); 209*3d7df1dcSSatoshi Sahara $form->addTagClose('li'); 210*3d7df1dcSSatoshi Sahara } 211*3d7df1dcSSatoshi Sahara 212*3d7df1dcSSatoshi Sahara $form->addTagClose('ul'); 213*3d7df1dcSSatoshi Sahara 214*3d7df1dcSSatoshi Sahara // provide navigation for pagenated cecent list (of pages and/or media files) 215*3d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('pagenav'); 216*3d7df1dcSSatoshi Sahara $last = $first + $conf['recent']; 217*3d7df1dcSSatoshi Sahara if ($first > 0) { 218*3d7df1dcSSatoshi Sahara $first = $conf['recent'] -1; 219*3d7df1dcSSatoshi Sahara if ($first < 0) $first = 0; 220*3d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('pagenav-prev'); 221*3d7df1dcSSatoshi Sahara $form->addTagOpen('button')->attrs([ 222*3d7df1dcSSatoshi Sahara 'type' => 'submit', 223*3d7df1dcSSatoshi Sahara 'name' => 'first['. $first .']', 224*3d7df1dcSSatoshi Sahara 'accesskey' => 'n', 225*3d7df1dcSSatoshi Sahara 'title' => $lang['btn_newer'] .' [N]', 226*3d7df1dcSSatoshi Sahara ])->addClass('button show'); 227*3d7df1dcSSatoshi Sahara $form->addHTML($lang['btn_newer']); 228*3d7df1dcSSatoshi Sahara $form->addTagClose('button'); 229*3d7df1dcSSatoshi Sahara $form->addTagClose('div'); 230*3d7df1dcSSatoshi Sahara } 231*3d7df1dcSSatoshi Sahara if ($hasNext) { 232*3d7df1dcSSatoshi Sahara $form->addTagOpen('div')->addClass('pagenav-next'); 233*3d7df1dcSSatoshi Sahara $form->addTagOpen('button')->attrs([ 234*3d7df1dcSSatoshi Sahara 'type' => 'submit', 235*3d7df1dcSSatoshi Sahara 'name' => 'first['. $last .']', 236*3d7df1dcSSatoshi Sahara 'accesskey' => 'p', 237*3d7df1dcSSatoshi Sahara 'title' => $lang['btn_older'] .' [P]', 238*3d7df1dcSSatoshi Sahara ])->addClass('button show'); 239*3d7df1dcSSatoshi Sahara $form->addHTML($lang['btn_older']); 240*3d7df1dcSSatoshi Sahara $form->addTagClose('button'); 241*3d7df1dcSSatoshi Sahara $form->addTagClose('div'); 242*3d7df1dcSSatoshi Sahara } 243*3d7df1dcSSatoshi Sahara $form->addTagClose('div'); 244*3d7df1dcSSatoshi Sahara 245*3d7df1dcSSatoshi Sahara $form->addTagClose('div'); // close div class=no 246*3d7df1dcSSatoshi Sahara 247*3d7df1dcSSatoshi Sahara // emit HTML_CRECENTFORM_OUTPUT event, print the form 248*3d7df1dcSSatoshi Sahara Event::createAndTrigger('HTML_RECENTFORM_OUTPUT', $form, 'html_form_output', false); 249*3d7df1dcSSatoshi Sahara 250*3d7df1dcSSatoshi Sahara print DOKU_LF; 251*3d7df1dcSSatoshi Sahara } 252*3d7df1dcSSatoshi Sahara 253*3d7df1dcSSatoshi Sahara} 254