3
3
MoinMoin - DataBrowserWidget
5
@copyright: 2002 by J�rgen Hermann <jh@web.de>
5
@copyright: 2002 Juergen Hermann <jh@web.de>
6
6
@license: GNU GPL, see COPYING for details.
9
9
from MoinMoin.widget import base
10
from MoinMoin import wikiutil
12
12
class DataBrowserWidget(base.Widget):
14
def __init__(self, request, **kw):
14
def __init__(self, request, show_header=True, **kw):
15
16
base.Widget.__init__(self, request, **kw)
19
# prefixed with __ are untranslated and to be used in the JS
20
self._all = _('[all]')
22
self._notempty = _('[not empty]')
23
self.__notempty = '[notempty]'
24
self._empty = _('[empty]')
25
self.__empty = '[empty]'
26
self._filter = _('filter')
27
self.__filter = 'filter'
28
self._show_header = show_header
18
30
def setData(self, dataset):
19
31
""" Sets the data for the browser (see MoinMoin.util.dataset).
21
@param dataset: dataset containg either ascii or unicode
33
@param dataset: dataset containing either ascii, unicode or tuples.
34
If a dataset entry contains a tuple then the first
35
item in the tuple is displayed and the second item
36
is used for autofilters.
23
38
self.data = dataset
40
self.data_id = 'dbw.%s.' % dataset.data_id
42
def _name(self, elem):
43
""" return name tag for a HTML element
44
@param elem: element name, will be prefixed by data id
46
return 'name="%s%s"' % (self.data_id, elem)
48
def _makeoption(self, item, selected, ntitem=None):
49
""" create an option for a <select> form element
50
@param item: string containing the item name to show
51
@param selected: indicates whether the item should be default or not
54
selected = ' selected'
57
assert(isinstance(item, basestring))
60
return '<option value="%s"%s>%s</option>' % (
61
wikiutil.escape(ntitem, True),
63
wikiutil.escape(item))
65
def _filteroptions(self, idx):
66
""" create options for all elements in the column
70
row = self.data.next()
71
# [empty] is a special already
75
name = '%sfilter%d' % (self.data_id, idx)
76
if name in self.request.form:
77
value = self.request.form[name][0]
80
if isinstance(option, tuple):
82
if not option in unique:
84
row = self.data.next()
86
# fill in the empty field we left blank
89
result = [self._makeoption(item, item == value) for item in unique]
90
common = [None, None, None]
91
common[0] = self._makeoption(self._all, value == self.__all, self.__all)
92
common[1] = self._makeoption(self._empty, value == self.__empty, self.__empty)
93
common[2] = self._makeoption(self._notempty, value == self.__notempty, self.__notempty)
94
return '\n'.join(common + result)
26
97
fmt = self.request.formatter
29
result.append(fmt.table(1))
100
result.append(fmt.rawHTML('<form action="%s/%s" method="GET" name="%sform">' % (self.request.getScriptname(), wikiutil.quoteWikinameURL(self.request.page.page_name), self.data_id)))
101
result.append(fmt.div(1))
104
for col in self.data.columns:
109
result.append(fmt.rawHTML('<input type="submit" value="%s" %s>' % (self._filter, self._name('submit'))))
111
result.append(fmt.table(1, id='%stable' % self.data_id))
32
result.append(fmt.table_row(1))
33
for col in self.data.columns:
34
if col.hidden: continue
35
result.append(fmt.table_cell(1))
36
result.append(fmt.strong(1))
37
result.append(col.label or col.name)
38
result.append(fmt.strong(0))
39
result.append(fmt.table_cell(0))
40
result.append(fmt.table_row(0))
44
row = self.data.next()
114
if self._show_header:
46
115
result.append(fmt.table_row(1))
47
for idx in range(len(row)):
48
if self.data.columns[idx].hidden: continue
116
for idx in range(len(self.data.columns)):
117
col = self.data.columns[idx]
49
120
result.append(fmt.table_cell(1))
50
result.append(unicode(row[idx]))
121
result.append(fmt.strong(1))
122
result.append(col.label or col.name)
123
result.append(fmt.strong(0))
126
result.append(fmt.linebreak(False))
127
select = '<select %s onchange="dbw_update_search(\'%s\');">%s</select>' % (
128
self._name('filter%d' % idx),
130
self._filteroptions(idx))
131
result.append(fmt.rawHTML(select))
51
133
result.append(fmt.table_cell(0))
52
134
result.append(fmt.table_row(0))
138
row = self.data.next()
140
filters = [None] * len(row)
143
for idx in range(len(row)):
144
name = '%sfilter%d' % (self.data_id, idx)
145
if name in self.request.form:
146
filters[idx] = self.request.form[name][0]
147
if filters[idx] == self._all:
154
# check if row needs to be hidden due to filtering
155
for idx in range(len(row)):
157
if isinstance(row[idx], tuple):
158
data = unicode(row[idx][1])
160
data = unicode(row[idx])
161
if data != '' and filters[idx] == self._notempty:
163
if data == '' and filters[idx] == self._empty:
165
if data != filters[idx]:
170
result.append(fmt.table_row(1))
171
for idx in range(len(row)):
172
if self.data.columns[idx].hidden:
174
if isinstance(row[idx], tuple):
175
result.append(fmt.table_cell(1, abbr=unicode(row[idx][1])))
176
result.append(unicode(row[idx][0]))
178
result.append(fmt.table_cell(1))
179
result.append(unicode(row[idx]))
180
result.append(fmt.table_cell(0))
181
result.append(fmt.table_row(0))
53
183
row = self.data.next()
55
185
result.append(fmt.table(0))
186
result.append(fmt.div(0))
187
result.append(fmt.rawHTML('</form>'))
56
188
return ''.join(result)
190
toHTML = format # old name of "format" function DEPRECATED, will be removed in 1.7
60
self.request.write(self.toHTML())
193
self.request.write(self.format())