import rt 3.8.11
[freeside.git] / rt / html / Admin / Elements / EditCustomFields
index d901b21..77eadbd 100644 (file)
@@ -1,8 +1,8 @@
-%# {{{ BEGIN BPS TAGGED BLOCK
+%# BEGIN BPS TAGGED BLOCK {{{
 %# 
 %# COPYRIGHT:
 %#  
-%# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
+%# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC 
 %#                                          <jesse@bestpractical.com>
 %# 
 %# (Except where explicitly superseded by other copyright notices)
@@ -22,7 +22,9 @@
 %# 
 %# You should have received a copy of the GNU General Public License
 %# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
 %# 
 %# 
 %# CONTRIBUTION SUBMISSION POLICY:
 %# works based on those contributions, and sublicense and distribute
 %# those contributions and any derivatives thereof.
 %# 
-%# }}} END BPS TAGGED BLOCK
-<& /Elements/ListActions, actions => \@actions &>
-
-<TABLE>
-<TR>
-<TD VALIGN=TOP>
-<h2><%$caption%></h2>
-</TD></TR></TABLE>
-% if ($CustomFields->Count == 0 ) {
-<P><i><&|/l&>(No custom fields)</&></i></P>
-% } else {
-<TABLE cellspacing=0 cellpadding=2>
-% my $count;
-% while (my $CustomFieldObj = $CustomFields->Next) { 
-<TR>
-  <TD valign="TOP">
-% if ($CustomFieldObj->Name) {
-    <A HREF="CustomField.html?Queue=<%$id%>&CustomField=<%$CustomFieldObj->id()%>"><b><%$CustomFieldObj->Name%></b></a><br>
-% } else {
-    <A HREF="CustomField.html?Queue=<%$id%>&CustomField=<%$CustomFieldObj->id()%>"><i>(<%loc("no name")%>)</i></a><br>
-% }
-    <%$CustomFieldObj->Description%>
-  </TD>
-  <TD valign="TOP">
-    <i><% $CustomFieldObj->FriendlyType %></i>
-  </TD>
-%  # show 'move up' unless it's the first item
-%  if ($count++) {
-  <TD valign="TOP">
-    <a href="CustomFields.html?id=<%$id%>&CustomField=<%$CustomFieldObj->id%>&Move=-1"><&|/l&>Move up</&></a>
-%  } else {
-  <TD valign="TOP" ALIGN=RIGHT>
-%  }
-
-%  # show 'move down' unless it's the last item
-%  if (!$CustomFields->IsLast) {
-%  $m->print(' | ') if $count > 1;
-    <a href="CustomFields.html?id=<%$id%>&CustomField=<%$CustomFieldObj->id%>&Move=1"><&|/l&>Move down</&></a>
-%  }
-</TD>
-</TR>
+%# END BPS TAGGED BLOCK }}}
+<& /Elements/ListActions, actions => \@results &>
+
+<form action="<%$RT::WebPath%><% $m->request_comp->path |n %>" method="post" name="EditCustomFields">
+<input type="hidden" class="hidden" name="id" value="<% $Object->Id %>" />
+<input type="hidden" class="hidden" name="ObjectType" value="<% $ObjectType %>" />
+<input type="hidden" class="hidden" name="SubType" value="<% $SubType %>" />
+<input type="hidden" class="hidden" name="UpdateCFs" value="1" />
+
+% if ($Object->Id) {
+<h2><&|/l&>Global Custom Fields</&></h2>
+<& PickCustomFields, CustomFields => \@GlobalCFs, ReadOnly => 1, id => $id, SubType => $SubType &>
 % }
+<h2><&|/l&>Selected Custom Fields</&></h2>
+<& PickCustomFields, CustomFields => [$ObjectCFs->CustomFields], id => $id, Checked => 1, SubType => $SubType &>
+<h2><&|/l&>Unselected Custom Fields</&></h2>
+<& PickCustomFields, CustomFields => \@UnassignedCFs, id => $id, SubType => $SubType &>
 
-</TABLE>
-% }
-<FORM METHOD=GET ACTION="CustomFields.html">
-% if ($id) {
-<INPUT TYPE="Hidden" NAME="id" VALUE="<%$id%>">
-% }
-<input type="checkbox" name="FindDisabledCustomFields"> <&|/l&>Include disabled custom fields in listing.</&>
-<input type=submit value="<&|/l&>Go!</&>">
-</FORM>
+<& /Elements/Submit, CheckAll => 1, ClearAll => 1 &>
+</form>
 
 
 <%INIT>
 my $CustomFields = RT::CustomFields->new($session{'CurrentUser'});
-my $QueueObj = RT::Queue->new($session{'CurrentUser'});
-my $caption;
+my @results;
+my (@GlobalCFs, @UnassignedCFs);
 
-if ($id)  {
-        $QueueObj->Load($id);                        
+my $id = $Object->Id;
+if ($id and !$Object->CurrentUserHasRight('AssignCustomFields')) {
+    $m->out('<p><i>', loc('(No custom fields)'), '</i></p>');
+    return;
 }
 
-if ($QueueObj->id) {
-       $CustomFields->LimitToQueue($id);
-}                                            
-else {                                       
-        $CustomFields->LimitToGlobal();
-}                                           
-
-if ($FindDisabledCustomFields) {
-    $caption = loc("All Custom Fields");
-    $CustomFields->{'find_disabled_rows'} = 1;
-} else {
-    $caption = loc("Enabled Custom Fields");
+my $lookup = $ObjectType;
+$lookup .= "-$SubType" if $SubType;
+
+$CustomFields->LimitToLookupType($lookup);
+$CustomFields->OrderBy( FIELD => 'Name' );
+
+
+my ($GlobalCFs, $ObjectCFs);
+$ObjectCFs = RT::ObjectCustomFields->new($session{'CurrentUser'});
+$ObjectCFs->UnLimit;
+$ObjectCFs->LimitToObjectId($id);
+$ObjectCFs->LimitToLookupType($lookup);
+
+# Check sanity of SortOrders
+my %SortOrders;
+$SortOrders{$_->SortOrder}++
+  while ($_ = $ObjectCFs->Next);
+
+# If there are duplicates, run though and squash them
+if (grep {$_ > 1} values %SortOrders) {
+    my $i = 1;
+    while (my $ObjectCF = $ObjectCFs->Next) {
+        $ObjectCF->SetSortOrder($i++);
+    }
+    $ObjectCFs->GotoFirstItem;
 }
 
 # {{{ deal with moving sortorder of custom fields
 if ($CustomField and $Move) {
-    my $SourceObj = RT::CustomField->new($session{'CurrentUser'});
-    $SourceObj->Load($CustomField) || Abort(loc('No CustomField'));
+    my $SourceObj = RT::ObjectCustomField->new($session{'CurrentUser'});
+    $SourceObj->LoadByCols( ObjectId => $id, CustomField => $CustomField );
 
     my $TargetObj;
     my $target_order = $SourceObj->SortOrder + $Move;
-    while (my $CustomFieldObj = $CustomFields->Next) { 
-       my $this_order = $CustomFieldObj->SortOrder;
+    while (my $ObjectCF = $ObjectCFs->Next) { 
+       my $this_order = $ObjectCF->SortOrder;
 
        # if we have an exact match, finish the loop now
-       ($TargetObj = $CustomFieldObj, last) if $this_order == $target_order;
+       ($TargetObj = $ObjectCF, last) if $this_order == $target_order;
 
        # otherwise, we need to apropos toward the general direction
        # ... first, check the sign is correct
@@ -144,7 +129,7 @@ if ($CustomField and $Move) {
            next if $orig_delta < $this_delta;
        }
 
-       $TargetObj = $CustomFieldObj;
+       $TargetObj = $ObjectCF;
     }
 
     if ($TargetObj) {
@@ -153,83 +138,68 @@ if ($CustomField and $Move) {
        $TargetObj->SetSortOrder($s);
        $SourceObj->SetSortOrder($t);
        # because order changed, we must redo search for subsequent uses
-       $CustomFields->RedoSearch;
     }
 
-    $CustomFields->GotoFirstItem;
+    $ObjectCFs->GotoFirstItem;
 }
 # }}}
 
-# {{{ now process the 'copy queue' action
-my @actions;
-if ($Source and $Source ne $id) {
-    my $SourceQueue = RT::Queue->new($session{'CurrentUser'});
-    $SourceQueue->Load($Source) || Abort(loc("Couldn't load queue"));
-    my $SourceCustomFields = RT::CustomFields->new($session{'CurrentUser'});
-    $SourceCustomFields->LimitToQueue($SourceQueue->id);
-
-    # delete old fields
-    foreach my $CustomFieldObj ( @{$CustomFields->ItemsArrayRef} ) { 
-       $CustomFieldObj->Delete;
-    }
+if ($id) {
+    $GlobalCFs = RT::ObjectCustomFields->new($session{'CurrentUser'});
+    $GlobalCFs->LimitToObjectId(0);
+    $GlobalCFs->LimitToLookupType($lookup);
+}
 
-    # add new fields
-    while (my $SourceCustomFieldObj = $SourceCustomFields->Next) {
-       my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
-       my ($val, $msg) =  $CustomFieldObj->Create(
-           id => $SourceCustomFieldObj->id,
-           Queue => $id,
-           Name => $SourceCustomFieldObj->Name,
-           Type => $SourceCustomFieldObj->Type,
-           Description => $SourceCustomFieldObj->Description,
-       );
-       Abort(loc("Could not create CustomField") . ": $msg") unless ($val);
-       push @actions, $msg;
-
-       $CustomFieldObj->SetSortOrder($SourceCustomFieldObj->SortOrder);
-
-       # add new values
-       my $values = $SourceCustomFieldObj->Values();
-       while (my $v = $values->Next) {
-           my ( $addval, $addmsg ) = $CustomFieldObj->AddValue(
-               Name => $v->Name,
-               Description => $v->Description,
-               SortOrder => $v->SortOrder
-           );
-       }
-    }
+while (my $cf = $CustomFields->Next) { 
+    my $cf_id = $cf->Id;
 
-    # because content changed, we must redo search for subsequent uses
-    $CustomFields->RedoSearch;
-    $CustomFields->GotoFirstItem;
-}
-# }}}
+    if ($GlobalCFs and $GlobalCFs->HasEntryForCustomField($cf_id)) {
+       push @GlobalCFs, $cf;
+       next;
+    }
 
-# {{{ deal with deleting existing custom fields
-foreach my $key (keys %ARGS) {
-  # {{{ if we're trying to delete the custom field
-  if ($key =~ /^DeleteCustomField-(\d+)/) {
-    my $id = $1;
-    my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
-    $CustomFieldObj->Load($id);
-    my ($retval, $msg) = $CustomFieldObj->Delete;
-    if ($retval) {
-      push @actions, loc("Custom field deleted");
+    if ($UpdateCFs) {
+       # Go through and delete all the custom field relationships that this object
+       # no longer has
+       my $key = "Object-$id-CF-$cf_id";
+       if ($ARGS{$key}) {
+           if (!$ObjectCFs->HasEntryForCustomField($cf_id)) {
+               my ($val, $msg) = $cf->AddToObject($Object);
+               push (@results, $msg);
+               push @UnassignedCFs, $cf if !$val;
+           }
+       }
+       else {
+           push @UnassignedCFs, $cf;
+           if ($ObjectCFs->HasEntryForCustomField($cf_id)) {
+               my ($val, $msg) = $cf->RemoveFromObject($Object);
+               push (@results, $msg);
+               pop @UnassignedCFs if !$val;
+           }
+       }
     }
-    else {
-      push @actions, $msg;
+    elsif (!$ObjectCFs->HasEntryForCustomField($cf_id)) {
+       push @UnassignedCFs, $cf;
     }
-  }
-  # }}}
+        else {
+        }
 }
-# }}}
+
+# redo search...
+$ObjectCFs = RT::ObjectCustomFields->new($session{'CurrentUser'});
+$ObjectCFs->UnLimit;
+$ObjectCFs->LimitToObjectId($id);
+$ObjectCFs->LimitToLookupType($lookup);
 
 </%INIT>
 <%ARGS>
-$id => 0
 $title => undef
 $Move => undef
 $Source => undef
 $CustomField => undef
 $FindDisabledCustomFields => undef
+$UpdateCFs => 0
+$Object
+$ObjectType
+$SubType => ''
 </%ARGS>