diff --git a/combo/apps/wcs/templates/combo/wcs/card-field-value.html b/combo/apps/wcs/templates/combo/wcs/card-field-value.html index 37688a22..6615efa8 100644 --- a/combo/apps/wcs/templates/combo/wcs/card-field-value.html +++ b/combo/apps/wcs/templates/combo/wcs/card-field-value.html @@ -16,10 +16,20 @@ {% elif field.type == "email" and value is not None and not empty %} {{ value }} {% elif field.type == 'file' and value %} - {% if value.content_type|startswith:"image/" %} - + {% if item and item.file_display_mode == 'thumbnail' %} + + {% if value.thumbnail_url %} + + {% else %} + {{ value.filename }} + {% endif %} + {% else %} - {{ value.filename }} + {% if value.content_type|startswith:"image/" %} + + {% else %} + {{ value.filename }} + {% endif %} {% endif %} {% else %} {{ value|default:""|urlize }} diff --git a/combo/apps/wcs/templates/combo/wcs/manager/card-cell-form-display.html b/combo/apps/wcs/templates/combo/wcs/manager/card-cell-form-display.html index 244e72c5..40508cf5 100644 --- a/combo/apps/wcs/templates/combo/wcs/manager/card-cell-form-display.html +++ b/combo/apps/wcs/templates/combo/wcs/manager/card-cell-form-display.html @@ -55,7 +55,7 @@

@@ -68,7 +68,7 @@

-

+

+

+ +

+

+

+

