Вход Регистрация
Файл: concrete5.7.5.6/concrete/js/build/core/groups.js
Строк: 294
<?php
/**
 * Groups tree
 */

!function(global, $, _) {
    
'use strict';

    function 
ConcreteGroupsTree($element, options) {
        var 
my = this;
        
options = options || {};
        
options = $.extend({
            
treeID: false,
            
minimumExpandLevel: 2,
            
selectNodeByKey: [],
            
enableDragAndDrop: true,
            
onSelect: false, // This is when you click a checkbox or radio button
            
onClick: false, // this is when you click a group title when not in chooseNodeInForm mode.
            
readOnly: false,
            
removeNodesByID: [],
            
chooseNodeInForm: false // false (no ability to choose a node as a form element), "single" uses radio, "multiple" = checkbox.
        
}, options);
        
my.options = options;
        
my.$element = $element;
        
my._menuTemplate = _.template(ConcreteGroupsTree.getMenu());
        
my.setupTree();
        
my.setupTreeEvents();
        return 
my.$element;
    }

    
ConcreteGroupsTree.prototype = {

        
dragRequest: function(sourceNode, node, hitMode) {
            var 
treeNodeParentID = node.parent.data.key;
            if (
hitMode == 'over') {
                
treeNodeParentID = node.data.key;
            }
            
jQuery.fn.dialog.showLoader();
            var 
params = [{'name': 'sourceTreeNodeID', 'value': sourceNode.data.key}, {'name': 'treeNodeParentID', 'value': treeNodeParentID}];
            var 
childNodes = node.parent.getChildren();
            if (
childNodes) {
                for (var 
i = 0; i < childNodes.length; i++) {
                    var 
childNode = childNodes[i];
                    
params.push({'name': 'treeNodeID[]', 'value': childNode.data.key});
                }
            }
            $.
ajax({
                
dataType: 'json',
                
type: 'POST',
                
data: params,
                
url: CCM_TOOLS_PATH + '/tree/node/drag_request',
                
success: function(r) {
                    
ccm_parseJSON(r, function() {});
                    
jQuery.fn.dialog.hideLoader();
                }
            });
        },

        
setupTree: function() {
            var 
my = this,
                
options = my.options,
                
classNames = {},
                
checkbox = false,
                
ajaxData = {};

            
ajaxData.treeID = options.treeID;

            if (
options.chooseNodeInForm) {
                
checkbox = true;
                switch(
options.chooseNodeInForm) {
                    case 
'single':
                        
classNames = {'checkbox': 'dynatree-radio'};
                        break;
                    case 
'multiple':
                        
classNames = {'checkbox': 'dynatree-checkbox'};
                        break;
                            
                }
                if (
options.selectNodesByKey.length) {
                    
ajaxData.treeNodeSelectedIDs = options.selectNodesByKey;
                }
            }
                        
            $(
my.$element).dynatree({
                
autoFocus: false,
                
cookieId: 'ConcreteGroups',
                
cookie: {
                    
path: CCM_REL + '/'
                
},
                
initAjax: {
                    
url: CCM_TOOLS_PATH + '/tree/load',
                    
type: 'post',
                    
data: ajaxData
                
},
                
onLazyRead: function(node) {
                    
my.reloadNode(node);
                },
                
onSelect: options.onSelect,
                
selectMode: options.chooseNodeInForm === 'multiple' ? 3 : 1, // allow multi-select for checkboxes
                
checkbox: checkbox,
                
classNames: classNames,
                
minExpandLevel: options.minimumExpandLevel,
                
clickFolderMode: 1,
                
onPostInit: function() {
                    var 
$tree = my.$element;

                    if (
options.removeNodesByID.length) {
                        for (var 
i = 0; i < options.removeNodesByID.length; i++) {
                            var 
nodeID = options.removeNodesByID[i];
                            var 
node = this.getNodeByKey(nodeID);
                            if (
node) {
                                
node.remove();
                            }
                        }
                    }

                    if (
options.readOnly) {
                        
$tree.dynatree('disable');
                    }

                    if (
options.chooseNodeInForm) {
                        var 
selectedNodes = $tree.dynatree('getTree');
                        
selectedNodes = selectedNodes.getSelectedNodes();
                        if (
selectedNodes[0]) {
                            var 
node = selectedNodes[0];
                            
options.onSelect(true, node);
                        }
                    }
                    if (
selectedNodes) {
                        var 
selKeys = $.map(selectedNodes, function(node){
                            
node.makeVisible();
                        });
                    }
                },
                
onClick: function(node, e) {

                    if (
node.getEventTargetType(e) == 'expander') {
                        return 
true;
                    }

                    if (
options.chooseNodeInForm) {
                        var 
targetType = node.getEventTargetType(e);
                        if (
targetType == 'checkbox' || targetType == 'title') {
                            if (
targetType == 'title') {
                                
node.select(true);
                            }
                            return 
true;
                        } else {
                            return 
false;
                        }
                    }

                    if (!
node.getEventTargetType(e)) {
                        return 
false;
                    }
                    if (!
options.chooseNodeInForm && node.getEventTargetType(e) == 'title') {
                        if (
options.onClick) {
                            if (!
node.data.gID) {
                                return 
false;
                            }
                            
options.onClick(node);
                        } else {
                            var 
$menu = my._menuTemplate({options: my.options, data: node.data});
                            if (
$menu) {
                                var 
menu = new ConcreteMenu($(node.span), {
                                    
menu: $menu,
                                    
handle: 'none'
                                
});
                                
menu.show(e);
                            }
                        }
                    }
                    return 
true;
                },
                
fx: {height: 'toggle', duration: 200},
                
dnd: {
                    
onDragStart: function(node) {
                        if (
options.enableDragAndDrop) {
                            return 
true;
                        } else {
                            return 
false;
                        }
                    },
                    
onDragStop: function(node) {

                    },
                    
autoExpandMS: 1000,
                    
preventVoidMoves: true,
                    
onDragEnter: function(node, sourceNode) {
                        return 
true;
                    },
                    
onDragOver: function(node, sourceNode, hitMode) {
                        if ((!
node.parent.data.treeNodeID) && (node.data.treeNodeID !== '1')) { // Home page has no parents, but we still want to be able to hit it.
                            
return false;
                        }

                        if((
hitMode != 'over') && (node.data.treeNodeID == 1)) {  // Home gets no siblings
                            
return false;
                        }

                        if (
sourceNode.data.treeNodeID == node.data.treeNodeID) {
                            return 
false; // can't drag node onto itself.
                        
}

                        if (!
node.data.treeNodeID && hitMode == 'after') {
                            return 
false;
                        }

                        
// Prevent dropping a parent below it's own child
                        
if(node.isDescendantOf(sourceNode)){
                          return 
false;
                        }
                        return 
true;
                    },
                    
onDrop: function(node, sourceNode, hitMode, ui, draggable) {
                        
sourceNode.move(node, hitMode);
                        
my.dragRequest(sourceNode, node, hitMode);
                    }
                }
            });
        },

        
setupTreeEvents: function() {

        },

        
reloadNode: function(node, onComplete) {
            var 
my = this,
                
options = my.options,
                
params = {
                    
url: CCM_TOOLS_PATH + '/tree/node/load',
                    
data: {
                        
treeNodeParentID: node.data.key
                    
},
                    
success: function() {
                        if (
onComplete) {
                            
onComplete();
                        }
                    }
                };
                
            
node.appendAjax(params);
        }

    };

    
/** 
     * Static methods
     */

    
ConcreteGroupsTree.getMenu = function() {
        return 
'<div class="ccm-popover-page-menu popover fade" data-search-page-menu="<%=data.cID%>" data-search-menu="<%=data.cID%>">' +
            
'<div class="arrow"></div><div class="popover-inner"><ul class="dropdown-menu">' + 
            
'<% if (data.canEditTreeNode && data.treeNodeTypeHandle == 'group' && data.gID) { %>' + 
                
'<li><a href="' + CCM_DISPATCHER_FILENAME + '/dashboard/users/groups/-/edit/<%=data.gID%>">' + ccmi18n_groups.editGroup + '</a></li>' + 
            
'<% } %>' +
            
'<% if (data.canEditTreeNodePermissions) { %>' + 
                
'<li><a class="dialog-launch" dialog-width="480" dialog-height="380" dialog-modal="true" dialog-title="Edit Permissions" href="' + CCM_TOOLS_PATH + '/tree/node/permissions?treeNodeID=<%=data.key%>">' + ccmi18n_groups.editPermissions + '</a></li>' + 
            
'<% } %>' +
        
'</ul></div></div>';
    };

    
// jQuery Plugin
    
$.fn.concreteGroupsTree = function(options) {
        return $.
each($(this), function(i, obj) {
            new 
ConcreteGroupsTree($(this), options);
        });
    };

    global.
ConcreteGroupsTree = ConcreteGroupsTree;

}(
this, $, _);
?>
Онлайн: 2
Реклама