[Rt-commit] rt branch, 4.2-trunk, updated. rt-4.2.1-146-ga46cda5

Alex Vandiver alexmv at bestpractical.com
Mon Dec 30 15:28:18 EST 2013


The branch, 4.2-trunk has been updated
       via  a46cda570db7d8b2dd0635213287ac60252c6c95 (commit)
       via  caf696481572ef5d318ec7b76626161b99fa82b6 (commit)
       via  963dbcfc28374a35e8874fa21222f397b1fd5cdd (commit)
       via  aa9e15e4d06135a3958473f1a88ef799622d8087 (commit)
       via  a62337c04e823ea12f2321e25a69af0fcb4ff20d (commit)
       via  87fdc3af9dd95177389cc5c0de7d041c2d81e422 (commit)
       via  929b4231ac5787e1fc996cad10f9c8dd006e87ed (commit)
       via  750bdd77bd46df724bba9761df2bcd1d21cfb915 (commit)
       via  50a1820570a23645fb6ca320e7f2d3e3580ad3d6 (commit)
       via  fb2bbdc09ce0ad1c6b2da0f968d231f309a27c9c (commit)
       via  3dde82e1221a0fe53568d725d381049be3491ffd (commit)
       via  b02416314b4bd0178730e4f644560565c5688844 (commit)
       via  d72d9297fc2480c0ab0b044770588f53922af1d1 (commit)
       via  82403d5aabad7bcc155fa89db301cd9bd1fa552d (commit)
       via  f94d5ca01ff5ead7b7f55961e3f84d8b9e5ea0ba (commit)
       via  7a84d344f8a2d476443968d04bfd4b3cdb5a7083 (commit)
       via  96faae4f99b556502b422e7b5eb5a35231cf5841 (commit)
       via  b801b1a1781d971679fd49e1bf1d25d062e340cc (commit)
       via  47eba228d2145e8d702ad780a049eba81c5dd06f (commit)
       via  52cdd5e88669afebb8c4323639c04924eb93b65a (commit)
       via  c9784ee02295fb153eb8a3d33e8db56c039a0251 (commit)
       via  96c92e523ff4a2e9e19f272fdd58afe2290e9b6f (commit)
       via  5e6c838629144191819fe252e2a3eb9604ff5381 (commit)
       via  a2c75faf16a7a4d1d3942a944811d29d7877d25a (commit)
       via  13e5e0905a9b7c427975de624acb6289f5d0a402 (commit)
       via  5f48d3604c14b27b3e7f6a734866d72865f9d9ee (commit)
       via  c69f9c8d0322572b6d12ae1e8a715b8d417c3b75 (commit)
       via  105553554acd273e3501feac6686d6d1b67ea08a (commit)
       via  75eea23fd080cafda514c882261eb046ce67a257 (commit)
       via  f81406f866cf1a8cfe70fd88114ed8c81e144450 (commit)
       via  f117f877f0f8d34cfbe86e1e8f017176d00760d7 (commit)
       via  509d9689fa955a1e56997c3b8aaa03f7aab6b566 (commit)
       via  675f1a4f7c1a265824d1216dfaa30f52f6495f1d (commit)
       via  99d669c2f31fc9a973e3a34375506ef392af8a39 (commit)
       via  9dd36f6d16e359bc991cf5548101956156521ef7 (commit)
       via  7323567a2acc77ebae02dd5bd0ac4a403d805302 (commit)
       via  01261c4945741037cd6bdd18ba5fce4af6d5e2a4 (commit)
       via  26fef1c8c3eccf22bbf01f25b463bb52eada9b9c (commit)
       via  28fd301c2e3a14fe005f400aac18eaddb2347f6d (commit)
       via  2a26e780d2c0af4e7c530a8895acdab543babc6f (commit)
       via  9d60fbcd534f0f999742db4c909fa35cb4a54c27 (commit)
       via  27cd81c4cec6dbf6b5670c4ee69b2a49a1230093 (commit)
       via  ad9391083d4d60aeccf7a1766204fe7d78237e05 (commit)
       via  e625a53e8e62bab2efacde09b8e3d3d5026ed447 (commit)
       via  f60d35ca534f7c00a5384f538f4bb19148b3fec4 (commit)
       via  d9086dc896adf22bffba95eb6ba5b58d8b1b20fc (commit)
       via  0b62ae8a3bc852372b0f069a5628b680abab6a4c (commit)
       via  548f0272f69ce0720f37353e20f7b3d09c67c997 (commit)
       via  edb91f1cd09e8cd788b254a2222383545c15c6a0 (commit)
       via  440e25e29bc985f6dc176b8887f0326824939adf (commit)
       via  b1e34c183e8340f1f13cbd82cccce0fd8983f560 (commit)
       via  4360a4dd62adc28f3204935fda17350aeeeec605 (commit)
       via  2f9e8f0b703efe5f503753192d48f00395edcd63 (commit)
       via  cd1aa12a2b47cfb55945cc79f43293f16db6e7ee (commit)
       via  358d84ddf85bd5e5b791ff20fa311bfb2da0773b (commit)
       via  10ce1a328fadb48a545abd5dadb13ca67d7ea72f (commit)
       via  487c61791ab50401a43da3f5c6f90b651142119b (commit)
       via  d3cce810dda243968921e66418371b4cebb780f4 (commit)
       via  4e44bcf3003f78b5f4e736287fb1afc27acca4f1 (commit)
       via  126e8ac461e09e90fba0bbb574a871e4e534d85d (commit)
       via  9fe2bfcd6fcd3b8d2fadeba8a80972b4ff534b01 (commit)
       via  2b014831a5fe1d0f00645880ccbf0417bfb89999 (commit)
       via  497e471b34b13d5fb1c15fb7efcff39fc4f4aec8 (commit)
       via  41fdde28846d574e25a55225d8ed2e733f61b1f4 (commit)
       via  831d829b3a46f011319660deaeb141ece2bbc78a (commit)
       via  3f64e96437a75f7271cd57230de6fb17bc8670da (commit)
       via  b4aa9ab8149422acceb8dd1d1c5dbf55ab94eb73 (commit)
       via  8d02f08217c011619d7bf8dc251e9b3d5a440f17 (commit)
       via  3a9c38edf8873465b90ef9efca3c6acb7faf8416 (commit)
       via  c7f9a42b9d9531beafdf267206e07f686fa1c26e (commit)
       via  dcd158e8e8336c7908eaf9e2922b29740077517e (commit)
       via  5ce09d16d60e0a1473d906449f8c951d676ad750 (commit)
       via  d2d46485ee4d3b999eee474b74ed3024c263e4bd (commit)
       via  4543ea2a625479e9e1c276564d240b15c8b457fc (commit)
       via  80496ffb0ddebde01bf7fd2c0efd2e2f004caef0 (commit)
       via  cd0e710b103bb5b23deb32b9dac31f1c1eedaa92 (commit)
       via  d1bfae294f683cd2d2e3697e0cf016e60c1e3a7d (commit)
       via  06718ab3e15fa167c34f8703c69d89f5077ae408 (commit)
      from  209bd254faed0cca1e0f6267282932274c86049b (commit)

