Mercurial > repos > mingchen0919 > aurora_skewer
view vakata-jstree-3.3.5/src/jstree.massload.js @ 1:d74e8ffcf88f draft default tip
planemo upload commit 841d8b22bf9f1aaed6bfe8344b60617f45b275b2-dirty
author | mingchen0919 |
---|---|
date | Sun, 30 Dec 2018 13:56:16 -0500 |
parents | 0358f6f78adf |
children |
line wrap: on
line source
/** * ### Massload plugin * * Adds massload functionality to jsTree, so that multiple nodes can be loaded in a single request (only useful with lazy loading). */ /*globals jQuery, define, exports, require, document */ (function (factory) { "use strict"; if (typeof define === 'function' && define.amd) { define('jstree.massload', ['jquery','jstree'], factory); } else if(typeof exports === 'object') { factory(require('jquery'), require('jstree')); } else { factory(jQuery, jQuery.jstree); } }(function ($, jstree, undefined) { "use strict"; if($.jstree.plugins.massload) { return; } /** * massload configuration * * It is possible to set this to a standard jQuery-like AJAX config. * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node IDs need to be loaded, the return value of those functions will be used. * * You can also set this to a function, that function will receive the node IDs being loaded as argument and a second param which is a function (callback) which should be called with the result. * * Both the AJAX and the function approach rely on the same return value - an object where the keys are the node IDs, and the value is the children of that node as an array. * * { * "id1" : [{ "text" : "Child of ID1", "id" : "c1" }, { "text" : "Another child of ID1", "id" : "c2" }], * "id2" : [{ "text" : "Child of ID2", "id" : "c3" }] * } * * @name $.jstree.defaults.massload * @plugin massload */ $.jstree.defaults.massload = null; $.jstree.plugins.massload = function (options, parent) { this.init = function (el, options) { this._data.massload = {}; parent.init.call(this, el, options); }; this._load_nodes = function (nodes, callback, is_callback, force_reload) { var s = this.settings.massload, nodesString = JSON.stringify(nodes), toLoad = [], m = this._model.data, i, j, dom; if (!is_callback) { for(i = 0, j = nodes.length; i < j; i++) { if(!m[nodes[i]] || ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || force_reload) ) { toLoad.push(nodes[i]); dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.addClass("jstree-loading").attr('aria-busy',true); } } } this._data.massload = {}; if (toLoad.length) { if($.isFunction(s)) { return s.call(this, toLoad, $.proxy(function (data) { var i, j; if(data) { for(i in data) { if(data.hasOwnProperty(i)) { this._data.massload[i] = data[i]; } } } for(i = 0, j = nodes.length; i < j; i++) { dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy',false); } } parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }, this)); } if(typeof s === 'object' && s && s.url) { s = $.extend(true, {}, s); if($.isFunction(s.url)) { s.url = s.url.call(this, toLoad); } if($.isFunction(s.data)) { s.data = s.data.call(this, toLoad); } return $.ajax(s) .done($.proxy(function (data,t,x) { var i, j; if(data) { for(i in data) { if(data.hasOwnProperty(i)) { this._data.massload[i] = data[i]; } } } for(i = 0, j = nodes.length; i < j; i++) { dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy',false); } } parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }, this)) .fail($.proxy(function (f) { parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }, this)); } } } return parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }; this._load_node = function (obj, callback) { var data = this._data.massload[obj.id], rslt = null, dom; if(data) { rslt = this[typeof data === 'string' ? '_append_html_data' : '_append_json_data']( obj, typeof data === 'string' ? $($.parseHTML(data)).filter(function () { return this.nodeType !== 3; }) : data, function (status) { callback.call(this, status); } ); dom = this.get_node(obj.id, true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy',false); } delete this._data.massload[obj.id]; return rslt; } return parent._load_node.call(this, obj, callback); }; }; }));