123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _vue = require("vue");
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
- var _request = _interopRequireDefault(require("./request"));
- var _uid2 = _interopRequireDefault(require("./uid"));
- var _attrAccept = _interopRequireDefault(require("./attr-accept"));
- var _traverseFileTree = _interopRequireDefault(require("./traverseFileTree"));
- var _interface = require("./interface");
- var _pickAttrs = _interopRequireDefault(require("../_util/pickAttrs"));
- var _partition = _interopRequireDefault(require("lodash/partition"));
- var _excluded = ["componentTag", "prefixCls", "disabled", "id", "multiple", "accept", "capture", "directory", "openFileDialogOnClick", "onMouseenter", "onMouseleave"];
- var _default2 = (0, _vue.defineComponent)({
- compatConfig: {
- MODE: 3
- },
- name: 'AjaxUploader',
- inheritAttrs: false,
- props: (0, _interface.uploadProps)(),
- setup: function setup(props, _ref) {
- var slots = _ref.slots,
- attrs = _ref.attrs,
- expose = _ref.expose;
- var uid = (0, _vue.ref)((0, _uid2.default)());
- var reqs = {};
- var fileInput = (0, _vue.ref)();
- var isMounted = false;
- /**
- * Process file before upload. When all the file is ready, we start upload.
- */
- var processFile = /*#__PURE__*/function () {
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(file, fileList) {
- var beforeUpload, transformedFile, action, mergedAction, data, mergedData, parsedData, parsedFile, mergedParsedFile;
- return _regenerator.default.wrap(function _callee$(_context) {
- while (1) switch (_context.prev = _context.next) {
- case 0:
- beforeUpload = props.beforeUpload;
- transformedFile = file;
- if (!beforeUpload) {
- _context.next = 14;
- break;
- }
- _context.prev = 3;
- _context.next = 6;
- return beforeUpload(file, fileList);
- case 6:
- transformedFile = _context.sent;
- _context.next = 12;
- break;
- case 9:
- _context.prev = 9;
- _context.t0 = _context["catch"](3);
- // Rejection will also trade as false
- transformedFile = false;
- case 12:
- if (!(transformedFile === false)) {
- _context.next = 14;
- break;
- }
- return _context.abrupt("return", {
- origin: file,
- parsedFile: null,
- action: null,
- data: null
- });
- case 14:
- // Get latest action
- action = props.action;
- if (!(typeof action === 'function')) {
- _context.next = 21;
- break;
- }
- _context.next = 18;
- return action(file);
- case 18:
- mergedAction = _context.sent;
- _context.next = 22;
- break;
- case 21:
- mergedAction = action;
- case 22:
- // Get latest data
- data = props.data;
- if (!(typeof data === 'function')) {
- _context.next = 29;
- break;
- }
- _context.next = 26;
- return data(file);
- case 26:
- mergedData = _context.sent;
- _context.next = 30;
- break;
- case 29:
- mergedData = data;
- case 30:
- parsedData =
- // string type is from legacy `transformFile`.
- // Not sure if this will work since no related test case works with it
- ((0, _typeof2.default)(transformedFile) === 'object' || typeof transformedFile === 'string') && transformedFile ? transformedFile : file;
- if (parsedData instanceof File) {
- parsedFile = parsedData;
- } else {
- parsedFile = new File([parsedData], file.name, {
- type: file.type
- });
- }
- mergedParsedFile = parsedFile;
- mergedParsedFile.uid = file.uid;
- return _context.abrupt("return", {
- origin: file,
- data: mergedData,
- parsedFile: mergedParsedFile,
- action: mergedAction
- });
- case 35:
- case "end":
- return _context.stop();
- }
- }, _callee, null, [[3, 9]]);
- }));
- return function processFile(_x, _x2) {
- return _ref2.apply(this, arguments);
- };
- }();
- var post = function post(_ref3) {
- var data = _ref3.data,
- origin = _ref3.origin,
- action = _ref3.action,
- parsedFile = _ref3.parsedFile;
- if (!isMounted) {
- return;
- }
- var onStart = props.onStart,
- customRequest = props.customRequest,
- name = props.name,
- headers = props.headers,
- withCredentials = props.withCredentials,
- method = props.method;
- var uid = origin.uid;
- var request = customRequest || _request.default;
- var requestOption = {
- action: action,
- filename: name,
- data: data,
- file: parsedFile,
- headers: headers,
- withCredentials: withCredentials,
- method: method || 'post',
- onProgress: function onProgress(e) {
- var onProgress = props.onProgress;
- onProgress === null || onProgress === void 0 ? void 0 : onProgress(e, parsedFile);
- },
- onSuccess: function onSuccess(ret, xhr) {
- var onSuccess = props.onSuccess;
- onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(ret, parsedFile, xhr);
- delete reqs[uid];
- },
- onError: function onError(err, ret) {
- var onError = props.onError;
- onError === null || onError === void 0 ? void 0 : onError(err, ret, parsedFile);
- delete reqs[uid];
- }
- };
- onStart(origin);
- reqs[uid] = request(requestOption);
- };
- var reset = function reset() {
- uid.value = (0, _uid2.default)();
- };
- var abort = function abort(file) {
- if (file) {
- var _uid = file.uid ? file.uid : file;
- if (reqs[_uid] && reqs[_uid].abort) {
- reqs[_uid].abort();
- }
- delete reqs[_uid];
- } else {
- Object.keys(reqs).forEach(function (uid) {
- if (reqs[uid] && reqs[uid].abort) {
- reqs[uid].abort();
- }
- delete reqs[uid];
- });
- }
- };
- (0, _vue.onMounted)(function () {
- isMounted = true;
- });
- (0, _vue.onBeforeUnmount)(function () {
- isMounted = false;
- abort();
- });
- var uploadFiles = function uploadFiles(files) {
- var originFiles = (0, _toConsumableArray2.default)(files);
- var postFiles = originFiles.map(function (file) {
- // eslint-disable-next-line no-param-reassign
- file.uid = (0, _uid2.default)();
- return processFile(file, originFiles);
- });
- // Batch upload files
- Promise.all(postFiles).then(function (fileList) {
- var onBatchStart = props.onBatchStart;
- onBatchStart === null || onBatchStart === void 0 ? void 0 : onBatchStart(fileList.map(function (_ref4) {
- var origin = _ref4.origin,
- parsedFile = _ref4.parsedFile;
- return {
- file: origin,
- parsedFile: parsedFile
- };
- }));
- fileList.filter(function (file) {
- return file.parsedFile !== null;
- }).forEach(function (file) {
- post(file);
- });
- });
- };
- var onChange = function onChange(e) {
- var accept = props.accept,
- directory = props.directory;
- var files = e.target.files;
- var acceptedFiles = (0, _toConsumableArray2.default)(files).filter(function (file) {
- return !directory || (0, _attrAccept.default)(file, accept);
- });
- uploadFiles(acceptedFiles);
- reset();
- };
- var onClick = function onClick(e) {
- var el = fileInput.value;
- if (!el) {
- return;
- }
- var onClick = props.onClick;
- // TODO
- // if (children && (children as any).type === 'button') {
- // const parent = el.parentNode as HTMLInputElement;
- // parent.focus();
- // parent.querySelector('button').blur();
- // }
- el.click();
- if (onClick) {
- onClick(e);
- }
- };
- var onKeyDown = function onKeyDown(e) {
- if (e.key === 'Enter') {
- onClick(e);
- }
- };
- var onFileDrop = function onFileDrop(e) {
- var multiple = props.multiple;
- e.preventDefault();
- if (e.type === 'dragover') {
- return;
- }
- if (props.directory) {
- (0, _traverseFileTree.default)(Array.prototype.slice.call(e.dataTransfer.items), uploadFiles, function (_file) {
- return (0, _attrAccept.default)(_file, props.accept);
- });
- } else {
- var files = (0, _partition.default)(Array.prototype.slice.call(e.dataTransfer.files), function (file) {
- return (0, _attrAccept.default)(file, props.accept);
- });
- var successFiles = files[0];
- var errorFiles = files[1];
- if (multiple === false) {
- successFiles = successFiles.slice(0, 1);
- }
- uploadFiles(successFiles);
- if (errorFiles.length && props.onReject) props.onReject(errorFiles);
- }
- };
- expose({
- abort: abort
- });
- return function () {
- var _cls, _slots$default;
- var Tag = props.componentTag,
- prefixCls = props.prefixCls,
- disabled = props.disabled,
- id = props.id,
- multiple = props.multiple,
- accept = props.accept,
- capture = props.capture,
- directory = props.directory,
- openFileDialogOnClick = props.openFileDialogOnClick,
- onMouseenter = props.onMouseenter,
- onMouseleave = props.onMouseleave,
- otherProps = (0, _objectWithoutProperties2.default)(props, _excluded);
- var cls = (_cls = {}, (0, _defineProperty2.default)(_cls, prefixCls, true), (0, _defineProperty2.default)(_cls, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_cls, attrs.class, !!attrs.class), _cls);
- // because input don't have directory/webkitdirectory type declaration
- var dirProps = directory ? {
- directory: 'directory',
- webkitdirectory: 'webkitdirectory'
- } : {};
- var events = disabled ? {} : {
- onClick: openFileDialogOnClick ? onClick : function () {},
- onKeydown: openFileDialogOnClick ? onKeyDown : function () {},
- onMouseenter: onMouseenter,
- onMouseleave: onMouseleave,
- onDrop: onFileDrop,
- onDragover: onFileDrop,
- tabindex: '0'
- };
- return (0, _vue.createVNode)(Tag, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, events), {}, {
- "class": cls,
- "role": "button",
- "style": attrs.style
- }), {
- default: function _default() {
- return [(0, _vue.createVNode)("input", (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _pickAttrs.default)(otherProps, {
- aria: true,
- data: true
- })), {}, {
- "id": id,
- "type": "file",
- "ref": fileInput,
- "onClick": function onClick(e) {
- return e.stopPropagation();
- },
- "key": uid.value,
- "style": {
- display: 'none'
- },
- "accept": accept
- }, dirProps), {}, {
- "multiple": multiple,
- "onChange": onChange
- }, capture != null ? {
- capture: capture
- } : {}), null), (_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots)];
- }
- });
- };
- }
- });
- exports.default = _default2;
|