UNPKG

@6thquake/react-material

Version:

React components that implement Google's Material Design.

591 lines (511 loc) 16.4 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _Button = _interopRequireDefault(require("../Button")); var _withStyles = _interopRequireDefault(require("../styles/withStyles")); var _Chip = _interopRequireDefault(require("../Chip")); var _Paper = _interopRequireDefault(require("../Paper")); var _Cancel = _interopRequireDefault(require("@material-ui/icons/Cancel")); var _reactDnd = require("react-dnd"); var _reactDndHtml5Backend = _interopRequireWildcard(require("react-dnd-html5-backend")); var _TargetBox = _interopRequireDefault(require("./TargetBox")); var _isString = _interopRequireDefault(require("lodash/isString")); var styles = function styles(theme) { return { button: { margin: theme.spacing(1) }, input: { display: 'none' }, paper: { display: 'flex', justifyContent: 'center', flexWrap: 'wrap', borderRadius: '5px' }, chip: { margin: theme.spacing(0.5) }, wrap: { width: '160px', margin: '0 auto' }, choose: { display: 'inline-block' }, array: { display: 'flex', alignItems: 'center', justifyContent: 'center' }, inputImg: { opacity: '0', position: 'absolute', display: 'block', width: '140px', height: '140px' }, clickToUpload: { width: '144px', height: '110px', margin: '4px', border: '1px dashed #BDBDBD', backgroundColor: '#e0e0e0', textAlign: 'center', borderRadius: '16px', position: 'relative', display: 'inline-block' }, add: { fontSize: '30px', padding: '30px 0 0 0', color: '#616161' }, uploadText: { fontSize: '15px', color: '#000', padding: '10px 0 0 0' }, media: { height: '130px', width: '130px', position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%,-50%)', overflow: 'hidden', borderRadius: '5px', backgroundSize: 'cover', backgroundPosition: 'center' }, chipDrag: { height: '110px', margin: theme.spacing(0.5), padding: '0' }, dragToUpload: { minHeight: '300px', minWidth: '400px', border: '1px dashed #BDBDBD', backgroundColor: '#F5F5F5', textAlign: 'center', borderRadius: '5px', display: 'flex', flexWrap: 'wrap', justifyContent: 'center', alignItems: 'center' }, mediaDrag: { height: '100px', width: '100px', borderRadius: '10px', backgroundSize: 'cover', backgroundPosition: 'center' }, icon: { position: 'relative', top: '-40px' } }; }; var Upload = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(Upload, _Component); function Upload(props) { var _this; (0, _classCallCheck2.default)(this, Upload); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Upload).call(this, props)); _this.handleChangePath = function (e) { for (var i = 0; i < e.target.files.length; i += 1) { var file = e.target.files[i]; _this.pathHandler(file); } }; _this.handleDelete = function (e, item) { var _this$state = _this.state, data = _this$state.data, files = _this$state.files; var indexToDelete = files.indexOf(item); if (indexToDelete !== -1) { files.splice(indexToDelete, 1); } indexToDelete = data.indexOf(item); if (indexToDelete !== -1) { data.splice(indexToDelete, 1); } _this.setState({ files: files.slice(), data: data.slice() }); if (_this.props.onDelete) { _this.props.onDelete(item); // delete item.preview; } /* type='drag',防止点击删除时弹出input框 */ if (e) { e.preventDefault(); } }; _this.handleFileDrop = function (item, monitor) { if (monitor) { for (var i = 0; i < monitor.getItem().files.length; i++) { var file = monitor.getItem().files[i]; _this.pathHandler(file); } } }; _this.handleUpload = function () { var data = _this.state.data; return _this.props.upload(data); }; _this.state = { data: [], files: [] }; return _this; } (0, _createClass2.default)(Upload, [{ key: "componentDidMount", value: function componentDidMount() { var files = this.props.files; if (files) { for (var i = 0; i < files.length; i += 1) { var file = files[i]; this.pathHandler(file); } } } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps, prevState) { var onChange = this.props.onChange; if (prevState.data !== this.state.data) { onChange(this.state.data); } } /* 通过点击input标签添加图片 */ }, { key: "pathHandler", value: function pathHandler(file) { if (!file) { return; } if ((0, _isString.default)(file)) { file = { name: file, url: file }; } var multiple = this.props.multiple; if (this.state.files.indexOf(file) > -1) { return; } if (!multiple) { var files = this.state.files; if (files.length > 0) { for (var i = 0; i < files.length; i++) { this.handleDelete(null, files[i]); } } } if (file instanceof File) { this.setState(function (preState) { return { data: multiple ? [].concat((0, _toConsumableArray2.default)(preState.data), [file]) : [file] }; }); } if (/^image\/\S+$/.test(file.type)) { file.preview = _react.default.createElement('img', { src: URL.createObjectURL(file), height: '100%', width: '100%', onLoad: function onLoad(e) { URL.revokeObjectURL(e.target.src); } }); this.setState(function (preState) { return { files: multiple ? [].concat((0, _toConsumableArray2.default)(preState.files), [file]) : [file] }; }); } else { if (!(file instanceof File)) { var url = file.url || file.name; if (/blob|http(s)?:\/\//.test(url)) { file.preview = _react.default.createElement('img', { src: url, height: '100%', width: '100%' }); } } this.setState(function (preState) { return { files: multiple ? [].concat((0, _toConsumableArray2.default)(preState.files), [file]) : [file] }; }); } } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, classes = _this$props.classes, type = _this$props.type, multiple = _this$props.multiple, disabled = _this$props.disabled, label = _this$props.label; var FILE = _reactDndHtml5Backend.NativeTypes.FILE; var files = this.state.files; var manual; var basic; var img; var drag; var id = "RM-UPLOAD-".concat(new Date().getTime()); if (type === 'manual') { manual = _react.default.createElement("div", null, _react.default.createElement("div", { className: classes.wrap }, _react.default.createElement("input", { accept: this.props.acceptType, ref: function ref(input) { return _this2.selectInput = input; }, className: classes.input, id: id, onChange: this.handleChangePath, type: "file", multiple: multiple, disabled: disabled }), _react.default.createElement("label", { htmlFor: id }, this.props.children)), _react.default.createElement(_Paper.default, { className: classes.paper }, files.map(function (item) { return _react.default.createElement(_Chip.default, { key: item, label: item.name, onDelete: function onDelete(e) { return _this2.handleDelete(e, item); }, className: classes.chip, disabled: disabled }); })), _react.default.createElement("div", { className: classes.wrap }, _react.default.createElement(_Button.default, { color: "primary", variant: "contained", className: classes.button, onClick: this.handleUpload, disabled: disabled }, label))); } if (type === 'basic') { basic = _react.default.createElement("div", null, _react.default.createElement("div", { className: classes.choose }, _react.default.createElement("input", { accept: this.props.acceptType, ref: function ref(input) { return _this2.selectInput = input; }, className: classes.input, id: id, onChange: this.handleChangePath, type: "file", multiple: multiple, disabled: disabled }), _react.default.createElement("label", { htmlFor: id }, this.props.children)), _react.default.createElement("div", { className: classes.array }, files.map(function (item) { return _react.default.createElement(_Chip.default, { key: item, label: item.name, onDelete: function onDelete(e) { return _this2.handleDelete(e, item); }, className: classes.chip, disabled: disabled }); }))); } if (type === 'img') { img = _react.default.createElement("div", null, _react.default.createElement("input", { accept: "image/*", id: id, ref: function ref(input) { return _this2.selectInput = input; }, onChange: this.handleChangePath, type: "file", className: classes.inputImg, multiple: multiple, disabled: disabled }), _react.default.createElement("label", { htmlFor: id }, _react.default.createElement("div", { className: classes.array }, files.map(function (item) { var preview = _react.default.createElement("div", { className: classes.mediaDrag // style={{ backgroundImage: 'url(' + content + ')' }} }, item.preview || item.name); return _react.default.createElement("div", { className: classes.array }, _react.default.createElement(_Chip.default, { key: item, label: preview, onDelete: function onDelete(e) { return _this2.handleDelete(e, item); }, className: classes.chipDrag, deleteIcon: _react.default.createElement(_Cancel.default, { className: classes.icon }), disabled: disabled })); }), (multiple || this.state.files.length <= 0) && _react.default.createElement("div", { className: classes.clickToUpload }, _react.default.createElement("div", { className: classes.add }, "+"), _react.default.createElement("div", { className: classes.uploadText }, label), _react.default.createElement("div", { className: classes.media // style={{ backgroundImage: 'url(' + this.state.previewImg + ')' }} }))))); } if (type === 'drag') { drag = _react.default.createElement("div", null, _react.default.createElement(_TargetBox.default, { accepts: [FILE], onDrop: this.handleFileDrop, beforeDragMention: this.props.beforeDragMention, onDragMention: this.props.onDragMention }, _react.default.createElement("input", { accept: this.props.acceptType, ref: function ref(input) { return _this2.selectInput = input; }, className: classes.input, id: id, onChange: this.handleChangePath, type: "file", multiple: multiple, disabled: disabled }), _react.default.createElement("label", { htmlFor: id }, _react.default.createElement("div", { className: classes.dragToUpload }, _react.default.createElement("div", { className: classes.array }, files.map(function (item) { /* 如果是图片就预览,否则显示文件名 */ var preview = _react.default.createElement("div", { className: classes.mediaDrag // style={{ backgroundImage: 'url(' + content + ')' }} }, item.preview || item.name); return _react.default.createElement(_Chip.default, { key: item, label: preview, onDelete: function onDelete(e) { return _this2.handleDelete(e, item); }, className: classes.chipDrag, deleteIcon: _react.default.createElement(_Cancel.default, { className: classes.icon }), disabled: disabled }); })))))); } switch (type) { case 'manual': return manual; case 'basic': return basic; case 'img': return img; case 'drag': return drag; default: return _react.default.createElement("div", null, "type is not correct"); } } }]); return Upload; }(_react.Component); Upload.propTypes = { /** * 接受上传的文件类型 */ acceptType: _propTypes.default.string, /** * 可选参数, 拖拽上传前的文字提示 */ beforeDragMention: _propTypes.default.string, /** * 可选参数, 是否禁用 */ disabled: _propTypes.default.bool, /** * 可选参数, 组件包含的所有文件 */ files: _propTypes.default.array, /** * 按钮描述文字 */ label: _propTypes.default.string, /** * 可选参数, 是否允许同时上传多个文件 */ multiple: _propTypes.default.bool, /** * 上传文件集改变时触发的回调函数 */ onChange: _propTypes.default.func, /** * 点击删除某个文件时触发的回调函数 */ onDelete: _propTypes.default.func, /** * 可选参数, 拖拽文件至可拖拽区域上方时的文字提示 */ onDragMention: _propTypes.default.string, /** * 上传方式, 'manual', 'basic', 'img', 'drag'可选 */ type: _propTypes.default.oneOf(['manual', 'basic', 'img', 'drag']).isRequired, /** * 点击上传触发的函数 */ upload: _propTypes.default.func }; Upload.defaultProps = { acceptType: '*/*', multiple: true, disabled: false, beforeDragMention: '', onDragMention: '', files: [], onChange: function onChange(files) {}, onDelete: function onDelete(file) {}, upload: function upload(files) {}, label: 'upload' }; var _default = (0, _withStyles.default)(styles, { name: 'RMUpload' })((0, _reactDnd.DragDropContext)(_reactDndHtml5Backend.default)(Upload)); exports.default = _default;