244 lines
11 KiB
JavaScript
244 lines
11 KiB
JavaScript
/**
|
|
* elFinder custom commands for File Manager Advanced
|
|
*/
|
|
(function ($) {
|
|
$(document).ready(function () {
|
|
if (typeof elFinder !== 'undefined' && elFinder.prototype && elFinder.prototype.commands) {
|
|
|
|
// Icon CSS
|
|
var pluginUrl = (typeof afm_object !== 'undefined') ? afm_object.plugin_url : '';
|
|
if (!pluginUrl) {
|
|
// Try to find it from script src
|
|
var script = $('script[src*="fma-elfinder-commands.js"]');
|
|
if (script.length) {
|
|
pluginUrl = script.attr('src').split('application/assets/js/')[0];
|
|
}
|
|
}
|
|
|
|
if (pluginUrl) {
|
|
var iconStyle = `
|
|
<style id="fma-replace-icon">
|
|
.elfinder-button-icon-replace {
|
|
background-image: url(${pluginUrl}application/assets/images/replace.png) !important;
|
|
background-size: 16px !important;
|
|
background-repeat: no-repeat !important;
|
|
background-position: center !important;
|
|
}
|
|
.elfinder-contextmenu-icon-replace {
|
|
background-image: url(${pluginUrl}application/assets/images/replace.png) !important;
|
|
background-size: 16px !important;
|
|
background-repeat: no-repeat !important;
|
|
background-position: center !important;
|
|
}
|
|
</style>
|
|
`;
|
|
if ($('#fma-replace-icon').length === 0) {
|
|
$('head').append(iconStyle);
|
|
}
|
|
}
|
|
|
|
// Translation
|
|
var i18Obj = elFinder.prototype.i18 || elFinder.prototype.i18n;
|
|
if (i18Obj) {
|
|
// Ensure English is initialized if not present
|
|
if (!i18Obj.en) {
|
|
i18Obj.en = { messages: {} };
|
|
}
|
|
for (var lang in i18Obj) {
|
|
if (i18Obj.hasOwnProperty(lang)) {
|
|
var msg = 'Replace';
|
|
// Add some common translations
|
|
if (lang === 'es') msg = 'Reemplazar';
|
|
if (lang === 'fr') msg = 'Remplacer';
|
|
if (lang === 'de') msg = 'Ersetzen';
|
|
if (lang === 'it') msg = 'Sostituisci';
|
|
if (lang === 'pt') msg = 'Substituir';
|
|
if (lang === 'ru') msg = 'Заменить';
|
|
if (lang === 'zh_CN') msg = '替换';
|
|
|
|
if (!i18Obj[lang].messages) {
|
|
i18Obj[lang].messages = {};
|
|
}
|
|
i18Obj[lang].messages.cmdreplace = msg;
|
|
i18Obj[lang].messages.replace = msg;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Replace command definition
|
|
elFinder.prototype.commands.replace = function () {
|
|
this.updateOnSelect = false;
|
|
this.title = 'Replace';
|
|
|
|
this.getstate = function (hashes) {
|
|
var fm = this.fm;
|
|
var sel = this.hashes(hashes);
|
|
var cnt = sel.length;
|
|
|
|
if (cnt !== 1) {
|
|
return -1;
|
|
}
|
|
|
|
var file = fm.file(sel[0]);
|
|
if (!file || file.mime === 'directory' || file.phash === null) {
|
|
return -1;
|
|
}
|
|
|
|
return fm.isCommandEnabled('upload', sel[0]) ? 0 : -1;
|
|
};
|
|
|
|
this.exec = function (hashes) {
|
|
var fm = this.fm;
|
|
var sel = this.hashes(hashes);
|
|
var file = fm.file(sel[0]);
|
|
var self = this;
|
|
|
|
if (!file) {
|
|
return $.Deferred().reject();
|
|
}
|
|
|
|
var input = $('<input type="file" />');
|
|
|
|
input.on('change', function () {
|
|
if (this.files && this.files.length) {
|
|
var selectedFile = this.files[0];
|
|
var formData = new FormData();
|
|
formData.append('cmd', 'upload');
|
|
formData.append('target', file.phash);
|
|
formData.append('overwrite', '1');
|
|
formData.append('upload[]', selectedFile, file.name);
|
|
|
|
// Add custom data (nonce, action, etc. required by WordPress and the plugin)
|
|
var customData = fm.options.customData || {};
|
|
if (typeof customData === 'function') {
|
|
customData = customData('upload', fm);
|
|
}
|
|
|
|
|
|
for (var key in customData) {
|
|
if (customData.hasOwnProperty(key)) {
|
|
if (!formData.has(key)) { // Prevent overwriting existing formData keys like 'cmd' or 'target'
|
|
formData.append(key, customData[key]);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Use jQuery.ajax directly for upload to avoid elFinder request stripping FormData issues
|
|
$.ajax({
|
|
url: fm.options.url,
|
|
type: 'POST',
|
|
data: formData,
|
|
processData: false,
|
|
contentType: false,
|
|
beforeSend: function () {
|
|
fm.notify({ type: 'upload', cnt: 1, hide: false });
|
|
},
|
|
success: function (data) {
|
|
// Always decrement the counter
|
|
fm.notify({ type: 'upload', cnt: -1, hide: true });
|
|
|
|
// Try to parse if it's a string
|
|
if (typeof data === 'string') {
|
|
try {
|
|
data = JSON.parse(data);
|
|
} catch (e) { }
|
|
}
|
|
|
|
if (data && data.error) {
|
|
fm.error(data.error);
|
|
} else {
|
|
fm.notify({
|
|
type: 'info',
|
|
msg: 'File replaced successfully!',
|
|
hide: 3000
|
|
});
|
|
// Refresh the UI to show the new file immediately
|
|
if (typeof fm.exec === 'function') {
|
|
fm.exec('reload');
|
|
}
|
|
if (typeof fm.sync === 'function') {
|
|
fm.sync();
|
|
}
|
|
}
|
|
},
|
|
error: function (xhr, status, error) {
|
|
fm.notify({ type: 'upload', cnt: -1, hide: true });
|
|
console.error('FMA Replace Error:', error, xhr.responseText);
|
|
fm.notify({
|
|
type: 'error',
|
|
msg: 'Failed to replace file. Error: ' + error,
|
|
hide: 3000
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
input.click();
|
|
return $.Deferred().resolve();
|
|
};
|
|
};
|
|
|
|
// Function to add replace to context menu
|
|
var addReplaceToContextMenu = function (opts) {
|
|
if (opts && opts.contextmenu && opts.contextmenu.files) {
|
|
var filesMenu = opts.contextmenu.files;
|
|
if (filesMenu.indexOf('replace') === -1) {
|
|
var renameIdx = filesMenu.indexOf('rename');
|
|
if (renameIdx !== -1) {
|
|
filesMenu.splice(renameIdx + 1, 0, 'replace');
|
|
} else {
|
|
filesMenu.push('replace');
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
// Add to context menu for ALL future instances (by modifying the prototype _options)
|
|
if (elFinder && elFinder.prototype && elFinder.prototype._options) {
|
|
addReplaceToContextMenu(elFinder.prototype._options);
|
|
}
|
|
|
|
// Also handle existing and new instances
|
|
var setupInstance = function (fm) {
|
|
if (fm && fm.options) {
|
|
addReplaceToContextMenu(fm.options);
|
|
}
|
|
|
|
// Get the translation based on current language
|
|
var msg = 'Replace';
|
|
var lang = fm.lang || (fm.options && fm.options.lang) || 'en';
|
|
if (lang === 'es') msg = 'Reemplazar';
|
|
if (lang === 'fr') msg = 'Remplacer';
|
|
if (lang === 'de') msg = 'Ersetzen';
|
|
if (lang === 'it') msg = 'Sostituisci';
|
|
if (lang === 'pt') msg = 'Substituir';
|
|
if (lang === 'ru') msg = 'Заменить';
|
|
if (lang === 'zh_CN') msg = '替换';
|
|
|
|
// Ensure instance has the translation (FORCE IT)
|
|
if (fm && fm.messages) {
|
|
fm.messages.cmdreplace = msg;
|
|
fm.messages.replace = msg;
|
|
}
|
|
// Ensure the command title is capitalized
|
|
if (fm && fm.commands && fm.commands.replace) {
|
|
fm.commands.replace.title = msg;
|
|
}
|
|
};
|
|
|
|
// Apply to any elFinder instances that might already exist
|
|
if (typeof elFinder !== 'undefined' && typeof elFinder.instances !== 'undefined') {
|
|
$.each(elFinder.instances, function (id, fm) {
|
|
setupInstance(fm);
|
|
});
|
|
}
|
|
|
|
// Hook into elFinder creation event to apply to new instances as they are created
|
|
$(document).on('elfindercreate', function (event, fm) {
|
|
setupInstance(fm);
|
|
});
|
|
}
|
|
});
|
|
})(jQuery);
|