fields: display ItemsField using <ul> on summary page if possible (#44123)
This commit is contained in:
parent
149c73db4f
commit
d44e6155ee
|
@ -155,6 +155,45 @@ def test_items():
|
|||
assert field.get_options() == [('1', 'foo', '1'), ('2', 'bar', '2')]
|
||||
assert field.get_options() == [('1', 'foo', '1'), ('2', 'bar', '2')] # twice for cached behaviour
|
||||
|
||||
# if labels are available, display using <ul>
|
||||
field = fields.ItemsField()
|
||||
view_value = field.get_view_value('a, b', value_id=['1', '2'], labels=['a', 'b'])
|
||||
elems = BeautifulSoup(str(view_value)).find('ul').find_all('li')
|
||||
assert len(elems) == 2
|
||||
assert elems[0].text == 'a'
|
||||
assert elems[1].text == 'b'
|
||||
|
||||
|
||||
def test_items_get_value_info():
|
||||
# no data source : labels are available
|
||||
field = fields.ItemsField(id='1', items=['a', 'b', 'c'])
|
||||
assert field.get_value_info({'1': ['un', 'deux'], '1_display': 'un, deux'}) == (
|
||||
'un, deux',
|
||||
{'value_id': ['un', 'deux'], 'labels': ['un', 'deux']},
|
||||
)
|
||||
|
||||
# data source with structured : labels are available
|
||||
field = fields.ItemsField(id='1')
|
||||
field.data_source = {'type': 'formula', 'value': '''[('1', 'un'), ('2', 'deux')]'''}
|
||||
assert field.get_value_info(
|
||||
{
|
||||
'1': ['un', 'deux'],
|
||||
'1_display': 'un, deux',
|
||||
'1_structured': [{'id': '1', 'text': 'un'}, {'id': '2', 'text': 'deux'}],
|
||||
}
|
||||
) == (
|
||||
'un, deux',
|
||||
{'value_id': ['un', 'deux'], 'labels': ['un', 'deux']},
|
||||
)
|
||||
|
||||
# data source with no strucured : no labels
|
||||
field = fields.ItemsField(id='1')
|
||||
field.data_source = {'type': 'formula', 'value': '''[('1', 'un'), ('2', 'deux')]'''}
|
||||
assert field.get_value_info({'1': ['un', 'deux'], '1_display': 'un, deux'}) == (
|
||||
'un, deux',
|
||||
{'value_id': ['un', 'deux'], 'labels': []},
|
||||
)
|
||||
|
||||
|
||||
def test_password():
|
||||
assert fields.PasswordField().get_view_value('xxx') == '●' * 8
|
||||
|
|
|
@ -2224,7 +2224,30 @@ class ItemsField(WidgetField, ItemFieldMixin):
|
|||
except TypeError:
|
||||
raise ValueError('invalid data for items type (%r)' % value)
|
||||
|
||||
def get_value_info(self, data):
|
||||
value, value_details = super().get_value_info(data)
|
||||
labels = []
|
||||
if not self.data_source:
|
||||
value_id = value_details.get('value_id')
|
||||
if value_id:
|
||||
labels = value_id.copy()
|
||||
else:
|
||||
structured_values = self.get_structured_value(data)
|
||||
if structured_values:
|
||||
labels = [x['text'] for x in structured_values]
|
||||
value_details['labels'] = labels
|
||||
return (value, value_details)
|
||||
|
||||
def get_view_value(self, value, **kwargs):
|
||||
if kwargs.get('labels'):
|
||||
# summary page and labels are available
|
||||
r = TemplateIO(html=True)
|
||||
r += htmltext('<ul>')
|
||||
for x in kwargs['labels']:
|
||||
r += htmltext('<li>%s</li>' % x)
|
||||
r += htmltext('</ul>')
|
||||
return r.getvalue()
|
||||
|
||||
if type(value) is str: # == display_value
|
||||
return value
|
||||
if value:
|
||||
|
|
|
@ -301,6 +301,11 @@ div.dataview .value {
|
|||
margin-left: 1em;
|
||||
}
|
||||
|
||||
div.dataview div.field-type-items .value ul {
|
||||
margin-top: 0;
|
||||
margin-bottom : 0;
|
||||
}
|
||||
|
||||
div.dataview .field-type-block > .value {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue