view templates/classic/html/page.html @ 3696:790363e96852

Sorting/grouping by multiple properties. - Implement sorting/grouping by multiple properties for the web interface. I'm now using @sort0/@sortdir0,@sort1/@sortdir1,... and @group0/@groupdir0,... when generating URLs from a search template. These are converted to a list internally. When saving URLs (e.g. when storing queries) I'm using @sort=prop1,prop2,... and @group=... with optional '-' prepended to individual props. This means saved URLs are backward compatible with existing trackers (and yes, this was a design goal). I need the clumsy version with @sort0,@sort1 etc, because I'm currently using several selectors and checkboxes (as the classic template does, too). I don't think there is a way around that in HTML? - Updated (hopefully all) documentation to reflect the new URL format and the consequences in the web-interface. - I've set the number of sort/group properties in the classic template to two -- this can easily be reverted by changing n_sort to 1. Richard, would you look over these changes? I've set a tag before and (will set) after commit, so that it would be easy to merge out. Don't be too scared about the size of the change, most is documentation, the guts are in cgi/templating.py and small changes in the classic template.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Wed, 30 Aug 2006 20:28:26 +0000
parents 101ef7a4f9a1
children 18def94e5150
line wrap: on
line source

<tal:block metal:define-macro="icing">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                               "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title metal:define-slot="head_title">title goes here</title>
<link rel="stylesheet" type="text/css" href="@@file/style.css">
<meta http-equiv="Content-Type"
 tal:attributes="content string:text/html;; charset=${request/client/charset}" />
<script tal:replace="structure request/base_javascript">
</script>

</head>
<body class="body">

<table class="body">

<tr>
 <td class="page-header-left">&nbsp;</td>
 <td class="page-header-top">
   <div id="body-title">
     <h2><span metal:define-slot="body_title">body title</span></h2>
   </div>
   <div id="searchbox">
     <form method="GET" action="issue">
       <input type="hidden" name="@columns"
              value="id,activity,title,creator,assignedto,status"/>
       <input type="hidden" name="@sort" value="activity"/>
       <input type="hidden" name="@group" value="priority"/>
       <input id="search-text" name="@search_text" size="10"/>
       <input type="submit" id="submit" name="submit" value="Search" i18n:attributes="value"/>
     </form>
  </div>
 </td>
</tr>

<tr>
 <td rowspan="2" valign="top" class="sidebar">
  <p class="classblock"
     tal:condition="python:request.user.hasPermission('View', 'query')">
   <span i18n:translate=""
    ><b>Your Queries</b> (<a href="query?@template=edit">edit</a>)</span><br>
   <tal:block tal:repeat="qs request/user/queries">
    <a tal:attributes="href string:${qs/klass}?${qs/url}&@dispname=${qs/name}"
       tal:content="qs/name">link</a><br>
   </tal:block>
  </p>

  <form method="POST" tal:attributes="action request/base">
   <p class="classblock"
       tal:condition="python:request.user.hasPermission('View', 'issue')">
    <b i18n:translate="">Issues</b><br>
    <span tal:condition="python:request.user.hasPermission('Create', 'issue')">
      <a href="issue?@template=item" i18n:translate="">Create New</a><br>
    </span>
    <a tal:attributes="href python:request.indexargs_url('issue', {
      '@sort': '-activity',
      '@group': 'priority',
      '@filter': 'status,assignedto',
      '@columns': 'id,activity,title,creator,status',
      'status': '-1,1,2,3,4,5,6,7',
      'assignedto': '-1',
      '@dispname': i18n.gettext('Show Unassigned'),
     })" i18n:translate="">Show Unassigned</a><br>
    <a tal:attributes="href python:request.indexargs_url('issue', {
      '@sort': '-activity',
      '@group': 'priority',
      '@filter': 'status',
      '@columns': 'id,activity,title,creator,assignedto,status',
      'status': '-1,1,2,3,4,5,6,7',
      '@dispname': i18n.gettext('Show All'),
     })" i18n:translate="">Show All</a><br>
    <a href="issue?@template=search" i18n:translate="">Search</a><br>
    <input type="submit" class="form-small" value="Show issue:"
     i18n:attributes="value"><input class="form-small" size="4"
     type="text" name="@number">
    <input type="hidden" name="@type" value="issue">
    <input type="hidden" name="@action" value="show">
   </p>
  </form>

  <p class="classblock"
     tal:condition="python:request.user.hasPermission('Edit', 'keyword')
        or request.user.hasPermission('Create', 'keyword')">
   <b i18n:translate="">Keywords</b><br>
   <span tal:condition="python:request.user.hasPermission('Create', 'keyword')">
    <a href="keyword?@template=item" i18n:translate="">Create New</a><br>
   </span>
   <span tal:condition="python:db.keyword.list() and
        request.user.hasPermission('Edit', 'keyword')">
    <a href="keyword?@template=item" i18n:translate="">Edit Existing</a><br>
   </span>
  </p>

  <p class="classblock"
       tal:condition="python:request.user.hasPermission('View', 'user')">
   <b i18n:translate="">Administration</b><br>
   <span tal:condition="python:request.user.hasPermission('Edit', None)">
    <a href="home?@template=classlist" i18n:translate="">Class List</a><br>
   </span>
   <span tal:condition="python:request.user.hasPermission('View', 'user')
                            or request.user.hasPermission('Edit', 'user')">
    <a href="user"  i18n:translate="">User List</a><br>
   </span>
   <a tal:condition="python:request.user.hasPermission('Create', 'user')"
      href="user?@template=item" i18n:translate="">Add User</a>
  </p>

  <form method="POST" tal:condition="python:request.user.username=='anonymous'"
        tal:attributes="action request/base">
   <p class="userblock">
    <b i18n:translate="">Login</b><br>
    <input size="10" name="__login_name"><br>
    <input size="10" type="password" name="__login_password"><br>
    <input type="hidden" name="@action" value="Login">
    <input type="checkbox" name="remember" id="remember">
    <label for="remember" i18n:translate="">Remember me?</label><br>
    <input type="submit" value="Login" i18n:attributes="value"><br>
    <input type="hidden" name="__came_from" tal:attributes="value string:${request/base}${request/env/PATH_INFO}">
    <span tal:replace="structure request/indexargs_form" />
    <a href="user?@template=register"
       tal:condition="python:request.user.hasPermission('Create', 'user')"
     i18n:translate="">Register</a><br>
    <a href="user?@template=forgotten" i18n:translate="">Lost&nbsp;your&nbsp;login?</a><br>
   </p>
  </form>

  <p class="userblock" tal:condition="python:request.user.username != 'anonymous'">
   <b i18n:translate="">Hello, <span i18n:name="user"
    tal:replace="request/user/username">username</span></b><br>
   <a tal:attributes="href string:issue?@sort=-activity&@group=priority&@filter=status,assignedto&@columns=id,activity,title,creator,status&status=-1,1,2,3,4,5,6,7&assignedto=${request/user/id}" i18n:translate="">Your Issues</a><br>
   <a tal:attributes="href string:user${request/user/id}"
    i18n:translate="">Your Details</a><br>
   <a tal:attributes="href python:request.indexargs_url('',
       {'@action':'logout'})" i18n:translate="">Logout</a>
  </p>
  <p class="userblock">
   <b i18n:translate="">Help</b><br>
   <a href="http://roundup.sourceforge.net/doc-1.0/"
    i18n:translate="">Roundup docs</a>
  </p>
 </td>
 <td>
  <p tal:condition="options/error_message | nothing" class="error-message"
     tal:repeat="m options/error_message" tal:content="structure m" />
  <p tal:condition="options/ok_message | nothing" class="ok-message">
    <span tal:repeat="m options/ok_message"
       tal:content="structure string:$m <br/ > " />
     <a class="form-small" tal:attributes="href request/current_url"
        i18n:translate="">clear this message</a>
  </p>
 </td>
