123 lines
2.4 KiB
JavaScript
123 lines
2.4 KiB
JavaScript
/**
|
|
* @class elFinder.history
|
|
* Store visited folders
|
|
* and provide "back" and "forward" methods
|
|
*
|
|
* @author Dmitry (dio) Levashov
|
|
*/
|
|
elFinder.prototype.history = function(fm) {
|
|
"use strict";
|
|
var self = this,
|
|
/**
|
|
* Update history on "open" event?
|
|
*
|
|
* @type Boolean
|
|
*/
|
|
update = true,
|
|
/**
|
|
* Directories hashes storage
|
|
*
|
|
* @type Array
|
|
*/
|
|
history = [],
|
|
/**
|
|
* Current directory index in history
|
|
*
|
|
* @type Number
|
|
*/
|
|
current,
|
|
/**
|
|
* Clear history
|
|
*
|
|
* @return void
|
|
*/
|
|
reset = function() {
|
|
history = [fm.cwd().hash];
|
|
current = 0;
|
|
update = true;
|
|
},
|
|
/**
|
|
* Browser native history object
|
|
*/
|
|
nativeHistory = (fm.options.useBrowserHistory && window.history && window.history.pushState)? window.history : null,
|
|
/**
|
|
* Open prev/next folder
|
|
*
|
|
* @Boolen open next folder?
|
|
* @return jQuery.Deferred
|
|
*/
|
|
go = function(fwd) {
|
|
if ((fwd && self.canForward()) || (!fwd && self.canBack())) {
|
|
update = false;
|
|
return fm.exec('open', history[fwd ? ++current : --current]).fail(reset);
|
|
}
|
|
return jQuery.Deferred().reject();
|
|
},
|
|
/**
|
|
* Sets the native history.
|
|
*
|
|
* @param String thash target hash
|
|
*/
|
|
setNativeHistory = function(thash) {
|
|
if (nativeHistory && (! nativeHistory.state || nativeHistory.state.thash !== thash)) {
|
|
nativeHistory.pushState({thash: thash}, null, location.pathname + location.search + (thash? '#elf_' + thash : ''));
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Return true if there is previous visited directories
|
|
*
|
|
* @return Boolen
|
|
*/
|
|
this.canBack = function() {
|
|
return current > 0;
|
|
};
|
|
|
|
/**
|
|
* Return true if can go forward
|
|
*
|
|
* @return Boolen
|
|
*/
|
|
this.canForward = function() {
|
|
return current < history.length - 1;
|
|
};
|
|
|
|
/**
|
|
* Go back
|
|
*
|
|
* @return void
|
|
*/
|
|
this.back = go;
|
|
|
|
/**
|
|
* Go forward
|
|
*
|
|
* @return void
|
|
*/
|
|
this.forward = function() {
|
|
return go(true);
|
|
};
|
|
|
|
// bind to elfinder events
|
|
fm.bind('init', function() {
|
|
if (nativeHistory && !nativeHistory.state) {
|
|
setNativeHistory(fm.startDir());
|
|
}
|
|
})
|
|
.open(function() {
|
|
var l = history.length,
|
|
cwd = fm.cwd().hash;
|
|
|
|
if (update) {
|
|
current >= 0 && l > current + 1 && history.splice(current+1);
|
|
history[history.length-1] != cwd && history.push(cwd);
|
|
current = history.length - 1;
|
|
}
|
|
update = true;
|
|
|
|
setNativeHistory(cwd);
|
|
})
|
|
.reload(fm.options.reloadClearHistory && reset);
|
|
|
|
};
|