Эх сурвалжийг харах

Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643

Enrico Berti 13 жил өмнө
parent
commit
485da95afb

+ 13 - 3
apps/beeswax/src/beeswax/templates/list_designs.mako

@@ -71,9 +71,9 @@ ${layout.menubar(section='saved queries')}
           ${ timesince(design.mtime) } ago
         </td>
         <td>
-	      	% if may_edit:
 			<a class="btn small contextEnabler" data-menuid="${design.id}">Options</a>
 			<ul class="contextMenu" id="menu${design.id}">
+	      	% if may_edit:
 	             % if design.type == models.SavedQuery.REPORT:
 	               <li><a href="${ url('beeswax.views.edit_report', design_id=design.id) }" title="Edit this report." class="contextItem">Edit</a></li>
 	             % else:
@@ -81,8 +81,10 @@ ${layout.menubar(section='saved queries')}
 	             % endif
 	             <li><a href="javascript:void(0)" data-confirmation-url="${ url('beeswax.views.delete_design', design_id=design.id) }" title="Delete this query." class="contextItem confirmationModal">Delete</a></li>
 	             <li><a href="${ url('beeswax.views.list_query_history') }?design_id=${design.id}" title="View the usage history of this query." class="contextItem">Usage History</a></li>
-			</ul>
+
 	        % endif
+				<li><a href="${ url('beeswax.views.clone_design', design_id=design.id) }" title="Copy this query.">Clone</a></li>
+			</ul>
         </td>
       </tr>
     % endfor
@@ -111,7 +113,15 @@ ${comps.pagination(page)}
 			"bPaginate": false,
 		    "bLengthChange": false,
 			"bInfo": false,
-			"bFilter": false
+			"bFilter": false,
+			"aoColumns": [
+				null,
+				null,
+				null,
+				null,
+				null,
+				{ "bSortable": false }
+			]
 		});
 		$(".contextEnabler").jHueContextMenu();
 

+ 183 - 126
apps/filebrowser/src/filebrowser/templates/display.mako

@@ -27,139 +27,196 @@
 %>
 
 ${commonheader(truncate(filename)+' :: File Viewer', 'filebrowser')}
+
+
+
+<div class="container-fluid">
+	% if breadcrumbs:
+		<div class="subnav">
+		    <ul class="nav nav-pills">
+		      <li><a href="${url('filebrowser.views.view', path=urlencode(path))}?default_to_home"><i class="icon-home"></i> Home</a></li>
+		      <li>
+				<ul class="hueBreadcrumb">
+					% for breadcrumb_item in breadcrumbs:
+					<li><a href="/filebrowser/view${breadcrumb_item['url']}">${breadcrumb_item['label']}</a> <span class="divider">/</span></li>
+					% endfor
+				</ul>
+			  </li>
+		    </ul>
+		</div>
+		<br/>
+	%endif
+</div>
+
 <div class="container-fluid">
-  <div class="toolbar">
-    <div>
-      % if view['mode'] == "binary":
-        <a class="btn" href="${base_url}?offset=${view['offset']}&length=${view['length']}&mode=text&compression=${view['compression']}">View As Text</a>
-      % endif
+	<div class="row-fluid">
+		<div class="span2">
+			<div class="well sidebar-nav">
+				<ul class="nav nav-list">
+					<li class="nav-header">Actions</li>
+					% if view['mode'] == "binary":
+				        <li><a href="${base_url}?offset=${view['offset']}&length=${view['length']}&mode=text&compression=${view['compression']}">View As Text</a></li>
+				      % endif
+					  % if view['mode'] == "text":
+				        <li><a href="${base_url}?offset=${view['offset']}&length=${view['length']}&mode=binary&compression=${view['compression']}">View As Binary</a></li>
+				      % endif
+
+				      % if view['compression'] != "gzip" and path.endswith('.gz'):
+				        <li><a href="${base_url}?offset=0&length=2000&mode=${view['mode']}&compression=gzip">Preview As Gzip</a></li>
+				      % endif
+
+				      % if view['compression'] != "avro" and path.endswith('.avro'):
+				        <li><a href="${base_url}?offset=0&length=2000&mode=${view['mode']}&compression=avro">Preview As Avro</a></li>
+				      % endif
 