Summary of changes:
 Makefile.in                                   | 27 +-----------------
 docs/customizing/lifecycles.pod               |  8 ++++--
 etc/RT_Config.pm.in                           |  2 +-
 etc/drop.Oracle                               | 41 ---------------------------
 etc/schema.mysql                              |  6 ++--
 etc/upgrade/3.7.19/content                    | 13 ++++++++-
 etc/upgrade/{4.2.2 => 4.0.19}/content         |  0
 etc/upgrade/4.0.19/schema.mysql               |  5 ++++
 etc/upgrade/upgrade-articles.in               |  2 ++
 etc/upgrade/upgrade-mysql-schema.pl           |  6 ++--
 lib/RT/Dashboard/Mailer.pm                    |  4 +--
 lib/RT/EmailParser.pm                         | 29 +++++++++++++++++++
 lib/RT/Handle.pm                              |  7 ++++-
 lib/RT/Interface/Email.pm                     |  2 +-
 lib/RT/Interface/REST.pm                      |  1 +
 lib/RT/Interface/Web.pm                       | 10 +++++--
 lib/RT/Record.pm                              | 40 +++++++++++++++++++++++---
 lib/RT/Shredder.pm                            | 15 ++++++++++
 lib/RT/Tickets.pm                             |  5 +---
 sbin/rt-setup-database.in                     | 15 ++++++++--
 share/html/Admin/Tools/Theme.html             | 18 +++++++++---
 share/html/Elements/RT__CustomField/ColumnMap |  2 +-
 share/html/Elements/RT__User/ColumnMap        |  5 ++++
 share/html/Elements/SelectObject              | 17 +++++++++++
 share/html/Elements/Tabs                      |  6 ++--
 share/html/NoAuth/css/ballard/InHeader        |  2 +-
 share/html/REST/1.0/Forms/ticket/comment      |  1 -
 share/html/REST/1.0/ticket/comment            |  1 -
 share/html/Search/Chart.html                  |  8 ++++++
 share/html/Ticket/Create.html                 | 10 +++++--
 share/html/Ticket/Display.html                |  2 +-
 share/static/css/aileron/msie6.css            | 23 +++++++++++++++
 share/static/css/aileron/ticket-lists.css     |  2 ++
 share/static/css/ballard/msie6.css            |  9 ++++++
 share/static/css/ballard/nav.css              |  1 -
 share/static/css/ballard/ticket-lists.css     |  3 +-
 share/static/css/base/misc.css                |  5 ++++
 share/static/css/base/msie6.css               | 19 +++++++++++++
 share/static/css/web2/msie6.css               |  5 ++++
 share/static/css/web2/ticket-lists.css        |  3 +-
 t/ticket/search_by_links.t                    | 10 ++++++-
 41 files changed, 278 insertions(+), 112 deletions(-)
 delete mode 100755 etc/drop.Oracle
 copy etc/upgrade/{4.2.2 => 4.0.19}/content (100%)
 create mode 100644 etc/upgrade/4.0.19/schema.mysql
 create mode 100644 share/static/css/base/msie6.css

- Log -----------------------------------------------------------------
commit a46cda570db7d8b2dd0635213287ac60252c6c95
Merge: 209bd25 caf6964
Author: Alex Vandiver <alexmv at bestpractical.com>
Date:   Mon Dec 30 15:22:53 2013 -0500

    Merge branch '4.0-trunk' into 4.2-trunk
    
    Conflicts:
    	Makefile.in
    	etc/upgrade/3.7.19/content
    	lib/RT/Crypt/GnuPG.pm
    	lib/RT/EmailParser.pm
    	sbin/rt-setup-database.in
    	share/html/Elements/EditCustomFieldSelect
    	share/html/Elements/SelectQueue
    	share/html/NoAuth/css/aileron/msie6.css
    	share/html/NoAuth/css/ballard/InHeader
    	share/html/NoAuth/css/ballard/msie6.css
    	share/html/NoAuth/css/base/misc.css
    	share/html/NoAuth/css/web2/msie6.css
    	share/html/NoAuth/js/cascaded.js
    	t/mail/dashboards.t
    	t/mail/gnupg-reverification.t
    	t/web/crypt-gnupg.t

diff --cc Makefile.in
index 6503226,af12bec..fc584e0
--- a/Makefile.in
+++ b/Makefile.in
@@@ -354,7 -348,7 +354,7 @@@ dirs
  
  install: testdeps config-install dirs files-install fixperms instruct
  
- files-install: libs-install etc-install config-install bin-install sbin-install html-install local-install doc-install font-install po-install static-install
 -files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install
++files-install: libs-install etc-install config-install bin-install sbin-install html-install doc-install font-install po-install static-install
  
  config-install:
  @COMMENT_INPLACE_LAYOUT@	$(INSTALL) -m 0755 -o $(BIN_OWNER) -g $(RTGROUP) -d $(DESTDIR)$(CONFIG_FILE_PATH)
