mirror of
https://github.com/Studio-42/elFinder
synced 2026-06-08 12:37:09 +00:00
223 lines
5.2 KiB
JavaScript
223 lines
5.2 KiB
JavaScript
"use strict"
|
|
/**
|
|
* @class elFinder command "edit".
|
|
* Edit text file in dialog window
|
|
*
|
|
* @author Dmitry (dio) Levashov, dio@std42.ru
|
|
**/
|
|
elFinder.prototype.commands.edit = function() {
|
|
var self = this,
|
|
fm = this.fm,
|
|
mimes = fm.res('mimes', 'text') || [],
|
|
|
|
/**
|
|
* Return files acceptable to edit
|
|
*
|
|
* @param Array files hashes
|
|
* @return Array
|
|
**/
|
|
filter = function(files) {
|
|
return $.map(files, function(file) {
|
|
return (file.mime.indexOf('text/') === 0 || $.inArray(file.mime, mimes) !== -1)
|
|
&& file.mime.indexOf('text/rtf')
|
|
&& (!self.onlyMimes.length || $.inArray(file.mime, self.onlyMimes) !== -1)
|
|
&& file.read && file.write ? file : null;
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Open dialog with textarea to edit file
|
|
*
|
|
* @param String id dialog id
|
|
* @param Object file file object
|
|
* @param String content file content
|
|
* @return $.Deferred
|
|
**/
|
|
dialog = function(id, file, content) {
|
|
|
|
var dfrd = $.Deferred(),
|
|
ta = $('<textarea class="elfinder-file-edit" rows="20" id="'+id+'-ta">'+fm.escape(content)+'</textarea>'),
|
|
save = function() {
|
|
ta.editor && ta.editor.save(ta[0], ta.editor.instance);
|
|
dfrd.resolve(ta.getContent());
|
|
ta.elfinderdialog('close');
|
|
},
|
|
cancel = function() {
|
|
dfrd.reject();
|
|
ta.elfinderdialog('close');
|
|
},
|
|
opts = {
|
|
title : file.name,
|
|
width : self.options.dialogWidth || 450,
|
|
buttons : {},
|
|
close : function() {
|
|
ta.editor && ta.editor.close(ta[0], ta.editor.instance);
|
|
$(this).elfinderdialog('destroy');
|
|
},
|
|
open : function() {
|
|
fm.disable();
|
|
ta.focus();
|
|
ta[0].setSelectionRange && ta[0].setSelectionRange(0, 0);
|
|
ta.editor && ta.editor.load(ta[0]);
|
|
}
|
|
|
|
};
|
|
|
|
ta.getContent = function() {
|
|
return ta.val()
|
|
}
|
|
|
|
$.each(self.options.editors || [], function(i, editor) {
|
|
if ($.inArray(file.mime, editor.mimes || []) !== -1
|
|
&& typeof editor.load == 'function'
|
|
&& typeof editor.save == 'function') {
|
|
ta.editor = {
|
|
load : editor.load,
|
|
save : editor.save,
|
|
close : typeof editor.close == 'function' ? editor.close : function() {},
|
|
instance : null
|
|
}
|
|
|
|
return false;
|
|
}
|
|
});
|
|
|
|
if (!ta.editor) {
|
|
ta.keydown(function(e) {
|
|
var code = e.keyCode,
|
|
value, start;
|
|
|
|
e.stopPropagation();
|
|
if (code == 9) {
|
|
e.preventDefault();
|
|
// insert tab on tab press
|
|
if (this.setSelectionRange) {
|
|
value = this.value;
|
|
start = this.selectionStart;
|
|
this.value = value.substr(0, start) + "\t" + value.substr(this.selectionEnd);
|
|
start += 1;
|
|
this.setSelectionRange(start, start);
|
|
}
|
|
}
|
|
|
|
if (e.ctrlKey || e.metaKey) {
|
|
// close on ctrl+w/q
|
|
if (code == 81 || code == 87) {
|
|
e.preventDefault();
|
|
cancel();
|
|
}
|
|
if (code == 83) {
|
|
e.preventDefault();
|
|
save();
|
|
}
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
opts.buttons[fm.i18n('Save')] = save;
|
|
opts.buttons[fm.i18n('Cancel')] = cancel
|
|
|
|
fm.dialog(ta, opts).attr('id', id);
|
|
return dfrd.promise();
|
|
},
|
|
|
|
/**
|
|
* Get file content and
|
|
* open dialog with textarea to edit file content
|
|
*
|
|
* @param String file hash
|
|
* @return jQuery.Deferred
|
|
**/
|
|
edit = function(file) {
|
|
var hash = file.hash,
|
|
opts = fm.options,
|
|
dfrd = $.Deferred(),
|
|
data = {cmd : 'file', target : hash},
|
|
url = fm.url(hash) || fm.options.url,
|
|
id = 'edit-'+fm.namespace+'-'+file.hash,
|
|
d = fm.getUI().find('#'+id),
|
|
error;
|
|
|
|
|
|
if (d.length) {
|
|
d.elfinderdialog('toTop');
|
|
return dfrd.resolve();
|
|
}
|
|
|
|
if (!file.read || !file.write) {
|
|
error = ['errOpen', file.name, 'errPerm']
|
|
fm.error(error)
|
|
return dfrd.reject(error);
|
|
}
|
|
|
|
fm.request({
|
|
data : {cmd : 'get', target : hash},
|
|
notify : {type : 'openfile', cnt : 1},
|
|
syncOnFail : true
|
|
})
|
|
.done(function(data) {
|
|
dialog(id, file, data.content)
|
|
.done(function(content) {
|
|
fm.request({
|
|
options : {type : 'post'},
|
|
data : {
|
|
cmd : 'put',
|
|
target : hash,
|
|
content : content
|
|
},
|
|
notify : {type : 'save', cnt : 1},
|
|
syncOnFail : true
|
|
})
|
|
.fail(function(error) {
|
|
dfrd.reject(error);
|
|
})
|
|
.done(function(data) {
|
|
data.changed && data.changed.length && fm.change(data);
|
|
dfrd.resolve(data);
|
|
});
|
|
})
|
|
})
|
|
.fail(function(error) {
|
|
dfrd.reject(error);
|
|
})
|
|
|
|
return dfrd.promise();
|
|
};
|
|
|
|
|
|
|
|
this.shortcuts = [{
|
|
pattern : 'ctrl+e'
|
|
}];
|
|
|
|
this.init = function() {
|
|
this.onlyMimes = this.options.mimes || []
|
|
}
|
|
|
|
this.getstate = function(sel) {
|
|
var sel = this.files(sel),
|
|
cnt = sel.length;
|
|
|
|
return !this._disabled && cnt && filter(sel).length == cnt ? 0 : -1;
|
|
}
|
|
|
|
this.exec = function(hashes) {
|
|
var files = filter(this.files(hashes)),
|
|
list = [],
|
|
file;
|
|
|
|
if (this.disabled()) {
|
|
return $.Deferred().reject();
|
|
}
|
|
|
|
while ((file = files.shift())) {
|
|
list.push(edit(file));
|
|
}
|
|
|
|
return list.length
|
|
? $.when.apply(null, list)
|
|
: $.Deferred().reject();
|
|
}
|
|
|
|
} |