implemented javascript-driven revision comparison (with the little radio buttons)

This commit is contained in:
tmont 2008-10-25 20:56:26 +00:00
parent 187ae59d7b
commit 132bf9cb35
3 changed files with 66 additions and 14 deletions

View File

@ -82,8 +82,10 @@
}
}
return ViewMetaData::generate()->addMeta('revised', date('c', $revised))
->addCss($this->cssPath . '/global.css');
$data = ViewMetaData::generate()->addMeta('revised', date('c', $revised))
->addCss($this->cssPath . '/global.css');
return parent::getMetaData()->merge($data);
}
/**

View File

@ -47,14 +47,18 @@
public function __construct(Collection $revisions, $pageName, $priority = 0) {
parent::__construct($priority);
if ($revisions->type !== 'WikiHistory') {
throw new InvalidTypeException(1, 'Collection with type "WikiHistory"', $revisions);
if ($revisions->type !== 'Registry') {
throw new InvalidTypeException(1, 'Collection with type "Registry"', $revisions);
}
$this->revisions = $revisions;
$this->pageName = $pageName;
}
public function getMetaData() {
return ViewMetaData::generate()->addJavaScript($this->jsPath . '/wiki.js');
}
/**
* Renders the view
*
@ -69,31 +73,37 @@
<th>Date</th>
<th>Message</th>
<th>Author</th>
<th>Diff</th>
<th colspan="3">Diff</th>
</tr>
<?php
$previous = null;
foreach ($this->revisions as $revision => $history) {
foreach ($this->revisions as $revision => $revisionData) {
$affectedBytes = 'n/a';
if ($previous !== null) {
$link = $this->wikiPath . '/' . $this->pageName;
$link .= '?diff[' . $previous->revision . ',' . $revision .']';
$affectedBytes = strlen($history->wikitext) - strlen($previous->wikitext);
$affectedBytes = (($affectedBytes >= 0) ? '+' : '') . $affectedBytes;
$affectedBytes = '<a href="' . $link .'">' . $affectedBytes . ' bytes</a>';
$affectedBytes = strlen($revisionData->wikitext) - strlen($previous->wikitext);
$percentage = round(100 * $affectedBytes / strlen($revisionData->wikitext), 2);
$prefix = ($affectedBytes === 0) ? '&plusmn;' : (($affectedBytes > 0) ? '+' : '');
$suffix = (abs($affectedBytes) === 1) ? ' byte' : ' bytes';
$affectedBytes = $prefix . $affectedBytes . $suffix . ' (' . $prefix . $percentage . '%)';
$affectedBytes = '<a href="' . $link .'">' . $affectedBytes . '</a>';
}
$previous = $history;
$previous = $revisionData;
?>
<tr>
<td><?php echo $history->revision; ?></td>
<td><?php echo $history->created; ?></td>
<td><?php echo $history->message; ?></td>
<td><?php echo $history->created_user_id; ?></td>
<td><?php echo $revisionData->revision; ?></td>
<td><?php echo $revisionData->created; ?></td>
<td><?php echo $revisionData->message; ?></td>
<td><a href="<?php echo $this->wikiPath; ?>/Users?<?php echo $revisionData->user_name; ?>"><?php echo $revisionData->user_name; ?></a></td>
<td><?php echo $affectedBytes; ?></td>
<td><input type="radio" name="oldrev" value="<?php echo $revisionData->revision; ?>"/></td>
<td><input type="radio" name="newrev" value="<?php echo $revisionData->revision; ?>"/></td>
</tr>
<?php
@ -102,6 +112,10 @@
?>
<tr>
<td colspan="7"><input type="button" value="Compare Revisions" onclick="Wiki.compareRevisions('<?php echo $this->wikiPath . '/' . $this->pageName;?>?diff')"/>
</tr>
</table>
<?php

36
src/media/js/wiki.js Normal file
View File

@ -0,0 +1,36 @@
var Wiki = {
compareRevisions: function(path) {
var oldDiff = Wiki.getRevision("oldrev");
if (oldDiff === null) {
alert("No old revision is selected");
return false;
}
var newDiff = Wiki.getRevision("newrev");
if (newDiff === null) {
alert("No new revision is selected");
return false;
}
if (oldDiff === newDiff) {
alert("Cannot compare the same revision");
return false;
}
var url = path + "[" + oldDiff + "," + newDiff + "]";
document.location = url;
},
getRevision: function(name) {
var revs = document.getElementsByName(name);
for (var i = 0, len = revs.length; i < len; ++i) {
if (revs[i].checked) {
return revs[i].value;
}
}
return null;
}
}