Chart.bundle.min.js
5 years ago
bootstrap-switch.min.js
5 years ago
bootstrap.min.js
5 years ago
deactivationSurvey.js
5 years ago
jquery-ui.js
5 years ago
jquery.fileupload.js
5 years ago
jquery.iframe-transport.js
5 years ago
jquery.rateyo.js
5 years ago
jstree.checkbox.js
5 years ago
jstree.min.js
5 years ago
jstree.types.js
5 years ago
jstree.wholerow.js
5 years ago
less.min.js
5 years ago
main.js
5 years ago
popup.js
5 years ago
sgNoticeDismiss.js
5 years ago
sgbackup.js
5 years ago
sgcloud.js
5 years ago
sgdiscount.js
5 years ago
sglicense.js
5 years ago
sglogin.js
5 years ago
sgrequesthandler.js
5 years ago
sgrequesthandler.wordpress.js
5 years ago
sgschedule.js
5 years ago
sgsettings.js
5 years ago
jstree.types.js
373 lines
| 1 | /** |
| 2 | * ### Types plugin |
| 3 | * |
| 4 | * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group. |
| 5 | */ |
| 6 | /*globals jQuery, define, exports, require */ |
| 7 | (function (factory) { |
| 8 | "use strict"; |
| 9 | if (typeof define === 'function' && define.amd) { |
| 10 | define('jstree.types', ['jquery','jstree'], factory); |
| 11 | } |
| 12 | else if(typeof exports === 'object') { |
| 13 | factory(require('jquery'), require('jstree')); |
| 14 | } |
| 15 | else { |
| 16 | factory(jQuery, jQuery.jstree); |
| 17 | } |
| 18 | }(function ($, jstree, undefined) { |
| 19 | "use strict"; |
| 20 | |
| 21 | if($.jstree.plugins.types) { return; } |
| 22 | |
| 23 | /** |
| 24 | * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional). |
| 25 | * |
| 26 | * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited. |
| 27 | * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited. |
| 28 | * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits. |
| 29 | * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme. |
| 30 | * * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data) |
| 31 | * * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data) |
| 32 | * |
| 33 | * There are two predefined types: |
| 34 | * |
| 35 | * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes. |
| 36 | * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified. |
| 37 | * |
| 38 | * @name $.jstree.defaults.types |
| 39 | * @plugin types |
| 40 | */ |
| 41 | $.jstree.defaults.types = { |
| 42 | 'default' : {} |
| 43 | }; |
| 44 | $.jstree.defaults.types[$.jstree.root] = {}; |
| 45 | |
| 46 | $.jstree.plugins.types = function (options, parent) { |
| 47 | this.init = function (el, options) { |
| 48 | var i, j; |
| 49 | if(options && options.types && options.types['default']) { |
| 50 | for(i in options.types) { |
| 51 | if(i !== "default" && i !== $.jstree.root && options.types.hasOwnProperty(i)) { |
| 52 | for(j in options.types['default']) { |
| 53 | if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) { |
| 54 | options.types[i][j] = options.types['default'][j]; |
| 55 | } |
| 56 | } |
| 57 | } |
| 58 | } |
| 59 | } |
| 60 | parent.init.call(this, el, options); |
| 61 | this._model.data[$.jstree.root].type = $.jstree.root; |
| 62 | }; |
| 63 | this.refresh = function (skip_loading, forget_state) { |
| 64 | parent.refresh.call(this, skip_loading, forget_state); |
| 65 | this._model.data[$.jstree.root].type = $.jstree.root; |
| 66 | }; |
| 67 | this.bind = function () { |
| 68 | this.element |
| 69 | .on('model.jstree', $.proxy(function (e, data) { |
| 70 | var m = this._model.data, |
| 71 | dpc = data.nodes, |
| 72 | t = this.settings.types, |
| 73 | i, j, c = 'default', k; |
| 74 | for(i = 0, j = dpc.length; i < j; i++) { |
| 75 | c = 'default'; |
| 76 | if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) { |
| 77 | c = m[dpc[i]].original.type; |
| 78 | } |
| 79 | if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) { |
| 80 | c = m[dpc[i]].data.jstree.type; |
| 81 | } |
| 82 | m[dpc[i]].type = c; |
| 83 | if(m[dpc[i]].icon === true && t[c].icon !== undefined) { |
| 84 | m[dpc[i]].icon = t[c].icon; |
| 85 | } |
| 86 | if(t[c].li_attr !== undefined && typeof t[c].li_attr === 'object') { |
| 87 | for (k in t[c].li_attr) { |
| 88 | if (t[c].li_attr.hasOwnProperty(k)) { |
| 89 | if (k === 'id') { |
| 90 | continue; |
| 91 | } |
| 92 | else if (m[dpc[i]].li_attr[k] === undefined) { |
| 93 | m[dpc[i]].li_attr[k] = t[c].li_attr[k]; |
| 94 | } |
| 95 | else if (k === 'class') { |
| 96 | m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class']; |
| 97 | } |
| 98 | } |
| 99 | } |
| 100 | } |
| 101 | if(t[c].a_attr !== undefined && typeof t[c].a_attr === 'object') { |
| 102 | for (k in t[c].a_attr) { |
| 103 | if (t[c].a_attr.hasOwnProperty(k)) { |
| 104 | if (k === 'id') { |
| 105 | continue; |
| 106 | } |
| 107 | else if (m[dpc[i]].a_attr[k] === undefined) { |
| 108 | m[dpc[i]].a_attr[k] = t[c].a_attr[k]; |
| 109 | } |
| 110 | else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') { |
| 111 | m[dpc[i]].a_attr['href'] = t[c].a_attr['href']; |
| 112 | } |
| 113 | else if (k === 'class') { |
| 114 | m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class']; |
| 115 | } |
| 116 | } |
| 117 | } |
| 118 | } |
| 119 | } |
| 120 | m[$.jstree.root].type = $.jstree.root; |
| 121 | }, this)); |
| 122 | parent.bind.call(this); |
| 123 | }; |
| 124 | this.get_json = function (obj, options, flat) { |
| 125 | var i, j, |
| 126 | m = this._model.data, |
| 127 | opt = options ? $.extend(true, {}, options, {no_id:false}) : {}, |
| 128 | tmp = parent.get_json.call(this, obj, opt, flat); |
| 129 | if(tmp === false) { return false; } |
| 130 | if($.isArray(tmp)) { |
| 131 | for(i = 0, j = tmp.length; i < j; i++) { |
| 132 | tmp[i].type = tmp[i].id && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default"; |
| 133 | if(options && options.no_id) { |
| 134 | delete tmp[i].id; |
| 135 | if(tmp[i].li_attr && tmp[i].li_attr.id) { |
| 136 | delete tmp[i].li_attr.id; |
| 137 | } |
| 138 | if(tmp[i].a_attr && tmp[i].a_attr.id) { |
| 139 | delete tmp[i].a_attr.id; |
| 140 | } |
| 141 | } |
| 142 | } |
| 143 | } |
| 144 | else { |
| 145 | tmp.type = tmp.id && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default"; |
| 146 | if(options && options.no_id) { |
| 147 | tmp = this._delete_ids(tmp); |
| 148 | } |
| 149 | } |
| 150 | return tmp; |
| 151 | }; |
| 152 | this._delete_ids = function (tmp) { |
| 153 | if($.isArray(tmp)) { |
| 154 | for(var i = 0, j = tmp.length; i < j; i++) { |
| 155 | tmp[i] = this._delete_ids(tmp[i]); |
| 156 | } |
| 157 | return tmp; |
| 158 | } |
| 159 | delete tmp.id; |
| 160 | if(tmp.li_attr && tmp.li_attr.id) { |
| 161 | delete tmp.li_attr.id; |
| 162 | } |
| 163 | if(tmp.a_attr && tmp.a_attr.id) { |
| 164 | delete tmp.a_attr.id; |
| 165 | } |
| 166 | if(tmp.children && $.isArray(tmp.children)) { |
| 167 | tmp.children = this._delete_ids(tmp.children); |
| 168 | } |
| 169 | return tmp; |
| 170 | }; |
| 171 | this.check = function (chk, obj, par, pos, more) { |
| 172 | if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; } |
| 173 | obj = obj && obj.id ? obj : this.get_node(obj); |
| 174 | par = par && par.id ? par : this.get_node(par); |
| 175 | var m = obj && obj.id ? (more && more.origin ? more.origin : $.jstree.reference(obj.id)) : null, tmp, d, i, j; |
| 176 | m = m && m._model && m._model.data ? m._model.data : null; |
| 177 | switch(chk) { |
| 178 | case "create_node": |
| 179 | case "move_node": |
| 180 | case "copy_node": |
| 181 | if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) { |
| 182 | tmp = this.get_rules(par); |
| 183 | if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) { |
| 184 | this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; |
| 185 | return false; |
| 186 | } |
| 187 | if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) { |
| 188 | this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; |
| 189 | return false; |
| 190 | } |
| 191 | if(m && obj.children_d && obj.parents) { |
| 192 | d = 0; |
| 193 | for(i = 0, j = obj.children_d.length; i < j; i++) { |
| 194 | d = Math.max(d, m[obj.children_d[i]].parents.length); |
| 195 | } |
| 196 | d = d - obj.parents.length + 1; |
| 197 | } |
| 198 | if(d <= 0 || d === undefined) { d = 1; } |
| 199 | do { |
| 200 | if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) { |
| 201 | this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; |
| 202 | return false; |
| 203 | } |
| 204 | par = this.get_node(par.parent); |
| 205 | tmp = this.get_rules(par); |
| 206 | d++; |
| 207 | } while(par); |
| 208 | } |
| 209 | break; |
| 210 | } |
| 211 | return true; |
| 212 | }; |
| 213 | /** |
| 214 | * used to retrieve the type settings object for a node |
| 215 | * @name get_rules(obj) |
| 216 | * @param {mixed} obj the node to find the rules for |
| 217 | * @return {Object} |
| 218 | * @plugin types |
| 219 | */ |
| 220 | this.get_rules = function (obj) { |
| 221 | obj = this.get_node(obj); |
| 222 | if(!obj) { return false; } |
| 223 | var tmp = this.get_type(obj, true); |
| 224 | if(tmp.max_depth === undefined) { tmp.max_depth = -1; } |
| 225 | if(tmp.max_children === undefined) { tmp.max_children = -1; } |
| 226 | if(tmp.valid_children === undefined) { tmp.valid_children = -1; } |
| 227 | return tmp; |
| 228 | }; |
| 229 | /** |
| 230 | * used to retrieve the type string or settings object for a node |
| 231 | * @name get_type(obj [, rules]) |
| 232 | * @param {mixed} obj the node to find the rules for |
| 233 | * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned |
| 234 | * @return {String|Object} |
| 235 | * @plugin types |
| 236 | */ |
| 237 | this.get_type = function (obj, rules) { |
| 238 | obj = this.get_node(obj); |
| 239 | return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type); |
| 240 | }; |
| 241 | /** |
| 242 | * used to change a node's type |
| 243 | * @name set_type(obj, type) |
| 244 | * @param {mixed} obj the node to change |
| 245 | * @param {String} type the new type |
| 246 | * @plugin types |
| 247 | */ |
| 248 | this.set_type = function (obj, type) { |
| 249 | var m = this._model.data, t, t1, t2, old_type, old_icon, k, d, a; |
| 250 | if($.isArray(obj)) { |
| 251 | obj = obj.slice(); |
| 252 | for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { |
| 253 | this.set_type(obj[t1], type); |
| 254 | } |
| 255 | return true; |
| 256 | } |
| 257 | t = this.settings.types; |
| 258 | obj = this.get_node(obj); |
| 259 | if(!t[type] || !obj) { return false; } |
| 260 | d = this.get_node(obj, true); |
| 261 | if (d && d.length) { |
| 262 | a = d.children('.jstree-anchor'); |
| 263 | } |
| 264 | old_type = obj.type; |
| 265 | old_icon = this.get_icon(obj); |
| 266 | obj.type = type; |
| 267 | if(old_icon === true || !t[old_type] || (t[old_type].icon !== undefined && old_icon === t[old_type].icon)) { |
| 268 | this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true); |
| 269 | } |
| 270 | |
| 271 | // remove old type props |
| 272 | if(t[old_type] && t[old_type].li_attr !== undefined && typeof t[old_type].li_attr === 'object') { |
| 273 | for (k in t[old_type].li_attr) { |
| 274 | if (t[old_type].li_attr.hasOwnProperty(k)) { |
| 275 | if (k === 'id') { |
| 276 | continue; |
| 277 | } |
| 278 | else if (k === 'class') { |
| 279 | m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], ''); |
| 280 | if (d) { d.removeClass(t[old_type].li_attr[k]); } |
| 281 | } |
| 282 | else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) { |
| 283 | m[obj.id].li_attr[k] = null; |
| 284 | if (d) { d.removeAttr(k); } |
| 285 | } |
| 286 | } |
| 287 | } |
| 288 | } |
| 289 | if(t[old_type] && t[old_type].a_attr !== undefined && typeof t[old_type].a_attr === 'object') { |
| 290 | for (k in t[old_type].a_attr) { |
| 291 | if (t[old_type].a_attr.hasOwnProperty(k)) { |
| 292 | if (k === 'id') { |
| 293 | continue; |
| 294 | } |
| 295 | else if (k === 'class') { |
| 296 | m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], ''); |
| 297 | if (a) { a.removeClass(t[old_type].a_attr[k]); } |
| 298 | } |
| 299 | else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) { |
| 300 | if (k === 'href') { |
| 301 | m[obj.id].a_attr[k] = '#'; |
| 302 | if (a) { a.attr('href', '#'); } |
| 303 | } |
| 304 | else { |
| 305 | delete m[obj.id].a_attr[k]; |
| 306 | if (a) { a.removeAttr(k); } |
| 307 | } |
| 308 | } |
| 309 | } |
| 310 | } |
| 311 | } |
| 312 | |
| 313 | // add new props |
| 314 | if(t[type].li_attr !== undefined && typeof t[type].li_attr === 'object') { |
| 315 | for (k in t[type].li_attr) { |
| 316 | if (t[type].li_attr.hasOwnProperty(k)) { |
| 317 | if (k === 'id') { |
| 318 | continue; |
| 319 | } |
| 320 | else if (m[obj.id].li_attr[k] === undefined) { |
| 321 | m[obj.id].li_attr[k] = t[type].li_attr[k]; |
| 322 | if (d) { |
| 323 | if (k === 'class') { |
| 324 | d.addClass(t[type].li_attr[k]); |
| 325 | } |
| 326 | else { |
| 327 | d.attr(k, t[type].li_attr[k]); |
| 328 | } |
| 329 | } |
| 330 | } |
| 331 | else if (k === 'class') { |
| 332 | m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class']; |
| 333 | if (d) { d.addClass(t[type].li_attr[k]); } |
| 334 | } |
| 335 | } |
| 336 | } |
| 337 | } |
| 338 | if(t[type].a_attr !== undefined && typeof t[type].a_attr === 'object') { |
| 339 | for (k in t[type].a_attr) { |
| 340 | if (t[type].a_attr.hasOwnProperty(k)) { |
| 341 | if (k === 'id') { |
| 342 | continue; |
| 343 | } |
| 344 | else if (m[obj.id].a_attr[k] === undefined) { |
| 345 | m[obj.id].a_attr[k] = t[type].a_attr[k]; |
| 346 | if (a) { |
| 347 | if (k === 'class') { |
| 348 | a.addClass(t[type].a_attr[k]); |
| 349 | } |
| 350 | else { |
| 351 | a.attr(k, t[type].a_attr[k]); |
| 352 | } |
| 353 | } |
| 354 | } |
| 355 | else if (k === 'href' && m[obj.id].a_attr[k] === '#') { |
| 356 | m[obj.id].a_attr['href'] = t[type].a_attr['href']; |
| 357 | if (a) { a.attr('href', t[type].a_attr['href']); } |
| 358 | } |
| 359 | else if (k === 'class') { |
| 360 | m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class']; |
| 361 | if (a) { a.addClass(t[type].a_attr[k]); } |
| 362 | } |
| 363 | } |
| 364 | } |
| 365 | } |
| 366 | |
| 367 | return true; |
| 368 | }; |
| 369 | }; |
| 370 | // include the types plugin by default |
| 371 | // $.jstree.defaults.plugins.push("types"); |
| 372 | })); |
| 373 |