[Rt-commit] rt branch, 4.2/delete-all-cf-values-in-bulk, created. rt-4.1.19-85-gbcb8f0f

Ruslan Zakirov ruz at bestpractical.com
Fri Aug 30 07:10:04 EDT 2013


The branch, 4.2/delete-all-cf-values-in-bulk has been created
        at  bcb8f0f6d6955248a1d33cd63a3a7d1767480a81 (commit)

- Log -----------------------------------------------------------------
commit 61b2065b573ebe8e34f54ff1e3dbe9e327469be8
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Aug 30 13:48:07 2013 +0400

    delete all custom fields during bulk update
    
    A checkbox that allows to delete all custom field
    values.

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index 1ce71e5..b608590 100644
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -3522,6 +3522,16 @@ sub ProcessRecordBulkCustomFields {
         );
 
         my $current_values = $args{'RecordObj'}->CustomFieldValues( $cfid );
+        if ( $op eq 'Delete' && $rest eq 'AllValues' && @values ) {
+            while ( my $value = $current_values->Next ) {
+                my ( $id, $msg ) = $args{'RecordObj'}->DeleteCustomFieldValue(
+                    Field   => $cfid,
+                    ValueId => $value->id,
+                );
+                push @results, $msg;
+            }
+            next;
+        }
         foreach my $value (@values) {
             if ( $op eq 'Delete' && $current_values->HasEntry($value) ) {
                 my ( $id, $msg ) = $args{'RecordObj'}->DeleteCustomFieldValue(
diff --git a/share/html/Elements/BulkCustomFields b/share/html/Elements/BulkCustomFields
index 22b07a6..d486c7c 100644
--- a/share/html/Elements/BulkCustomFields
+++ b/share/html/Elements/BulkCustomFields
@@ -67,19 +67,22 @@
 %   Default => $ARGS{"Bulk-Delete-CustomField-$cf_id-Values"} || $ARGS{"Bulk-Delete-CustomField-$cf_id-Value"}, );
 % if ($cf->Type eq 'Select') {
 <td><& /Elements/EditCustomFieldSelect, @add &></td>
-<td><& /Elements/EditCustomFieldSelect, @del &></td>
+<td><& /Elements/EditCustomFieldSelect, @del &><br />
 % } elsif ($cf->Type eq 'Combobox') {
 <td><& /Elements/EditCustomFieldCombobox, @add &></td>
-<td><& /Elements/EditCustomFieldCombobox, @del &></td>
+<td><& /Elements/EditCustomFieldCombobox, @del &><br />
 % } elsif ($cf->Type eq 'Freeform') {
-<td><& /Elements/EditCustomFieldFreeform, @add &></td>
-<td><& /Elements/EditCustomFieldFreeform, @del &></td>
+<td><& /Elements/EditCustomFieldFreeform, @add &>
+<td><& /Elements/EditCustomFieldFreeform, @del &><br />
 % } elsif ($cf->Type eq 'Text') {
-<td><& /Elements/EditCustomFieldText, @add &></td>
-<td> </td>
+<td><& /Elements/EditCustomFieldText, @add &>
+<td>
 % } else {
 %   $RT::Logger->crit("Unknown CustomField type: " . $cf->Type);
+%   next
 % }
+  <label><input type="checkbox" name="Bulk-Delete-CustomField-<% $cf_id %>-AllValues" value="1"><em>check to delete all values</em></label>
+</td>
 </tr>
 % }
 </table>

commit bcb8f0f6d6955248a1d33cd63a3a7d1767480a81
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Aug 30 15:02:26 2013 +0400

    perform bulk cf update operations in order
    
    Order of operations does matter especially when
    there are values to add and delete at the same time.
    It's more important with perl 5.18 where each walk
    through hash can be in different order.
    
    Ignore deletes if we're adding value for field that
    can have only one value.

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index b608590..bce25fa 100644
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -3505,24 +3505,50 @@ sub ProcessRecordBulkCustomFields {
 
     my $ARGSRef = $args{'ARGSRef'};
 
+    my %data;
+
     my @results;
     foreach my $key ( keys %$ARGSRef ) {
         next unless $key =~ /^Bulk-(Add|Delete)-CustomField-(\d+)-(.*)$/;
         my ($op, $cfid, $rest) = ($1, $2, $3);
         next if $rest eq "Category";
 
-        my $cf = RT::CustomField->new( $session{'CurrentUser'} );
-        $cf->Load( $cfid );
-        next unless $cf->Id;
+        my $res = $data{$cfid} ||= {};
+        unless (keys %$res) {
+            my $cf = RT::CustomField->new( $session{'CurrentUser'} );
+            $cf->Load( $cfid );
+            next unless $cf->Id;
+
+            $res->{'cf'} = $cf;
+        }
+
+        if ( $op eq 'Delete' && $rest eq 'AllValues' ) {
+            $res->{'DeleteAll'} = $ARGSRef->{$key};
+            next;
+        }
 
         my @values = _NormalizeObjectCustomFieldValue(
-            CustomField => $cf,
+            CustomField => $res->{'cf'},
             Value => $ARGSRef->{$key},
             Param => $key,
         );
+        next unless @values;
+        $res->{$op} = \@values;
+    }
+
+    while ( my ($cfid, $data) = each %data ) {
+        # just add one value for fields with single value
+        if ( $data->{'Add'} && $data->{'cf'}->MaxValues == 1 ) {
+            my ( $id, $msg ) = $args{'RecordObj'}->AddCustomFieldValue(
+                Field => $cfid,
+                Value => $data->{'Add'}[-1],
+            );
+            push @results, $msg;
+            next;
+        }
 
         my $current_values = $args{'RecordObj'}->CustomFieldValues( $cfid );
-        if ( $op eq 'Delete' && $rest eq 'AllValues' && @values ) {
+        if ( $data->{'DeleteAll'} ) {
             while ( my $value = $current_values->Next ) {
                 my ( $id, $msg ) = $args{'RecordObj'}->DeleteCustomFieldValue(
                     Field   => $cfid,
@@ -3530,24 +3556,24 @@ sub ProcessRecordBulkCustomFields {
                 );
                 push @results, $msg;
             }
-            next;
         }
-        foreach my $value (@values) {
-            if ( $op eq 'Delete' && $current_values->HasEntry($value) ) {
-                my ( $id, $msg ) = $args{'RecordObj'}->DeleteCustomFieldValue(
-                    Field => $cfid,
-                    Value => $value
-                );
-                push @results, $msg;
-            }
+        foreach my $value ( @{ $data->{'Delete'} || [] } ) {
+            next unless $current_values->HasEntry($value);
 
-            elsif ( $op eq 'Add' && !$current_values->HasEntry($value) ) {
-                my ( $id, $msg ) = $args{'RecordObj'}->AddCustomFieldValue(
-                    Field => $cfid,
-                    Value => $value
-                );
-                push @results, $msg;
-            }
+            my ( $id, $msg ) = $args{'RecordObj'}->DeleteCustomFieldValue(
+                Field => $cfid,
+                Value => $value
+            );
+            push @results, $msg;
+        }
+        foreach my $value ( @{ $data->{'Add'} || [] } ) {
+            next if $current_values->HasEntry($value);
+
+            my ( $id, $msg ) = $args{'RecordObj'}->AddCustomFieldValue(
+                Field => $cfid,
+                Value => $value
+            );
+            push @results, $msg;
         }
     }
     return @results;

-----------------------------------------------------------------------


More information about the Rt-commit mailing list