diff --cc etc/upgrade/3.7.19/content
index a694562,ff43dd0..34af550
--- a/etc/upgrade/3.7.19/content
+++ b/etc/upgrade/3.7.19/content
@@@ -26,9 -24,20 +26,20 @@@ our @Final = 
  
  sub gen_scrip_description {
      my $scrip = shift;
-     my $condition = $scrip->ConditionObj->Name
+ 
+     my $condition;
+     eval{
+       $condition = $scrip->ConditionObj->Name
          || $scrip->ConditionObj->Description
 -	|| ('On Condition #'. $scrip->Condition);
 +        || ('On Condition #'. $scrip->Condition);
+     };
+ 
+     if ($@){
+       print STDERR $@;
+       print STDERR "Reference to missing scrip condition found. If you have ScripCondition = 0 in the Scrips table, update with a real condition number.\n";
+       $condition = 'On undefined Condition # 0';
+     }
+ 
      my $action = $scrip->ActionObj->Name
          || $scrip->ActionObj->Description
          || ('Run Action #'. $scrip->Action);
diff --cc lib/RT/EmailParser.pm
index 8a4b2a3,6580a8c..320ce1f
--- a/lib/RT/EmailParser.pm
+++ b/lib/RT/EmailParser.pm
@@@ -532,38 -530,54 +532,67 @@@ sub ParseEmailAddress 
      my $self = shift;
      my $address_string = shift;
  
 -    $address_string =~ s/^\s+|\s+$//g;
 +    my @list = Email::Address::List->parse(
 +        $address_string,
 +        skip_comments => 1,
 +        skip_groups => 1,
 +    );
 +    my $logger = sub { RT->Logger->error(
 +        "Unable to parse an email address from $address_string: ". shift
 +    ) };
  
      my @addresses;
 -    # if it looks like a username / local only email
 -    if ($address_string !~ /@/ && $address_string =~ /^\w+$/) {
 -        my $user = RT::User->new( RT->SystemUser );
 -        my ($id, $msg) = $user->Load($address_string);
 -        if ($id) {
 -            push @addresses, Email::Address->new($user->Name,$user->EmailAddress);
 +    foreach my $e ( @list ) {
 +        if ($e->{'type'} eq 'mailbox') {
 +            if ($e->{'not_ascii'}) {
 +                $logger->($e->{'value'} ." contains not ASCII values");
 +                next;
 +            }
 +            push @addresses, $e->{'value'}
 +        } elsif ( $e->{'value'} =~ /^\s*(\w+)\s*$/ ) {
 +            my $user = RT::User->new( RT->SystemUser );
 +            $user->Load( $1 );
 +            if ($user->id) {
 +                push @addresses, Email::Address->new($user->Name, $user->EmailAddress);
 +            } else {
 +                $logger->($e->{'value'} ." is not a valid email address and is not user name");
 +            }
          } else {
 -            $RT::Logger->error("Unable to parse an email address from $address_string: $msg");
 +            $logger->($e->{'value'} ." is not a valid email address");
          }
 -    } else {
 -        @addresses = Email::Address->parse($address_string);
      }
+ 
+     $self->CleanupAddresses(@addresses);
+ 
      return @addresses;
 -
  }
  
+ =head2 CleanupAddresses ARRAY
+ 
+ Massages an array of L<Email::Address> objects to make their email addresses
+ more palatable.
+ 
+ Currently this strips off surrounding single quotes around C<< ->address >> and
+ B<< modifies the L<Email::Address> objects in-place >>.
+ 
+ Returns the list of objects for convienence in C<map>/C<grep> chains.
+ 
+ =cut
+ 
+ sub CleanupAddresses {
+     my $self = shift;
+ 
+     for my $addr (@_) {
+         next unless defined $addr;
+         # Outlook sometimes sends addresses surrounded by single quotes;
+         # clean them all up
+         if ((my $email = $addr->address) =~ s/^'(.+)'$/$1/) {
+             $addr->address($email);
+         }
+     }
+     return @_;
+ }
+ 
  =head2 RescueOutlook 
  
  Outlook 2007/2010 have a bug when you write an email with the html format.
diff --cc lib/RT/Handle.pm
index b6a7c01,1efade5..8b063b4
--- a/lib/RT/Handle.pm
+++ b/lib/RT/Handle.pm
@@@ -934,23 -867,20 +937,25 @@@ sub InsertData 
              my $new_entry = RT::CustomField->new( RT->SystemUser );
              my $values    = delete $item->{'Values'};
  
 -            my @queues;
 -            # if ref then it's list of queues, so we do things ourself
 -            if ( exists $item->{'Queue'} && ref $item->{'Queue'} ) {
 +            # Back-compat for the old "Queue" argument
 +            if ( exists $item->{'Queue'} ) {
                  $item->{'LookupType'} ||= 'RT::Queue-RT::Ticket';
 -                @queues = @{ delete $item->{'Queue'} };
 +                $RT::Logger->warn("Queue provided for non-ticket custom field")
 +                    unless $item->{'LookupType'} =~ /^RT::Queue-/;
 +                $item->{'ApplyTo'} = delete $item->{'Queue'};
              }
  
 +            my $apply_to = delete $item->{'ApplyTo'};
 +
              if ( $item->{'BasedOn'} ) {
-                 if ( $item->{'LookupType'} ) {
+                 if ( $item->{'BasedOn'} =~ /^\d+$/) {
+                     # Already have an ID -- should be fine
+                 } elsif ( $item->{'LookupType'} ) {
                      my $basedon = RT::CustomField->new($RT::SystemUser);
 -                    my ($ok, $msg ) = $basedon->LoadByCols( Name => $item->{'BasedOn'},
 -                                                            LookupType => $item->{'LookupType'} );
 +                    my ($ok, $msg ) = $basedon->LoadByCols(
 +                        Name => $item->{'BasedOn'},
 +                        LookupType => $item->{'LookupType'},
 +                        Disabled => 0 );
                      if ($ok) {
                          $item->{'BasedOn'} = $basedon->Id;
                      } else {
diff --cc sbin/rt-setup-database.in
index 0995457,54c91aa..8bba8b8
--- a/sbin/rt-setup-database.in
+++ b/sbin/rt-setup-database.in
@@@ -83,7 -91,7 +83,8 @@@ GetOptions
      'force', 'debug',
      'dba=s', 'dba-password=s', 'prompt-for-dba-password', 'package=s',
      'datafile=s', 'datadir=s', 'skip-create', 'root-password-file=s',
 +    'package=s', 'ext-version=s',
+     'upgrade-from=s', 'upgrade-to=s',
      'help|h',
  );
  
@@@ -766,17 -594,14 +767,27 @@@ administrator privilege
  for 'init' and 'insert': rather than using the default administrative password
  for RT's "root" user, use the password in this file.
  
 +=item package 
 +
 +the name of the entity performing a create or upgrade. Used for logging changes
 +in the DB. Defaults to RT, otherwise it should be the fully qualified package name
 +of the extension or plugin making changes to the DB.
 +
 +=item ext-version
 +
 +current version of extension making a change. Not needed for RT since RT has a
 +more elaborate system to track upgrades across multiple versions.
 +
+ =item upgrade-from
+ 
+ for 'upgrade': specifies the version to upgrade from, and do not prompt
+ for it if it appears to be a valid version.
+ 
+ =item upgrade-to
+ 
+ for 'upgrade': specifies the version to upgrade to, and do not prompt
+ for it if it appears to be a valid version.
+ 
  =back
 +
 +=cut
diff --cc share/html/Elements/SelectObject
index 6e8c16a,0000000..fa0d979
mode 100644,000000..100644
--- a/share/html/Elements/SelectObject
+++ b/share/html/Elements/SelectObject
@@@ -1,124 -1,0 +1,141 @@@
 +%# BEGIN BPS TAGGED BLOCK {{{
 +%#
 +%# COPYRIGHT:
 +%#
 +%# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
 +%#                                          <sales at bestpractical.com>
 +%#
 +%# (Except where explicitly superseded by other copyright notices)
 +%#
 +%#
 +%# LICENSE:
 +%#
 +%# This work is made available to you under the terms of Version 2 of
 +%# the GNU General Public License. A copy of that license should have
 +%# been provided with this software, but in any event can be snarfed
 +%# from www.gnu.org.
 +%#
 +%# This work is distributed in the hope that it will be useful, but
 +%# WITHOUT ANY WARRANTY; without even the implied warranty of
 +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 +%# General Public License for more details.
 +%#
 +%# 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., 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:
 +%#
 +%# (The following paragraph is not intended to limit the rights granted
 +%# to you to modify and distribute this software under the terms of
 +%# the GNU General Public License and is only of importance to you if
 +%# you choose to contribute your changes and enhancements to the
 +%# community by submitting them to Best Practical Solutions, LLC.)
 +%#
 +%# By intentionally submitting any modifications, corrections or
 +%# derivatives to this work, or any other work intended for use with
 +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
 +%# you are the copyright holder for those contributions and you grant
 +%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
 +%# royalty-free, perpetual, license to use, copy, create derivative
 +%# works based on those contributions, and sublicense and distribute
 +%# those contributions and any derivatives thereof.
 +%#
 +%# END BPS TAGGED BLOCK }}}
 +% if ($Lite) {
 +%     my $d = $ObjectType->new($session{'CurrentUser'});
 +%     $d->Load($Default);
 +<input name="<%$Name%>" size="25" value="<%$d->Name%>" class="<%$Class%>" />
 +% }
 +% else {
 +<select name="<%$Name%>" <% ($Multiple) ? qq{multiple="multiple" size="$Size"} : '' |n%> <% ($OnChange) ? 'onchange="'.$OnChange.'"' : '' |n %> class="<%$Class%>">
 +%     if ($ShowNullOption) {
 +  <option value=""><% $DefaultLabel %></option>
 +%     }
 +%     for my $object (@{$session{$cache_key}{objects}}) {
 +  <option value="<% ($NamedValues ? $object->{Name} : $object->{Id}) %>"\
 +% if ($object->{Id} eq ($Default||'') || $object->{Name} eq ($Default||'')) {
 + selected="selected"\
 +% }
 +><%$object->{Name}%>\
 +%             if ($Verbose and $object->{Description}) {
 + (<%$object->{Description}%>)\
 +%             }
 +</option>
 +%     }
 +</select>
 +% }
 +<%args>
 +$ObjectType
 +$CheckRight => undef
 +$ShowNullOption => 1
 +$ShowAll => 1
 +$Name => undef
 +$Verbose => undef
 +$NamedValues => 0
 +$DefaultLabel => "-"
 +$Default => 0
 +$Lite => 0
 +$OnChange => undef
 +$Multiple => 0
 +$Size => 6
 +$Class => ""
 +$CacheNeedsUpdate => undef
 +</%args>
 +<%init>
 +$ObjectType = "RT::$ObjectType" unless $ObjectType =~ /::/;
 +$Class    ||= "select-" . CSSClass("\L$1") if $ObjectType =~ /RT::(.+)$/;
 +
 +my $cache_key = join "---", "SelectObject", $ObjectType,
 +    $session{'CurrentUser'}->Id, $CheckRight || "", $ShowAll;
 +
 +if ( defined $session{$cache_key} && ref $session{$cache_key} eq 'ARRAY') {
 +    delete $session{$cache_key};
 +}
 +if ( defined $session{$cache_key} && defined $CacheNeedsUpdate &&
 +     $session{$cache_key}{lastupdated} <= $CacheNeedsUpdate ) {
 +    delete $session{$cache_key};
 +}
 +
 +if ( not defined $session{$cache_key} and not $Lite ) {
 +    my $collection = "${ObjectType}s"->new($session{'CurrentUser'});
 +    $collection->UnLimit;
 +
 +    $m->callback( CallbackName => 'ModifyCollection', ARGSRef => \%ARGS,
 +                  Collection => $collection, ObjectType => $ObjectType );
 +
++    if ( $Default ) {
++        my $object = $ObjectType->new($session{'CurrentUser'});
++        $object->Load( $Default );
++        unless ( $ShowAll
++                 or not $CheckRight
++                 or $session{CurrentUser}->HasRight( Object => $object, Right => $CheckRight ) )
++        {
++            if ( $object->id ) {
++                push @{$session{$cache_key}{objects}}, {
++                    Id          => $object->id,
++                    Name        => '#' . $object->id,
++                    Description => '#' . $object->id,
++                };
++            }
++        }
++    }
++
 +    while (my $object = $collection->Next) {
 +        if ($ShowAll
 +            or not $CheckRight
 +            or $session{CurrentUser}->HasRight( Object => $object, Right => $CheckRight ))
 +        {
 +            push @{$session{$cache_key}{objects}}, {
 +                Id          => $object->Id,
 +                Name        => $object->Name,
 +                Description => $object->_Accessible("Description" => "read") ? $object->Description : undef,
 +            };
 +        }
 +    }
 +    $session{$cache_key}{lastupdated} = time();
 +}
 +</%init>
diff --cc share/html/NoAuth/css/ballard/InHeader
index c95bb61,6257cbc..fd53dfa
--- a/share/html/NoAuth/css/ballard/InHeader
+++ b/share/html/NoAuth/css/ballard/InHeader
@@@ -50,5 -50,5 +50,5 @@@
  
  <![endif]-->
  <!--[if lt IE 7]>
- <link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/static/css/web2/msie6.css" type="text/css" media="all" />
 -<link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/NoAuth/css/ballard/msie6.css" type="text/css" media="all" />
++<link rel="stylesheet" href="<%RT->Config->Get('WebPath')%>/static/css/ballard/msie6.css" type="text/css" media="all" />
  <![endif]-->
diff --cc share/html/Search/Chart.html
index d038a55,c0f67b3..a08d3c4
--- a/share/html/Search/Chart.html
+++ b/share/html/Search/Chart.html
@@@ -46,17 -46,31 +46,19 @@@
  %#
  %# END BPS TAGGED BLOCK }}}
  <%args>
 -$PrimaryGroupBy => 'Queue'
 + at GroupBy => 'Status'
  $ChartStyle => 'bars'
 + at ChartFunction => ('COUNT')
  $Description => undef
 +$Width => undef
 +$Height => undef
  </%args>
  <%init>
+ $m->callback( ARGSRef => \%ARGS, CallbackName => 'Initial' );
+ 
  $ARGS{Query} ||= 'id > 0';
  
 -# FIXME: should be factored with RT::Report::Tickets::Label :(
 -my $PrimaryGroupByLabel;
 -if ( $PrimaryGroupBy =~ /^(?:CF|CustomField)\.\{(.*)\}$/ ) {
 -    my $cf = $1;
 -    if ( $cf =~ /\D/ ) {
 -        $PrimaryGroupByLabel = loc( "custom field '[_1]'", $cf );
 -    } else {
 -        my $obj = RT::CustomField->new( $session{'CurrentUser'} );
 -        $obj->Load( $cf );
 -        $PrimaryGroupByLabel = loc( "custom field '[_1]'", $obj->Name );
 -    }
 -} else {
 -    $PrimaryGroupByLabel = loc( $PrimaryGroupBy );
 -}
 -
 -my $title = loc( "Search results grouped by [_1]", $PrimaryGroupByLabel );
 +my $title = loc( "Grouped search results");
  
  my $saved_search = $m->comp( '/Widgets/SavedSearch:new',
      SearchType   => 'Chart',
@@@ -103,12 -118,17 +106,17 @@@ $m->callback( ARGSRef => \%ARGS, QueryA
  <& /Elements/Header, Title => $title &>
  <& /Elements/Tabs, QueryArgs => \%query &>
  <& /Elements/ListActions, actions => \@actions &>
+ 
+ % $m->callback( ARGSRef => \%ARGS, CallbackName => 'BeforeChart' );
+ 
  <& /Search/Elements/Chart, %ARGS &>
  
+ % $m->callback( ARGSRef => \%ARGS, CallbackName => 'AfterChart' );
+ 
  <div class="chart-meta">
  <div class="chart-type">
 -<&| /Widgets/TitleBox, title => loc('Chart Properties')&>
 -<form method="get" action="<%RT->Config->Get('WebPath')%>/Search/Chart.html">
 +
 +<form method="get" action="<% RT->Config->Get('WebPath') %>/Search/Chart.html">
  <input type="hidden" class="hidden" name="Query" value="<% $ARGS{Query} %>" />
  <input type="hidden" class="hidden" name="SavedChartSearchId" value="<% $saved_search->{SearchId} || 'new' %>" />
  
diff --cc share/static/css/aileron/msie6.css
index c890a74,0000000..023181d
mode 100644,000000..100644
--- a/share/static/css/aileron/msie6.css
+++ b/share/static/css/aileron/msie6.css
@@@ -1,39 -1,0 +1,62 @@@
++ at import "../base/msie6.css";
++
 +div#body {
 +    top: 0em;
 +}
 +
 +.topaction .select-queue {
 +    margin-top: 0;
 +}
 +
 +.titlebox-title .widget {
 +    top: -1.25em;
 +    left: 0.5em;
 +
 +}
 +.titlebox .titlebox-title .right{
 +    position: absolute;
 +    top: 1.5em;
 +}
 +
 +.titlebox
 +{
 +    height: auto !important;
 +    height: 1.25em;
 +}
 +
 +
 +.transaction .messagebody img {
 +    /* ie6 does not support max-width */
 +    width: expression(this.width > 401 ? 400 : true);
 +}
 +
 +
 +
 +.sf-sub-indicator {
 +    background: url(../../../static/css/images/arrows-ffffff.gif) no-repeat -10px -100px;
 +}
 +
 +#page-navigation ul {
 +    width: auto;
 +}
++
++.ticket-transaction div.metadata span.actions {
++    right: 1.2em;
++}
++
++div.titlebox,
++#ticket-create-metadata,
++#ticket-update-metadata,
++#ticket-create-message,
++#ticket-update-message {
++    position: relative;
++}
++
++#Ticket-Create-details {
++    float: left;
++    position: relative;
++}
++
++div.submit .extra-buttons {
++    float: none;
++}
diff --cc share/static/css/aileron/ticket-lists.css
index bc24ec3,0000000..3e55cfc
mode 100644,000000..100644
--- a/share/static/css/aileron/ticket-lists.css
+++ b/share/static/css/aileron/ticket-lists.css
@@@ -1,189 -1,0 +1,191 @@@
 +table.queue-summary, table.collection-as-table {
 +  margin-top: 0.75em;
 +  font-size: 0.9em;
 +  border: 1px solid #aaa;
 +  border-bottom: 2px solid #999;
 +  border-right: 2px solid #999;
 +  border-spacing: 0;
 +  width: 100%;
 +
 +}
 +
 +table.queue-summary tr>*:first-child {
 + padding-left: 1em;
 +
 +}
 +
 +
 +table.queue-summary tr>*:last-child {
 + padding-right: 1em;
 +
 +}
 +
 +table.queue-summary a, table.collection-as-table a  {
 +  font-weight: bold;
 +}
 +
 +
 +table.collection-as-table th.collection-as-table {
 +  background: #ddd;
 + font-size: 0.9em;
 +  margin-bottom: 0.5em;
 +  text-align: left;
 +
 +}
 +
 +
 +table.queue-summary th.collection-as-table {
 + font-size: 0.9em;
 +  margin-bottom: 0.5em;
 +  text-align: right;
 +
 +}
 +
 +table.queue-summary th.collection-as-table:first-child {
 +  text-align: left;
 +
 +}
 +
 +
 +tr.collection-as-table+tr.collection-as-table th {
 + border-bottom: 2px solid grey;
 +
 +}
 +
 +
 +
 +
 +table.queue-summary td {
 +  background: #efefef;
 +  border-bottom: 1px solid #ccc;
 +}
 +
 +
 +
 +tr.evenline td {
 +  background: #eee;
 +}
 +
 +tr.oddline td {
 +  background: #fff;
 +
 +}
 +
 +tr.evenline td, tr.oddline td {
 + padding-top: 0.5em;
 +}
 +
 +
 +
 +tr.evenline+tr.evenline td, tr.oddline+tr.oddline td{
 + padding-top: 0;
 + border: none;
 +}
 +
 +
 +
 +table.collection-as-table td:first-child,
 +table.collection-as-table th:first-child {
 +  padding-left: 1em;
 +}
 +
 +table.collection-as-table td:last-child, table.collection-as-table th:last-child {
 +  padding-right: 1em;
 +}
 +
 +th.collection-as-table , td.collection-as-table {
 + padding-right: 0.5em;
 +}
 +
 +.pagenum.a:hover, .paging a.nav:hover{
 +text-decoration: underline;
 +}
 +
 +
 +.pagenum *, .paging a.nav{
 +padding: .5em;
 +}
 +
 +.currentpage{
 +text-decoration: none;
 +font-weight: bold;
 +background: #eee;
 +}
 +
 +div.paging{
 +text-align: center;
 +padding-bottom: 1em;
 +}
 +
 +
 +/* full-page ticket lists */
 +#body>table.collection-as-table {
 +    margin-bottom: 2em;
 +
 +}
 +
 +.chart.image {
 +    margin-top: -1em;
 +    padding-right: 2em;
 +    float: left;
 +    clear: both;
 +}
 +
 +.chart-wrapper {
 +    display: block;
 +    width: auto;
 +}
 +
 +.chart-wrapper .collection-as-table {
 +    width: auto;
 +    font-size: 1em;
++    /* Firefox needs this to let the table flow below the chart on narrow screens */
++    clear: right;
 +}
 +
 +.chart-wrapper .collection-as-table th.collection-as-table {
 +    text-align: center;
 +    padding: 0.5em;
 +    padding-right: 1em;
 +    padding-left:  1em;
 +}
 +
 +.chart-wrapper .collection-as-table tr.total td {
 +    border-top: 1px solid #ccc;
 +}
 +
 +.chart-wrapper .collection-as-table td.value {
 +    padding-left: 0.5em;
 +}
 +
 +.chart-wrapper .query {
 +    clear: both;
 +    text-align: center;
 +    font-size: 1.2em;
 +    padding: 1em;
 +}
 +
 +.chart-wrapper .collection-as-table .label {
 +    font-weight: bold;
 +}
 +
 +
 +.chart-wrapper .query .label {
 +    font-weight: bold;
 +}
 +
 +.chart-meta {
 +    padding-top: 2em;
 +    border-top: 1px solid #ccc;
 +}
 +
 +.chart-meta .chart-type {
 +    display: inline-block;
 +    float: left;
 +    padding-right: 2em;
 +    clear: both;
 +}
 +
 +.chart-meta .saved-search {
 +    display: inline-block;
 +}
diff --cc share/static/css/ballard/msie6.css
index 66ad415,0000000..b82e708
mode 100644,000000..100644
--- a/share/static/css/ballard/msie6.css
+++ b/share/static/css/ballard/msie6.css
@@@ -1,41 -1,0 +1,50 @@@
++ at import "../base/msie6.css";
++
 +.topaction .select-queue {
 +    margin-top: 0;
 +}
 +
 +div#page-navigation ul#page-menu {
 +    margin-top: -3.2em;
 +}
 +
 +.titlebox-title .widget {
 +    top: -1em;
 +    left: 0.5em;
 +
 +}
 +.titlebox .titlebox-title .right{
 +    position: absolute;
 +    top: 0.25em;
 +    right: 1em;
 +}
 +
 +/* nested things. like the ticket dates tab */
 +.titlebox .titlebox .titlebox-title .right{
 +    right: 1.3em;
 +}
 +
 +#login-box .titlebox .titlebox-title .right {
 +    margin-top: -0.1em;
 +    right: 0em;
 +}
 +
 +.titlebox
 +{
 +    height: auto !important;
 +    height: 1.25em;
 +}
 +
 +
 +.transaction .messagebody img {
 +    /* ie6 does not support max-width */
 +    width: expression(this.width > 401 ? 400 : true);
 +}
 +
++#page-navigation {
++    width: 100%;
++}
++
++.ticket-transaction div.metadata span.actions {
++    right: 1.1em;
++}
diff --cc share/static/css/ballard/nav.css
index 2a71ce7,0000000..09858cb
mode 100644,000000..100644
--- a/share/static/css/ballard/nav.css
+++ b/share/static/css/ballard/nav.css
@@@ -1,145 -1,0 +1,144 @@@
 +#main-navigation {
 +    background-color: #fff;
 +    -moz-border-radius-bottomright: 0.5em;
 +    -webkit-border-bottom-right-radius: 0.5em;
 +    border-bottom-right-radius: 0.5em;
 +    -moz-border-radius-topright: 0.5em;
 +    -webkit-border-top-right-radius: 0.5em;
 +    border-top-right-radius: 0.5em;
 +    width: 10em;
 +    font-size: 0.85em;
 +    position: absolute;
 +    top: 6.2em;
 +    left: 0em;
 +    z-index: 9997;