diff --git a/combo/manager/static/js/combo.manager.js b/combo/manager/static/js/combo.manager.js index 447a6d94..0b9d786e 100644 --- a/combo/manager/static/js/combo.manager.js +++ b/combo/manager/static/js/combo.manager.js @@ -430,7 +430,7 @@ $(function() { $('[data-dynamic-display-parent]').off('change input').on('change input', function() { var sel1 = '[data-dynamic-display-child-of="' + $(this).attr('name') + '"]'; var sel2 = '[data-dynamic-display-value="' + $(this).val() + '"]'; - var sel3 = '[data-dynamic-display-value-in*="' + $(this).val() + '"]'; + var sel3 = '[data-dynamic-display-value-in*=" ' + $(this).val() + ' "]'; $(sel1).addClass('field-hidden').hide(); $(sel1 + sel2).removeClass('field-hidden').show(); $(sel1 + sel3).removeClass('field-hidden').show(); @@ -583,26 +583,28 @@ Card_cell_custom.prototype = { this.grid_cell_form.field_varname= this.grid_cell_form[1]; this.grid_cell_form.field_content = this.grid_cell_form[2]; this.grid_cell_form.field_display_mode = this.grid_cell_form[3]; - this.grid_cell_form.field_empty_display_mode = this.grid_cell_form[4]; - this.grid_cell_form.field_empty_text = this.grid_cell_form[5]; - this.grid_cell_form.custom_template = this.grid_cell_form[6]; - this.grid_cell_form.custom_display_mode = this.grid_cell_form[7]; - this.grid_cell_form.link_label_template = this.grid_cell_form[8]; - this.grid_cell_form.link_page = this.grid_cell_form[9]; - this.grid_cell_form.link_url_template = this.grid_cell_form[10]; - this.grid_cell_form.link_display_mode = this.grid_cell_form[11]; - this.grid_cell_form.size = this.grid_cell_form[12]; + this.grid_cell_form.file_field_display_mode = this.grid_cell_form[4]; + this.grid_cell_form.field_empty_display_mode = this.grid_cell_form[5]; + this.grid_cell_form.field_empty_text = this.grid_cell_form[6]; + this.grid_cell_form.custom_template = this.grid_cell_form[7]; + this.grid_cell_form.custom_display_mode = this.grid_cell_form[8]; + this.grid_cell_form.link_label_template = this.grid_cell_form[9]; + this.grid_cell_form.link_page = this.grid_cell_form[10]; + this.grid_cell_form.link_url_template = this.grid_cell_form[11]; + this.grid_cell_form.link_display_mode = this.grid_cell_form[12]; + this.grid_cell_form.size = this.grid_cell_form[13]; } else { this.grid_cell_form.entry_type = this.grid_cell_form[0]; this.grid_cell_form.field_varname= this.grid_cell_form[1]; - this.grid_cell_form.field_empty_text = this.grid_cell_form[2]; - this.grid_cell_form.custom_header = this.grid_cell_form[3]; - this.grid_cell_form.custom_template = this.grid_cell_form[4]; - this.grid_cell_form.linke_header = this.grid_cell_form[5]; - this.grid_cell_form.link_label_template = this.grid_cell_form[6]; - this.grid_cell_form.link_page = this.grid_cell_form[7]; - this.grid_cell_form.link_url_template = this.grid_cell_form[8]; - this.grid_cell_form.link_display_mode = this.grid_cell_form[9]; + this.grid_cell_form.file_field_display_mode = this.grid_cell_form[2]; + this.grid_cell_form.field_empty_text = this.grid_cell_form[3]; + this.grid_cell_form.custom_header = this.grid_cell_form[4]; + this.grid_cell_form.custom_template = this.grid_cell_form[5]; + this.grid_cell_form.linke_header = this.grid_cell_form[6]; + this.grid_cell_form.link_label_template = this.grid_cell_form[7]; + this.grid_cell_form.link_page = this.grid_cell_form[8]; + this.grid_cell_form.link_url_template = this.grid_cell_form[9]; + this.grid_cell_form.link_display_mode = this.grid_cell_form[10]; } }, grid_cell__init_form: function() { @@ -698,7 +700,7 @@ Card_cell_custom.prototype = { } else if (schema_cell.link_field) { let link_field = _self.field_with_varname(schema_cell.link_field) if (link_field) { - cell_content += link_field.label + ' ( ' + gettext('File') + ')'; + cell_content += link_field.label + ' (' + gettext('File') + ')'; } } else { cell_content += (schema_cell.url_template || ''); @@ -723,8 +725,11 @@ Card_cell_custom.prototype = { cell_display_mode_label += ' - '; cell_display_mode_label += $(this.grid_cell_form).find('select[name="field_display_mode"] option[value="' + (schema_cell.display_mode || 'text') + '"]').text(); } + if (schema_field && schema_field.type == 'file') { + cell_display_mode_label += ' (' + $(this.grid_cell_form).find('select[name="file_field_display_mode"] option[value="' + (schema_cell.file_display_mode || 'link') + '"]').text() + ')'; + } } - if (this.display_mode == 'card' || schema_cell.varname == '@link@') { + if (cell_display_mode_label) { cell_text += '' + cell_display_mode_label + ''; } if (this.display_mode == 'table' && ['@link@', '@custom@'].includes(schema_cell.varname)) { @@ -763,6 +768,7 @@ Card_cell_custom.prototype = { this.grid_cell_form.field_varname.value = ''; this.grid_cell_form.field_content.value = ''; this.grid_cell_form.field_display_mode.value = ''; + this.grid_cell_form.file_field_display_mode.value = ''; this.grid_cell_form.field_empty_display_mode.value = ''; this.grid_cell_form.field_empty_text.value = ''; this.grid_cell_form.custom_template.value = grid_cell.dataset.template || ''; @@ -776,6 +782,7 @@ Card_cell_custom.prototype = { this.grid_cell_form.field_varname.value = ''; this.grid_cell_form.field_content.value = ''; this.grid_cell_form.field_display_mode.value = ''; + this.grid_cell_form.file_field_display_mode.value = ''; this.grid_cell_form.field_empty_display_mode.value = ''; this.grid_cell_form.field_empty_text.value = ''; this.grid_cell_form.custom_template.value = ''; @@ -798,6 +805,8 @@ Card_cell_custom.prototype = { } else { this.grid_cell_form.field_display_mode.value = grid_cell.dataset.display_mode || 'text'; } + let schema_field = this.field_with_varname(grid_cell.dataset.varname); + this.grid_cell_form.file_field_display_mode.value = grid_cell.dataset.file_display_mode || 'link'; if (grid_cell.dataset.empty_value != '@skip@' && grid_cell.dataset.empty_value != '@empty@') { this.grid_cell_form.field_empty_display_mode.value = '@custom@'; this.grid_cell_form.field_empty_text.value = grid_cell.dataset.empty_value || ''; @@ -817,6 +826,7 @@ Card_cell_custom.prototype = { if (grid_cell.dataset.varname == '@custom@') { this.grid_cell_form.entry_type.value = '@custom@'; this.grid_cell_form.field_varname.value = ''; + this.grid_cell_form.file_field_display_mode.value = ''; this.grid_cell_form.field_empty_text.value = ''; this.grid_cell_form.custom_header.value = grid_cell.dataset.header || ''; this.grid_cell_form.custom_template.value = grid_cell.dataset.template || ''; @@ -827,6 +837,7 @@ Card_cell_custom.prototype = { } else if (grid_cell.dataset.varname == '@link@') { this.grid_cell_form.entry_type.value = '@link@'; this.grid_cell_form.field_varname.value = ''; + this.grid_cell_form.file_field_display_mode.value = ''; this.grid_cell_form.field_empty_text.value = ''; this.grid_cell_form.custom_header.value = ''; this.grid_cell_form.custom_template.value = ''; @@ -843,6 +854,8 @@ Card_cell_custom.prototype = { } else { this.grid_cell_form.entry_type.value = '@field@'; this.grid_cell_form.field_varname.value = grid_cell.dataset.varname; + let schema_field = this.field_with_varname(grid_cell.dataset.varname); + this.grid_cell_form.file_field_display_mode.value = grid_cell.dataset.file_display_mode || 'link'; this.grid_cell_form.field_empty_text.value = grid_cell.dataset.empty_value || ''; if (['@skip@', '@empty@'].includes(this.grid_cell_form.field_empty_text.value)) { this.grid_cell_form.field_empty_text.value = ''; @@ -887,6 +900,7 @@ Card_cell_custom.prototype = { delete schema_cell.field_content; delete schema_cell.empty_value; schema_cell.display_mode = form_datas.custom_display_mode; + delete schema_cell.file_display_mode; schema_cell.template = form_datas.custom_template; delete schema_cell.page; delete schema_cell.url_template; @@ -895,6 +909,7 @@ Card_cell_custom.prototype = { schema_cell.varname = '@link@'; delete schema_cell.field_content; schema_cell.display_mode = form_datas.link_display_mode; + delete schema_cell.file_display_mode; schema_cell.template = form_datas.link_label_template; if (form_datas.link_page.startsWith('field:')) { schema_cell.page = ''; @@ -913,6 +928,12 @@ Card_cell_custom.prototype = { schema_cell.varname = form_datas.field_varname; schema_cell.field_content = form_datas.field_content; schema_cell.display_mode = form_datas.field_display_mode; + let schema_field = this.field_with_varname(schema_cell.varname); + if (schema_field && schema_field.type == 'file') { + schema_cell.file_display_mode = form_datas.file_field_display_mode; + } else { + delete schema_cell.file_display_mode; + } if (form_datas.field_content == 'label-and-value') { schema_cell.display_mode = 'text'; } @@ -930,6 +951,7 @@ Card_cell_custom.prototype = { } else { if (form_datas.entry_type == '@custom@') { schema_cell.varname = '@custom@'; + delete schema_cell.file_display_mode; delete schema_cell.empty_value; schema_cell.header = form_datas.custom_header; schema_cell.template = form_datas.custom_template; @@ -937,6 +959,7 @@ Card_cell_custom.prototype = { delete schema_cell.url_template; } else if (form_datas.entry_type == '@link@') { schema_cell.varname = '@link@'; + delete schema_cell.file_display_mode; schema_cell.header = form_datas.link_header; schema_cell.display_mode = form_datas.link_display_mode; schema_cell.template = form_datas.link_label_template; @@ -955,6 +978,12 @@ Card_cell_custom.prototype = { } } else { schema_cell.varname = form_datas.field_varname; + let schema_field = this.field_with_varname(schema_cell.varname); + if (schema_field && schema_field.type == 'file') { + schema_cell.file_display_mode = form_datas.file_field_display_mode; + } else { + delete schema_cell.file_display_mode; + } schema_cell.empty_value = form_datas.field_empty_text; delete schema_cell.template; delete schema_cell.page; diff --git a/tests/wcs/test_card.py b/tests/wcs/test_card.py index d42a0b59..42517cd3 100644 --- a/tests/wcs/test_card.py +++ b/tests/wcs/test_card.py @@ -863,6 +863,9 @@ def test_card_cell_table_mode_render_custom_schema_card_field(mock_send, context {'varname': 'fieldc'}, {'varname': 'related'}, {'varname': 'fieldd'}, + {'varname': 'fieldd', 'file_display_mode': 'thumbnail'}, + {'varname': 'fieldd2'}, + {'varname': 'fieldd2', 'file_display_mode': 'thumbnail'}, {'varname': 'fielde'}, {'varname': 'fieldf'}, {'varname': 'fieldg'}, @@ -880,13 +883,16 @@ def test_card_cell_table_mode_render_custom_schema_card_field(mock_send, context result = cell.render(context) assert PyQuery(result).find('ul li') == [] - assert len(PyQuery(result).find('table tr td')) == 14 * 3 + assert len(PyQuery(result).find('table tr td')) == 17 * 3 assert [PyQuery(td).text() for td in PyQuery(result).find('table tr:first-child td')] == [ 'a', 'yes', 'Sept. 28, 2020', 'Foo Bar', 'file.pdf', + 'file.pdf', + 'file.pdf', + '', # it's an image ! "loremipsum hello'world", # no multiline support for now "loremipsum hello world", 'test@localhost', @@ -897,26 +903,57 @@ def test_card_cell_table_mode_render_custom_schema_card_field(mock_send, context 'User', 'Foo Bar', ] - assert PyQuery(result).find('table tr:first-child td:nth-child(8) a').text().strip() == 'test@localhost' assert ( - PyQuery(result).find('table tr:first-child td:nth-child(8) a').attr['href'] == 'mailto:test@localhost' + PyQuery(result) + .find('table tr:first-child td:nth-child(5) a') + .attr['href'] + .startswith('/api/wcs/file/') ) assert ( - PyQuery(result).find('table tr:first-child td:nth-child(9) a').text().strip() + PyQuery(result) + .find('table tr:first-child td:nth-child(6) a') + .attr['href'] + .startswith('/api/wcs/file/') + ) + assert ( + PyQuery(result) + .find('table tr:first-child td:nth-child(7) a') + .attr['href'] + .startswith('/api/wcs/file/') + ) + assert ( + PyQuery(result) + .find('table tr:first-child td:nth-child(8) a') + .attr['href'] + .startswith('/api/wcs/file/') + ) + assert ( + PyQuery(result) + .find('table tr:first-child td:nth-child(8) a img') + .attr['src'] + .startswith('/api/wcs/file/') + ) + assert PyQuery(result).find('table tr:first-child td:nth-child(11) a').text().strip() == 'test@localhost' + assert ( + PyQuery(result).find('table tr:first-child td:nth-child(11) a').attr['href'] + == 'mailto:test@localhost' + ) + assert ( + PyQuery(result).find('table tr:first-child td:nth-child(12) a').text().strip() == 'https://www.example.net/' ) assert ( - PyQuery(result).find('table tr:first-child td:nth-child(9) a').attr['href'] + PyQuery(result).find('table tr:first-child td:nth-child(12) a').attr['href'] == 'https://www.example.net/' ) - assert PyQuery(result).find('table tr:first-child td:nth-child(10) p:first-child').text() == 'loremipsum' + assert PyQuery(result).find('table tr:first-child td:nth-child(13) p:first-child').text() == 'loremipsum' assert ( - PyQuery(result).find('table tr:first-child td:nth-child(10) p:first-child strong').text() == 'ipsum' + PyQuery(result).find('table tr:first-child td:nth-child(13) p:first-child strong').text() == 'ipsum' ) - assert PyQuery(result).find('table tr:first-child td:nth-child(10) p:last-child').text() == "hello'world" - assert PyQuery(result).find('table tr:first-child td:nth-child(12) a').text().strip() == 'foo@bar.com' + assert PyQuery(result).find('table tr:first-child td:nth-child(13) p:last-child').text() == "hello'world" + assert PyQuery(result).find('table tr:first-child td:nth-child(15) a').text().strip() == 'foo@bar.com' assert ( - PyQuery(result).find('table tr:first-child td:nth-child(12) a').attr['href'] == 'mailto:foo@bar.com' + PyQuery(result).find('table tr:first-child td:nth-child(15) a').attr['href'] == 'mailto:foo@bar.com' ) @@ -1555,7 +1592,10 @@ def test_card_cell_card_mode_render(mock_send, context, app): assert PyQuery(result).find('.label:contains("Related") + .value').text() == 'Foo Bar' assert 'related_raw' not in result assert 'related_structured' not in result - assert PyQuery(result).find('.label:contains("Field D") + .value a').text() == 'file.pdf' + assert ( + PyQuery(result).find('.label:contains("Field D") + .value a').text() == 'file.pdf file.pdf' + ) # Field D2 is matching ... + assert PyQuery(result).find('.label:contains("Field D2") + .value a').text() == 'file.pdf' context.pop('title') cell.title_type = 'manual' @@ -1832,6 +1872,46 @@ def test_card_cell_card_mode_render_custom_schema_card_field(mock_send, context) result = cell.render(context) assert PyQuery(result).find('.label').text() == 'Field D' assert PyQuery(result).find('.value').text() == 'file.pdf' + assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/') + + cell.custom_schema['cells'][0]['file_display_mode'] = 'link' + cell.save() + result = cell.render(context) + assert PyQuery(result).find('.label').text() == 'Field D' + assert PyQuery(result).find('.value').text() == 'file.pdf' + assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/') + + cell.custom_schema['cells'][0]['file_display_mode'] = 'thumbnail' + cell.save() + result = cell.render(context) + assert PyQuery(result).find('.label').text() == 'Field D' + assert PyQuery(result).find('.value').text() == 'file.pdf' + assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/') + + cell.custom_schema['cells'][0] = { + 'varname': 'fieldd2', + 'field_content': 'label-and-value', + 'display_mode': 'text', + } + cell.save() + result = cell.render(context) + assert PyQuery(result).find('.label').text() == 'Field D2' + assert PyQuery(result).find('.value').text() == 'file.pdf' + assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/') + + cell.custom_schema['cells'][0]['file_display_mode'] = 'link' + cell.save() + result = cell.render(context) + assert PyQuery(result).find('.label').text() == 'Field D2' + assert PyQuery(result).find('.value').text() == 'file.pdf' + assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/') + + cell.custom_schema['cells'][0]['file_display_mode'] = 'thumbnail' + cell.save() + result = cell.render(context) + assert PyQuery(result).find('.label').text() == 'Field D2' + assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/') + assert PyQuery(result).find('.value a img').attr['src'].startswith('/api/wcs/file/') cell.custom_schema['cells'][0] = { 'varname': 'fielde', diff --git a/tests/wcs/utils.py b/tests/wcs/utils.py index 6c964d5f..431a87ba 100644 --- a/tests/wcs/utils.py +++ b/tests/wcs/utils.py @@ -115,6 +115,11 @@ WCS_CARDS_DATA = { 'fieldb': True, 'fieldc': '2020-09-28', 'fieldd': {'filename': 'file.pdf', 'url': 'http://127.0.0.1:8999/download?f=42'}, + 'fieldd2': { + 'filename': 'file.pdf', + 'url': 'http://127.0.0.1:8999/download?f=42', + 'thumbnail_url': 'http://127.0.0.1:8999/download?f=42&thumbnail=1', + }, 'fielde': "loremipsum\n\nhello'world", 'fieldf': 'loremipsum\n\nhello world', 'fieldg': 'test@localhost', @@ -240,6 +245,7 @@ WCS_CARDDEF_SCHEMAS = { {'label': 'Field B', 'varname': 'fieldb', 'type': 'bool'}, {'label': 'Field C', 'varname': 'fieldc', 'type': 'date'}, {'label': 'Field D', 'varname': 'fieldd', 'type': 'file'}, + {'label': 'Field D2', 'varname': 'fieldd2', 'type': 'file'}, {'label': 'Field E', 'varname': 'fielde', 'type': 'text'}, {'label': 'Field F', 'varname': 'fieldf', 'type': 'text', 'display_mode': 'pre'}, {'label': 'Field G', 'varname': 'fieldg', 'type': 'email'},