/* * elFinder Integration * * Copyright (c) 2010-2018, Alexey Sukhotin. All rights reserved. */ "use strict"; /** * @class elFinder command "info". * Display dialog with file properties. * * @author Dmitry (dio) Levashov, dio@std42.ru **/ (function($) { elFinder.prototype.commands.info = function() { var m = 'msg', fm = this.fm, spclass = 'elfinder-info-spinner', 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'), items: fm.i18n('items'), yes: fm.i18n('yes'), no: fm.i18n('no'), link: fm.i18n('link'), owner: fm.i18n('owner'), desc: fm.i18n('description'), downloads: fm.i18n('downloads') }; this.tpl = { main: '
{title}
{content}
', itemTitle: '{name}{kind}', groupTitle: '{items}: {num}', row: '{label} : {value}', spinner: '{text} ' } this.alwaysEnabled = true; this.updateOnSelect = false; this.shortcuts = [{ pattern: 'ctrl+i' }]; this.init = function() { $.each(msg, function(k, v) { msg[k] = fm.i18n(v); }); } this.getstate = function() { return 0; } this.exec = function(hashes) { var self = this, fm = this.fm, tpl = this.tpl, row = tpl.row, files = this.files(hashes), cnt = files.length, content = [], view = tpl.main, l = '{label}', v = '{value}', opts = { title: this.title, width: 'auto', modal: true, close: function() { $(this).elfinderdialog('destroy'); } }, count = [], replSpinner = function(msg) { dialog.find('.' + spclass).parent().text(msg); }, replSpinnerById = function(msg, id) { dialog.find('.' + spclass + '-' + id).parent().html(msg); }, id = fm.namespace + '-info-' + $.map(files, function(f) { return f.hash }).join('-'), dialog = fm.getUI().find('#' + id), size, tmb, file, title, dcnt; var disabledCommands = Drupal.settings.elfinder.disabledCommands, viewDesc = $.inArray('desc', disabledCommands) == -1 ? true : false, editDesc = $.inArray('editdesc', disabledCommands) == -1 ? true : false, viewOwner = $.inArray('owner', disabledCommands) == -1 ? true : false, viewDownloads = $.inArray('downloadcount', disabledCommands) == -1 ? true : false; if (!cnt) { return $.Deferred().reject(); } if (dialog.length) { dialog.elfinderdialog('toTop'); return $.Deferred().resolve(); } if (cnt == 1) { file = files[0]; view = view.replace('{class}', fm.mime2class(file.mime)); title = tpl.itemTitle.replace('{name}', file.name).replace('{kind}', fm.mime2kind(file)); if (file.tmb) { tmb = fm.option('tmbUrl') + file.tmb; } if (!file.read) { size = msg.unknown; } else if (file.mime != 'directory' || file.alias) { size = fm.formatSize(file.size); } else { /* adding spinner id to separate field updates */ size = tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'size'); count.push(file.hash); } content.push(row.replace(l, msg.size).replace(v, size)); file.alias && content.push(row.replace(l, msg.aliasfor).replace(v, file.alias)); content.push(row.replace(l, msg.path).replace(v, fm.escape(fm.path(file.hash)))); file.read && content.push(row.replace(l, msg.link).replace(v, '' + file.name + '')); if (file.dim) { // old api content.push(row.replace(l, msg.dim).replace(v, file.dim)); } else if (file.mime.indexOf('image') !== -1) { content.push(row.replace(l, msg.dim).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'dim'))); fm.request({ data: {cmd: 'dim', target: file.hash}, preventDefault: true }) .fail(function() { replSpinnerById(msg.unknown, 'dim'); }) .done(function(data) { replSpinnerById(data.dim || msg.unknown, 'dim'); }); } content.push(row.replace(l, msg.modify).replace(v, fm.formatDate(file))); content.push(row.replace(l, msg.perms).replace(v, fm.formatPermissions(file))); content.push(row.replace(l, msg.locked).replace(v, file.locked ? msg.yes : msg.no)); /* Don't show fields if command not allowed */ if (viewOwner) { content.push(row.replace(l, Drupal.t('Owner')).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'owner'))); fm.request({ data: {cmd: 'owner', target: file.hash}, preventDefault: true }) .fail(function() { replSpinnerById(msg.unknown, 'owner'); }) .done(function(data) { replSpinnerById(data.owner || msg.unknown, 'owner'); }); } /* Don't show fields if command not allowed */ if (viewDownloads) { content.push(row.replace(l, Drupal.t('Downloads')).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'downloads'))); fm.request({ data: {cmd: 'downloadcount', target: file.hash}, preventDefault: true }) .fail(function() { replSpinnerById(msg.unknown, 'downloads'); }) .done(function(data) { replSpinnerById(data.downloadcount || msg.unknown, 'downloads'); }); } /* Don't show fields if command not allowed */ if (viewDesc || editDesc) { var desc = '
' + msg.calc + '
'; if (editDesc) { desc = ''; } content.push(row.replace(l, Drupal.t('Description')).replace(v, desc)); fm.request({ data: {cmd: 'desc', target: file.hash}, preventDefault: true }) .done(function(data) { var fieldDesc = dialog.find('#elfinder-fm-file-desc'); if (editDesc) { fieldDesc.val(data.desc || ''); fieldDesc.removeAttr('disabled'); } else { fieldDesc.empty(); fieldDesc.html(data.desc || ''); } }); } } else { view = view.replace('{class}', 'elfinder-cwd-icon-group'); title = tpl.groupTitle.replace('{items}', msg.items).replace('{num}', cnt); dcnt = $.map(files, function(f) { return f.mime == 'directory' ? 1 : null }).length; if (!dcnt) { size = 0; $.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)); content.push(row.replace(l, msg.size).replace(v, fm.formatSize(size))); } else { content.push(row.replace(l, msg.kind).replace(v, dcnt == cnt ? msg.folders : msg.folders + ' ' + dcnt + ', ' + msg.files + ' ' + (cnt - dcnt))) content.push(row.replace(l, msg.size).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'size'))); count = $.map(files, function(f) { return f.hash }); } } view = view.replace('{title}', title).replace('{content}', content.join('')); dialog = fm.dialog(view, opts); dialog.attr('id', id); if (editDesc) { var inputDesc = $('#elfinder-fm-file-desc', dialog); var btnSave = $('#elfinder-fm-file-desc-btn-save', dialog).button(); btnSave.click(function() { fm.lockfiles({files: [file.hash]}); fm.request({ data: {cmd: 'desc', target: file.hash, content: inputDesc.val()}, notify: {type: 'desc', cnt: 1} }) .always(function() { fm.unlockfiles({files: [file.hash]}) }); }); } // load thumbnail if (tmb) { $('') .load(function() { dialog.find('.elfinder-cwd-icon').css('background', 'url("' + tmb + '") center center no-repeat'); }) .attr('src', tmb); } // send request to count total size if (count.length) { fm.request({ data: {cmd: 'size', targets: count}, preventDefault: true }) .fail(function() { replSpinnerById(msg.unknown, 'size'); }) .done(function(data) { var size = parseInt(data.size); fm.log(data.size) replSpinnerById(size >= 0 ? fm.formatSize(size) : msg.unknown, 'size'); }); } } } })(jQuery);