source: main/waeup.sirp/trunk/src/waeup/sirp/widgets/table.txt @ 6006

Last change on this file since 6006 was 5868, checked in by uli, 14 years ago

Fix test.

File size: 4.1 KB
Line 
1waeup.sirp.widgets
2******************
3
4Widgets for the WAeUP SRP.
5
6
7.. :doctest:
8.. :layer: waeup.sirp.testing.WAeUPSIRPUnitTestLayer
9
10Tables
11======
12
13    >>> from waeup.sirp.widgets.table import Col, Table
14    >>> id = Col(
15    ...       header='Id', width=100, sortable=True, type='int',
16    ...       data = (1, 2, 3))
17    >>> mycol1 = Col(
18    ...       header='Column 1', width=100, sortable=True,
19    ...       data = ('bli', 'bla', 'blub'))
20
21    >>> mycol2 = Col(
22    ...     header='Column 2', width=100, sortable=True,
23    ...     data = ('schwi', 'schwa', 'schwafel'))
24
25    >>> table = Table('My Table', cols=(id, mycol1, mycol2))
26    >>> print table.renderHTML()
27    <div id="mytable-tablecontainer"><table id="mytable-table"><thead><tr><th>Id</th><th>Column 1</th><th>Column 2</th></tr></thead>
28    ...<tbody><tr>
29    ...<td>1</td><td>bli</td><td>schwi</td>
30    ...</tr><tr>
31    ...<td>2</td><td>bla</td><td>schwa</td>
32    ...</tr><tr>
33    ...<td>3</td><td>blub</td><td>schwafel</td>
34    ...</tr></tbody></table></div>
35
36    >>> print table.internal_title
37    mytable
38
39YUITable
40--------
41
42A YUI table extends a regular table by adding some JavaScript
43code-generation facilities suitable for rendering YUI based
44datatables. Futhermore they provide a `need` method, which includes
45all needed YUI scripts and stylesheets.
46
47
48    >>> from waeup.sirp.widgets.table import YUITable
49    >>> table = YUITable('My YUI Table', cols=(id, mycol1, mycol2))
50    >>> print table.getJSTableCode()
51    <BLANKLINE>
52    YAHOO.util.Event.addListener(window, "load", function() {...
53    ...
54    draggableColumns:true });
55    });
56
57Naturally, YUITable objects are suited for use by views.
58
59
60YUIStaticTableView
61==================
62
63This is a view named ``yuistatictables.js`` which from a users'
64perspective can be used like a static file. It is, however, not
65static, but returns the JavaScript code suitable for a given table.
66
67We define some content object that contains a table for which we want
68the JavaScript to be generated:
69
70    >>> class SomeContent(object):
71    ...   mytable = table
72
73    >>> obj = SomeContent()
74
75Now we need an adapter, that knows how to get a table from this kind
76of object. The YUIStaticTableView looks up such an adapter for a given
77context to find a table to manage. The adapter has to implement
78`ITableProvider` from `waeup.sirp.widgets.interfaces` and should provide a
79`getTables` method.
80
81We define and register such an adapter using grok:
82
83    >>> import grok
84    >>> from waeup.sirp.widgets.interfaces import ITableProvider
85    >>> class TableAdapter(grok.Adapter):
86    ...   grok.context(SomeContent)
87    ...   grok.provides(ITableProvider)
88    ...
89    ...   def getTables(self):
90    ...     # We know that our context stores a table in `mytable`
91    ...     return (self.context.mytable,)
92    >>> grok.testing.grok_component('TableAdapter', TableAdapter)
93    True
94
95Now let's get a view on the object defined above. We want the view
96named ``yuistatictables.js``:
97
98    >>> from zope.publisher.browser import TestRequest
99    >>> from zope.component import getMultiAdapter
100    >>> from zope.interface import Interface
101    >>> view = getMultiAdapter((obj, TestRequest()), Interface,
102    ...                        name='yuistatictables.js')
103    >>> view
104    <waeup.sirp.widgets.table.YUIStaticTableView object at 0x...>
105
106When we call the view we get pure JavaScript:
107
108    >>> print view()
109    <BLANKLINE>
110    YAHOO.util.Event.addListener(window, "load", function() {
111    ...
112    draggableColumns:true });
113    });
114
115Table views for objects that have no table
116------------------------------------------
117
118What happens, when no `ITableProvider` can be found for an object? The
119view will return a script with a comment only.
120
121Let's try this with a simple object for which no adapter is
122registered. We can get the view:
123
124    >>> obj = object()
125    >>> view = getMultiAdapter((obj, TestRequest()), Interface,
126    ...                        name='yuistatictables.js')
127    >>> view
128    <waeup.sirp.widgets.table.YUIStaticTableView object at 0x...>
129
130But if we call this adapter, we will get an empty result, because
131there is no ITableProvider adapter registered for the 'viewed' object:
132
133    >>> view()
134    u'/* No content */'
Note: See TracBrowser for help on using the repository browser.