-     background-color: none;
 +    padding-top: 1em;
 +    padding-right: 0.5em;
 +    padding-left: 0.5em;
 +}
 +
 +#main-navigation ul  {
 +    list-style-type: none;
 +    padding: 0;
 +    margin: 0;
 +    padding-left: 8px; /* not em, since our font size reduces */
 +    border-left: 1px solid #ccc;
 +    margin-top: 0.2em;
 +    padding-top: 0.2em;
 +
 +    margin-bottom: 0.2em;
 +    padding-bottom: 0.2em;
 +}
 +
 +#main-navigation {
 +    text-color: #000;
 +}
 +
 +#main-navigation li ul {
 +    font-size: 0.9em;
 +}
 +
 +#main-navigation li ul ul {
 +    font-size: 1em;
 +}
 +
 +#main-navigation li:first-child {
 +}
 +
 +#main-navigation li:last-child {
 +    border-bottom: none;
 +}
 +
 +
 +#main-navigation a,
 +#main-navigation a:visited {
 +    padding-top: 0.5em;
 +    padding-bottom: 0.5em;
 +    color: #000;
 +    border: none;
 +}
 +
 +#main-navigation li {
 +}
 +
 +
 +#main-navigation ul a,
 +#main-navigation ul a:visited {
 +    color: #000;
 +}
 +
 +
 +#main-navigation li li, #main-navigation li li li {
 +    border-left: none;
 +    background-color: #fff;
 +    text-color: #547CCC;
 +}
 +
 +#page-navigation {
 +    position: absolute;
 +    top: 6em;
 +    right: 0em;
 +    z-index: 9995;
 +    font-size: 0.9em;
 +    background-color: #eee;
 +    border: 1px solid #ccc;
 +    -moz-border-radius-bottomleft: 0.5em;
 +    -webkit-border-bottom-left-radius: 0.5em;
 +    border-bottom-left-radius: 0.5em;
 +    padding: 0;
 +    padding-top: 0.5em;
 +    padding-right: 0.5em;
 +    width: 60%;
 +    text-align: right;
 +}
 +
 +#page-navigation ul {
 +    list-style-type: none;
 +    padding: 0;
 +    padding-left: 0.3em;
 +    display: inline;
 +}
 +
 +#page-navigation li {
 +    display: inline;
 +    padding: 0.3em;
 +}
 +#page-navigation li.has-children>a {
 +    display: none;
 +}
 +
 +#page-navigation {
 +    margin: 0;
 +}
 +
 +#topactions {
 + position: absolute;
 + background: transparent;
 + top: 3.2em;
 + right: 0.7em;
 + width: auto;
 + min-width: 42em;
 + font-size: 0.9em;
 + z-index: 99;
 +}
 +
 +#topactions form * {
 +    vertical-align: top;
 +}
 +
 +#topactions button, #topactions select, #topactions input{
 + padding-top: 0em;
 + padding-bottom: 0em;
 + width: 8em;
 +
 +}
 +
 +#topactions #simple-search .field{
 + margin-left: 1em;
 + color: #787;
 + }
 +
 +#topactions #simple-search .field:focus {
 + color: #000;
 + }
 +
