Upload.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = exports.LIST_IGNORE = void 0;
  7. var _vue = require("vue");
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  10. var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
  11. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  12. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  13. var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
  14. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  15. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  16. var _vcUpload = _interopRequireDefault(require("../vc-upload"));
  17. var _UploadList = _interopRequireDefault(require("./UploadList"));
  18. var _interface = require("./interface");
  19. var _utils = require("./utils");
  20. var _LocaleReceiver = require("../locale-provider/LocaleReceiver");
  21. var _default3 = _interopRequireDefault(require("../locale/default"));
  22. var _propsUtil = require("../_util/props-util");
  23. var _useMergedState3 = _interopRequireDefault(require("../_util/hooks/useMergedState"));
  24. var _devWarning = _interopRequireDefault(require("../vc-util/devWarning"));
  25. var _useConfigInject2 = _interopRequireDefault(require("../_util/hooks/useConfigInject"));
  26. var _classNames3 = _interopRequireDefault(require("../_util/classNames"));
  27. var _form = require("../form");
  28. var _excluded = ["class", "style"];
  29. var LIST_IGNORE = "__LIST_IGNORE_".concat(Date.now(), "__");
  30. exports.LIST_IGNORE = LIST_IGNORE;
  31. var _default2 = (0, _vue.defineComponent)({
  32. compatConfig: {
  33. MODE: 3
  34. },
  35. name: 'AUpload',
  36. inheritAttrs: false,
  37. props: (0, _propsUtil.initDefaultProps)((0, _interface.uploadProps)(), {
  38. type: 'select',
  39. multiple: false,
  40. action: '',
  41. data: {},
  42. accept: '',
  43. showUploadList: true,
  44. listType: 'text',
  45. disabled: false,
  46. supportServerRender: true
  47. }),
  48. setup: function setup(props, _ref) {
  49. var slots = _ref.slots,
  50. attrs = _ref.attrs,
  51. expose = _ref.expose;
  52. var formItemContext = (0, _form.useInjectFormItemContext)();
  53. var _useMergedState = (0, _useMergedState3.default)(props.defaultFileList || [], {
  54. value: (0, _vue.toRef)(props, 'fileList'),
  55. postState: function postState(list) {
  56. var timestamp = Date.now();
  57. return (list !== null && list !== void 0 ? list : []).map(function (file, index) {
  58. if (!file.uid && !Object.isFrozen(file)) {
  59. file.uid = "__AUTO__".concat(timestamp, "_").concat(index, "__");
  60. }
  61. return file;
  62. });
  63. }
  64. }),
  65. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  66. mergedFileList = _useMergedState2[0],
  67. setMergedFileList = _useMergedState2[1];
  68. var dragState = (0, _vue.ref)('drop');
  69. var upload = (0, _vue.ref)();
  70. (0, _vue.onMounted)(function () {
  71. (0, _devWarning.default)(props.fileList !== undefined || attrs.value === undefined, 'Upload', '`value` is not a valid prop, do you mean `fileList`?');
  72. (0, _devWarning.default)(props.transformFile === undefined, 'Upload', '`transformFile` is deprecated. Please use `beforeUpload` directly.');
  73. (0, _devWarning.default)(props.remove === undefined, 'Upload', '`remove` props is deprecated. Please use `remove` event.');
  74. });
  75. var onInternalChange = function onInternalChange(file, changedFileList, event) {
  76. var _props$onUpdateFileL, _props$onChange;
  77. var cloneList = (0, _toConsumableArray2.default)(changedFileList);
  78. // Cut to match count
  79. if (props.maxCount === 1) {
  80. cloneList = cloneList.slice(-1);
  81. } else if (props.maxCount) {
  82. cloneList = cloneList.slice(0, props.maxCount);
  83. }
  84. setMergedFileList(cloneList);
  85. var changeInfo = {
  86. file: file,
  87. fileList: cloneList
  88. };
  89. if (event) {
  90. changeInfo.event = event;
  91. }
  92. (_props$onUpdateFileL = props['onUpdate:fileList']) === null || _props$onUpdateFileL === void 0 ? void 0 : _props$onUpdateFileL.call(props, changeInfo.fileList);
  93. (_props$onChange = props.onChange) === null || _props$onChange === void 0 ? void 0 : _props$onChange.call(props, changeInfo);
  94. formItemContext.onFieldChange();
  95. };
  96. var mergedBeforeUpload = /*#__PURE__*/function () {
  97. var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(file, fileListArgs) {
  98. var beforeUpload, transformFile, parsedFile, result;
  99. return _regenerator.default.wrap(function _callee$(_context) {
  100. while (1) switch (_context.prev = _context.next) {
  101. case 0:
  102. beforeUpload = props.beforeUpload, transformFile = props.transformFile;
  103. parsedFile = file;
  104. if (!beforeUpload) {
  105. _context.next = 13;
  106. break;
  107. }
  108. _context.next = 5;
  109. return beforeUpload(file, fileListArgs);
  110. case 5:
  111. result = _context.sent;
  112. if (!(result === false)) {
  113. _context.next = 8;
  114. break;
  115. }
  116. return _context.abrupt("return", false);
  117. case 8:
  118. // Hack for LIST_IGNORE, we add additional info to remove from the list
  119. delete file[LIST_IGNORE];
  120. if (!(result === LIST_IGNORE)) {
  121. _context.next = 12;
  122. break;
  123. }
  124. Object.defineProperty(file, LIST_IGNORE, {
  125. value: true,
  126. configurable: true
  127. });
  128. return _context.abrupt("return", false);
  129. case 12:
  130. if ((0, _typeof2.default)(result) === 'object' && result) {
  131. parsedFile = result;
  132. }
  133. case 13:
  134. if (!transformFile) {
  135. _context.next = 17;
  136. break;
  137. }
  138. _context.next = 16;
  139. return transformFile(parsedFile);
  140. case 16:
  141. parsedFile = _context.sent;
  142. case 17:
  143. return _context.abrupt("return", parsedFile);
  144. case 18:
  145. case "end":
  146. return _context.stop();
  147. }
  148. }, _callee);
  149. }));
  150. return function mergedBeforeUpload(_x, _x2) {
  151. return _ref2.apply(this, arguments);
  152. };
  153. }();
  154. var onBatchStart = function onBatchStart(batchFileInfoList) {
  155. // Skip file which marked as `LIST_IGNORE`, these file will not add to file list
  156. var filteredFileInfoList = batchFileInfoList.filter(function (info) {
  157. return !info.file[LIST_IGNORE];
  158. });
  159. // Nothing to do since no file need upload
  160. if (!filteredFileInfoList.length) {
  161. return;
  162. }
  163. var objectFileList = filteredFileInfoList.map(function (info) {
  164. return (0, _utils.file2Obj)(info.file);
  165. });
  166. // Concat new files with prev files
  167. var newFileList = (0, _toConsumableArray2.default)(mergedFileList.value);
  168. objectFileList.forEach(function (fileObj) {
  169. // Replace file if exist
  170. newFileList = (0, _utils.updateFileList)(fileObj, newFileList);
  171. });
  172. objectFileList.forEach(function (fileObj, index) {
  173. // Repeat trigger `onChange` event for compatible
  174. var triggerFileObj = fileObj;
  175. if (!filteredFileInfoList[index].parsedFile) {
  176. // `beforeUpload` return false
  177. var originFileObj = fileObj.originFileObj;
  178. var clone;
  179. try {
  180. clone = new File([originFileObj], originFileObj.name, {
  181. type: originFileObj.type
  182. });
  183. } catch (e) {
  184. clone = new Blob([originFileObj], {
  185. type: originFileObj.type
  186. });
  187. clone.name = originFileObj.name;
  188. clone.lastModifiedDate = new Date();
  189. clone.lastModified = new Date().getTime();
  190. }
  191. clone.uid = fileObj.uid;
  192. triggerFileObj = clone;
  193. } else {
  194. // Inject `uploading` status
  195. fileObj.status = 'uploading';
  196. }
  197. onInternalChange(triggerFileObj, newFileList);
  198. });
  199. };
  200. var onSuccess = function onSuccess(response, file, xhr) {
  201. try {
  202. if (typeof response === 'string') {
  203. response = JSON.parse(response);
  204. }
  205. } catch (e) {
  206. /* do nothing */
  207. }
  208. // removed
  209. if (!(0, _utils.getFileItem)(file, mergedFileList.value)) {
  210. return;
  211. }
  212. var targetItem = (0, _utils.file2Obj)(file);
  213. targetItem.status = 'done';
  214. targetItem.percent = 100;
  215. targetItem.response = response;
  216. targetItem.xhr = xhr;
  217. var nextFileList = (0, _utils.updateFileList)(targetItem, mergedFileList.value);
  218. onInternalChange(targetItem, nextFileList);
  219. };
  220. var onProgress = function onProgress(e, file) {
  221. // removed
  222. if (!(0, _utils.getFileItem)(file, mergedFileList.value)) {
  223. return;
  224. }
  225. var targetItem = (0, _utils.file2Obj)(file);
  226. targetItem.status = 'uploading';
  227. targetItem.percent = e.percent;
  228. var nextFileList = (0, _utils.updateFileList)(targetItem, mergedFileList.value);
  229. onInternalChange(targetItem, nextFileList, e);
  230. };
  231. var onError = function onError(error, response, file) {
  232. // removed
  233. if (!(0, _utils.getFileItem)(file, mergedFileList.value)) {
  234. return;
  235. }
  236. var targetItem = (0, _utils.file2Obj)(file);
  237. targetItem.error = error;
  238. targetItem.response = response;
  239. targetItem.status = 'error';
  240. var nextFileList = (0, _utils.updateFileList)(targetItem, mergedFileList.value);
  241. onInternalChange(targetItem, nextFileList);
  242. };
  243. var handleRemove = function handleRemove(file) {
  244. var currentFile;
  245. var mergedRemove = props.onRemove || props.remove;
  246. Promise.resolve(typeof mergedRemove === 'function' ? mergedRemove(file) : mergedRemove).then(function (ret) {
  247. // Prevent removing file
  248. if (ret === false) {
  249. return;
  250. }
  251. var removedFileList = (0, _utils.removeFileItem)(file, mergedFileList.value);
  252. if (removedFileList) {
  253. var _mergedFileList$value, _upload$value;
  254. currentFile = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, file), {}, {
  255. status: 'removed'
  256. });
  257. (_mergedFileList$value = mergedFileList.value) === null || _mergedFileList$value === void 0 ? void 0 : _mergedFileList$value.forEach(function (item) {
  258. var matchKey = currentFile.uid !== undefined ? 'uid' : 'name';
  259. if (item[matchKey] === currentFile[matchKey] && !Object.isFrozen(item)) {
  260. item.status = 'removed';
  261. }
  262. });
  263. (_upload$value = upload.value) === null || _upload$value === void 0 ? void 0 : _upload$value.abort(currentFile);
  264. onInternalChange(currentFile, removedFileList);
  265. }
  266. });
  267. };
  268. var onFileDrop = function onFileDrop(e) {
  269. dragState.value = e.type;
  270. if (e.type === 'drop') {
  271. var _props$onDrop;
  272. (_props$onDrop = props.onDrop) === null || _props$onDrop === void 0 ? void 0 : _props$onDrop.call(props, e);
  273. }
  274. };
  275. expose({
  276. onBatchStart: onBatchStart,
  277. onSuccess: onSuccess,
  278. onProgress: onProgress,
  279. onError: onError,
  280. fileList: mergedFileList,
  281. upload: upload
  282. });
  283. var _useConfigInject = (0, _useConfigInject2.default)('upload', props),
  284. prefixCls = _useConfigInject.prefixCls,
  285. direction = _useConfigInject.direction;
  286. var _useLocaleReceiver = (0, _LocaleReceiver.useLocaleReceiver)('Upload', _default3.default.Upload, (0, _vue.computed)(function () {
  287. return props.locale;
  288. })),
  289. _useLocaleReceiver2 = (0, _slicedToArray2.default)(_useLocaleReceiver, 1),
  290. locale = _useLocaleReceiver2[0];
  291. var renderUploadList = function renderUploadList(button, buttonVisible) {
  292. var removeIcon = props.removeIcon,
  293. previewIcon = props.previewIcon,
  294. downloadIcon = props.downloadIcon,
  295. previewFile = props.previewFile,
  296. onPreview = props.onPreview,
  297. onDownload = props.onDownload,
  298. disabled = props.disabled,
  299. isImageUrl = props.isImageUrl,
  300. progress = props.progress,
  301. itemRender = props.itemRender,
  302. iconRender = props.iconRender,
  303. showUploadList = props.showUploadList;
  304. var _ref3 = typeof showUploadList === 'boolean' ? {} : showUploadList,
  305. showDownloadIcon = _ref3.showDownloadIcon,
  306. showPreviewIcon = _ref3.showPreviewIcon,
  307. showRemoveIcon = _ref3.showRemoveIcon;
  308. return showUploadList ? (0, _vue.createVNode)(_UploadList.default, {
  309. "listType": props.listType,
  310. "items": mergedFileList.value,
  311. "previewFile": previewFile,
  312. "onPreview": onPreview,
  313. "onDownload": onDownload,
  314. "onRemove": handleRemove,
  315. "showRemoveIcon": !disabled && showRemoveIcon,
  316. "showPreviewIcon": showPreviewIcon,
  317. "showDownloadIcon": showDownloadIcon,
  318. "removeIcon": removeIcon,
  319. "previewIcon": previewIcon,
  320. "downloadIcon": downloadIcon,
  321. "iconRender": iconRender,
  322. "locale": locale.value,
  323. "isImageUrl": isImageUrl,
  324. "progress": progress,
  325. "itemRender": itemRender,
  326. "appendActionVisible": buttonVisible,
  327. "appendAction": button
  328. }, (0, _objectSpread2.default)({}, slots)) : button === null || button === void 0 ? void 0 : button();
  329. };
  330. return function () {
  331. var _props$id, _classNames2, _slots$default2;
  332. var listType = props.listType,
  333. disabled = props.disabled,
  334. type = props.type;
  335. var className = attrs.class,
  336. styleName = attrs.style,
  337. transAttrs = (0, _objectWithoutProperties2.default)(attrs, _excluded);
  338. var rcUploadProps = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
  339. onBatchStart: onBatchStart,
  340. onError: onError,
  341. onProgress: onProgress,
  342. onSuccess: onSuccess
  343. }, transAttrs), props), {}, {
  344. id: (_props$id = props.id) !== null && _props$id !== void 0 ? _props$id : formItemContext.id.value,
  345. prefixCls: prefixCls.value,
  346. beforeUpload: mergedBeforeUpload,
  347. onChange: undefined
  348. });
  349. delete rcUploadProps.remove;
  350. // Remove id to avoid open by label when trigger is hidden
  351. // !children: https://github.com/ant-design/ant-design/issues/14298
  352. // disabled: https://github.com/ant-design/ant-design/issues/16478
  353. // https://github.com/ant-design/ant-design/issues/24197
  354. if (!slots.default || disabled) {
  355. delete rcUploadProps.id;
  356. }
  357. if (type === 'drag') {
  358. var _classNames, _slots$default;
  359. var dragCls = (0, _classNames3.default)(prefixCls.value, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-drag"), true), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-drag-uploading"), mergedFileList.value.some(function (file) {
  360. return file.status === 'uploading';
  361. })), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-drag-hover"), dragState.value === 'dragover'), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls.value, "-rtl"), direction.value === 'rtl'), _classNames), attrs.class);
  362. return (0, _vue.createVNode)("span", null, [(0, _vue.createVNode)("div", {
  363. "class": dragCls,
  364. "onDrop": onFileDrop,
  365. "onDragover": onFileDrop,
  366. "onDragleave": onFileDrop,
  367. "style": attrs.style
  368. }, [(0, _vue.createVNode)(_vcUpload.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rcUploadProps), {}, {
  369. "ref": upload,
  370. "class": "".concat(prefixCls.value, "-btn")
  371. }), (0, _objectSpread2.default)({
  372. default: function _default() {
  373. return [(0, _vue.createVNode)("div", {
  374. "class": "".concat(prefixCls.value, "-drag-container")
  375. }, [(_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots)])];
  376. }
  377. }, slots))]), renderUploadList()]);
  378. }
  379. var uploadButtonCls = (0, _classNames3.default)(prefixCls.value, (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls.value, "-select"), true), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls.value, "-select-").concat(listType), true), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls.value, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames2, "".concat(prefixCls.value, "-rtl"), direction.value === 'rtl'), _classNames2));
  380. var children = (0, _propsUtil.flattenChildren)((_slots$default2 = slots.default) === null || _slots$default2 === void 0 ? void 0 : _slots$default2.call(slots));
  381. var renderUploadButton = function renderUploadButton(uploadButtonStyle) {
  382. return (0, _vue.createVNode)("div", {
  383. "class": uploadButtonCls,
  384. "style": uploadButtonStyle
  385. }, [(0, _vue.createVNode)(_vcUpload.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rcUploadProps), {}, {
  386. "ref": upload
  387. }), slots)]);
  388. };
  389. if (listType === 'picture-card') {
  390. return (0, _vue.createVNode)("span", {
  391. "class": (0, _classNames3.default)("".concat(prefixCls.value, "-picture-card-wrapper"), attrs.class)
  392. }, [renderUploadList(renderUploadButton, !!(children && children.length))]);
  393. }
  394. return (0, _vue.createVNode)("span", {
  395. "class": attrs.class
  396. }, [renderUploadButton(children && children.length ? undefined : {
  397. display: 'none'
  398. }), renderUploadList()]);
  399. };
  400. }
  401. });
  402. exports.default = _default2;