xref: /dokuwiki/inc/Ui/Recent.php (revision 9e3166413adffd9d067b4cde8da8d04c44d9c8bf)
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