diff --git a/Resources/public/js/chill.js b/Resources/public/js/chill.js index d04a8266c..0899f1a4d 100644 --- a/Resources/public/js/chill.js +++ b/Resources/public/js/chill.js @@ -184,63 +184,175 @@ var chill = function() { * child) of a given form : each parent option has a category, the * child select only display options that have the same category of the * parent optionn + * + * The parent must have the class "chill-category-link-parent". + * + * The children must have the class "chill-category-link-child". Each option + * of the parent must have the attribute `data-link-category`, with the value of + * the connected option in parent. + * + * Example : + * + * ```html + * + * + * + * ``` + * + * TODO ECRIRE LA DOC METTRE LES TESTS DANS git : + * tester que init est ok : + - quand vide + - quand choix + * tester que quand sélection + - quand vide + - quand choix */ - /** - * TODO ECRIRE LA DOC METTRE LES TESTS DANS git : - * tester que init est ok : - - quand vide - - quand choix - * tester que quand sélection - - quand vide - - quand choix - */ function categoryLinkParentChildSelect() { var forms_to_link = $('form:has(select.chill-category-link-parent)'); forms_to_link.each(function(i,form_selector) { - var form = $(form_selector); + var form = $(form_selector), parent_multiple; form.old_category = null; form.link_parent = $(form).find('.chill-category-link-parent'); form.link_child = $(form).find('.chill-category-link-child'); - - $(form.link_parent).addClass('select2'); - $(form.link_parant).select2({allowClear: true}); - - form.old_category = null; - if($(form.link_parent).select2('data') !== null) { - form.old_category = ($(form.link_parent).select2('data').element[0].dataset.linkCategory); + + // check if the parent allow multiple or single results + parent_multiple = $(form).find('.chill-category-link-parent').get(0).multiple; + // if we use select2, parent_multiple will be `undefined` + if (typeof parent_multiple == 'undefined') { + // currently, I do not know how to check if multiple using select2. + // we suppose that multiple is false (old behaviour) + parent_multiple = false } + + $(form.link_parent).addClass('select2'); + $(form.link_parant).select2({allowClear: true}); // it is weird: when I fix the typo here, the whole stuff does not work anymore... + + if (parent_multiple == false) { - $(form.link_child).find('option') - .each(function(i,e) { - if( - ((!$(e).data('link-category')) || $(e).data('link-category') == form.old_category) && - ((!$(e).data('link-categories')) || form.old_category in $(e).data('link-categories').split(',')) - ) { - $(e).show(); - } else { - $(e).hide(); + form.old_category = null; + if($(form.link_parent).select2('data') !== null) { + form.old_category = ($(form.link_parent).select2('data').element[0].dataset.linkCategory); + } + + $(form.link_child).find('option') + .each(function(i,e) { + if( + ((!$(e).data('link-category')) || $(e).data('link-category') == form.old_category) && + ((!$(e).data('link-categories')) || form.old_category in $(e).data('link-categories').split(',')) + ) { + $(e).show(); + // here, we should handle the optgroup + } else { + $(e).hide(); + // here, we should handle the optgroup + } + }); + + form.link_parent.change(function() { + var new_category = ($(form.link_parent).select2('data').element[0].dataset.linkCategory); + if(new_category != form.old_category) { + $(form.link_child).find('option') + .each(function(i,e) { + if( + ((!$(e).data('link-category')) || $(e).data('link-category') == new_category) && + ((!$(e).data('link-categories')) || new_category in $(e).data('link-categories').split(',')) + ) { + $(e).show(); + // here, we should handle the optgroup + } else { + $(e).hide(); + // here, we should handle the opgroup + } + }); + $(form.link_child).find('option')[0].selected = true; + form.old_category = new_category; } }); - - form.link_parent.change(function() { - var new_category = ($(form.link_parent).select2('data').element[0].dataset.linkCategory); - if(new_category != form.old_category) { - $(form.link_child).find('option') - .each(function(i,e) { - if( - ((!$(e).data('link-category')) || $(e).data('link-category') == new_category) && - ((!$(e).data('link-categories')) || new_category in $(e).data('link-categories').split(',')) - ) { - $(e).show(); - } else { - $(e).hide(); - } - }); - $(form.link_child).find('option')[0].selected = true; - form.old_category = new_category; + } else { + var i=0, + selected_items = $(form.link_parent).find(':selected'); + + form.old_categories = []; + for (i=0;i < selected_items.length; i++) { + form.old_categories.push(selected_items[i].value); } - }); + + $(form.link_child).find('option') + .each(function(i,e) { + var visible; + if(form.old_categories.indexOf(e.dataset.linkCategory) != -1) { + $(e).show(); + if (e.parentNode instanceof HTMLOptGroupElement) { + $(e.parentNode).show(); + } + } else { + $(e).hide(); + if (e.parentNode instanceof HTMLOptGroupElement) { + // we check if the other options are visible. + visible = false + for (var l=0; l < e.parentNode.children.length; l++) { + if (window.getComputedStyle(e.parentNode.children[l]).getPropertyValue('display') != 'none') { + visible = true; + } + } + // if any options are visible, we hide the optgroup + if (visible == false) { + $(e.parentNode).hide(); + } + } + } + }); + + form.link_parent.change(function() { + var new_categories = [], + selected_items = $(form.link_parent).find(':selected'), + visible; + for (i=0;i < selected_items.length; i++) { + new_categories.push(selected_items[i].value); + } + + if(new_categories != form.old_categories) { + $(form.link_child).find('option') + .each(function(i,e) { + if(new_categories.indexOf(e.dataset.linkCategory) != -1) { + $(e).show(); + // if parent is an opgroup, we show it + if (e.parentNode instanceof HTMLOptGroupElement) { + $(e.parentNode).show(); + } + } else { + $(e).hide(); + // we check if the parent is an optgroup + if (e.parentNode instanceof HTMLOptGroupElement) { + // we check if other options are visible + visible = false + for (var l=0; l < e.parentNode.children.length; l++) { + if (window.getComputedStyle(e.parentNode.children[l]).getPropertyValue('display') != 'none') { + visible = true; + } + } + // if any options are visible, we hide the optgroup + if (visible == false) { + $(e.parentNode).hide(); + } + } + } + }); + //$(form.link_child).find('option')[0].selected = true; + form.old_categories = new_categories; + } + }); + } }); }