moving wiki down the path of ajax enlightenment

This commit is contained in:
JT Smith 2006-11-28 21:29:58 +00:00
parent 650ddb805d
commit efa444c1d3
11 changed files with 336 additions and 286 deletions

View file

@ -749,7 +749,20 @@ sub processPropertiesFromFormPost {
$self->getThread->subscribe if ($self->session->form->process("subscribe"));
delete $self->{_storageLocation};
$self->postProcess;
$self->requestCommit;
# allows us to let the cs post use it's own workflow approval process
my $currentTag = WebGUI::VersionTag->getWorking($self->session);
if ($currentTag->getAssetCount < 2) {
$currentTag->set({workflowId=>$self->getThread->getParent->get("approvalWorkflow")});
$currentTag->requestCommit;
} else {
my $newTag = WebGUI::VersionTag->create($self->session, {
name=>$self->getTitle." / ".$self->session->user->username,
workflowId=>$self->getThread->getParent->get("approvalWorkflow")
});
$self->session->db->write("update assetData set tagId=? where assetId=? and tagId=?",[$newTag->getId, $self->getId, $currentTag->getId]);
$self->purgeCache;
$newTag->requestCommit;
}
}
@ -869,25 +882,6 @@ sub rethreadUnder {
delete $self->{_thread};
}
#-------------------------------------------------------------------
# allows us to let the cs post use it's own workflow approval process
sub requestCommit {
my $self = shift;
my $currentTag = WebGUI::VersionTag->getWorking($self->session);
if ($currentTag->getAssetCount < 2) {
$currentTag->set({workflowId=>$self->getThread->getParent->get("approvalWorkflow")});
$currentTag->requestCommit;
} else {
my $newTag = WebGUI::VersionTag->create($self->session, {
name=>$self->getTitle." / ".$self->session->user->username,
workflowId=>$self->getThread->getParent->get("approvalWorkflow")
});
$self->session->db->write("update assetData set tagId=? where assetId=? and tagId=?",[$newTag->getId, $self->getId, $currentTag->getId]);
$self->purgeCache;
$newTag->requestCommit;
}
}
#-------------------------------------------------------------------
=head2 setParent ( newParent )

View file

