[Rt-commit] rt 04/06: Add multiple order by and order indicator to search results header

sunnavy sunnavy at bestpractical.com
Wed Jul 28 21:25:28 UTC 2021


This is an automated email from the git hooks/post-receive script.

sunnavy pushed a commit to branch 5.0/search-results-header-order-indicator
in repository rt.

commit 5512f047a294c4535fa3cc61fee1d39f14fba7ed
Author: sunnavy <sunnavy at bestpractical.com>
AuthorDate: Tue Oct 2 02:38:06 2018 +0800

    Add multiple order by and order indicator to search results header
    
    Now clicking a header will sort results in the following order:
    
        ASC -> DESC -> UNSET -> ASC -> DESC -> UNSET -> ...
    
    Previously "Created" and "id" shared the same order, e.g. if current
    order is "id ASC", then clicking "Created" header will sort by "Created
    DESC" instead of "Created ASC".
    
    Now we show indicator in header, the above implicit share is confusing,
    so it's dropped.
---
 share/html/Elements/CollectionAsTable/Header   | 56 ++++++++++++++++++++++++--
 share/static/css/elevator-dark/main.css        |  4 ++
 share/static/css/elevator-light/collection.css |  4 ++
 3 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/share/html/Elements/CollectionAsTable/Header b/share/html/Elements/CollectionAsTable/Header
index d9fc8555e0..0fe80642fb 100644
--- a/share/html/Elements/CollectionAsTable/Header
+++ b/share/html/Elements/CollectionAsTable/Header
@@ -79,6 +79,32 @@ else {
 }
 
 my $item = 0;
+
+
+# "Requestor" has alias "Requestors", this is to handle the case where
+# OrderBy is "Requestor.Name" and result Format is "Requestors"
+my %field_alias;
+if ( $Class->can('RecordClass') && $Class->RecordClass->DOES("RT::Record::Role::Roles") ) {
+    for my $role ( $Class->RecordClass->Roles( UserDefined => 0 ) ) {
+        my $attrs = $Class->RecordClass->Role($role);
+        $field_alias{$role} = $role . 's' unless $attrs->{Single};
+    }
+}
+
+my %order_by;
+for my $i ( 0 .. $#OrderBy ) {
+    my $field = $OrderBy[$i];
+    $order_by{$field}{index} = $i;
+    $order_by{$field}{order} = $Order[$i] || 'ASC';
+    $order_by{$field}{class} = $order_by{ $OrderBy[$i] }{order} =~ /ASC/i ? 'fa-sort-up' : 'fa-sort-down';
+
+    if ( $field =~ m!^(\w+)\.! && $field_alias{$1} ) {
+        my $alias = $field;
+        $alias =~ s!^(\w+)\.!$field_alias{$1}.!;
+        $order_by{$alias} = $order_by{$field};
+    }
+}
+
 foreach my $col ( @Format ) {
     my $attr = $col->{'attribute'} || $col->{'last_attribute'};
 
@@ -146,18 +172,40 @@ foreach my $col ( @Format ) {
     {
         $attr = ProcessColumnMapValue( $attr, Arguments => [ $col->{'attribute'} ], Escape => 0 );
 
-        my $new_order = 'ASC';
-        $new_order = ($Order[0] // '') eq 'ASC'? 'DESC': 'ASC'
-            if $OrderBy[0] && ($OrderBy[0] eq $attr or "$attr|$OrderBy[0]" =~ /^(Created|id)\|(Created|id)$/);
+
+        my @new_order_by = @OrderBy;
+        my @new_order = @Order;
+
+        # ASC -> DESC -> UNSET -> ASC, etc.
+        if ( $order_by{$attr} ) {
+             splice @new_order_by, $order_by{$attr}{index}, 1;
+             splice @new_order,   $order_by{$attr}{index}, 1;
+
+             if ( $order_by{$attr}{order} eq 'ASC' ) {
+                 unshift @new_order_by, $attr;
+                 unshift @new_order,   'DESC';
+             }
+        }
+        else {
+            unshift @new_order_by, $attr;
+            unshift @new_order, 'ASC';
+        }
 
         $m->out(
             '<a href="' . $m->interp->apply_escapes($BaseURL
             . $m->comp( '/Elements/QueryString',
                 %$generic_query_args,
-                OrderBy => $attr, Order => $new_order
+                OrderBy => \@new_order_by, Order => \@new_order,
             ), 'h')
             . '">'. $loc_title .'</a>'
         );
+
+        if ( $order_by{$attr} ) {
+            $m->out( qq! <span class="fas $order_by{$attr}{class}"></span>! );
+        }
+        else {
+            $m->out( qq! <span class="fas fa-sort"></span>! );
+        }
     }
     else {
         $m->out( $loc_title );
diff --git a/share/static/css/elevator-dark/main.css b/share/static/css/elevator-dark/main.css
index 7ea673931b..b8b0a67738 100644
--- a/share/static/css/elevator-dark/main.css
+++ b/share/static/css/elevator-dark/main.css
@@ -453,3 +453,7 @@ body.darkmode.IE11 .ui-icon-circle-triangle-e {
     border-color: #717171;
     margin-bottom: 1px;
 }
+
+.darkmode th.collection-as-table svg.fa-sort * {
+    color: #777 !important;
+}
diff --git a/share/static/css/elevator-light/collection.css b/share/static/css/elevator-light/collection.css
index 15ee314522..6ff96c48cb 100644
--- a/share/static/css/elevator-light/collection.css
+++ b/share/static/css/elevator-light/collection.css
@@ -52,3 +52,7 @@ tr:last-of-type.oddline td.collection-as-table,
 tr:last-of-type.evenline td.collection-as-table {
     padding-bottom: 0.5rem;
 }
+
+th.collection-as-table svg.fa-sort {
+    color: #ccc;
+}

-- 
To stop receiving notification emails like this one, please contact
sysadmin at bestpractical.com.


More information about the rt-commit mailing list