Files
iTop/js/search/search_form_handler_history.js
2018-04-20 09:50:13 +00:00

133 lines
3.1 KiB
JavaScript

/**
*
* iTop Search form history handler
*
* the widget exposes
*
* $(cssSelector).search_form_handler_history({"itop_root_class":"FooBarClass"}) : constructor
* $(cssSelector).search_form_handler_history("getHistory") : history array getter
* $(cssSelector).search_form_handler_history("setLatest", "field.ref") : prepend the field ref to the beginning of the history array
*
*
* please take a look at the options for custom constructor values
*
*
* The persistence layer rely on these two core iTop's JS functions :
* - GetUserPreference(sPreferenceCode, sDefaultValue)
* - SetUserPreference(sPreferenceCode, sPrefValue, bPersistent)
*
*/
;
$(function()
{
// the widget definition, where 'itop' is the namespace,
// 'search_form_handler_history' the widget name
$.widget( 'itop.search_form_handler_history',
{
// default options
options:
{
"itop_root_class": null,
"preference_code": undefined, // if undefined, it is computed on _create
"history_max_length": 5, // if the history is longer, the older entries are removed
"history_backend_store_timeout": 5000, // wait for this time before storing the new history in the backend
},
aHistory : [],
iStoreHistoryTimeoutHandler : undefined,
/**
* the constructor, called by the widget factory
* @private
*/
_create: function()
{
var me = this;
if (me.options.preference_code == undefined)
{
me.options.preference_code = me.options.itop_root_class + '__search_history';
}
me.aHistory = JSON.parse(GetUserPreference(me._getPreferenceCode(), "[]"));
},
getHistory: function()
{
var me = this;
return me.aHistory;
},
setLatest: function(sFieldRef)
{
var me = this;
//if present, delete
var iIndexInHistory = me.aHistory.indexOf(sFieldRef);
if (iIndexInHistory > -1)
{
me.aHistory.splice(iIndexInHistory, 1);
}
//add to the begining
me.aHistory.unshift(sFieldRef);
//restrain the length to me.options.history_max_length
var iDeleteCount = me.aHistory.length - me.options.history_max_length;
if (iDeleteCount > 0)
{
me.aHistory.splice(-iDeleteCount, iDeleteCount);
}
//store it in the backend (with a delay in the hope to wait long enough to make bulk modifications
me._storeHistory();
//setter should never return a value!
return;
},
/**
* @returns String
* @private
*/
_getPreferenceCode: function()
{
return this.options.preference_code;
},
/**
* should only be called by setLatest in order to store the updated history
* @private
*/
_storeHistory: function()
{
var me = this;
if (undefined != this.iStoreHistoryTimeoutHandler)
{
clearTimeout(this.iStoreHistoryTimeoutHandler);
}
this.iStoreHistoryTimeoutHandler = setTimeout(function(){ me._storeHistoryTimeoutFunction(); }, this.options.history_backend_store_timeout);
},
/**
* should only be called by _storeHistory using a timeout
* @private
*/
_storeHistoryTimeoutFunction: function()
{
SetUserPreference(this._getPreferenceCode(), JSON.stringify(this.getHistory()), true);
this.iStoreHistoryTimeoutHandler = undefined;
}
});
});