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