BasicVsAdvancedInterface

From Request Tracker Wiki
Jump to navigation Jump to search

This feature provides a simple way to offer privileged users a basic interface (i.e. the SelfService interface) or an advanced interface (the default RT at a Glance interface). Non-privileged users will still only ever see the SelfService screens. A cookie keeps track of the user's preference. This patch was created against 3.6.3 source.

There are two files to patch, Elements/Header and SelfService/Elements/Header, as well as two new files (Elements/UIPrefCookieCheck and Elements/UIPrefSwitchView). To install the feature:

  1. create the directory <rt-root>/local/html/Elements, if needed
  2. copy the file <rt-root>/share/html/Elements/Header to <rt-root>/local/html/Elements, if it does not already exist
  3. create the directory <rt-root>/local/html/SelfService/Elements, if needed
  4. copy the file <rt-root>/share/html/SelfService/Elements/Header] to <rt-root>/local/html/SelfService/Elements, if it does not already exist
  5. create the file <rt-root>/local/html/Elements/UIPrefCookieCheck, with the contents shown below
  6. create the file <rt-root>/local/html/Elements/UIPrefSwitchView, with the contents shown below
  7. create the file <rt-root>/UIPref.diff, with the contents shown below
  8. apply the patch (assuming <rt-root> == /opt/rt3):
$ cd /opt/rt3
$ patch -p0 <UIPref.diff

<rt-root>/local/html/Elements/UIPrefCookieCheck

<%INIT>
 #***** fetch the cookie *****
 my(%cookies) = CGI::Cookie->fetch();
 my($cookiename) = "RT_USER_UI_PREF_" . $RT::rtname . "." . $ENV{'SERVER_PORT'};
 my($cookie) = $cookies{$cookiename};
 
 #***** default to basic mode *****
 my($mode) = 'Basic';
 $mode = $cookie->value() if $cookie;
 
 #***** if I have no cookie, set a cookie to the default *****
 if (! $cookie) {
     my($newcookie) = new CGI::Cookie(
         -name  => $cookiename,
         -value => $mode,
         -path  => $RT::WebPath,
         -secure => ($RT::WebSecureCookies ? 1 :0)
         -expires =>  '+1M',
     );
     $r->headers_out->{'Set-Cookie'} = $newcookie->as_string;
 }
 
 if (($mode eq 'Basic') && (! $viaSelfService)) {
     #***** I want basic, but was called under advanced *****
     $m->comp("/SelfService/index.html", %ARGS, SkipUIPrefCookieCheck => !0);
     $m->abort();
 }
 elsif (($mode eq 'Advanced') && ($viaSelfService)) {
     #***** I want advanced, but was called under basic *****
     $m->comp("/index.html", %ARGS, SkipUIPrefCookieCheck => !0);
     $m->abort();
 }
 </%INIT>
 
 <%ARGS>
 $viaSelfService => undef
 </%ARGS>
 

<rt-root>/local/html/Elements/UIPrefSwitchView

<%INIT>
 #***** fetch the cookie *****
 my(%cookies) = CGI::Cookie->fetch();
 my($cookiename) = "RT_USER_UI_PREF_" . $RT::rtname . "." . $ENV{'SERVER_PORT'};
 my($cookie) = $cookies{$cookiename};
 
 #***** default to basic mode *****
 my($mode) = 'Basic';
 $mode = $cookie->value() if $cookie;
 
 my($newmode) = ($mode eq 'Basic' ? 'Advanced' : 'Basic');
 
 my($newcookie) = new CGI::Cookie(
     -name  => $cookiename,
     -value => $newmode,
     -path  => $RT::WebPath,
     -secure => ($RT::WebSecureCookies ? 1 :0),
     -expires =>  '+1M',
     );
 
 $r->headers_out->{'Set-Cookie'} = $newcookie->as_string;
 
 if ($newmode eq 'Basic') {
     RT::Interface::Web::Redirect($RT::WebURL . "SelfService/index.html");
 }
 else {
     RT::Interface::Web::Redirect($RT::WebURL . "index.html");
 }
 
 $m->abort();
 </%INIT>
 
 <%ARGS>
 </%ARGS>
 

<rt-root>/UIPref.diff

--- share/html/Elements/Header	2007-02-14 13:10:35.000000000 -0500
+++ local/html/Elements/Header	2007-02-14 13:12:43.000000000 -0500
@@ -92,6 +92,14 @@
 %     if ($session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => $RT::System )) {
     | <a href="<%$RT::WebPath%><%$Prefs%>"><&|/l&>Preferences</&></a>
 %     }
+%     if ($session{'CurrentUser'}->Privileged) {
+%        if ($viaSelfService) {
+    | <a href="<%$RT::WebPath%>/Elements/UIPrefSwitchView"><&|/l&>Advanced</&></a>
+%        }
+%        else {
+    | <a href="<%$RT::WebPath%>/Elements/UIPrefSwitchView"><&|/l&>Basic</&></a>
+%        }
+%     }
 % } else {
     <&|/l&>Not logged in.</&>
% }
@@ -104,6 +112,11 @@
% }

 <%INIT>
+# check the UI Pref cookie unless we've done so already
+if (($session{'CurrentUser'}) && ($session{'CurrentUser'}->Privileged) && (! $SkipUIPrefCookieCheck)) {
+   $m->comp("/Elements/UIPrefCookieCheck", %ARGS);
+}
+
 $r->headers_out->{'Pragma'} = 'no-cache';
 $r->headers_out->{'Cache-control'} = 'no-cache';

@@ -128,4 +141,7 @@
 $URL => undef
 $RSSAutoDiscovery => undef
 $onload => undef
+$viaSelfService => undef
+$SkipUIPrefCookieCheck => undef
 </%ARGS>
--- share/html/SelfService/Elements/Header	2007-02-14 13:11:09.000000000 -0500
+++ local/html/SelfService/Elements/Header	2007-02-14 13:12:03.000000000 -0500
@@ -43,5 +43,5 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& /Elements/Header, %ARGS, Prefs => '/SelfService/Prefs.html' &>
+<& /Elements/Header, %ARGS, Prefs => '/SelfService/Prefs.html', viaSelfService => !0 &>
 <& /SelfService/Elements/Tabs, %ARGS &>


If you find any problems with it, let me know -- JoeCasadonte