You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
4.6 KiB

  1. /**********************************************************************************
  2. *
  3. * Copyright (c) 2017-2019 MuK IT GmbH.
  4. *
  5. * This file is part of MuK Web Utils
  6. * (see https://mukit.at).
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU Lesser General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. **********************************************************************************/
  22. odoo.define('muk_web_utils.files', function (require) {
  23. "use strict";
  24. var core = require('web.core');
  25. var QWeb = core.qweb;
  26. var _t = core._t;
  27. var traverseItems = function(items, tree) {
  28. var def = $.Deferred();
  29. var files = [];
  30. var defs = [];
  31. _.each(items, function(item, index) {
  32. var entry = item.webkitGetAsEntry();
  33. if(entry) {
  34. var traverse = $.Deferred();
  35. traverseEntry(entry, tree).then(function(result) {
  36. if(tree) {
  37. files = files.concat(result);
  38. } else {
  39. files = _.union(files, result);
  40. }
  41. traverse.resolve();
  42. });
  43. defs.push(traverse);
  44. } else {
  45. var file = item.getAsFile();
  46. if(file) {
  47. if(file.size) {
  48. files.push(_.extend({}, file, {isFileItem: true}));
  49. }
  50. } else {
  51. console.warn("Your browser doesn't support Drag and Drop!");
  52. }
  53. }
  54. });
  55. Promise.resolve().apply($, defs).then(function () {
  56. def.resolve(files);
  57. });
  58. return def;
  59. };
  60. var traverseEntries = function(entries, tree) {
  61. var def = $.Deferred();
  62. var files = [];
  63. var defs = [];
  64. _.each(entries, function(entry, index) {
  65. var traverse = $.Deferred();
  66. traverseEntry(entry, tree).then(function(result) {
  67. if(tree) {
  68. files = files.concat(result);
  69. } else {
  70. files = _.union(files, result);
  71. }
  72. traverse.resolve();
  73. });
  74. defs.push(traverse);
  75. });
  76. Promise.resolve().apply($, defs).then(function () {
  77. def.resolve(files);
  78. });
  79. return def;
  80. }
  81. var traverseEntry = function(entry, tree) {
  82. var def = $.Deferred();
  83. if(entry.isFile) {
  84. def.resolve([entry]);
  85. } else if(entry.isDirectory) {
  86. entry.createReader().readEntries(function (entries) {
  87. traverseEntries(entries, tree).then(function (files) {
  88. if(tree) {
  89. def.resolve([{
  90. name: entry.name,
  91. files: files,
  92. isFile: false,
  93. isDirectory: true,
  94. childCount: files.length,
  95. fullPath: entry.fullPath,
  96. fileCount: _.reduce(files, function(sum, item) {
  97. return item.isFile ? sum + 1 : sum + item.fileCount || 0;
  98. }, 0),
  99. }]);
  100. } else {
  101. def.resolve(files);
  102. }
  103. });
  104. });
  105. } else {
  106. def.resolve([]);
  107. }
  108. return def;
  109. };
  110. var getFileTree = function(items, count) {
  111. var traverse = traverseItems(items, true);
  112. if(count) {
  113. var def = $.Deferred();
  114. traverse.then(function(files) {
  115. def.resolve({
  116. files: files,
  117. count: _.reduce(files, function(sum, item) {
  118. return item.isFile ? sum + 1 : sum + item.fileCount || 0;
  119. }, 0),
  120. });
  121. });
  122. return def;
  123. }
  124. return traverse;
  125. };
  126. var getFileList = function(items, count) {
  127. var traverse = traverseItems(items, false);
  128. if(count) {
  129. var def = $.Deferred();
  130. traverse.then(function(files) {
  131. def.resolve({
  132. files: files,
  133. count: files.length,
  134. });
  135. });
  136. return def;
  137. }
  138. return traverse;
  139. };
  140. var loadFile = function(file, callback) {
  141. var fileReader = new FileReader();
  142. fileReader.readAsDataURL(file);
  143. fileReader.onloadend = callback;
  144. };
  145. var readFile = function(file, callback) {
  146. if(file.isFile) {
  147. file.file(function(file) {
  148. loadFile(file, callback);
  149. });
  150. } else {
  151. loadFile(file, callback);
  152. }
  153. };
  154. return {
  155. traverseItems: traverseItems,
  156. traverseEntries: traverseEntries,
  157. traverseEntry: traverseEntry,
  158. getFileTree: getFileTree,
  159. getFileList: getFileList,
  160. loadFile: loadFile,
  161. readFile: readFile,
  162. };
  163. });