UNPKG

antd

Version:

An enterprise-class UI design language and React-based implementation

342 lines (299 loc) 11.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = undefined; var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); exports.Dragger = Dragger; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _rcUpload = require('rc-upload'); var _rcUpload2 = _interopRequireDefault(_rcUpload); var _uploadList = require('./uploadList'); var _uploadList2 = _interopRequireDefault(_uploadList); var _getFileItem = require('./getFileItem'); var _getFileItem2 = _interopRequireDefault(_getFileItem); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _objectAssign = require('object-assign'); var _objectAssign2 = _interopRequireDefault(_objectAssign); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function T() { return true; } // Fix IE file.status problem // via coping a new Object function fileToObject(file) { return { lastModified: file.lastModified, lastModifiedDate: file.lastModifiedDate, name: file.filename || file.name, size: file.size, type: file.type, uid: file.uid, response: file.response, error: file.error, percent: 0, originFileObj: file, status: null }; } /** * 生成Progress percent: 0.1 -> 0.98 * - for ie */ function genPercentAdd() { var k = 0.1; var i = 0.01; var end = 0.98; return function (s) { var start = s; if (start >= end) { return start; } start += k; k = k - i; if (k < 0.001) { k = 0.001; } return start * 100; }; } function Dragger(props) { return _react2["default"].createElement(Upload, (0, _extends3["default"])({}, props, { type: 'drag', style: { height: props.height } })); } var Upload = function (_React$Component) { (0, _inherits3["default"])(Upload, _React$Component); function Upload(props) { (0, _classCallCheck3["default"])(this, Upload); var _this = (0, _possibleConstructorReturn3["default"])(this, _React$Component.call(this, props)); _this.onStart = function (file) { var targetItem = void 0; var nextFileList = _this.state.fileList.concat(); if (file.length > 0) { targetItem = file.map(function (f) { var fileObject = fileToObject(f); fileObject.status = 'uploading'; return fileObject; }); nextFileList = nextFileList.concat(targetItem); } else { targetItem = fileToObject(file); targetItem.status = 'uploading'; nextFileList.push(targetItem); } _this.onChange({ file: targetItem, fileList: nextFileList }); // fix ie progress if (!window.FormData) { _this.autoUpdateProgress(0, targetItem); } }; _this.onSuccess = function (response, file) { _this.clearProgressTimer(); try { if (typeof response === 'string') { response = JSON.parse(response); } } catch (e) {} var fileList = _this.state.fileList; var targetItem = (0, _getFileItem2["default"])(file, fileList); // removed if (!targetItem) { return; } targetItem.status = 'done'; targetItem.response = response; _this.onChange({ file: targetItem, fileList: fileList }); }; _this.onProgress = function (e, file) { var fileList = _this.state.fileList; var targetItem = (0, _getFileItem2["default"])(file, fileList); // removed if (!targetItem) { return; } targetItem.percent = e.percent; _this.onChange({ event: e, file: targetItem, fileList: _this.state.fileList }); }; _this.onError = function (error, response, file) { _this.clearProgressTimer(); var fileList = _this.state.fileList; var targetItem = (0, _getFileItem2["default"])(file, fileList); // removed if (!targetItem) { return; } targetItem.error = error; targetItem.response = response; targetItem.status = 'error'; _this.handleRemove(targetItem); }; _this.handleManualRemove = function (file) { _this.refs.upload.abort(file); file.status = 'removed'; // eslint-disable-line _this.handleRemove(file); }; _this.onChange = function (info) { if (!('fileList' in _this.props)) { _this.setState({ fileList: info.fileList }); } var onChange = _this.props.onChange; if (onChange) { onChange(info); } }; _this.onFileDrop = function (e) { _this.setState({ dragState: e.type }); }; _this.state = { fileList: _this.props.fileList || _this.props.defaultFileList || [], dragState: 'drop' }; return _this; } Upload.prototype.autoUpdateProgress = function autoUpdateProgress(_, file) { var _this2 = this; var getPercent = genPercentAdd(); var curPercent = 0; this.progressTimer = setInterval(function () { curPercent = getPercent(curPercent); _this2.onProgress({ percent: curPercent }, file); }, 200); }; Upload.prototype.removeFile = function removeFile(file) { var fileList = this.state.fileList; var targetItem = (0, _getFileItem2["default"])(file, fileList); var index = fileList.indexOf(targetItem); if (index !== -1) { fileList.splice(index, 1); return fileList; } return null; }; Upload.prototype.handleRemove = function handleRemove(file) { var onRemove = this.props.onRemove; if (onRemove) { onRemove(file); } var fileList = this.removeFile(file); if (fileList) { this.onChange({ file: file, fileList: fileList }); } }; Upload.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { if ('fileList' in nextProps) { this.setState({ fileList: nextProps.fileList || [] }); } }; Upload.prototype.clearProgressTimer = function clearProgressTimer() { clearInterval(this.progressTimer); }; Upload.prototype.render = function render() { var _classNames2; var _props = this.props, _props$prefixCls = _props.prefixCls, prefixCls = _props$prefixCls === undefined ? 'ant-upload' : _props$prefixCls, showUploadList = _props.showUploadList, listType = _props.listType, onPreview = _props.onPreview, type = _props.type, disabled = _props.disabled, children = _props.children, className = _props.className; var rcUploadProps = (0, _objectAssign2["default"])({}, this.props, { onStart: this.onStart, onError: this.onError, onProgress: this.onProgress, onSuccess: this.onSuccess }); delete rcUploadProps.className; var uploadList = showUploadList ? _react2["default"].createElement(_uploadList2["default"], { listType: listType, items: this.state.fileList, onPreview: onPreview, onRemove: this.handleManualRemove }) : null; if (type === 'drag') { var _classNames; var dragCls = (0, _classnames2["default"])((_classNames = {}, (0, _defineProperty3["default"])(_classNames, prefixCls, true), (0, _defineProperty3["default"])(_classNames, prefixCls + '-drag', true), (0, _defineProperty3["default"])(_classNames, prefixCls + '-drag-uploading', this.state.fileList.some(function (file) { return file.status === 'uploading'; })), (0, _defineProperty3["default"])(_classNames, prefixCls + '-drag-hover', this.state.dragState === 'dragover'), (0, _defineProperty3["default"])(_classNames, prefixCls + '-disabled', disabled), _classNames)); return _react2["default"].createElement( 'span', { className: className }, _react2["default"].createElement( 'div', { className: dragCls, onDrop: this.onFileDrop, onDragOver: this.onFileDrop, onDragLeave: this.onFileDrop }, _react2["default"].createElement( _rcUpload2["default"], (0, _extends3["default"])({}, rcUploadProps, { ref: 'upload', className: prefixCls + '-btn' }), _react2["default"].createElement( 'div', { className: prefixCls + '-drag-container' }, children ) ) ), uploadList ); } var uploadButtonCls = (0, _classnames2["default"])((_classNames2 = {}, (0, _defineProperty3["default"])(_classNames2, prefixCls, true), (0, _defineProperty3["default"])(_classNames2, prefixCls + '-select', true), (0, _defineProperty3["default"])(_classNames2, prefixCls + '-select-' + listType, true), (0, _defineProperty3["default"])(_classNames2, prefixCls + '-disabled', disabled), _classNames2)); var uploadButton = children ? _react2["default"].createElement( 'div', { className: uploadButtonCls }, _react2["default"].createElement(_rcUpload2["default"], (0, _extends3["default"])({}, rcUploadProps, { ref: 'upload' })) ) : null; if (listType === 'picture-card') { return _react2["default"].createElement( 'span', { className: className }, uploadList, uploadButton ); } return _react2["default"].createElement( 'span', { className: className }, uploadButton, uploadList ); }; return Upload; }(_react2["default"].Component); exports["default"] = Upload; Upload.Dragger = Dragger; Upload.defaultProps = { type: 'select', multiple: false, action: '', data: {}, accept: '', beforeUpload: T, showUploadList: true, listType: 'text', className: '', disabled: false };