xref: /dokuwiki/inc/Ui/MediaRevisions.php (revision ae5d2354c9aa93da542d9f0607167c5e0a6100be)
108500ab3SSatoshi Sahara<?php
208500ab3SSatoshi Sahara
308500ab3SSatoshi Saharanamespace dokuwiki\Ui;
408500ab3SSatoshi Sahara
508500ab3SSatoshi Saharause dokuwiki\ChangeLog\MediaChangeLog;
608500ab3SSatoshi Saharause dokuwiki\Form\Form;
708500ab3SSatoshi Sahara
808500ab3SSatoshi Sahara/**
908500ab3SSatoshi Sahara * DokuWiki MediaRevisions Interface
1008500ab3SSatoshi Sahara *
1108500ab3SSatoshi Sahara * @package dokuwiki\Ui
1208500ab3SSatoshi Sahara */
13*ae5d2354SSatoshi Saharaclass MediaRevisions extends Revisions
1408500ab3SSatoshi Sahara{
1508500ab3SSatoshi Sahara    /**
1608500ab3SSatoshi Sahara     * MediaRevisions Ui constructor
1708500ab3SSatoshi Sahara     *
1808500ab3SSatoshi Sahara     * @param string $id  id of media
1908500ab3SSatoshi Sahara     */
2008500ab3SSatoshi Sahara    public function __construct($id)
2108500ab3SSatoshi Sahara    {
22*ae5d2354SSatoshi Sahara        parent::__construct($id);
2308500ab3SSatoshi Sahara    }
2408500ab3SSatoshi Sahara
2508500ab3SSatoshi Sahara    /**
2608500ab3SSatoshi Sahara     * Display a list of Media Revisions in the MediaManager
2708500ab3SSatoshi Sahara     *
2808500ab3SSatoshi Sahara     * @author Andreas Gohr <andi@splitbrain.org>
2908500ab3SSatoshi Sahara     * @author Ben Coburn <btcoburn@silicodon.net>
3008500ab3SSatoshi Sahara     * @author Kate Arzamastseva <pshns@ukr.net>
3108500ab3SSatoshi Sahara     * @author Satoshi Sahara <sahara.satoshi@gmail.com>
3208500ab3SSatoshi Sahara     *
3308500ab3SSatoshi Sahara     * @param int $first  skip the first n changelog lines
3408500ab3SSatoshi Sahara     * @return void
3508500ab3SSatoshi Sahara     */
3608500ab3SSatoshi Sahara    public function show($first = 0)
3708500ab3SSatoshi Sahara    {
3808500ab3SSatoshi Sahara        global $lang;
3908500ab3SSatoshi Sahara
4008500ab3SSatoshi Sahara        // get revisions, and set correct pagenation parameters (first, hasNext)
4108500ab3SSatoshi Sahara        if ($first === null) $first = 0;
4208500ab3SSatoshi Sahara        $hasNext = false;
4308500ab3SSatoshi Sahara        $revisions = $this->getRevisions($first, $hasNext);
4408500ab3SSatoshi Sahara
4508500ab3SSatoshi Sahara        // create the form
4608500ab3SSatoshi Sahara        $form = new Form([
4708500ab3SSatoshi Sahara                'id' => 'page__revisions', // must not be "media__revisions"
4808500ab3SSatoshi Sahara                'action' => media_managerURL(['image' => $this->id], '&'),
4908500ab3SSatoshi Sahara                'class'  => 'changes',
5008500ab3SSatoshi Sahara        ]);
5108500ab3SSatoshi Sahara        $form->setHiddenField('mediado', 'diff'); // required for media revisions
5208500ab3SSatoshi Sahara        $form->addTagOpen('div')->addClass('no');
5308500ab3SSatoshi Sahara
5408500ab3SSatoshi Sahara        // start listing
5508500ab3SSatoshi Sahara        $form->addTagOpen('ul');
5608500ab3SSatoshi Sahara        foreach ($revisions as $info) {
5708500ab3SSatoshi Sahara            $rev = $info['date'];
5808500ab3SSatoshi Sahara            $class = ($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor' : '';
5908500ab3SSatoshi Sahara            $form->addTagOpen('li')->addClass($class);
6008500ab3SSatoshi Sahara            $form->addTagOpen('div')->addClass('li');
6108500ab3SSatoshi Sahara
6208500ab3SSatoshi Sahara            if (isset($info['current'])) {
6308500ab3SSatoshi Sahara               $form->addCheckbox('rev2[]')->val('current');
6408500ab3SSatoshi Sahara            } elseif (file_exists(mediaFN($this->id, $rev))) {
6508500ab3SSatoshi Sahara                $form->addCheckbox('rev2[]')->val($rev);
6608500ab3SSatoshi Sahara            } else {
6708500ab3SSatoshi Sahara                $form->addCheckbox('')->val($rev)->attr('disabled','disabled');
6808500ab3SSatoshi Sahara            }
6908500ab3SSatoshi Sahara            $form->addHTML(' ');
7008500ab3SSatoshi Sahara
7108500ab3SSatoshi Sahara            $objRevInfo = $this->getObjRevInfo($info);
7208500ab3SSatoshi Sahara            $html = implode(' ', [
7308500ab3SSatoshi Sahara                $objRevInfo->editDate(),          // edit date and time
7408500ab3SSatoshi Sahara                $objRevInfo->difflink(),          // link to diffview icon
7508500ab3SSatoshi Sahara                $objRevInfo->itemName(),          // name of page or media
7608500ab3SSatoshi Sahara                '<div>',
7708500ab3SSatoshi Sahara                $objRevInfo->editSummary(),       // edit summary
7808500ab3SSatoshi Sahara                $objRevInfo->editor(),            // editor info
79*ae5d2354SSatoshi Sahara                $objRevInfo->sizechange(),        // size change indicator
8008500ab3SSatoshi Sahara                $objRevInfo->currentIndicator(),  // current indicator (only when k=1)
8108500ab3SSatoshi Sahara                '</div>',
8208500ab3SSatoshi Sahara            ]);
8308500ab3SSatoshi Sahara            $form->addHTML($html);
8408500ab3SSatoshi Sahara
8508500ab3SSatoshi Sahara            $form->addTagClose('div');
8608500ab3SSatoshi Sahara            $form->addTagClose('li');
8708500ab3SSatoshi Sahara        }
8808500ab3SSatoshi Sahara        $form->addTagClose('ul');  // end of revision list
8908500ab3SSatoshi Sahara
9008500ab3SSatoshi Sahara        // show button for diff view
9108500ab3SSatoshi Sahara        $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit');
9208500ab3SSatoshi Sahara
9308500ab3SSatoshi Sahara        $form->addTagClose('div'); // close div class=no
9408500ab3SSatoshi Sahara
9508500ab3SSatoshi Sahara        print $form->toHTML('Revisions');
9608500ab3SSatoshi Sahara
9708500ab3SSatoshi Sahara        // provide navigation for pagenated revision list (of pages and/or media files)
98*ae5d2354SSatoshi Sahara        print $this->navigation($first, $hasNext, function ($n) {
99*ae5d2354SSatoshi Sahara            return media_managerURL(['first' => $n], '&', false, true);
100*ae5d2354SSatoshi Sahara        });
10108500ab3SSatoshi Sahara    }
10208500ab3SSatoshi Sahara
10308500ab3SSatoshi Sahara    /**
10408500ab3SSatoshi Sahara     * Get revisions, and set correct pagenation parameters (first, hasNext)
10508500ab3SSatoshi Sahara     *
10608500ab3SSatoshi Sahara     * @param int  $first
10708500ab3SSatoshi Sahara     * @param bool $hasNext
10808500ab3SSatoshi Sahara     * @return array  revisions to be shown in a pagenated list
10908500ab3SSatoshi Sahara     * @see also https://www.dokuwiki.org/devel:changelog
11008500ab3SSatoshi Sahara     */
11108500ab3SSatoshi Sahara    protected function getRevisions(&$first, &$hasNext)
11208500ab3SSatoshi Sahara    {
11308500ab3SSatoshi Sahara        global $conf;
11408500ab3SSatoshi Sahara
11508500ab3SSatoshi Sahara        $changelog = new MediaChangeLog($this->id);
11608500ab3SSatoshi Sahara
11708500ab3SSatoshi Sahara        $revisions = [];
11808500ab3SSatoshi Sahara
11908500ab3SSatoshi Sahara        /* we need to get one additional log entry to be able to
12008500ab3SSatoshi Sahara         * decide if this is the last page or is there another one.
12108500ab3SSatoshi Sahara         * see also Ui\Recent::getRecents()
12208500ab3SSatoshi Sahara         */
12308500ab3SSatoshi Sahara        $revlist = $changelog->getRevisions($first, $conf['recent'] +1);
12408500ab3SSatoshi Sahara        if (count($revlist) == 0 && $first != 0) {
12508500ab3SSatoshi Sahara            $first = 0;
12608500ab3SSatoshi Sahara            $revlist = $changelog->getRevisions($first, $conf['recent'] +1);
12708500ab3SSatoshi Sahara        }
12808500ab3SSatoshi Sahara        $exists = file_exists(mediaFN($this->id));
12908500ab3SSatoshi Sahara        if ($first === 0 && $exists) {
13008500ab3SSatoshi Sahara            // add current media as revision[0]
13108500ab3SSatoshi Sahara            $rev = filemtime(fullpath(mediaFN($this->id)));
13208500ab3SSatoshi Sahara            $changelog->setChunkSize(1024);
13308500ab3SSatoshi Sahara            $revinfo = $changelog->getRevisionInfo($rev) ?: array(
13408500ab3SSatoshi Sahara                    'date' => $rev,
13508500ab3SSatoshi Sahara                    'ip'   => null,
13608500ab3SSatoshi Sahara                    'type' => null,
13708500ab3SSatoshi Sahara                    'id'   => $this->id,
13808500ab3SSatoshi Sahara                    'user' => null,
13908500ab3SSatoshi Sahara                    'sum'  => null,
14008500ab3SSatoshi Sahara                    'extra' => null,
14108500ab3SSatoshi Sahara                    'sizechange' => null,
14208500ab3SSatoshi Sahara            );
14308500ab3SSatoshi Sahara            $revisions[] = $revinfo + array(
14408500ab3SSatoshi Sahara                    'media' => true,
14508500ab3SSatoshi Sahara                    'current' => true,
14608500ab3SSatoshi Sahara            );
14708500ab3SSatoshi Sahara        }
14808500ab3SSatoshi Sahara
14908500ab3SSatoshi Sahara        // decide if this is the last page or is there another one
15008500ab3SSatoshi Sahara        $hasNext = false;
15108500ab3SSatoshi Sahara        if (count($revlist) > $conf['recent']) {
15208500ab3SSatoshi Sahara            $hasNext = true;
15308500ab3SSatoshi Sahara            array_pop($revlist); // remove one additional log entry
15408500ab3SSatoshi Sahara        }
15508500ab3SSatoshi Sahara
15608500ab3SSatoshi Sahara        // append each revison info array to the revisions
15708500ab3SSatoshi Sahara        foreach ($revlist as $rev) {
15808500ab3SSatoshi Sahara            $revisions[] = $changelog->getRevisionInfo($rev) + array('media' => true);
15908500ab3SSatoshi Sahara        }
16008500ab3SSatoshi Sahara        return $revisions;
16108500ab3SSatoshi Sahara    }
16208500ab3SSatoshi Sahara
16308500ab3SSatoshi Sahara}
164