110 lines
4.1 KiB
JavaScript
110 lines
4.1 KiB
JavaScript
(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);
|