UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

789 lines (788 loc) 38.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FileControlRenderer = exports.getNameFromUrl = void 0; var tslib_1 = require("tslib"); var react_1 = (0, tslib_1.__importDefault)(require("react")); var Item_1 = require("./Item"); var find_1 = (0, tslib_1.__importDefault)(require("lodash/find")); var isPlainObject_1 = (0, tslib_1.__importDefault)(require("lodash/isPlainObject")); // @ts-ignore var mapLimit_1 = (0, tslib_1.__importDefault)(require("async/mapLimit")); var InputImage_1 = (0, tslib_1.__importDefault)(require("./InputImage")); var helper_1 = require("../../utils/helper"); var api_1 = require("../../utils/api"); var Button_1 = (0, tslib_1.__importDefault)(require("../../components/Button")); var icons_1 = require("../../components/icons"); var react_dropzone_1 = (0, tslib_1.__importDefault)(require("react-dropzone")); var tpl_builtin_1 = require("../../utils/tpl-builtin"); var merge_1 = (0, tslib_1.__importDefault)(require("lodash/merge")); var preventEvent = function (e) { return e.stopPropagation(); }; function getNameFromUrl(url) { if (/(?:\/|^)([^\/]+?)$/.test(url)) { return decodeURIComponent(RegExp.$1); } return url; } exports.getNameFromUrl = getNameFromUrl; var FileControl = /** @class */ (function (_super) { (0, tslib_1.__extends)(FileControl, _super); function FileControl(props) { var _this = _super.call(this, props) || this; _this.fileUploadCancelExecutors = []; _this.dropzone = react_1.default.createRef(); var value = props.value; var valueField = props.valueField || 'value'; var joinValues = props.joinValues; var delimiter = props.delimiter; var files = []; if (value && value instanceof Blob) { files = [value]; } else if (value) { files = (Array.isArray(value) ? value : joinValues ? ("" + (value[valueField] || value)).split(delimiter) : [value]) .map(function (item) { return FileControl.valueToFile(item, props); }) .filter(function (item) { return item; }); } _this.state = { files: files, uploading: false }; _this.sendFile = _this.sendFile.bind(_this); _this.removeFile = _this.removeFile.bind(_this); _this.clearError = _this.clearError.bind(_this); _this.handleDrop = _this.handleDrop.bind(_this); _this.handleDropRejected = _this.handleDropRejected.bind(_this); _this.startUpload = _this.startUpload.bind(_this); _this.stopUpload = _this.stopUpload.bind(_this); _this.retry = _this.retry.bind(_this); _this.toggleUpload = _this.toggleUpload.bind(_this); _this.tick = _this.tick.bind(_this); _this.onChange = _this.onChange.bind(_this); _this.uploadFile = _this.uploadFile.bind(_this); _this.uploadBigFile = _this.uploadBigFile.bind(_this); _this.handleSelect = _this.handleSelect.bind(_this); _this.syncAutoFill = _this.syncAutoFill.bind(_this); _this.downloadTpl = _this.downloadTpl.bind(_this); return _this; } FileControl.valueToFile = function (value, props, files) { var _a, _b; var file = files && typeof value === 'string' ? (0, find_1.default)(files, function (item) { return item.value === value; }) : undefined; var valueField = props.valueField || 'value'; var urlField = props.urlField || 'url'; var nameField = props.nameField || 'name'; return value ? value instanceof File ? (_a = { state: 'ready' }, _a[valueField] = value, _a[urlField] = value, _a[nameField] = value.name, _a.id = (0, helper_1.guid)(), _a) : (0, tslib_1.__assign)({}, (typeof value === 'string' ? (_b = { state: file && file.state ? file.state : 'init' }, _b[valueField] = value, _b[urlField] = value, _b[nameField] = (file && file.name) || (/^data:/.test(value) ? 'base64数据' : getNameFromUrl(value)), _b.id = (0, helper_1.guid)(), _b) : value)) : undefined; }; FileControl.prototype.componentDidMount = function () { this.syncAutoFill(); }; FileControl.prototype.componentDidUpdate = function (prevProps) { var _this = this; var props = this.props; if (prevProps.value !== props.value && this.emitValue !== props.value) { var value = props.value; var joinValues = props.joinValues; var delimiter = props.delimiter; var files = []; if (value) { files = (Array.isArray(value) ? value : joinValues && typeof value === 'string' ? value.split(delimiter) : [value]) .map(function (item) { var obj = FileControl.valueToFile(item, props, _this.state.files); var org; if (obj && (org = (0, find_1.default)(_this.state.files, function (item) { return item.value === obj.value; }))) { obj = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, org), obj), { id: obj.id || org.id }); } return obj; }) .filter(function (item) { return item; }); } this.setState({ files: files }, this.syncAutoFill); } }; FileControl.prototype.handleDrop = function (files) { var _this = this; if (!files.length) { return; } var _a = this.props, maxSize = _a.maxSize, multiple = _a.multiple, maxLength = _a.maxLength, __ = _a.translate; var nameField = this.props.nameField || 'name'; var allowed = multiple && maxLength ? maxLength - this.state.files.length : files.length; var inputFiles = []; [].slice.call(files, 0, allowed).forEach(function (file) { if (maxSize && file.size > maxSize) { _this.props.env.alert(__('File.maxSize', { filename: file[nameField] || file.name, actualSize: InputImage_1.default.formatFileSize(file.size), maxSize: InputImage_1.default.formatFileSize(maxSize) })); file.state = 'invalid'; } else { file.state = 'pending'; } file.id = (0, helper_1.guid)(); inputFiles.push(file); }); if (!inputFiles.length) { return; } this.setState({ error: null, files: multiple ? this.state.files.concat(inputFiles) : inputFiles }, function () { var autoUpload = _this.props.autoUpload; if (autoUpload) { _this.startUpload(); } }); }; FileControl.prototype.handleDropRejected = function (rejectedFiles, evt) { if (evt.type !== 'change' && evt.type !== 'drop') { return; } var _a = this.props, multiple = _a.multiple, env = _a.env, accept = _a.accept, __ = _a.translate; var nameField = this.props.nameField || 'name'; var files = rejectedFiles.map(function (fileRejection) { var _a; return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, fileRejection.file), (_a = { state: 'invalid', id: (0, helper_1.guid)() }, _a[nameField] = fileRejection.file.name, _a))); }); // this.setState({ // files: multiple // ? this.state.files.concat(files) // : this.state.files.length // ? this.state.files // : files.slice(0, 1) // }); env.alert(__('File.invalidType', { files: files.map(function (item) { return "\u300C" + item[nameField] + "\u300D"; }).join(' '), accept: accept })); }; FileControl.prototype.handleClickFile = function (file, e) { e.preventDefault(); e.stopPropagation(); var _a = this.props, data = _a.data, env = _a.env, downloadUrl = _a.downloadUrl; var urlField = this.props.urlField || 'url'; var valueField = this.props.valueField || 'value'; var fileUrl = file[urlField] || file[valueField]; var api = typeof downloadUrl === 'string' && !~downloadUrl.indexOf('$') ? "" + downloadUrl + fileUrl : downloadUrl ? downloadUrl : "" + fileUrl; this.handleApi(api, file); }; FileControl.prototype.downloadTpl = function (e) { e.preventDefault(); e.stopPropagation(); this.handleApi(this.props.templateUrl || ''); }; FileControl.prototype.handleApi = function (api, payload) { var _a, _b; var _c = this.props, data = _c.data, env = _c.env; if (api) { var ctx = (0, helper_1.createObject)(data, (0, tslib_1.__assign)({}, payload)); var apiObject = (0, api_1.normalizeApi)(api); if (((_a = apiObject.method) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'get' && !apiObject.data) { window.open((0, api_1.buildApi)(apiObject, ctx).url); } else { apiObject.responseType = (_b = apiObject.responseType) !== null && _b !== void 0 ? _b : 'blob'; env.fetcher(apiObject, ctx, { responseType: 'blob' }); } } }; FileControl.prototype.handleSelect = function () { this.dropzone.current && this.dropzone.current.open(); }; FileControl.prototype.startUpload = function (retry) { if (retry === void 0) { retry = false; } if (this.state.uploading) { return; } this.setState({ uploading: true, files: this.state.files.map(function (file) { if (retry && file.state === 'error') { file.state = 'pending'; file.progress = 0; } return file; }) }, this.tick); }; FileControl.prototype.toggleUpload = function (e) { e.preventDefault(); return this.state.uploading ? this.stopUpload() : this.startUpload(); }; FileControl.prototype.stopUpload = function () { if (!this.state.uploading) { return; } this.setState({ uploading: false }); }; FileControl.prototype.retry = function () { this.startUpload(true); }; FileControl.prototype.tick = function () { var _this = this; if (this.current || !this.state.uploading) { return; } var __ = this.props.translate; var nameField = this.props.nameField || 'name'; var file = (0, find_1.default)(this.state.files, function (item) { return item.state === 'pending'; }); if (file) { this.current = file; file.state = 'uploading'; this.setState({ files: this.state.files.concat() }, function () { return _this.sendFile(file, function (error, file, obj) { var files = _this.state.files.concat(); var idx = files.indexOf(file); if (!~idx) { return; } var newFile = file; if (error) { newFile.state = 'error'; newFile.error = error; } else { newFile = obj; newFile[nameField] = newFile[nameField] || file.name; } files.splice(idx, 1, newFile); _this.current = null; _this.setState({ error: error ? error : null, files: files }, _this.tick); }, function (progress) { var files = _this.state.files.concat(); var idx = files.indexOf(file); if (!~idx) { return; } // file 是个非 File 对象,先不copy了直接改。 file.progress = progress; _this.setState({ files: files }); }); }); } else { this.setState({ uploading: false }, function () { _this.onChange(!!_this.resolve); if (_this.resolve) { _this.resolve(_this.state.files.some(function (file) { return file.state === 'error'; }) ? __('File.errorRetry') : null); _this.resolve = undefined; } }); } }; FileControl.prototype.sendFile = function (file, cb, onProgress) { var _a = this.props, receiver = _a.receiver, fileField = _a.fileField, useChunk = _a.useChunk, chunkSize = _a.chunkSize, startChunkApi = _a.startChunkApi, chunkApi = _a.chunkApi, finishChunkApi = _a.finishChunkApi, asBase64 = _a.asBase64, asBlob = _a.asBlob, data = _a.data, __ = _a.translate; var nameField = this.props.nameField || 'name'; var valueField = this.props.valueField || 'value'; if (asBase64) { var reader_1 = new FileReader(); reader_1.readAsDataURL(file); reader_1.onload = function () { var _a; file.state = 'ready'; cb(null, file, (_a = {}, _a[valueField] = reader_1.result, _a[nameField] = file.name, _a.state = 'ready', _a.id = file.id, _a)); }; reader_1.onerror = function (error) { return cb(error.message); }; return; } else if (asBlob) { file.state = 'ready'; setTimeout(function () { var _a; return cb(null, file, (_a = {}, _a[nameField] = file.name, _a[valueField] = file, _a.state = 'ready', _a.id = file.id, _a)); }, 4); return; } var fn = (useChunk === 'auto' && chunkSize && file.size > chunkSize) || useChunk === true ? this.uploadBigFile : this.uploadFile; fn(file, receiver, {}, { fieldName: fileField, chunkSize: chunkSize, startChunkApi: startChunkApi, chunkApi: chunkApi, finishChunkApi: finishChunkApi, data: data }, onProgress) .then(function (ret) { if ((ret.status && ret.status !== '0') || !ret.data) { throw new Error(ret.msg || __('File.errorRetry')); } onProgress(1); var value = ret.data.value || ret.data.url || ret.data; cb(null, file, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, ((0, isPlainObject_1.default)(ret.data) ? ret.data : null)), { value: value, state: 'uploaded', id: file.id })); }) .catch(function (error) { cb(error.message || __('File.errorRetry'), file); }); }; FileControl.prototype.removeFile = function (file, index) { var files = this.state.files.concat(); this.removeFileCanelExecutor(file, true); files.splice(index, 1); var isUploading = this.current === file; if (isUploading) { this.current = null; } this.setState({ files: files }, isUploading ? this.tick : this.onChange); }; FileControl.prototype.clearError = function () { this.setState({ error: null }); }; FileControl.prototype.onChange = function (changeImmediately) { var _a = this.props, multiple = _a.multiple, onChange = _a.onChange, joinValues = _a.joinValues, extractValue = _a.extractValue, valueField = _a.valueField, delimiter = _a.delimiter, resetValue = _a.resetValue, asBlob = _a.asBlob, autoFill = _a.autoFill, onBulkChange = _a.onBulkChange; var files = this.state.files.filter(function (file) { return ~['uploaded', 'init', 'ready'].indexOf(file.state); }); var value = multiple ? files : files[0]; if (value) { if (extractValue || asBlob) { value = Array.isArray(value) ? value.map(function (item) { return item[valueField || 'value']; }) : value[valueField || 'value']; } else if (joinValues) { value = Array.isArray(value) ? value .map(function (item) { return item[valueField || 'value']; }) .join(delimiter || ',') : value[valueField || 'value']; } } else { value = typeof resetValue === 'undefined' ? '' : resetValue; } onChange((this.emitValue = value), undefined, changeImmediately); this.syncAutoFill(); }; FileControl.prototype.syncAutoFill = function () { var _a = this.props, autoFill = _a.autoFill, multiple = _a.multiple, onBulkChange = _a.onBulkChange, data = _a.data; if (!(0, helper_1.isEmpty)(autoFill) && onBulkChange) { var files = this.state.files.filter(function (file) { return ~['uploaded', 'init', 'ready'].indexOf(file.state); }); var toSync_1 = (0, tpl_builtin_1.dataMapping)(autoFill, multiple ? { items: files } : files[0]); Object.keys(toSync_1).forEach(function (key) { if ((0, isPlainObject_1.default)(toSync_1[key]) && (0, isPlainObject_1.default)(data[key])) { toSync_1[key] = (0, merge_1.default)({}, data[key], toSync_1[key]); } }); onBulkChange(toSync_1); } }; FileControl.prototype.uploadFile = function (file, receiver, params, config, onProgress) { if (config === void 0) { config = {}; } return (0, tslib_1.__awaiter)(this, void 0, Promise, function () { var fd, api; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: fd = new FormData(); api = (0, api_1.buildApi)(receiver, (0, helper_1.createObject)(config.data, params), { method: 'post' }); (0, helper_1.qsstringify)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, api.data), params)) .split('&') .filter(function (i) { return !!i; }) .forEach(function (item) { var parts = item.split('='); fd.append(parts[0], decodeURIComponent(parts[1])); }); // Note: File类型字段放在后面,可以支持第三方云存储鉴权 fd.append(config.fieldName || 'file', file); _a.label = 1; case 1: _a.trys.push([1, , 3, 4]); return [4 /*yield*/, this._send(file, api, fd, {}, onProgress)]; case 2: return [2 /*return*/, _a.sent()]; case 3: this.removeFileCanelExecutor(file); return [7 /*endfinally*/]; case 4: return [2 /*return*/]; } }); }); }; FileControl.prototype.uploadBigFile = function (file, receiver, params, config, onProgress) { if (config === void 0) { config = {}; } var chunkSize = config.chunkSize || 5 * 1024 * 1024; var self = this; var startProgress = 0.2; var endProgress = 0.9; var progressArr; var __ = this.props.translate; var nameField = this.props.nameField || 'name'; return new Promise(function (resolve, reject) { var _a; var state; var startApi = (0, api_1.buildApi)(config.startChunkApi, (0, helper_1.createObject)(config.data, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, params), (_a = { filename: file.name }, _a[nameField] = file.name, _a))), { method: 'post', autoAppend: true }); self._send(file, startApi).then(startChunk).catch(reject); function startChunk(ret) { onProgress(startProgress); var tasks = getTasks(file); progressArr = tasks.map(function () { return 0; }); if (!ret.data) { throw new Error(__('File.uploadFailed')); } state = { key: ret.data.key, uploadId: ret.data.uploadId, loaded: 0, total: tasks.length }; (0, mapLimit_1.default)(tasks, 3, uploadPartFile(state, config), function (err, results) { if (err) { reject(err); } else { finishChunk(results, state); } }); } function updateProgress(partNumber, progress) { progressArr[partNumber - 1] = progress; onProgress(startProgress + (endProgress - startProgress) * (progressArr.reduce(function (count, progress) { return count + progress; }, 0) / progressArr.length)); } function finishChunk(partList, state) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var endApi, ret, err_1; var _a; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: onProgress(endProgress); endApi = (0, api_1.buildApi)(config.finishChunkApi, (0, helper_1.createObject)(config.data, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, params), (_a = { uploadId: state.uploadId, key: state.key }, _a[nameField] = file.name, _a.filename = file.name, _a.partList = partList, _a))), { method: 'post', autoAppend: true }); _b.label = 1; case 1: _b.trys.push([1, 3, 4, 5]); return [4 /*yield*/, self._send(file, endApi)]; case 2: ret = _b.sent(); resolve(ret); return [3 /*break*/, 5]; case 3: err_1 = _b.sent(); reject(err_1); return [3 /*break*/, 5]; case 4: self.removeFileCanelExecutor(file); return [7 /*endfinally*/]; case 5: return [2 /*return*/]; } }); }); } function uploadPartFile(state, conf) { return function (task, callback) { var api = (0, api_1.buildApi)(conf.chunkApi, (0, helper_1.createObject)(config.data, params), { method: 'post' }); var fd = new FormData(); var blob = task.file.slice(task.start, task.stop + 1); (0, helper_1.qsstringify)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, api.data), params)) .split('&') .forEach(function (item) { var parts = item.split('='); fd.append(parts[0], decodeURIComponent(parts[1])); }); fd.append('key', state.key); fd.append('uploadId', state.uploadId); fd.append('partNumber', task.partNumber.toString()); fd.append('partSize', task.partSize.toString()); // Note: File类型字段放在后面,可以支持第三方云存储鉴权 fd.append(config.fieldName || 'file', blob, file.name); return self ._send(file, api, fd, {}, function (progress) { return updateProgress(task.partNumber, progress); }) .then(function (ret) { state.loaded++; callback(null, { partNumber: task.partNumber, eTag: ret.data.eTag }); }) .catch(callback); }; } function getTasks(file) { var leftSize = file.size; var offset = 0; var partNumber = 1; var tasks = []; while (leftSize > 0) { var partSize = Math.min(leftSize, chunkSize); tasks.push({ file: file, partNumber: partNumber, partSize: partSize, start: offset, stop: offset + partSize - 1 }); leftSize -= partSize; offset += partSize; partNumber += 1; } return tasks; } }); }; FileControl.prototype._send = function (file, api, data, options, onProgress) { var _this = this; var env = this.props.env; if (!env || !env.fetcher) { throw new Error('fetcher is required'); } return env.fetcher(api, data, (0, tslib_1.__assign)((0, tslib_1.__assign)({ method: 'post' }, options), { withCredentials: true, cancelExecutor: function (cancelExecutor) { // 记录取消器,取消的时候要调用 _this.fileUploadCancelExecutors.push({ file: file, executor: cancelExecutor }); }, onUploadProgress: onProgress ? function (event) { return onProgress(event.loaded / event.total); } : undefined })); }; FileControl.prototype.removeFileCanelExecutor = function (file, execute) { if (execute === void 0) { execute = false; } this.fileUploadCancelExecutors = this.fileUploadCancelExecutors.filter(function (item) { if (execute && item.file === file) { item.executor(); } return item.file !== file; }); }; FileControl.prototype.validate = function () { var _this = this; var __ = this.props.translate; if (this.state.uploading || this.state.files.some(function (item) { return item.state === 'pending'; })) { return new Promise(function (resolve) { _this.resolve = resolve; _this.startUpload(); }); } else if (this.state.files.some(function (item) { return item.state === 'error'; })) { return __('File.errorRetry'); } }; FileControl.prototype.render = function () { var _this = this; var _a = this.props, btnLabel = _a.btnLabel, accept = _a.accept, disabled = _a.disabled, maxLength = _a.maxLength, multiple = _a.multiple, autoUpload = _a.autoUpload, description = _a.description, descriptionClassName = _a.descriptionClassName, hideUploadButton = _a.hideUploadButton, className = _a.className, btnClassName = _a.btnClassName, btnUploadClassName = _a.btnUploadClassName, cx = _a.classnames, __ = _a.translate, render = _a.render, downloadUrl = _a.downloadUrl, templateUrl = _a.templateUrl; var _b = this.state, files = _b.files, uploading = _b.uploading, error = _b.error; var nameField = this.props.nameField || 'name'; var valueField = this.props.valueField || 'value'; var urlField = this.props.urlField || 'url'; var hasPending = files.some(function (file) { return file.state == 'pending'; }); var uploaded = 0; var failed = 0; this.state.uploading || this.state.files.forEach(function (item) { if (item.state === 'error') { failed++; } else if (item.state === 'uploaded') { uploaded++; } }); return (react_1.default.createElement("div", { className: cx('FileControl', className) }, templateUrl ? (react_1.default.createElement("a", { className: cx('FileControl-templateInfo'), onClick: this.downloadTpl.bind(this) }, react_1.default.createElement(icons_1.Icon, { icon: "download", className: "icon" }), react_1.default.createElement("span", null, __('File.downloadTpl')))) : null, react_1.default.createElement(react_dropzone_1.default, { disabled: disabled, key: "drop-zone", ref: this.dropzone, onDrop: this.handleDrop, onDropRejected: this.handleDropRejected, accept: accept === '*' ? '' : accept, multiple: multiple }, function (_a) { var getRootProps = _a.getRootProps, getInputProps = _a.getInputProps, isDragActive = _a.isDragActive; return (react_1.default.createElement("div", (0, tslib_1.__assign)({}, getRootProps({ onClick: preventEvent }), { className: cx('FileControl-dropzone', { disabled: disabled, 'is-empty': !files.length, 'is-active': isDragActive }) }), react_1.default.createElement("input", (0, tslib_1.__assign)({ disabled: disabled }, getInputProps())), isDragActive ? (react_1.default.createElement("div", { className: cx('FileControl-acceptTip') }, __('File.dragDrop'))) : (react_1.default.createElement(react_1.default.Fragment, null, (multiple && (!maxLength || files.length < maxLength)) || !multiple ? (react_1.default.createElement(Button_1.default, { level: "default", disabled: disabled, className: cx('FileControl-selectBtn', btnClassName), onClick: _this.handleSelect }, react_1.default.createElement(icons_1.Icon, { icon: "upload", className: "icon" }), react_1.default.createElement("span", null, !multiple && files.length ? __('File.repick') : multiple && files.length ? __('File.continueAdd') : btnLabel ? btnLabel : __('File.upload')))) : null, description ? render('desc', description, { className: cx('FileControl-description', descriptionClassName) }) : null, Array.isArray(files) ? (react_1.default.createElement("ul", { className: cx('FileControl-list') }, files.map(function (file, index) { return (react_1.default.createElement("li", { key: file.id }, react_1.default.createElement("div", { className: cx('FileControl-itemInfo', { 'is-invalid': file.state === 'invalid' || file.state === 'error' }) }, react_1.default.createElement(icons_1.Icon, { icon: "file", className: "icon" }), file[urlField] || file[valueField] || downloadUrl ? (react_1.default.createElement("a", { className: cx('FileControl-itemInfoText'), target: "_blank", rel: "noopener", href: "#", onClick: _this.handleClickFile.bind(_this, file) }, file[nameField] || file.filename)) : (react_1.default.createElement("span", { className: cx('FileControl-itemInfoText') }, file[nameField] || file.filename)), file.state === 'invalid' || file.state === 'error' ? (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(icons_1.Icon, { icon: "fail", className: "icon" }), react_1.default.createElement("span", { className: "text-danger" }, file.error || null))) : null, !disabled ? (react_1.default.createElement("a", { "data-tooltip": __('Select.clear'), className: cx('FileControl-clear'), onClick: function () { return _this.removeFile(file, index); } }, react_1.default.createElement(icons_1.Icon, { icon: "close", className: "icon" }))) : null), file.state === 'uploading' || file.state === 'uploaded' ? (react_1.default.createElement("div", { className: cx('FileControl-progressInfo') }, react_1.default.createElement("div", { className: cx('FileControl-progress') }, react_1.default.createElement("span", { style: { width: (file.state === 'uploaded' ? 100 : (file.progress || 0) * 100) + "%" } })), file.state === 'uploaded' ? (react_1.default.createElement(icons_1.Icon, { icon: "success", className: "icon" })) : (react_1.default.createElement("span", null, Math.round((file.progress || 0) * 100), "%")))) : null)); }))) : null)))); }), failed ? (react_1.default.createElement("div", { className: cx('FileControl-sum') }, __('File.result', { uploaded: uploaded, failed: failed }), react_1.default.createElement("a", { onClick: this.retry }, __('File.retry')), __('File.failed'))) : null, !autoUpload && !hideUploadButton && files.length ? (react_1.default.createElement(Button_1.default, { level: "default", disabled: !hasPending, className: cx('FileControl-uploadBtn', btnUploadClassName), onClick: this.toggleUpload }, __(uploading ? 'File.pause' : 'File.start'))) : null)); }; FileControl.defaultProps = { maxSize: 0, maxLength: 0, placeholder: '', receiver: '/api/upload/file', fileField: 'file', joinValues: true, extractValue: false, delimiter: ',', downloadUrl: '', templateUrl: '', useChunk: 'auto', chunkSize: 5 * 1024 * 1024, startChunkApi: '/api/upload/startChunk', chunkApi: '/api/upload/chunk', finishChunkApi: '/api/upload/finishChunk', accept: '', multiple: false, autoUpload: true, hideUploadButton: false, stateTextMap: { init: '', pending: '等待上传', uploading: '上传中', error: '上传出错', uploaded: '已上传', ready: '' }, asBase64: false }; return FileControl; }(react_1.default.Component)); exports.default = FileControl; var FileControlRenderer = /** @class */ (function (_super) { (0, tslib_1.__extends)(FileControlRenderer, _super); function FileControlRenderer() { return _super !== null && _super.apply(this, arguments) || this; } FileControlRenderer = (0, tslib_1.__decorate)([ (0, Item_1.FormItem)({ type: 'input-file', sizeMutable: false, renderDescription: false }) ], FileControlRenderer); return FileControlRenderer; }(FileControl)); exports.FileControlRenderer = FileControlRenderer; //# sourceMappingURL=./renderers/Form/InputFile.js.map