causeway-standard-theme
Version:
289 lines (247 loc) • 11.5 kB
JavaScript
(function(window, $) {
'use strict';
// Tree List
window.Causeway.treeList = {};
window.Causeway.treeList.elements = function (el) {
return $(el);
};
window.Causeway.treeList.addContentWrapper = function (el) {
el.append('<div class="tree-list-content">');
window.Causeway.treeList.treeElements = $('.tree-list-content', el);
};
window.Causeway.treeList.getElementsForButtons = function (el) {
if (el.data('treelist-buttons')) {
return el;
}
return false;
};
window.Causeway.treeList.addNoChildrenClass = function (el) {
var lastNodeParent = $('ul:has(>li.no-children)', el);
lastNodeParent.each(function () {
var lis = $('li', $(this)).length,
lisNo = $('li.no-children', $(this)).length;
if (lis === lisNo) {
$(this).addClass('no-children');
}
if(lis > 0) {
$('>li', $(this)).addClass('has-sibling');
}
});
};
window.Causeway.treeList.addPartialSelection = function(el) {
var noChildULs = $('ul.no-children', el);
// Add partial checkbox
noChildULs.each(function() {
var numOfChild = $('li.no-children', $(this)).length,
numOfCheckedInputs = $('input[type=checkbox]:checked', $(this)).length;
if(numOfCheckedInputs < numOfChild && numOfCheckedInputs > 0) {
$(this).removeClass('all').addClass('partial');
var partial = $(this).parents('li.jqtree_common').has('.partial');
$('>.jqtree-element>.form-group.checkbox', partial).addClass('partial');
} else if (numOfCheckedInputs === numOfChild && numOfCheckedInputs > 0) {
$(this).removeClass('partial').addClass('all');
var allTill = $(this).parentsUntil($('ul.jqtree-tree'), '.has-sibling');
var all = allTill.has('.all');
var partial1 = $(this).parents('li.jqtree_common').has('.partial');
$('>.jqtree-element>.form-group.checkbox', partial1).removeClass('partial');
$('>.jqtree-element>.form-group.checkbox>input[type=checkbox]', all).prop('checked','checked');
$('>.jqtree-element>.form-group.checkbox>label', all).addClass('checked');
var parentSiblings = allTill.nextAll(),
setFlag = true;
parentSiblings.each(function() {
setFlag = $('>.jqtree-element>.form-group.checkbox > input', $(this)).is(':checked');
if(!setFlag) {
return false;
}
});
if(!setFlag) {
$('>.jqtree-element>.form-group.checkbox', (allTill.parent()).parent('li.jqtree_common')).addClass('partial');
}
}
});
var childUls = ($('li.no-children', el)).parent().not('.no-children');
childUls.each(function() {
var child = $('>li', $(this)),
numOfChild = child.length,
numOfCheckedInputs = $('input[type=checkbox]:checked', child).length;
if (numOfCheckedInputs < numOfChild && numOfCheckedInputs > 0) {
$('>.jqtree-element>.form-group.checkbox', $(this).parent('li.jqtree_common')).addClass('partial');
}
});
};
window.Causeway.treeList.init = function (elements, data, options) {
var $this = window.Causeway.treeList.elements(elements);
var optionsParameter = typeof options !== 'undefined' ? options : {};
if ($this.length === 0) {
return;
}
var Options = {
data: data,
autoOpen: typeof optionsParameter.autoOpen !== 'undefined' ? optionsParameter.autoOpen : false,
autoEscape: typeof optionsParameter.autoEscape !== 'undefined' ? optionsParameter.autoEscape : false,
selectable: typeof optionsParameter.selectable !== 'undefined' ? optionsParameter.selectable : false,
useContextMenu: typeof optionsParameter.useContextMenu !== 'undefined' ? optionsParameter.useContextMenu : false,
closedIcon: typeof optionsParameter.closedIcon !== 'undefined' ? optionsParameter.closedIcon : '',
openedIcon: typeof optionsParameter.openedIcon !== 'undefined' ? optionsParameter.openedIcon : '',
onCreateLi: function(node, $li) {
var createLi = function (node, $li) {
var jqTreeElement = $li.find('.jqtree-element'),
selectedNode = node.selected || node.parent.selected,
checked = '',
labelClass = '';
if (selectedNode) {
node.selected = true;
checked = 'checked=\'checked\'';
labelClass = 'class=\'checked\'';
}
jqTreeElement.prepend(
'<div class=\'form-group checkbox no-label\'>' +
'<input type=\'checkbox\' class=\'value hidden-checkbox\' data-node-id=\'' + node.id +'\' id=\''+ node.id +'\'' + checked +'>' +
'<label for=\''+ node.id +'\'' + labelClass + '>' +
'<span class=\'checkbox-icon\'></span>' +
'</label>' +
'</div>'
);
$('.jqtree-title', jqTreeElement).wrapInner('<label for=\''+ node.id +'\'>');
if (!$li.hasClass('jqtree-folder')) {
$li.addClass('no-children');
}
};
if(typeof optionsParameter.onCreateLi !== 'undefined') {
createLi(node, $li);
optionsParameter.onCreateLi(node, $li);
} else {
createLi(node, $li);
}
}
};
//Add content wrapper
window.Causeway.treeList.addContentWrapper($this);
//Initialize the tree list
window.Causeway.treeList.treeElements.tree(Options);
// Add class to ul that has no children
window.Causeway.treeList.addNoChildrenClass($this);
// Add buttons
if (window.Causeway.treeList.getElementsForButtons($this)) {
$this.append(
'<div class=\'tree-list-buttons\'>' +
'<button type=\'button\' class=\'btn btn-text show-selected\'>Show Selected</button>' +
'<button type=\'button\' class=\'btn btn-default\'>Show All</button>' +
'</div>'
);
}
var noChildULs = $('ul.no-children', $this),
checkedInputs = $('input[type=checkbox]:checked', noChildULs);
// Open the selected node
if(!Options.autoOpen){
checkedInputs.parents('ul.no-children').first().prev('.jqtree-element').find('.jqtree-toggler').trigger('click');
}
// Add partial checkbox
window.Causeway.treeList.addPartialSelection($this);
};
window.Causeway.treeList.toJSon = function (id) {
return $(id + ' > .tree-list-content').tree('toJson');
};
// Handlers for buttons
$(document).on('click', '.tree-list-buttons button', function () {
var $this = $(this);
var unchecked = $this.parent().prev('.tree-list-content').find('li.no-children input[type=checkbox]').not(':checked'),
buttons = $('.tree-list-buttons button', $(this).parents('.tree-list'));
if ($this.hasClass('show-selected')) {
unchecked.parents('li.no-children').hide();
} else {
unchecked.parents('li.no-children').show();
}
buttons.removeClass('btn-default').addClass('btn-text');
$(this).removeClass('btn-text').addClass('btn-default');
});
// Handlers for checkboxes
$(document).on('change partial', '.form-group.checkbox input[type=checkbox]', function () {
var $this = $(this),
$thisTree = $this.parents('.tree-list-content'),
$thisNode = $thisTree.tree('getNodeById', $this.attr('id')),
thisFormGroup = $($thisNode.element.firstChild.firstChild),
thisLi = $($thisNode.element),
thisCheckbox = thisFormGroup.children('input[type=checkbox]'),
thisLabel = thisCheckbox.next('label'),
thisParentLi, parentLiFormGroup, parentLiCheckbox, parentLiLabel,
thisChildLi, childLiFormGroup, childLiCheckbox, childLiLabel,
sibLingCheckboxes, siblingChecked, numberOfSibCheckboxes, numberOfSibChecked, $parentNode;
if (typeof $thisNode.parent.element !== 'undefined') {
thisParentLi = $($thisNode.parent.element);
parentLiFormGroup = thisParentLi.children('.jqtree-element').children('.form-group.checkbox');
parentLiCheckbox = parentLiFormGroup.children('input[type=checkbox]');
parentLiLabel = parentLiCheckbox.next('label');
sibLingCheckboxes = thisParentLi.children('ul').children('li').children('div').find('input[type=checkbox]');
siblingChecked = sibLingCheckboxes.filter(':checked');
numberOfSibCheckboxes = sibLingCheckboxes.length;
numberOfSibChecked = siblingChecked.length;
$parentNode = $thisTree.tree('getNodeById', parentLiCheckbox.attr('id'));
}
if (thisLi.children('ul').length > 0) {
thisChildLi = thisLi.children('ul').find('li');
childLiFormGroup = thisChildLi.children('.jqtree-element').children('.form-group.checkbox');
childLiCheckbox = childLiFormGroup.children('input[type=checkbox]');
childLiLabel = childLiCheckbox.next('label');
}
if (!thisLi.hasClass('no-children')) {
if ($this.is(':checked')) {
thisFormGroup.removeClass('partial');
thisCheckbox.prop('checked', 'checked');
thisLabel.addClass('checked');
$thisNode.selected = true;
if (typeof childLiCheckbox !== 'undefined' && (typeof childLiCheckbox !== 'undefined' ? childLiCheckbox.length > 0 : false)) {
childLiCheckbox.prop('checked', 'checked');
childLiFormGroup.removeClass('partial');
childLiLabel.addClass('checked');
childLiCheckbox.each(function (i) {
var $childNode = $thisTree.tree('getNodeById', childLiCheckbox[i].id);
$childNode.selected = true;
});
}
} else if (!$this.is(':checked') && !thisFormGroup.hasClass('partial')) {
thisCheckbox.removeAttr('checked');
thisLabel.removeClass('checked');
$thisNode.selected = false;
if (typeof childLiCheckbox !== 'undefined' && (typeof childLiCheckbox !== 'undefined' ? childLiCheckbox.length > 0 : false)) {
childLiCheckbox.removeAttr('checked', 'checked');
childLiLabel.removeClass('checked');
childLiCheckbox.each(function (i) {
var $childNode = $thisTree.tree('getNodeById', childLiCheckbox[i].id);
$childNode.selected = false;
});
}
}
} else if (thisLi.hasClass('no-children')) {
if ($this.is(':checked')) {
$thisNode.selected = true;
} else if (!$this.is(':checked')) {
$thisNode.selected = false;
}
}
if (numberOfSibChecked === numberOfSibCheckboxes && numberOfSibChecked > 0) {
parentLiFormGroup.removeClass('partial');
parentLiCheckbox.prop('checked', 'checked');
parentLiLabel.addClass('checked');
$parentNode.selected = true;
} else if ((numberOfSibChecked < numberOfSibCheckboxes && numberOfSibChecked > 0)) {
parentLiFormGroup.addClass('partial');
parentLiCheckbox.removeAttr('checked');
parentLiLabel.removeClass('checked');
$parentNode.selected = false;
} else if (numberOfSibChecked === 0 && $this.parent('.form-group').hasClass('partial')) {
parentLiFormGroup.addClass('partial');
parentLiCheckbox.removeAttr('checked');
parentLiLabel.removeClass('checked');
$parentNode.selected = false;
} else if (numberOfSibChecked === 0) {
parentLiFormGroup.removeClass('partial');
parentLiCheckbox.removeAttr('checked');
parentLiLabel.removeClass('checked');
$parentNode.selected = false;
}
if (typeof parentLiCheckbox !== 'undefined') {
parentLiCheckbox.trigger('partial');
}
});
}(window, jQuery));