</tr>
<tr>
 <td class="content" metal:define-slot="content">Page content goes here</td>
</tr>

</table>

<pre tal:condition="request/form/debug | nothing" tal:content="request">
</pre>

</body>
</html>
</tal:block>

<!--
The following macros are intended to be used in search pages.

The invoking context must define a "name" variable which names the
property being searched.

See issue.search.html in the classic template for examples.
-->
<td metal:define-macro="search_input">
  <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                         name name">
</td>

<td metal:define-macro="search_date">
  <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                         name name">
  <a class="classhelp" tal:attributes="href python:'''javascript:help_window('issue?@template=calendar&property=%s&form=itemSynopsis', 300, 200)'''%name">(cal)</a>
</td>

<td metal:define-macro="search_popup">
  <!--
    context needs to specify the popup "columns" as a comma-separated
    string (eg. "id,title" or "id,name,description") as well as name
  -->
  <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                         name name">
  <span tal:replace="structure python:db.issue.classhelp(columns,
                                      property=name)" />
</td>

<td metal:define-macro="search_select">
  <select tal:attributes="name name"
          tal:define="value python:request.form.getvalue(name)">
    <option value="" i18n:translate="">don't care</option>
    <tal:block metal:define-slot="extra_options"></tal:block>
    <option value="" i18n:translate="">------------</option>
    <option tal:repeat="s python:db[db_klass].list()"
            tal:attributes="value s/id; selected python:value == s.id"
            tal:content="python:s[db_content]"></option>
  </select>
</td>

<td metal:define-macro="search_multiselect">
  <input tal:attributes="value python:request.form.getvalue(name) or nothing;
                         name name">
  <span tal:replace="structure python:db[db_klass].classhelp(db_content,
                                        property=name, width='600')" />
</td>

<td metal:define-macro="search_checkboxes">
 <ul class="search-checkboxes"
     tal:define="value python:request.form.getvalue(name);
                 values python:value and value.split(',') or []">
 <li tal:repeat="s python:db[db_klass].list()">
  <input type="checkbox" tal:attributes="name name; id string:$name-${s/id};
    value s/id; checked python:s.id in values" />
  <label tal:attributes="for string:$name-${s/id}"
         tal:content="python:s[db_content]" />
 </li>
 <li metal:define-slot="no_value_item">
  <input type="checkbox" value="-1" tal:attributes="name name;
     id string:$name--1; checked python:value == '-1'" />
  <label tal:attributes="for string:$name--1" i18n:translate="">no value</label>
 </li>
 </ul>
</td>

<td metal:define-macro="column_input">
  <input type="checkbox" name="@columns"
         tal:attributes="value name;
                         checked python:name in cols">
</td>

<td metal:define-macro="sort_input">
  <input type="radio" name="@sort"
         tal:attributes="value name;
                         checked python:name == sort_on">
</td>

<td metal:define-macro="group_input">
  <input type="radio" name="@group"
         tal:attributes="value name;
                         checked python:name == group_on">
</td>


Roundup Issue Tracker: http://roundup-tracker.org/