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:
Lance Edgar 2022-12-05 14:03:03 -06:00
parent ec71f532a1
commit 2e3823364c
7 changed files with 296 additions and 27 deletions

View file

@ -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