From a6b5b27977aaa82c1bf23da7bab59ecbf52f4c6f Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Tue, 9 Nov 2010 13:28:02 -0600 Subject: [PATCH] split www_editSave to create www_addSave www_addSave gets called when adding new assets --- lib/WebGUI/Asset.pm | 185 +++++++++++++++++++++++++++++++------------- 1 file changed, 133 insertions(+), 52 deletions(-) diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index ce7a8f497..1da9b9f5c 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -2644,13 +2644,14 @@ sub view { =head2 www_add ( ) -Adds a new Asset based upon the class of the current form. Returns the Asset calling method www_edit(); The -new Asset will inherit security and style properties from the current asset, the parent. +Show the form to add a new child asset. =cut sub www_add { - my $self = shift; + my $self = shift; + my $session = $self->session; + my ( $style, $url ) = $session->quick(qw( style url )); my %prototypeProperties; my $class = $self->loadModule($self->session->form->process("className","className")); return undef unless (defined $class); @@ -2681,7 +2682,128 @@ sub www_add { $properties{isHidden} = 1 unless $self->session->config->get("assets/".$class."/isContainer"); my $newAsset = WebGUI::Asset->newByPropertyHashRef($self->session,\%properties); $newAsset->{_parent} = $self; - return $newAsset->www_edit(); + + my $f = eval { $newAsset->getEditForm }; + return $@ if $@; + $f->addField( "Hidden", name => "func", value => "addSave" ); + $f->action( $self->getUrl ); + $f->getTab('meta')->getField( 'className' )->set('value', $class); + # TODO: Make this whole thing a template instead! + $style->setCss($url->extras('yui/build/button/assets/skins/sam/button.css')); + $style->setScript($url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js')); + $style->setScript($url->extras('yui/build/element/element-min.js')); + $style->setScript($url->extras('yui/build/button/button-min.js')); + $style->setRawHeadTags(<<'ENDHTML'); + + +ENDHTML + return $self->session->style->process( + '
' . $f->toHtml . '
', + "PBtmpl0000000000000137" + ); +} + +sub www_addSave { + my $self = shift; + my $session = $self->session; + my ( $form ) = $session->quick(qw{ form }); + + return $session->privilege->insufficient() unless $self->canEdit; + if ($self->session->config("maximumAssets")) { + my ($count) = $self->session->db->quickArray("select count(*) from asset"); + my $i18n = WebGUI::International->new($self->session, "Asset"); + return $self->session->style->userStyle($i18n->get("over max assets")) if ($self->session->config("maximumAssets") <= $count); + } + my $object; + my $className = $form->process('className','className') || $form->process('class','className'); + $object = $self->addChild({className=>$className}); + return $self->www_view unless defined $object; + $object->{_parent} = $self; + $object->url(undef); + + # Process properties from form post + my $errors = $object->processEditForm; + if (ref $errors eq 'ARRAY') { + $session->stow->set('editFormErrors', $errors); + if ($session->form->process('assetId') eq 'new') { + $object->purge; + return $self->www_add(); + } else { + $object->purgeRevision; + return $self->www_edit(); + } + } + + $object->updateHistory("added"); + + # we handle auto commit assets here in case they didn't handle it themselves + if ($object->getAutoCommitWorkflowId) { + $object->requestAutoCommit; + #Since the version tag makes new objects, fetch a fresh one here. + $object = $object->cloneFromDb; + } + # else, try to to auto commit + else { + my $commitStatus = WebGUI::VersionTag->autoCommitWorkingIfEnabled($session, { + override => scalar $session->form->process('saveAndCommit'), + allowComments => 1, + returnUrl => $self->getUrl, + }); + if ($commitStatus eq 'redirect') { + ##Redirect set by tag. Return nothing to send the user over to the redirect. + return undef; + } + elsif ($commitStatus eq 'commit') { + ##Commit was successful. Update the local object cache so that it will no longer + ##register as locked. + $object = $object->cloneFromDb; + } + } + + # Handle "saveAndReturn" button + if ( $session->form->process( "saveAndReturn" ) ne "" ) { + return $object->www_edit; + } + + # Handle "proceed" form parameter + my $proceed = $session->form->process('proceed'); + if ($proceed eq "manageAssets") { + $session->asset($object->getParent); + return $session->asset->www_manageAssets; + } + elsif ($proceed eq "viewParent") { + $session->asset($object->getParent); + return $session->asset->www_view; + } + elsif ($proceed eq "editParent") { + $session->asset($object->getParent); + return $session->asset->www_edit; + } + elsif ($proceed eq "goBackToPage" && $session->form->process('returnUrl')) { + $session->http->setRedirect($session->form->process("returnUrl")); + return undef; + } + elsif ($proceed ne "") { + my $method = "www_".$session->form->process("proceed"); + $session->asset($object); + return $session->asset->$method(); + } + + $session->asset($object->getContainer); + return $session->asset->www_view; } #------------------------------------------------------------------- @@ -2771,14 +2893,7 @@ sub www_edit { my $f = eval { $self->getEditForm }; return $@ if $@; $f->addField( "Hidden", name => "func", value => "editSave" ); - if ( $func eq 'add' ) { - my $className = $self->session->form->get('className'); - $f->action( $self->getParent->getUrl ); - $f->getTab('meta')->getField( 'className' )->set('value', $className); - } - else { - $f->action( $self->getUrl ); - } + $f->action( $self->getUrl ); # TODO: Make this whole thing a template instead! $style->setCss($url->extras('yui/build/button/assets/skins/sam/button.css')); @@ -2800,18 +2915,11 @@ sub www_edit { new YAHOO.widget.Button('saveAndCommitButton'); } } ); - -ENDHTML - - if ( $func ne 'add' ) { - $self->session->style->setRawHeadTags(<<'ENDHTML'); - ENDHTML - } return $self->session->style->process( '
' . $f->toHtml . '
', @@ -2823,9 +2931,7 @@ ENDHTML =head2 www_editSave ( ) -Saves and updates history. If canEdit, returns www_manageAssets() if a new Asset is created, otherwise returns www_view(). Will return an insufficient Privilege if canEdit returns False, or if the submitted form does not pass the C<$session->form->validToken> check. - -NOTE: Don't try to override or overload this method. It won't work. What you are looking for is processEditForm(). +Save a new revision of this asset. =cut @@ -2835,41 +2941,16 @@ sub www_editSave { my ( $form ) = $session->quick(qw{ form }); ##If this is a new asset (www_add), the parent may be locked. We should still be able to add a new asset. - my $isNewAsset = $session->form->process("assetId") eq "new" ? 1 : 0; - return $session->privilege->locked() if (!$self->canEditIfLocked and !$isNewAsset); + return $session->privilege->locked() unless $self->canEditIfLocked; return $session->privilege->insufficient() unless $self->canEdit; - if ($self->session->config("maximumAssets")) { - my ($count) = $self->session->db->quickArray("select count(*) from asset"); - my $i18n = WebGUI::International->new($self->session, "Asset"); - return $self->session->style->userStyle($i18n->get("over max assets")) if ($self->session->config("maximumAssets") <= $count); - } - my $object; - if ($isNewAsset) { - my $className = $form->process('className','className') || $form->process('class','className'); - $object = $self->addChild({className=>$className}); - return $self->www_view unless defined $object; - $object->{_parent} = $self; - $object->url(undef); - } - else { - if ($self->canEditIfLocked) { - $object = $self->addRevision; - } - else { - return $session->asset($self->getContainer)->www_view; - } - } + my $object = $self->addRevision; + # Process properties from form post my $errors = $object->processEditForm; if (ref $errors eq 'ARRAY') { $session->stow->set('editFormErrors', $errors); - if ($session->form->process('assetId') eq 'new') { - $object->purge; - return $self->www_add(); - } else { - $object->purgeRevision; - return $self->www_edit(); - } + $object->purgeRevision; + return $self->www_edit(); } $object->updateHistory("edited");