Add support for editing catalog cost in receiving batch, per new theme
had to add several "under the hood" features to make this work, to embed a Vue component within grid `<td>` cells, etc.
This commit is contained in:
parent
ec71f532a1
commit
2e3823364c
7 changed files with 296 additions and 27 deletions
|
@ -68,11 +68,49 @@ class FieldList(list):
|
|||
class Grid(object):
|
||||
"""
|
||||
Core grid class. In sore need of documentation.
|
||||
|
||||
.. attribute:: raw_renderers
|
||||
|
||||
Dict of "raw" field renderers. See also
|
||||
:meth:`set_raw_renderer()`.
|
||||
|
||||
When present, these are rendered "as-is" into the grid
|
||||
template, whereas the more typical scenario involves rendering
|
||||
each field "into" a span element, like:
|
||||
|
||||
.. code-block:: html
|
||||
|
||||
<span v-html="RENDERED-FIELD"></span>
|
||||
|
||||
So instead of injecting into a span, any "raw" fields defined
|
||||
via this dict, will be injected as-is, like:
|
||||
|
||||
.. code-block:: html
|
||||
|
||||
RENDERED-FIELD
|
||||
|
||||
Note that each raw renderer is called only once, and *without*
|
||||
any arguments. Likely the only use case for this, is to inject
|
||||
a Vue component into the field. A basic example::
|
||||
|
||||
from webhelpers2.html import HTML
|
||||
|
||||
def myrender():
|
||||
return HTML.tag('my-component', **{'v-model': 'props.row.myfield'})
|
||||
|
||||
grid = Grid(
|
||||
# ..normal constructor args here..
|
||||
|
||||
raw_renderers={
|
||||
'myfield': myrender,
|
||||
},
|
||||
)
|
||||
"""
|
||||
|
||||
def __init__(self, key, data, columns=None, width='auto', request=None,
|
||||
model_class=None, model_title=None, model_title_plural=None,
|
||||
enums={}, labels={}, assume_local_times=False, renderers={}, invisible=[],
|
||||
raw_renderers={},
|
||||
extra_row_class=None, linked_columns=[], url='#',
|
||||
joiners={}, filterable=False, filters={}, use_byte_string_filters=False,
|
||||
searchable={},
|
||||
|
@ -109,6 +147,7 @@ class Grid(object):
|
|||
self.labels = labels or {}
|
||||
self.assume_local_times = assume_local_times
|
||||
self.renderers = self.make_default_renderers(renderers or {})
|
||||
self.raw_renderers = raw_renderers or {}
|
||||
self.invisible = invisible or []
|
||||
self.extra_row_class = extra_row_class
|
||||
self.linked_columns = linked_columns or []
|
||||
|
@ -286,6 +325,21 @@ class Grid(object):
|
|||
def set_renderer(self, key, renderer):
|
||||
self.renderers[key] = renderer
|
||||
|
||||
def set_raw_renderer(self, key, renderer):
|
||||
"""
|
||||
Set or remove the "raw" renderer for the given field.
|
||||
|
||||
See :attr:`raw_renderers` for more about these.
|
||||
|
||||
:param key: Field name.
|
||||
|
||||
:param renderer: Either a renderer callable, or ``None``.
|
||||
"""
|
||||
if renderer:
|
||||
self.raw_renderers[key] = renderer
|
||||
else:
|
||||
self.raw_renderers.pop(key, None)
|
||||
|
||||
def set_type(self, key, type_):
|
||||
if type_ == 'boolean':
|
||||
self.set_renderer(key, self.render_boolean)
|
||||
|
@ -1313,7 +1367,10 @@ class Grid(object):
|
|||
# iterate over data rows
|
||||
for i in range(count):
|
||||
rowobj = raw_data[i]
|
||||
row = {}
|
||||
|
||||
# nb. cache 0-based index on the row, in case client-side
|
||||
# logic finds it useful
|
||||
row = {'_index': i}
|
||||
|
||||
# sometimes we need to include some "raw" data columns in our
|
||||
# result set, even though the column is not displayed as part of
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue