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