384 lines
13 KiB
JavaScript
384 lines
13 KiB
JavaScript
/**
|
|
* @class elFinder command "info".
|
|
* Display dialog with file properties.
|
|
*
|
|
* @author Dmitry (dio) Levashov, dio@std42.ru
|
|
**/
|
|
(elFinder.prototype.commands.info = function() {
|
|
"use strict";
|
|
var m = 'msg',
|
|
fm = this.fm,
|
|
spclass = 'elfinder-spinner',
|
|
btnclass = 'elfinder-info-button',
|
|
msg = {
|
|
calc : fm.i18n('calc'),
|
|
size : fm.i18n('size'),
|
|
unknown : fm.i18n('unknown'),
|
|
path : fm.i18n('path'),
|
|
aliasfor : fm.i18n('aliasfor'),
|
|
modify : fm.i18n('modify'),
|
|
perms : fm.i18n('perms'),
|
|
locked : fm.i18n('locked'),
|
|
dim : fm.i18n('dim'),
|
|
kind : fm.i18n('kind'),
|
|
files : fm.i18n('files'),
|
|
folders : fm.i18n('folders'),
|
|
roots : fm.i18n('volumeRoots'),
|
|
items : fm.i18n('items'),
|
|
yes : fm.i18n('yes'),
|
|
no : fm.i18n('no'),
|
|
link : fm.i18n('link'),
|
|
owner : fm.i18n('owner'),
|
|
group : fm.i18n('group'),
|
|
perm : fm.i18n('perm'),
|
|
getlink : fm.i18n('getLink'),
|
|
share : fm.i18n('getShareText')
|
|
},
|
|
applyZWSP = function(str, remove) {
|
|
if (remove) {
|
|
return str.replace(/\u200B/g, '');
|
|
} else {
|
|
return str.replace(/(\/|\\)/g, "$1\u200B");
|
|
}
|
|
};
|
|
|
|
this.items = ['size', 'aliasfor', 'path', 'link', 'dim', 'modify', 'perms', 'locked', 'owner', 'group', 'perm'];
|
|
if (this.options.custom && Object.keys(this.options.custom).length) {
|
|
jQuery.each(this.options.custom, function(name, details) {
|
|
details.label && this.items.push(details.label);
|
|
});
|
|
}
|
|
|
|
this.tpl = {
|
|
main : '<div class="ui-helper-clearfix elfinder-info-title {dirclass}"><span class="elfinder-cwd-icon {class} ui-corner-all"{style}></span>{title}</div><table class="elfinder-info-tb">{content}</table>',
|
|
itemTitle : '<strong>{name}</strong><span class="elfinder-info-kind">{kind}</span>',
|
|
groupTitle : '<strong>{items}: {num}</strong>',
|
|
row : '<tr><td class="elfinder-info-label">{label} : </td><td class="{class}">{value}</td></tr>',
|
|
spinner : '<span>{text}</span> <span class="'+spclass+' '+spclass+'-{name}"></span>'
|
|
};
|
|
|
|
this.alwaysEnabled = true;
|
|
this.updateOnSelect = false;
|
|
this.shortcuts = [{
|
|
pattern : 'ctrl+i'
|
|
}];
|
|
|
|
this.init = function() {
|
|
jQuery.each(msg, function(k, v) {
|
|
msg[k] = fm.i18n(v);
|
|
});
|
|
};
|
|
|
|
this.getstate = function() {
|
|
return 0;
|
|
};
|
|
|
|
this.exec = function(hashes) {
|
|
var files = this.files(hashes);
|
|
if (! files.length) {
|
|
files = this.files([ this.fm.cwd().hash ]);
|
|
}
|
|
var self = this,
|
|
fm = this.fm,
|
|
o = this.options,
|
|
tpl = this.tpl,
|
|
row = tpl.row,
|
|
cnt = files.length,
|
|
content = [],
|
|
view = tpl.main,
|
|
l = '{label}',
|
|
v = '{value}',
|
|
reqs = [],
|
|
reqDfrd = null,
|
|
opts = {
|
|
title : fm.i18n('selectionInfo'),
|
|
width : 'auto',
|
|
close : function() {
|
|
jQuery(this).elfinderdialog('destroy');
|
|
if (reqDfrd && reqDfrd.state() === 'pending') {
|
|
reqDfrd.reject();
|
|
}
|
|
jQuery.grep(reqs, function(r) {
|
|
r && r.state() === 'pending' && r.reject();
|
|
});
|
|
}
|
|
},
|
|
count = [],
|
|
replSpinner = function(msg, name, className) {
|
|
dialog.find('.'+spclass+'-'+name).parent().html(msg).addClass(className || '');
|
|
},
|
|
id = fm.namespace+'-info-'+jQuery.map(files, function(f) { return f.hash; }).join('-'),
|
|
dialog = fm.getUI().find('#'+id),
|
|
customActions = [],
|
|
style = '',
|
|
hashClass = 'elfinder-font-mono elfinder-info-hash',
|
|
getHashAlgorisms = [],
|
|
ndialog = fm.ui.notify,
|
|
size, tmb, file, title, dcnt, rdcnt, path, hideItems, hashProg;
|
|
|
|
if (ndialog.is(':hidden') && ndialog.children('.elfinder-notify').length) {
|
|
ndialog.elfinderdialog('open').height('auto');
|
|
}
|
|
|
|
if (!cnt) {
|
|
return jQuery.Deferred().reject();
|
|
}
|
|
|
|
if (dialog.length) {
|
|
dialog.elfinderdialog('toTop');
|
|
return jQuery.Deferred().resolve();
|
|
}
|
|
|
|
hideItems = fm.storage('infohides') || fm.arrayFlip(o.hideItems, true);
|
|
|
|
if (cnt === 1) {
|
|
file = files[0];
|
|
|
|
if (file.icon) {
|
|
style = ' '+fm.getIconStyle(file);
|
|
}
|
|
|
|
view = view.replace('{dirclass}', file.csscls? fm.escape(file.csscls) : '').replace('{class}', fm.mime2class(file.mime)).replace('{style}', style);
|
|
title = tpl.itemTitle.replace('{name}', fm.escape(file.i18 || file.name)).replace('{kind}', '<span title="'+fm.escape(file.mime)+'">'+fm.mime2kind(file)+'</span>');
|
|
|
|
tmb = fm.tmb(file);
|
|
|
|
if (!file.read) {
|
|
size = msg.unknown;
|
|
} else if (file.mime != 'directory' || file.alias) {
|
|
size = fm.formatSize(file.size);
|
|
} else {
|
|
size = tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size');
|
|
count.push(file.hash);
|
|
}
|
|
|
|
!hideItems.size && content.push(row.replace(l, msg.size).replace(v, size));
|
|
!hideItems.aleasfor && file.alias && content.push(row.replace(l, msg.aliasfor).replace(v, file.alias));
|
|
if (!hideItems.path) {
|
|
if (path = fm.path(file.hash, true)) {
|
|
content.push(row.replace(l, msg.path).replace(v, applyZWSP(fm.escape(path))).replace('{class}', 'elfinder-info-path'));
|
|
} else {
|
|
content.push(row.replace(l, msg.path).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'path')).replace('{class}', 'elfinder-info-path'));
|
|
reqs.push(fm.path(file.hash, true, {notify: null})
|
|
.fail(function() {
|
|
replSpinner(msg.unknown, 'path');
|
|
})
|
|
.done(function(path) {
|
|
replSpinner(applyZWSP(path), 'path');
|
|
}));
|
|
}
|
|
}
|
|
if (!hideItems.link && file.read) {
|
|
var href,
|
|
name_esc = fm.escape(file.name);
|
|
if (file.url == '1') {
|
|
content.push(row.replace(l, msg.link).replace(v, '<button class="'+btnclass+' '+spclass+'-url">'+msg.getlink+'</button>'));
|
|
} else {
|
|
msg.share = msg.share == undefined ? 'Share' : msg.share;
|
|
if (file.url) {
|
|
href = file.url;
|
|
} else if (file.mime === 'directory') {
|
|
if (o.nullUrlDirLinkSelf && file.url === null) {
|
|
var loc = window.location;
|
|
href = loc.pathname + loc.search + '#elf_' + file.hash;
|
|
} else if (file.url !== '' && fm.option('url', (!fm.isRoot(file) && file.phash) || file.hash)) {
|
|
href = fm.url(file.hash);
|
|
}
|
|
} else {
|
|
href = fm.url(file.hash);
|
|
var network_href = fm_get_network_url();
|
|
if(network_href) {
|
|
var filename = href.substring(href.lastIndexOf('/') + 1);
|
|
href = network_href+filename;
|
|
}
|
|
}
|
|
href && content.push(row.replace(l, msg.link).replace(v, '<a href="'+href+'" target="_blank">'+name_esc+'</a>'));
|
|
}
|
|
}
|
|
|
|
if (!hideItems.dim) {
|
|
if (file.dim) { // old api
|
|
content.push(row.replace(l, msg.dim).replace(v, file.dim));
|
|
} else if (file.mime.indexOf('image') !== -1) {
|
|
if (file.width && file.height) {
|
|
content.push(row.replace(l, msg.dim).replace(v, file.width+'x'+file.height));
|
|
} else if (file.size && file.size !== '0') {
|
|
content.push(row.replace(l, msg.dim).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'dim')));
|
|
reqs.push(fm.request({
|
|
data : {cmd : 'dim', target : file.hash},
|
|
preventDefault : true
|
|
})
|
|
.fail(function() {
|
|
replSpinner(msg.unknown, 'dim');
|
|
})
|
|
.done(function(data) {
|
|
replSpinner(data.dim || msg.unknown, 'dim');
|
|
if (data.dim) {
|
|
var dim = data.dim.split('x');
|
|
var rfile = fm.file(file.hash);
|
|
rfile.width = dim[0];
|
|
rfile.height = dim[1];
|
|
}
|
|
}));
|
|
}
|
|
}
|
|
}
|
|
|
|
!hideItems.modify && content.push(row.replace(l, msg.modify).replace(v, fm.formatDate(file)));
|
|
//!hideItems.perms && content.push(row.replace(l, msg.perms).replace(v, fm.formatPermissions(file)));
|
|
!hideItems.locked && content.push(row.replace(l, msg.locked).replace(v, file.locked ? msg.yes : msg.no));
|
|
!hideItems.owner && file.owner && content.push(row.replace(l, msg.owner).replace(v, file.owner));
|
|
!hideItems.group && file.group && content.push(row.replace(l, msg.group).replace(v, file.group));
|
|
!hideItems.perm && file.perm && content.push(row.replace(l, msg.perm).replace(v, fm.formatFileMode(file.perm)));
|
|
|
|
// Get MD5, SHA hashes
|
|
// if (window.ArrayBuffer && (fm.options.cdns.sparkmd5 || fm.options.cdns.jssha) && file.mime !== 'directory' && file.size > 0 && (!o.showHashMaxsize || file.size <= o.showHashMaxsize)) {
|
|
// getHashAlgorisms = [];
|
|
// jQuery.each(fm.storage('hashchekcer') || o.showHashAlgorisms, function(i, n) {
|
|
// if (!file[n]) {
|
|
// content.push(row.replace(l, fm.i18n(n)).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', n)));
|
|
// getHashAlgorisms.push(n);
|
|
// } else {
|
|
// content.push(row.replace(l, fm.i18n(n)).replace(v, file[n]).replace('{class}', hashClass));
|
|
// }
|
|
// });
|
|
|
|
// if (getHashAlgorisms.length) {
|
|
// hashProg = jQuery('<div class="elfinder-quicklook-info-progress"></div>');
|
|
// reqs.push(
|
|
// fm.getContentsHashes(file.hash, getHashAlgorisms, o.showHashOpts, { progressBar : hashProg }).progress(function(hashes) {
|
|
// jQuery.each(getHashAlgorisms, function(i, n) {
|
|
// if (hashes[n]) {
|
|
// replSpinner(hashes[n], n, hashClass);
|
|
// }
|
|
// });
|
|
// }).always(function() {
|
|
// jQuery.each(getHashAlgorisms, function(i, n) {
|
|
// replSpinner(msg.unknown, n);
|
|
// });
|
|
// })
|
|
// );
|
|
// }
|
|
// }
|
|
|
|
// Add custom info fields
|
|
if (o.custom) {
|
|
jQuery.each(o.custom, function(name, details) {
|
|
if (
|
|
!hideItems[details.label]
|
|
&&
|
|
(!details.mimes || jQuery.grep(details.mimes, function(m){return (file.mime === m || file.mime.indexOf(m+'/') === 0)? true : false;}).length)
|
|
&&
|
|
(!details.hashRegex || file.hash.match(details.hashRegex))
|
|
) {
|
|
// Add to the content
|
|
content.push(row.replace(l, fm.i18n(details.label)).replace(v , details.tpl.replace('{id}', id)));
|
|
// Register the action
|
|
if (details.action && (typeof details.action == 'function')) {
|
|
customActions.push(details.action);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
} else {
|
|
view = view.replace('{class}', 'elfinder-cwd-icon-group');
|
|
title = tpl.groupTitle.replace('{items}', msg.items).replace('{num}', cnt);
|
|
dcnt = jQuery.grep(files, function(f) { return f.mime == 'directory' ? true : false ; }).length;
|
|
if (!dcnt) {
|
|
size = 0;
|
|
jQuery.each(files, function(h, f) {
|
|
var s = parseInt(f.size);
|
|
|
|
if (s >= 0 && size >= 0) {
|
|
size += s;
|
|
} else {
|
|
size = 'unknown';
|
|
}
|
|
});
|
|
content.push(row.replace(l, msg.kind).replace(v, msg.files));
|
|
!hideItems.size && content.push(row.replace(l, msg.size).replace(v, fm.formatSize(size)));
|
|
} else {
|
|
rdcnt = jQuery.grep(files, function(f) { return f.mime === 'directory' && (! f.phash || f.isroot)? true : false ; }).length;
|
|
dcnt -= rdcnt;
|
|
content.push(row.replace(l, msg.kind).replace(v, (rdcnt === cnt || dcnt === cnt)? msg[rdcnt? 'roots' : 'folders'] : jQuery.map({roots: rdcnt, folders: dcnt, files: cnt - rdcnt - dcnt}, function(c, t) { return c? msg[t]+' '+c : null; }).join(', ')));
|
|
!hideItems.size && content.push(row.replace(l, msg.size).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{name}', 'size')));
|
|
count = jQuery.map(files, function(f) { return f.hash; });
|
|
|
|
}
|
|
}
|
|
|
|
view = view.replace('{title}', title).replace('{content}', content.join('').replace(/{class}/g, ''));
|
|
|
|
dialog = self.fmDialog(view, opts);
|
|
dialog.attr('id', id).one('mousedown', '.elfinder-info-path', function() {
|
|
jQuery(this).html(applyZWSP(jQuery(this).html(), true));
|
|
});
|
|
|
|
if (getHashAlgorisms.length) {
|
|
hashProg.appendTo(dialog.find('.'+spclass+'-'+getHashAlgorisms[0]).parent());
|
|
}
|
|
|
|
if (fm.UA.Mobile && jQuery.fn.tooltip) {
|
|
dialog.children('.ui-dialog-content .elfinder-info-title').tooltip({
|
|
classes: {
|
|
'ui-tooltip': 'elfinder-ui-tooltip ui-widget-shadow'
|
|
},
|
|
tooltipClass: 'elfinder-ui-tooltip ui-widget-shadow',
|
|
track: true
|
|
});
|
|
}
|
|
|
|
if (file && file.url == '1') {
|
|
dialog.on('click', '.'+spclass+'-url', function(){
|
|
jQuery(this).parent().html(tpl.spinner.replace('{text}', fm.i18n('ntfurl')).replace('{name}', 'url'));
|
|
fm.request({
|
|
data : {cmd : 'url', target : file.hash},
|
|
preventDefault : true
|
|
})
|
|
.fail(function() {
|
|
replSpinner(name_esc, 'url');
|
|
})
|
|
.done(function(data) {
|
|
if (data.url) {
|
|
replSpinner('<a href="'+data.url+'" target="_blank">'+name_esc+'</a>' || name_esc, 'url');
|
|
var rfile = fm.file(file.hash);
|
|
rfile.url = data.url;
|
|
} else {
|
|
replSpinner(name_esc, 'url');
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
// load thumbnail
|
|
if (tmb) {
|
|
jQuery('<img/>')
|
|
.on('load', function() { dialog.find('.elfinder-cwd-icon').addClass(tmb.className).css('background-image', "url('"+tmb.url+"')"); })
|
|
.attr('src', tmb.url);
|
|
}
|
|
|
|
// send request to count total size
|
|
if (count.length) {
|
|
reqDfrd = fm.getSize(count).done(function(data) {
|
|
replSpinner(data.formated, 'size');
|
|
}).fail(function() {
|
|
replSpinner(msg.unknown, 'size');
|
|
});
|
|
}
|
|
|
|
// call custom actions
|
|
if (customActions.length) {
|
|
jQuery.each(customActions, function(i, action) {
|
|
try {
|
|
action(file, fm, dialog);
|
|
} catch(e) {
|
|
fm.debug('error', e);
|
|
}
|
|
});
|
|
}
|
|
|
|
return jQuery.Deferred().resolve();
|
|
};
|
|
|
|
}).prototype = { forceLoad : true }; // this is required command
|