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