diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 7ecd7ebb5..33e60d57f 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -9,6 +9,7 @@ http://www.plainblack.com/rfe/request-for-enhancement/-1493348--js-confirmation-operation/databaselink/re--1493348--js-confirmation-operation/databaselink.pm#OUb5zN8bltGdPG_2LJZMGQ - add: User profile data table is now a flat table, one column for each field. + - add: Posts can now have Metadata (United Knowledge) - add: Calendar events now allow attachments - add: Calendar events now allow setting view permissions - add: WebGUI::Paginator now capable of more efficient SQL paginations using diff --git a/docs/upgrades/upgrade_7.3.19-7.4.0.pl b/docs/upgrades/upgrade_7.3.19-7.4.0.pl index 14640b7d6..3ac80a521 100644 --- a/docs/upgrades/upgrade_7.3.19-7.4.0.pl +++ b/docs/upgrades/upgrade_7.3.19-7.4.0.pl @@ -25,6 +25,7 @@ addGroupingsIndexOnUserId($session); fixProfileDataWithoutFields($session); buildNewUserProfileTable($session); addAttachmentsToEvents($session); +addMetaDataPostsToCS($session); finish($session); # this line required @@ -105,6 +106,18 @@ sub fixProfileDataWithoutFields { } +#---------------------------------------------------------------------------- + +sub addMetaDataPostsToCS { + my $session = shift; + my $db = $session->db; + + print "\tAdding feature to CS to enable meta data in posts... " unless $quiet; + $db->write("alter table Collaboration add column enablePostMetaData int(11) not null default 0"); + print "OK!\n" unless $quiet; +} + + #---------------------------------------------------------------------------- sub buildNewUserProfileTable { diff --git a/lib/WebGUI/Asset/Post.pm b/lib/WebGUI/Asset/Post.pm index ad3930f9b..3fca02e47 100644 --- a/lib/WebGUI/Asset/Post.pm +++ b/lib/WebGUI/Asset/Post.pm @@ -19,6 +19,7 @@ use WebGUI::Cache; use WebGUI::Group; use WebGUI::HTML; use WebGUI::HTMLForm; +use WebGUI::Form::DynamicField; use WebGUI::International; use WebGUI::Inbox; use WebGUI::Mail::Send; @@ -478,6 +479,28 @@ sub getSynopsisAndContent { return ($synopsis,$body); } +#------------------------------------------------------------------- +sub getTemplateMetadataVars { + my $self = shift; + my $var = shift; + if ($self->session->setting->get("metaDataEnabled") + && $self->getThread->getParent->get('enablePostMetaData')) { + my $meta = $self->getMetaDataFields(); + my @meta_loop = (); + foreach my $field (keys %{ $meta }) { + push @meta_loop, { + value => $meta->{$field}{value}, + name => $meta->{$field}{fieldName}, + }; + my $fieldName = $meta->{$field}{fieldName}; + $fieldName =~ tr/ /_/; + $fieldName = lc $fieldName; + $var->{'meta_'.$fieldName.'_value'} = $meta->{$field}{value}; ##By name interface + } + $var->{meta_loop} = \@meta_loop; + } +} + #------------------------------------------------------------------- sub getTemplateVars { my $self = shift; @@ -527,6 +550,7 @@ sub getTemplateVars { }); } } + $self->getTemplateMetadataVars(\%var); return \%var; } @@ -1062,7 +1086,7 @@ sub www_edit { if ($self->session->form->process("func") eq "add") { # new post $var{'form.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getParent->getUrl}) .WebGUI::Form::hidden($self->session, { - name=>"func", + name=>"func", value=>"add" }) .WebGUI::Form::hidden($self->session, { @@ -1073,7 +1097,7 @@ sub www_edit { name=>"class", value=>$self->session->form->process("class","className") }); - $var{'isNewPost'} = 1; + $var{'isNewPost'} = 1; $content = $self->session->form->process("content"); $title = $self->session->form->process("title"); $synopsis = $self->session->form->process("synopsis"); @@ -1096,46 +1120,48 @@ sub www_edit { name=>"subscribe", value=>$self->session->form->process("subscribe") }); - } elsif ($self->session->form->process("class","className") eq "WebGUI::Asset::Post::Thread") { # new thread + } + elsif ($self->session->form->process("class","className") eq "WebGUI::Asset::Post::Thread") { # new thread return $self->session->privilege->insufficient() unless ($self->getThread->getParent->canPost); $var{isThread} = 1; $var{isNewThread} = 1; - if ($self->getThread->getParent->canEdit) { - $var{'sticky.form'} = WebGUI::Form::yesNo($self->session, { - name=>'stick', - value=>$self->session->form->process("stick") - }); - $var{'lock.form'} = WebGUI::Form::yesNo($self->session, { - name=>'lock', - value=>$self->session->form->process('lock') - }); + if ($self->getThread->getParent->canEdit) { + $var{'sticky.form'} = WebGUI::Form::yesNo($self->session, { + name=>'stick', + value=>$self->session->form->process("stick") + }); + $var{'lock.form'} = WebGUI::Form::yesNo($self->session, { + name=>'lock', + value=>$self->session->form->process('lock') + }); } $var{'subscribe.form'} = WebGUI::Form::yesNo($self->session, { name=>"subscribe", value=>$self->session->form->process("subscribe") || 1 }); } - $content .= "\n\n".$self->session->user->profileField("signature") if ($self->session->user->profileField("signature") && !$self->session->form->process("content")); - } else { # edit + $content .= "\n\n".$self->session->user->profileField("signature") if ($self->session->user->profileField("signature") && !$self->session->form->process("content")); + } + else { # edit return $self->session->privilege->insufficient() unless ($self->canEdit); $var{isThread} = !$self->isReply; $var{'form.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl}) .WebGUI::Form::hidden($self->session, { - name=>"func", - value=>"edit" - }) + name=>"func", + value=>"edit" + }) .WebGUI::Form::hidden($self->session, { name=>"revision", value=>$self->session->form->param("revision") - }) + }) .WebGUI::Form::hidden($self->session, { name=>"ownerUserId", value=>$self->getValue("ownerUserId") - }) + }) .WebGUI::Form::hidden($self->session, { name=>"username", value=>$self->getValue("username") - }); + }); $var{isEdit} = 1; $content = $self->session->form->process('content') || $self->getValue("content"); $title = $self->session->form->process('title') || $self->getValue("title"); @@ -1193,11 +1219,11 @@ sub www_edit { value => $userDefinedValue, }); } - + $title = WebGUI::HTML::filter($title,"all"); $content = WebGUI::HTML::filter($content,"macros"); $synopsis = WebGUI::HTML::filter($synopsis,"all"); - + $var{'title.form'} = WebGUI::Form::text($self->session, { name=>"title", value=>$title @@ -1234,10 +1260,43 @@ sub www_edit { maxAttachments=>$numberOfAttachments, deleteFileUrl=>$self->getUrl("func=deleteFile;filename=") }) if ($numberOfAttachments); - $var{'contentType.form'} = WebGUI::Form::contentType($self->session, { - name=>'contentType', - value=>$self->getValue("contentType") || "mixed" - }); + $var{'contentType.form'} = WebGUI::Form::contentType($self->session, { + name=>'contentType', + value=>$self->getValue("contentType") || "mixed", + }); + if ($self->session->setting->get("metaDataEnabled") + && $self->getThread->getParent->get('enablePostMetaData')) { + my $meta = $self->getMetaDataFields(); + my $formGen = $self->session->form; + my @meta_loop = (); + foreach my $field (keys %{ $meta }) { + my $fieldType = $meta->{$field}{fieldType} || "Text"; + my $options; + # 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($fieldType eq "selectList") { + $options = {"", $i18n->get("Select", "Asset")}; + } + my $form = WebGUI::Form::DynamicField->new($self->session, + name=>"metadata_".$meta->{$field}{fieldId}, + uiLevel=>5, + value=>$meta->{$field}{value}, + extras=>qq/title="$meta->{$field}{description}"/, + possibleValues=>$meta->{$field}{possibleValues}, + options=>$options, + fieldType=>$fieldType, + )->toHtml; + push @meta_loop, { + field => $form, + name => $meta->{$field}{fieldName}, + }; + my $fieldName = $meta->{$field}{fieldName}; + $fieldName =~ tr/ /_/; + $fieldName = lc $fieldName; + $var{'meta_'.$fieldName.'_form'} = $form; ##By name interface + } + $var{meta_loop} = \@meta_loop; + } $self->getThread->getParent->appendTemplateLabels(\%var); return $self->getThread->getParent->processStyle($self->processTemplate(\%var,$self->getThread->getParent->get("postFormTemplateId"))); } diff --git a/lib/WebGUI/Asset/Wobject/Collaboration.pm b/lib/WebGUI/Asset/Wobject/Collaboration.pm index 6e77336c0..00dc6e14b 100644 --- a/lib/WebGUI/Asset/Wobject/Collaboration.pm +++ b/lib/WebGUI/Asset/Wobject/Collaboration.pm @@ -109,6 +109,7 @@ sub appendPostListTemplateVars { "avatar.url"=>$post->getAvatarUrl, %lastReply ); + $post->getTemplateMetadataVars(\%postVars); if ($row->{className} eq 'WebGUI::Asset::Post::Thread') { $postVars{'rating'} = $post->get('threadRating'); } @@ -620,6 +621,13 @@ sub definition { label=>$i18n->get('enable avatars'), hoverHelp=>$i18n->get('enable avatars description'), }, + enablePostMetaData =>{ + fieldType=>"yesNo", + defaultValue=>0, + tab=>'meta', + label=>$i18n->get('enable metadata'), + hoverHelp=>$i18n->get('enable metadata description'), + }, postGroupId =>{ fieldType=>"group", defaultValue=>'2', diff --git a/lib/WebGUI/Help/Asset_Collaboration.pm b/lib/WebGUI/Help/Asset_Collaboration.pm index ce8407644..7e1274147 100644 --- a/lib/WebGUI/Help/Asset_Collaboration.pm +++ b/lib/WebGUI/Help/Asset_Collaboration.pm @@ -156,6 +156,11 @@ our $HELP = { description => 'enable avatars description', namespace => 'Asset_Collaboration', }, + { + title => 'enable metadata', + description => 'enable metadata description', + namespace => 'Asset_Collaboration', + }, { title => 'get mail', description => 'get mail help', diff --git a/lib/WebGUI/Help/Asset_Post.pm b/lib/WebGUI/Help/Asset_Post.pm index ad5098dc2..a402bec1e 100644 --- a/lib/WebGUI/Help/Asset_Post.pm +++ b/lib/WebGUI/Help/Asset_Post.pm @@ -129,6 +129,20 @@ our $HELP = { { 'name' => 'karmaIsEnabled' }, + { + 'name' => 'meta_loop', + 'variables' => [ + { + 'name' => 'name' + }, + { + 'name' => 'field' + }, + ] + }, + { + 'name' => 'meta_X_form' + }, { 'name' => 'form.preview' }, @@ -250,6 +264,20 @@ our $HELP = { } ] }, + { + 'name' => 'meta_loop', + 'variables' => [ + { + 'name' => 'name' + }, + { + 'name' => 'value' + }, + ] + }, + { + 'name' => 'meta_X_value' + }, ], fields => [ ], diff --git a/lib/WebGUI/i18n/English/Asset_Collaboration.pm b/lib/WebGUI/i18n/English/Asset_Collaboration.pm index 628fd8546..f0cd24e9e 100644 --- a/lib/WebGUI/i18n/English/Asset_Collaboration.pm +++ b/lib/WebGUI/i18n/English/Asset_Collaboration.pm @@ -1510,6 +1510,16 @@ the Collaboration Asset, the user will be notified.|, lastUpdated => 1165449336, }, + 'enable metadata' => { + message => q|Enable MetaData in Posts?|, + lastUpdated => 1180759718, + }, + + 'enable metadata description' => { + message => q|
Select "Yes" to enable Posts to have MetaData and to be passively profiled. This will impact the performance of the Collaboration System. MetaData must also be enabled sitewide in the site settings.
|, + lastUpdated => 1180759724, + }, + 'collaboration rss template title' => { message => q|Collaboration RSS Template|, lastUpdated => 1114467745, diff --git a/lib/WebGUI/i18n/English/Asset_Post.pm b/lib/WebGUI/i18n/English/Asset_Post.pm index 7f3500af1..33b578738 100644 --- a/lib/WebGUI/i18n/English/Asset_Post.pm +++ b/lib/WebGUI/i18n/English/Asset_Post.pm @@ -595,12 +595,42 @@ user subscribed to.|, context => q|label for Asset Manager, getName|, lastUpdated => 1128829703, }, - + 'new file description' => { message => q|Enter the path to a file, or use the "Browse" button to find a file on your local hard drive that you would like to be uploaded.|, lastUpdated => 1119068745 }, + 'meta_loop' => { + message => q|A loop containing metadata lables and fields for this Post. If metadata is not enabled for the site, or if metadata is not enabled for this CS, or if there's no metadata defined for the site, the loop will be empty.|, + lastUpdated => 1180928713 + }, + + 'field' => { + message => q|The form for this metadata field.|, + lastUpdated => 1180928713 + }, + + 'name' => { + message => q|The label for this metadata field. Metadata labels are not internationalized.|, + lastUpdated => 1180928713 + }, + + 'value' => { + message => q|The value of this metadata field for this post.|, + lastUpdated => 1180928713 + }, + + 'meta_X_form' => { + message => q|The form for a particular metadata field, picked by name. X is the name of the metadata field, where any spaces in the name have been changed into underscores.|, + lastUpdated => 1180929142 + }, + + 'meta_X_value' => { + message => q|The value for a particular metadata field, picked by name. X is the name of the metadata field, where any spaces in the name have been changed into underscores.|, + lastUpdated => 1180931029 + }, + }; 1;