@ -14,6 +14,7 @@ use base 'WebGUI::Asset';
use strict;
use Tie::IxHash;
use WebGUI::International;
use WebGUI::Storage::Image;
use WebGUI::Utility;
#-------------------------------------------------------------------
@ -40,6 +41,48 @@ sub _appendFuncTemplateVars {
}
}
#-------------------------------------------------------------------
=head2 addChild ( )
You can't add children to a wiki page.
=cut
sub addChild {
return undef;
}
#-------------------------------------------------------------------
=head2 addRevision ( )
Override the default method in order to deal with attachments.
=cut
sub addRevision {
my $self = shift;
my $newSelf = $self->SUPER::addRevision(@_);
if ($self->get("storageId")) {
my $newStorage = WebGUI::Storage->get($self->session,$self->get("storageId"))->copy;
$newSelf->update({storageId=>$newStorage->getId});
}
my $now = time();
$newSelf->update({
isHidden => 1,
dateUpdated=>$now,
});
return $newSelf;
}
#-------------------------------------------------------------------
sub canAdd {
my $class = shift;
my $session = shift;
$class->SUPER::canAdd($session, undef, '7');
}
#-------------------------------------------------------------------
sub canDelete {
my $self = shift;
@ -110,6 +153,20 @@ sub duplicate {
}
#-------------------------------------------------------------------
sub getStorageLocation {
my $self = shift;
unless (exists $self->{_storageLocation}) {
if ($self->get("storageId") eq "") {
$self->{_storageLocation} = WebGUI::Storage::Image->create($self->session);
$self->update({storageId=>$self->{_storageLocation}->getId});
} else {
$self->{_storageLocation} = WebGUI::Storage::Image->get($self->session,$self->get("storageId"));
}
}
return $self->{_storageLocation};
}
#-------------------------------------------------------------------
sub getWiki {
my $self = shift;
@ -127,19 +184,11 @@ sub indexContent {
}
#-------------------------------------------------------------------
sub purge {
sub isProtected {
my $self = shift;
$self->getWiki->updateTitleIndex([$self], from => 'purge');
$self->session->db->write("DELETE FROM WikiPage_protected WHERE assetId = ?", [$self->getId]);
$self->session->db->write("DELETE FROM WikiPage_extraHistory WHERE assetId = ?", [$self->getId]);
return $self->SUPER::purge;
}
#-------------------------------------------------------------------
sub purgeRevision {
my $self = shift;
$self->getWiki->updateTitleIndex([$self], from => 'purgeRevision');
return $self->SUPER::purgeRevision;
return $self->{_isProtected} if exists $self->{_isProtected};
($self->{_isProtected}) = $self->session->db->quickArray("SELECT COUNT(assetId) FROM WikiPage_protected WHERE assetId = ?", [$self->getId]);
return $self->{_isProtected};
}
#-------------------------------------------------------------------
@ -152,6 +201,13 @@ sub preparePageTemplate {
return $self->{_pageTemplate};
}
#-------------------------------------------------------------------
sub prepareView {
my $self = shift;
$self->SUPER::prepareView;
$self->preparePageTemplate;
}
#-------------------------------------------------------------------
sub processPageTemplate {
my $self = shift;
@ -174,40 +230,60 @@ sub processPageTemplate {
return $self->processTemplate($var, undef, $template);
}
#-------------------------------------------------------------------
sub prepareView {
my $self = shift;
$self->SUPER::prepareView;
$self->preparePageTemplate;
}
#-------------------------------------------------------------------
sub view {
my $self = shift;
my $var = {};
my $title = $self->get('title');
my $content = $self->getWiki->autolinkHtml($self->get('content'));
return $self->getWiki->processMasterTemplate($title, $self->processPageTemplate($content, 'view'));
}
#-------------------------------------------------------------------
sub isProtected {
my $self = shift;
return $self->{_isProtected} if exists $self->{_isProtected};
($self->{_isProtected}) = $self->session->db->quickArray("SELECT COUNT(assetId) FROM WikiPage_protected WHERE assetId = ?", [$self->getId]);
return $self->{_isProtected};
}
#-------------------------------------------------------------------
sub processPropertiesFromFormPost {
my $self = shift;
my $ret = $self->SUPER::processPropertiesFromFormPost(@_);
$self->SUPER::processPropertiesFromFormPost(@_);
$self->update({ groupIdView => $self->getWiki->get('groupIdView'),
groupIdEdit => $self->getWiki->get('groupIdEdit') });
$self->getWiki->updateTitleIndex([$self], from => 'edit');
return $ret;
delete $self->{_storageLocation};
my $size = 0;
my $storage = $self->getStorageLocation;
foreach my $file (@{$storage->getFiles}) {
if ($storage->isImage($file)) {
##Use generateThumbnail to shrink size to site's max image size
##We should look into using the new resize method instead.
$storage->generateThumbnail($file, $self->getWiki->get("maxImageSize") || $self->session->setting->get("maxImageSize"));
$storage->deleteFile($file);
$storage->renameFile('thumb-'.$file,$file);
$storage->generateThumbnail($file, $self->getWiki->get("thumbnailSize"));
}
$size += $storage->getFileSize($file);
}
$self->setSize($size);
# allows us to let the cs post use it's own workflow approval process
my $currentTag = WebGUI::VersionTag->getWorking($self->session);
if ($currentTag->getAssetCount < 2) {
$currentTag->set({workflowId=>$self->getWiki->get("approvalWorkflow")});
$currentTag->requestCommit;
} else {
my $newTag = WebGUI::VersionTag->create($self->session, {
name=>$self->getTitle." / ".$self->session->user->username,
workflowId=>$self->getWiki->get("approvalWorkflow")
});
$self->session->db->write("update assetData set tagId=? where assetId=? and tagId=?",[$newTag->getId, $self->getId, $currentTag->getId]);
$self->purgeCache;
$newTag->requestCommit;
}
}
#-------------------------------------------------------------------
sub purge {
my $self = shift;
$self->getWiki->updateTitleIndex([$self], from => 'purge');
$self->session->db->write("DELETE FROM WikiPage_protected WHERE assetId = ?", [$self->getId]);
$self->session->db->write("DELETE FROM WikiPage_extraHistory WHERE assetId = ?", [$self->getId]);
return $self->SUPER::purge;
}
#-------------------------------------------------------------------
sub purgeRevision {
my $self = shift;
$self->getWiki->updateTitleIndex([$self], from => 'purgeRevision');
return $self->SUPER::purgeRevision;
}
#-------------------------------------------------------------------
sub updateWikiHistory {
my $self = shift;
@ -216,6 +292,13 @@ sub updateWikiHistory {
$self->session->db->write("INSERT INTO WikiPage_extraHistory (assetId, userId, dateStamp, actionTaken, url, title) VALUES (?, ?, ?, ?, ?, ?)", [$self->getId, $userId, $self->session->datetime->time, $action, $self->getUrl, $self->get('title')]);
}
#-------------------------------------------------------------------
sub view {
my $self = shift;
my $var = {};
my $content = $self->getWiki->autolinkHtml($self->get('content'));
return $self->processPageTemplate($content, 'view');
}
#-------------------------------------------------------------------
sub www_delete {
@ -235,22 +318,9 @@ sub www_edit {
my $var = {};
my $newPage = 0;
$template->prepare;
if ($self->session->form->process('func') eq 'add') {
# New page.
$newPage = 1;
$var->{'form.header'} = join '',
(WebGUI::Form::formHeader($self->session,
{ action => $self->getWiki->getUrl('func=addPageSave') }),
WebGUI::Form::hidden($self->session, { name => 'class', value => ref $self }));
} else {
# Editing a page.
$newPage = 0;
$var->{'form.header'} = join '',
(WebGUI::Form::formHeader($self->session,
{ action => $self->getUrl('func=editSave') }));
}
$var->{'form.header'} = WebGUI::Form::formHeader($self->session, { action => $self->getWiki->getUrl })
.WebGUI::Form::hidden($self->session, { name => 'func', value => 'editSave' })
.WebGUI::Form::hidden($self->session, { name => 'class', value => ref $self });
$var->{'form.title'} = WebGUI::Form::text
($self->session, { name => 'title', maxlength => 255,
size => 40, value => $self->get('title') });
@ -262,55 +332,23 @@ sub www_edit {
$var->{'form.footer'} = WebGUI::Form::formFooter($self->session);
$self->_appendFuncTemplateVars($var);
my $title = "Editing ".(defined($self->get('title'))? $self->get('title') : 'new page');
$var->{title} = "Editing ".(defined($self->get('title'))? $self->get('title') : 'new page');
return $self->getWiki->processStyle($self->getWiki->processMasterTemplate($title, $self->processPageTemplate($self->processTemplate($var, undef, $template), 'edit')));
}
#-------------------------------------------------------------------
sub www_editSave {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canEdit;
# TODO: refactor: duplication with A::W::Matrix::www_editListingSave
my $oldTag = WebGUI::VersionTag->getWorking($self->session, 1);
my $newTag = WebGUI::VersionTag->create
($self->session, { name => (sprintf "%s edit of %s - %s",
$self->getWiki->get('title'), $self->get('title'),
$self->session->user->username),
workflowId => 'pbworkflow000000000003' });
$newTag->setWorking;
my $newSelf = $self->addRevision;
my $error = $newSelf->processPropertiesFromFormPost;
if (ref $error eq 'ARRAY') {
$self->session->stow->set('editFormErrors', $error);
$newTag->rollback;
$oldTag->setWorking if defined $oldTag;
return $self->www_edit;
}
$newSelf->updateHistory('edited');
$newTag->requestCommit;
$newTag->clearWorking;
$oldTag->setWorking if defined $oldTag;
return $newSelf->www_view;
return $self->getWiki->processStyle( $self->processPageTemplate($self->processTemplate($var, undef, $template), 'edit'));
}
#-------------------------------------------------------------------
sub www_pageHistory {
my $self = shift;
my $title = sprintf(WebGUI::International->new($self->session, 'Asset_WikiPage')->get('pageHistory title'),
$self->get('title'));
my $template = WebGUI::Asset::Template->new($self->session, $self->getWiki->get('pageHistoryTemplateId'));
$template->prepare;
# Buggo: hardcoded count
my $var = {};
$var->{title} = sprintf(WebGUI::International->new($self->session, 'Asset_WikiPage')->get('pageHistory title'), $self->get('title'));
$self->getWiki->_appendPageHistoryVars($var, [0, 50], $self);
return $self->getWiki->processStyle($self->getWiki->processMasterTemplate($title, $self->processPageTemplate($self->processTemplate($var, undef, $template), 'pageHistory')));
return $self->getWiki->processStyle($self->processPageTemplate($self->processTemplate($var, undef, $template), 'pageHistory'));
}
#-------------------------------------------------------------------

View file

@ -342,13 +342,6 @@ sub definition {
hoverHelp => $i18n->get('richEditor hoverHelp'),
label => $i18n->get('richEditor label') },
masterTemplateId => { fieldType => 'template',
namespace => 'WikiMaster',
defaultValue => 'WikiMasterTmpl00000001',
tab => 'display',
hoverHelp => $i18n->get('masterTemplateId hoverHelp'),
label => $i18n->get('masterTemplateId label') },
frontPageTemplateId => { fieldType => 'template',
namespace => 'WikiMaster_front',
defaultValue => 'WikiFrontTmpl000000001',
@ -377,13 +370,6 @@ sub definition {
hoverHelp => $i18n->get('recentChangesTemplateId hoverHelp'),
label => $i18n->get('recentChangesTemplateId label') },
pageListTemplateId => { fieldType => 'template',
namespace => 'WikiMaster_pageList',
defaultValue => 'WikiPLTmpl000000000001',
tab => 'display',
hoverHelp => $i18n->get('pageListTemplateId hoverHelp'),
label => $i18n->get('pageListTemplateId label') },
searchTemplateId => { fieldType => 'template',
namespace => 'WikiMaster_search',
defaultValue => 'WikiSearchTmpl00000001',
@ -402,7 +388,29 @@ sub definition {
tab => 'display',
hoverHelp => $i18n->get('recentChangesCountFront hoverHelp'),
label => $i18n->get('recentChangesCountFront label') },
);
approvalWorkflow =>{
fieldType=>"workflow",
defaultValue=>"pbworkflow000000000003",
type=>'WebGUI::VersionTag',
tab=>'security',
label=>$i18n->get('approval workflow'),
hoverHelp=>$i18n->get('approval workflow description'),
},
thumbnailSize => {
fieldType => "integer",
defaultValue => 0,
tab => "display",
label => $i18n->get("thumbnail size"),
hoverHelp => $i18n->get("thumbnail size help")
},
maxImageSize => {
fieldType => "integer",
defaultValue => 0,
tab => "display",
label => $i18n->get("max image size"),
hoverHelp => $i18n->get("max image size help")
},
);
push @$definition,
{
@ -424,38 +432,11 @@ sub getContentLastModified {
return $lastModified;
}
#-------------------------------------------------------------------
sub prepareMasterTemplate {
my $self = shift;
return $self->{_masterTemplate} if $self->{_masterTemplate};
$self->{_masterTemplate} =
WebGUI::Asset::Template->new($self->session, $self->get('masterTemplateId'));
$self->{_masterTemplate}->prepare;
return $self->{_masterTemplate};
}
#-------------------------------------------------------------------
sub processMasterTemplate {
my $self = shift;
my $title = shift;
my $content = shift;
my $var = {};
my $template = $self->prepareMasterTemplate;
$var->{title} = $title;
$var->{content} = $content;
$var->{displayTitle} = $self->get('displayTitle');
$var->{canEdit} = $self->canEditPages;
$self->_appendFuncTemplateVars($var, qw/addPage listPages recentChanges view search/);
return $self->processTemplate($var, undef, $template);
}
#-------------------------------------------------------------------
sub prepareView {
my $self = shift;
$self->SUPER::prepareView;
$self->prepareMasterTemplate;
$self->{_frontPageTemplate} =
WebGUI::Asset::Template->new($self->session, $self->get('frontPageTemplateId'));
$self->{_frontPageTemplate}->prepare;
@ -464,19 +445,16 @@ sub prepareView {
#-------------------------------------------------------------------
sub processPropertiesFromFormPost {
my $self = shift;
my $groupsChanged =
(($self->session->form->process('groupIdView') ne $self->get('groupIdView'))
or ($self->session->form->process('groupIdEdit') ne $self->get('groupIdEdit')));
my $ret = $self->SUPER::processPropertiesFromFormPost(@_);
if ($groupsChanged) {
foreach my $child (@{$self->getLineage(['children'], {returnObjects => 1})}) {
$child->update({ groupIdView => $self->get('groupIdView'),
groupIdEdit => $self->get('groupIdEdit') });
}
}
return $ret;
}
@ -494,7 +472,6 @@ sub updateTitleIndex {
my %opts = @_;
return unless @pages;
$self->session->db->write("DELETE FROM WikiMaster_titleIndex WHERE assetId = ? AND pageId IN (".join(', ', ('?') x @pages).")", [$self->getId, map{$_->getId} @pages]);
foreach my $page (@pages) {
my ($pageId, $title) = ($page->getId, $page->get('title'));
$self->session->db->write("INSERT INTO WikiMaster_titleIndex (assetId, pageId, title) VALUES (?, ?, ?)", [$self->getId, $pageId, $title]);
@ -506,76 +483,23 @@ sub view {
my $self = shift;
my $var = {};
my $template = $self->{_frontPageTemplate};
$var->{'description'} = $self->autolinkHtml($self->get('description'));
$self->_appendSearchBoxVars($var);
$self->_appendRecentChangesVars($var, [0, $self->get('recentChangesCountFront')]);
$self->_appendFuncTemplateVars($var, qw/recentChanges/);
return $self->processMasterTemplate($self->get('title'), $self->processTemplate($var, undef, $template));
return $self->processTemplate($var, undef, $template);
}
#-------------------------------------------------------------------
sub www_addPageSave {
my $self = shift;
my $pageClass = $self->session->form->process('class');
return $self->session->privilege->insufficient unless
$self->canEditPages and UNIVERSAL::isa($pageClass, 'WebGUI::Asset::WikiPage');
# Refactor: duplication with A::W::Matrix::www_editListingSave
my $oldTag = WebGUI::VersionTag->getWorking($self->session, 1);
my $newTag = WebGUI::VersionTag->create
($self->session, { name => (sprintf "%s create of %s - %s",
$self->get('title'), $self->session->form->process('title'),
$self->session->user->username),
workflowId => 'pbworkflow000000000003' });
$newTag->setWorking;
# Hrm. Duplication with Asset::www_editSave. How to fix that?
my $page = $self->addChild({ className => $pageClass });
$page->{_parent} = $self;
my $error = $page->processPropertiesFromFormPost;
if (ref $error eq 'ARRAY') {
$self->session->stow->set('editFormErrors', $error);
$page->purge;
return $self->www_add;
}
$page->updateHistory('edited');
$newTag->requestCommit;
$newTag->clearWorking;
$oldTag->setWorking if defined $oldTag;
return $page->www_view;
}
#-------------------------------------------------------------------
sub www_listPages {
my $self = shift;
my $i18n = WebGUI::International->new($self->session, 'Asset_WikiMaster');
my $title = $i18n->get('listPages title');
my $template = WebGUI::Asset::Template->new($self->session, $self->get('pageListTemplateId'));
$template->prepare;
my @pages = sort { lc($a->get('title')) <=> lc($b->get('title')) }
@{$self->getLineage(['children'], {returnObjects => 1})};
my $var = {};
$var->{'pl.entries'} = $self->_templateSubvarsRefOfPages(\@pages);
return $self->processStyle($self->processMasterTemplate($title, $self->processTemplate($var, undef, $template)));
}
#-------------------------------------------------------------------
sub www_recentChanges {
my $self = shift;
my $title = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('recentChanges title');
my $template = WebGUI::Asset::Template->new($self->session, $self->get('recentChangesTemplateId'));
$template->prepare;
my $var = {};
$var->{title} = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('recentChanges title');
$self->_appendRecentChangesVars($var, [0, $self->get('recentChangesCount')]);
return $self->processStyle($self->processMasterTemplate($title, $self->processTemplate($var, undef, $template)));
return $self->processStyle($self->processTemplate($var, undef, $template));
}
#-------------------------------------------------------------------
@ -584,7 +508,6 @@ sub www_search {
my $var = {};
my $queryString = $self->session->form->process('query', 'text');
$self->_appendSearchBoxVars($var, $queryString);
if (length $queryString) {
my $search = WebGUI::Search->new($self->session);
$search->search({ keywords => $queryString,
@ -593,12 +516,10 @@ sub www_search {
my $rs = $search->getResultSet;
$self->_appendSearchResultVars($var, $rs);
}
my $title = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('search title');
$var->{title} = WebGUI::International->new($self->session, 'Asset_WikiMaster')->get('search title');
my $template = WebGUI::Asset::Template->new($self->session, $self->get('searchTemplateId'));
$template->prepare;
return $self->processStyle($self->processMasterTemplate($title, $self->processTemplate($var, undef, $template)));
return $self->processStyle($self->processTemplate($var, undef, $template));
}
1;