be847a496b51ac7eff394b0cc8ae581b2a3e2820e33a93e2fcd3e83c4304078599f2fa0ad8492865151b2bd8fc88ee3cec9cd5ef98dfd697effeb4bd404cf8 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var lodashUnified = require('lodash-unified');
  5. var core = require('@vueuse/core');
  6. var upload = require('./upload.js');
  7. var error = require('../../../utils/error.js');
  8. const SCOPE = "ElUpload";
  9. const revokeFileObjectURL = (file) => {
  10. var _a;
  11. if ((_a = file.url) == null ? void 0 : _a.startsWith("blob:")) {
  12. URL.revokeObjectURL(file.url);
  13. }
  14. };
  15. const useHandlers = (props, uploadRef) => {
  16. const uploadFiles = core.useVModel(props, "fileList", void 0, { passive: true });
  17. const getFile = (rawFile) => uploadFiles.value.find((file) => file.uid === rawFile.uid);
  18. function abort(file) {
  19. var _a;
  20. (_a = uploadRef.value) == null ? void 0 : _a.abort(file);
  21. }
  22. function clearFiles(states = ["ready", "uploading", "success", "fail"]) {
  23. uploadFiles.value = uploadFiles.value.filter((row) => !states.includes(row.status));
  24. }
  25. function removeFile(file) {
  26. uploadFiles.value = uploadFiles.value.filter((uploadFile) => uploadFile.uid !== file.uid);
  27. }
  28. const handleError = (err, rawFile) => {
  29. const file = getFile(rawFile);
  30. if (!file)
  31. return;
  32. console.error(err);
  33. file.status = "fail";
  34. removeFile(file);
  35. props.onError(err, file, uploadFiles.value);
  36. props.onChange(file, uploadFiles.value);
  37. };
  38. const handleProgress = (evt, rawFile) => {
  39. const file = getFile(rawFile);
  40. if (!file)
  41. return;
  42. props.onProgress(evt, file, uploadFiles.value);
  43. file.status = "uploading";
  44. file.percentage = Math.round(evt.percent);
  45. };
  46. const handleSuccess = (response, rawFile) => {
  47. const file = getFile(rawFile);
  48. if (!file)
  49. return;
  50. file.status = "success";
  51. file.response = response;
  52. props.onSuccess(response, file, uploadFiles.value);
  53. props.onChange(file, uploadFiles.value);
  54. };
  55. const handleStart = (file) => {
  56. if (lodashUnified.isNil(file.uid))
  57. file.uid = upload.genFileId();
  58. const uploadFile = {
  59. name: file.name,
  60. percentage: 0,
  61. status: "ready",
  62. size: file.size,
  63. raw: file,
  64. uid: file.uid
  65. };
  66. if (props.listType === "picture-card" || props.listType === "picture") {
  67. try {
  68. uploadFile.url = URL.createObjectURL(file);
  69. } catch (err) {
  70. error.debugWarn(SCOPE, err.message);
  71. props.onError(err, uploadFile, uploadFiles.value);
  72. }
  73. }
  74. uploadFiles.value = [...uploadFiles.value, uploadFile];
  75. props.onChange(uploadFile, uploadFiles.value);
  76. };
  77. const handleRemove = async (file) => {
  78. const uploadFile = file instanceof File ? getFile(file) : file;
  79. if (!uploadFile)
  80. error.throwError(SCOPE, "file to be removed not found");
  81. const doRemove = (file2) => {
  82. abort(file2);
  83. removeFile(file2);
  84. props.onRemove(file2, uploadFiles.value);
  85. revokeFileObjectURL(file2);
  86. };
  87. if (props.beforeRemove) {
  88. const before = await props.beforeRemove(uploadFile, uploadFiles.value);
  89. if (before !== false)
  90. doRemove(uploadFile);
  91. } else {
  92. doRemove(uploadFile);
  93. }
  94. };
  95. function submit() {
  96. uploadFiles.value.filter(({ status }) => status === "ready").forEach(({ raw }) => {
  97. var _a;
  98. return raw && ((_a = uploadRef.value) == null ? void 0 : _a.upload(raw));
  99. });
  100. }
  101. vue.watch(() => props.listType, (val) => {
  102. if (val !== "picture-card" && val !== "picture") {
  103. return;
  104. }
  105. uploadFiles.value = uploadFiles.value.map((file) => {
  106. const { raw, url } = file;
  107. if (!url && raw) {
  108. try {
  109. file.url = URL.createObjectURL(raw);
  110. } catch (err) {
  111. props.onError(err, file, uploadFiles.value);
  112. }
  113. }
  114. return file;
  115. });
  116. });
  117. vue.watch(uploadFiles, (files) => {
  118. for (const file of files) {
  119. file.uid || (file.uid = upload.genFileId());
  120. file.status || (file.status = "success");
  121. }
  122. }, { immediate: true, deep: true });
  123. return {
  124. uploadFiles,
  125. abort,
  126. clearFiles,
  127. handleError,
  128. handleProgress,
  129. handleStart,
  130. handleSuccess,
  131. handleRemove,
  132. submit,
  133. revokeFileObjectURL
  134. };
  135. };
  136. exports.useHandlers = useHandlers;
  137. //# sourceMappingURL=use-handlers.js.map