-      % if view['mode'] == "text":
-        <a class="btn" href="${base_url}?offset=${view['offset']}&length=${view['length']}&mode=binary&compression=${view['compression']}">View As Binary</a>
-      % endif
+				      % if view['compression'] and view['compression'] != "none":
+				        <li><a href="${base_url}?offset=0&length=2000&mode=${view['mode']}&compression=none">Stop preview</a></li>
+				      % endif
 
-      % if view['compression'] != "gzip" and path.endswith('.gz'):
-        <a class="btn" href="${base_url}?offset=0&length=2000&mode=${view['mode']}&compression=gzip">Preview As Gzip</a>
-      % endif
+				      % if editable and view['compression'] == "none":
+				        <li><a href="${url('filebrowser.views.edit', path=path_enc)}">Edit File</a></li>
+				      % endif
+				       <li><a href="${url('filebrowser.views.download', path=path_enc)}">Download</a></li>
+				       <li><a href="${url('filebrowser.views.view', path=dirname_enc)}">View File Location</a></li>
+				       <li><a id="refreshBtn">Refresh</a></li>
+					<li class="nav-header">Info</li>
+					<li>
+						<dl>
+							<dt>Last Modified</dt>
+				        	<dd>${date(datetime.datetime.fromtimestamp(stats['mtime']))} ${time(datetime.datetime.fromtimestamp(stats['mtime']))}</dd>
+				        	<dt>User</dt>
+				        	<dd>${stats['user']}</dd>
+				        	<dt>Group</dt>
+				        	<dd>${stats['group']}</dd>
+				        	<dt>Size</dt>
+				        	<dd>${stats['size']|filesizeformat}</dd>
+				        	<dt>Mode</dt>
+				        	<dd>${stringformat(stats['mode'], "o")}</dd>
+						</dl>
+					</li>
+				</ul>
 
-      % if view['compression'] != "avro" and path.endswith('.avro'):
-        <a class="btn" href="${base_url}?offset=0&length=2000&mode=${view['mode']}&compression=avro">Preview As Avro</a>
-      % endif
+			</div>
+		</div>
+		<div class="span10">
+			% if not view['compression'] or view['compression'] in ("none", "avro"):
+			      <div class="pagination">
+			        <%
+			          base_url = url('filebrowser.views.view', path=path_enc)
+			          if view['offset'] == 0:
+			              first_class = "prev disabled"
+			              prev_class = "disabled"
+			              first_href = ""
+			              prev_href = ""
+			          else:
+			              first_class = "prev"
+			              prev_class = ""
+			              first_href = "href=%s?offset=0&length=%d&compression=none title=1 - %d" %(base_url, view['length'], min(view['length'], stats['size']))
+			              prev_href =  "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, max(0, view['offset']-view['length']), view['length'], max(0, view['offset']-view['length']) + 1, min(max(0, view['offset'] - view['length']) + view['length'], stats['size']))
+			          if view['offset'] + view['length'] >= stats['size']:
+			              next_class = "disabled"
+			              last_class = "next disabled"
+			              next_href = ""
+			              last_href = ""
+			          else:
+			              next_class = ""
+			              last_class = "next"
+			              next_href = "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, view['offset'] + view['length'], view['length'], view['offset'] + view['length'] + 1, view['offset'] + (2 * view['length']))
+			              last_href =  "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, stats['size']-(stats['size'] % view['length']), view['length'], stats['size']-(stats['size'] % view['length']) + 1, stats['size'])
+			        %>
+			        ###DEFINE REL
+			        <ul>
+			            <li class="${first_class}"><a ${first_href}>First Block</a></li>
+			            <li class="${prev_class}"><a ${prev_href}>Previous Block</a></li>
+			            <li class="${next_class}"><a ${next_href}>Next Block</a></li>
+			            <li class="${last_class}"><a ${last_href}>Last Block</a></li>
+			        </ul>
 
-      % if view['compression'] and view['compression'] != "none":
-        <a class="btn" href="${base_url}?offset=0&length=2000&mode=${view['mode']}&compression=none">Stop preview</a>
-      % endif
+					<form action="${url('filebrowser.views.view', path=path_enc)}" method="GET" class="form-inline pull-right">
+						<span>Viewing Bytes:</span>
+						<input type="text" name="begin" value="${view['offset'] + 1}" class="input-mini" />
+						-
+						<input type="text" value="${view['end']}" name="end" class="input-mini" /> of
+						<span>${stats['size']}</span>
+						<span>(${view['length']} B block size)</span>
+						% if view['mode']:
+							<input type="hidden" name="mode" value="${view['mode']}"/>
+						% endif
+			        </form>
 
