Projet

Général

Profil

0001-fields-possibility-to-order-items-of-Item-s-Field-57.patch

Lauréline Guérin, 30 septembre 2021 17:03

Télécharger (6,15 ko)

Voir les différences:

Subject: [PATCH] fields: possibility to order items of Item(s)Field (#57251)

 wcs/fields.py                        |  1 +
 wcs/qommon/form.py                   |  4 ++-
 wcs/qommon/static/css/dc2/admin.scss |  3 +-
 wcs/qommon/static/js/widget_list.js  | 49 ++++++++++++++++++----------
 4 files changed, 37 insertions(+), 20 deletions(-)
wcs/fields.py
1793 1793
            element_kwargs={'render_br': False, 'size': 50},
1794 1794
            add_element_label=_('Add item'),
1795 1795
            attrs={'data-dynamic-display-child-of': 'data_mode', 'data-dynamic-display-value': 'simple-list'},
1796
            extra_css_class='sortable',
1796 1797
        )
1797 1798
        form.add(
1798 1799
            data_sources.DataSourceSelectionWidget,
wcs/qommon/form.py
1680 1680
        if add_element_label == 'Add row':
1681 1681
            add_element_label = str(_('Add row'))
1682 1682

  
1683
        self.extra_css_class = kwargs.pop('extra_css_class', None)
1684

  
1683 1685
        CompositeWidget.__init__(self, name, value=value, **kwargs)
1684 1686
        self.element_type = element_type
1685 1687
        self.element_kwargs = element_kwargs or {}
......
1727 1729
        self.element_names.append(name)
1728 1730

  
1729 1731
    def add_media(self):
1730
        get_response().add_javascript(['jquery.js', 'widget_list.js'])
1732
        get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'widget_list.js'])
1731 1733

  
1732 1734
    def transfer_form_value(self, request):
1733 1735
        for widget in self.get_widgets():
wcs/qommon/static/css/dc2/admin.scss
33 33
	padding: 0.5em 0;
34 34
}
35 35

  
36
ul.biglist span.handle {
36
ul.biglist span.handle,
37
.widget span.handle {
37 38
	cursor: move;
38 39
	display: inline-block;
39 40
	padding: 0.5ex;
wcs/qommon/static/js/widget_list.js
21 21
                     */
22 22
                    return true;
23 23
                }
24

  
25 24
                if ($(row).find('[name$=add_element], [data-dynamic-display-value]').length > 0) {
26 25
                    /* this has complex widgets, don't use
27 26
                     * javascript in that case */
......
32 31
                var new_row = $(row).clone();
33 32

  
34 33
                /* fix up form element name */
35
                $(new_row).find('[name^=' + prefix + ']').each(
36
                    function() {
37
                        var cur_name = $(this).attr('name');
38
                        var pos = cur_name.indexOf('element', prefix.length) + 7; // 7 == len(element)
39
                        var index = cur_name.substring(pos, cur_name.length);
40
                        var after_pos = Math.max(index.indexOf('-'), index.indexOf('$'));
41
                        var after = '';
42
                        if (after_pos != -1) {
43
                            after = index.substring(after_pos, index.length);
44
                        }
45
                        var new_name = cur_name.substring(0, cur_name.length-index.length) +
46
                            (parseInt(index)+1) + after;
47
                        $(this).attr('name', new_name);
48
                        if ($(this).attr('type') == 'text') {
49
                            $(this).attr('value', '');
50
                        }
34
                if ($('[name^=' + prefix + ']', new_row).length) {
35
                    var $element = $('[name^=' + prefix + ']', new_row);
36
                    if ($element.attr('type') == 'text') {
37
                        $element.attr('value', '');
51 38
                    }
52
                );
39
                    var cur_name = $element.attr('name');
40
                    var pos = cur_name.indexOf('element', prefix.length) + 7; // 7 == len(element)
41
                    var index = cur_name.substring(pos, cur_name.length);
42
                    var element_regex = RegExp(`\\$element(\\d)`, 'g');
43
                    index = parseInt(index) + 1;
44
                    $(new_row).html($(new_row).html().replace(element_regex, `$element${index}`));
45
                    $(new_row).attr('data-widget-name', $(new_row).attr('data-widget-name').replace(element_regex, `$element${index}`));
46
                }
53 47
                if (name_attr == 'to$add_element') {
54 48
                  /* replace 1st list element by an empty label, as it's used
55 49
                   * to remove an actual selection */
......
65 59
                return false;
66 60
            }
67 61
        );
62

  
63
        $('.widget.sortable input').each(function () {
64
            $('<span class="handle">⣿</span>').insertBefore($(this));
65
        });
66
        $('.widget.sortable .content').sortable({
67
            handle: '.handle',
68
            start: function(event, ui) {
69
                $('.widget.StringWidget input', $(this)).each(function () {
70
                    $(this).attr('value', $(this).val());  // save potential new values before the move
71
                });
72
            },
73
            update : function(event, ui) {
74
                $('.widget.StringWidget', $(this)).each(function (index) {
75
                    var element_regex = RegExp(`\\$element(\\d)`, 'g');
76
                    $(this).html($(this).html().replace(element_regex, `$element${index}`));
77
                    $(this).attr('data-widget-name', $(this).attr('data-widget-name').replace(element_regex, `$element${index}`));
78
                });
79
            },
80
        });
68 81
    }
69 82

  
70 83
$(document).ready(prepare_widget_list_elements);
71
-