diff --git a/lib/WebGUI/Asset/Dashlet.pm b/lib/WebGUI/Asset/Dashlet.pm
new file mode 100644
index 000000000..645f4602d
--- /dev/null
+++ b/lib/WebGUI/Asset/Dashlet.pm
@@ -0,0 +1,761 @@
+package WebGUI::Asset::Shortcut;
+
+#-------------------------------------------------------------------
+# WebGUI is Copyright 2001-2005 Plain Black Corporation.
+#-------------------------------------------------------------------
+# Please read the legal notices (docs/legal.txt) and the license
+# (docs/license.txt) that came with this distribution before using
+# this software.
+#-------------------------------------------------------------------
+# http://www.plainblack.com info@plainblack.com
+#-------------------------------------------------------------------
+
+use strict;
+use WebGUI::Asset;
+use WebGUI::Icon;
+use WebGUI::International;
+use WebGUI::Macro;
+use WebGUI::Privilege;
+use WebGUI::Session;
+use WebGUI::SQL;
+
+our @ISA = qw(WebGUI::Asset);
+
+#-------------------------------------------------------------------
+sub _drawQueryBuilder {
+ my $self = shift;
+ # Initialize operators
+ my @textFields = qw|text yesNo selectList radioList|;
+ my %operator;
+ foreach (@textFields) {
+ $operator{$_} = {
+ "=" => WebGUI::International::get("is","Asset_Shortcut"),
+ "!=" => WebGUI::International::get("isnt","Asset_Shortcut")
+ };
+ }
+ $operator{integer} = {
+ "=" => WebGUI::International::get("equal to","Asset_Shortcut"),
+ "!=" => WebGUI::International::get("not equal to","Asset_Shortcut"),
+ "<" => WebGUI::International::get("less than","Asset_Shortcut"),
+ ">" => WebGUI::International::get("greater than","Asset_Shortcut")
+ };
+
+ # Get the fields and count them
+ my $fields = $self->getMetaDataFields();
+ my $fieldCount = scalar(keys %$fields);
+
+ unless ($fieldCount) { # No fields found....
+ return 'No metadata defined yet.
+ Click here to define metadata attributes.';
+ }
+
+ # Static form fields
+ my $shortcutCriteriaField = WebGUI::Form::textarea({
+ name=>"shortcutCriteria",
+ value=>$self->getValue("shortcutCriteria"),
+ extras=>'style="width: 100%" '.$self->{_disabled}
+ });
+ my $conjunctionField = WebGUI::Form::selectBox({
+ name=>"conjunction",
+ options=>{
+ "AND" => WebGUI::International::get("AND","Asset_Shortcut"),
+ "OR" => WebGUI::International::get("OR","Asset_Shortcut")},
+ value=>["OR"],
+ extras=>'class="qbselect"',
+ }
+ );
+
+ # html
+ my $output;
+ $output .= '';
+ $output .= '';
+ $output .= qq|
";
+
+ return $output;
+}
+
+sub parseOverride {
+ my $self = shift;
+ my $value = shift;
+ my @userPrefs = $self->getUserPrefs;
+ foreach my $field (@userPrefs) {
+ my $id = $field->getId;
+ my $fieldName = $field->getFieldName;
+ use WebGUI::Asset::Field;
+ my $fieldValue = WebGUI::Asset::Field->getUserPref($id);
+ $value =~ s/\#\#userPref\:${fieldName}\#\#/$fieldValue/g;
+ }
+}
+
+#-------------------------------------------------------------------
+sub _submenu {
+ my $self = shift;
+ my $workarea = shift;
+ my $title = shift;
+ my $help = shift;
+ my $ac = WebGUI::AdminConsole->new("shortcutmanager");
+ $ac->setHelp($help) if ($help);
+ $ac->setIcon($self->getIcon);
+ $ac->addSubmenuItem($self->getUrl('func=edit'), WebGUI::International::get("Back to Edit Shortcut","Asset_Shortcut"));
+ $ac->addSubmenuItem($self->getUrl("func=manageOverrides"),WebGUI::International::get("Manage Shortcut Overrides","Asset_Shortcut"));
+ $ac->addSubmenuItem($self->getUrl("func=manageUserPrefs"),WebGUI::International::get("Manage User Preferences","Asset_Shortcut"));
+ return $ac->render($workarea, $title);
+}
+
+#-------------------------------------------------------------------
+sub canEdit {
+ my $self = shift;
+return 1 if ($self->SUPER::canEdit || (ref $self->getParent eq 'WebGUI::Asset::Wobject::Dashboard' && $self->getParent->canManage));
+ return 0;
+}
+
+#-------------------------------------------------------------------
+sub canManage {
+ my $self = shift;
+ return $self->canEdit;
+}
+
+#-------------------------------------------------------------------
+sub definition {
+ my $class = shift;
+ my $definition = shift;
+ push(@{$definition}, {
+ assetName=>WebGUI::International::get('assetName',"Asset_Shortcut"),
+ icon=>'shortcut.gif',
+ tableName=>'Shortcut',
+ className=>'WebGUI::Asset::Shortcut',
+ properties=>{
+ shortcutToAssetId=>{
+ noFormPost=>1,
+ fieldType=>"hidden",
+ defaultValue=>undef
+ },
+ shortcutByCriteria=>{
+ fieldType=>"yesNo",
+ defaultValue=>0,
+ },
+ disableContentLock=>{
+ fieldType=>"yesNo",
+ defaultValue=>0
+ },
+ resolveMultiples=>{
+ fieldType=>"selectBox",
+ defaultValue=>"mostRecent",
+ },
+ shortcutCriteria=>{
+ fieldType=>"textarea",
+ defaultValue=>"",
+ },
+ templateId=>{
+ fieldType=>"template",
+ defaultValue=>"PBtmpl0000000000000140"
+ },
+ description=>{
+ fieldType=>"HTMLArea",
+ defaultValue=>undef
+ },
+ }
+ });
+ return $class->SUPER::definition($definition);
+}
+
+
+
+#-------------------------------------------------------------------
+sub getEditForm {
+ my $self = shift;
+ my $tabform = $self->SUPER::getEditForm();
+ my $originalTemplate;
+ my $i18n = WebGUI::International->new("Asset_Shortcut");
+ $tabform->getTab("properties")->readOnly(
+ -label=>WebGUI::International::get(1,"Asset_Shortcut"),
+ -hoverHelp=>WebGUI::International::get('1 description',"Asset_Shortcut"),
+ -value=>''.$self->getShortcut->get('title').' ('.$self->getShortcut->getId.')'
+ );
+ $tabform->getTab("display")->template(
+ -value=>$self->getValue("templateId"),
+ -label=>WebGUI::International::get('shortcut template title', 'Asset_Shortcut'),
+ -hoverHelp=>WebGUI::International::get('shortcut template title description', 'Asset_Shortcut'),
+ -namespace=>"Shortcut"
+ );
+ if($session{setting}{metaDataEnabled}) {
+ $tabform->getTab("properties")->yesNo(
+ -name=>"shortcutByCriteria",
+ -value=>$self->getValue("shortcutByCriteria"),
+ -label=>WebGUI::International::get("Shortcut by alternate criteria","Asset_Shortcut"),
+ -hoverHelp=>WebGUI::International::get("Shortcut by alternate criteria description","Asset_Shortcut"),
+ -extras=>q|onchange="
+ if (this.form.shortcutByCriteria[0].checked) {
+ this.form.resolveMultiples.disabled=false;
+ this.form.shortcutCriteria.disabled=false;
+ } else {
+ this.form.resolveMultiples.disabled=true;
+ this.form.shortcutCriteria.disabled=true;
+ }"|
+ );
+ $tabform->getTab("properties")->yesNo(
+ -name=>"disableContentLock",
+ -value=>$self->getValue("disableContentLock"),
+ -label=>WebGUI::International::get("disable content lock","Asset_Shortcut"),
+ -hoverHelp=>WebGUI::International::get("disable content lock description","Asset_Shortcut")
+ );
+ if ($self->getValue("shortcutByCriteria") == 0) {
+ $self->{_disabled} = 'disabled=true';
+ }
+ $tabform->getTab("properties")->selectBox(
+ -name=>"resolveMultiples",
+ -value=>[ $self->getValue("resolveMultiples") ],
+ -label=>WebGUI::International::get("Resolve Multiples","Asset_Shortcut"),
+ -hoverHelp=>WebGUI::International::get("Resolve Multiples description","Asset_Shortcut"),
+ -options=>{
+ mostRecent=>WebGUI::International::get("Most Recent","Asset_Shortcut"),
+ random=>WebGUI::International::get("Random","Asset_Shortcut"),
+ },
+ -extras=>$self->{_disabled}
+ );
+
+ $tabform->getTab("properties")->readOnly(
+ -value=>$self->_drawQueryBuilder(),
+ -label=>WebGUI::International::get("Criteria","Asset_Shortcut"),
+ -hoverHelp=>WebGUI::International::get("Criteria description","Asset_Shortcut")
+ );
+ }
+ $tabform->addTab('overrides',$i18n->get('Overrides'));
+ $tabform->getTab('overrides')->raw($self->getOverridesList);
+ return $tabform;
+}
+
+
+#-------------------------------------------------------------------
+
+=head2 getExtraHeadTags ( )
+
+Returns the extraHeadTags stored in the asset. Called in WebGUI::Style::generateAdditionalHeadTags if this asset is the $session{asset}. Also called in WebGUI::Layout::view for its child assets. Overriden here in Shortcut.pm.
+
+=cut
+
+sub getExtraHeadTags {
+ my $self = shift;
+ return $self->get("extraHeadTags")."\n".$self->getShortcut->get("extraHeadTags");
+}
+
+#-------------------------------------------------------------------
+sub getFieldsList {
+ my $self = shift;
+ my $i18n = WebGUI::International->new("Asset_Shortcut");
+ my $output = ''.$i18n->get('Add Preference Field').'
';
+ my @fielden;
+ @fielden = $self->getUserPrefs;
+ return $output unless scalar @fielden > 0;
+ $output .= '';
+ $output .= '';
+ foreach my $field (@fielden) {
+ $output .= '';
+ $output .= '| '.$field->get("fieldName").' | ';
+ $output .= '';
+ $output .= editIcon('func=edit',$field->getUrl());
+ $output .= deleteIcon('func=delete',$field->getUrl());
+ $output .= ' | ';
+ $output .= '
';
+ }
+ $output .= '
';
+ return $output;
+}
+
+#-------------------------------------------------------------------
+sub getOverridesList {
+ my $self = shift;
+ my $output = '';
+ my $i18n = WebGUI::International->new("Asset_Shortcut");
+ my %overrides = $self->getOverrides;
+ $output .= '';
+ $output .= '';
+ foreach my $definition (@{$self->getShortcutOriginal->definition}) {
+ foreach my $prop (keys %{$definition->{properties}}) {
+ next if $definition->{properties}{$prop}{fieldType} eq 'hidden';
+ $output .= '';
+ $output .= '| '.$prop.' | ';
+ $output .= '';
+ $output .= editIcon('func=editOverride;fieldName='.$prop,$self->get("url"));
+ $output .= deleteIcon('func=deleteOverride;fieldName='.$prop,$self->get("url")) if exists $overrides{overrides}{$prop};
+ $output .= ' | ';
+ $output .= $overrides{overrides}{$prop}{origValue};
+ $output .= ' | ';
+ $output .= $overrides{overrides}{$prop}{newValue};
+ $output .= ' | ';
+ $output .= $overrides{overrides}{$prop}{parsedValue};
+ $output .= ' |
';
+ }
+ }
+ $output .= '
';
+ return $output;
+}
+
+
+#-------------------------------------------------------------------
+sub getOverrides {
+ my $self = shift;
+ my $i = 0;
+ #cache by userId, assetId of this shortcut, and whether adminMode is on or not.
+ my $cache = WebGUI::Cache->new(["shortcutOverrides",$self->getId,$session{user}{userId},$session{var}{adminOn}]);
+ my $overridesRef = $cache->get;
+ unless ($overridesRef->{cacheNotExpired}) {
+ my %overrides;
+ my $orig = $self->getShortcutOriginal;
+ unless (exists $orig->{_propertyDefinitions}) {
+ my %properties;
+ foreach my $definition (@{$orig->definition}) {
+ %properties = (%properties, %{$definition->{properties}});
+ }
+ $orig->{_propertyDefinitions} = \%properties;
+ }
+ $overrides{cacheNotExpired} = 1;
+ my $sth = WebGUI::SQL->read("select fieldName, newValue from Shortcut_overrides where assetId=".quote($self->getId)." order by fieldName");
+ while (my ($fieldName, $newValue) = $sth->array) {
+ $overrides{overrides}{$fieldName}{fieldType} = $orig->{_propertyDefinitions}{$fieldName}{fieldType};
+ $overrides{overrides}{$fieldName}{origValue} = $self->getShortcutOriginal->get($fieldName);
+ $overrides{overrides}{$fieldName}{newValue} = $newValue;
+ $overrides{overrides}{$fieldName}{parsedValue} = $newValue;
+ }
+ $sth->finish;
+ my @userPrefs = $self->getUserPrefs;
+ foreach my $field (@userPrefs) {
+ my $id = $field->getId;
+ my $fieldName = $field->getFieldName;
+ my $fieldValue = $field->getUserPref($id);
+ $overrides{userPrefs}{$fieldName}{value} = $fieldValue;
+ $overrides{overrides}{$fieldName}{parsedValue} = $fieldValue;
+ # 'myTemplateId is ##userPref:myTemplateId##', for example.
+ foreach my $overr (keys %{$overrides{overrides}}) {
+ $overrides{overrides}{$overr}{parsedValue} =~ s/\#\#userPref\:${fieldName}\#\#/$fieldValue/gm;
+ }
+ }
+ $cache->set(\%overrides, 60*60);
+ $overridesRef = \%overrides;
+ }
+ return %$overridesRef;
+}
+
+#-------------------------------------------------------------------
+sub getShortcut {
+ my $self = shift;
+ unless ($self->{_shortcut}) {
+ $self->{_shortcut} = $self->getShortcutOriginal;
+ }
+ $self->{_shortcut}{_properties}{displayTitle} = undef if (ref $self->getParent eq 'WebGUI::Asset::Wobject::Dashboard');
+ # Hide title by default. If you want, you can create an override
+ # to display it. But it's being shown in the dragheader by default.
+ my %overhash = $self->getOverrides;
+ if (exists $overhash{overrides}) {
+ my %overrides = %{$overhash{overrides}};
+ foreach my $override (keys %overrides) {
+ $self->{_shortcut}{_properties}{$override} = $overrides{$override}{parsedValue};
+ }
+ foreach my $userPref ($self->getUserPrefs) {
+ $self->{_shortcut}{_properties}{$userPref->getFieldName} = $userPref->getUserPref($userPref->getId) unless (exists $overrides{$userPref->getFieldName});
+ }
+ }
+ return $self->{_shortcut};
+}
+
+#-------------------------------------------------------------------
+
+=head2 getShortcutByCriteria ( hashRef )
+
+This function will search for a asset that match a metadata criteria set.
+If no asset is found, undef will be returned.
+
+=cut
+
+sub getShortcutByCriteria {
+ my $self = shift;
+ my $assetProxy = shift;
+ my $criteria = $self->get("shortcutCriteria");
+ my $order = $self->get("resolveMultiples");
+ my $assetId = $self->getId;
+
+ # Parse macro's in criteria
+ WebGUI::Macro::process(\$criteria);
+
+ # Once a asset is found, we will stick to that asset,
+ # to prevent the proxying of multiple- depth assets like Surveys and USS.
+ my $scratchId;
+ if ($assetId) {
+ $scratchId = "Shortcut_" . $assetId;
+ if($session{scratch}{$scratchId} && !$self->getValue("disableContentLock")) {
+ return $session{scratch}{$scratchId} unless ($session{var}{adminOn});
+ }
+ }
+
+ # $criteria = "State = Wisconsin AND Country != Sauk";
+ #
+ # State = Wisconsin AND Country != Sauk
+ # | | |
+ # |- $field |_ $operator |- $value
+ # |_ $attribute |_ $attribute
+ my $operator = qr/<>|!=|=|>=|<=|>|<|like/i;
+ my $attribute = qr/['"][^()|=>getShortcutDefault->get("className"));
+
+
+ # Add constraint only if it has been modified.
+ $sql .= " and ".$constraint if (($constraint ne $criteria) && $constraint ne "");
+# Can't do this without extensive refactoring.....!
+# $sql .= " order by assetData.revisionDate desc";
+
+ # Execute the query with an unconditional read
+ my @ids;
+ my $sth = WebGUI::SQL->unconditionalRead($sql);
+ while (my ($data) = $sth->array) {
+ push (@ids, $data);
+ }
+ $sth->finish;
+
+ # No matching assets found.
+ if (scalar(@ids) == 0) {
+ return $self->getShortcutDefault; # fall back to the originally mirrored asset.
+ }
+ my $id;
+ # Grab a wid from the results
+ if ($order eq 'random') {
+ $id = $ids[ rand @ids ];
+ } else {
+ #default order is mostRecent
+ $id = $ids[0]; # 1st element in list is most recent.
+ }
+
+ # Store the matching assetId in user scratch.
+ WebGUI::Session::setScratch($scratchId,$id) if ($scratchId);
+
+ return WebGUI::Asset->newByDynamicClass($id);
+}
+
+#-------------------------------------------------------------------
+sub getShortcutDefault {
+ my $self = shift;
+ return WebGUI::Asset->newByDynamicClass($self->get("shortcutToAssetId"));
+}
+
+#-------------------------------------------------------------------
+sub getShortcutOriginal {
+ my $self = shift;
+ if ($self->get("shortcutByCriteria")) {
+ return $self->getShortcutByCriteria;
+ } else {
+ return $self->getShortcutDefault;
+ }
+}
+
+#-------------------------------------------------------------------
+sub getUserPrefs {
+ my $self = shift;
+ my $bibibib = $self->getLineage(["children"],{includeOnlyClasses=>["WebGUI::Asset::Field"],returnObjects=>1});
+ return @$bibibib;
+}
+
+#-------------------------------------------------------------------
+sub processPropertiesFromFormPost {
+ my $self = shift;
+ $self->SUPER::processPropertiesFromFormPost;
+ my $scratchId = "Shortcut_" . $self->getId;
+ WebGUI::Session::deleteAllScratch($scratchId);
+}
+
+#-------------------------------------------------------------------
+
+sub purge {
+ my $self = shift;
+ # delete and purge all associated FieldIds and their preferences.
+ return $self->SUPER::purge;
+}
+
+#-------------------------------------------------------------------
+
+sub purgeRevision {
+ my $self = shift;
+ return $self->SUPER::purgeRevision;
+}
+
+#-------------------------------------------------------------------
+
+sub uncacheOverrides {
+ my $self = shift;
+ WebGUI::Cache->new(["shortcutOverrides",$self->getId])->delete;
+}
+
+#-------------------------------------------------------------------
+sub view {
+ my $self = shift;
+ my $content;
+ my $shortcut = $self->getShortcut;
+ if ($self->get("shortcutToAssetId") eq $self->get("parentId")) {
+ $content = WebGUI::International::get("Displaying this shortcut would cause a feedback loop","Asset_Shortcut");
+ } else {
+ $content = $shortcut->view;
+ }
+ my %var = (
+ isShortcut => 1,
+ 'shortcut.content' => $content,
+ 'shortcut.label' => WebGUI::International::get('assetName',"Asset_Shortcut"),
+ originalURL => $shortcut->getUrl
+ );
+ return $self->processTemplate(\%var,$self->getValue("templateId"));
+}
+
+#-------------------------------------------------------------------
+sub www_edit {
+ my $self = shift;
+ return WebGUI::Privilege::insufficient() unless $self->canEdit;
+ $self->getAdminConsole->setHelp("shortcut add/edit","Asset_Shortcut");
+ $self->getAdminConsole->addSubmenuItem($self->getUrl("func=manageOverrides"),WebGUI::International::get("Manage Shortcut Overrides","Asset_Shortcut"));
+ $self->getAdminConsole->addSubmenuItem($self->getUrl("func=manageUserPrefs"),WebGUI::International::get("Manage User Preferences","Asset_Shortcut"));
+ return $self->getAdminConsole->render($self->getEditForm->print,WebGUI::International::get(2,"Asset_Shortcut"));
+}
+
+#-------------------------------------------------------------------
+sub www_getUserPrefsForm {
+ #This is a form retrieved by "ajax".
+ my $self = shift;
+ return 'nuhuh' unless $self->getParent->canPersonalize;
+ my @fielden = $self->getUserPrefs;
+ my $f = WebGUI::HTMLForm->new(extras=>' onSubmit="submitForm(this,\''.$self->getId.'\',\''.$self->getUrl.'\');return false;"');
+ $f->hidden(
+ -name => 'func',
+ -value => 'saveUserPrefs'
+ );
+ foreach my $field (@fielden) {
+ my $fieldType = $field->get("fieldType") || "text";
+ my $options;
+ my $params = {name=>$field->getId,
+ label=>$field->get("fieldName"),
+ uiLevel=>5,
+ value=>$field->getUserPref($field->getId),
+ extras=>'',
+ possibleValues=>$field->get("possibleValues"),
+ options=>$options,
+ fieldType=>$fieldType
+ };
+ if (lc($fieldType) eq 'textarea') {
+ $params->{rows} = 4;
+ $params->{columns} = 20;
+ }
+ $f->dynamicField(%$params);
+ }
+ $f->submit;
+ return $f->print;
+}
+
+#-------------------------------------------------------------------
+sub www_manageUserPrefs {
+ my $self = shift;
+ return WebGUI::Privilege::insufficient() unless $self->canEdit;
+ my $output = $self->getFieldsList;
+ return $self->_submenu($output,WebGUI::International::get("Manage User Preferences","Asset_Shortcut"));
+}
+
+#-------------------------------------------------------------------
+sub www_manageOverrides {
+ my $self = shift;
+ return WebGUI::Privilege::insufficient() unless $self->canEdit;
+ return $self->_submenu($self->getOverridesList,WebGUI::International::get("Manage Shortcut Overrides","Asset_Shortcut"));
+}
+
+#-------------------------------------------------------------------
+sub www_purgeOverrideCache {
+ my $self = shift;
+ return WebGUI::Privilege::insufficient() unless $self->canEdit;
+ $self->uncacheOverrides;
+ return $self->www_manageOverrides;
+}
+
+#-------------------------------------------------------------------
+sub www_deleteOverride {
+ my $self = shift;
+ return WebGUI::Privilege::insufficient() unless $self->canEdit;
+ WebGUI::SQL->write('delete from Shortcut_overrides where assetId='.quote($self->getId).' and fieldName='.quote($session{form}{fieldName}));
+ $self->uncacheOverrides;
+ return $self->www_manageOverrides;
+}
+
+#-------------------------------------------------------------------
+sub www_saveUserPrefs {
+ my $self = shift;
+ return '' unless $self->getParent->canPersonalize;
+ my @fellowFields = $self->getUserPrefs;
+ foreach my $fieldId (keys %{$session{form}}) {
+ my $field = WebGUI::Asset->newByDynamicClass($fieldId);
+ next unless $field;
+ $field->setUserPref($fieldId,$session{form}{$fieldId});
+ }
+ return $self->view;
+}
+
+#-------------------------------------------------------------------
+sub www_getNewTitle {
+ my $self = shift;
+ return '' unless $self->getParent->canPersonalize;
+ my $foo = $self->getShortcut;
+ return $foo->{_properties}{title};
+}
+
+#-------------------------------------------------------------------
+sub www_editOverride {
+ my $self = shift;
+ return WebGUI::Privilege::insufficient() unless $self->canEdit;
+ my $i18n = WebGUI::International->new("Asset_Shortcut");
+ my $fieldName = $session{form}{fieldName};
+ my %overrides = $self->getOverrides;
+ my $output = '';
+ my %props;
+ foreach my $def (@{$self->getShortcutOriginal->definition}) {
+ %props = (%props,%{$def->{properties}});
+ }
+ $output .= '';
+ my $f = WebGUI::HTMLForm->new(-action=>$self->getUrl);
+ $f->hidden(-name=>"func",-value=>"saveOverride");
+ $f->hidden(-name=>"overrideFieldName",-value=>$session{form}{fieldName});
+ $f->readOnly(-label=>$i18n->get("Field Name"),-value=>$session{form}{fieldName});
+ $f->readOnly(-label=>$i18n->get("Original Value"),-value=>$overrides{overrides}{$fieldName}{origValue});
+ my %params;
+ foreach my $key (keys %{$props{$fieldName}}) {
+ next if ($key eq "tab");
+ $params{$key} = $props{$fieldName}{$key};
+ }
+ $params{value} = $overrides{overrides}{$fieldName}{origValue};
+ $params{name} = $fieldName;
+ $params{label} = $params{label} || $i18n->get("Edit Field Directly");
+ $params{hoverhelp} = $params{hoverhelp} || $i18n->get("Use this field to edit the override using the native form handler for this field type");
+ if ($fieldName eq 'templateId') {$params{namespace} = $params{namespace} || WebGUI::Asset->newByDynamicClass($overrides{overrides}{templateId}{origValue})->get("namespace");}
+ $f->dynamicField(%params);
+ $f->textarea(
+ -name=>"newOverrideValueText",
+ -label=>$i18n->get("New Override Value"),
+ -value=>$overrides{overrides}{$fieldName}{newValue},
+ -hoverHelp=>$i18n->get("Place something in this box if you dont want to use the automatically generated field")
+ );
+ $f->readOnly(-label=>$i18n->get("Replacement Value"),-value=>$overrides{overrides}{$fieldName}{parsedValue},-hoverHelp=>$i18n->get("This is the example output of the field when parsed for user preference macros"));
+ $f->submit;
+ $output .= $f->print;
+ return $self->_submenu($output,$i18n->get('Edit Override'));
+}
+
+#-------------------------------------------------------------------
+sub www_saveOverride {
+ my $self = shift;
+ return WebGUI::Privilege::insufficient() unless $self->canEdit;
+ my $fieldName = $session{form}{overrideFieldName};
+ my %overrides = $self->getOverrides;
+ my $output = '';
+ my %props;
+ foreach my $def (@{$self->getShortcutOriginal->definition}) {
+ %props = (%props,%{$def->{properties}});
+ }
+ my $fieldType = $props{$fieldName}{fieldType};
+ my $value = WebGUI::FormProcessor::process($fieldName,$fieldType);
+ $value = $session{form}{newOverrideValueText} || $value;
+ WebGUI::SQL->write("delete from Shortcut_overrides where assetId=".quote($self->getId)." and fieldName=".quote($fieldName));
+ WebGUI::SQL->write("insert into Shortcut_overrides values (".quote($self->getId).",".quote($fieldName).",".quote($value).")");
+ $self->uncacheOverrides;
+ return $self->www_manageOverrides;
+}
+
+#-------------------------------------------------------------------
+sub www_view {
+ my $self = shift;
+ if (ref($self->getParent) eq 'WebGUI::Asset::Wobject::Dashboard') {
+ return WebGUI::Privilege::noAccess() unless $self->canView;
+ $session{asset} = $self->getParent;
+ return $session{asset}->www_view;
+ } else {
+ return $self->getShortcut->www_view;
+ }
+}
+
+1;
+