diff --cc share/static/css/ballard/ticket-lists.css
index 322bf61,0000000..4bb616c
mode 100644,000000..100644
--- a/share/static/css/ballard/ticket-lists.css
+++ b/share/static/css/ballard/ticket-lists.css
@@@ -1,189 -1,0 +1,190 @@@
 +table.queue-summary, table.collection-as-table {
 +  margin-top: 0.75em;
 +  font-size: 0.9em;
 +  border: 1px solid #aaa;
 +  border-bottom: 2px solid #999;
 +  border-right: 2px solid #999;
 +  border-spacing: 0;
 +  width: 100%;
 +
 +}
 +
 +table.queue-summary tr>*:first-child {
 + padding-left: 1em;
 +
 +}
 +
 +
 +table.queue-summary tr>*:last-child {
 + padding-right: 1em;
 +
 +}
 +
 +table.queue-summary a, table.collection-as-table a  {
 +  font-weight: bold;
 +}
 +
 +
 +table.collection-as-table th.collection-as-table {
 +  background: #ddd;
 + font-size: 0.9em;
 +  margin-bottom: 0.5em;
 +  text-align: left;
 +
 +}
 +
 +
 +table.queue-summary th.collection-as-table {
 + font-size: 0.9em;
 +  margin-bottom: 0.5em;
 +  text-align: right;
 +
 +}
 +
 +table.queue-summary th.collection-as-table:first-child {
 +  text-align: left;
 +
 +}
 +
 +
 +tr.collection-as-table+tr.collection-as-table th {
 + border-bottom: 2px solid grey;
 +
 +}
 +
 +
 +
 +
 +table.queue-summary td {
 +  background: #efefef;
 +  border-bottom: 1px solid #ccc;
 +}
 +
 +
 +
 +tr.evenline td {
 +  background: #eee;
 +}
 +
 +tr.oddline td {
 +  background: #fff;
 +
 +}
 +
 +tr.evenline td, tr.oddline td {
 + padding-top: 0.5em;
 +} 
 +
 +
 +
 +tr.evenline+tr.evenline td, tr.oddline+tr.oddline td{
 + padding-top: 0;
 + border: none;
 +}
 +
 +
 +
 +table.collection-as-table td:first-child,
 +table.collection-as-table th:first-child {
 +  padding-left: 1em;
 +}
 +
 +table.collection-as-table td:last-child, table.collection-as-table th:last-child {
 +  padding-right: 1em;
 +}
 +
 +th.collection-as-table , td.collection-as-table {
 + padding-right: 0.5em;
 +}
 +
 +.pagenum.a:hover, .paging a.nav:hover{
 +text-decoration: underline;
 +}
 +
 +
 +.pagenum *, .paging a.nav{
 +padding: .5em;
 +}
 +
 +.currentpage{
 +text-decoration: none;
 +font-weight: bold;
 +background: #eee;
 +}
 +
 +div.paging{
 +text-align: center;
 +padding-bottom: 1em;
 +}
 +
 + 
 +/* full-page ticket lists */
 +#body>table.collection-as-table {
 +    margin-bottom: 2em;
 +
 +}
 +
 +.chart.image {
-     margin-top: -1em;
 +    padding-right: 2em;
 +    float: left;
 +    clear: both;
 +}
 +
 +.chart-wrapper {
 +    display: block;
 +    width: auto;
 +}
 +
 +.chart-wrapper .collection-as-table {
 +    width: auto;
 +    font-size: 1em;
++    /* Firefox needs this to let the table flow below the chart on narrow screens */
++    clear: right;
 +}
 +
 +.chart-wrapper .collection-as-table th.collection-as-table {
 +    text-align: center;
 +    padding: 0.5em;
 +    padding-right: 1em;
 +    padding-left:  1em;
 +}
 +
 +.chart-wrapper .collection-as-table tr.total td {
 +    border-top: 1px solid #ccc;
 +}
 +
 +.chart-wrapper .collection-as-table td.value {
 +    padding-left: 0.5em;
 +}
 +
 +.chart-wrapper .query {
 +    clear: both;
 +    text-align: center;
 +    font-size: 1.2em;
 +    padding: 1em;
 +}
 +
 +.chart-wrapper .collection-as-table .label {
 +    font-weight: bold;
 +}
 +
 +
 +.chart-wrapper .query .label {
 +    font-weight: bold;
 +}
 +
 +.chart-meta {
 +    padding-top: 2em;
 +    border-top: 1px solid #ccc;
 +}
 +
 +.chart-meta .chart-type {
 +    display: inline-block;
 +    float: left;
 +    padding-right: 2em;
 +    clear: both;
 +}
 +
 +.chart-meta .saved-search {
 +    display: inline-block;
 +}
