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)) $data = ViewMetaData::generate()->addMeta('revised', date('c', $revised))
->addCss($this->cssPath . '/global.css'); ->addCss($this->cssPath . '/global.css');
return parent::getMetaData()->merge($data);
} }
/** /**

View File

@ -47,14 +47,18 @@
public function __construct(Collection $revisions, $pageName, $priority = 0) { public function __construct(Collection $revisions, $pageName, $priority = 0) {
parent::__construct($priority); parent::__construct($priority);
if ($revisions->type !== 'WikiHistory') { if ($revisions->type !== 'Registry') {
throw new InvalidTypeException(1, 'Collection with type "WikiHistory"', $revisions); throw new InvalidTypeException(1, 'Collection with type "Registry"', $revisions);
} }
$this->revisions = $revisions; $this->revisions = $revisions;
$this->pageName = $pageName; $this->pageName = $pageName;
} }
public function getMetaData() {
return ViewMetaData::generate()->addJavaScript($this->jsPath . '/wiki.js');
}
/** /**
* Renders the view * Renders the view
* *
@ -69,31 +73,37 @@
<th>Date</th> <th>Date</th>
<th>Message</th> <th>Message</th>
<th>Author</th> <th>Author</th>
<th>Diff</th> <th colspan="3">Diff</th>
</tr> </tr>
<?php <?php
$previous = null; $previous = null;
foreach ($this->revisions as $revision => $history) { foreach ($this->revisions as $revision => $revisionData) {
$affectedBytes = 'n/a'; $affectedBytes = 'n/a';
if ($previous !== null) { if ($previous !== null) {
$link = $this->wikiPath . '/' . $this->pageName; $link = $this->wikiPath . '/' . $this->pageName;
$link .= '?diff[' . $previous->revision . ',' . $revision .']'; $link .= '?diff[' . $previous->revision . ',' . $revision .']';
$affectedBytes = strlen($history->wikitext) - strlen($previous->wikitext); $affectedBytes = strlen($revisionData->wikitext) - strlen($previous->wikitext);
$affectedBytes = (($affectedBytes >= 0) ? '+' : '') . $affectedBytes; $percentage = round(100 * $affectedBytes / strlen($revisionData->wikitext), 2);
$affectedBytes = '<a href="' . $link .'">' . $affectedBytes . ' bytes</a>'; $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> <tr>
<td><?php echo $history->revision; ?></td> <td><?php echo $revisionData->revision; ?></td>
<td><?php echo $history->created; ?></td> <td><?php echo $revisionData->created; ?></td>
<td><?php echo $history->message; ?></td> <td><?php echo $revisionData->message; ?></td>
<td><?php echo $history->created_user_id; ?></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><?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> </tr>
<?php <?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> </table>
<?php <?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;
}
}