xref: /dokuwiki/inc/Ui/Recent.php (revision 3d7df1dc63c327e0f769f38f258959e8321b4aaa)
1<?php
2
3namespace dokuwiki\Ui;
4
5use dokuwiki\ChangeLog\MediaChangeLog;
6use dokuwiki\Extension\Event;
7use dokuwiki\Form\Form;
8
9/**
10 * DokuWiki Recent Insterface
11 *
12 * @package dokuwiki\Ui
13 */
14class Recent extends Ui
15{
16    /**
17     * Display recent changes
18     *
19     * @author Andreas Gohr <andi@splitbrain.org>
20     * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
21     * @author Ben Coburn <btcoburn@silicodon.net>
22     * @author Kate Arzamastseva <pshns@ukr.net>
23     *
24     * @triggers HTML_RECENTFORM_OUTPUT
25     * @param int $first skip the first n changelog lines
26     * @param string $show_changes
27     * @return void
28     */
29    public function show($first = 0, $show_changes = 'both')
30    {
31        global $conf;
32        global $lang;
33        global $ID;
34
35        /* we need to get one additionally log entry to be able to
36         * decide if this is the last page or is there another one.
37         * This is the cheapest solution to get this information.
38         */
39        $flags = 0;
40        if ($show_changes == 'mediafiles' && $conf['mediarevisions']) {
41            $flags = RECENTS_MEDIA_CHANGES;
42        } elseif ($show_changes == 'pages') {
43            $flags = 0;
44        } elseif ($conf['mediarevisions']) {
45            $show_changes = 'both';
46            $flags = RECENTS_MEDIA_PAGES_MIXED;
47        }
48
49        $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags);
50        if (count($recents) == 0 && $first != 0) {
51            $first = 0;
52            $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags);
53        }
54
55        $hasNext = false;
56        if (count($recents) > $conf['recent']) {
57            $hasNext = true;
58            array_pop($recents); // remove extra log entry
59        }
60
61        // print intro
62        print p_locale_xhtml('recent');
63
64        if (getNS($ID) != '') {
65            print '<div class="level1"><p>'
66                . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent'))
67                .'</p></div>';
68        }
69
70        // create the form
71        $form = new Form(['id' => 'dw__recent', 'method' => 'GET', 'action'=>wl($ID)]);
72        $form->addClass('changes');
73        $form->addTagOpen('div')->addClass('no');
74        $form->setHiddenField('sectok', null);
75        $form->setHiddenField('do', 'recent');
76        $form->setHiddenField('id', $ID);
77
78        // show dropdown selector, whether include not only recent pages but also recent media files?
79        if ($conf['mediarevisions']) {
80            $form->addTagOpen('div')->addClass('changeType');
81            $options = array(
82                            'pages'      => $lang['pages_changes'],
83                            'mediafiles' => $lang['media_changes'],
84                            'both'       => $lang['both_changes'],
85            );
86            $form->addDropdown('show_changes', $options, $lang['changes_type'])
87                ->val($show_changes)->addClass('quickselect');
88            $form->addButton('do[recent]', $lang['btn_apply'])->attr('type','submit');
89            $form->addTagClose('div');
90        }
91
92        // start listing
93        $form->addTagOpen('ul');
94
95        foreach ($recents as $recent) {
96            $date = dformat($recent['date']);
97            $class = ($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor': '';
98
99            $form->addTagOpen('li')->addClass($class);
100            $form->addTagOpen('div')->addClass('li');
101
102            if (!empty($recent['media'])) {
103                $form->addHTML(media_printicon($recent['id']));
104            } else {
105                $form->addTag('img')->attrs([
106                        'src' => DOKU_BASE .'lib/images/fileicons/file.png',
107                        'alt' => $recent['id']
108                ])->addClass('icon');
109            }
110
111            $form->addTagOpen('span')->addClass('date');
112            $form->addHTML($date);
113            $form->addTagClose('span');
114
115            $diff = false;
116            $href = '';
117
118            if (!empty($recent['media'])) {
119                $changelog = new MediaChangeLog($recent['id']);
120                $revs = $changelog->getRevisions(0, 1);
121                $diff = (count($revs) && file_exists(mediaFN($recent['id'])));
122                if ($diff) {
123                    $href = media_managerURL(
124                        array(
125                            'tab_details' => 'history',
126                            'mediado' => 'diff',
127                            'image' => $recent['id'],
128                            'ns' => getNS($recent['id'])
129                        ), '&'
130                    );
131                }
132            } else {
133                $href = wl($recent['id'], "do=diff", false, '&');
134            }
135
136            if (!empty($recent['media']) && !$diff) {
137                $form->addTag('img')->attrs([
138                        'src'    => DOKU_BASE .'lib/images/blank.gif',
139                        'width'  => 15,
140                        'height' => 11,
141                        'alt' => '',
142                ]);
143            } else {
144                $form->addTagOpen('a')->attr('href', $href)->addClass('diff_link');
145                $form->addTag('img')->attrs([
146                        'src'    => DOKU_BASE .'lib/images/diff.png',
147                        'width'  => 15,
148                        'height' => 11,
149                        'title'  => $lang['diff'],
150                        'alt'    => $lang['diff'],
151                ]);
152                $form->addTagClose('a');
153            }
154
155            if (!empty($recent['media'])) {
156                $href = media_managerURL(
157                    array(
158                        'tab_details' => 'history',
159                        'image' => $recent['id'],
160                        'ns' => getNS($recent['id'])
161                    ), '&'
162                );
163            } else {
164                $href = wl($recent['id'], "do=revisions", false, '&');
165            }
166            $form->addTagOpen('a')->attr('href', $href)->addClass('revisions_link');
167            $form->addTag('img')->attrs([
168                    'src'    => DOKU_BASE .'lib/images/history.png',
169                    'width'  => 12,
170                    'height' => 14,
171                    'title'  => $lang['btn_revs'],
172                    'alt'    => $lang['btn_revs']
173            ]);
174            $form->addTagClose('a');
175
176            if (!empty($recent['media'])) {
177                $href = media_managerURL(
178                    array(
179                        'tab_details' => 'view',
180                        'image' => $recent['id'],
181                        'ns' => getNS($recent['id'])
182                    ), '&'
183                );
184                $class = file_exists(mediaFN($recent['id'])) ? 'wikilink1' : 'wikilink2';
185                $form->addTagOpen('a')->attr('href', $href)->addClass($class);
186                $form->addHTML($recent['id']);
187                $form->addTagClose('a');
188            } else {
189                $form->addHTML(html_wikilink(':'. $recent['id'], useHeading('navigation') ? null : $recent['id']));
190            }
191            $form->addTagOpen('span')->addClass('sum');
192            $form->addHTML(' – '. hsc($recent['sum']));
193            $form->addTagClose('span');
194
195            $form->addTagOPen('span')->addClass('user');
196            if ($recent['user']) {
197                $form->addHTML('<bdi>'. editorinfo($recent['user']) .'</bdi>');
198                if (auth_ismanager()) {
199                    $form->addHTML(' <bdo dir="ltr">('. $recent['ip'] .')</bdo>');
200                }
201            } else {
202                $form->addHTML('<bdo dir="ltr">'. $recent['ip'] .'</bdo>');
203            }
204            $form->addTagClose('span');
205
206            html_sizechange($recent['sizechange'], $form);
207
208            $form->addTagClose('div');
209            $form->addTagClose('li');
210        }
211
212        $form->addTagClose('ul');
213
214        // provide navigation for pagenated cecent list (of pages and/or media files)
215        $form->addTagOpen('div')->addClass('pagenav');
216        $last = $first + $conf['recent'];
217        if ($first > 0) {
218            $first = $conf['recent'] -1;
219            if ($first < 0) $first = 0;
220            $form->addTagOpen('div')->addClass('pagenav-prev');
221            $form->addTagOpen('button')->attrs([
222                    'type'      => 'submit',
223                    'name'      => 'first['. $first .']',
224                    'accesskey' => 'n',
225                    'title'     => $lang['btn_newer'] .' [N]',
226            ])->addClass('button show');
227            $form->addHTML($lang['btn_newer']);
228            $form->addTagClose('button');
229            $form->addTagClose('div');
230        }
231        if ($hasNext) {
232            $form->addTagOpen('div')->addClass('pagenav-next');
233            $form->addTagOpen('button')->attrs([
234                    'type'      => 'submit',
235                    'name'      => 'first['. $last .']',
236                    'accesskey' => 'p',
237                    'title'     => $lang['btn_older'] .' [P]',
238            ])->addClass('button show');
239            $form->addHTML($lang['btn_older']);
240            $form->addTagClose('button');
241            $form->addTagClose('div');
242        }
243        $form->addTagClose('div');
244
245        $form->addTagClose('div'); // close div class=no
246
247        // emit HTML_CRECENTFORM_OUTPUT event, print the form
248        Event::createAndTrigger('HTML_RECENTFORM_OUTPUT', $form, 'html_form_output', false);
249
250        print DOKU_LF;
251    }
252
253}
254