initial edit page work

This commit is contained in:
Doug Bell 2010-04-30 10:29:40 -05:00
parent 3ae21d6349
commit ad96c88a36
9 changed files with 259 additions and 368 deletions

View file

@ -21,6 +21,7 @@ use HTML::Packer;
use Moose;
use WebGUI::Types;
use Data::Dumper;
use WebGUI::Definition::Asset;
define assetName => ['asset', 'Asset'];
@ -644,24 +645,6 @@ sub cloneFromDb {
#-------------------------------------------------------------------
=head2 drawExtraHeadTags ( )
Draw the Extra Head Tags. Done with a customDrawMethod because the Template
will override this.
=cut
sub drawExtraHeadTags {
my ($self, $params) = @_;
return WebGUI::Form::codearea($self->session, {
name => $params->{name},
value => $self->get($params->{name}),
defaultValue => undef,
});
}
#-------------------------------------------------------------------
=head2 extraHeadTags ( value )
Returns extraHeadTags
@ -777,25 +760,6 @@ sub fixUrl {
return $url;
}
#-------------------------------------------------------------------
=head2 getAdminConsole ( )
Returns a reference to a WebGUI::AdminConsole object.
=cut
sub getAdminConsole {
my $self = shift;
unless (exists $self->{_adminConsole}) {
$self->{_adminConsole} = WebGUI::AdminConsole->new($self->session,"assets");
}
$self->{_adminConsole}->setIcon($self->getIcon);
return $self->{_adminConsole};
}
#-------------------------------------------------------------------
=head2 getClassById ( $session, $assetId )
@ -897,255 +861,197 @@ sub getDefault {
=head2 getEditForm ()
Creates and returns a tabform to edit parameters of an Asset. See L<getEditTabs> for
adding additional tabs.
Creates and returns a WebGUI::FormBuilder form to edit parameters of an Asset.
=cut
sub getEditForm {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset");
my $ago = $i18n->get("ago");
my $tabform = WebGUI::TabForm->new($session,undef,undef,$self->getUrl());
my $overrides = $session->config->get("assets/".$self->get("className"));
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new( $session, "Asset" );
my $f = WebGUI::FormBuilder->new( $session );
my $overrides = $session->config->get( "assets/" . $self->get("className") );
# Set the appropriate URL
# If we're adding a new asset, don't set anything
if ( $session->form->get( "func" ) ne "add" ) {
$tabform->formHeader( { action => $self->getUrl, method => "POST" } );
}
if ($session->config->get("enableSaveAndCommit")) {
$tabform->submitAppend(WebGUI::Form::submit($session, {
name => "saveAndCommit",
value => $i18n->get("save and commit"),
}));
}
$tabform->submitAppend(
WebGUI::Form::submit ( $session, {
name => "saveAndReturn",
value => $i18n->get( "apply" ),
} )
###
# Buttons
$f->addField( 'Submit',
name => "save",
value => $i18n->get('save'),
);
$tabform->hidden({
name=>"func",
value=>"editSave"
});
my $assetId;
my $class;
if ($self->getId eq "new") {
$assetId = "new";
$class = $session->form->process("class","className");
}
else {
# revision history
$assetId = $self->getId;
$class = $self->get('className');
my $ac = $self->getAdminConsole;
$ac->addSubmenuItem($self->getUrl("func=manageRevisions"),$i18n->get("revisions").":");
my $rs = $session->db->read("select revisionDate from assetData where assetId=? order by revisionDate desc limit 5", [$assetId]);
while (my ($version) = $rs->array) {
my ($interval, $units) = $session->datetime->secondsToInterval(time() - $version);
$ac->addSubmenuItem($self->getUrl("func=edit;revision=".$version), $interval." ".$units." ".$ago);
}
}
if (my $proceed = $session->form->process("proceed")) {
$tabform->hidden({
name=>"proceed",
value=>$proceed,
});
if (my $returnUrl = $session->form->process('returnUrl')) {
$tabform->hidden({
name=>"returnUrl",
value=>$returnUrl,
});
if ( $session->config->get("enableSaveAndCommit") ) {
$f->addField( 'Submit',
name => "saveAndCommit",
value => $i18n->get("save and commit"),
);
}
$f->addField( 'Submit',
name => "saveAndReturn",
value => $i18n->get("apply"),
);
$f->addField( 'Submit',
name => 'cancel',
value => $i18n->get('cancel'),
);
###
# Create the main tabset
###
# Asset ID and class name
# assetId => {
# fieldType => "guid",
# label => [ "asset id", 'Asset' ],
# value => $assetId,
# hoverHelp => [ 'asset id description', 'Asset' ],
# uiLevel => 9,
# tab => "meta",
# },
# class => {
# fieldType => "className",
# label => [ "class name", 'WebGUI' ],
# value => $class,
# uiLevel => 9,
# tab => "meta",
# },
my $assetId;
my $class;
if ( $self->getId eq "new" ) {
$assetId = "new";
$class = $session->form->process( "class", "className" );
}
else {
$assetId = $self->getId;
$class = $self->get('className');
}
###
# Keywords
# keywords => {
# label => [ 'keywords', 'Asset' ],
# hoverHelp => [ 'keywords help', 'Asset' ],
# value => $self->get('keywords'),
# fieldType => 'keywords',
# tab => 'meta',
# },
###
# Properties
foreach my $property ( $self->getProperties ) {
next if $self->meta->find_attribute_by_name( $property )->noFormPost;
$self->session->log->warn( "Property: $property" );
$self->session->log->warn( Dumper $self->meta->find_attribute_by_name( $property )->form );
$self->session->log->warn( Dumper $self->getFormProperties( $property ) );
my $fieldHash = {
tab => "properties",
name => $property,
value => $self->$property,
%{ $self->getFormProperties( $property ) },
};
my $fieldType = $self->meta->find_attribute_by_name( $property )->fieldType;
if ( !$f->getTab( $fieldHash->{tab} ) ) {
$f->addTab( name => $fieldHash->{tab} );
}
}
# create tabs
tie my %tabs, 'Tie::IxHash';
foreach my $tabspec ($self->getEditTabs) {
$tabs{$tabspec->[0]} = {
label => $tabspec->[1],
uiLevel => $tabspec->[2],
};
}
foreach my $tab (keys %{$overrides->{tabs}}) {
foreach my $key (keys %{$overrides->{tabs}{$tab}}) {
$tabs{$tab}{$key} = $overrides->{tabs}{$tab}{$key};
}
}
foreach my $tab (keys %tabs) {
$tabform->addTab($tab, $tabs{$tab}{label}, $tabs{$tab}{uiLevel});
}
# process errors
my $errors = $session->stow->get('editFormErrors');
if ($errors) {
$tabform->getTab("properties")->readOnly(
-value=>"<p>Some error(s) occurred:<ul><li>".join('</li><li>', @$errors).'</li></ul></p>',
);
}
# build the definition to the generate form
my @properties = (
assetId => {
fieldType => "guid",
label => ["asset id",'Asset'],
value => $assetId,
hoverHelp => ['asset id description','Asset'],
uiLevel => 9,
tab => "meta",
},
class => {
fieldType => "className",
label => ["class name",'WebGUI'],
value => $class,
uiLevel => 9,
tab => "meta",
},
keywords => {
label => ['keywords','Asset'],
hoverHelp => ['keywords help','Asset'],
value => $self->get('keywords'),
fieldType => 'keywords',
tab => 'meta',
},
);
foreach my $property ($self->getProperties) {
push @properties, $property => $self->getProperty($property);
$f->getTab( $fieldHash->{tab} )->addField( $fieldType, %{$fieldHash} );
}
if ($session->setting->get("metaDataEnabled")) {
my $meta = $self->getMetaDataFields();
foreach my $field (keys %$meta) {
my $fieldType = $meta->{$field}{fieldType} || "text";
my $options = $meta->{$field}{possibleValues};
# Add a "Select..." option on top of a select list to prevent from
# saving the value on top of the list when no choice is made.
if("\l$fieldType" eq "selectBox") {
$options = "|" . $i18n->get("Select") . "\n" . $options;
}
push @properties, "metadata_".$meta->{$field}{fieldId} => {
tab => "meta",
label => $meta->{$field}{fieldName},
uiLevel => 5,
value => $meta->{$field}{value},
extras => qq/title="$meta->{$field}{description}"/,
options => $options,
defaultValue => $meta->{$field}{defaultValue},
fieldType => $fieldType
};
}
# add metadata management
if ($session->user->isAdmin) {
push @properties, '_metadatamanagement' => {
tab => "meta",
fieldType => "readOnly",
value => '<p><a href="'.$self->session->url->page("func=editMetaDataField;fid=new").'">'.$i18n->get('Add new field').'</a></p>',
hoverHelp => $i18n->get('Add new field description'),
};
}
}
# generate the form
for (my $i = 0; $i < @properties; $i += 2) {
my $fieldName = $properties[$i];
my %fieldHash = %{$properties[$i+1]};
my %params = (name => $fieldName, value => $self->get($fieldName));
return $f;
}
=cut
###
# Meta data
if ( $session->setting->get("metaDataEnabled") ) {
my $meta = $self->getMetaDataFields();
foreach my $field ( keys %$meta ) {
my $fieldType = $meta->{$field}{fieldType} || "text";
my $options = $meta->{$field}{possibleValues};
# apply config file changes
foreach my $key (keys %{$overrides->{fields}{$fieldName}}) {
$fieldHash{$key} = $overrides->{fields}{$fieldName}{$key};
}
# Add a "Select..." option on top of a select list to prevent from
# saving the value on top of the list when no choice is made.
if ( "\l$fieldType" eq "selectBox" ) {
$options = "|" . $i18n->get("Select") . "\n" . $options;
}
push @properties, "metadata_"
. $meta->{$field}{fieldId} => {
tab => "meta",
label => $meta->{$field}{fieldName},
uiLevel => 5,
value => $meta->{$field}{value},
extras => qq/title="$meta->{$field}{description}"/,
options => $options,
defaultValue => $meta->{$field}{defaultValue},
fieldType => $fieldType
};
} ## end foreach my $field ( keys %$meta)
# Kludge.
if (isIn($fieldHash{fieldType}, 'selectBox', 'workflow') and ref $params{value} ne 'ARRAY') {
$params{value} = [$params{value}];
}
# add metadata management
if ( $session->user->isAdmin ) {
push @properties, '_metadatamanagement' => {
tab => "meta",
fieldType => "readOnly",
value => '<p><a href="'
. $self->session->url->page("func=editMetaDataField;fid=new") . '">'
. $i18n->get('Add new field')
. '</a></p>',
hoverHelp => $i18n->get('Add new field description'),
};
}
} ## end if ( $session->setting...)
%params = (%fieldHash, %params);
delete $params{tab};
delete $params{tableName};
# generate the form
for ( my $i = 0; $i < @properties; $i += 2 ) {
my $fieldName = $properties[$i];
my %fieldHash = %{ $properties[ $i + 1 ] };
my %params = ( name => $fieldName, value => $self->get($fieldName) );
# if there isnt a tab specified lets define one
my $tab = $fieldHash{tab} || "properties";
# apply config file changes
foreach my $key ( keys %{ $overrides->{fields}{$fieldName} } ) {
$fieldHash{$key} = $overrides->{fields}{$fieldName}{$key};
}
# Kludge.
if ( isIn( $fieldHash{fieldType}, 'selectBox', 'workflow' ) and ref $params{value} ne 'ARRAY' ) {
$params{value} = [ $params{value} ];
}
%params = ( %fieldHash, %params );
delete $params{tab};
delete $params{tableName};
# if there isnt a tab specified lets define one
my $tab = $fieldHash{tab} || "properties";
#draw the field
$tabform->getTab($tab)->dynamicField(%params);
}
$tabform->getTab($tab)->dynamicField(%params);
} ## end for ( my $i = 0; $i < @properties...)
# send back the object
return $tabform;
}
# send back the object
return $tabform;
} ## end sub getEditForm
=cut
sub setupFormField {
my ($self, $tabform, $fieldName, $extraFields, $overrides) = @_;
my %params = %{$extraFields->{$fieldName}};
my $tab = delete $params{tab};
my ( $self, $tabform, $fieldName, $extraFields, $overrides ) = @_;
my %params = %{ $extraFields->{$fieldName} };
my $tab = delete $params{tab};
if (exists $overrides->{fields}{$fieldName}) {
my %overrideParams = %{$overrides->{fields}{$fieldName}};
my $overrideTab = delete $overrideParams{tab};
$tab = $overrideTab if defined $overrideTab;
foreach my $key (keys %overrideParams) {
$params{"-$key"} = $overrideParams{$key};
}
}
$tab ||= 'properties';
return $tabform->getTab($tab)->dynamicField(%params);
}
#-------------------------------------------------------------------
=head2 getEditTabs ()
Returns a list of arrayrefs, one per extra tab to add to the edit
form. The default is no extra tabs. Override this in a subclass to
add extra tabs.
Each array ref will have 3 fields:
=over 4
=item tabName
This is the name of the tab that you will use in the definition subroutine to
add fields to the new tab.
=item label
This should be an internationalized label that will be displayed on the tab.
=item uiLevel
This is the UI level for the tab.
=back
Please see the example below for adding 1 tab.
sub getEditTabs {
my $self = shift;
my $i18n = WebGUI::International->new($self->session,"myNamespace");
return ($self->SUPER::getEditTabs, ['myTab', $i18n->get('myTabName'), 9]);
if ( exists $overrides->{fields}{$fieldName} ) {
my %overrideParams = %{ $overrides->{fields}{$fieldName} };
my $overrideTab = delete $overrideParams{tab};
$tab = $overrideTab if defined $overrideTab;
foreach my $key ( keys %overrideParams ) {
$params{"-$key"} = $overrideParams{$key};
}
}
=cut
sub getEditTabs {
my $self = shift;
my $i18n = WebGUI::International->new($self->session, "Asset");
return (["properties", $i18n->get("properties"), 1],
["display", $i18n->get(105), 5],
["security", $i18n->get(107), 6],
["meta", $i18n->get("Metadata"), 3]);
}
$tab ||= 'properties';
return $tabform->getTab($tab)->dynamicField(%params);
} ## end sub setupFormField
#-------------------------------------------------------------------
@ -2694,10 +2600,18 @@ Renders an AdminConsole EditForm, unless canEdit returns False.
=cut
sub www_edit {
my $self = shift;
return $self->session->privilege->insufficient() unless $self->canEdit;
return $self->session->privilege->locked() unless $self->canEditIfLocked;
return $self->getAdminConsole->render($self->getEditForm->print, $self->addEditLabel);
my $self = shift;
return $self->session->privilege->insufficient() unless $self->canEdit;
return $self->session->privilege->locked() unless $self->canEditIfLocked;
my $f = $self->getEditForm;
$f->addField( "Hidden", name => "func", value => "editSave" );
$f->action( $self->getUrl );
return $self->session->style->process(
'<div class="yui-skin-sam">' . $f->toHtml . '</div>',
"PBtmpl0000000000000137"
);
}
#-------------------------------------------------------------------

View file

@ -152,25 +152,6 @@ override addRevision => sub {
return $asset;
};
#-------------------------------------------------------------------
=head2 drawExtraHeadTags ( )
Override the master drawExtraHeadTags to prevent Style template from having
Extra Head Tags.
=cut
override drawExtraHeadTags => sub {
my ($self) = @_;
if ($self->namespace eq 'style') {
my $i18n = WebGUI::International->new($self->session);
return $i18n->get(881);
}
return super();
};
#-------------------------------------------------------------------
=head2 duplicate

View file

@ -26,6 +26,7 @@ define icon => 'layout.gif';
define tableName => 'Layout';
property templateId => (
tab => "display",
fieldType => "template",
namespace => "Layout",
default => 'PBtmpl0000000000000054',
@ -34,6 +35,7 @@ property templateId => (
);
property mobileTemplateId => (
#fieldType => ( $session->style->useMobileStyle ? 'template' : 'hidden' ),
tab => "display",
fieldType => 'template',
namespace => 'Layout',
default => 'PBtmpl0000000000000054',
@ -48,11 +50,16 @@ property contentPositions => (
noFormPost => 1,
);
property assetsToHide => (
tab => "properties",
default => undef,
fieldType => "checkList",
noFormPost => 1,
label => ['assets to hide', 'Asset_Layout'],
hoverHelp => ['assets to hide description', 'Asset_Layout'],
options => sub { },
);
property assetOrder => (
tab => "display",
default => 'asc',
fieldType => 'selectBox',
label => ['asset order label', 'Asset_Layout'],
@ -87,7 +94,6 @@ These methods are available from this class:
Extends the base method to handle the optional mobileTemplateId and assetsToHide.
=cut
override getEditForm => sub {
my $self = shift;
@ -193,6 +199,8 @@ override getEditForm => sub {
return $tabform;
};
=cut
#-------------------------------------------------------------------
=head2 prepareView

View file

@ -205,45 +205,6 @@ sub definition {
#-------------------------------------------------------------------
=head2 displayForm ( )
Depricated, see toHtml().
=cut
sub displayForm {
my $self = shift;
return $self->toHtml(@_);
}
#-------------------------------------------------------------------
=head2 displayFormWithWrapper ( )
Depricated, see toHtmlWithWrapper().
=cut
sub displayFormWithWrapper {
my $self = shift;
return $self->toHtmlWithWrapper(@_);
}
#-------------------------------------------------------------------
=head2 displayValue ( )
Depricated, see getValueAsHtml().
=cut
sub displayValue {
my ($self) = @_;
return $self->getValueAsHtml;
}
#-------------------------------------------------------------------
=head2 fixMacros ( string )
Returns the string having converted all macros in the string to HTML entities so that they won't be processed by the macro engine, but instead will be displayed.
@ -369,6 +330,18 @@ sub getDatabaseFieldType {
return "CHAR(255)";
}
sub getLabel {
my ( $self ) = @_;
my $labelClass = $self->get("labelClass");
$labelClass = qq| class="$labelClass" | if($self->get("labelClass"));
my $hoverHelp = $self->get("hoverHelp") || '';
$hoverHelp =~ s/^\s+//;
$hoverHelp &&= '<div class="wg-hoverhelp">' . $hoverHelp . '</div>';
return '<label'.$labelClass.' for="'.$self->get("id").'">'.$self->get("label").'</label>' . $hoverHelp;
}
#-------------------------------------------------------------------
@ -445,7 +418,6 @@ sub getDefaultValue {
return $self->get("defaultValue");
}
#-------------------------------------------------------------------
=head2 getValueAsHtml ( )
@ -507,21 +479,6 @@ sub isInRequest {
return $self->session->form->hasParam($self->get('name'));
}
#-------------------------------------------------------------------
=head2 isProfileEnabled ( session )
Depricated. See isDynamicCompatible().
=cut
sub isProfileEnabled {
my $class = shift;
return $class->isDynamicCompatible();
}
#-------------------------------------------------------------------
=head2 new ( session, parameters )
@ -617,15 +574,11 @@ sub prepareWrapper {
my $self = shift;
my $rowClass = $self->get("rowClass");
$rowClass = qq| class="$rowClass" | if($self->get("rowClass"));
my $labelClass = $self->get("labelClass");
$labelClass = qq| class="$labelClass" | if($self->get("labelClass"));
my $fieldClass = $self->get("fieldClass");
$fieldClass = qq| class="$fieldClass" | if($self->get("fieldClass"));
my $hoverHelp = $self->get("hoverHelp") || '';
$hoverHelp =~ s/^\s+//;
my $subtext = $self->get("subtext");
$subtext = qq| <span class="formSubtext">$subtext</span>| if ($subtext);
return ($fieldClass, $rowClass, $labelClass, $hoverHelp, $subtext);
return ($fieldClass, $rowClass, $subtext);
}
@ -715,18 +668,18 @@ Renders the form field to HTML as a table row complete with labels, subtext, hov
=cut
sub toHtmlWithWrapper {
my $self = shift;
if ($self->passUiLevelCheck) {
my $rawField = $self->toHtml(); # has to be called before prepareWrapper for some controls, namely captcha.
my ($fieldClass, $rowClass, $labelClass, $hoverHelp, $subtext) = $self->prepareWrapper;
$hoverHelp &&= '<div class="wg-hoverhelp">' . $hoverHelp . '</div>';
return '<tr'.$rowClass.' id="'.$self->get("id").'_row">
<td'.$labelClass.' valign="top" style="width: 180px;"><label for="'.$self->get("id").'">'.$self->get("label").'</label>' . $hoverHelp . '</td>
<td valign="top"'.$fieldClass.'>'.$rawField . $subtext . "</td>
</tr>\n";
} else {
return $self->toHtmlAsHidden;
}
my $self = shift;
if ($self->passUiLevelCheck) {
my $rawField = $self->toHtml(); # has to be called before prepareWrapper for some controls, namely captcha.
my ($fieldClass, $rowClass, $subtext) = $self->prepareWrapper;
return '<div'.$rowClass.' id="'.$self->get("id").'_row">'
. $self->getLabel
. $rawField
. $subtext
. "</div>\n";
} else {
return $self->toHtmlAsHidden;
}
}

View file

@ -159,10 +159,21 @@ Return the HTML for the form
sub toHtml {
my ( $self ) = @_;
my ( $style, $url ) = $self->session->quick(qw{ style url });
$style->setLink( $url->extras('hoverhelp.css'), { rel => "stylesheet", type => "text/css" } );
$style->setScript( $url->extras('hoverhelp.js') );
my $html = $self->getHeader;
# Add individual objects
$html .= join "", map { $_->toHtml } @{$self->objects};
for my $obj ( @{ $self->objects } ) {
if ( $obj->isa('WebGUI::Form::Control') ) {
$html .= $obj->toHtmlWithWrapper;
}
else {
$html .= $obj->toHtml;
}
}
$html .= $self->getFooter;
return $html;

View file

@ -125,7 +125,14 @@ sub toHtml {
my ( $self ) = @_;
my $html = $self->getHeader;
$html .= join "", map { $_->toHtml } @{$self->objects};
for my $obj ( @{ $self->objects } ) {
if ( $obj->isa('WebGUI::Form::Control') ) {
$html .= $obj->toHtmlWithWrapper;
}
else {
$html .= $obj->toHtml;
}
}
$html .= $self->getFooter;
return $html;

View file

@ -56,8 +56,8 @@ sub addField {
# Load the class
# Try to load the WebGUI Field first in case we conveniently overlap with a common name
# (like Readonly)
if ( $INC{'WebGUI/Form/'.$file} || try { require 'WebGUI/Form/' . $file } ) {
$type = 'WebGUI::Form::' . $type;
if ( $INC{'WebGUI/Form/'. ucfirst $file} || try { require 'WebGUI/Form/' . ucfirst $file } ) {
$type = 'WebGUI::Form::' . ucfirst $type;
}
elsif ( !$INC{$file} && !try { require $file; } ) {
confess sprintf "Could not load form control class %s", $type;

View file

@ -93,7 +93,15 @@ Render the objects in this tab
sub toHtml {
my ( $self ) = @_;
my $html = join "", map { $_->toHtml } @{$self->objects};
my $html;
for my $obj ( @{ $self->objects } ) {
if ( $obj->isa('WebGUI::Form::Control') ) {
$html .= $obj->toHtmlWithWrapper;
}
else {
$html .= $obj->toHtml;
}
}
return $html;
}

View file

@ -62,10 +62,17 @@ sub addTab {
sub toHtml {
my ( $self ) = @_;
my ( $style, $url ) = $self->session->quick(qw( style url ));
$style->setLink( $url->extras("yui/build/tabview/assets/skins/sam/tabview.css"), { rel => "stylesheet", type => "text/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/tabview/tabview-min.js") );
my $html = sprintf( '<div id="%s" class="yui-navset">', $self->name )
. '<ul class="yui-nav">'
;
for ( my $i = 0; $i < @{$self->tabs}; $i++ ) {
my $tab = $self->tabs->[$i];
$html .= sprintf '<li><a href="#tab%i"><em>%s</em></a></li>', $i, $tab->label;
@ -83,7 +90,9 @@ sub toHtml {
$html .= '</div>'
. '</div>'
. q{<script type="text/javascript">}
. sprintf( q{var tabView = new YAHOO.widget.TabView('%s');}, $self->name )
. sprintf( q'YAHOO.util.Event.onContentReady( "%s", function () {', $self->name )
. sprintf( q'new YAHOO.widget.TabView("%s");', $self->name )
. q' } );'
. q{</script>}
;