diff --cc share/static/css/base/misc.css
index f0fd488,0000000..a76bf00
mode 100644,000000..100644
--- a/share/static/css/base/misc.css
+++ b/share/static/css/base/misc.css
@@@ -1,76 -1,0 +1,81 @@@
 +.hide, .hidden { display: none !important; }
 +
 +.clear { clear: both; }
 +
 +* html .clearfix {
 +    height: 1%; /* IE5-6 */
 +}
 +.clearfix {
 +    display: inline-block; /* IE7xhtml*/
 +}
 +html[xmlns] .clearfix { /* O */
 +    display: block;
 +}
 +.clearfix:after { /* FF, O, etc. */
 +    content: ".";
 +    display: block;
 +    height: 0;
 +    clear: both;
 +    visibility: hidden;
 +}
 +
 +hr.clear {
 +    visibility: hidden;
 +    height: 0;
 +    margin: 0;
 +    padding: 0;
 +    border: none;
 +    font-size: 1px;
 +}
 +
 +/* Custom fields */
 +
 +/* Only apply these when we're not rendering in a table, hence the leading div. */
 +div.edit-custom-field {
 +    width: 48%;
 +    float: left;
 +    margin: 0.5em;
 +}
 +
 +div.edit-custom-field .cflabel {
 +    float: left;
 +    padding-right: 0.5em;
 +}
 +
 +div.edit-custom-field .entry {
 +    margin-left: 10em;
 +}
 +
 +.cflabel .name { font-weight: bold; }
 +.cflabel .type { font-style: italic; }
 +
 +fieldset.cfedit {
 +    border: none;
 +    padding: 0;
 +    margin: 0;
 +}
 +
 +table.bulk-edit-custom-fields {
 +    border-spacing: 0;
 +}
 +table.bulk-edit-custom-fields tr td {
 +    padding-bottom: 0.5em;
 +}
 +
 +.query-stacktrace-toggle {
 +    float: right;
 +}
 +
 +/* jQuery UI overrides */
 +.ui-widget {
 +    font-family: arial,helvetica,sans-serif !important;
 +}
 +
