info.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. "use strict";
  2. /**
  3. * @class elFinder command "info".
  4. * Display dialog with file properties.
  5. *
  6. * @author Dmitry (dio) Levashov, dio@std42.ru
  7. **/
  8. (function($) {
  9. elFinder.prototype.commands.info = function() {
  10. var m = 'msg',
  11. fm = this.fm,
  12. spclass = 'elfinder-info-spinner',
  13. msg = {
  14. calc : fm.i18n('calc'),
  15. size : fm.i18n('size'),
  16. unknown : fm.i18n('unknown'),
  17. path : fm.i18n('path'),
  18. aliasfor : fm.i18n('aliasfor'),
  19. modify : fm.i18n('modify'),
  20. perms : fm.i18n('perms'),
  21. locked : fm.i18n('locked'),
  22. dim : fm.i18n('dim'),
  23. kind : fm.i18n('kind'),
  24. files : fm.i18n('files'),
  25. folders : fm.i18n('folders'),
  26. items : fm.i18n('items'),
  27. yes : fm.i18n('yes'),
  28. no : fm.i18n('no'),
  29. link : fm.i18n('link'),
  30. owner : fm.i18n('owner'),
  31. desc : fm.i18n('description'),
  32. downloads: fm.i18n('downloads')
  33. };
  34. this.tpl = {
  35. main : '<div class="ui-helper-clearfix elfinder-info-title"><span class="elfinder-cwd-icon {class} ui-corner-all"/>{title}</div><table class="elfinder-info-tb">{content}</table>',
  36. itemTitle : '<strong>{name}</strong><span class="elfinder-info-kind">{kind}</span>',
  37. groupTitle : '<strong>{items}: {num}</strong>',
  38. row : '<tr><td>{label} : </td><td>{value}</td></tr>',
  39. spinner : '<span>{text}</span> <span class="'+spclass+' '+spclass+'-'+'{id}"/>'
  40. }
  41. this.alwaysEnabled = true;
  42. this.updateOnSelect = false;
  43. this.shortcuts = [{
  44. pattern : 'ctrl+i'
  45. }];
  46. this.init = function() {
  47. $.each(msg, function(k, v) {
  48. msg[k] = fm.i18n(v);
  49. });
  50. }
  51. this.getstate = function() {
  52. return 0;
  53. }
  54. this.exec = function(hashes) {
  55. var self = this,
  56. fm = this.fm,
  57. tpl = this.tpl,
  58. row = tpl.row,
  59. files = this.files(hashes),
  60. cnt = files.length,
  61. content = [],
  62. view = tpl.main,
  63. l = '{label}',
  64. v = '{value}',
  65. opts = {
  66. title : this.title,
  67. width : 'auto',
  68. modal : true,
  69. close: function() {
  70. $(this).elfinderdialog('destroy');
  71. }
  72. },
  73. count = [],
  74. replSpinner = function(msg) {
  75. dialog.find('.' + spclass).parent().text(msg);
  76. },
  77. replSpinnerById = function(msg, id) {
  78. dialog.find('.' + spclass + '-' + id).parent().html(msg);
  79. },
  80. id = fm.namespace + '-info-' + $.map(files, function(f) {
  81. return f.hash
  82. }).join('-'),
  83. dialog = fm.getUI().find('#'+id),
  84. size, tmb, file, title, dcnt;
  85. var disabledCommands = Drupal.settings.elfinder.disabledCommands,
  86. viewDesc = $.inArray('desc', disabledCommands) == -1 ? true : false,
  87. editDesc = $.inArray('editdesc', disabledCommands) == -1 ? true : false,
  88. viewOwner = $.inArray('owner', disabledCommands) == -1 ? true : false,
  89. viewDownloads = $.inArray('downloadcount', disabledCommands) == -1 ? true : false;
  90. if (!cnt) {
  91. return $.Deferred().reject();
  92. }
  93. if (dialog.length) {
  94. dialog.elfinderdialog('toTop');
  95. return $.Deferred().resolve();
  96. }
  97. if (cnt == 1) {
  98. file = files[0];
  99. view = view.replace('{class}', fm.mime2class(file.mime));
  100. title = tpl.itemTitle.replace('{name}', file.name).replace('{kind}', fm.mime2kind(file));
  101. if (file.tmb) {
  102. tmb = fm.option('tmbUrl')+file.tmb;
  103. }
  104. if (!file.read) {
  105. size = msg.unknown;
  106. } else if (file.mime != 'directory' || file.alias) {
  107. size = fm.formatSize(file.size);
  108. } else {
  109. /* adding spinner id to separate field updates */
  110. size = tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'size');
  111. count.push(file.hash);
  112. }
  113. content.push(row.replace(l, msg.size).replace(v, size));
  114. file.alias && content.push(row.replace(l, msg.aliasfor).replace(v, file.alias));
  115. content.push(row.replace(l, msg.path).replace(v, fm.escape(fm.path(file.hash))));
  116. file.read && content.push(row.replace(l, msg.link).replace(v, '<a href="'+fm.url(file.hash)+'" target="_blank">'+file.name+'</a>'));
  117. if (file.dim) { // old api
  118. content.push(row.replace(l, msg.dim).replace(v, file.dim));
  119. } else if (file.mime.indexOf('image') !== -1) {
  120. content.push(row.replace(l, msg.dim).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'dim')));
  121. fm.request({
  122. data : {cmd : 'dim', target : file.hash},
  123. preventDefault : true
  124. })
  125. .fail(function() {
  126. replSpinnerById(msg.unknown, 'dim');
  127. })
  128. .done(function(data) {
  129. replSpinnerById(data.dim || msg.unknown, 'dim');
  130. });
  131. }
  132. content.push(row.replace(l, msg.modify).replace(v, fm.formatDate(file)));
  133. content.push(row.replace(l, msg.perms).replace(v, fm.formatPermissions(file)));
  134. content.push(row.replace(l, msg.locked).replace(v, file.locked ? msg.yes : msg.no));
  135. /* Don't show fields if command not allowed */
  136. if (viewOwner) {
  137. content.push(row.replace(l, Drupal.t('Owner')).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'owner')));
  138. fm.request({
  139. data : {cmd : 'owner', target : file.hash},
  140. preventDefault : true
  141. })
  142. .fail(function() {
  143. replSpinnerById(msg.unknown, 'owner');
  144. })
  145. .done(function(data) {
  146. replSpinnerById(data.owner || msg.unknown, 'owner');
  147. });
  148. }
  149. /* Don't show fields if command not allowed */
  150. if (viewDownloads) {
  151. content.push(row.replace(l, Drupal.t('Downloads')).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'downloads')));
  152. fm.request({
  153. data : {cmd : 'downloadcount', target : file.hash},
  154. preventDefault : true
  155. })
  156. .fail(function() {
  157. replSpinnerById(msg.unknown, 'downloads');
  158. })
  159. .done(function(data) {
  160. replSpinnerById(data.downloadcount || msg.unknown, 'downloads');
  161. });
  162. }
  163. /* Don't show fields if command not allowed */
  164. if (viewDesc || editDesc) {
  165. var desc = '<div id="elfinder-fm-file-desc">' + msg.calc + '</div>';
  166. if (editDesc) {
  167. desc = '<textarea cols="20" rows="5" id="elfinder-fm-file-desc" class="ui-widget ui-widget-content" disabled="true" >' + msg.calc + '</textarea><input type="button" id="elfinder-fm-file-desc-btn-save" value="' + fm.i18n('btnSave') + '" />';
  168. }
  169. content.push(row.replace(l, Drupal.t('Description')).replace(v , desc));
  170. fm.request({
  171. data : {cmd : 'desc', target : file.hash},
  172. preventDefault : true
  173. })
  174. .done(function(data) {
  175. var fieldDesc = dialog.find('#elfinder-fm-file-desc');
  176. if (editDesc) {
  177. fieldDesc.val(data.desc || '');
  178. fieldDesc.removeAttr('disabled');
  179. } else {
  180. fieldDesc.empty();
  181. fieldDesc.html(data.desc || '');
  182. }
  183. });
  184. }
  185. } else {
  186. view = view.replace('{class}', 'elfinder-cwd-icon-group');
  187. title = tpl.groupTitle.replace('{items}', msg.items).replace('{num}', cnt);
  188. dcnt = $.map(files, function(f) {
  189. return f.mime == 'directory' ? 1 : null
  190. }).length;
  191. if (!dcnt) {
  192. size = 0;
  193. $.each(files, function(h, f) {
  194. var s = parseInt(f.size);
  195. if (s >= 0 && size >= 0) {
  196. size += s;
  197. } else {
  198. size = 'unknown';
  199. }
  200. });
  201. content.push(row.replace(l, msg.kind).replace(v, msg.files));
  202. content.push(row.replace(l, msg.size).replace(v, fm.formatSize(size)));
  203. } else {
  204. content.push(row.replace(l, msg.kind).replace(v, dcnt == cnt ? msg.folders : msg.folders+' '+dcnt+', '+msg.files+' '+(cnt-dcnt)))
  205. content.push(row.replace(l, msg.size).replace(v, tpl.spinner.replace('{text}', msg.calc).replace('{id}', 'size')));
  206. count = $.map(files, function(f) {
  207. return f.hash
  208. });
  209. }
  210. }
  211. view = view.replace('{title}', title).replace('{content}', content.join(''));
  212. dialog = fm.dialog(view, opts);
  213. dialog.attr('id', id);
  214. if (editDesc) {
  215. var inputDesc = $('#elfinder-fm-file-desc', dialog);
  216. var btnSave = $('#elfinder-fm-file-desc-btn-save', dialog).button();
  217. btnSave.click(function() {
  218. fm.lockfiles({files : [file.hash]});
  219. fm.request({
  220. data : {cmd : 'desc', target : file.hash, content : inputDesc.val()},
  221. notify : {type : 'desc', cnt : 1}
  222. })
  223. .always(function() {
  224. fm.unlockfiles({files : [file.hash]})
  225. });
  226. });
  227. }
  228. // load thumbnail
  229. if (tmb) {
  230. $('<img/>')
  231. .load(function() {
  232. dialog.find('.elfinder-cwd-icon').css('background', 'url("' + tmb + '") center center no-repeat');
  233. })
  234. .attr('src', tmb);
  235. }
  236. // send request to count total size
  237. if (count.length) {
  238. fm.request({
  239. data : {cmd : 'size', targets : count},
  240. preventDefault : true
  241. })
  242. .fail(function() {
  243. replSpinnerById(msg.unknown, 'size');
  244. })
  245. .done(function(data) {
  246. var size = parseInt(data.size);
  247. fm.log(data.size)
  248. replSpinnerById(size >= 0 ? fm.formatSize(size) : msg.unknown, 'size');
  249. });
  250. }
  251. }
  252. }
  253. })(jQuery);