utiliser un attribut data-id pour les listes réordonnables (plutôt que l'id de l'élément) (#10225) #337

Merged
fpeters merged 2 commits from wip/10225-sortable-list-markup into main 2023-05-26 08:19:53 +02:00
10 changed files with 35 additions and 31 deletions

View File

@ -474,7 +474,7 @@ def test_card_delete_field_existing_data(pub):
assert 'You are about to remove the "1st field" field.' in resp.text
assert 'Warning: this field data will be permanently deleted from existing cards.' in resp.text
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/backoffice/cards/1/fields/#itemId_2'
assert resp.location == 'http://example.net/backoffice/cards/1/fields/#fieldId_2'
resp = resp.follow()
carddef.refresh_from_storage()
assert len(carddef.fields) == 1

View File

@ -1570,7 +1570,7 @@ def test_form_delete_field_existing_data(pub):
assert 'You are about to remove the "1st field" field.' in resp.text
assert 'Warning: this field data will be permanently deleted from existing forms.' in resp.text
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_2'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_2'
resp = resp.follow()
assert len(FormDef.get(1).fields) == 1
@ -1648,7 +1648,7 @@ def test_form_duplicate_field(pub):
assert '1st field' in resp.text
resp = resp.click(href='1/duplicate')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_2'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_2'
resp = resp.follow()
assert len(FormDef.get(1).fields) == 2
assert FormDef.get(1).fields[0].label == '1st field'
@ -1792,7 +1792,7 @@ def test_form_duplicate_file_field(pub):
assert 'foobar' in resp.text
resp = resp.click(href='%s/duplicate' % FormDef.get(formdef.id).fields[0].id)
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_2'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_2'
resp = resp.follow()
@ -1812,14 +1812,14 @@ def test_form_edit_field(pub):
assert '1st field' in resp.text
resp = resp.click('Edit', href='1/')
assert '/backoffice/forms/1/fields/#itemId_1' in resp
assert '/backoffice/forms/1/fields/#fieldId_1' in resp
assert resp.pyquery('.field-edit--title').text() == '1st field'
assert resp.pyquery('.field-edit--subtitle').text() == 'Text (line)'
assert resp.forms[0]['label'].value == '1st field'
resp.forms[0]['label'] = 'changed field'
resp.forms[0]['required'] = False
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_1'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_1'
assert FormDef.get(1).fields[0].label == 'changed field'
assert FormDef.get(1).fields[0].required is False
@ -1851,7 +1851,7 @@ def test_form_edit_field_advanced(pub):
resp.forms[0]['prefill$type'] = 'String / Template'
resp.forms[0]['prefill$value_string'] = 'test'
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_1'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_1'
resp = resp.follow()
assert FormDef.get(formdef.id).fields[0].prefill == {'type': 'string', 'value': 'test', 'locked': False}
@ -1893,7 +1893,7 @@ def test_form_edit_field_advanced(pub):
resp.forms[0]['prefill$type'] = 'User Field'
resp.forms[0]['prefill$value_string'] = 'email'
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_2'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_2'
resp = resp.follow()
assert "Are you sure you want to prefill" not in resp.text
@ -2128,7 +2128,7 @@ def test_form_edit_item_field(pub):
assert 'items$element1' in resp.form.fields
# but don't fill anything
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_1'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_1'
resp = resp.follow()
assert FormDef.get(1).fields[0].label == 'changed field'
@ -2140,7 +2140,7 @@ def test_form_edit_item_field(pub):
assert resp.forms[0]['label'].value == 'changed field'
resp.forms[0]['items$element0'] = 'XXX'
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_1'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_1'
assert FormDef.get(1).fields[0].items == ['XXX']
@ -2521,7 +2521,7 @@ def test_form_edit_items_field(pub):
assert 'items$element1' in resp.form.fields
# but don't fill anything
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_1'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_1'
resp = resp.follow()
assert FormDef.get(1).fields[0].label == 'changed field'
@ -2537,7 +2537,7 @@ def test_form_edit_items_field(pub):
resp.forms[0]['min_choices'] = 2
resp.forms[0]['max_choices'] = 5
resp = resp.forms[0].submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#itemId_1'
assert resp.location == 'http://example.net/backoffice/forms/1/fields/#fieldId_1'
assert FormDef.get(1).fields[0].items == ['XXX']
assert FormDef.get(1).fields[0].min_choices == 2
assert FormDef.get(1).fields[0].max_choices == 5
@ -2963,12 +2963,12 @@ def test_form_limit_display_to_page(pub):
# remove field on current page
resp = resp.click(href='5/delete')
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/backoffice/forms/%s/fields/pages/4/#itemId_4' % formdef.id
assert resp.location == 'http://example.net/backoffice/forms/%s/fields/pages/4/#fieldId_4' % formdef.id
resp = resp.follow()
# remove current page itself
resp = resp.click(href='4/delete')
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/backoffice/forms/%s/fields/#itemId_3' % formdef.id
assert resp.location == 'http://example.net/backoffice/forms/%s/fields/#fieldId_3' % formdef.id
# visit a page that doesn't exist
app.get('/backoffice/forms/1/fields/pages/123/', status=404)
@ -3613,7 +3613,7 @@ def test_form_preview_edit_page_fields(pub):
resp = resp.click('edit page fields', index=0)
assert '<h2>form title - page 1 - first page</h2>' in resp.text
resp = resp.click('Edit', index=0)
assert '/backoffice/forms/1/fields/pages/1/#itemId_1' in resp
assert '/backoffice/forms/1/fields/pages/1/#fieldId_1' in resp
assert '/backoffice/forms/1/fields/pages/1/1/' in resp # without anchor

View File

@ -2735,7 +2735,7 @@ def test_workflows_create_formdata(pub):
resp = app.get('/backoffice/workflows/%s/status/%s/' % (wf.id, st2.id))
pq = resp.pyquery.remove_namespaces()
assert pq('option[value="New Form Creation"]').text() == 'New Form Creation'
assert pq('#itemId__create_formdata a')[0].text == 'New Form Creation (target form)'
assert pq('[data-id="_create_formdata"] a')[0].text == 'New Form Creation (target form)'
resp = resp.click(
'Edit',

View File

@ -33,7 +33,7 @@ from wcs.qommon.form import FileWidget, Form, HtmlWidget, SingleSelectWidget, Sl
class BlockFieldDefPage(FieldDefPage):
def redirect_field_anchor(self, field):
anchor = '#itemId_%s' % field.id if field else ''
anchor = '#fieldId_%s' % field.id if field else ''
return redirect('../%s' % anchor)
def schedule_statistics_data_update(self):

View File

@ -51,7 +51,7 @@ class FieldDefPage(Directory):
last_breadcrumb_url_part, last_breadcrumb_label = get_response().breadcrumb[-1]
get_response().breadcrumb = get_response().breadcrumb[:-1]
get_response().breadcrumb.append(
(last_breadcrumb_url_part + '#itemId_' + field_id, last_breadcrumb_label)
(last_breadcrumb_url_part + '#fieldId_' + field_id, last_breadcrumb_label)
)
get_response().breadcrumb.append((field_id + '/', label))
@ -72,7 +72,7 @@ class FieldDefPage(Directory):
old_display_locations = (self.field.display_locations or []).copy()
if form.get_submit() == 'cancel':
return redirect('../#itemId_%s' % self.field.id)
return redirect('../#fieldId_%s' % self.field.id)
if form.get_widget('items') and form.get_widget('items').get_widget('add_element').parse():
form.clear_errors()
@ -131,7 +131,7 @@ class FieldDefPage(Directory):
)
return redirect('..')
return redirect('../#itemId_%s' % self.field.id)
return redirect('../#fieldId_%s' % self.field.id)
def schedule_statistics_data_update(self):
get_response().add_after_job(UpdateStatisticsDataAfterJob(formdefs=[self.objectdef]))
@ -148,7 +148,7 @@ class FieldDefPage(Directory):
return _('Warning: this field data will be permanently deleted.')
def redirect_field_anchor(self, field):
anchor = '#itemId_%s' % field.id if field else ''
anchor = '#fieldId_%s' % field.id if field else ''
if self.page_id:
# check page_id is (still) a valid page number
if self.page_id in (x.id for x in self.objectdef.fields):
@ -409,7 +409,11 @@ class FieldsDirectory(Directory):
current_page_no += 1
on_page = bool(str(field.id) == self.page_id)
li_attrs = {'id': 'itemId_%s' % field.id, 'class': 'biglistitem type-%s' % field.key}
li_attrs = {
'id': 'fieldId_%s' % field.id,
'data-id': str(field.id),
'class': 'biglistitem type-%s' % field.key,
}
if self.page_id and not on_page:
li_attrs['style'] = 'display: none;'
if self.page_id and field.key == 'page':

View File

@ -1394,7 +1394,7 @@ class GlobalActionPage(WorkflowStatusPage):
r += htmltext('</p>')
r += htmltext('<ul id="items-list" class="biglist sortable">')
for item in self.action.items:
r += htmltext('<li class="biglistitem" id="itemId_%s">') % item.id
r += htmltext('<li class="biglistitem" data-id="%s">') % item.id
if self.workflow.is_readonly():
r += str(item.render_as_line())
else:

View File

@ -46,8 +46,8 @@ $(document).ready(
items = $(ui.item).parent().find('li');
for (i=0; i < items.length; i++) {
var item = items[i];
var item_id = item.id.substr(7, 50);
if (item_id.length) {
var item_id = item.dataset.id;
if (item_id !== undefined) {
result += item_id + ';';
}
if ($(item).find('span.page-no').length) {
@ -57,7 +57,7 @@ $(document).ready(
}
$move_page_field.dialog('close');
var order_function = $(this).data('order-function') || 'update_order';
$.post(order_function, {'order': result, 'element': $(ui.item)[0].id.substr(7, 50)})
$.post(order_function, {'order': result, 'element': $(ui.item)[0].dataset.id})
.done(function(data) {
if (data['success'] != "ok") return;
if (!data['additional-action']) return;

View File

@ -15,7 +15,7 @@
{% if categories %}
<ul class="biglist sortable" id="category-list">
{% for category in categories %}
<li class="biglistitem" id="itemId_{{ category.id }}">
<li class="biglistitem" data-id="{{ category.id }}">
<a href="{{ category.id }}/">
{% include 'wcs/backoffice/includes/application_icons.html' with object=category %}
{{ category.name }}

View File

@ -29,7 +29,7 @@
<ul id="items-list" class="biglist sortable">
{% endif %}
{% for item in status.items %}
<li class="biglistitem" id="itemId_{{ item.id }}">
<li class="biglistitem" data-id="{{ item.id }}">
<a href="items/{{ item.id }}/">{{ item.render_as_line }}</a>
<p class="commands">
{% with item.get_target_status_url as url %}

View File

@ -28,7 +28,7 @@
{% spaceless %}
{% for status in workflow.possible_status %}
<li class="biglistitem {% if status.get_visibility_restricted_roles %}hidden-status{% endif %}"
id="itemId_{{ status.id }}">
data-id="{{ status.id }}">
<a href="status/{{ status.id }}/" {% if status.colour %}style="border-color: #{{status.colour}}"{% endif %}
>{{ status.name }}</a></li>
{% endfor %}
@ -99,7 +99,7 @@
{% endif %}
>
{% for action in workflow.global_actions %}
<li class="biglistitem" id="itemId_{{ action.id }}"><a href="global-actions/{{ action.id }}/">{{ action.name }}</a></li>
<li class="biglistitem" data-id="{{ action.id }}"><a href="global-actions/{{ action.id }}/">{{ action.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
@ -121,7 +121,7 @@
>
{% spaceless %}
{% for level in workflow.criticality_levels %}
<li class="biglistitem" id="itemId_{{ level.id }}"
<li class="biglistitem" data-id="{{ level.id }}"
{% if level.colour %}style="border-left-color: #{{ level.colour }}"{% endif %}>
<a rel="popup" href="criticality-levels/{{ level.id }}">{{ level.name }}</a>
</li>