2018-07-13 18:39:55 +02:00
|
|
|
/*
|
|
|
|
* Copyright (c) Codiad & Kent Safranski (codiad.com), distributed
|
|
|
|
* as-is and without warranty under the MIT License. See
|
|
|
|
* [root]/license.txt for more. This information must remain intact.
|
|
|
|
*/
|
|
|
|
|
2018-07-18 23:00:52 +02:00
|
|
|
(function(global, $){
|
|
|
|
|
|
|
|
var codiad = global.codiad;
|
|
|
|
|
|
|
|
$(window)
|
|
|
|
.load(function() {
|
|
|
|
codiad.filemanager.init();
|
|
|
|
});
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
|
|
|
|
codiad.filemanager = {
|
2019-02-07 19:55:17 +01:00
|
|
|
|
|
|
|
auto_reload: false,
|
2018-07-13 18:39:55 +02:00
|
|
|
clipboard: '',
|
|
|
|
controller: 'components/filemanager/controller.php',
|
|
|
|
dialog: 'components/filemanager/dialog.php',
|
|
|
|
dialogUpload: 'components/filemanager/dialog_upload.php',
|
2019-02-07 19:55:17 +01:00
|
|
|
preview: null,
|
|
|
|
|
|
|
|
init: async function() {
|
2018-07-18 23:00:52 +02:00
|
|
|
|
|
|
|
this.noAudio = [
|
|
|
|
//Audio
|
|
|
|
'aac',
|
|
|
|
'aif',
|
|
|
|
'mp3',
|
|
|
|
'mp4',
|
|
|
|
'wav',
|
|
|
|
'ogg',
|
|
|
|
],
|
|
|
|
this.noFiles = [
|
|
|
|
//Files
|
|
|
|
'exe',
|
|
|
|
'pdf',
|
|
|
|
'zip',
|
|
|
|
'tar',
|
|
|
|
'tar.gz',
|
|
|
|
],
|
|
|
|
this.noImages = [
|
|
|
|
//Images
|
|
|
|
'ico',
|
|
|
|
'icon',
|
|
|
|
'jpg',
|
|
|
|
'jpeg',
|
|
|
|
'png',
|
|
|
|
'gif',
|
|
|
|
'bmp',
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
this.noOpen = this.noAudio.concat( this.noFiles, this.noImages ),
|
|
|
|
this.noBrowser = this.noAudio.concat( this.noImages ),
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
// Initialize node listener
|
|
|
|
this.nodeListener();
|
Changed $path to __DIR__ for config location, Updated auto reload variables, Removed unload listener for auto reload, Changed project default to array so that if no projects exist the program does not crash, Updated autosave to use let instead of vars, Fixed capitalization for sideExpanded variable, Added try catch to pdo initialization on install, Added more error checks on install, Removed password function on install query, Changed default settings array, Added loading div to user delete, Updated queries that threw errors when a default value was zero, Added blank username and password check,
2019-02-09 22:14:27 +01:00
|
|
|
this.auto_reload = ( await codiad.settings.get_option( "codiad.filemanager.autoReloadPreview" ) == "true" );
|
2019-02-07 19:55:17 +01:00
|
|
|
|
|
|
|
console.log( this.auto_reload );
|
|
|
|
|
|
|
|
amplify.subscribe( 'settings.save', async function() {
|
|
|
|
|
Changed $path to __DIR__ for config location, Updated auto reload variables, Removed unload listener for auto reload, Changed project default to array so that if no projects exist the program does not crash, Updated autosave to use let instead of vars, Fixed capitalization for sideExpanded variable, Added try catch to pdo initialization on install, Added more error checks on install, Removed password function on install query, Changed default settings array, Added loading div to user delete, Updated queries that threw errors when a default value was zero, Added blank username and password check,
2019-02-09 22:14:27 +01:00
|
|
|
let option = ( await codiad.settings.get_option( "codiad.filemanager.autoReloadPreview" ) == "true" );
|
2019-02-07 19:55:17 +01:00
|
|
|
if( option != codiad.filemanager.auto_reload ) {
|
|
|
|
|
|
|
|
//codiad.auto_save.reload_interval();
|
|
|
|
window.location.reload();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
/* Subscribe to know when a file become active. */
|
|
|
|
amplify.subscribe( 'active.onFocus', async function( path ) {
|
|
|
|
|
|
|
|
let _this = codiad.filemanager;
|
|
|
|
let editor = codiad.editor.getActive();
|
|
|
|
|
|
|
|
if( _this.auto_reload && editor !== null ) {
|
|
|
|
|
|
|
|
codiad.editor.getActive().addEventListener( "change", _this.refreshPreview );
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
// Load uploader
|
|
|
|
$.loadScript("components/filemanager/upload_scripts/jquery.ui.widget.js", true);
|
|
|
|
$.loadScript("components/filemanager/upload_scripts/jquery.iframe-transport.js", true);
|
|
|
|
$.loadScript("components/filemanager/upload_scripts/jquery.fileupload.js", true);
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Listen for dbclick events on nodes
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
nodeListener: function() {
|
|
|
|
var _this = this;
|
|
|
|
|
|
|
|
$('#file-manager').on('selectstart', false);
|
|
|
|
|
|
|
|
$('#file-manager span')
|
|
|
|
.live('click', function() { // Open or Expand
|
|
|
|
if ($(this).parent().children("a").attr('data-type') == 'directory') {
|
|
|
|
_this.index($(this).parent().children("a")
|
|
|
|
.attr('data-path'));
|
|
|
|
} else {
|
|
|
|
_this.openFile($(this).parent().children("a")
|
|
|
|
.attr('data-path'));
|
|
|
|
}
|
|
|
|
if (!$(this).hasClass('none')) {
|
|
|
|
if ($(this).hasClass('plus')) {
|
|
|
|
$(this).removeClass('plus')
|
|
|
|
$(this).addClass('minus');
|
|
|
|
} else {
|
|
|
|
$(this).removeClass('minus')
|
|
|
|
$(this).addClass('plus');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
$('#file-manager a')
|
|
|
|
.live('dblclick', function() { // Open or Expand
|
|
|
|
if (!codiad.editor.settings.fileManagerTrigger) {
|
|
|
|
if ($(this)
|
|
|
|
.hasClass('directory')) {
|
|
|
|
_this.index($(this)
|
|
|
|
.attr('data-path'));
|
|
|
|
} else {
|
|
|
|
_this.openFile($(this)
|
|
|
|
.attr('data-path'));
|
|
|
|
}
|
|
|
|
if (!$(this).parent().children("span").hasClass('none')) {
|
|
|
|
if ($(this).parent().children("span").hasClass('plus')) {
|
|
|
|
$(this).parent().children("span").removeClass('plus')
|
|
|
|
$(this).parent().children("span").addClass('minus');
|
|
|
|
} else {
|
|
|
|
$(this).parent().children("span").removeClass('minus')
|
|
|
|
$(this).parent().children("span").addClass('plus');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.live('click', function() { // Open or Expand
|
|
|
|
if (codiad.editor.settings.fileManagerTrigger) {
|
|
|
|
if ($(this)
|
|
|
|
.hasClass('directory')) {
|
|
|
|
_this.index($(this)
|
|
|
|
.attr('data-path'));
|
|
|
|
} else {
|
|
|
|
_this.openFile($(this)
|
|
|
|
.attr('data-path'));
|
|
|
|
}
|
|
|
|
if (!$(this).parent().children("span").hasClass('none')) {
|
|
|
|
if ($(this).parent().children("span").hasClass('plus')) {
|
|
|
|
$(this).parent().children("span").removeClass('plus')
|
|
|
|
$(this).parent().children("span").addClass('minus');
|
|
|
|
} else {
|
|
|
|
$(this).parent().children("span").removeClass('minus')
|
|
|
|
$(this).parent().children("span").addClass('plus');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.live("contextmenu", function(e) { // Context Menu
|
|
|
|
e.preventDefault();
|
|
|
|
_this.contextMenuShow(e, $(this)
|
|
|
|
.attr('data-path'), $(this)
|
|
|
|
.attr('data-type'), $(this)
|
|
|
|
.html());
|
|
|
|
$(this)
|
|
|
|
.addClass('context-menu-active');
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Context Menu
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
contextMenuShow: function(e, path, type, name) {
|
|
|
|
var _this = this;
|
2019-01-22 20:21:20 +01:00
|
|
|
|
|
|
|
$('#context-menu a, #context-menu hr').hide();
|
2018-07-13 18:39:55 +02:00
|
|
|
// Selective options
|
|
|
|
switch (type) {
|
|
|
|
case 'directory':
|
2019-01-22 20:21:20 +01:00
|
|
|
$('#context-menu .directory-only, #context-menu .non-root, #context-menu .both').show();
|
2018-07-13 18:39:55 +02:00
|
|
|
break;
|
|
|
|
case 'file':
|
2019-01-22 20:21:20 +01:00
|
|
|
$('#context-menu .file-only, #context-menu .non-root, #context-menu .both').show();
|
2018-07-13 18:39:55 +02:00
|
|
|
break;
|
|
|
|
case 'root':
|
2019-01-22 20:21:20 +01:00
|
|
|
$('#context-menu .directory-only, #context-menu .root-only').show();
|
2018-07-13 18:39:55 +02:00
|
|
|
break;
|
2019-01-18 06:32:10 +01:00
|
|
|
case 'editor':
|
|
|
|
$('#context-menu .editor-only').show();
|
|
|
|
break;
|
2018-07-13 18:39:55 +02:00
|
|
|
}
|
|
|
|
if(codiad.project.isAbsPath($('#file-manager a[data-type="root"]').attr('data-path'))) {
|
|
|
|
$('#context-menu .no-external').hide();
|
2019-01-18 06:32:10 +01:00
|
|
|
} else if( type == "editor" ) {
|
|
|
|
$('#context-menu .no-external').hide();
|
2018-07-13 18:39:55 +02:00
|
|
|
} else {
|
|
|
|
$('#context-menu .no-external').show();
|
|
|
|
}
|
|
|
|
// Show menu
|
|
|
|
var top = e.pageY;
|
|
|
|
if (top > $(window).height() - $('#context-menu').height()) {
|
|
|
|
top -= $('#context-menu').height();
|
|
|
|
}
|
|
|
|
if (top < 10) {
|
|
|
|
top = 10;
|
|
|
|
}
|
|
|
|
var max = $(window).height() - top - 10;
|
|
|
|
|
|
|
|
$('#context-menu')
|
|
|
|
.css({
|
|
|
|
'top': top + 'px',
|
|
|
|
'left': e.pageX + 'px',
|
|
|
|
'max-height': max + 'px'
|
|
|
|
})
|
|
|
|
.fadeIn(200)
|
|
|
|
.attr('data-path', path)
|
|
|
|
.attr('data-type', type)
|
|
|
|
.attr('data-name', name);
|
|
|
|
// Show faded 'paste' if nothing in clipboard
|
|
|
|
if (this.clipboard === '') {
|
|
|
|
$('#context-menu a[content="Paste"]')
|
|
|
|
.addClass('disabled');
|
|
|
|
} else {
|
|
|
|
$('#context-menu a[data-action="paste"]')
|
|
|
|
.removeClass('disabled');
|
|
|
|
}
|
|
|
|
// Hide menu
|
2019-01-22 20:43:05 +01:00
|
|
|
/**
|
|
|
|
* make sure that the user has moved their mouse far enough
|
|
|
|
* away from the context menu to warrant a close.
|
|
|
|
*/
|
|
|
|
$('#file-manager, #editor-region').on( 'mousemove', codiad.filemanager.contextCheckMouse );
|
2019-02-04 22:42:12 +01:00
|
|
|
$('#context-menu, #editor-region').on( 'paste', codiad.editor.paste );
|
2019-01-22 20:43:05 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
/* Notify listeners. */
|
|
|
|
amplify.publish('context-menu.onShow', {e: e, path: path, type: type});
|
|
|
|
// Hide on click
|
|
|
|
$('#context-menu a')
|
|
|
|
.click(function() {
|
|
|
|
_this.contextMenuHide();
|
|
|
|
});
|
|
|
|
},
|
2019-01-22 20:21:20 +01:00
|
|
|
|
|
|
|
contextCheckMouse: function( e ) {
|
|
|
|
|
|
|
|
let offset = $('#context-menu').offset();
|
2019-01-22 20:43:05 +01:00
|
|
|
let bottom = offset.top + $('#context-menu').outerHeight( true ) + 20;
|
|
|
|
let left = offset.left - 20;
|
|
|
|
let right = offset.left + $('#context-menu').outerWidth( true ) + 20;
|
|
|
|
let top = offset.top - 20;
|
|
|
|
|
2019-01-22 20:21:20 +01:00
|
|
|
if( ( e.clientX > right || e.clientX < left ) || ( e.clientY > bottom || e.clientY < top ) ) {
|
|
|
|
|
|
|
|
$('#file-manager, #editor-region').off( 'mousemove', codiad.filemanager.contextCheckMouse );
|
2019-02-04 22:42:12 +01:00
|
|
|
$('#context-menu, #editor-region').off( 'paste', codiad.editor.paste );
|
2019-01-22 20:21:20 +01:00
|
|
|
codiad.filemanager.contextMenuHide();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
contextMenuHide: function() {
|
|
|
|
$('#context-menu')
|
|
|
|
.fadeOut(200);
|
|
|
|
$('#file-manager a')
|
|
|
|
.removeClass('context-menu-active');
|
|
|
|
/* Notify listeners. */
|
|
|
|
amplify.publish('context-menu.onHide');
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Return the node name (sans path)
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
getShortName: function(path) {
|
|
|
|
return path.split('/')
|
|
|
|
.pop();
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Return extension
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
getExtension: function(path) {
|
|
|
|
return path.split('.')
|
|
|
|
.pop();
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Return type
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
getType: function(path) {
|
|
|
|
return $('#file-manager a[data-path="' + path + '"]')
|
|
|
|
.attr('data-type');
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Create node in file tree
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
createObject: function(parent, path, type) {
|
|
|
|
// NODE FORMAT: <li><a class="{type} {ext-file_extension}" data-type="{type}" data-path="{path}">{short_name}</a></li>
|
|
|
|
var parentNode = $('#file-manager a[data-path="' + parent + '"]');
|
|
|
|
if (!$('#file-manager a[data-path="' + path + '"]')
|
|
|
|
.length) { // Doesn't already exist
|
|
|
|
if (parentNode.hasClass('open') && parentNode.hasClass('directory')) { // Only append node if parent is open (and a directory)
|
|
|
|
var shortName = this.getShortName(path);
|
|
|
|
if (type == 'directory') {
|
|
|
|
var appendage = '<li><span class="none"></span><a class="directory" data-type="directory" data-path="' + path + '">' + shortName + '</a></li>';
|
|
|
|
} else {
|
|
|
|
var appendage = '<li><span class="none"></span><a class="file ext-' +
|
|
|
|
this.getExtension(shortName) +
|
|
|
|
'" data-type="file" data-path="' +
|
|
|
|
path + '">' + shortName + '</a></li>';
|
|
|
|
}
|
|
|
|
if (parentNode.siblings('ul')
|
|
|
|
.length) { // UL exists, other children to play with
|
|
|
|
parentNode.siblings('ul')
|
|
|
|
.append(appendage);
|
|
|
|
} else {
|
|
|
|
$('<ul>' + appendage + '</ul>')
|
|
|
|
.insertAfter(parentNode);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
parentNode.parent().children('span').removeClass('none');
|
|
|
|
parentNode.parent().children('span').addClass('plus');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Loop out all files and folders in directory path
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
indexFiles: [],
|
|
|
|
|
|
|
|
index: function(path, rescan) {
|
|
|
|
var _this = this;
|
|
|
|
if (rescan === undefined) {
|
|
|
|
rescan = false;
|
|
|
|
}
|
|
|
|
node = $('#file-manager a[data-path="' + path + '"]');
|
|
|
|
if (node.hasClass('open') && !rescan) {
|
|
|
|
node.parent('li')
|
|
|
|
.children('ul')
|
|
|
|
.slideUp(300, function() {
|
|
|
|
$(this)
|
|
|
|
.remove();
|
|
|
|
node.removeClass('open');
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
node.addClass('loading');
|
|
|
|
$.get(this.controller + '?action=index&path=' + encodeURIComponent(path), function(data) {
|
|
|
|
node.addClass('open');
|
|
|
|
var objectsResponse = codiad.jsend.parse(data);
|
|
|
|
if (objectsResponse != 'error') {
|
|
|
|
/* Notify listener */
|
|
|
|
_this.indexFiles = objectsResponse.index;
|
|
|
|
amplify.publish("filemanager.onIndex", {path: path, files: _this.indexFiles});
|
|
|
|
var files = _this.indexFiles;
|
|
|
|
if (files.length > 0) {
|
|
|
|
if (node.parent().children('span').hasClass('plus')) {
|
|
|
|
node.parent().children('span').removeClass('plus').addClass('minus');
|
|
|
|
}
|
|
|
|
var display = 'display:none;';
|
|
|
|
if (rescan) {
|
|
|
|
display = '';
|
|
|
|
}
|
|
|
|
var appendage = '<ul style="' + display + '">';
|
|
|
|
$.each(files, function(index) {
|
|
|
|
var ext = '';
|
|
|
|
var name = files[index].name.replace(path, '');
|
|
|
|
var nodeClass = 'none';
|
|
|
|
name = name.split('/')
|
|
|
|
.join(' ');
|
|
|
|
if (files[index].type == 'file') {
|
|
|
|
var ext = ' ext-' + name.split('.')
|
|
|
|
.pop();
|
|
|
|
}
|
|
|
|
if(files[index].type == 'directory' && files[index].size > 0) {
|
|
|
|
nodeClass = 'plus';
|
|
|
|
}
|
|
|
|
appendage += '<li><span class="' + nodeClass + '"></span><a class="' + files[index].type + ext + '" data-type="' + files[index].type + '" data-path="' + files[index].name + '">' + name + '</a></li>';
|
|
|
|
});
|
|
|
|
appendage += '</ul>';
|
|
|
|
if (rescan) {
|
|
|
|
node.parent('li')
|
|
|
|
.children('ul')
|
|
|
|
.remove();
|
|
|
|
}
|
|
|
|
$(appendage)
|
|
|
|
.insertAfter(node);
|
|
|
|
if (!rescan) {
|
|
|
|
node.siblings('ul')
|
|
|
|
.slideDown(300);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
node.removeClass('loading');
|
|
|
|
if (rescan && _this.rescanChildren.length > _this.rescanCounter) {
|
|
|
|
_this.rescan(_this.rescanChildren[_this.rescanCounter++]);
|
|
|
|
} else {
|
|
|
|
_this.rescanChildren = [];
|
|
|
|
_this.rescanCounter = 0;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
rescanChildren: [],
|
|
|
|
|
|
|
|
rescanCounter: 0,
|
|
|
|
|
|
|
|
rescan: function(path) {
|
|
|
|
var _this = this;
|
|
|
|
if (this.rescanCounter === 0) {
|
|
|
|
// Create array of open directories
|
|
|
|
node = $('#file-manager a[data-path="' + path + '"]');
|
2019-02-06 05:04:14 +01:00
|
|
|
node.parent().find('a.open').each(function() {
|
|
|
|
_this.rescanChildren.push($(this).attr('data-path'));
|
|
|
|
});
|
2018-07-13 18:39:55 +02:00
|
|
|
}
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
this.index(path, true);
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Open File
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
openFile: function(path, focus) {
|
|
|
|
if (focus === undefined) {
|
|
|
|
focus = true;
|
|
|
|
}
|
|
|
|
var node = $('#file-manager a[data-path="' + path + '"]');
|
|
|
|
var ext = this.getExtension(path);
|
|
|
|
if ($.inArray(ext.toLowerCase(), this.noOpen) < 0) {
|
|
|
|
node.addClass('loading');
|
|
|
|
$.get(this.controller + '?action=open&path=' + encodeURIComponent(path), function(data) {
|
|
|
|
var openResponse = codiad.jsend.parse(data);
|
|
|
|
if (openResponse != 'error') {
|
|
|
|
node.removeClass('loading');
|
|
|
|
codiad.active.open(path, openResponse.content, openResponse.mtime, false, focus);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
if(!codiad.project.isAbsPath(path)) {
|
|
|
|
if ($.inArray(ext.toLowerCase(), this.noBrowser) < 0) {
|
|
|
|
this.download(path);
|
|
|
|
} else {
|
|
|
|
this.openInModal(path);
|
|
|
|
}
|
|
|
|
} else {
|
2018-07-17 19:32:22 +02:00
|
|
|
codiad.message.error(i18n('Unable to open file in Browser while using absolute path.'));
|
2018-07-13 18:39:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Open in browser
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
openInBrowser: function(path) {
|
2019-02-07 19:55:17 +01:00
|
|
|
|
|
|
|
let _this = this;
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
$.ajax({
|
|
|
|
url: this.controller + '?action=open_in_browser&path=' + encodeURIComponent(path),
|
|
|
|
success: function(data) {
|
|
|
|
var openIBResponse = codiad.jsend.parse(data);
|
|
|
|
if (openIBResponse != 'error') {
|
2019-02-07 19:55:17 +01:00
|
|
|
|
|
|
|
_this.preview = window.open( openIBResponse.url, '_newtab' );
|
|
|
|
|
|
|
|
let editor = codiad.editor.getActive();
|
|
|
|
|
|
|
|
if( _this.auto_reload && editor !== null ) {
|
|
|
|
|
|
|
|
codiad.editor.getActive().addEventListener( "change", _this.refreshPreview );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
}
|
|
|
|
},
|
|
|
|
async: false
|
|
|
|
});
|
|
|
|
},
|
2019-02-07 19:55:17 +01:00
|
|
|
|
|
|
|
refreshPreview: function( event ) {
|
|
|
|
|
|
|
|
_this = codiad.filemanager;
|
|
|
|
|
|
|
|
if( _this.preview == null ) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Changed $path to __DIR__ for config location, Updated auto reload variables, Removed unload listener for auto reload, Changed project default to array so that if no projects exist the program does not crash, Updated autosave to use let instead of vars, Fixed capitalization for sideExpanded variable, Added try catch to pdo initialization on install, Added more error checks on install, Removed password function on install query, Changed default settings array, Added loading div to user delete, Updated queries that threw errors when a default value was zero, Added blank username and password check,
2019-02-09 22:14:27 +01:00
|
|
|
try {
|
|
|
|
|
|
|
|
if( ( typeof _this.preview.location.reload ) == "undefined" ) {
|
|
|
|
|
|
|
|
_this.preview = null;
|
|
|
|
codiad.editor.getActive().removeEventListener( "change", _this.refreshPreview );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
_this.preview.location.reload();
|
|
|
|
} catch( e ) {
|
|
|
|
|
|
|
|
console.log( e );
|
|
|
|
codiad.message.error( 'Please close your previously opened preview window.' );
|
|
|
|
_this.preview = null;
|
|
|
|
codiad.editor.getActive().removeEventListener( "change", _this.refreshPreview );
|
|
|
|
}
|
2019-02-07 19:55:17 +01:00
|
|
|
},
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
openInModal: function(path) {
|
2018-07-17 19:32:22 +02:00
|
|
|
|
|
|
|
let type = "";
|
|
|
|
var ext = this.getExtension(path).toLowerCase();
|
|
|
|
|
2018-07-18 23:00:52 +02:00
|
|
|
if ( this.noAudio.includes(ext) ) {
|
2018-07-17 19:32:22 +02:00
|
|
|
|
|
|
|
type = 'music_preview';
|
|
|
|
} else if ( this.noImages.includes(ext) ) {
|
|
|
|
|
|
|
|
type = 'preview';
|
|
|
|
}
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
codiad.modal.load(250, this.dialog, {
|
2018-07-17 19:32:22 +02:00
|
|
|
action: type,
|
2018-07-13 18:39:55 +02:00
|
|
|
path: path
|
|
|
|
});
|
|
|
|
},
|
|
|
|
saveModifications: function(path, data, callbacks, save=true){
|
|
|
|
callbacks = callbacks || {};
|
|
|
|
var _this = this, action, data;
|
|
|
|
var notifySaveErr = function() {
|
|
|
|
codiad.message.error(i18n('File could not be saved'));
|
|
|
|
if (typeof callbacks.error === 'function') {
|
|
|
|
var context = callbacks.context || _this;
|
|
|
|
callbacks.error.apply(context, [data]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$.post(this.controller + '?action=modify&path=' + encodeURIComponent(path), data, function(resp){
|
|
|
|
resp = $.parseJSON(resp);
|
|
|
|
if (resp.status == 'success') {
|
|
|
|
if ( save === true ) {
|
|
|
|
codiad.message.success(i18n('File saved'));
|
|
|
|
}
|
|
|
|
if (typeof callbacks.success === 'function'){
|
|
|
|
var context = callbacks.context || _this;
|
|
|
|
callbacks.success.call(context, resp.data.mtime);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (resp.message == 'Client is out of sync'){
|
|
|
|
var reload = confirm(
|
|
|
|
"Server has a more updated copy of the file. Would "+
|
|
|
|
"you like to refresh the contents ? Pressing no will "+
|
|
|
|
"cause your changes to override the server's copy upon "+
|
|
|
|
"next save."
|
|
|
|
);
|
|
|
|
if (reload) {
|
|
|
|
codiad.active.close(path);
|
|
|
|
codiad.active.removeDraft(path);
|
|
|
|
_this.openFile(path);
|
|
|
|
} else {
|
|
|
|
var session = codiad.editor.getActive().getSession();
|
|
|
|
session.serverMTime = null;
|
|
|
|
session.untainted = null;
|
|
|
|
}
|
|
|
|
} else codiad.message.error(i18n('File could not be saved'));
|
|
|
|
if (typeof callbacks.error === 'function') {
|
|
|
|
var context = callbacks.context || _this;
|
|
|
|
callbacks.error.apply(context, [resp.data]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}).error(notifySaveErr);
|
|
|
|
},
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Save file
|
|
|
|
//////////////////////////////////////////////////////////////////
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
saveFile: function(path, content, callbacks, save=true) {
|
|
|
|
this.saveModifications(path, {content: content}, callbacks, save);
|
|
|
|
},
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2019-02-04 22:42:12 +01:00
|
|
|
savePatch: function(path, patch, mtime, callbacks, alerts) {
|
2018-07-13 18:39:55 +02:00
|
|
|
if (patch.length > 0)
|
2019-02-04 22:42:12 +01:00
|
|
|
this.saveModifications(path, {patch: patch, mtime: mtime}, callbacks, alerts);
|
2018-07-13 18:39:55 +02:00
|
|
|
else if (typeof callbacks.success === 'function'){
|
|
|
|
var context = callbacks.context || this;
|
|
|
|
callbacks.success.call(context, mtime);
|
|
|
|
}
|
|
|
|
},
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Create Object
|
|
|
|
//////////////////////////////////////////////////////////////////
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
createNode: function(path, type) {
|
|
|
|
codiad.modal.load(250, this.dialog, {
|
|
|
|
action: 'create',
|
|
|
|
type: type,
|
|
|
|
path: path
|
|
|
|
});
|
|
|
|
$('#modal-content form')
|
|
|
|
.live('submit', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var shortName = $('#modal-content form input[name="object_name"]')
|
|
|
|
.val();
|
|
|
|
var path = $('#modal-content form input[name="path"]')
|
|
|
|
.val();
|
|
|
|
var type = $('#modal-content form input[name="type"]')
|
|
|
|
.val();
|
|
|
|
var createPath = path + '/' + shortName;
|
|
|
|
$.get(codiad.filemanager.controller + '?action=create&path=' + encodeURIComponent(createPath) + '&type=' + type, function(data) {
|
|
|
|
var createResponse = codiad.jsend.parse(data);
|
|
|
|
if (createResponse != 'error') {
|
|
|
|
codiad.message.success(type.charAt(0)
|
|
|
|
.toUpperCase() + type.slice(1) + ' Created');
|
|
|
|
codiad.modal.unload();
|
|
|
|
// Add new element to filemanager screen
|
|
|
|
codiad.filemanager.createObject(path, createPath, type);
|
|
|
|
if(type == 'file') {
|
|
|
|
codiad.filemanager.openFile(createPath, true);
|
|
|
|
}
|
2019-02-06 23:52:49 +01:00
|
|
|
|
|
|
|
codiad.filemanager.rescan( path );
|
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
/* Notify listeners. */
|
|
|
|
amplify.publish('filemanager.onCreate', {createPath: createPath, path: path, shortName: shortName, type: type});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Copy to Clipboard
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
copyNode: function(path) {
|
|
|
|
this.clipboard = path;
|
|
|
|
codiad.message.success(i18n('Copied to Clipboard'));
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Paste
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
pasteNode: function(path) {
|
|
|
|
var _this = this;
|
|
|
|
if (this.clipboard == '') {
|
|
|
|
codiad.message.error(i18n('Nothing in Your Clipboard'));
|
|
|
|
} else if (path == this.clipboard) {
|
|
|
|
codiad.message.error(i18n('Cannot Paste Directory Into Itself'));
|
|
|
|
} else {
|
|
|
|
var shortName = _this.getShortName(_this.clipboard);
|
|
|
|
if ($('#file-manager a[data-path="' + path + '/' + shortName + '"]')
|
|
|
|
.length) { // Confirm overwrite?
|
|
|
|
codiad.modal.load(400, this.dialog, {
|
|
|
|
action: 'overwrite',
|
|
|
|
path: path + '/' + shortName
|
|
|
|
});
|
|
|
|
$('#modal-content form')
|
|
|
|
.live('submit', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var duplicate = false;
|
|
|
|
if($('#modal-content form select[name="or_action"]').val()==1){
|
|
|
|
duplicate=true; console.log('Dup!');
|
|
|
|
}
|
|
|
|
_this.processPasteNode(path,duplicate);
|
|
|
|
});
|
|
|
|
} else { // No conflicts; proceed...
|
|
|
|
_this.processPasteNode(path,false);
|
|
|
|
}
|
2019-02-06 23:52:49 +01:00
|
|
|
|
|
|
|
codiad.filemanager.rescan( path );
|
2018-07-13 18:39:55 +02:00
|
|
|
}
|
|
|
|
},
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
processPasteNode: function(path,duplicate) {
|
|
|
|
var _this = this;
|
|
|
|
var shortName = this.getShortName(this.clipboard);
|
|
|
|
var type = this.getType(this.clipboard);
|
2019-02-04 22:42:12 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
$.get(this.controller + '?action=duplicate&path=' +
|
|
|
|
encodeURIComponent(this.clipboard) + '&destination=' +
|
2019-02-04 22:42:12 +01:00
|
|
|
encodeURIComponent(path + '/' + shortName) + '&duplicate=' + encodeURIComponent( duplicate ), function(data) {
|
2018-07-13 18:39:55 +02:00
|
|
|
var pasteResponse = codiad.jsend.parse(data);
|
|
|
|
if (pasteResponse != 'error') {
|
|
|
|
_this.createObject(path, path + '/' + shortName, type);
|
|
|
|
codiad.modal.unload();
|
|
|
|
/* Notify listeners. */
|
|
|
|
amplify.publish('filemanager.onPaste', {path: path, shortName: shortName, duplicate: duplicate});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Rename
|
|
|
|
//////////////////////////////////////////////////////////////////
|
2019-02-06 05:04:14 +01:00
|
|
|
|
2018-07-13 18:39:55 +02:00
|
|
|
renameNode: function(path) {
|
|
|
|
var shortName = this.getShortName(path);
|
|
|
|
var type = this.getType(path);
|
|
|
|
var _this = this;
|
|
|
|
codiad.modal.load(250, this.dialog, { action: 'rename', path: path, short_name: shortName, type: type});
|
|
|
|
$('#modal-content form')
|
|
|
|
.live('submit', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var newName = $('#modal-content form input[name="object_name"]')
|
|
|
|
.val();
|
|
|
|
// Build new path
|
|
|
|
var arr = path.split('/');
|
|
|
|
var temp = new Array();
|
|
|
|
for (i = 0; i < arr.length - 1; i++) {
|
|
|
|
temp.push(arr[i])
|
|
|
|
}
|
|
|
|
var newPath = temp.join('/') + '/' + newName;
|
|
|
|
$.get(_this.controller, { action: 'modify', path: path, new_name: newName} , function(data) {
|
|
|
|
var renameResponse = codiad.jsend.parse(data);
|
|
|
|
if (renameResponse != 'error') {
|
|
|
|
codiad.message.success(type.charAt(0)
|
|
|
|
.toUpperCase() + type.slice(1) + ' Renamed');
|
|
|
|
var node = $('#file-manager a[data-path="' + path + '"]');
|
2019-02-06 05:04:14 +01:00
|
|
|
let parentPath = node.parent().parent().prev().attr('data-path');
|
2018-07-13 18:39:55 +02:00
|
|
|
// Change pathing and name for node
|
|
|
|
node.attr('data-path', newPath)
|
|
|
|
.html(newName);
|
|
|
|
if (type == 'file') { // Change icons for file
|
|
|
|
curExtClass = 'ext-' + _this.getExtension(path);
|
|
|
|
newExtClass = 'ext-' + _this.getExtension(newPath);
|
|
|
|
$('#file-manager a[data-path="' + newPath + '"]')
|
|
|
|
.removeClass(curExtClass)
|
|
|
|
.addClass(newExtClass);
|
|
|
|
} else { // Change pathing on any sub-files/directories
|
|
|
|
_this.repathSubs(path, newPath);
|
|
|
|
}
|
|
|
|
// Change any active files
|
|
|
|
codiad.active.rename(path, newPath);
|
|
|
|
codiad.modal.unload();
|
2019-02-06 23:52:49 +01:00
|
|
|
codiad.filemanager.rescan( parentPath );
|
2019-02-06 05:04:14 +01:00
|
|
|
/* Notify listeners. */
|
|
|
|
amplify.publish('filemanager.onRename', {path: path, newPath: newPath, parentPath: parentPath });
|
2018-07-13 18:39:55 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
repathSubs: function(oldPath, newPath) {
|
|
|
|
$('#file-manager a[data-path="' + newPath + '"]')
|
|
|
|
.siblings('ul')
|
|
|
|
.find('a')
|
|
|
|
.each(function() {
|
|
|
|
// Hit the children, hit 'em hard
|
|
|
|
var curPath = $(this)
|
|
|
|
.attr('data-path');
|
|
|
|
var revisedPath = curPath.replace(oldPath, newPath);
|
|
|
|
$(this)
|
|
|
|
.attr('data-path', revisedPath);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Delete
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
deleteNode: function(path) {
|
|
|
|
var _this = this;
|
|
|
|
codiad.modal.load(400, this.dialog, {
|
|
|
|
action: 'delete',
|
|
|
|
path: path
|
|
|
|
});
|
|
|
|
$('#modal-content form')
|
|
|
|
.live('submit', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
$.get(_this.controller + '?action=delete&path=' + encodeURIComponent(path), function(data) {
|
|
|
|
var deleteResponse = codiad.jsend.parse(data);
|
|
|
|
if (deleteResponse != 'error') {
|
|
|
|
var node = $('#file-manager a[data-path="' + path + '"]');
|
2019-02-06 05:04:14 +01:00
|
|
|
let parent_path = node.parent().parent().prev().attr('data-path');
|
|
|
|
node.parent('li').remove();
|
2018-07-13 18:39:55 +02:00
|
|
|
// Close any active files
|
|
|
|
$('#active-files a')
|
|
|
|
.each(function() {
|
|
|
|
var curPath = $(this)
|
|
|
|
.attr('data-path');
|
|
|
|
if (curPath.indexOf(path) == 0) {
|
|
|
|
codiad.active.remove(curPath);
|
|
|
|
}
|
|
|
|
});
|
2019-02-06 05:04:14 +01:00
|
|
|
/* Notify listeners. */
|
|
|
|
amplify.publish('filemanager.onDelete', {deletePath: path, path: parent_path });
|
2018-07-13 18:39:55 +02:00
|
|
|
}
|
|
|
|
codiad.modal.unload();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
2018-07-31 21:59:15 +02:00
|
|
|
|
|
|
|
deleteInnerNode: function(path) {
|
|
|
|
var _this = this;
|
|
|
|
codiad.modal.load(400, this.dialog, {
|
|
|
|
action: 'delete',
|
|
|
|
path: path
|
|
|
|
});
|
|
|
|
$('#modal-content form')
|
|
|
|
.live('submit', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
$.get(_this.controller + '?action=deleteInner&path=' + encodeURIComponent(path), function(data) {
|
|
|
|
var deleteResponse = codiad.jsend.parse(data);
|
|
|
|
if (deleteResponse != 'error') {
|
2019-02-06 05:04:14 +01:00
|
|
|
var node = $('#file-manager a[data-path="' + path + '"]').parent('ul').remove();
|
2018-07-31 21:59:15 +02:00
|
|
|
|
|
|
|
// Close any active files
|
|
|
|
$('#active-files a')
|
|
|
|
.each(function() {
|
|
|
|
var curPath = $(this)
|
|
|
|
.attr('data-path');
|
|
|
|
if (curPath.indexOf(path) == 0) {
|
|
|
|
codiad.active.remove(curPath);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
//Rescan Folder
|
|
|
|
node.parent()
|
|
|
|
.find('a.open')
|
|
|
|
.each(function() {
|
|
|
|
_this.rescanChildren.push($(this)
|
|
|
|
.attr('data-path'));
|
|
|
|
});
|
2019-02-06 05:04:14 +01:00
|
|
|
|
|
|
|
/* Notify listeners. */
|
|
|
|
amplify.publish('filemanager.onDelete', {deletePath: path + "/*", path: path });
|
2018-07-31 21:59:15 +02:00
|
|
|
}
|
|
|
|
codiad.modal.unload();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
2018-07-13 18:39:55 +02:00
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Search
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
search: function(path) {
|
|
|
|
codiad.modal.load(500, this.dialog,{
|
|
|
|
action: 'search',
|
|
|
|
path: path
|
|
|
|
});
|
2018-10-09 21:30:00 +02:00
|
|
|
codiad.modal.load_process.done( async function() {
|
|
|
|
var lastSearched = JSON.parse( await codiad.settings.get_option("lastSearched"));
|
2018-07-13 18:39:55 +02:00
|
|
|
if(lastSearched) {
|
|
|
|
$('#modal-content form input[name="search_string"]').val(lastSearched.searchText);
|
|
|
|
$('#modal-content form input[name="search_file_type"]').val(lastSearched.fileExtension);
|
|
|
|
$('#modal-content form select[name="search_type"]').val(lastSearched.searchType);
|
|
|
|
if(lastSearched.searchResults != '') {
|
|
|
|
$('#filemanager-search-results').slideDown().html(lastSearched.searchResults);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
codiad.modal.hideOverlay();
|
|
|
|
var _this = this;
|
|
|
|
$('#modal-content form')
|
|
|
|
.live('submit', function(e) {
|
|
|
|
$('#filemanager-search-processing')
|
|
|
|
.show();
|
|
|
|
e.preventDefault();
|
|
|
|
searchString = $('#modal-content form input[name="search_string"]')
|
|
|
|
.val();
|
|
|
|
fileExtensions=$('#modal-content form input[name="search_file_type"]')
|
|
|
|
.val();
|
|
|
|
searchFileType=$.trim(fileExtensions);
|
|
|
|
if (searchFileType != '') {
|
|
|
|
//season the string to use in find command
|
|
|
|
searchFileType = "\\(" + searchFileType.replace(/\s+/g, "\\|") + "\\)";
|
|
|
|
}
|
|
|
|
searchType = $('#modal-content form select[name="search_type"]')
|
|
|
|
.val();
|
|
|
|
$.post(_this.controller + '?action=search&path=' + encodeURIComponent(path) + '&type=' + searchType, {
|
|
|
|
search_string: searchString,
|
|
|
|
search_file_type: searchFileType
|
|
|
|
}, function(data) {
|
|
|
|
searchResponse = codiad.jsend.parse(data);
|
|
|
|
var results = '';
|
|
|
|
if (searchResponse != 'error') {
|
|
|
|
$.each(searchResponse.index, function(key, val) {
|
|
|
|
// Cleanup file format
|
|
|
|
if(val['file'].substr(-1) == '/') {
|
|
|
|
val['file'] = val['file'].substr(0, str.length - 1);
|
|
|
|
}
|
|
|
|
val['file'] = val['file'].replace('//','/');
|
|
|
|
// Add result
|
|
|
|
results += '<div><a onclick="codiad.filemanager.openFile(\'' + val['result'] + '\');setTimeout( function() { codiad.active.gotoLine(' + val['line'] + '); }, 500);codiad.modal.unload();">Line ' + val['line'] + ': ' + val['file'] + '</a></div>';
|
|
|
|
});
|
|
|
|
$('#filemanager-search-results')
|
|
|
|
.slideDown()
|
|
|
|
.html(results);
|
|
|
|
} else {
|
|
|
|
$('#filemanager-search-results')
|
|
|
|
.slideUp();
|
|
|
|
}
|
|
|
|
_this.saveSearchResults(searchString, searchType, fileExtensions, results);
|
|
|
|
$('#filemanager-search-processing')
|
|
|
|
.hide();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
// saveSearchResults
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
saveSearchResults: function(searchText, searchType, fileExtensions, searchResults) {
|
|
|
|
var lastSearched = {
|
|
|
|
searchText: searchText,
|
|
|
|
searchType: searchType,
|
|
|
|
fileExtension: fileExtensions,
|
|
|
|
searchResults: searchResults
|
|
|
|
};
|
|
|
|
localStorage.setItem("lastSearched", JSON.stringify(lastSearched));
|
|
|
|
},
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Upload
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
uploadToNode: function(path) {
|
|
|
|
codiad.modal.load(500, this.dialogUpload, {path: path});
|
|
|
|
},
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// Download
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
download: function(path) {
|
|
|
|
var type = this.getType(path);
|
|
|
|
$('#download')
|
|
|
|
.attr('src', 'components/filemanager/download.php?path=' + encodeURIComponent(path) + '&type=' + type);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
})(this, jQuery);
|