-      % if editable and view['compression'] == "none":
-        <a class="btn" href="${url('filebrowser.views.edit', path=path_enc)}">Edit File</a>
-      % endif
-       <a class="btn" href="${url('filebrowser.views.download', path=path_enc)}">Download</a>
-       <a class="btn" href="${url('filebrowser.views.view', path=dirname_enc)}">View File Location</a>
-       <a id="refreshBtn" class="btn">Refresh</a>
-    </div>
-  </div>
-  <div>
-    % if not view['compression'] or view['compression'] in ("none", "avro"):
-      <div class="fv-navStatus">
-        <form action="${url('filebrowser.views.view', path=path_enc)}" method="GET">
-          <span>Viewing Bytes:</span><a title="Enter Bytes"></a>
-          <input name="begin" value="${view['offset'] + 1}"/>
-          -
-          <input value="${view['end']}" name="end"/> of
-          <span>${stats['size']}</span>
-          <span>(${view['length']} B block size)</span>
-          % if view['mode']:
-            <input type="hidden" name="mode" value="${view['mode']}"/><br/>
-          % endif
-        </form>
-      </div>
-      <div class="pagination">
-        <%
-          base_url = url('filebrowser.views.view', path=path_enc)
-          if view['offset'] == 0:
-              first_class = "prev disabled"
-              prev_class = "disabled"
-              first_href = ""
-              prev_href = ""
-          else:
-              first_class = "prev"
-              prev_class = ""
-              first_href = "href=%s?offset=0&length=%d&compression=none title=1 - %d" %(base_url, view['length'], min(view['length'], stats['size']))
-              prev_href =  "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, max(0, view['offset']-view['length']), view['length'], max(0, view['offset']-view['length']) + 1, min(max(0, view['offset'] - view['length']) + view['length'], stats['size']))
-          if view['offset'] + view['length'] >= stats['size']:
-              next_class = "disabled"
-              last_class = "next disabled"
-              next_href = ""
-              last_href = ""
-          else:
-              next_class = ""
-              last_class = "next"
-              next_href = "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, view['offset'] + view['length'], view['length'], view['offset'] + view['length'] + 1, view['offset'] + (2 * view['length']))
-              last_href =  "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, stats['size']-(stats['size'] % view['length']), view['length'], stats['size']-(stats['size'] % view['length']) + 1, stats['size'])
-        %>
-        ###DEFINE REL
-        <ul>
-            <li class="${first_class}"><a ${first_href}>First Block</a></li>
-            <li class="${prev_class}"><a ${prev_href}>Previous Block</a></li>
-            <li class="${next_class}"><a ${next_href}>Next Block</a></li>
-            <li class="${last_class}"><a ${last_href}>Last Block</a></li>
-        </ul>
-      </div>
-    % endif
-  </div>
-  <div class="container-fluid">
-    <div class="sidebar">
-      <div class="well">
-        <h5>Last Modified</h5>
-        ${date(datetime.datetime.fromtimestamp(stats['mtime']))} ${time(datetime.datetime.fromtimestamp(stats['mtime']))}
-        <h5>User</h5>
-        ${stats['user']}
-        <h5>Group</h5>
-        ${stats['group']}
-        <h5>Size</h5>
-        ${stats['size']|filesizeformat}
-        ## Could convert this to "rw-rw-r--" form.
-        <h5>Mode</h5>
-        ${stringformat(stats['mode'], "o")}
-        ## Could increase accuracy here depending on how long ago this was
-      </div>
-    </div>
-    <div class="content">
-    %if 'contents' in view:
-      % if view['masked_binary_data']:
-      <div class="alert-message warning">Warning: some binary data has been masked out with '&#xfffd'.</div>
-      % endif
-    % endif
-      <div>
-      % if 'contents' in view:
-             <div><pre>${view['contents']|h}</pre></div>
-      % else:
-        <table>
-          % for offset, words, masked in view['xxd']:
-            <tr>
-              <td><tt>${stringformat(offset, "07x")}:&nbsp;</tt></td>
-            <td>
-              <tt>
-                % for word in words:
-                  % for byte in word:
-                    ${stringformat(byte, "02x")}
-                  % endfor
-                % endfor
-              </tt>
-            </td>
-            <td>
-              <tt>
-                &nbsp;&nbsp;${masked}
-              </tt>
-            </td>
-            </tr>
-          % endfor
-        </table>
-      % endif
-      </div>
-    </div>
-  </div>
+			      </div>
+
+			    % endif
+			%if 'contents' in view:
+		      % if view['masked_binary_data']:
+		      <div class="alert-message warning">Warning: some binary data has been masked out with '&#xfffd'.</div>
+		      % endif
+		    % endif
+		      <div>
+		      % if 'contents' in view:
+		             <div><pre>${view['contents']|h}</pre></div>
+		      % else:
+		        <table>
+		          % for offset, words, masked in view['xxd']:
+		            <tr>
+		              <td><tt>${stringformat(offset, "07x")}:&nbsp;</tt></td>
+		            <td>
+		              <tt>
+		                % for word in words:
+		                  % for byte in word:
+		                    ${stringformat(byte, "02x")}
+		                  % endfor
+		                % endfor
+		              </tt>
+		            </td>
+		            <td>
+		              <tt>
+		                &nbsp;&nbsp;${masked}
+		              </tt>
+		            </td>
+		            </tr>
+		          % endfor
+		        </table>
+		      % endif
+		      </div>
+			  % if not view['compression'] or view['compression'] in ("none", "avro"):
+			      <div class="pagination">
+			        <%
+			          base_url = url('filebrowser.views.view', path=path_enc)
+			          if view['offset'] == 0:
+			              first_class = "prev disabled"
+			              prev_class = "disabled"
+			              first_href = ""
+			              prev_href = ""
+			          else:
+			              first_class = "prev"
+			              prev_class = ""
+			              first_href = "href=%s?offset=0&length=%d&compression=none title=1 - %d" %(base_url, view['length'], min(view['length'], stats['size']))
+			              prev_href =  "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, max(0, view['offset']-view['length']), view['length'], max(0, view['offset']-view['length']) + 1, min(max(0, view['offset'] - view['length']) + view['length'], stats['size']))
+			          if view['offset'] + view['length'] >= stats['size']:
+			              next_class = "disabled"
+			              last_class = "next disabled"
+			              next_href = ""
+			              last_href = ""
+			          else:
+			              next_class = ""
+			              last_class = "next"
+			              next_href = "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, view['offset'] + view['length'], view['length'], view['offset'] + view['length'] + 1, view['offset'] + (2 * view['length']))
+			              last_href =  "href=%s?offset=%d&length=%d&compression=none title=%d - %d" %(base_url, stats['size']-(stats['size'] % view['length']), view['length'], stats['size']-(stats['size'] % view['length']) + 1, stats['size'])
+			        %>
+			        ###DEFINE REL
+			        <ul>
+			            <li class="${first_class}"><a ${first_href}>First Block</a></li>
+			            <li class="${prev_class}"><a ${prev_href}>Previous Block</a></li>
+			            <li class="${next_class}"><a ${next_href}>Next Block</a></li>
+			            <li class="${last_class}"><a ${last_href}>Last Block</a></li>
+			        </ul>
+			      </div>
+			    % endif
+		</div>
+	</div>
 </div>
