the wiki is working better now

This commit is contained in:
JT Smith 2006-12-06 16:04:13 +00:00
parent 133cac4f77
commit 4eb99cebfb
5 changed files with 36 additions and 260 deletions

View file

@ -10,21 +10,19 @@
<div id="wikipage" class="yui-navset">
<ul class="yui-nav">
<li class="selected"><a href="#wikipagecontent"><em><tmpl_var viewLabel></em></a></li>
<li><a href="#wikipageedit"><em><tmpl_var editLabel></em></a></li>
</ul>
<div class="yui-content">
<div id="wikipagecontent">
<tmpl_var content>
</div>
<div id="wikipageedit">
<tmpl_var editContent>
</div>
</div>
</div>
<script type="text/javascript">
initWikiTabs = function() {
var tabView = new YAHOO.widget.TabView('wikipage');
tabView.addTab(new YAHOO.widget.Tab({
label: '<tmpl_var editLabel>',
dataSrc: '<tmpl_var editUrl>',
cacheData: true
}));
var tabView = new YAHOO.widget.TabView('wikipage');
tabView.addTab(new YAHOO.widget.Tab({
label: '<tmpl_var historyLabel>',

View file

@ -4,7 +4,6 @@
#url:default-wiki-search
#title:Default Wiki Search
#menuTitle:Default Wiki Search
<tmpl_if session.var.adminOn><p><tmpl_var controls></p></tmpl_if>
<tmpl_if displayTitle><h2><tmpl_var searchLabel></h2></tmpl_if>
@ -19,29 +18,11 @@
</div>
</tmpl_if>
<p><tmpl_var notWhatYouWanted></p>
<p><a href="javascript:wiki_getAddForm('<tmpl_var getEditFormUrl>');"><tmpl_var addPageLabel></a></p>
<p><a href="<tmpl_var addPageUrl>"><tmpl_var addPageLabel></a></p>
<tmpl_else>
<p><tmpl_var nothingFoundLabel></p>
<p><a href="javascript:wiki_getAddForm('<tmpl_var getEditFormUrl>');"><tmpl_var addPageLabel></a></p>
<p><a href="<tmpl_var addPageUrl>"><tmpl_var addPageLabel></a></p>
</tmpl_if>
</tmpl_if>
<div id="addFormGoesHere" style="display: none;"></div>
<div style="padding: 8px;"><a href="<tmpl_var mostPopularUrl>"><tmpl_var mostPopularLabel></a> | <a href="<tmpl_var recentChangesUrl>"><tmpl_var recentChangesLabel></a> | <a href="<tmpl_var wikiHomeUrl>"><tmpl_var wikiHomeLabel></a></div>
~~~
<script type="text/javascript" src="^Extras(yui/build/yahoo/yahoo-min.js);"></script>
<script type="text/javascript" src="^Extras(yui/build/connection/connection-min.js);"></script>
<script type="text/javascript">
function wiki_getAddForm (url) {
var request = YAHOO.util.Connect.asyncRequest('GET', url, { success:wiki_displayAddForm, failure:wiki_connectFailure });
}
function wiki_displayAddForm (response) {
var thediv = document.getElementById("addFormGoesHere");
thediv.style.display = "block";
thediv.innerHTML = response.responseText;
}
function wiki_connectFailure (response) {
alert("Couldn't connect to server: " + response.status + "(" + response.statusText+")");
}
</script>

View file

@ -56,8 +56,8 @@ sub addWikiAssets {
CREATE TABLE `WikiMaster` (
`assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL,
`revisionDate` bigint(20) NOT NULL,
`groupToEditPages` varchar(22) character set utf8 collate utf8_bin NOT NULL,
`groupToAdminister` varchar(22) character set utf8 collate utf8_bin NOT NULL,
`groupToEditPages` varchar(22) character set utf8 collate utf8_bin NOT NULL default '2',
`groupToAdminister` varchar(22) character set utf8 collate utf8_bin NOT NULL default '3',
`richEditor` varchar(22) character set utf8 collate utf8_bin NOT NULL
default 'PBrichedit000000000002',
`frontPageTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL

View file

@ -60,34 +60,13 @@ sub canAdd {
$class->SUPER::canAdd($session, undef, '7');
}
#-------------------------------------------------------------------
sub canDelete {
my $self = shift;
my $userId = shift || $self->session->user->userId;
return $self->getWiki->canAdminister($userId);
}
#-------------------------------------------------------------------
sub canEdit {
my $self = shift;
my $userId = shift || $self->session->user->userId;
return 0 if $self->isProtected and not $self->getWiki->canAdminister($userId);
return $self->couldEdit($userId);
}
#-------------------------------------------------------------------
sub canProtect {
my $self = shift;
my $userId = shift || $self->session->user->userId;
return $self->getWiki->canAdminister($userId);
}
#-------------------------------------------------------------------
sub couldEdit {
my $self = shift;
my $userId = shift || $self->session->user->userId;
return 0 unless $self->getWiki->canEditPages($userId);
return 1;
my $form = $self->session->form;
return (($form->process("func") eq "add" || ($form->process("assetId") eq "new" && $form->process("func") eq "editSave" && $form->process("class","className") eq "WebGUI::Asset::WikiPage")) && $self->getWiki->canEditPages) # account for new pages
|| (!$self->isProtected && $self->getWiki->canEditPages) # account for normal editing
|| $self->getWiki->canAdminister; # account for admins
}
#-------------------------------------------------------------------
@ -163,7 +142,7 @@ sub getEditForm {
title=> $i18n->get("editing")." ".(defined($self->get('title'))? $self->get('title') : $i18n->get("assetName")),
formHeader => WebGUI::Form::formHeader($session, { action => $url})
.WebGUI::Form::hidden($session, { name => 'func', value => 'editSave' })
.WebGUI::Form::hidden($session, { name=>"proceed", value=>$form->process("proceed") }),
.WebGUI::Form::hidden($session, { name=>"proceed", value=>"showConfirmation" }),
formTitle => WebGUI::Form::text($session, { name => 'title', maxlength => 255, size => 40, value => $self->get('title') }),
formContent => WebGUI::Form::HTMLArea($session, { name => 'content', richEditId => $wiki->get('richEditor'), value => $self->get('content') }),
formSubmit => WebGUI::Form::submit($session, { value => 'Save' }),
@ -310,7 +289,7 @@ sub view {
mostPopularLabel=>$i18n->get("mostPopularLabel", "Asset_WikiMaster"),
wikiHomeUrl=>$self->getParent->getUrl,
historyUrl=>$self->getUrl("func=getHistory"),
editUrl=>$self->getUrl("func=edit;ajax=1"),
editContent=>$self->getEditForm,
content => $self->getWiki->autolinkHtml($self->get('content')),
};
return $self->processTemplate($var, $self->getWiki->get("pageTemplateId"));
@ -319,27 +298,23 @@ sub view {
#-------------------------------------------------------------------
sub www_delete {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canDelete;
return $self->session->privilege->insufficient unless $self->canAdminister;
$self->trash;
$self->session->asset($self->getParent);
return $self->getParent->www_view;
}
#-------------------------------------------------------------------
# here to keep backward compatibility with traditional editing
sub www_edit {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canEdit;
if ($self->session->form->param("ajax")) {
$self->session->style->sent(1);
return $self->getEditForm;
}
return $self->getWiki->processStyle($self->getEditForm);
}
#-------------------------------------------------------------------
sub www_getHistory {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canEdit;
my $var = {};
my ($icon, $date) = $self->session->quick(qw(icon datetime));
foreach my $revision (@{$self->getRevisions}) {

View file

@ -18,196 +18,6 @@ use WebGUI::Utility;
use HTML::Parser;
use URI::Escape;
#-------------------------------------------------------------------
sub _appendFuncTemplateVars {
my $self = shift;
my $var = shift;
my @funcs = @_;
my $i18n = WebGUI::International->new($self->session, 'Asset_WikiMaster');
my %specialFuncs =
(addPage => 'func=add;class=WebGUI::Asset::WikiPage');
foreach my $func (@funcs) {
$var->{$func.'Url'} = $self->getUrl($specialFuncs{$func} || "func=$func");
$var->{$func.'Text'} = $i18n->get("func $func link text");
}
}
#-------------------------------------------------------------------
sub _appendRecentChangesVars {
my $self = shift;
my $var = shift;
my $limit = shift;
my $time = $self->session->datetime->time;
my $entries = $self->_templateSubvarsRefOfEdits($self->_editsRefOfRecentChanges($limit), $time);
my $days = $self->_daysRefOfTemplateSubvars($entries);
$var->{'recentChangesEntries'} = $entries;
$var->{'recentChangesDays'} = $days;
return $self;
}
#-------------------------------------------------------------------
sub _appendSearchBoxVars {
my $self = shift;
my $var = shift;
my $queryText = shift;
my $submitText = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('searchLabel');
$var->{'searchFormHeader'} = join '',
(WebGUI::Form::formHeader($self->session, { action => $self->getUrl}),
WebGUI::Form::hidden($self->session, { name => 'func', value => 'search' }));
$var->{'searchQuery'} = WebGUI::Form::text($self->session, { name => 'query', value => $queryText });
$var->{'searchSubmit'} = WebGUI::Form::submit($self->session, { value => $submitText });
$var->{'searchFormFooter'} = WebGUI::Form::formFooter($self->session);
return $self;
}
#-------------------------------------------------------------------
sub _appendVarsOfDate {
my $self = shift;
my $var = shift;
my $date = shift;
my $prefix = shift;
my $relativeTo = shift;
my $dt = $self->session->datetime;
$var->{$prefix . (length($prefix)? 'Date':'date')} = $dt->epochToHuman($date, '%z');
$var->{$prefix . (length($prefix)? 'Time':'time')} = $dt->epochToHuman($date, '%Z');
if (defined $relativeTo) {
my $ago = WebGUI::International->new($self->session, 'Asset')->get('ago');
$var->{$prefix . (length($prefix)? 'Interval':'interval')} = sprintf '%s %s %s',
($dt->secondsToInterval($relativeTo - $date), $ago);
}
return $self;
}
#-------------------------------------------------------------------
sub _daysRefOfTemplateSubvars {
my $self = shift;
my $subvars = shift;
my @days = ();
foreach my $subvar (@$subvars) {
if (!@days or $subvar->{date} ne $days[-1][0]{date}) {
push @days, [$subvar];
} else {
push @{$days[-1]}, $subvar;
}
}
return [map { {'dayDate' => $$_[0]{date}, 'dayEntries' => $_} } @days];
}
#-------------------------------------------------------------------
sub _editsRefOfQuery {
my $self = shift;
my $queryPiece = shift || 'true';
my $placeholders = shift || [];
my $allowedActions = shift || [qw/edited trashed protected unprotected/];
my $allowedActionsPredicate = "IN (".join(', ', ('?') x @$allowedActions).")";
my $limit = shift;
my $limitClause = $limit? sprintf("LIMIT %d,%d", @$limit[0..1]) : "";
# Ick. Apparently assetHistory.dateStamp isn't always equivalent to assetData.revisionDate.
# It looks like the relationship between them is in fact semi-arbitrary. Then there's also that
# it doesn't seem to be safe to add extra possible values to assetHistory. So we have to do this.
# Bleagh.
$self->session->db->buildArrayRefOfHashRefs(<<"EOT", [(@$placeholders, @$allowedActions) x 3]);
SELECT h.userId AS userId, u.username AS username, h.dateStamp AS dateStamp,
h.actionTaken AS action, CONCAT('/', d.url) AS url, d.title AS title, a.assetId AS assetId
FROM assetHistory AS h LEFT JOIN users AS u ON h.userId = u.userId
INNER JOIN asset AS a ON h.assetId = a.assetId
INNER JOIN assetData AS d ON a.assetId = d.assetId AND h.dateStamp = d.revisionDate
WHERE $queryPiece AND h.actionTaken $allowedActionsPredicate
UNION
SELECT eh.userId AS userId, u.username AS username, eh.dateStamp AS dateStamp,
eh.actionTaken AS action, CONCAT('/', eh.url) AS url, eh.title AS title, a.assetId AS assetId
FROM WikiPage_extraHistory AS eh LEFT JOIN users AS u ON eh.userId = u.userId
INNER JOIN asset AS a ON eh.assetId = a.assetId
WHERE $queryPiece AND eh.actionTaken $allowedActionsPredicate
UNION
SELECT d.revisedBy AS userId, u.username AS username, d.revisionDate AS dateStamp,
'edited' AS action, CONCAT('/', d.url) AS url, d.title AS title, a.assetId AS assetId
FROM assetData AS d LEFT JOIN users AS u on d.revisedBy = u.userId
INNER JOIN asset AS a ON d.assetId = a.assetId
WHERE $queryPiece AND 'edited' $allowedActionsPredicate
ORDER BY dateStamp DESC
$limitClause
EOT
}
#-------------------------------------------------------------------
sub _editsRefOfRecentChanges {
my $self = shift;
my $limit = shift;
$self->_editsRefOfQuery("a.lineage LIKE CONCAT(?, '%') AND a.assetId <> ?", [$self->get('lineage'), $self->getId], [qw/edited trashed/], $limit);
}
#-------------------------------------------------------------------
sub _templateSubvarOfEdit {
my $self = shift;
my $edit = shift;
my $time = shift;
my $i18n = WebGUI::International->new($self->session, 'Asset_WikiMaster');
my $subvar = +{%$edit};
$self->_appendVarsOfDate($subvar, $subvar->{dateStamp}, '', $time);
# If only HTML::Template::Expr were standard.
$subvar->{isDelete} = ($subvar->{action} eq 'trashed');
$subvar->{isEdit} = ($subvar->{action} eq 'edited');
$subvar->{isProtect} = ($subvar->{action} eq 'protected');
$subvar->{isUnprotect} = ($subvar->{action} eq 'unprotected');
$subvar->{isCreateOrEdit} = $subvar->{isEdit};
if ($subvar->{isEdit}) {
my $icon = $self->session->icon;
$subvar->{toolbar} = $icon->delete("func=purgeRevision;revisionDate=".$subvar->{dateStamp}, $subvar->{url}, "Delete this revision?")
.$icon->edit('func=edit;revision='.$subvar->{dateStamp}, $subvar->{url})
.$icon->view('func=view;revision='.$subvar->{dateStamp}, $subvar->{url});
}
if ($subvar->{isEdit} and ($self->session->db->quickArray("SELECT MIN(revisionDate) FROM assetData WHERE assetId = ?", [$subvar->{assetId}]))[0] == $subvar->{dateStamp}) {
$subvar->{action} = 'created';
$subvar->{isEdit} = 0;
$subvar->{isCreate} = 1;
}
$subvar->{actionTaken} = $i18n->get('actionN '.$subvar->{action});
$subvar->{actionTakenLowerCase} = lc $subvar->{actionN};
return $subvar;
}
#-------------------------------------------------------------------
sub _templateSubvarOfPage {
my $self = shift;
my $page = shift;
my $subvar = {};
$page = WebGUI::Asset->newByDynamicClass($self->session, $page) unless ref $page;
$subvar->{title} = $page->get('title');
$subvar->{assetId} = $page->getId;
$subvar->{viewLatest} = $page->getUrl;
$subvar->{editLatest} = $page->getUrl('func=edit');
return $subvar;
}
#-------------------------------------------------------------------
sub _templateSubvarsRefOfEdits {
my $self = shift;
my $edits = shift;
my $time = shift;
return [map { $self->_templateSubvarOfEdit($_, $time) } @$edits];
}
#-------------------------------------------------------------------
sub _templateSubvarsRefOfPages {
my $self = shift;
my $pages = shift;
return [map { $self->_templateSubvarOfPage($_) } @$pages];
}
#-------------------------------------------------------------------
sub appendMostPopular {
my $self = shift;
@ -245,6 +55,21 @@ sub appendRecentChanges {
}
}
#-------------------------------------------------------------------
sub appendSearchBoxVars {
my $self = shift;
my $var = shift;
my $queryText = shift;
my $submitText = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('searchLabel');
$var->{'searchFormHeader'} = join '',
(WebGUI::Form::formHeader($self->session, { action => $self->getUrl}),
WebGUI::Form::hidden($self->session, { name => 'func', value => 'search' }));
$var->{'searchQuery'} = WebGUI::Form::text($self->session, { name => 'query', value => $queryText });
$var->{'searchSubmit'} = WebGUI::Form::submit($self->session, { value => $submitText });
$var->{'searchFormFooter'} = WebGUI::Form::formFooter($self->session);
return $self;
}
#-------------------------------------------------------------------
sub autolinkHtml {
my $self = shift;
@ -287,9 +112,7 @@ sub autolinkHtml {
#-------------------------------------------------------------------
sub canAdminister {
my $self = shift;
my $userId = shift || $self->session->user->userId;
my $user = WebGUI::User->new($self->session, $userId);
return $self->canView($userId) && $user->isInGroup($self->get('groupToAdminister'));
return $self->session->user->isInGroup($self->get('groupToAdminister')) || $self->canEdit;
}
#-------------------------------------------------------------------
@ -313,7 +136,7 @@ sub definition {
%properties =
(
groupToEditPages => { fieldType => 'group',
defaultValue => ['7'],
defaultValue => ['2'],
tab => 'security',
hoverHelp => $i18n->get('groupToEditPages hoverHelp'),
label => $i18n->get('groupToEditPages label') },
@ -485,10 +308,9 @@ sub view {
recentChangesLabel=>$i18n->get("recentChangesLabel"),
};
my $template = $self->{_frontPageTemplate};
$self->_appendSearchBoxVars($var);
$self->appendSearchBoxVars($var);
$self->appendRecentChanges($var, $self->get('recentChangesCountFront'));
$self->appendMostPopular($var, $self->get('mostPopularCountFront'));
$self->_appendFuncTemplateVars($var, qw/recentChanges/);
return $self->processTemplate($var, undef, $template);
}
@ -543,10 +365,10 @@ sub www_search {
mostPopularUrl=>$self->getUrl("func=mostPopular"),
mostPopularLabel=>$i18n->get("mostPopularLabel"),
wikiHomeUrl=>$self->getUrl,
getEditFormUrl=>$self->getUrl("func=add;class=WebGUI::Asset::WikiPage;ajax=1"),
addPageUrl=>$self->getUrl("func=add;class=WebGUI::Asset::WikiPage"),
};
my $queryString = $self->session->form->process('query', 'text');
$self->_appendSearchBoxVars($var, $queryString);
$self->appendSearchBoxVars($var, $queryString);
if (length $queryString) {
my $search = WebGUI::Search->new($self->session);
$search->search({ keywords => $queryString,