[#383] Tracker saved search ui improvements

Jenny Steele Jenny Steele 2010-09-23

added ForgeTracker/forgetracker/widgets/templates/tracker_widgets/bin_form.html
changed Allura/allura/config/app_cfg.py
changed Allura/allura/templates/jinja_master/site_style.css
changed ForgeTracker/forgetracker/tests/functional/test_root.py
changed ForgeTracker/forgetracker/widgets/bin_form.py
changed ForgeTracker/forgetracker/tracker_main.py
copied ForgeTracker/forgetracker/templates/bin.html -> ForgeTracker/forgetracker/templates/tracker/bin.html
copied ForgeTracker/forgetracker/templates/search.html -> ForgeTracker/forgetracker/templates/tracker/search.html
ForgeTracker/forgetracker/widgets/templates/tracker_widgets/bin_form.html Diff Switch to side-by-side view
Loading...
Allura/allura/config/app_cfg.py Diff Switch to side-by-side view
Loading...
Allura/allura/templates/jinja_master/site_style.css Diff Switch to side-by-side view
Loading...
ForgeTracker/forgetracker/tests/functional/test_root.py Diff Switch to side-by-side view
Loading...
ForgeTracker/forgetracker/widgets/bin_form.py Diff Switch to side-by-side view
Loading...
ForgeTracker/forgetracker/tracker_main.py Diff Switch to side-by-side view
Loading...
ForgeTracker/forgetracker/templates/bin.html to ForgeTracker/forgetracker/templates/tracker/bin.html
--- a/ForgeTracker/forgetracker/templates/bin.html
+++ b/ForgeTracker/forgetracker/templates/tracker/bin.html
@@ -1,49 +1,70 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:py="http://genshi.edgewall.org/"
-      xmlns:xi="http://www.w3.org/2001/XInclude">
-  <xi:include href="${g.allura_templates}/master.html"/>
+{% extends 'jinja_master/master.html' %}
+{% do g.register_app_css('css/hilite.css') %}
+{% do g.register_app_css('css/tracker.css') %}
 
-  <?python 
-from pprint import pformat 
-g.register_app_css('css/hilite.css')
-g.register_app_css('css/tracker.css')
-?>
-  <head>
-    <meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/>
-    <title>$c.project.name / $c.app.config.options.mount_label / Saved Search Bins</title>
-    <link rel="alternate" type="application/rss+xml" title="RSS" href="feed.rss"/>
-    <link rel="alternate" type="application/atom+xml" title="Atom" href="feed.atom"/>
-  </head>
+{% block title %}{{c.project.name}} / {{app.config.options.mount_label}} / Saved Search Bins{% endblock %}
 
-  <body>
-    <h1 class="title">Saved Search Bins</h1>
-    <div class="content">
-      <div class="row">
-        <div class="column grid_12">
-          <py:if test="not len(bins)">No saved search bins have been created yet.</py:if>
-          <table py:if="len(bins)">
-            <thead>
-              <tr>
-                <th>Name</th>
-                <th>Terms</th>
-                <th>&nbsp;</th>
-              </tr>
-            </thead>
-            <tbody class="bin-list">
-              <tr py:for="bin in bins">
-                <td><a href="${bin.url()}">$bin.summary</a></td>
-      	  <td>$bin.terms</td>
-	  <td><a href="delbin?summary=${bin.summary}" class="btn">Delete</a></td>
-              </tr>
-            </tbody>
-          </table>
-        </div>
-      </div>
-    </div>
-  </body>
+{% block head %}
+  <link rel="alternate" type="application/rss+xml" title="RSS" href="feed.rss"/>
+  <link rel="alternate" type="application/atom+xml" title="Atom" href="feed.atom"/>
+{% endblock %}
+
+{% block header %}Saved Search Bins{% endblock %}
+
+{% block edit_box %}
+  <div class="editbox" style="display:none">
+    {{c.bin_form.display(
+      value=dict(),
+      action=c.project.url()+'admin/'+app.config.options.mount_point+'/bins/save_bin'
+    )}}
+  </div>
+{% endblock %}
+
+{% block content %}
+  {% if bins.__len__() %}
+    <table>
+      <thead>
+        <tr>
+          <th>Name</th>
+          <th>Terms</th>
+          <th>&nbsp;</th>
+        </tr>
+      </thead>
+      <tbody class="bin-list">
+        {% for bin in bins %}
+          <tr{% if loop.index0 % 2 == 0 %} class="even"{% endif %}>
+            <td><a href="{{bin.url()}}">{{bin.summary}}</a></td>
+            <td>{{bin.terms}}</td>
+            <td>
+              <a href="delbin?summary={{bin.summary}}" class="btn">Delete</a>
+              <a href="#" class="btn bin_edit_activate">Edit</a>
+              <input type="hidden" name="summary" value="{{bin.summary}}">
+              <input type="hidden" name="terms" value="{{bin.terms}}">
+            </td>
+          </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+  {% else %}
+    No saved search bins have been created yet.
+  {% endif %}
+{% endblock %}
+
+{% block extra_js %}
   <script type="text/javascript">
-    $('tbody.bin-list').children(':even').addClass('even');
+    var form_holder = $('div.editbox');
+    $('a.bin_edit_activate').click(function(){
+      form_holder.show();
+      var editable_holder = $(this).closest('td');
+      var summary = editable_holder.find('input[name=summary]').val();
+      form_holder.find('input[name=bin_form.summary]').val(summary);
+      form_holder.find('input[name=bin_form.old_summary]').val(summary);
+      form_holder.find('input[name=bin_form.terms]').val(editable_holder.find('input[name=terms]').val());
+      return false;
+    });
+    $('#cancel_new_bin').click(function(){
+      form_holder.hide();
+      return false;
+    });
   </script>
-</html>
+{% endblock %}
ForgeTracker/forgetracker/templates/search.html to ForgeTracker/forgetracker/templates/tracker/search.html
--- a/ForgeTracker/forgetracker/templates/search.html
+++ b/ForgeTracker/forgetracker/templates/tracker/search.html
@@ -1,48 +1,53 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:py="http://genshi.edgewall.org/"
-      xmlns:xi="http://www.w3.org/2001/XInclude">
-  <?python 
-from pprint import pformat
-from allura.lib.security import has_artifact_access
-g.register_app_css('css/tracker.css')
-?>
-  <xi:include href="master.html" />
-  <xi:include href="lib.html" />
+{% extends 'jinja_master/master.html' %}
+{% do g.register_app_css('css/tracker.css') %}
 
-  <head>
-    <meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/>
-    <title>$c.project.name / $c.app.config.options.mount_label / Search</title>
-  </head>
-  <body>
-    <h1 class="title">Search $c.app.config.options.mount_point: $q</h1>
-    <div class="content">
-      <div class="row">
-        <div class="column grid_12">
-          <form method="GET" action=".">
-            ${c.auto_resize_textarea.display(name='q', value=q,
-              attrs={'style':'height:1em; width: 425px; float: left; margin-right: .5em'})}
-            <input type="submit" value="Search"/>
-          </form>
-          <form py:if="q and has_artifact_access('save_searches')()" method="GET" action="${c.project.url()+'admin/'+c.app.config.options.mount_point+'/bins/newbin'}">
-            <input type="submit" value="Save Search"/>
-            <input type="hidden" name="q" value="$q"/>
-          </form>
-          <div style="clear:both"/>
-          ${c.ticket_search_results.display(solr_error=solr_error,
-            count=count,
-            limit=limit,
-            query=q,
-            tickets=tickets,
-            sortable_custom_fields=sortable_custom_fields,
-            page=page,
-            sort=sort)}
-          <a href="${tg.url('../edit/', dict(q=q, limit=limit, sort=sort))}"
-             class="btn"
-             py:if="allow_edit and count != 0">Edit All</a>
-        </div>
-      </div>
+{% block title %}{{c.project.name}} / {{c.app.config.options.mount_label}} / Search{% endblock %}
+
+{% block header %}Search {{c.app.config.options.mount_point}}: {{q}}{% endblock %}
+
+{% if q and h.has_artifact_access('save_searches')() %}
+  {% block edit_box %}
+    <div class="editbox" style="display:none">
+      {{c.bin_form.display(
+        value=dict(summary=q,terms=q,sort=sort),
+        action=c.project.url()+'admin/'+c.app.config.options.mount_point+'/bins/save_bin'
+      )}}
     </div>
-  </body>
-</html>
+  {% endblock %}
+{% endif %}
+
+{% block content %}
+<form method="GET" action=".">
+  {{c.auto_resize_textarea.display(name='q', value=q,
+    attrs={'style':'height:1em; width: 425px; float: left; margin-right: .5em'})}}
+  <input type="submit" value="Search"/>
+</form>
+{% if q and h.has_artifact_access('save_searches')() %}
+  <input type="button" value="Save Search" id="save_search"/>
+{% endif %}
+<div style="clear:both"/>
+{{c.ticket_search_results.display(solr_error=solr_error,
+  count=count,
+  limit=limit,
+  query=q,
+  tickets=tickets,
+  sortable_custom_fields=sortable_custom_fields,
+  page=page,
+  sort=sort)}}
+{% if allow_edit and count != 0 %}
+<a href="{{tg.url('../edit/', dict(q=q, limit=limit, sort=sort))}}" class="btn">Edit All</a>
+{% endif %}
+{% endblock %}
+
+{% block extra_js %}
+  {% if q and h.has_artifact_access('save_searches')() %}
+    <script type="text/javascript">
+      $('#save_search').click(function(){
+        $('div.editbox').show();
+      });
+      $('#cancel_new_bin').click(function(){
+        $('div.editbox').hide();
+      });
+    </script>
+  {% endif %}
+{% endblock %}