Mercurial > p > roundup > code
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"> </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 your 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>