++textarea.messagebox, #cke_Content, #cke_UpdateContent {
++  -moz-box-sizing: border-box;
++  box-sizing: border-box;
++}
++
 +.datepicker {
 +    width: 17em;
 +}
diff --cc share/static/css/base/msie6.css
index 0000000,0000000..4b208b8
new file mode 100644
--- /dev/null
+++ b/share/static/css/base/msie6.css
@@@ -1,0 -1,0 +1,19 @@@
++table.ticket-summary {
++    table-layout: fixed;
++}
++
++.ticket-transaction div.metadata {
++    height: 1px;
++}
++
++div.downloadattachment {
++    position: relative;
++}
++
++div.messagebody {
++    height: 3em;
++}
++
++span.message-stanza-folder {
++    display: inline !important;
++}
diff --cc share/static/css/web2/msie6.css
index 1d8dc62,0000000..18209b1
mode 100644,000000..100644
--- a/share/static/css/web2/msie6.css
+++ b/share/static/css/web2/msie6.css
@@@ -1,49 -1,0 +1,54 @@@
++ at import "../base/msie6.css";
++
 +.topaction .select-queue {
 +    margin-top: 0;
 +}
 +
 +div#page-navigation {
 +    width: 100%;
 +}
 +
 +.titlebox-title .widget {
 +    top: -1em;
 +    left: 0.5em;
 +
 +}
 +.titlebox .titlebox-title .right{
 +    position: absolute;
 +    top: 0.25em;
 +    right: 1em;
 +}
 +
 +/* nested things. like the ticket dates tab */
 +.titlebox .titlebox .titlebox-title .right{
 +    right: 1.3em;
 +}
 +
 +#login-box .titlebox .titlebox-title .right {
 +    margin-top: -0.1em;
 +    right: 0em;
 +}
 +
 +.titlebox
 +{
 +    height: auto !important;
 +    height: 1.25em;
 +}
 +
 +
 +.transaction .messagebody img {
 +    /* ie6 does not support max-width */
 +    width: expression(this.width > 401 ? 400 : true);
 +}
 +
 +#prefs-menu .sf-sub-indicator {
 +    background-image: url(../../../static/css/images/arrows-grey.gif);
 +}
 +
 +#app-nav .sf-sub-indicator {
 +    background-image: url(../../../static/css/images/arrows-grey.gif);
 +}
 +
