PageRenderTime 79ms CodeModel.GetById 36ms RepoModel.GetById 1ms app.codeStats 0ms

/fm/js/proxy/elFinderSupportVer1.js

https://gitlab.com/wormen/client.mastodont-engine
JavaScript | 336 lines | 237 code | 51 blank | 48 comment | 64 complexity | 4ec482862b2e0afe62863624ce953459 MD5 | raw file
  1. "use strict";
  2. /**
  3. * elFinder transport to support old protocol.
  4. *
  5. * @example
  6. * $('selector').elfinder({
  7. * ....
  8. * transport : new elFinderSupportVer1()
  9. * })
  10. *
  11. * @author Dmitry (dio) Levashov
  12. **/
  13. window.elFinderSupportVer1 = function(upload) {
  14. var self = this;
  15. this.upload = upload || 'auto';
  16. this.init = function(fm) {
  17. this.fm = fm;
  18. this.fm.parseUploadData = function(text) {
  19. var data;
  20. if (!$.trim(text)) {
  21. return {error : ['errResponse', 'errDataEmpty']};
  22. }
  23. try {
  24. data = $.parseJSON(text);
  25. } catch (e) {
  26. return {error : ['errResponse', 'errDataNotJSON']}
  27. }
  28. return self.normalize('upload', data);
  29. }
  30. }
  31. this.send = function(opts) {
  32. var self = this,
  33. fm = this.fm,
  34. dfrd = $.Deferred(),
  35. cmd = opts.data.cmd,
  36. args = [],
  37. _opts = {},
  38. data,
  39. xhr;
  40. dfrd.abort = function() {
  41. xhr.state() == 'pending' && xhr.abort();
  42. }
  43. switch (cmd) {
  44. case 'open':
  45. opts.data.tree = 1;
  46. break;
  47. case 'parents':
  48. case 'tree':
  49. return dfrd.resolve({tree : []});
  50. break;
  51. case 'get':
  52. opts.data.cmd = 'read';
  53. opts.data.current = fm.file(opts.data.target).phash;
  54. break;
  55. case 'put':
  56. opts.data.cmd = 'edit';
  57. opts.data.current = fm.file(opts.data.target).phash;
  58. break;
  59. case 'archive':
  60. case 'rm':
  61. opts.data.current = fm.file(opts.data.targets[0]).phash;
  62. break;
  63. case 'extract':
  64. case 'rename':
  65. case 'resize':
  66. opts.data.current = fm.file(opts.data.target).phash;
  67. break;
  68. case 'duplicate':
  69. _opts = $.extend(true, {}, opts);
  70. $.each(opts.data.targets, function(i, hash) {
  71. $.ajax($.extend(_opts, {data : {cmd : 'duplicate', target : hash, current : fm.file(hash).phash}}))
  72. .error(function(error) {
  73. fm.error(fm.res('error', 'connect'));
  74. })
  75. .done(function(data) {
  76. data = self.normalize('duplicate', data);
  77. if (data.error) {
  78. fm.error(data.error);
  79. } else if (data.added) {
  80. fm.trigger('add', {added : data.added});
  81. }
  82. })
  83. });
  84. return dfrd.resolve({})
  85. break;
  86. case 'mkdir':
  87. case 'mkfile':
  88. opts.data.current = opts.data.target;
  89. break;
  90. case 'paste':
  91. opts.data.current = opts.data.dst
  92. break;
  93. case 'size':
  94. return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
  95. break;
  96. case 'search':
  97. return dfrd.resolve({error : fm.res('error', 'cmdsupport')});
  98. break;
  99. }
  100. // cmd = opts.data.cmd
  101. xhr = $.ajax(opts)
  102. .fail(function(error) {
  103. dfrd.reject(error)
  104. })
  105. .done(function(raw) {
  106. data = self.normalize(cmd, raw);
  107. // cmd != 'open' && self.fm.log(data);
  108. if (cmd == 'paste' && !data.error) {
  109. fm.sync();
  110. dfrd.resolve({});
  111. } else {
  112. dfrd.resolve(data);
  113. }
  114. })
  115. return dfrd;
  116. }
  117. // fix old connectors errors messages as possible
  118. // this.errors = {
  119. // 'Unknown command' : 'Unknown command.',
  120. // 'Invalid backend configuration' : 'Invalid backend configuration.',
  121. // 'Access denied' : 'Access denied.',
  122. // 'PHP JSON module not installed' : 'PHP JSON module not installed.',
  123. // 'File not found' : 'File not found.',
  124. // 'Invalid name' : 'Invalid file name.',
  125. // 'File or folder with the same name already exists' : 'File named "$1" already exists in this location.',
  126. // 'Not allowed file type' : 'Not allowed file type.',
  127. // 'File exceeds the maximum allowed filesize' : 'File exceeds maximum allowed size.',
  128. // 'Unable to copy into itself' : 'Unable to copy "$1" into itself.',
  129. // 'Unable to create archive' : 'Unable to create archive.',
  130. // 'Unable to extract files from archive' : 'Unable to extract files from "$1".'
  131. // }
  132. this.normalize = function(cmd, data) {
  133. var self = this,
  134. files = {},
  135. filter = function(file) { return file && file.hash && file.name && file.mime ? file : null; },
  136. phash;
  137. if ((cmd == 'tmb' || cmd == 'get')) {
  138. return data;
  139. }
  140. // if (data.error) {
  141. // $.each(data.error, function(i, msg) {
  142. // if (self.errors[msg]) {
  143. // data.error[i] = self.errors[msg];
  144. // }
  145. // });
  146. // }
  147. if (cmd == 'upload' && data.error && data.cwd) {
  148. data.warning = $.extend({}, data.error);
  149. data.error = false;
  150. }
  151. if (data.error) {
  152. return data;
  153. }
  154. if (cmd == 'put') {
  155. phash = this.fm.file(data.target.hash).phash;
  156. return {changed : [this.normalizeFile(data.target, phash)]};
  157. }
  158. phash = data.cwd.hash;
  159. if (data.tree) {
  160. $.each(this.normalizeTree(data.tree), function(i, file) {
  161. files[file.hash] = file;
  162. });
  163. }
  164. $.each(data.cdc||[], function(i, file) {
  165. var hash = file.hash;
  166. if (files[hash]) {
  167. files[hash].date = file.date;
  168. files[hash].locked = file.hash == phash ? true : file.rm === void(0) ? false : !file.rm;
  169. } else {
  170. files[hash] = self.normalizeFile(file, phash, data.tmb);
  171. }
  172. });
  173. if (!data.tree) {
  174. $.each(this.fm.files(), function(hash, file) {
  175. if (!files[hash] && file.phash != phash && file.mime == 'directory') {
  176. files[hash] = file;
  177. }
  178. });
  179. }
  180. if (cmd == 'open') {
  181. return {
  182. cwd : files[phash] || this.normalizeFile(data.cwd),
  183. files : $.map(files, function(f) { return f }),
  184. options : self.normalizeOptions(data),
  185. init : !!data.params,
  186. debug : data.debug
  187. };
  188. }
  189. return $.extend({
  190. current : data.cwd.hash,
  191. error : data.error,
  192. warning : data.warning,
  193. options : {tmb : !!data.tmb}
  194. }, this.fm.diff($.map(files, filter)));
  195. }
  196. /**
  197. * Convert old api tree into plain array of dirs
  198. *
  199. * @param Object root dir
  200. * @return Array
  201. */
  202. this.normalizeTree = function(root) {
  203. var self = this,
  204. result = [],
  205. traverse = function(dirs, phash) {
  206. var i, dir;
  207. for (i = 0; i < dirs.length; i++) {
  208. dir = dirs[i];
  209. result.push(self.normalizeFile(dir, phash))
  210. dir.dirs.length && traverse(dir.dirs, dir.hash);
  211. }
  212. };
  213. traverse([root]);
  214. return result;
  215. }
  216. /**
  217. * Convert file info from old api format into new one
  218. *
  219. * @param Object file
  220. * @param String parent dir hash
  221. * @return Object
  222. */
  223. this.normalizeFile = function(file, phash, tmb) {
  224. var mime = file.mime || 'directory',
  225. size = mime == 'directory' && !file.linkTo ? 0 : file.size,
  226. info = {
  227. url : file.url,
  228. hash : file.hash,
  229. phash : phash,
  230. name : file.name,
  231. mime : mime,
  232. date : file.date || 'unknown',
  233. size : size,
  234. read : file.read,
  235. write : file.write,
  236. locked : !phash ? true : file.rm === void(0) ? false : !file.rm
  237. };
  238. if (file.mime == 'application/x-empty') {
  239. info.mime = 'text/plain';
  240. }
  241. if (file.linkTo) {
  242. info.alias = file.linkTo;
  243. }
  244. if (file.linkTo) {
  245. info.linkTo = file.linkTo;
  246. }
  247. if (file.tmb) {
  248. info.tmb = file.tmb;
  249. } else if (info.mime.indexOf('image/') === 0 && tmb) {
  250. info.tmb = 1;
  251. }
  252. if (file.dirs && file.dirs.length) {
  253. info.dirs = true;
  254. }
  255. if (file.dim) {
  256. info.dim = file.dim;
  257. }
  258. if (file.resize) {
  259. info.resize = file.resize;
  260. }
  261. return info;
  262. }
  263. this.normalizeOptions = function(data) {
  264. var opts = {
  265. path : data.cwd.rel,
  266. disabled : data.disabled || [],
  267. tmb : !!data.tmb,
  268. copyOverwrite : true
  269. };
  270. if (data.params) {
  271. opts.api = 1;
  272. opts.url = data.params.url;
  273. opts.archivers = {
  274. create : data.params.archives || [],
  275. extract : data.params.extract || []
  276. }
  277. }
  278. if (opts.path.indexOf('/') !== -1) {
  279. opts.separator = '/';
  280. } else if (opts.path.indexOf('\\') !== -1) {
  281. opts.separator = '\\';
  282. }
  283. return opts;
  284. }
  285. }