[Rt-commit] rt branch, 4.0/status-selector, created. rt-4.0.8-149-g4b3351b

Thomas Sibley trs at bestpractical.com
Tue Nov 6 20:45:28 EST 2012


The branch, 4.0/status-selector has been created
        at  4b3351b4c2bc573d2d93fc3886bf322d4515461d (commit)

- Log -----------------------------------------------------------------
commit 7b77b82d8116cd3a5a3a12a6c3e3428b4b7224bb
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Tue Nov 6 17:05:11 2012 -0800

    Bulk update: Only show statuses for queues which appear in the results
    
    Trims down the status selector from "all statuses" to a potentially much
    smaller set in many scenarios.  It's safe to limit selectable statuses
    because Status is set _before_ Queue when processing the update, so all
    valid statuses will be listed.  If Queue is ever processed before
    Status, this change will need to be revisited as it prevents showing
    statuses from destination queues which don't appear in the search
    results.

diff --git a/share/html/Search/Bulk.html b/share/html/Search/Bulk.html
index fc4be7a..fe17a0c 100644
--- a/share/html/Search/Bulk.html
+++ b/share/html/Search/Bulk.html
@@ -105,7 +105,7 @@
 <tr><td class="label"> <&|/l&>Make queue</&>: </td>
 <td class="value"> <& /Elements/SelectQueue, Name => "Queue", Default => $ARGS{Queue} &> </td></tr>
 <tr><td class="label"> <&|/l&>Make Status</&>: </td>
-<td class="value"> <& /Elements/SelectStatus, Name => "Status", Default => $ARGS{Status} &> </td></tr>
+<td class="value"> <& /Elements/SelectStatus, Name => "Status", Default => $ARGS{Status}, Queues => $seen_queues &> </td></tr>
 <tr><td class="label"> <&|/l&>Make date Starts</&>: </td>
 <td class="value"> <& /Elements/SelectDate, Name => "Starts_Date", Default => $ARGS{Starts_Date} || '' &> </td></tr>
 <tr><td class="label"> <&|/l&>Make date Started</&>: </td>

commit cd4789de9d5c7943cbbd5232fb68ae595c6acf61
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Tue Nov 6 17:10:33 2012 -0800

    Group by lifecycle in the status selection widget
    
    For UI simplicity, no grouping is done if only one lifecycle is seen.
    
    For code simplicity, multiple <option> elements may be marked selected
    even if the displayed <select> doesn't allow multiple selections.  This
    is an authoring error according to the HTML spec, but browsers generally
    just deal and pick one.  It doesn't matter to RT which one they pick,
    since statuses are identified only by name.  We can consider a technical
    solution down the road if it proves to trigger confusing behaviour and
    frustrates users.

diff --git a/share/html/Elements/SelectStatus b/share/html/Elements/SelectStatus
index 33a2edc..07150a3 100644
--- a/share/html/Elements/SelectStatus
+++ b/share/html/Elements/SelectStatus
@@ -49,21 +49,29 @@
 % if ( $DefaultValue ) {
 <option value=""<% !$Default && qq[ selected="selected"] |n %>><% $DefaultLabel %></option>
 % }
