the wiki is working better now
This commit is contained in:
parent
133cac4f77
commit
4eb99cebfb
5 changed files with 36 additions and 260 deletions
|
|
@ -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>',
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue