OpenXE/www/js/aciTree/js/jquery.aciTree.hash.js
2021-05-21 08:49:41 +02:00

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);