[ADD] column sorting in list view
[odoo/odoo.git] / addons / base / static / src / xml / base.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- vim:fdl=1:
3 -->
4 <templates id="template" xml:space="preserve">
5 <t t-name="Interface">
6     <div id="oe_loading" class="loading"></div>
7     <div id="oe_notification" class="oe_notification">
8         <div id="oe_notification_default">
9             <a class="ui-notify-cross ui-notify-close" href="#">x</a>
10             <h1>#{title}</h1>
11             <p>#{text}</p>
12         </div>
13         <div id="oe_notification_alert" class="ui-state-error">
14             <a class="ui-notify-cross ui-notify-close" href="#">x</a>
15             <span style="float:left; margin:2px 5px 0 0;" class="ui-icon ui-icon-alert"></span>
16             <h1>#{title}</h1>
17             <p>#{text}</p>
18         </div>
19     </div>
20     <div id="oe_login" class="login"></div>
21     <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%"
22         t-att-class="'main_table' + (typeof kitten == 'undefined' ? '' : ' kitten-mode-activated')">
23     <tr>
24         <td colspan="2">
25             <div id="oe_header" class="header"></div>
26             <div id="oe_menu" class="menu"></div>
27         </td>
28     </tr>
29     <tr>
30         <td valign="top" id="oe_secondary_menu" class="secondary_menu">
31         </td>
32         <td valign="top" width="100%" height="100%">
33             <div id="oe_app" class="oe-application"></div>
34         </td>
35     </tr>
36     <tr>
37         <td colspan="2">
38             <div id="oe_footer" class="oe_footer">
39                 <p class="oe_footer_powered">Powered by <a href="http://www.openerp.com">openerp.com</a>.</p>
40             </div>
41         </td>
42     </tr>
43     </table>
44 </t>
45 <t t-name="Loading">
46     Loading...
47 </t>
48 <t t-name="Login">
49     <form>
50         Database: <input type="text" name="db" value="trunk"/><br/>
51         Login: <input type="text" name="login" value="admin"/><br/>
52         Password: <input type="password" name="password" value="a"/><br/>
53         <input type="submit" name="submit" value="Login"/>
54     </form>
55 </t>
56 <t t-name="Header">
57     <a href="/" class="company_logo_link">
58         <img t-att-src="typeof kitten == 'undefined' ? '/base/static/src/img/logo.png' :
59             'http://placekitten.com/g/179/46'" border="0" class="company_logo"/>
60     </a>
61     <h1 class="header_title" t-if="session.session_is_valid()">
62         <span class="company">$company</span> - (<span class="database">$database</span>)<br/>
63         <small class="username">$username session_id: <t t-esc="session.session_id"/></small>
64     </h1>
65     <div class="header_corner">
66         <ul class="block" t-if="session.session_is_valid()">
67             <li>
68                 <a href="#home" title="Home" class="home"><img src="/base/static/src/img/header-home.png" width="16" height="16" border="0"/></a>
69             </li>
70             <li>
71                 <a href="#requests" title="Requests" class="requests"><img src="/base/static/src/img/header-requests.png" width="16" height="16" border="0"/><small>1</small></a>
72             </li>
73             <li class="preferences">
74                 <a href="#preferences" title="Preferences" class="preferences"><img src="/base/static/src/img/header-preferences.png" width="16" height="16" border="0"/></a>
75             </li>
76             <li>
77                 <a href="#about" title="About" class="about"><img src="/base/static/src/img/header-about.png" width="16" height="16" border="0"/></a>
78             </li>
79             <li>
80                 <a href="http://doc.openerp.com/v6.0/book?version=$version" title="Help" target="_blank" class="help"><img src="/base/static/src/img/header-help.png" width="16" height="16" border="0"/></a>
81             </li>
82         </ul>
83         <div class="block">
84             <a href="#logout" class="logout">LOGOUT</a>
85         </div>
86
87     </div>
88 </t>
89 <t t-name="Menu">
90     <ul>
91         <li t-foreach="data.children" t-as="menu">
92             <a href="#" t-att-data-menu="menu.id">
93                 <span><t t-esc="menu.name"/></span>
94             </a>
95         </li>
96     </ul>
97 </t>
98 <t t-name="Menu.secondary">
99     <div style="display: none" class="menu_accordion" t-att-data-menu-parent="menu.id">
100         <t t-foreach="menu.children" t-as="menu">
101             <t t-set="header">h3</t>
102             <t t-call="Menu.secondary.children"/>
103         </t>
104     </div>
105 </t>
106 <t t-name="Menu.secondary.children">
107     &lt;<t t-esc="header"/>&gt;
108         <a href="#" t-attf-id="menu_#{menu.id}">
109             <span><t t-esc="menu.name"/></span>
110         </a>
111     &lt;/<t t-esc="header"/>&gt;
112     <div class="menu_content">
113         <t t-foreach="menu.children" t-as="menu">
114             <t t-if="!menu.children.length">
115                 <a href="#" class="leaf" t-att-data-menu="menu.id">
116                     <span><t t-esc="menu.name"/></span>
117                 </a>
118             </t>
119             <t t-if="menu.children.length">
120                 <div class="submenu_accordion">
121                     <t t-call="Menu.secondary.children">
122                         <t t-set="header">h4</t>
123                     </t>
124                 </div>
125             </t>
126         </t>
127     </div>
128 </t>
129 <t t-name="ViewManager">
130     <table class="view-manager-main-table">
131     <tr>
132         <td class="view-manager-main-content">
133             <!-- TODO prefix id with the element_id of the controller t-attf-id="#{prefix}_localid" -->
134             <div class="oe_vm_switch">
135                 <t t-foreach="views" t-as="view">
136                     <button type="button" t-att-data-view-type="view[1]">
137                         <t t-esc="view[1]"/>
138                     </button>
139                 </t>
140             </div>
141             <div t-attf-id="#{prefix}_search" t-opentag="true"/>
142             <t t-foreach="views" t-as="view">
143                 <div t-attf-id="#{prefix}_view_#{view[1]}"/>
144             </t>
145         </td>
146         <td class="view-manager-main-sidebar">
147         </td>
148     </tr>
149     </table>
150 </t>
151 <table t-name="ListView">
152     <t t-set="columns_count" t-value="visible_columns.length + (options.selectable ? 1 : 0) + (options.deletable ? 1 : 0)"/>
153     <t t-set="actions_span" t-value="Math.floor((options.deletable or options.addable) ? columns_count/2 : 0)"/>
154     <thead class="ui-widget-header">
155         <tr t-if="options.selectable">
156             <th t-if="actions_span" t-att-colspan="actions_span"
157                 class="oe-actions">
158                 <button type="button" id="oe-list-add"
159                         t-if="options.addable">
160                     <t t-esc="options.addable"/>
161                 </button>
162                 <button type="button" id="oe-list-delete"
163                         t-if="options.deletable">
164                     Delete
165                 </button>
166             </th>
167             <th t-att-colspan="columns_count - actions_span"
168                 class="oe-list-pager">
169                 <button type="button" data-pager-action="first">First</button>
170                 <button type="button" data-pager-action="previous"
171                         >&lt;&lt;</button>
172
173                 <span class="oe-pager-first">1</span>
174                 to <span class="oe-pager-last">1</span>
175                 of <span class="oe-pager-total">1</span>
176
177                 <button type="button" data-pager-action="next">&gt;&gt;</button>
178                 <button type="button" data-pager-action="last">Last</button>
179             </th>
180         </tr>
181         <tr t-if="options.header">
182             <th t-if="options.selectable"/>
183             <t t-foreach="columns" t-as="column">
184                 <th t-if="column.invisible !== '1'" t-att-data-id="column.id"
185                     t-att-class="((options.sortable and column.tag !== 'button') ? 'oe-sortable' : null)">
186                     <t t-if="column.tag !== 'button'">
187                         <t t-esc="column.string"/>
188                         <span t-att-class="(fields_view.sorted.field === column.id) ? ('ui-icon' + (fields_view.sorted.reversed ? ' ui-icon-triangle-1-n' : ' ui-icon-triangle-1-s')) : ''"/>
189                     </t>
190                 </th>
191             </t>
192             <th t-if="options.deletable"/>
193         </tr>
194     </thead>
195 </table>
196 <t t-name="ListView.rows" t-foreach="rows" t-as="row">
197     <t t-call="ListView.row">
198         <t t-set="style" t-value="null"/>
199         <t-if test="row.color">
200             <t t-set="style" t-value="'color: ' + row.color"/>
201         </t-if>
202     </t>
203 </t>
204 <tr t-name="ListView.row" t-att-style="style" t-att-class="row_parity">
205     <th t-if="options.selectable" class="oe-record-selector">
206         <input type="checkbox"/>
207     </th>
208     <t t-foreach="columns" t-as="column">
209         <t t-set="attrs" t-value="column.attrs_for(row.data)"/>
210         <td t-if="column.invisible !== '1'" t-att-title="column.help"
211             class="oe-field-cell">
212             <t t-if="!attrs.invisible">
213                 <t t-set="is_button" t-value="column.tag === 'button'"/>
214                 <!-- TODO: get correct widget from form -->
215                 <t t-if="!is_button and row['data'][column.id].value">
216                     <t t-set="value" t-value="row['data'][column.id].value"/>
217                     <t t-esc="value instanceof Array ? value[1] : value"/>
218                 </t>
219                 <button type="button" t-att-title="column.help"
220                         t-if="is_button">
221                     <img t-att-src="'/base/static/src/img/icons/' + column.icon + '.png'"
222                          t-att-alt="column.string"/>
223                 </button>
224             </t>
225         </td>
226     </t>
227     <td t-if="options.deletable" class='oe-record-delete'>
228         <button type="button" name="delete">â™»</button>
229     </td>
230 </tr>
231 <t t-name="FormView">
232     <h2 class="oe_view_title"><t t-esc="view.fields_view.arch.attrs.string"/></h2>
233     <div class="oe_form_header" t-att-id="view.element_id + '_header'">
234         <div class="oe_form_buttons">
235             <!--<button type="button" class="oe_form_button_save">Save</button>-->
236             <button type="button" class="oe_form_button_save_edit">Save &amp; Edit</button>
237             <!--<button type="button" class="oe_form_button_cancel">Cancel</button>-->
238             <button type="button" class="oe_form_button_new">New</button>
239         </div>
240         <div class="oe_form_pager">
241             <button type="button" data-pager-action="first">First</button>
242             <button type="button" data-pager-action="previous">&lt;&lt;</button>
243
244             <span class="oe_pager_index">0</span> / <span class="oe_pager_count">0</span>
245
246             <button type="button" data-pager-action="next">&gt;&gt;</button>
247             <button type="button" data-pager-action="last">Last</button>
248         </div>
249     </div>
250     <t t-raw="frame.render()"/>
251 </t>
252 <t t-name="Widget">
253     Unhandled widget
254     <t t-raw="console.log('Unhandled widget', widget)"/>
255 </t>
256 <t t-name="WidgetFrame">
257     <table border="0" width="100%" cellpadding="2" cellspacing="2" class="oe_frame">
258     <tr t-foreach="widget.table" t-as="row">
259         <t t-foreach="row" t-as="td">
260             <td t-att-colspan="td.colspan gt 1 ? td.colspan : undefined"
261                 t-att-width="td.width ? td.width : undefined"
262                 t-att-nowrap="td.is_field_label ? 'true' : undefined"
263                 t-att-valign="td.table ? 'top' : undefined"
264                 t-att-id="td.element_id"
265                 t-att-class="'oe_form_' + (td.is_field_label ? 'label' : (td.field ? 'field_' + td.type : td.type))"
266             >
267                 <t t-raw="td.render()"/>
268             </td>
269         </t>
270     </tr>
271     </table>
272 </t>
273 <t t-name="WidgetNotebook">
274     <ul>
275         <li t-foreach="widget.pages" t-as="page">
276             <a t-att-href="'#' + widget.element_id + '-' + page_index">
277                 <t t-esc="page.string"/>
278             </a>
279         </li>
280     </ul>
281     <t t-foreach="widget.pages" t-as="page">
282         <div t-att-id="widget.element_id + '-' + page_index">
283             <t t-raw="page.render()"/>
284         </div>
285     </t>
286 </t>
287 <t t-name="WidgetSeparator">
288     <div t-att-class="'separator ' + (widget.node.attrs.orientation || 'horizontal')">
289         <t t-esc="widget.string"/>
290     </div>
291 </t>
292 <t t-name="WidgetLabel">
293     <label t-att-for="widget.element_id + '_field'"
294            t-att-class="'oe_form_label' + (widget.help ? '_help' : '')"
295            t-att-title="widget.help"
296            t-att-ondblclick="'console.log(\'' + widget.element_id + '\', openerp.screen.' + widget.element_id + ')'">
297         <t t-esc="widget.string"/>
298         <span t-if="widget.help">?</span>
299         <t t-if="widget.string and widget.node.tag != 'label'">:</t>
300     </label>
301 </t>
302 <t t-name="FieldChar">
303     <input type="text"
304         t-att-name="widget.name"
305         t-att-id="widget.element_id + '_field'"
306         t-att-class="'field_' + widget.type" style="width: 100%"
307     />
308 </t>
309 <t t-name="FieldText">
310     <textarea rows="6" style="width: 100%;"
311         t-att-name="widget.name"
312         t-att-id="widget.element_id + '_field'"
313         t-att-class="'field_' + widget.type"
314     ></textarea>
315 </t>
316 <t t-name="FieldDate">
317     <input type="text" style="width: 100%"
318         t-att-name="widget.name"
319         t-att-id="widget.element_id + '_field'"
320         t-att-class="'field_' + widget.type"
321     />
322 </t>
323 <t t-name="FieldDatetime">
324     <input type="text" style="width: 100%"
325         t-att-name="widget.name"
326         t-att-id="widget.element_id + '_field'"
327         t-att-class="'field_' + widget.type"
328     />
329 </t>
330 <t t-name="FieldSelection">
331     <select
332         t-att-name="widget.name"
333         t-att-id="widget.element_id + '_field'"
334         t-att-class="'field_' + widget.type"
335         style="width: 100%">
336             <t t-foreach="widget.field.selection" t-as="options">
337                 <option t-att-value="options[0]">
338                     <t t-esc="options[1]"/>
339                 </option>
340             </t>
341     </select>
342 </t>
343 <t t-name="FieldMany2One">
344     <input type="text"
345         t-att-name="widget.name"
346         t-att-id="widget.element_id + '_field'"
347         t-att-class="'field_' + widget.type"
348         style="width: 100%;"/>
349 </t>
350 <t t-name="FieldOne2Many">
351     <div t-att-id="widget.element_id">
352         One2Many widget
353     </div>
354 </t>
355 <t t-name="FieldMany2Many">
356     <div t-att-id="widget.list_id"></div>
357 </t>
358 <t t-name="FieldReference">
359     <input type="text" t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%" placeholder="Widget Reference"/>
360 </t>
361 <t t-name="FieldBoolean">
362     <input type="checkbox"
363         t-att-name="widget.name"
364         t-att-id="widget.element_id + '_field'"
365         t-att-class="'field_' + widget.type"/>
366 </t>
367 <t t-name="FieldProgressBar">
368     <div t-opentag="true"></div>
369 </t>
370 <t t-name="WidgetButton">
371     <button type="button"
372         t-att-id="widget.element_id + '_button'"
373         t-att-title="widget.help"
374         style="width: 100%" class="button">
375         <img t-if="widget.node.attrs.icon" t-att-src="'/base/static/src/img/icons/' + widget.node.attrs.icon + '.png'" width="16" height="16"/>
376         <span t-if="widget.string"><t t-esc="widget.string"/></span>
377     </button>
378 </t>
379 <t t-name="SearchView">
380     <h2 class="oe_view_title"><t t-esc="view.attrs['string']"/></h2>
381     <form>
382         <t t-call="SearchView.render_lines"/>
383         <div style="text-align:right;">
384             <input type="submit" value="Search"/>
385             <input type="reset" value="Clear"/>
386         </div>
387     </form>
388 </t>
389 <t t-name="SearchView.render_lines">
390     <table class="oe-searchview-render-line" border="0" cellspacing="0" cellpadding="0"
391            t-foreach="lines" t-as="line">
392         <tr>
393             <td t-foreach="line" t-as="widget">
394                 <t t-raw="widget.render(defaults)"/>
395             </td>
396         </tr>
397     </table>
398 </t>
399 <button t-name="SearchView.filter" type="button"
400         t-att-id="element_id"
401         t-att-title="attrs.help"
402         t-att-class="classes.join(' ')"
403         t-att-autofocus="attrs.default_focus === '1' ? 'autofocus' : undefined">
404     <img t-if="attrs.icon" t-att-src="'/base/static/src/img/icons/' + attrs.icon + '.png'" width="16" height="16"/>
405     <br t-if="attrs.icon and attrs.string"/>
406     <t t-esc="attrs.string"/>
407 </button>
408 <span t-name="SearchView.filters" class="filter_label_group"
409     ><t t-foreach="filters" t-as="filter"
410         ><t t-raw="filter.render(defaults)"/></t
411 ></span>
412 <t t-name="SearchView.field">
413     <label style="display: block" t-att-title="attrs.help"
414            t-att-for="element_id">
415         <t t-esc="attrs.string || attrs.name"/>
416         <span t-if="attrs.help">(?)</span>
417     </label>
418     <div style="white-space: nowrap;">
419         <input type="text" t-att-name="attrs.name"
420                t-att-autofocus="attrs.default_focus === '1' ? 'autofocus' : undefined"
421                t-att-id="element_id"
422                t-att-value="defaults[attrs.name] || ''"/>
423         <t t-if="filters.length" t-raw="filters.render(defaults)"/>
424     </div>
425 </t>
426 <t t-name="SearchView.fields.date">
427     <label style="display: block" t-att-title="attrs.help"
428            t-att-for="element_id">
429         <t t-esc="attrs.string || attrs.name"/>
430         <span t-if="attrs.help">(?)</span>
431     </label>
432     <div style="white-space: nowrap;" t-att-id="element_id">
433         <input t-att-name="attrs.name" type="text" class="field_date"
434                t-att-value="defaults[attrs.name] || ''"
435                t-att-autofocus="attrs.default_focus === '1' ? 'autofocus' : undefined"/>
436         to
437         <input t-att-name="attrs.name" type="text" class="field_date"
438                t-att-value="defaults[attrs.name] || ''"/>
439         <t t-if="filters.length" t-raw="filters.render(defaults)"/>
440     </div>
441 </t>
442 <t t-name="SearchView.field.selection">
443     <label style="display: block" t-att-title="attrs.help"
444            t-att-for="element_id">
445         <t t-esc="attrs.string || attrs.name"/>
446         <span t-if="attrs.help">(?)</span>
447     </label>
448     <div style="white-space: nowrap;">
449         <select t-att-name="attrs.name" t-att-id="element_id"
450                 t-att-autofocus="attrs.default_focus === '1' || undefined">
451             <option/>
452             <t t-foreach="attrs.selection" t-as="option">
453                 <t t-set="selected" t-value="defaults[attrs.name] === option[0]"/>
454                 <option t-if="selected"
455                         t-att-value="option[0]" selected="selected">
456                     <t t-esc="option[1]"/>
457                 </option>
458                 <option t-if="!selected" t-att-value="option[0]">
459                     <t t-esc="option[1]"/>
460                 </option>
461             </t>
462         </select>
463         <t t-if="filters.length" t-raw="filters.render(defaults)"/>
464     </div>
465 </t>
466 <t t-name="SearchView.util.expand">
467     <div t-att-class="'searchview_group ' + (expand == '0' ? 'folded' : 'expanded')"
468          t-att-id="element_id">
469         <a t-if="label" class="searchview_group_string" href="#">
470             <t t-esc="label"/>
471         </a>
472         <div class="searchview_group_content">
473             <t t-raw="content"/>
474         </div>
475     </div>
476 </t>
477 <t t-name="SearchView.group">
478     <t t-call="SearchView.util.expand">
479         <t t-set="expand" t-value="attrs.expand"/>
480         <t t-set="label" t-value="attrs.string"/>
481         <t t-set="content">
482             <t t-call="SearchView.render_lines"/>
483         </t>
484     </t>
485 </t>
486 <t t-name="SearchView.extended_search">
487     <t t-call="SearchView.util.expand">
488         <t t-set="expand" t-value="false"/>
489         <t t-set="label" t-value="'Custom Filters'"/>
490         <t t-set="content">
491             <div class="searchview_extended_groups_list"/>
492             <button class="searchview_extended_add_group"
493                     type="button">Add group of conditions</button>
494         </t>
495     </t>
496 </t>
497 <t t-name="SearchView.extended_search.group">
498     <div t-att-id="element_id" class="searchview_extended_group">
499         <select class="searchview_extended_group_choice">
500             <option value="all">All the following conditions must match</option>
501             <option value="any">Any of the following conditions must match</option>
502             <option value="none">None of the following conditions must match</option>
503         </select>
504         <button class="searchview_extended_delete_group"
505                 type="button">Delete this group of conditions</button>
506         <div class="searchview_extended_propositions_list">
507         </div>
508         <button class="searchview_extended_add_proposition" type="button">Add condition</button>
509     </div>
510 </t>
511 <t t-name="SearchView.extended_search.proposition">
512     <div t-att-id="element_id">
513         <select class="searchview_extended_prop_field">
514             <t t-foreach="attrs.fields" t-as="field">
515                 <option t-att="{'selected': field === attrs.selected ? 'selected' : null}"
516                         t-att-value="field.name">
517                     <t t-esc="field.string"/>
518                 </option>
519             </t>
520         </select>
521         <select class="searchview_extended_prop_op"/>
522         <span class="searchview_extended_prop_value"/>
523         <button class="searchview_extended_delete_prop"
524                 type="button">Delete this condition</button>
525     </div>
526 </t>
527 <t t-name="SearchView.extended_search.proposition.char">
528     <input t-att-id="element_id"/>
529 </t>
530 <t t-name="ViewManager.sidebar">
531     <div t-att-id="element_id" class="sidebar-main-div open-sidebar">
532
533     </div>
534 </t>
535 <t t-name="ViewManager.sidebar.internal">
536     <t t-js="d">
537         d.the_condition = d.sections.length &gt; 0 &amp;&amp; d._.detect(d.sections, function(x) {
538             return x.elements.length &gt; 0;
539         }) != undefined
540     </t>
541     <t t-if="the_condition">
542         <a class="toggle-sidebar"></a>
543         <div t-att-id="element_id" class="sidebar-sub-div">
544             <div class="sidebar-displaying-div">
545                 <t t-set="i" t-value="0"/>
546                 <t t-foreach="sections" t-as="section">
547                     <t t-if="section.elements.length &gt; 0">
548                     <h2><t t-esc="section.label"/></h2>
549                     <ul>
550                         <t t-set="j" t-value="0"/>
551                         <t t-foreach="section.elements" t-as="element">
552                             <li><a t-att-data-i="i" t-att-data-j="j" href="#"><t t-esc="element.name"/></a></li>
553                             <t t-set="j" t-value="j+1"/>
554                         </t>
555                     </ul>
556                     </t>
557                     <t t-set="i" t-value="i+1"/>
558                 </t>
559             </div>
560         </div>
561     </t>
562 </t>
563 <t t-name="DialogWarning">
564     <div id="dialog-message" t-att-title="title">
565         <p>
566             <span class="ui-icon ui-icon-circle-check" style="float:left; margin:0 7px 50px 0;"></span>
567             <t t-esc="message"/>
568         </p>
569     </div>
570 </t>
571 </templates>