xref: /dokuwiki/inc/Ui/Revisions.php (revision 6c9fde8289c5959cefa114d8249b987ac85eb3f1)
1*6c9fde82SSatoshi Sahara<?php
2*6c9fde82SSatoshi Sahara
3*6c9fde82SSatoshi Saharanamespace dokuwiki\Ui;
4*6c9fde82SSatoshi Sahara
5*6c9fde82SSatoshi Saharause dokuwiki\ChangeLog\PageChangeLog;
6*6c9fde82SSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog;
7*6c9fde82SSatoshi Saharause dokuwiki\Extension\Event;
8*6c9fde82SSatoshi Saharause dokuwiki\Form\Form;
9*6c9fde82SSatoshi Sahara
10*6c9fde82SSatoshi Sahara/**
11*6c9fde82SSatoshi Sahara * DokuWiki Revisions Insterface
12*6c9fde82SSatoshi Sahara *
13*6c9fde82SSatoshi Sahara * @package dokuwiki\Ui
14*6c9fde82SSatoshi Sahara */
15*6c9fde82SSatoshi Saharaclass Revisions extends Ui
16*6c9fde82SSatoshi Sahara{
17*6c9fde82SSatoshi Sahara    /**
18*6c9fde82SSatoshi Sahara     * Display list of old revisions
19*6c9fde82SSatoshi Sahara     *
20*6c9fde82SSatoshi Sahara     * @author Andreas Gohr <andi@splitbrain.org>
21*6c9fde82SSatoshi Sahara     * @author Ben Coburn <btcoburn@silicodon.net>
22*6c9fde82SSatoshi Sahara     * @author Kate Arzamastseva <pshns@ukr.net>
23*6c9fde82SSatoshi Sahara     *
24*6c9fde82SSatoshi Sahara     * @triggers HTML_REVISIONSFORM_OUTPUT
25*6c9fde82SSatoshi Sahara     * @param int $first skip the first n changelog lines
26*6c9fde82SSatoshi Sahara     * @param bool|string $media_id id of media, or false for current page
27*6c9fde82SSatoshi Sahara     * @return void
28*6c9fde82SSatoshi Sahara     */
29*6c9fde82SSatoshi Sahara    public function show($first = 0, $media_id = false)
30*6c9fde82SSatoshi Sahara    {
31*6c9fde82SSatoshi Sahara        global $ID;
32*6c9fde82SSatoshi Sahara        global $INFO;
33*6c9fde82SSatoshi Sahara        global $conf;
34*6c9fde82SSatoshi Sahara        global $lang;
35*6c9fde82SSatoshi Sahara        $id = $ID;
36*6c9fde82SSatoshi Sahara        if ($media_id) {
37*6c9fde82SSatoshi Sahara            $id = $media_id;
38*6c9fde82SSatoshi Sahara            $changelog = new MediaChangeLog($id);
39*6c9fde82SSatoshi Sahara        } else {
40*6c9fde82SSatoshi Sahara            $changelog = new PageChangeLog($id);
41*6c9fde82SSatoshi Sahara        }
42*6c9fde82SSatoshi Sahara
43*6c9fde82SSatoshi Sahara        /* we need to get one additional log entry to be able to
44*6c9fde82SSatoshi Sahara         * decide if this is the last page or is there another one.
45*6c9fde82SSatoshi Sahara         * see html_recent()
46*6c9fde82SSatoshi Sahara         */
47*6c9fde82SSatoshi Sahara
48*6c9fde82SSatoshi Sahara        $revisions = $changelog->getRevisions($first, $conf['recent'] +1);
49*6c9fde82SSatoshi Sahara
50*6c9fde82SSatoshi Sahara        if (count($revisions) == 0 && $first != 0) {
51*6c9fde82SSatoshi Sahara            $first = 0;
52*6c9fde82SSatoshi Sahara            $revisions = $changelog->getRevisions($first, $conf['recent'] +1);
53*6c9fde82SSatoshi Sahara        }
54*6c9fde82SSatoshi Sahara        $hasNext = false;
55*6c9fde82SSatoshi Sahara        if (count($revisions) > $conf['recent']) {
56*6c9fde82SSatoshi Sahara            $hasNext = true;
57*6c9fde82SSatoshi Sahara            array_pop($revisions); // remove extra log entry
58*6c9fde82SSatoshi Sahara        }
59*6c9fde82SSatoshi Sahara
60*6c9fde82SSatoshi Sahara        // print intro
61*6c9fde82SSatoshi Sahara        if (!$media_id) {
62*6c9fde82SSatoshi Sahara            print p_locale_xhtml('revisions');
63*6c9fde82SSatoshi Sahara            $exists = $INFO['exists'];
64*6c9fde82SSatoshi Sahara            $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id;
65*6c9fde82SSatoshi Sahara            if (!$display_name) {
66*6c9fde82SSatoshi Sahara                $display_name = $id;
67*6c9fde82SSatoshi Sahara            }
68*6c9fde82SSatoshi Sahara        } else {
69*6c9fde82SSatoshi Sahara            $exists = file_exists(mediaFN($id));
70*6c9fde82SSatoshi Sahara            $display_name = $id;
71*6c9fde82SSatoshi Sahara        }
72*6c9fde82SSatoshi Sahara
73*6c9fde82SSatoshi Sahara        // create the form
74*6c9fde82SSatoshi Sahara        $form = new Form(['id' => 'page__revisions']);
75*6c9fde82SSatoshi Sahara        $form->addClass('changes');
76*6c9fde82SSatoshi Sahara        if ($media_id) {
77*6c9fde82SSatoshi Sahara            $form->attr('action', media_managerURL(array('image' => $media_id), '&'));
78*6c9fde82SSatoshi Sahara        }
79*6c9fde82SSatoshi Sahara
80*6c9fde82SSatoshi Sahara        // start listing
81*6c9fde82SSatoshi Sahara        $form->addTagOpen('ul');
82*6c9fde82SSatoshi Sahara
83*6c9fde82SSatoshi Sahara        if ($exists && $first == 0) {
84*6c9fde82SSatoshi Sahara            $minor = false;
85*6c9fde82SSatoshi Sahara            if ($media_id) {
86*6c9fde82SSatoshi Sahara                $date = dformat(@filemtime(mediaFN($id)));
87*6c9fde82SSatoshi Sahara                $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&');
88*6c9fde82SSatoshi Sahara
89*6c9fde82SSatoshi Sahara                $changelog->setChunkSize(1024);
90*6c9fde82SSatoshi Sahara                $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id))));
91*6c9fde82SSatoshi Sahara
92*6c9fde82SSatoshi Sahara                $summary = $revinfo['sum'];
93*6c9fde82SSatoshi Sahara                $editor = $revinfo['user'] ?: $revinfo['ip'];
94*6c9fde82SSatoshi Sahara                $sizechange = $revinfo['sizechange'];
95*6c9fde82SSatoshi Sahara            } else {
96*6c9fde82SSatoshi Sahara                $date = dformat($INFO['lastmod']);
97*6c9fde82SSatoshi Sahara                if (isset($INFO['meta']) && isset($INFO['meta']['last_change'])) {
98*6c9fde82SSatoshi Sahara                    if ($INFO['meta']['last_change']['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
99*6c9fde82SSatoshi Sahara                        $minor = true;
100*6c9fde82SSatoshi Sahara                    }
101*6c9fde82SSatoshi Sahara                    if (isset($INFO['meta']['last_change']['sizechange'])) {
102*6c9fde82SSatoshi Sahara                        $sizechange = $INFO['meta']['last_change']['sizechange'];
103*6c9fde82SSatoshi Sahara                    } else {
104*6c9fde82SSatoshi Sahara                        $sizechange = null;
105*6c9fde82SSatoshi Sahara                    }
106*6c9fde82SSatoshi Sahara                }
107*6c9fde82SSatoshi Sahara                $pagelog = new PageChangeLog($ID);
108*6c9fde82SSatoshi Sahara                $latestrev = $pagelog->getRevisions(-1, 1);
109*6c9fde82SSatoshi Sahara                $latestrev = array_pop($latestrev);
110*6c9fde82SSatoshi Sahara                $href = wl($id, "rev=$latestrev", false, '&');
111*6c9fde82SSatoshi Sahara                $summary = $INFO['sum'];
112*6c9fde82SSatoshi Sahara                $editor = $INFO['editor'];
113*6c9fde82SSatoshi Sahara            }
114*6c9fde82SSatoshi Sahara
115*6c9fde82SSatoshi Sahara            $form->addTagOpen('li')->addClass($minor ? 'minor' : '');
116*6c9fde82SSatoshi Sahara            $form->addTagOpen('div')->addClass('li');
117*6c9fde82SSatoshi Sahara            $form->addCheckbox('rev2[]')->val('current');
118*6c9fde82SSatoshi Sahara
119*6c9fde82SSatoshi Sahara            $form->addTagOpen('span')->addClass('data');
120*6c9fde82SSatoshi Sahara            $form->addHTML($date);
121*6c9fde82SSatoshi Sahara            $form->addTagClose('span');
122*6c9fde82SSatoshi Sahara
123*6c9fde82SSatoshi Sahara            $form->addTag('img')->attrs([
124*6c9fde82SSatoshi Sahara                'src' => DOKU_BASE.'lib/images/blank.gif',
125*6c9fde82SSatoshi Sahara                'width' => 15,
126*6c9fde82SSatoshi Sahara                'height' => 11,
127*6c9fde82SSatoshi Sahara                'alt' => '',
128*6c9fde82SSatoshi Sahara            ]);
129*6c9fde82SSatoshi Sahara
130*6c9fde82SSatoshi Sahara            $form->addTagOPen('a')->attr('href', $href)->addClass('wikilink1');
131*6c9fde82SSatoshi Sahara            $form->addHTML($display_name);
132*6c9fde82SSatoshi Sahara            $form->addTagClose('a');
133*6c9fde82SSatoshi Sahara
134*6c9fde82SSatoshi Sahara            if ($media_id) $form->addTagOpen('div');
135*6c9fde82SSatoshi Sahara
136*6c9fde82SSatoshi Sahara            if ($summary) {
137*6c9fde82SSatoshi Sahara                $form->addTagOpen('span')->addClass('sum');
138*6c9fde82SSatoshi Sahara                if (!$media_id) $form->addHTML(' – ');
139*6c9fde82SSatoshi Sahara                $form->addHTML('<bdi>' . hsc($summary) . '</bdi>');
140*6c9fde82SSatoshi Sahara                $form->addTagClose('span');
141*6c9fde82SSatoshi Sahara            }
142*6c9fde82SSatoshi Sahara
143*6c9fde82SSatoshi Sahara            $form->addTagOpen('span')->addClass('user');
144*6c9fde82SSatoshi Sahara            $form->addHTML(
145*6c9fde82SSatoshi Sahara                (empty($editor)) ? ('('.$lang['external_edit'].')') : '<bdi>'.editorinfo($editor).'</bdi>'
146*6c9fde82SSatoshi Sahara            );
147*6c9fde82SSatoshi Sahara            $form->addTagClose('span');
148*6c9fde82SSatoshi Sahara
149*6c9fde82SSatoshi Sahara
150*6c9fde82SSatoshi Sahara            html_sizechange($sizechange, $form);
151*6c9fde82SSatoshi Sahara
152*6c9fde82SSatoshi Sahara            $form->addHTML('('.$lang['current'].')');
153*6c9fde82SSatoshi Sahara
154*6c9fde82SSatoshi Sahara            if ($media_id) $form->addTagClose('div');
155*6c9fde82SSatoshi Sahara
156*6c9fde82SSatoshi Sahara            $form->addTagClose('div');
157*6c9fde82SSatoshi Sahara            $form->addTagClose('li');
158*6c9fde82SSatoshi Sahara        }
159*6c9fde82SSatoshi Sahara
160*6c9fde82SSatoshi Sahara        foreach ($revisions as $rev) {
161*6c9fde82SSatoshi Sahara            $date = dformat($rev);
162*6c9fde82SSatoshi Sahara            $info = $changelog->getRevisionInfo($rev);
163*6c9fde82SSatoshi Sahara            if ($media_id) {
164*6c9fde82SSatoshi Sahara                $exists = file_exists(mediaFN($id, $rev));
165*6c9fde82SSatoshi Sahara            } else {
166*6c9fde82SSatoshi Sahara                $exists = page_exists($id, $rev);
167*6c9fde82SSatoshi Sahara            }
168*6c9fde82SSatoshi Sahara
169*6c9fde82SSatoshi Sahara            $class = '';
170*6c9fde82SSatoshi Sahara            if ($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
171*6c9fde82SSatoshi Sahara                $class = 'minor';
172*6c9fde82SSatoshi Sahara            }
173*6c9fde82SSatoshi Sahara
174*6c9fde82SSatoshi Sahara            $form->addTagOpen('li')->addClass($class);
175*6c9fde82SSatoshi Sahara            $form->addTagOpen('div')->addClass('li');
176*6c9fde82SSatoshi Sahara
177*6c9fde82SSatoshi Sahara            if ($exists){
178*6c9fde82SSatoshi Sahara                $form->addCheckbox('rev2[]')->val($rev);
179*6c9fde82SSatoshi Sahara            } else {
180*6c9fde82SSatoshi Sahara                $form->addTag('img')->attrs([
181*6c9fde82SSatoshi Sahara                    'src' => DOKU_BASE.'lib/images/blank.gif',
182*6c9fde82SSatoshi Sahara                    'width' => 15,
183*6c9fde82SSatoshi Sahara                    'height' => 11,
184*6c9fde82SSatoshi Sahara                    'alt' => '',
185*6c9fde82SSatoshi Sahara                ]);
186*6c9fde82SSatoshi Sahara            }
187*6c9fde82SSatoshi Sahara
188*6c9fde82SSatoshi Sahara            $form->addTagOpen('span')->addClass('date');
189*6c9fde82SSatoshi Sahara            $form->addHTML($date);
190*6c9fde82SSatoshi Sahara            $form->addTagClose('span');
191*6c9fde82SSatoshi Sahara
192*6c9fde82SSatoshi Sahara            if ($exists) {
193*6c9fde82SSatoshi Sahara                if (!$media_id) {
194*6c9fde82SSatoshi Sahara                    $href = wl($id, "rev=$rev,do=diff", false, '&');
195*6c9fde82SSatoshi Sahara                } else {
196*6c9fde82SSatoshi Sahara                    $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&');
197*6c9fde82SSatoshi Sahara                }
198*6c9fde82SSatoshi Sahara                $form->addTagOpen('a')->attr('href', $href)->addClass('diff_link');
199*6c9fde82SSatoshi Sahara                $form->addTag('img')->attrs([
200*6c9fde82SSatoshi Sahara                    'src'    => DOKU_BASE.'lib/images/diff.png',
201*6c9fde82SSatoshi Sahara                    'width'  => 15,
202*6c9fde82SSatoshi Sahara                    'height' => 11,
203*6c9fde82SSatoshi Sahara                    'title'  => $lang['diff'],
204*6c9fde82SSatoshi Sahara                    'alt'    => $lang['diff'],
205*6c9fde82SSatoshi Sahara                ]);
206*6c9fde82SSatoshi Sahara                $form->addTagClose('a');
207*6c9fde82SSatoshi Sahara
208*6c9fde82SSatoshi Sahara                if (!$media_id) {
209*6c9fde82SSatoshi Sahara                    $href = wl($id, "rev=$rev", false, '&');
210*6c9fde82SSatoshi Sahara                } else {
211*6c9fde82SSatoshi Sahara                    $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&');
212*6c9fde82SSatoshi Sahara                }
213*6c9fde82SSatoshi Sahara                $form->addTagOpen('a')->attr('href', $href)->addClass('wikilink1');
214*6c9fde82SSatoshi Sahara                $form->addHTML($display_name);
215*6c9fde82SSatoshi Sahara                $form->addTagClose('a');
216*6c9fde82SSatoshi Sahara            } else {
217*6c9fde82SSatoshi Sahara                $form->addTag('img')->attrs([
218*6c9fde82SSatoshi Sahara                    'src'    => DOKU_BASE.'lib/images/blank.gif',
219*6c9fde82SSatoshi Sahara                    'width'  => 15,
220*6c9fde82SSatoshi Sahara                    'height' => 11,
221*6c9fde82SSatoshi Sahara                    'alt'    => '',
222*6c9fde82SSatoshi Sahara                ]);
223*6c9fde82SSatoshi Sahara                $form->addHTML($display_name);
224*6c9fde82SSatoshi Sahara            }
225*6c9fde82SSatoshi Sahara
226*6c9fde82SSatoshi Sahara            if ($media_id) $form->addTagOpen('div');
227*6c9fde82SSatoshi Sahara
228*6c9fde82SSatoshi Sahara            if ($info['sum']) {
229*6c9fde82SSatoshi Sahara                $form->addTagOpen('span')->addClass('sum');
230*6c9fde82SSatoshi Sahara                if (!$media_id) $form->addHTML(' – ');
231*6c9fde82SSatoshi Sahara                $form->addHTML('<bdi>'. hsc($info['sum']) .'</bdi>');
232*6c9fde82SSatoshi Sahara                $form->addTagClose('span');
233*6c9fde82SSatoshi Sahara            }
234*6c9fde82SSatoshi Sahara
235*6c9fde82SSatoshi Sahara            $form->addTagOpen('span')->addClass('user');
236*6c9fde82SSatoshi Sahara            if ($info['user']) {
237*6c9fde82SSatoshi Sahara                $form->addHTML('<bdi>'. editorinfo($info['user']) .'</bdi>');
238*6c9fde82SSatoshi Sahara                if (auth_ismanager()) {
239*6c9fde82SSatoshi Sahara                    $form->addHTML(' <bdo dir="ltr">('. $info['ip'] .')</bdo>');
240*6c9fde82SSatoshi Sahara                }
241*6c9fde82SSatoshi Sahara            } else {
242*6c9fde82SSatoshi Sahara                $form->addHTML('<bdo dir="ltr">' .$info['ip'] .'</bdo>');
243*6c9fde82SSatoshi Sahara            }
244*6c9fde82SSatoshi Sahara            $form->addTagClose('span');
245*6c9fde82SSatoshi Sahara
246*6c9fde82SSatoshi Sahara            html_sizechange($info['sizechange'], $form);
247*6c9fde82SSatoshi Sahara
248*6c9fde82SSatoshi Sahara            if ($media_id) $form->addTagClose('div');
249*6c9fde82SSatoshi Sahara
250*6c9fde82SSatoshi Sahara            $form->addTagClose('div');
251*6c9fde82SSatoshi Sahara            $form->addTagClose('li');
252*6c9fde82SSatoshi Sahara        }
253*6c9fde82SSatoshi Sahara
254*6c9fde82SSatoshi Sahara        // end of revision list
255*6c9fde82SSatoshi Sahara        $form->addTagClose('ul');
256*6c9fde82SSatoshi Sahara
257*6c9fde82SSatoshi Sahara        // show button for diff view
258*6c9fde82SSatoshi Sahara        if (!$media_id) {
259*6c9fde82SSatoshi Sahara            $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit');
260*6c9fde82SSatoshi Sahara        } else {
261*6c9fde82SSatoshi Sahara            $form->setHiddenField('mediado', 'diff');
262*6c9fde82SSatoshi Sahara            $form->addButton('', $lang['diff2'])->attr('type', 'submit');
263*6c9fde82SSatoshi Sahara        }
264*6c9fde82SSatoshi Sahara
265*6c9fde82SSatoshi Sahara        $form->addTagClose('div'); // close div class=no
266*6c9fde82SSatoshi Sahara
267*6c9fde82SSatoshi Sahara        // emit HTML_REVISIONSFORM_OUTPUT event, print the form
268*6c9fde82SSatoshi Sahara        Event::createAndTrigger('HTML_REVISIONSFORM_OUTPUT', $form, 'html_form_output', false);
269*6c9fde82SSatoshi Sahara
270*6c9fde82SSatoshi Sahara        print DOKU_LF;
271*6c9fde82SSatoshi Sahara
272*6c9fde82SSatoshi Sahara        // provide navigation for pagenated revision list (of pages and/or media files)
273*6c9fde82SSatoshi Sahara        print '<div class="pagenav">';
274*6c9fde82SSatoshi Sahara        $last = $first + $conf['recent'];
275*6c9fde82SSatoshi Sahara        if ($first > 0) {
276*6c9fde82SSatoshi Sahara            $first = $first - $conf['recent'];
277*6c9fde82SSatoshi Sahara            if ($first < 0) $first = 0;
278*6c9fde82SSatoshi Sahara            print '<div class="pagenav-prev">';
279*6c9fde82SSatoshi Sahara            if ($media_id) {
280*6c9fde82SSatoshi Sahara                print html_btn('newer',$media_id,"p",media_managerURL(array('first' => $first), '&amp;', false, true));
281*6c9fde82SSatoshi Sahara            } else {
282*6c9fde82SSatoshi Sahara                print html_btn('newer',$id,"p",array('do' => 'revisions', 'first' => $first));
283*6c9fde82SSatoshi Sahara            }
284*6c9fde82SSatoshi Sahara            print '</div>';
285*6c9fde82SSatoshi Sahara        }
286*6c9fde82SSatoshi Sahara        if ($hasNext) {
287*6c9fde82SSatoshi Sahara            print '<div class="pagenav-next">';
288*6c9fde82SSatoshi Sahara            if ($media_id) {
289*6c9fde82SSatoshi Sahara                print html_btn('older',$media_id,"n",media_managerURL(array('first' => $last), '&amp;', false, true));
290*6c9fde82SSatoshi Sahara            } else {
291*6c9fde82SSatoshi Sahara                print html_btn('older',$id,"n",array('do' => 'revisions', 'first' => $last));
292*6c9fde82SSatoshi Sahara            }
293*6c9fde82SSatoshi Sahara            print '</div>';
294*6c9fde82SSatoshi Sahara        }
295*6c9fde82SSatoshi Sahara        print '</div>';
296*6c9fde82SSatoshi Sahara
297*6c9fde82SSatoshi Sahara        print DOKU_LF;
298*6c9fde82SSatoshi Sahara    }
299*6c9fde82SSatoshi Sahara
300*6c9fde82SSatoshi Sahara}
301