UNPKG

zent

Version:

一套前端设计语言和基于React的实现

423 lines (358 loc) 12.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _button = require('../../button'); var _button2 = _interopRequireDefault(_button); var _input = require('../../input'); var _input2 = _interopRequireDefault(_input); var _notify = require('../../notify'); var _notify2 = _interopRequireDefault(_notify); var _isPromise = require('../../utils/isPromise'); var _isPromise2 = _interopRequireDefault(_isPromise); var _FileInput = require('./FileInput'); var _FileInput2 = _interopRequireDefault(_FileInput); var _UploadLocal = require('./UploadLocal'); var _UploadLocal2 = _interopRequireDefault(_UploadLocal); var _utils = require('../utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } /** * 上传图片弹框 */ var BUTTON_LOADING_TEXT = '提取中...'; var BUTTON_TEXT = '提取'; var ArrayForEach = Array.prototype.forEach; var arraySlice = Array.prototype.slice; var UploadPopup = function (_Component) { (0, _inherits3['default'])(UploadPopup, _Component); function UploadPopup(props) { (0, _classCallCheck3['default'])(this, UploadPopup); var _this = (0, _possibleConstructorReturn3['default'])(this, (UploadPopup.__proto__ || Object.getPrototypeOf(UploadPopup)).call(this, props)); _this.state = { networkImage: props.networkImage, networkUploading: props.networkUploading, localUploading: props.localUploading, buttonText: props.buttonText, localFiles: [] }; _this.networkUrl = ''; _this.confirmNetworkUrl = _this.confirmNetworkUrl.bind(_this); _this.networkUrlChanged = _this.networkUrlChanged.bind(_this); _this.processFiles = _this.processFiles.bind(_this); _this.uploadLocalImages = _this.uploadLocalImages.bind(_this); _this.fileProgressHandler = _this.fileProgressHandler.bind(_this); return _this; } /** * 网络图片渲染 */ (0, _createClass3['default'])(UploadPopup, [{ key: 'renderNetworkRegion', value: function renderNetworkRegion(props) { var prefix = props.prefix; var _state = this.state, networkImage = _state.networkImage, networkUploading = _state.networkUploading, buttonText = _state.buttonText; return _react2['default'].createElement( 'div', { className: prefix + '-network-image-region' }, _react2['default'].createElement( 'div', { className: prefix + '-title' }, '\u7F51\u7EDC\u56FE\u7247\uFF1A' ), _react2['default'].createElement( 'div', { className: prefix + '-content' }, _react2['default'].createElement( 'div', { className: prefix + '-input-append' }, _react2['default'].createElement(_input2['default'], { type: 'text', placeholder: '\u8BF7\u6DFB\u52A0\u7F51\u7EDC\u56FE\u7247\u5730\u5740', onChange: this.networkUrlChanged }) ), _react2['default'].createElement( _button2['default'], { type: 'primary', outline: true, loading: networkUploading, onClick: this.confirmNetworkUrl }, buttonText ), _react2['default'].createElement( 'div', { className: prefix + '-image-preview' }, _react2['default'].createElement('img', { src: networkImage.attachment_url, alt: '', role: 'presentation' }) ) ) ); } /** * 本地图片 */ }, { key: 'renderLocalImageRegion', value: function renderLocalImageRegion(props) { var _this2 = this; var prefix = props.prefix, accept = props.accept, options = props.options; var localFiles = this.state.localFiles; return _react2['default'].createElement( 'div', { className: prefix + '-local-image-region' }, _react2['default'].createElement( 'div', { className: prefix + '-title' }, '\u672C\u5730\u56FE\u7247\uFF1A' ), _react2['default'].createElement( 'div', { className: prefix + '-content' }, _react2['default'].createElement( 'div', null, _react2['default'].createElement( 'ul', { className: 'image-list upload-local-image-list ui-sortable' }, localFiles.map(function (item, index) { return _react2['default'].createElement( 'li', { key: index, className: 'upload-local-image-item' }, _react2['default'].createElement('div', { className: 'image-box', style: { backgroundImage: 'url(' + item.src + ')' } }), _react2['default'].createElement( 'span', { className: 'close-modal small', onClick: _this2.removeLocalImage.bind(_this2, item) }, '\xD7' ), item.progress ? _react2['default'].createElement( 'div', { className: 'image-progress' }, item.progress.toFixed(1) + '%' ) : '' ); }) ) ), !options.maxAmount || localFiles.length < options.maxAmount ? _react2['default'].createElement( 'div', { className: prefix + '-add-local-image-button pull-left' }, '+', _react2['default'].createElement(_FileInput2['default'], (0, _extends3['default'])({}, props.options, { onChange: this.processFiles })) ) : '', _react2['default'].createElement( 'div', { className: prefix + '-local-tips c-gray' }, '\u4EC5\u652F\u6301', accept.replace(/image\/?/g, '').replace(/, /g, '、'), '\u4E09\u79CD\u683C\u5F0F, \u5927\u5C0F\u4E0D\u8D85\u8FC7', (0, _utils.formatMaxSize)(options.maxSize) ) ) ); } }, { key: 'renderFooterRegion', value: function renderFooterRegion() { var _state2 = this.state, localUploading = _state2.localUploading, localFiles = _state2.localFiles; return _react2['default'].createElement( 'div', { className: 'text-center' }, _react2['default'].createElement( _button2['default'], { type: 'primary', size: 'large', disabled: localFiles.length === 0, loading: localUploading, onClick: this.uploadLocalImages }, '\u786E\u5B9A' ) ); } }, { key: 'removeLocalImage', value: function removeLocalImage(index) { var localFiles = this.state.localFiles; localFiles.splice(index, 1); this.setState({ localFiles: localFiles }); } }, { key: 'uploadLocalImages', value: function uploadLocalImages() { var _this3 = this; var _props = this.props, options = _props.options, showUploadPopup = _props.showUploadPopup; var localFiles = this.state.localFiles; this.setState({ localUploading: true }); (0, _UploadLocal2['default'])(options, { localFiles: localFiles, onProgress: this.fileProgressHandler }).then(function () { _this3.setState({ localFiles: [], localUploading: false }); showUploadPopup(false); })['catch'](function () { _this3.setState({ localUploading: false }); }); } }, { key: 'render', value: function render() { var _props2 = this.props, prefix = _props2.prefix, options = _props2.options, className = _props2.className; return _react2['default'].createElement( 'div', { className: className }, _react2['default'].createElement( 'div', { className: prefix + '-container' }, !options.localOnly && this.renderNetworkRegion(this.props), this.renderLocalImageRegion(this.props) ), this.renderFooterRegion() ); } }, { key: 'networkUrlChanged', value: function networkUrlChanged(evt) { this.networkUrl = evt.target.value; } }, { key: 'iteratorFiles', value: function iteratorFiles(files) { var _this4 = this; var options = this.props.options; var maxSize = options.maxSize, silent = options.silent, maxAmount = options.maxAmount; ArrayForEach.call(files, function (file, index) { if (maxAmount && index >= maxAmount) { !silent && _notify2['default'].error('\u5DF2\u7ECF\u81EA\u52A8\u8FC7\u6EE4\u8D85\u8FC7' + options.maxAmount + '\u5F20\u7684\u56FE\u7247\u6587\u4EF6'); return false; } if (!maxSize || file.size <= maxSize) { _this4.addFile(file); } else { !silent && _notify2['default'].error('\u5DF2\u7ECF\u81EA\u52A8\u8FC7\u6EE4\u5927\u4E8E' + (0, _utils.formatMaxSize)(maxSize) + '\u7684\u56FE\u7247\u6587\u4EF6'); } }); } }, { key: 'processFiles', value: function processFiles(evt) { var options = this.props.options; var files = arraySlice.call(evt.target.files); this.uploadFiles = files; var filterResult = options.filterFiles(files); if ((0, _isPromise2['default'])(filterResult)) { filterResult.then(this.iteratorFiles, options.onError); } else { files = filterResult; this.iteratorFiles(files); } } }, { key: 'fileProgressHandler', value: function fileProgressHandler(index, progress) { var localFiles = this.state.localFiles; localFiles[index].progress = progress; this.setState(localFiles); } }, { key: 'addFile', value: function addFile(file) { var _this5 = this; var fileReader = new FileReader(); var localFiles = this.state.localFiles; fileReader.onload = function (e) { localFiles.push({ src: e.target.result, file: file }); _this5.setState({ localFiles: localFiles }); }; fileReader.readAsDataURL(file); } /** * 提取网络图片 */ }, { key: 'confirmNetworkUrl', value: function confirmNetworkUrl() { var _this6 = this; var _props3 = this.props, options = _props3.options, showUploadPopup = _props3.showUploadPopup; if (!this.networkUrl) return false; this.setState({ networkUploading: true, buttonText: BUTTON_LOADING_TEXT }); options.onFetch(this.networkUrl).then(function () { _this6.setState({ networkImage: {}, networkUploading: false, buttonText: BUTTON_TEXT }); showUploadPopup(false); }, function () { !options.silent && _notify2['default'].error('提取失败,请确认图片地址是否正确'); _this6.setState({ networkUploading: false, buttonText: BUTTON_TEXT }); }); } }]); return UploadPopup; }(_react.Component); UploadPopup.defaultProps = { networkImage: {}, networkUploading: false, buttonText: BUTTON_TEXT, options: {}, className: '' }; exports['default'] = UploadPopup;