++.ticket-transaction div.metadata span.actions {
++    right: 1.1em;
++}
diff --cc share/static/css/web2/ticket-lists.css
index 322bf61,0000000..4bb616c
mode 100644,000000..100644
--- a/share/static/css/web2/ticket-lists.css
+++ b/share/static/css/web2/ticket-lists.css
@@@ -1,189 -1,0 +1,190 @@@
 +table.queue-summary, table.collection-as-table {
 +  margin-top: 0.75em;
 +  font-size: 0.9em;
 +  border: 1px solid #aaa;
 +  border-bottom: 2px solid #999;
 +  border-right: 2px solid #999;
 +  border-spacing: 0;
 +  width: 100%;
 +
 +}
 +
 +table.queue-summary tr>*:first-child {
 + padding-left: 1em;
 +
 +}
 +
 +
 +table.queue-summary tr>*:last-child {
 + padding-right: 1em;
 +
 +}
 +
 +table.queue-summary a, table.collection-as-table a  {
 +  font-weight: bold;
 +}
 +
 +
 +table.collection-as-table th.collection-as-table {
 +  background: #ddd;
 + font-size: 0.9em;
 +  margin-bottom: 0.5em;
 +  text-align: left;
 +
 +}
 +
 +
 +table.queue-summary th.collection-as-table {
 + font-size: 0.9em;
 +  margin-bottom: 0.5em;
 +  text-align: right;
 +
 +}
 +
 +table.queue-summary th.collection-as-table:first-child {
 +  text-align: left;
 +
 +}
 +
 +
 +tr.collection-as-table+tr.collection-as-table th {
 + border-bottom: 2px solid grey;
 +
 +}
 +
 +
 +
 +
 +table.queue-summary td {
 +  background: #efefef;
 +  border-bottom: 1px solid #ccc;
 +}
 +
 +
 +
 +tr.evenline td {
 +  background: #eee;
 +}
 +
 +tr.oddline td {
 +  background: #fff;
 +
 +}
 +
 +tr.evenline td, tr.oddline td {
 + padding-top: 0.5em;
 +} 
 +
 +
 +
 +tr.evenline+tr.evenline td, tr.oddline+tr.oddline td{
 + padding-top: 0;
 + border: none;
 +}
 +
 +
 +
 +table.collection-as-table td:first-child,
 +table.collection-as-table th:first-child {
 +  padding-left: 1em;
 +}
 +
 +table.collection-as-table td:last-child, table.collection-as-table th:last-child {
 +  padding-right: 1em;
 +}
 +
 +th.collection-as-table , td.collection-as-table {
 + padding-right: 0.5em;
 +}
 +
 +.pagenum.a:hover, .paging a.nav:hover{
 +text-decoration: underline;
 +}
 +
 +
 +.pagenum *, .paging a.nav{
 +padding: .5em;
 +}
 +
 +.currentpage{
 +text-decoration: none;
 +font-weight: bold;
 +background: #eee;
 +}
 +
 +div.paging{
 +text-align: center;
 +padding-bottom: 1em;
 +}
 +
 + 
 +/* full-page ticket lists */
 +#body>table.collection-as-table {
 +    margin-bottom: 2em;
 +
 +}
 +
 +.chart.image {
-     margin-top: -1em;
 +    padding-right: 2em;
 +    float: left;
 +    clear: both;
 +}
 +
 +.chart-wrapper {
 +    display: block;
 +    width: auto;
 +}
 +
 +.chart-wrapper .collection-as-table {
 +    width: auto;
 +    font-size: 1em;
++    /* Firefox needs this to let the table flow below the chart on narrow screens */
++    clear: right;
 +}
 +
 +.chart-wrapper .collection-as-table th.collection-as-table {
 +    text-align: center;
 +    padding: 0.5em;
 +    padding-right: 1em;
 +    padding-left:  1em;
 +}
 +
 +.chart-wrapper .collection-as-table tr.total td {
 +    border-top: 1px solid #ccc;
 +}
 +
 +.chart-wrapper .collection-as-table td.value {
 +    padding-left: 0.5em;
 +}
 +
 +.chart-wrapper .query {
 +    clear: both;
 +    text-align: center;
 +    font-size: 1.2em;
 +    padding: 1em;
 +}
 +
 +.chart-wrapper .collection-as-table .label {
 +    font-weight: bold;
 +}
 +
 +
 +.chart-wrapper .query .label {
 +    font-weight: bold;
 +}
 +
 +.chart-meta {
 +    padding-top: 2em;
 +    border-top: 1px solid #ccc;
 +}
 +
 +.chart-meta .chart-type {
 +    display: inline-block;
 +    float: left;
 +    padding-right: 2em;
 +    clear: both;
 +}
 +
 +.chart-meta .saved-search {
 +    display: inline-block;
 +}

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


More information about the rt-commit mailing list