mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2025-02-08 10:40:09 +01:00
171 lines
6.6 KiB
JavaScript
171 lines
6.6 KiB
JavaScript
|
|
/*
|
|
* aciTree jQuery Plugin v4.5.0-rc.7
|
|
* http://acoderinsights.ro
|
|
*
|
|
* Copyright (c) 2014 Dragos Ursu
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
*
|
|
* Require jQuery Library >= v1.9.0 http://jquery.com
|
|
* + aciPlugin >= v1.5.1 https://github.com/dragosu/jquery-aciPlugin
|
|
*/
|
|
|
|
/*
|
|
* This extension adds hash/fragment support using aciFragment, it opens/select item(s) based on variables stored in the fragment part of the URL.
|
|
* The states are loaded from the URL fragment and set on treeview init. Multiple item IDs separated with ";" are supported for
|
|
* opening/selecting deep items (if loading nodes is required).
|
|
* Require aciFragment https://github.com/dragosu/jquery-aciFragment and the utils extension for finding items by ID.
|
|
*/
|
|
|
|
(function($, window, undefined) {
|
|
|
|
// extra default options
|
|
|
|
var options = {
|
|
selectHash: null, // hash key name to select a item (item path IDs as key value, multiple item IDs separated with a ";")
|
|
openHash: null // hash key name to open item(s) (item path IDs as key value, multiple item IDs separated with a ";")
|
|
};
|
|
|
|
// aciTree hash extension
|
|
// select/open items based on IDs stored in the fragment of the current URL
|
|
|
|
var aciTree_hash = {
|
|
__extend: function() {
|
|
$.extend(this._private, {
|
|
lastSelect: null,
|
|
lastOpen: null,
|
|
// store `aciFragment` api
|
|
hashApi: null
|
|
});
|
|
// call the parent
|
|
this._super();
|
|
},
|
|
// init hash
|
|
_hashInit: function() {
|
|
// init `aciFragment`
|
|
this._instance.jQuery.aciFragment();
|
|
this._private.hashApi = this._instance.jQuery.aciFragment('api');
|
|
this._instance.jQuery.bind('acitree' + this._private.nameSpace, function(event, api, item, eventName, options) {
|
|
switch (eventName) {
|
|
case 'init':
|
|
api._hashRestore();
|
|
break;
|
|
}
|
|
}).bind('acifragment' + this._private.nameSpace, this.proxy(function(event, api, anchorChanged) {
|
|
event.stopPropagation();
|
|
this._hashRestore();
|
|
}));
|
|
},
|
|
// override `_initHook`
|
|
_initHook: function() {
|
|
if (this.extHast()) {
|
|
this._hashInit();
|
|
}
|
|
// call the parent
|
|
this._super();
|
|
},
|
|
// restore item states from hash
|
|
_hashRestore: function() {
|
|
var queue = this._instance.queue;
|
|
var process = function(opened) {
|
|
// open all hash items
|
|
for (var i in opened) {
|
|
(function(id) {
|
|
// add item to queue
|
|
queue.push(function(complete) {
|
|
this.search(null, {
|
|
success: function(item) {
|
|
this.open(item, {
|
|
uid: 'ui.hash',
|
|
success: complete,
|
|
fail: complete
|
|
});
|
|
},
|
|
fail: complete,
|
|
search: id
|
|
});
|
|
});
|
|
})(opened[i]);
|
|
}
|
|
};
|
|
if (this._instance.options.openHash) {
|
|
var hash = this._private.hashApi.get(this._instance.options.openHash, '');
|
|
if (hash.length && (hash != this._private.lastOpen)) {
|
|
this._private.lastOpen = hash;
|
|
var opened = hash.split(';');
|
|
process(opened);
|
|
}
|
|
}
|
|
// support `selectable` extension
|
|
if (this._instance.options.selectHash && this.extSelectable && this.extSelectable()) {
|
|
var hash = this._private.hashApi.get(this._instance.options.selectHash, '');
|
|
if (hash.length && (hash != this._private.lastSelect)) {
|
|
this._private.lastSelect = hash;
|
|
var opened = hash.split(';');
|
|
var selected = opened.pop();
|
|
process(opened);
|
|
if (selected) {
|
|
// select item
|
|
queue.push(function(complete) {
|
|
this.search(null, {
|
|
success: function(item) {
|
|
this.select(item, {
|
|
uid: 'ui.hash',
|
|
success: function(item) {
|
|
this.setVisible(item, {
|
|
center: true
|
|
});
|
|
complete();
|
|
},
|
|
fail: complete
|
|
});
|
|
},
|
|
fail: complete,
|
|
search: selected
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}
|
|
},
|
|
// test if hash is enabled
|
|
extHast: function() {
|
|
return this._instance.options.selectHash || this._instance.options.openHash;
|
|
},
|
|
// override set option
|
|
option: function(option, value) {
|
|
var hash = this.extHast();
|
|
// call the parent
|
|
this._super(option, value);
|
|
if (this.extHast() != hash) {
|
|
if (hash) {
|
|
this._hashDone();
|
|
} else {
|
|
this._hashInit();
|
|
}
|
|
}
|
|
},
|
|
// done hash
|
|
_hashDone: function() {
|
|
this._instance.jQuery.unbind(this._private.nameSpace);
|
|
this._private.hashApi = null;
|
|
this._instance.jQuery.aciFragment('destroy');
|
|
},
|
|
// override `_destroyHook`
|
|
_destroyHook: function(unloaded) {
|
|
if (unloaded) {
|
|
this._hashDone();
|
|
}
|
|
// call the parent
|
|
this._super(unloaded);
|
|
}
|
|
};
|
|
|
|
// extend the base aciTree class and add the hash stuff
|
|
aciPluginClass.plugins.aciTree = aciPluginClass.plugins.aciTree.extend(aciTree_hash, 'aciTreeHash');
|
|
|
|
// add extra default options
|
|
aciPluginClass.defaults('aciTree', options);
|
|
|
|
})(jQuery, this);
|