123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- (function($) {
- /**
- * Attaches the tree behavior to the term widget form.
- */
- Drupal.behaviors.termReferenceTree = {
- attach: function(context, settings) {
- // Bind the term expand/contract button to slide toggle the list underneath.
- $('.term-reference-tree-button', context).once('term-reference-tree-button').click(function() {
- $(this).toggleClass('term-reference-tree-collapsed');
- $(this).siblings('ul').slideToggle('fast');
- });
- // An expand all button (unimplemented)
- /*
- $('.expandbutton').click(function() {
- $(this).siblings('.term-reference-tree-button').trigger('click');
- });
- */
- $('.term-reference-tree', context).once('term-reference-tree').each(function() {
- // On page load, check whether the maximum number of choices is already selected.
- // If so, disable the other options.
- var tree = $(this);
- checkMaxChoices(tree, false);
- $(this).find('input[type=checkbox]').change(function() {
- checkMaxChoices(tree, $(this));
- });
- //On page load, check if the user wants a cascading selection.
- if($(this).hasClass('term-reference-tree-select-parents')) {
- $(this).find('.form-checkbox').parent().addClass('select-parents');
- }
- //On page load, check if the user wants a cascading selection.
- if($(this).hasClass('term-reference-tree-cascading-selection')) {
- var mode_select = $(this).hasClass('term-reference-tree-cascading-selection-mode-select');
- var mode_deselect = $(this).hasClass('term-reference-tree-cascading-selection-mode-deselect');
- //Check children when checkboxes are clicked.
- $(this).find('.form-checkbox').change(function(event) {
- var event_target = $(event.target);
- var event_target_checked = event_target.is(':checked');
- var control_id = event_target.attr('id');
- var children = event_target.parent().next().children().find('> :not(ul) > input[id^="' + control_id + '-children"]');
- if (!mode_select && !mode_deselect) {
- if(event_target_checked) {
- $(children).filter(':not(:checked)').click().trigger('change');
- }
- else {
- $(children).filter(':checked').click().trigger('change');
- }
- } else if (mode_select && event_target_checked) {
- $(children).filter(':not(:checked)').click().trigger('change');
- } else if (mode_deselect && !event_target_checked) {
- $(children).filter(':checked').click().trigger('change');
- }
- });
- //End process checkbox changes.
- } //End Want a cascading checking.
- });
- // track_list
- // just unselect items in tree on track_list button remove click
- // let builtin ajax form do the heavy work
- $('.term-reference-tree-track-list input[type="submit"][value="remove"]', context).click(function(e){
- e.preventDefault();
- var key = $(this).attr('term-reference-tree-key');
- $('input[type="checkbox"][value="'+key+'"]', $(this).parents('.term-reference-tree'))
- .prop('checked', false)
- .trigger('change');
- return false;
- });
- }
- };
- // This helper function checks if the maximum number of choices is already selected.
- // If so, it disables all the other options. If not, it enables them.
- function checkMaxChoices(item, checkbox) {
- var maxChoices = -1;
- try {
- maxChoices = parseInt(Drupal.settings.term_reference_tree.trees[item.attr('id')]['max_choices']);
- }
- catch (e){}
- var count = item.find(':checked').length;
- if(maxChoices > 0 && count >= maxChoices) {
- item.find('input[type=checkbox]:not(:checked)').attr('disabled', 'disabled').parent().addClass('disabled');
- } else {
- item.find('input[type=checkbox]').removeAttr('disabled').parent().removeClass('disabled');
- }
- if(checkbox) {
- if(item.hasClass('term-reference-tree-select-parents')) {
- if(checkbox.prop('checked')) {
- checkbox.parents('ul.term-reference-tree-level li').children('div.form-item').find('input[type=checkbox]').each(function() {
- $(this).prop('checked', true);
- });
- }
- }
- }
- }
- })(jQuery);
|