wcs: card cell & link entry with file field (#71984) #8
|
@ -33,14 +33,27 @@
|
|||
</div>
|
||||
{% endif %}
|
||||
{% elif item.varname == "@link@" %}
|
||||
{% if item.template and item.page|default:item.url_template %}
|
||||
{% firstof item.link_field item.page item.url_template as link %}
|
||||
{% if item.template and link %}
|
||||
<div class="{{ item.cell_size|default:"" }}">
|
||||
{% with item.page|default:item.url_template as url_key %}
|
||||
{% with card.custom_fields|get:item.template|force_escape as link_label and card.urls|get:url_key|force_escape as link_url %}
|
||||
{% if link_label and link_url %}
|
||||
<div class="value"><a href="{{ link_url }}"{% if item.display_mode == 'button' %} class="pk-button"{% endif %}>{{ link_label }}</a></div>
|
||||
{% with card.custom_fields|get:item.template|force_escape as link_label %}
|
||||
{% if link_label %}
|
||||
{% if item.link_field %}
|
||||
{% with fields_by_varnames|get:item.link_field as field and card.fields|get:item.link_field as value %}
|
||||
{% if field and value and field.type == 'file' %}
|
||||
<div class="value"><a href="{% make_public_url url=value.url %}"{% if item.display_mode == 'button' %} class="pk-button"{% endif %} download="{{ value.filename }}">{{ link_label }}</a></div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
{% with item.page|default:item.url_template as url_key %}
|
||||
{% with card.urls|get:url_key|force_escape as link_url %}
|
||||
{% if link_url %}
|
||||
<div class="value"><a href="{{ link_url }}"{% if item.display_mode == 'button' %} class="pk-button"{% endif %}>{{ link_label }}</a></div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
@ -6,28 +6,37 @@
|
|||
{% endwith %}
|
||||
{% endif %}
|
||||
{% elif item.varname == "@link@" %}
|
||||
{% if item.template and item.page|default:item.url_template %}
|
||||
{% with item.page|default:item.url_template as url_key %}
|
||||
{% with card.custom_fields|get:item.template|force_escape as link_label and card.urls|get:url_key|force_escape as link_url %}
|
||||
{% if not ul_display %}<td>{% endif %}
|
||||
{% if link_label and link_url %}
|
||||
<a href="{{ link_url }}"{% if item.display_mode == 'button' %} class="pk-button"{% endif %}>{{ link_label }}</a>
|
||||
{% firstof item.link_field item.page item.url_template as link %}
|
||||
{% if item.template and link %}
|
||||
{% if not ul_display %}<td>{% endif %}
|
||||
{% with card.custom_fields|get:item.template|force_escape as link_label %}
|
||||
{% if link_label %}
|
||||
{% if item.link_field %}
|
||||
{% with fields_by_varnames|get:item.link_field as field and card.fields|get:item.link_field as value %}
|
||||
{% if field and value and field.type == 'file' %}
|
||||
<a href="{% make_public_url url=value.url %}"{% if item.display_mode == 'button' %} class="pk-button"{% endif %} download="{{ value.filename }}">{{ link_label }}</a>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
{% with item.page|default:item.url_template as url_key %}
|
||||
{% with card.urls|get:url_key|force_escape as link_url %}
|
||||
{% if link_url %}
|
||||
<a href="{{ link_url }}"{% if item.display_mode == 'button' %} class="pk-button"{% endif %}>{{ link_label }}</a>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
{% if not ul_display %}</td>{% endif %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% if not ul_display %}</td>{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if item.varname %}
|
||||
{% with fields_by_varnames|get:item.varname as field %}
|
||||
{% if field %}
|
||||
{% with card.fields|get:item.varname as value %}
|
||||
{% if value %}
|
||||
{% if not ul_display %}<td>{% endif %}{% include "combo/wcs/card-field-value.html" with mode='inline' %}{% if not ul_display %}</td>{% endif %}
|
||||
{% else %}
|
||||
{% if not ul_display %}<td>{% endif %}{% include "combo/wcs/card-field-value.html" with mode='inline' value=item.empty_value %}{% if not ul_display %}</td>{% endif %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% with fields_by_varnames|get:item.varname as field and card.fields|get:item.varname as value %}
|
||||
{% if field and value %}
|
||||
{% if not ul_display %}<td>{% endif %}{% include "combo/wcs/card-field-value.html" with mode='inline' %}{% if not ul_display %}</td>{% endif %}
|
||||
{% elif field %}
|
||||
{% if not ul_display %}<td>{% endif %}{% include "combo/wcs/card-field-value.html" with mode='inline' value=item.empty_value %}{% if not ul_display %}</td>{% endif %}
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
|
|
|
@ -20,7 +20,8 @@
|
|||
<th>{{ item.header|default:"" }}</th>
|
||||
{% endif %}
|
||||
{% elif item.varname == "@link@" %}
|
||||
{% if item.template and item.page|default:item.url_template %}
|
||||
{% firstof item.link_field item.page item.url_template as link %}
|
||||
{% if item.template and link %}
|
||||
<th>{{ item.header|default:"" }}</th>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
|
|
|
@ -127,12 +127,12 @@
|
|||
</p>
|
||||
<p>
|
||||
<label>
|
||||
{% trans "URL" %}
|
||||
{% trans "Link destination" %}
|
||||
<select name="link_page" data-dynamic-display-parent="true">
|
||||
{% for page in cell.get_matching_pages %}
|
||||
<option value="{{ page.pk }}">{{ page.get_full_path_titles }}</option>
|
||||
{% endfor %}
|
||||
<option value="">{% trans "URL template" %}</option>
|
||||
<option value="">{% trans "URL (Template)" %}</option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
|
@ -166,7 +166,7 @@
|
|||
</p>
|
||||
</form>
|
||||
</script>
|
||||
<script type="text/template" class="as-card wcs-cards-cell--grid-cell-tpl">
|
||||
<script type="text/template" class="as-card wcs-cards-cell--grid-cell-tpl">
|
||||
<div class="as-card wcs-cards-cell--grid-cell">
|
||||
<div class="as-card wcs-cards-cell--grid-cell-content"></div>
|
||||
<div class="as-card wcs-cards-cell--grid-cell-buttons">
|
||||
|
@ -264,12 +264,12 @@
|
|||
</p>
|
||||
<p>
|
||||
<label>
|
||||
{% trans "URL" %}
|
||||
{% trans "Link destination" %}
|
||||
<select name="link_page" data-dynamic-display-parent="true">
|
||||
{% for page in cell.get_matching_pages %}
|
||||
<option value="{{ page.pk }}">{{ page.get_full_path_titles }}</option>
|
||||
{% endfor %}
|
||||
<option value="">{% trans "URL template" %}</option>
|
||||
<option value="">{% trans "URL (Template)" %}</option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
|
@ -290,7 +290,7 @@
|
|||
</div>
|
||||
</form>
|
||||
</script>
|
||||
<script type="text/template" class="as-table wcs-cards-cell--grid-cell-tpl">
|
||||
<script type="text/template" class="as-table wcs-cards-cell--grid-cell-tpl">
|
||||
<div class="as-table wcs-cards-cell--grid-cell">
|
||||
<div class="as-table wcs-cards-cell--grid-cell-content"></div>
|
||||
<div class="as-table wcs-cards-cell--grid-cell-buttons">
|
||||
|
|
|
@ -602,12 +602,19 @@ Card_cell_custom.prototype = {
|
|||
const _self = this;
|
||||
this.grid_cell__init_form_fields();
|
||||
const varname_select = this.grid_cell_form.field_varname;
|
||||
const link_select = this.grid_cell_form.link_page;
|
||||
this.cardSchema.fields.forEach(function(el, id) {
|
||||
if (el.varname) {
|
||||
$('<option />')
|
||||
.attr('value', el.varname)
|
||||
.text(el.label)
|
||||
.appendTo(varname_select);
|
||||
if (el.type == 'file') {
|
||||
$('<option />')
|
||||
.attr('value', 'field:' + el.varname)
|
||||
.text(el.label + ' (' + gettext('File') + ')')
|
||||
.appendTo(link_select);
|
||||
}
|
||||
}
|
||||
});
|
||||
this.cardSchema.user.fields.forEach(function(el, id) {
|
||||
|
@ -681,6 +688,11 @@ Card_cell_custom.prototype = {
|
|||
cell_content = (schema_cell.template || '') + ': ';
|
||||
if (schema_cell.page) {
|
||||
cell_content += $(this.grid_cell_form).find('select[name="link_page"] option[value="' + schema_cell.page + '"]').text();
|
||||
} 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') + ')';
|
||||
}
|
||||
} else {
|
||||
cell_content += (schema_cell.url_template || '');
|
||||
}
|
||||
|
@ -762,8 +774,13 @@ Card_cell_custom.prototype = {
|
|||
this.grid_cell_form.custom_template.value = '';
|
||||
this.grid_cell_form.custom_display_mode.value = '';
|
||||
this.grid_cell_form.link_label_template.value = grid_cell.dataset.template || '';
|
||||
this.grid_cell_form.link_page.value = grid_cell.dataset.page || '';
|
||||
this.grid_cell_form.link_url_template.value = grid_cell.dataset.url_template || '';
|
||||
if (grid_cell.dataset.link_field) {
|
||||
this.grid_cell_form.link_page.value = 'field:' + grid_cell.dataset.link_field;
|
||||
this.grid_cell_form.link_url_template.value = '';
|
||||
} else {
|
||||
this.grid_cell_form.link_page.value = grid_cell.dataset.page || '';
|
||||
this.grid_cell_form.link_url_template.value = grid_cell.dataset.url_template || '';
|
||||
}
|
||||
this.grid_cell_form.link_display_mode.value = grid_cell.dataset.display_mode;
|
||||
} else {
|
||||
this.grid_cell_form.entry_type.value = '@field@';
|
||||
|
@ -808,8 +825,13 @@ Card_cell_custom.prototype = {
|
|||
this.grid_cell_form.custom_template.value = '';
|
||||
this.grid_cell_form.link_header.value = grid_cell.dataset.header || '';
|
||||
this.grid_cell_form.link_label_template.value = grid_cell.dataset.template || '';
|
||||
this.grid_cell_form.link_page.value = grid_cell.dataset.page || '';
|
||||
this.grid_cell_form.link_url_template.value = grid_cell.dataset.url_template || '';
|
||||
if (grid_cell.dataset.link_field) {
|
||||
this.grid_cell_form.link_page.value = 'field:' + grid_cell.dataset.link_field;
|
||||
this.grid_cell_form.link_url_template.value = '';
|
||||
} else {
|
||||
this.grid_cell_form.link_page.value = grid_cell.dataset.page || '';
|
||||
this.grid_cell_form.link_url_template.value = grid_cell.dataset.url_template || '';
|
||||
}
|
||||
this.grid_cell_form.link_display_mode.value = grid_cell.dataset.display_mode;
|
||||
} else {
|
||||
this.grid_cell_form.entry_type.value = '@field@';
|
||||
|
@ -861,16 +883,24 @@ Card_cell_custom.prototype = {
|
|||
schema_cell.template = form_datas.custom_template;
|
||||
delete schema_cell.page;
|
||||
delete schema_cell.url_template;
|
||||
delete schema_cell.link_field;
|
||||
} else if (form_datas.entry_type == '@link@') {
|
||||
schema_cell.varname = '@link@';
|
||||
delete schema_cell.field_content;
|
||||
schema_cell.display_mode = form_datas.link_display_mode;
|
||||
schema_cell.template = form_datas.link_label_template;
|
||||
schema_cell.page = form_datas.link_page;
|
||||
if (form_datas.link_page) {
|
||||
if (form_datas.link_page.startsWith('field:')) {
|
||||
schema_cell.page = '';
|
||||
schema_cell.url_template = '';
|
||||
schema_cell.link_field = form_datas.link_page.substring(6);
|
||||
} else {
|
||||
schema_cell.url_template = form_datas.link_url_template;
|
||||
schema_cell.page = form_datas.link_page;
|
||||
if (form_datas.link_page) {
|
||||
schema_cell.url_template = '';
|
||||
} else {
|
||||
schema_cell.url_template = form_datas.link_url_template;
|
||||
}
|
||||
schema_cell.link_field = '';
|
||||
}
|
||||
} else {
|
||||
schema_cell.varname = form_datas.field_varname;
|
||||
|
@ -887,6 +917,7 @@ Card_cell_custom.prototype = {
|
|||
delete schema_cell.template;
|
||||
delete schema_cell.page;
|
||||
delete schema_cell.url_template;
|
||||
delete schema_cell.link_field;
|
||||
}
|
||||
schema_cell.cell_size = form_datas.cell_size;
|
||||
} else {
|
||||
|
@ -902,11 +933,18 @@ Card_cell_custom.prototype = {
|
|||
schema_cell.header = form_datas.link_header;
|
||||
schema_cell.display_mode = form_datas.link_display_mode;
|
||||
schema_cell.template = form_datas.link_label_template;
|
||||
schema_cell.page = form_datas.link_page;
|
||||
if (form_datas.link_page) {
|
||||
if (form_datas.link_page.startsWith('field:')) {
|
||||
schema_cell.page = '';
|
||||
schema_cell.url_template = '';
|
||||
schema_cell.link_field = form_datas.link_page.substring(6);
|
||||
} else {
|
||||
schema_cell.url_template = form_datas.link_url_template;
|
||||
schema_cell.page = form_datas.link_page;
|
||||
if (form_datas.link_page) {
|
||||
schema_cell.url_template = '';
|
||||
} else {
|
||||
schema_cell.url_template = form_datas.link_url_template;
|
||||
}
|
||||
schema_cell.link_field = '';
|
||||
}
|
||||
} else {
|
||||
schema_cell.varname = form_datas.field_varname;
|
||||
|
|
|
@ -1056,17 +1056,28 @@ def test_card_cell_table_mode_render_custom_schema_link_entry(mock_send, context
|
|||
cell.modify_global_context(context, request)
|
||||
context['synchronous'] = True # to get fresh content
|
||||
|
||||
def test(value, href, class_name):
|
||||
def test(value, href, class_name, is_file=False):
|
||||
result = cell.render(context)
|
||||
if nb_cells > 1:
|
||||
assert PyQuery(result).find('ul li') == []
|
||||
assert PyQuery(result).find('table tr:first-child td:first-child a').text() == value
|
||||
assert PyQuery(result).find('table tr:first-child td:first-child a').attr['href'] == href
|
||||
if not is_file:
|
||||
assert PyQuery(result).find('table tr:first-child td:first-child a').attr['href'] == href
|
||||
else:
|
||||
assert (
|
||||
PyQuery(result)
|
||||
.find('table tr:first-child td:first-child a')
|
||||
.attr['href']
|
||||
.startswith(href)
|
||||
)
|
||||
assert PyQuery(result).find('table tr:first-child td:first-child a').attr['class'] == class_name
|
||||
else:
|
||||
assert PyQuery(result).find('table tr td') == []
|
||||
assert PyQuery(result).find('ul li:first-child a').text() == value
|
||||
assert PyQuery(result).find('ul li:first-child a').attr['href'] == href
|
||||
if not is_file:
|
||||
assert PyQuery(result).find('ul li:first-child a').attr['href'] == href
|
||||
else:
|
||||
assert PyQuery(result).find('ul li:first-child a').attr['href'].startswith(href)
|
||||
assert PyQuery(result).find('ul li:first-child a').attr['class'] == class_name
|
||||
|
||||
test('<i>a</i> - Foo Bar', '/foo/bar/42/', None)
|
||||
|
@ -1129,6 +1140,38 @@ def test_card_cell_table_mode_render_custom_schema_link_entry(mock_send, context
|
|||
assert PyQuery(result).find('ul li a') == []
|
||||
assert PyQuery(result).find('table tr td a') == []
|
||||
|
||||
# check with field
|
||||
cell.custom_schema['cells'][0]['page'] = ''
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'fieldd'
|
||||
cell.custom_schema['cells'][0]['template'] = '{{ card.fields.fielda }} - {{ card.fields.related }}'
|
||||
cell.save()
|
||||
test('<i>a</i> - Foo Bar', '/api/wcs/file/', 'pk-button', is_file=True)
|
||||
|
||||
cell.custom_schema['cells'][0]['display_mode'] = 'link'
|
||||
cell.save()
|
||||
test('<i>a</i> - Foo Bar', '/api/wcs/file/', None, is_file=True)
|
||||
|
||||
# empty label or no value/no file field/unknown field: no link in output
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('ul li:last-child a') == []
|
||||
assert PyQuery(result).find('table tr:last-child td a') == []
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'fielda'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('ul li a') == []
|
||||
assert PyQuery(result).find('table tr td a') == []
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'unknown'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('ul li a') == []
|
||||
assert PyQuery(result).find('table tr td a') == []
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'fieldd'
|
||||
cell.custom_schema['cells'][0]['template'] = '{{ None|default:"" }}'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('ul li a') == []
|
||||
assert PyQuery(result).find('table tr td a') == []
|
||||
|
||||
|
||||
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
|
||||
@pytest.mark.parametrize('with_headers', [True, False])
|
||||
|
@ -2184,6 +2227,42 @@ def test_card_cell_card_mode_render_custom_schema_link_entry(mock_send, context,
|
|||
result = cell.render(context)
|
||||
assert PyQuery(result).find('.value a') == []
|
||||
|
||||
# check with field
|
||||
cell.custom_schema['cells'][0]['page'] = ''
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'fieldd'
|
||||
cell.custom_schema['cells'][0]['template'] = '{{ card.fields.fielda }} - {{ card.fields.related }}'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/')
|
||||
assert PyQuery(result).find('.value a').attr['class'] == 'pk-button'
|
||||
|
||||
cell.custom_schema['cells'][0]['display_mode'] = 'link'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('.value a').attr['href'].startswith('/api/wcs/file/')
|
||||
assert PyQuery(result).find('.value a').attr['class'] is None
|
||||
|
||||
# empty label or no value/no file field/unknown field: no link in output
|
||||
context[cell.global_context_key] = [12]
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('.value a') == []
|
||||
context[cell.global_context_key] = [11]
|
||||
cell.modify_global_context(context, request)
|
||||
cell.repeat_index = 0
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'fielda'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('.value a') == []
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'unknown'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('.value a') == []
|
||||
cell.custom_schema['cells'][0]['link_field'] = 'fieldd'
|
||||
cell.custom_schema['cells'][0]['template'] = '{{ None|default:"" }}'
|
||||
cell.save()
|
||||
result = cell.render(context)
|
||||
assert PyQuery(result).find('.value a') == []
|
||||
|
||||
|
||||
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
|
||||
def test_card_cell_card_mode_render_all_cards(mock_send, nocache, app):
|
||||
|
|
Loading…
Reference in New Issue