+
 	<script type="text/javascript" charset="utf-8">
 		$(document).ready(function(){
 			$("#refreshBtn").click(function(){

+ 17 - 1
apps/filebrowser/src/filebrowser/templates/edit.mako

@@ -26,8 +26,24 @@
 ${commonheader(truncate(filename)+':: File Viewer', 'filebrowser')}
 
 <div class="container-fluid">
+	% if breadcrumbs:
+		<div class="subnav">
+		    <ul class="nav nav-pills">
+		      <li><a href="${url('filebrowser.views.view', path=urlencode(path))}?default_to_home"><i class="icon-home"></i> Home</a></li>
+		      <li>
+				<ul class="hueBreadcrumb">
+					% for breadcrumb_item in breadcrumbs:
+					<li><a href="/filebrowser/view${breadcrumb_item['url']}">${breadcrumb_item['label']}</a> <span class="divider">/</span></li>
+					% endfor
+				</ul>
+			  </li>
+		    </ul>
+		</div>
+		<br/>
+	%endif
+</div>
 
-<h1>${truncate(path, 91)}</h1>
+<div class="container-fluid">
 <div class="well" >
     <form class="form-stacked" method="post" action="${url('filebrowser.views.save_file')}">
     <div class="toolbar">

+ 12 - 3
apps/filebrowser/src/filebrowser/templates/listdir_components.mako

@@ -96,7 +96,7 @@ from django.utils.encoding import smart_str
 				<td>${file['stats']['user']}</td>
 				<td>${file['stats']['group']}</td>
 				<td>${file['rwx']}</td>
-				<td><span>${date(datetime.datetime.fromtimestamp(file['stats']['mtime']))} ${time(datetime.datetime.fromtimestamp(file['stats']['mtime']))}</span></td>
+				<td>${date(datetime.datetime.fromtimestamp(file['stats']['mtime']))} ${time(datetime.datetime.fromtimestamp(file['stats']['mtime'])).replace("p.m.","PM").replace("a.m.","AM")}</td>
 				<td>
 					% if ".." != file['name']:
 					<%
@@ -322,10 +322,19 @@ from django.utils.encoding import smart_str
 	$(document).ready(function(){
         //filter handlers
         var oTable = $('.datatables').dataTable( {
-          'sPaginationType': 'bootstrap',
+          "sPaginationType": "bootstrap",
           "bLengthChange": false,
           "iDisplayLength": 15,
-          "sDom": "<'row'r>t<'row'<'span8'i><''p>>"
+          "sDom": "<'row'r>t<'row'<'span8'i><''p>>",
+		  "aoColumns": [
+				null,
+				null,
+				null,
+				null,
+				null,
+				{ "sType": "date" },
+				null
+			]
         });
 
         $("#filterInput").keyup(function() {

+ 2 - 1
apps/filebrowser/src/filebrowser/views.py

@@ -160,7 +160,8 @@ def edit(request, path, form=None):
         form=form,
         path=path,
         filename=os.path.basename(path),
-        dirname=os.path.dirname(path))
+        dirname=os.path.dirname(path),
+		breadcrumbs = parse_breadcrumbs(path))
     return render("edit.mako", request, data)
 
 

+ 12 - 3
apps/jobsub/src/jobsub/templates/list_designs.mako

@@ -17,7 +17,7 @@
 <%!
   import cgi
   import urllib
-
+  from django.template.defaultfilters import date, time
   from desktop.lib.django_util import extract_field_data
   from desktop.views import commonheader, commonfooter
 %>
@@ -64,7 +64,7 @@ ${layout.menubar(section='designs')}
                     <td>${design.name}</td>
                     <td>${design.root_action.action_type}</td>
                     <td>${design.description}</td>
-                    <td nowrap="nowrap">${design.last_modified.strftime('%c')}</td>
+                    <td nowrap="nowrap">${date(design.last_modified)} ${time(design.last_modified).replace("p.m.","PM").replace("a.m.","AM")}</td>
                     <td nowrap="nowrap" class="right">
                       %if currentuser.is_superuser:
                         %if currentuser.username == design.owner.username:
@@ -196,7 +196,16 @@ ${layout.menubar(section='designs')}
         var oTable = $('#designTable').dataTable( {
           "sPaginationType": "bootstrap",
           "bLengthChange": false,
-          "sDom": "<'row'r>t<'row'<'span8'i><''p>>"
+          "sDom": "<'row'r>t<'row'<'span8'i><''p>>",
+		  "aoColumns": [
+				null,
+				null,
+				null,
+				null,
+				{ "sType": "date" },
+				null
+			],
+			"aaSorting": [[ 4, "desc" ]]
         });
 
         $("#filterInput").keyup(function() {

+ 11 - 2
apps/jobsub/src/jobsub/templates/list_history.mako

@@ -16,7 +16,7 @@
 
 <%!
   import urllib
-
+  from django.template.defaultfilters import date, time
   from desktop.views import commonheader, commonfooter
   from django.utils.translation import ugettext, ungettext, get_language, activate
 
@@ -59,7 +59,7 @@ ${layout.menubar(section='history')}
                     <td>${wf.name}</td>
                     <td>${wf.root_action.action_type}</td>
                     <td>${wf.description}</td>
-                    <td>${record.submission_date.strftime('%c')}</td>
+                    <td>${date(design.submission_date)} ${time(design.submission_date).replace("p.m.","PM").replace("a.m.","AM")}</td>
                 </tr>
             %endfor
         </tbody>
@@ -72,6 +72,15 @@ ${layout.menubar(section='history')}
           'sPaginationType': 'bootstrap',
           "bLengthChange": false,
           "sDom": "<'row'r>t<'row'<'span8'i><''p>>"
+		  "aoColumns": [
+				null,
+				null,
+				null,
+				null,
+				null,
+				{ "sType": "date" }
+			],
+			"aaSorting": [[ 5, "desc" ]]
         });
 
         $("#filterInput").keyup(function() {

+ 16 - 8
apps/useradmin/src/useradmin/templates/list_users.mako

@@ -15,10 +15,11 @@
 ## limitations under the License.
 <%!
 from desktop.views import commonheader, commonfooter
+from django.template.defaultfilters import date, time
+import urllib
+from django.utils.translation import ugettext, ungettext, get_language, activate
+_ = ugettext
 %>
-<% import urllib %>
-<% from django.utils.translation import ugettext, ungettext, get_language, activate %>
-<% _ = ugettext %>
 
 <%namespace name="layout" file="layout.mako" />
 ${commonheader("Hue Users", "useradmin", "100px")}
@@ -57,10 +58,8 @@ ${layout.menubar(section='users')}
 	            <td>${listed_user.last_name}</td>
 	            <td>${listed_user.email}</td>
 				<td>${', '.join([group.name for group in listed_user.groups.all()])}</td>
-	            <td>
-	              ${listed_user.last_login.strftime('%c')}
-	            </td>
-	            <td>
+	            <td>${date(listed_user.last_login)} ${time(listed_user.last_login).replace("p.m.","PM").replace("a.m.","AM")}</td>
+	            <td class="right">
 				%if user.is_superuser == True:
 					<a title="Edit ${listed_user.username}" class="btn small editUserBtn" data-url="${ url('useradmin.views.edit_user', username=urllib.quote(listed_user.username)) }" data-name="${listed_user.username}">Edit</a>
 					<a title="Delete ${listed_user.username}" class="btn small confirmationModal" alt="Are you sure you want to delete ${listed_user.username}?" href="javascript:void(0)" data-confirmation-url="${ url('useradmin.views.delete_user', username=urllib.quote_plus(listed_user.username)) }">Delete</a>
@@ -125,7 +124,16 @@ ${layout.menubar(section='users')}
 				"bPaginate": false,
 			    "bLengthChange": false,
 				"bInfo": false,
-				"bFilter": false
+				"bFilter": false,
+				"aoColumns": [
+						null,
+						null,
+						null,
+						null,
+						null,
+						null,
+						{ "sType": "date" }
+					]
 			});
 			$(".dataTables_wrapper").css("min-height","0");
 			$(".dataTables_filter").hide();

+ 2 - 2
desktop/core/src/desktop/templates/common_header.html

@@ -75,7 +75,7 @@ limitations under the License.
 				<a class="brand" href="#">Hue 2</a>
 				<div class="nav-collapse">
 					<ul class="nav">
-						<li {% is_selected section "beeswax" %}><a href="/beeswax">Beeswax</a></li>
+						<li {% is_selected section "beeswax" %}><a href="/beeswax/">Beeswax</a></li>
 						<li {% is_selected section "filebrowser" %}><a href="/filebrowser/">File Browser</a></li>
 						<li {% is_selected section "jobsub" %}><a href="/jobsub/">Job Designer</a></li>
 						<li {% is_selected section "jobbrowser" %}><a href="/jobbrowser/jobs/">Job Browser</a></li>
@@ -86,7 +86,7 @@ limitations under the License.
 						<li class="divider-vertical"></li>
 						<li id="checkConfig"><li>
 					</ul>
-					<p class="navbar-text pull-right">Logged in as <strong><span id="username">xxx</span></strong> - <a href="/accounts/logout">Sign out</a></p>
+					<p class="navbar-text pull-right">Logged in as <strong><span id="username">xxx</span></strong> - <a href="/accounts/logout/">Sign out</a></p>
 				</div>
 			</div>
 		</div>

+ 8 - 0
desktop/core/static/css/jhue.css

@@ -376,6 +376,14 @@ ul.errorlist li {
     color: #333333;
 }
 
+.hueBreadcrumb > li:last-child > a {
+    font-weight:bold;
+    color: #333333;
+}
+
+.hueBreadcrumb > li:last-child > span {
+    display:none;
+}
 
 /*********************************************************
  * From: http://datatables.net/blog/Twitter_Bootstrap