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