[Rt-commit] rt branch, 4.4/cf-sort-order-inputs, created. rt-4.4.2-67-g379b92aa6
? sunnavy
sunnavy at bestpractical.com
Wed Feb 7 09:56:51 EST 2018
The branch, 4.4/cf-sort-order-inputs has been created
at 379b92aa64a031bb9e259ce2c30baf5bc8b3f2a2 (commit)
- Log -----------------------------------------------------------------
commit 9d4186f2553fa3d2c76d10c60919c424dfb7e699
Author: sunnavy <sunnavy at bestpractical.com>
Date: Fri Jan 26 06:45:37 2018 +0800
support cf reordering by directly editing SortOrder on ocf admin pages
since we don't support move up/down for global cfs on queue-specific
pages, global cfs' SortOrder inputs are disabled there accordingly.
diff --git a/share/html/Admin/Elements/EditCustomFields b/share/html/Admin/Elements/EditCustomFields
index 650ac11b6..8b1fd1a24 100644
--- a/share/html/Admin/Elements/EditCustomFields
+++ b/share/html/Admin/Elements/EditCustomFields
@@ -148,6 +148,33 @@ if ( $UpdateCFs ) {
my ($status, $msg) = $CF->RemoveFromObject( $Object );
push @results, $msg;
}
+
+ my %sort = map { /CustomField-(\d+)-SortOrder/ ? ( $1 => $ARGS{$_} ) : () } keys %ARGS;
+ for my $cf_id ( sort keys %sort ) {
+ my $sort_order = $sort{$cf_id};
+ $sort_order =~ s/^\s+//;
+ $sort_order =~ s/\s+$//;
+ next unless $sort_order =~ /^-?\d+$/;
+
+ my $record = RT::ObjectCustomField->new( $session{'CurrentUser'} );
+ $record->LoadByCols( ObjectId => $id, CustomField => $cf_id );
+ unless ( $record->id ) {
+ push @results,
+ loc("Custom field #[_1] is not applied to object #[_2]", $cf_id, $id);
+ next;
+ }
+
+ if ( $record->SortOrder != $sort_order ) {
+ if ( $id && !$record->ObjectId ) {
+ # just in case, global inputs are disabled on non-global pages
+ push @results, loc("Only global pages can update SortOrder of global objects");
+ next;
+ }
+ my ( $status, $msg ) = $record->SetSortOrder( $sort_order );
+ push @results, '#' . $record->CustomField . ': ' . $msg;
+ }
+ }
+
}
$m->callback(CallbackName => 'UpdateExtraFields', Results => \@results, Object => $Object, %ARGS);
@@ -166,8 +193,8 @@ my $format = RT->Config->Get('AdminSearchResultFormat')->{'CustomFields'};
my $rows = RT->Config->Get('AdminSearchResultRows')->{'CustomFields'} || 50;
my $display_format = $id
- ? ("'__RemoveCheckBox.{$id}__',". $format .", '__MoveCF.{$id}__'")
- : ("'__CheckBox.{RemoveCustomField}__',". $format .", '__MoveCF.{$id}__'");
+ ? ("'__RemoveCheckBox__', ". $format .", '__SortOrder.{$id}__', '__MoveCF.{$id}__'")
+ : ("'__CheckBox.{RemoveCustomField}__', ". $format .", '__SortOrder__', '__MoveCF.{$id}__'");
$m->callback(CallbackName => 'EditDisplayFormat', DisplayFormat => \$display_format, id => $id);
</%INIT>
diff --git a/share/html/Elements/RT__CustomField/ColumnMap b/share/html/Elements/RT__CustomField/ColumnMap
index 2eaad4f02..3e903519e 100644
--- a/share/html/Elements/RT__CustomField/ColumnMap
+++ b/share/html/Elements/RT__CustomField/ColumnMap
@@ -166,6 +166,28 @@ my $COLUMN_MAP = {
return @res;
},
},
+ SortOrder => {
+ title => 'Sort',
+ value => sub {
+ my $id = $_[0]->id;
+ my $queue_id = $_[2] || 0;
+
+ my $record = RT::ObjectCustomField->new( $session{CurrentUser} );
+ my $applied_id = $_[0]->IsGlobal ? 0 : $queue_id;
+ my $disabled = $applied_id == $queue_id ? '' : 'disabled="disabled"';
+
+ $record->LoadByCols( CustomField => $id, ObjectId => $applied_id );
+ if ( $record->id ) {
+ my $name = "CustomField-$id-SortOrder";
+ my $value = $record->SortOrder;
+ return \qq{<input name="}, $name, \qq{" size="5" value="$value" $disabled />};
+ }
+ else {
+ RT->Logger->warning("Custom field #$id is not applied to object #$applied_id");
+ return '';
+ }
+ },
+ },
};
$COLUMN_MAP->{'AppliedTo'} = $COLUMN_MAP->{'AddedTo'};
commit b1c2b766934b43f9dacc61337a146e7b8c63de22
Author: sunnavy <sunnavy at bestpractical.com>
Date: Wed Feb 7 22:42:31 2018 +0800
try to automatically resolve duplicated SortOrder for custom fields
diff --git a/lib/RT/SearchBuilder/AddAndSort.pm b/lib/RT/SearchBuilder/AddAndSort.pm
index 6a170a225..3b744a2db 100644
--- a/lib/RT/SearchBuilder/AddAndSort.pm
+++ b/lib/RT/SearchBuilder/AddAndSort.pm
@@ -214,6 +214,94 @@ sub JoinTargetToThis {
return $collection->{ $key } = $alias;
}
+=head2 ResolveDuplicatedSortOrder( ObjectId => VALUE )
+
+Note that it could fail if it can't find an approach to resolve.
+
+Returns (1, 'Status message 1', 'Status message 2', ... ) on success and
+(0, 'Error Message') on failure.
+
+Returns 1 if there are no duplicates found.
+
+=cut
+
+sub ResolveDuplicatedSortOrder {
+ my $self = shift;
+ my %args = (
+ ObjectId => 0,
+ @_,
+ );
+
+ my ( %record, %order, %dup, %changes );
+
+ while ( my $record = $self->Next ) {
+ $record{ $record->id } = $record;
+ $order{ $record->id } = $record->SortOrder;
+ $dup{ $record->SortOrder }++;
+ }
+
+ if ( grep { $_ > 1 } values %dup ) {
+
+ # for records having the same sort order, later updated ones win
+ my @ids =
+ sort {
+ ( $order{$a} <=> $order{$b} )
+ || ( $record{$b}->LastUpdated cmp $record{$a}->LastUpdated )
+ || ( $a <=> $b )
+ }
+ keys %record;
+ my @orders = sort { $a <=> $b } values %order;
+
+ my @new_orders;
+ my %exist;
+ for my $order ( @orders ) {
+ my $new_order = $order;
+ while ( $exist{$new_order} ) {
+ $new_order += 1;
+ }
+ push @new_orders, $new_order;
+ $exist{$new_order} = 1;
+ }
+
+ for my $id ( @ids ) {
+ my $new_order = shift @new_orders;
+ if ( $order{$id} != $new_order ) {
+ if ( !$args{ObjectId} || $record{$id}->ObjectId ) {
+ $changes{$id} = $new_order;
+ }
+ else {
+ return ( 0,
+ $self->loc(
+"Failed to resolve duplicated SortOrder automatically, please resolve manually or adjust global ones first on global page"
+ )
+ );
+ }
+ }
+ }
+ }
+
+ if ( %changes ) {
+ my @msgs;
+ $RT::Handle->BeginTransaction;
+ for my $id ( sort { $a <=> $b } keys %changes ) {
+ my ( $ret, $msg ) =
+ $record{$id}->SetSortOrder( $changes{$id} );
+ $msg = "#" . $record{$id}->CustomField . ': ' . $msg;
+ if ( $ret ) {
+ push @msgs, $msg;
+ }
+ else {
+ $RT::Handle->Rollback;
+ return ( $ret, $msg );
+ }
+ }
+ $RT::Handle->Commit;
+ return ( 1, @msgs );
+ }
+
+ return 1;
+}
+
RT::Base->_ImportOverlays();
1;
diff --git a/share/html/Admin/Elements/EditCustomFields b/share/html/Admin/Elements/EditCustomFields
index 8b1fd1a24..3ea830719 100644
--- a/share/html/Admin/Elements/EditCustomFields
+++ b/share/html/Admin/Elements/EditCustomFields
@@ -175,6 +175,23 @@ if ( $UpdateCFs ) {
}
}
+ {
+ my $cfs = RT::CustomFields->new( $session{'CurrentUser'} );
+ $cfs->LimitToLookupType($lookup);
+ $cfs->LimitToGlobalOrObjectId($id);
+ $cfs->SetContextObject( $Object );
+
+ my $ocfs = RT::ObjectCustomFields->new( $session{CurrentUser} );
+ $ocfs->Limit(
+ FIELD => 'CustomField',
+ VALUE => [ map { $_->id } @{$cfs->ItemsArrayRef } ],
+ OPERATOR => 'IN',
+ );
+ $ocfs->Limit( FIELD => 'ObjectId', VALUE => [ 0, $id ], OPERATOR => 'IN' );
+
+ my ( $status, @msgs ) = $ocfs->ResolveDuplicatedSortOrder( ObjectId => $id );
+ push @results, @msgs;
+ }
}
$m->callback(CallbackName => 'UpdateExtraFields', Results => \@results, Object => $Object, %ARGS);
commit 379b92aa64a031bb9e259ce2c30baf5bc8b3f2a2
Author: sunnavy <sunnavy at bestpractical.com>
Date: Wed Feb 7 22:43:30 2018 +0800
config option to enable/disable SortOrder's auto-resolve approach
diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 48fd0fe52..3f828fe5a 100644
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -3891,6 +3891,23 @@ Set(%AdminSearchResultRows,
Assets => 50,
);
+=item C<%AdminAutoResolveDuplicatedSortOrder>
+
+Use C<%AdminAutoResolveDuplicatedSortOrder> to automatically resolve
+duplicated SortOrder on admin pages.
+
+Note that for objects like custom fields that support multiple lever apply
+approaches(globally or at queue level), updating SortOrder of global custom
+fields might cause new duplications at queue level, this config doesn't check
+or resolve those new duplications.
+
+=cut
+
+
+Set(%AdminAutoResolveDuplicatedSortOrder,
+ CustomFields => 0,
+);
+
=back
diff --git a/share/html/Admin/Elements/EditCustomFields b/share/html/Admin/Elements/EditCustomFields
index 3ea830719..c1a25ab0b 100644
--- a/share/html/Admin/Elements/EditCustomFields
+++ b/share/html/Admin/Elements/EditCustomFields
@@ -175,7 +175,8 @@ if ( $UpdateCFs ) {
}
}
- {
+ my $config = RT->Config->Get('AdminAutoResolveDuplicatedSortOrder');
+ if ( $config && $config->{CustomFields} ) {
my $cfs = RT::CustomFields->new( $session{'CurrentUser'} );
$cfs->LimitToLookupType($lookup);
$cfs->LimitToGlobalOrObjectId($id);
-----------------------------------------------------------------------
More information about the rt-commit
mailing list