]> git.uio.no Git - usit-rt.git/blobdiff - share/html/Elements/Tabs
Upgrade to 4.2.8
[usit-rt.git] / share / html / Elements / Tabs
index 48fef909afcd05c0acd0435081e33440139a5183..881baceb8e0480838b3e9e3890559e7409ba1d8f 100644 (file)
@@ -2,7 +2,7 @@
 %#
 %# COPYRIGHT:
 %#
-%# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+%# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 %#                                          <sales@bestpractical.com>
 %#
 %# (Except where explicitly superseded by other copyright notices)
@@ -61,7 +61,7 @@ my $query_string = sub {
 
 my $build_admin_menu = sub {
     my $top = shift;
-    my $admin = $top->child( config => title => loc('Configuration'), path => '/Admin/', sort_order => 99 );
+    my $admin = $top->child( admin => title => loc('Admin'), path => '/Admin/' );
     if ( $session{'CurrentUser'}->HasRight( Object => RT->System, Right => 'AdminUsers' ) ) {
         my $users = $admin->child( users =>
             title       => loc('Users'),
@@ -97,6 +97,16 @@ my $build_admin_menu = sub {
         $cfs->child( create => title => loc('Create'), path => "/Admin/CustomFields/Modify.html?Create=1" );
     }
 
+    if ( $session{'CurrentUser'}->HasRight( Object => RT->System, Right => 'ModifyScrips' ) ) {
+        my $scrips = $admin->child( 'scrips' =>
+            title       => loc('Scrips'),
+            description => loc('Manage scrips'),
+            path        => '/Admin/Scrips/',
+        );
+        $scrips->child( select => title => loc('Select'), path => "/Admin/Scrips/" );
+        $scrips->child( create => title => loc('Create'), path => "/Admin/Scrips/Create.html" );
+    }
+
     my $admin_global = $admin->child( global =>
         title       => loc('Global'),
         description => loc('Manage properties and configuration which apply to all queues'),
@@ -109,7 +119,7 @@ my $build_admin_menu = sub {
         path        => '/Admin/Global/Scrips.html',
     );
     $scrips->child( select => title => loc('Select'), path => "/Admin/Global/Scrips.html" );
-    $scrips->child( create => title => loc('Create'), path => "/Admin/Global/Scrip.html?Create=1" );
+    $scrips->child( create => title => loc('Create'), path => "/Admin/Scrips/Create.html?Global=1" );
 
     my $templates = $admin_global->child( templates =>
         title       => loc('Templates'),
@@ -171,11 +181,11 @@ my $build_admin_menu = sub {
 
     my $cfs = $article_admin->child( 'custom-fields' =>
         title => loc('Custom Fields'),
-        path  => '/Admin/CustomFields/index.html?'.$m->comp('/Elements/QueryString', type => 'RT::Class-RT::Article'),
+        path  => '/Admin/CustomFields/index.html?'.$m->comp('/Elements/QueryString', Type => 'RT::Class-RT::Article'),
     );
     $cfs->child( select =>
         title => loc('Select'),
-        path => '/Admin/CustomFields/index.html?'.$m->comp('/Elements/QueryString', type => 'RT::Class-RT::Article'),
+        path => '/Admin/CustomFields/index.html?'.$m->comp('/Elements/QueryString', Type => 'RT::Class-RT::Article'),
     );
     $cfs->child( create =>
         title => loc('Create'),
@@ -197,6 +207,11 @@ my $build_admin_menu = sub {
         description => loc('Modify the default "RT at a glance" view'),
         path        => '/Admin/Global/MyRT.html',
     );
+    $admin_global->child( 'dashboards-in-menu' =>
+        title       => loc('Dashboards in menu'),
+        description => loc('Customize dashboards in menu'),
+        path        => '/Admin/Global/DashboardsInMenu.html',
+    );
     $admin_global->child( 'topics' =>
         title       => loc('Topics'),
         description => loc('Modify global article topics'),
@@ -280,12 +295,13 @@ my $build_admin_menu = sub {
 
                 my $scrips = $queue->child( scrips => title => loc('Scrips'), path => "/Admin/Queues/Scrips.html?id=" . $id);
                 $scrips->child( select => title => loc('Select'), path => "/Admin/Queues/Scrips.html?id=" . $id );
-                $scrips->child( create => title => loc('Create'), path => "/Admin/Queues/Scrip.html?Create=1;Queue=" . $id);
+                $scrips->child( create => title => loc('Create'), path => "/Admin/Scrips/Create.html?Queue=" . $id);
 
-                my $ticket_cfs = $queue->child( 'ticket-custom-fields' => title => loc('Ticket Custom Fields'),
+                my $cfs = $queue->child( 'custom-fields' => title => loc('Custom Fields') );
+                my $ticket_cfs = $cfs->child( 'tickets' => title => loc('Tickets'),
                     path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id=' . $id );
 
-                my $txn_cfs = $queue->child( 'transaction-custom-fields' => title => loc('Transaction Custom Fields'),
+                my $txn_cfs = $cfs->child( 'transactions' => title => loc('Transactions'),
                     path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='.$id );
 
                 $queue->child( 'group-rights' => title => loc('Group Rights'), path => "/Admin/Queues/GroupRights.html?id=".$id );
@@ -296,7 +312,7 @@ my $build_admin_menu = sub {
             }
         }
     }
-    if ( $request_path =~ m{^/Admin/Users} ) {
+    if ( $request_path =~ m{^(/Admin/Users|/User/(Summary|History)\.html)} and $admin->child("users") ) {
         if ( $DECODED_ARGS->{'id'} && $DECODED_ARGS->{'id'} =~ /^\d+$/ ) {
             my $id = $DECODED_ARGS->{'id'};
             my $obj = RT::User->new( $session{'CurrentUser'} );
@@ -308,9 +324,14 @@ my $build_admin_menu = sub {
                 $tabs->child( memberships => title => loc('Memberships'),    path => "/Admin/Users/Memberships.html?id=" . $id );
                 $tabs->child( history     => title => loc('History'),        path => "/Admin/Users/History.html?id=" . $id );
                 $tabs->child( 'my-rt'     => title => loc('RT at a glance'), path => "/Admin/Users/MyRT.html?id=" . $id );
-                if ( RT->Config->Get('GnuPG')->{'Enable'} ) {
-                    $tabs->child( pgp     => title => loc('GnuPG'),          path => "/Admin/Users/GnuPG.html?id=" . $id );
+                $tabs->child( 'dashboards-in-menu' =>
+                    title => loc('Dashboards in menu'),
+                    path  => '/Admin/Users/DashboardsInMenu.html?id=' . $id,
+                );
+                if ( RT->Config->Get('Crypt')->{'Enable'} ) {
+                    $tabs->child( keys    => title => loc('Private keys'),   path => "/Admin/Users/Keys.html?id=" . $id );
                 }
+                $tabs->child( 'summary'   => title => loc('User Summary'),   path => "/User/Summary.html?id=" . $id );
             }
         }
 
@@ -322,10 +343,11 @@ my $build_admin_menu = sub {
             my $obj = RT::Group->new( $session{'CurrentUser'} );
             $obj->Load($id);
 
-            if ( $obj and $obj->id ) {            
+            if ( $obj and $obj->id ) {
                 my $tabs = PageMenu();
                 $tabs->child( basics         => title => loc('Basics'),       path => "/Admin/Groups/Modify.html?id=" . $obj->id );
                 $tabs->child( members        => title => loc('Members'),      path => "/Admin/Groups/Members.html?id=" . $obj->id );
+                $tabs->child( memberships    => title => loc('Memberships'),  path => "/Admin/Groups/Memberships.html?id=" . $obj->id );
                 $tabs->child( 'group-rights' => title => loc('Group Rights'), path => "/Admin/Groups/GroupRights.html?id=" . $obj->id );
                 $tabs->child( 'user-rights'  => title => loc('User Rights'),  path => "/Admin/Groups/UserRights.html?id=" . $obj->id );
                 $tabs->child( history        => title => loc('History'),      path => "/Admin/Groups/History.html?id=" . $obj->id );
@@ -341,23 +363,78 @@ my $build_admin_menu = sub {
 
             if ( $obj and $obj->id ) {
                 my $tabs = PageMenu();
-                $tabs->child( basics         => title => loc('Basics'),       path => "/Admin/CustomFields/Modify.html?id=".$id );
-                $tabs->child( 'group-rights' => title => loc('Group Rights'), path => "/Admin/CustomFields/GroupRights.html?id=" . $id );
-                $tabs->child( 'user-rights'  => title => loc('User Rights'),  path => "/Admin/CustomFields/UserRights.html?id=" . $id );
-                $tabs->child( 'applies-to'   => title => loc('Applies to'),   path => "/Admin/CustomFields/Objects.html?id=" . $id );
+                $tabs->child( basics           => title => loc('Basics'),       path => "/Admin/CustomFields/Modify.html?id=".$id );
+                $tabs->child( 'group-rights'   => title => loc('Group Rights'), path => "/Admin/CustomFields/GroupRights.html?id=" . $id );
+                $tabs->child( 'user-rights'    => title => loc('User Rights'),  path => "/Admin/CustomFields/UserRights.html?id=" . $id );
+                unless ( $obj->IsOnlyGlobal ) {
+                    $tabs->child( 'applies-to' => title => loc('Applies to'),   path => "/Admin/CustomFields/Objects.html?id=" . $id );
+                }
             }
         }
     }
 
-    if ( $request_path =~ m{^/Admin/Global/(Scrip|Template)s?\.html} ) {
-        my $type = $1;
-        my $tabs = PageMenu();
+    if ( $request_path =~ m{^/Admin/Scrips/} ) {
+        if ( $m->request_args->{'id'} && $m->request_args->{'id'} =~ /^\d+$/ ) {
+            my $id = $m->request_args->{'id'};
+            my $obj = RT::Scrip->new( $session{'CurrentUser'} );
+            $obj->Load($id);
+
+            my $tabs = PageMenu();
+
+            my ( $admin_cat, $create_path_arg, $from_query_param );
+            my $from_arg = $DECODED_ARGS->{'From'} || q{};
+            my ($from_queue) = $from_arg =~ /^(\d+)$/;
+            if ( $from_queue ) {
+                $admin_cat = "Queues/Scrips.html?id=$from_queue";
+                $create_path_arg = "?Queue=$from_queue";
+                $from_query_param = "&From=$from_queue";
+            }
+            elsif ( $from_arg eq 'Global' ) {
+                $admin_cat = 'Global/Scrips.html';
+                $create_path_arg = '?Global=1';
+                $from_query_param = '&From=Global';
+            }
+            else {
+                $admin_cat = 'Scrips';
+                $from_query_param = $create_path_arg = q{};
+            }
+            my $scrips = $tabs->child( scrips => title => loc('Scrips'), path => "/Admin/${admin_cat}" );
+            $scrips->child( select => title => loc('Select'), path => "/Admin/${admin_cat}" );
+            $scrips->child( create => title => loc('Create'), path => "/Admin/Scrips/Create.html${create_path_arg}" );
 
-        # With only two elements, swapping between dropdown and menu is kinda dumb
-        # In the glorious future this should be cleaner.
+            $tabs->child( basics => title => loc('Basics') => path => "/Admin/Scrips/Modify.html?id=" . $id . $from_query_param );
+            $tabs->child( 'applies-to' => title => loc('Applies to'), path => "/Admin/Scrips/Objects.html?id=" . $id . $from_query_param );
+        }
+        elsif ( $request_path =~ m{^/Admin/Scrips/(index\.html)?$} ) {
+            PageMenu->child( select => title => loc('Select') => path => "/Admin/Scrips/" );
+            PageMenu->child( create => title => loc('Create') => path => "/Admin/Scrips/Create.html" );
+        }
+        elsif ( $request_path =~ m{^/Admin/Scrips/Create\.html$} ) {
+            my ($queue) = $DECODED_ARGS->{'Queue'} && $DECODED_ARGS->{'Queue'} =~ /^(\d+)$/;
+            my $global_arg = $DECODED_ARGS->{'Global'};
+            if ($queue) {
+                PageMenu->child( select => title => loc('Select') => path => "/Admin/Queues/Scrips.html?id=$queue" );
+                PageMenu->child( create => title => loc('Create') => path => "/Admin/Scrips/Create.html?Queue=$queue" );
+            } elsif ($global_arg) {
+                PageMenu->child( select => title => loc('Select') => path => "/Admin/Global/Scrips.html" );
+                PageMenu->child( create => title => loc('Create') => path => "/Admin/Scrips/Create.html?Global=1" );
+            } else {
+                PageMenu->child( select => title => loc('Select') => path => "/Admin/Scrips" );
+                PageMenu->child( create => title => loc('Create') => path => "/Admin/Scrips/Create.html" );
+            }
+        }
+    }
+
+    if ( $request_path =~ m{^/Admin/Global/Scrips\.html} ) {
+        my $tabs = PageMenu();
+        $tabs->child( select => title => loc('Select'), path => "/Admin/Global/Scrips.html" );
+        $tabs->child( create => title => loc('Create'), path => "/Admin/Scrips/Create.html?Global=1" );
+    }
 
-        $tabs->child( select => title => loc('Select'), path => "/Admin/Global/${type}s.html" );
-        $tabs->child( create => title => loc('Create'), path => "/Admin/Global/${type}.html?Create=1" );
+    if ( $request_path =~ m{^/Admin/Global/Templates?\.html} ) {
+        my $tabs = PageMenu();
+        $tabs->child( select => title => loc('Select'), path => "/Admin/Global/Templates.html" );
+        $tabs->child( create => title => loc('Create'), path => "/Admin/Global/Template.html?Create=1" );
     }
 
     if ( $request_path =~ m{^/Admin/Articles/Classes/} ) {
@@ -385,24 +462,40 @@ my $build_admin_menu = sub {
     }
 };
 
-
 my $build_main_nav = sub {
 
     PageWidgets()->child( simple_search => raw_html => $m->scomp('SimpleSearch') );
     PageWidgets()->child( create_ticket => raw_html => $m->scomp('CreateTicket') );
 
     my $home = Menu->child( home => title => loc('Homepage'), path => '/' );
-    # We explicitly exclude superusers; otherwise the dashboards for
-    # groups you're not in (but can see the dashboards of by dint of
-    # being a superuser) would push the useful ones from the groups
-    # you're actually in off of the stack.
-    my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards", IncludeSuperuserGroups => 0);
-    my $limit      = 7;
+    unless ($session{'dashboards_in_menu'}) {
+        my $dashboards_in_menu = $session{CurrentUser}->UserObj->Preferences(
+            'DashboardsInMenu',
+            {},
+        );
+
+        unless ($dashboards_in_menu->{dashboards}) {
+            my ($default_dashboards) =
+                RT::System->new( $session{'CurrentUser'} )
+                    ->Attributes
+                    ->Named('DashboardsInMenu');
+            if ($default_dashboards) {
+                $dashboards_in_menu = $default_dashboards->Content;
+            }
+        }
 
-    my $more = 0;
-    if ( @dashboards > $limit ) {
-        $more = 1;
-        splice @dashboards, $limit;
+        $session{'dashboards_in_menu'} = $dashboards_in_menu->{dashboards} || [];
+    }
+
+    my @dashboards;
+    for my $id ( @{$session{'dashboards_in_menu'}} ) {
+        my $dash = RT::Dashboard->new( $session{CurrentUser} );
+        my ( $status, $msg ) = $dash->LoadById($id);
+        if ( $status ) {
+            push @dashboards, $dash;
+        } else {
+            $RT::Logger->warning( "Failed to load dashboard $id: $msg" );
+        }
     }
 
     my $dashes = Menu()->child('home');
@@ -413,24 +506,34 @@ my $build_main_nav = sub {
                 path  => '/Dashboards/' . $dash->id . '/' . $dash->Name
             );
         }
-
-        $dashes->child( more => title => loc('All Dashboards'), path => 'Dashboards/index.html' );
     }
+    $dashes->child( edit => title => loc('Update This Menu'), path => 'Prefs/DashboardsInMenu.html' );
+    $dashes->child( more => title => loc('All Dashboards'),   path => 'Dashboards/index.html' );
     my $dashboard = RT::Dashboard->new( $session{CurrentUser} );
     if ( $dashboard->CurrentUserCanCreateAny ) {
         $dashes->child('dashboard_create' => title => loc('New Dashboard'), path => "/Dashboards/Modify.html?Create=1" );
     }
 
-    my $tickets = Menu->child( search => title => loc('Tickets'), path => '/Search/Build.html' );
+    my $search = Menu->child( search => title => loc('Search'), path => '/Search/Simple.html' );
+
+    my $tickets = $search->child( tickets => title => loc('Tickets'), path => '/Search/Build.html' );
     $tickets->child( simple => title => loc('Simple Search'), path => "/Search/Simple.html" );
     $tickets->child( new    => title => loc('New Search'),    path => "/Search/Build.html?NewQuery=1" );
 
+    $search->child( articles => title => loc('Articles'),   path => "/Articles/Article/Search.html" )
+        if $session{CurrentUser}->HasRight( Right => 'ShowArticlesMenu', Object => RT->System );
+
+    $search->child( users => title => loc('Users'),   path => "/User/Search.html" );
+
+    if ($session{CurrentUser}->HasRight( Right => 'ShowArticlesMenu', Object => RT->System )) {
+        my $articles = Menu->child( articles => title => loc('Articles'), path => "/Articles/index.html");
+        $articles->child( articles => title => loc('Overview'), path => "/Articles/index.html" );
+        $articles->child( topics   => title => loc('Topics'),   path => "/Articles/Topics.html" );
+        $articles->child( create   => title => loc('Create'),   path => "/Articles/Article/PreCreate.html" );
+        $articles->child( search   => title => loc('Search'),   path => "/Articles/Article/Search.html" );
+    }
 
     my $tools = Menu->child( tools => title => loc('Tools'), path => '/Tools/index.html' );
-    my $articles = $tools->child( articles => title => loc('Articles'), path => "/Articles/index.html");
-    $articles->child( articles => title => loc('Overview'), path => "/Articles/index.html" );
-    $articles->child( search   => title => loc('Search'),   path => "/Articles/Article/Search.html" );
-    $articles->child( topics   => title => loc('Topics'),   path => "/Articles/Topics.html" );
 
     $tools->child( my_day =>
         title       => loc('My Day'),
@@ -446,12 +549,6 @@ my $build_main_nav = sub {
         );
     }
 
-    $tools->child( offline =>
-        title       => loc('Offline'),
-        description => loc('Create tickets offline'),
-        path        => '/Tools/Offline.html',
-    );
-
     if ( $session{'CurrentUser'}->HasRight( Right => 'ShowApprovalsTab', Object => RT->System ) ) {
         $tools->child( approval =>
             title       => loc('Approval'),
@@ -462,7 +559,7 @@ my $build_main_nav = sub {
 
     if ( $session{'CurrentUser'}->HasRight( Right => 'ShowConfigTab', Object => RT->System ) )
     {
-        $build_admin_menu->($tools);
+        $build_admin_menu->(Menu());
     }
 
     my $username = '<span class="current-user">'
@@ -471,6 +568,7 @@ my $build_main_nav = sub {
     my $about_me = Menu->child( 'preferences' =>
         title        => loc('Logged in as [_1]', $username),
         escape_title => 0,
+        path         => '/User/Summary.html?id=' . $session{CurrentUser}->id,
         sort_order   => 99,
     );
 
@@ -478,10 +576,14 @@ my $build_main_nav = sub {
     if ( $session{'CurrentUser'}->UserObj
          && $session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => RT->System )) {
         my $settings = $about_me->child( settings => title => loc('Settings'), path => '/Prefs/Other.html' );
-        $settings->child( options        => title => loc('Options'),        path => '/Prefs/Other.html' );
+        $settings->child( options        => title => loc('Preferences'),        path => '/Prefs/Other.html' );
         $settings->child( about_me       => title => loc('About me'),       path => '/User/Prefs.html' );
         $settings->child( search_options => title => loc('Search options'), path => '/Prefs/SearchOptions.html' );
         $settings->child( myrt           => title => loc('RT at a glance'), path => '/Prefs/MyRT.html' );
+        $settings->child( dashboards_in_menu =>
+            title => loc('Dashboards in menu'),
+            path  => '/Prefs/DashboardsInMenu.html',
+        );
         $settings->child( quicksearch    => title => loc('Quick search'),   path => '/Prefs/Quicksearch.html' );
 
         my $search_menu = $settings->child( 'saved-searches' => title => loc('Saved Searches') );
@@ -499,8 +601,8 @@ my $build_main_nav = sub {
         }
     }
     if ( $session{'CurrentUser'}->Name
-         && (   !RT->Config->Get('WebExternalAuth')
-              || RT->Config->Get('WebFallbackToInternalAuth') )) {
+         && (   !RT->Config->Get('WebRemoteUserAuth')
+              || RT->Config->Get('WebFallbackToRTLogin') )) {
         $about_me->child( logout => title => loc('Logout'), path => '/NoAuth/Logout.html' );
     }
     if ( $request_path =~ m{^/Dashboards/(\d+)?}) {
@@ -533,7 +635,7 @@ my $build_main_nav = sub {
                 $tabs->child( history => title => loc('History'), path => "/Ticket/History.html?id=" . $id );
 
                 my %can = %{ $obj->CurrentUser->PrincipalObj->HasRights( Object => $obj ) };
-                $can{'_ModifyOwner'} = $can{'OwnTicket'} || $can{'TakeTicket'} || $can{'StealTicket'};
+                $can{'_ModifyOwner'} = $obj->CurrentUserCanSetOwner();
                 my $can = sub {
                     unless ($_[0] eq 'ExecuteCode') {
                         return $can{$_[0]} || $can{'SuperUser'};
@@ -582,7 +684,7 @@ my $build_main_nav = sub {
                     && $obj->HasUnresolvedDependencies;
 
                 my $current   = $obj->Status;
-                my $lifecycle = $obj->QueueObj->Lifecycle;
+                my $lifecycle = $obj->LifecycleObj;
                 my $i         = 1;
                 foreach my $info ( $lifecycle->Actions($current) ) {
                     my $next = $info->{'to'};
@@ -597,42 +699,31 @@ my $build_main_nav = sub {
 
                     my $action = $info->{'update'} || '';
                     my $url = '/Ticket/';
-                    if ($action) {
-                        $url .= "Update.html?"
-                            . $query_string->(
-                                Action        => $action,
-                                DefaultStatus => $next,
-                                id            => $id,
-                            );
-                    } else {
-                        $url .= "Display.html?"
-                            . $query_string->(
-                                Status => $next,
-                                id     => $id,
-                            );
-                    }
+                    $url .= "Update.html?". $query_string->(
+                        $action
+                            ? (Action        => $action)
+                            : (SubmitTicket  => 1, Status => $next),
+                        DefaultStatus => $next,
+                        id            => $id,
+                    );
                     my $key = $info->{'label'} || ucfirst($next);
                     $actions->child( $key => title => loc( $key ), path => $url);
                 }
 
-                if ( $can->('OwnTicket') ) {
-                    if ( $obj->OwnerObj->Id == RT->Nobody->id
-                         && ( $can->('ModifyTicket') or $can->('TakeTicket') ) ) {
-                        $actions->child( take => title => loc('Take'), path => "/Ticket/Display.html?Action=Take;id=" . $id );
-                    }
-
-                    elsif (    $obj->OwnerObj->id != RT->Nobody->id
-                            && $obj->OwnerObj->id != $session{CurrentUser}->id
-                            && ( $can->('ModifyTicket') or $can->('StealTicket') ) ) {
-                        $actions->child( steal => title => loc('Steal'), path => "/Ticket/Display.html?Action=Steal;id=" . $id );
-                    }
+                my ($can_take, $tmsg) = $obj->CurrentUserCanSetOwner( Type => 'Take' );
+                my ($can_steal, $smsg) = $obj->CurrentUserCanSetOwner( Type => 'Steal' );
+                if ( $can_take ){
+                    $actions->child( take => title => loc('Take'), path => "/Ticket/Display.html?Action=Take;id=" . $id );
+                }
+                elsif ( $can_steal ){
+                    $actions->child( steal => title => loc('Steal'), path => "/Ticket/Display.html?Action=Steal;id=" . $id );
                 }
 
                 # TODO needs a "Can extract article into a class applied to this queue" check
                 $actions->child( 'extract-article' =>
                     title => loc('Extract Article'),
                     path  => "/Articles/Article/ExtractIntoClass.html?Ticket=".$obj->id,
-                );
+                ) if $session{CurrentUser}->HasRight( Right => 'ShowArticlesMenu', Object => RT->System );
 
                 if ( defined $session{"tickets"} ) {
                     # we have to update session data if we get new ItemMap
@@ -644,7 +735,7 @@ my $build_main_nav = sub {
                         $session{"tickets"}->PrepForSerialization();
                     }
 
-                    my $search = Menu()->child('search');
+                    my $search = Menu()->child('search')->child('tickets');
                     # Don't display prev links if we're on the first ticket
                     if ( $item_map->{$id}->{prev} ) {
                         $search->child( first =>
@@ -656,8 +747,10 @@ my $build_main_nav = sub {
                     if ( $item_map->{$id}->{next} ) {
                         $search->child( next =>
                             title => loc('Next') . ' >',  class => "nav", path => "/Ticket/Display.html?id=" . $item_map->{$id}->{next});
-                        $search->child( last =>
-                            title => loc('Last') . ' >>', class => "nav", path => "/Ticket/Display.html?id=" . $item_map->{last});
+                        if ( $item_map->{last} ) {
+                            $search->child( last =>
+                                title => loc('Last') . ' >>', class => "nav", path => "/Ticket/Display.html?id=" . $item_map->{last});
+                        }
                     }
                 }
             }
@@ -673,7 +766,7 @@ my $build_main_nav = sub {
             && $DECODED_ARGS->{'q'} )
       )
     {
-        my $search = Menu()->child('search');
+        my $search = Menu()->child('search')->child('tickets');
         my $args      = '';
         my $has_query = '';
         my $current_search = $session{"CurrentSearchHash"} || {};
@@ -828,11 +921,22 @@ my $build_main_nav = sub {
 
     }
 
+    if ( $request_path =~ m{^/User/(Summary|History)\.html} ) {
+        if (PageMenu()->child('summary')) {
+            # Already set up from having AdminUser and ShowConfigTab;
+            # but rename "Basics" to "Edit" in this context
+            PageMenu()->child( 'basics' )->title( loc('Edit') );
+        } elsif ( $session{'CurrentUser'}->HasRight( Object => $RT::System, Right => 'ShowUserHistory' ) ) {
+            PageMenu()->child( display => title => loc('Summary'), path => '/User/Summary.html?id=' . $DECODED_ARGS->{'id'} );
+            PageMenu()->child( history => title => loc('History'), path => '/User/History.html?id=' . $DECODED_ARGS->{'id'} );
+        }
+    }
+
     if ( $request_path =~ /^\/(?:index.html|$)/ ) {
         PageMenu()->child( edit => title => loc('Edit'), path => '/Prefs/MyRT.html' );
     }
 
-    $m->callback( CallbackName => 'Privileged' );
+    $m->callback( CallbackName => 'Privileged', Path => $request_path );
 };
 
 my $build_selfservice_nav = sub {
@@ -874,8 +978,8 @@ my $build_selfservice_nav = sub {
     }
 
     if ( $session{'CurrentUser'}->Name
-         && (   !RT->Config->Get('WebExternalAuth')
-              || RT->Config->Get('WebFallbackToInternalAuth') )) {
+         && (   !RT->Config->Get('WebRemoteUserAuth')
+              || RT->Config->Get('WebFallbackToRTLogin') )) {
         $about_me->child( logout => title => loc('Logout'), path => '/NoAuth/Logout.html' );
     }
 
@@ -885,7 +989,7 @@ my $build_selfservice_nav = sub {
 
     PageWidgets->child( goto => raw_html => $m->scomp('/SelfService/Elements/GotoTicket') );
 
-    $m->callback( CallbackName => 'SelfService' );
+    $m->callback( CallbackName => 'SelfService', Path => $request_path );
 };