-% foreach my $status (@status) {
-% next if ($SkipDeleted && $status eq 'deleted');
-% my $selected = defined $Default && $status eq $Default ? 'selected="selected"' : '';
+% for my $lifecycle (sort keys %statuses_by_lifecycle) {
+%     if ($group_by_lifecycle) {
+<optgroup label="<% $lifecycle %>">
+%     }
+%     foreach my $status (@{$statuses_by_lifecycle{$lifecycle}}) {
+%         next if ($SkipDeleted && $status eq 'deleted');
+%         my $selected = defined $Default && $status eq $Default ? 'selected="selected"' : '';
 <option value="<% $status %>" <% $selected |n %>><% loc($status) %></option>
+%     }
+%     if ($group_by_lifecycle) {
+</optgroup>
+%     }
 % }
 </select>
 <%INIT>
 ### XXX: no cover for Tools/MyDay.html
 
-
-my @status;
+my %statuses_by_lifecycle;
 if ( @Statuses ) {
-    @status = @Statuses;
+    $statuses_by_lifecycle{''} = \@Statuses;
 }
 elsif ( $TicketObj ) {
+    my @status;
     my $current = $TicketObj->Status;
     push @status, $current;
 
@@ -76,20 +84,27 @@ elsif ( $TicketObj ) {
             unless exists $has{ $check };
         push @status, $next if $has{ $check };
     }
+    $statuses_by_lifecycle{$lifecycle->Name} = \@status;
 }
 elsif ( $QueueObj ) {
-    @status = $QueueObj->Lifecycle->Transitions('');
+    my $lifecycle = $QueueObj->Lifecycle;
+    $statuses_by_lifecycle{$lifecycle->Name} = [ $lifecycle->Transitions('') ];
 } elsif ( %Queues ) {
     for my $id (keys %Queues) {
         my $queue = RT::Queue->new($session{'CurrentUser'});
         $queue->Load($id);
-        push @status, $queue->Lifecycle->Valid if $queue->id;
+        if ($queue->id) {
+            my $lifecycle = $queue->Lifecycle;
+            $statuses_by_lifecycle{$lifecycle->Name} = [ $lifecycle->Valid ];
+        }
     }
-    my %seen;
-    @status = grep { not $seen{$_}++ } @status;
 } else {
-    @status = RT::Queue->Lifecycle->Valid;
+    for my $lifecycle (map { RT::Lifecycle->Load($_) } RT::Lifecycle->List) {
+        $statuses_by_lifecycle{$lifecycle->Name} = [ $lifecycle->Valid ];
+    }
 }
+
+my $group_by_lifecycle = keys %statuses_by_lifecycle > 1;
 </%INIT>
 <%ARGS>
 $Name => undef

commit 4b3351b4c2bc573d2d93fc3886bf322d4515461d
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Tue Nov 6 17:34:49 2012 -0800

    Simplify status selector by lumping lifecycles with identical statuses
    
    For example, the "default" lifecycle and a copy named "reply-on-resolve"
    which changes only the transitions available in the actions menu are now
    grouped into the same <optgroup> with the heading "default,
    reply-on-resolve".
    
    While the previous commits made the shipped "approvals" and "default"
    lifecycles appear separately if you were looking at tickets in both
    queues, this commit now joins them.  For maximum simplicity, the
    decision to display groupings or not is done _after_ simplification,
    regardless of how many lifecycles may be lumped into the same grouping.

diff --git a/share/html/Elements/SelectStatus b/share/html/Elements/SelectStatus
index 07150a3..fa3f25a 100644
--- a/share/html/Elements/SelectStatus
+++ b/share/html/Elements/SelectStatus
@@ -104,6 +104,29 @@ elsif ( $QueueObj ) {
     }
 }
 
+if (keys %statuses_by_lifecycle) {
+    my %simplified;
+    my $key = sub {
+        join "\0", sort @{$_[0]};
+    };
+    for my $name (sort keys %statuses_by_lifecycle) {
+        my $matched;
+        my $statuses = $statuses_by_lifecycle{$name};
+        for my $simple (sort keys %simplified) {
+            if ($key->($statuses) eq $key->($simplified{$simple})) {
+                # Statuses are the same, join 'em!
+                $simplified{"$simple, $name"} = delete $simplified{$simple};
+                $matched++;
+                last;
+            }
+        }
+        unless ($matched) {
+            $simplified{$name} = $statuses;
+        }
+    }
+    %statuses_by_lifecycle = %simplified;
+}
+
 my $group_by_lifecycle = keys %statuses_by_lifecycle > 1;
 </%INIT>
 <%ARGS>

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


More information about the Rt-commit mailing list