react-zeanium-ui-ui
Version:
Zeanium UI Framework for React.js
126 lines (121 loc) • 3.81 kB
JavaScript
require('./Uploader.less');
var React = require('react');
var ReactDOM = require('react-dom');
module.exports = React.createClass({
displayName:'Uploader',
getDefaultProps: function () {
return {
placeholder: 'Choose File ...',
hiddens: {}
};
},
getInitialState: function () {
return {
uploading: false,
placeholder: this.props.placeholder,
hiddens: this.props.hiddens,
value: this.props.value,
files: []
}
},
componentDidMount:function(){
},
setHidden: function (key, value){
this.state.hiddens[key] = value;
this.setState({
hiddens: this.state.hiddens
});
},
__onIFrameLoad: function (event){
var _target = event.target,
_data = '';
if (_target.contentWindow) {
_data = _target.contentWindow.document.body ? _target.contentWindow.document.body.innerHTML : null;
} else if (_target.contentDocument) {
_data = _target.contentDocument.document.body ? _target.contentDocument.document.body.innerHTML : null;
}
var _search = _target.contentWindow.location.search;
_data = decodeURI(_search.split('?').pop());
/*
var _dom = document.createElement('div');
_dom.innerHTML = _data;
_data = _dom.innerText || _dom.textContent;
*/
var data = JSON.parse(_data)||{};
this.state.files.push(data.result.name);
this.setState({
placeholder: this.props.placeholder,
files: this.state.files,
uploading: false,
});
this.props.onChange && this.props.onChange(event, data, this);
return this.props.onUploaderChange && this.props.onUploaderChange(event, data, this);
},
__onInputChange: function (event){
var _value = event.nativeEvent.target.files[0].name;
this.setState({
placeholder: _value,
uploading: true,
});
var _dom = ReactDOM.findDOMNode(this);
_dom.submit();
_dom.reset();
},
__onDeleteFile: function (item, index){
this.state.files.splice(index, 1);
this.forceUpdate();
},
__inputRender: function (item, index) {
return <li key={index}>
<a className="input choose-file">
<i className="fa fa-file"></i>
<i className="cancle fa fa-times" onClick={()=>this.__onDeleteFile(item, index)} />
<span>{this.state.placeholder}</span>
<input className="input" type="file" name={this.props.name} onChange={this.__onInputChange} />
</a>
</li>;
},
__fileRender: function (item, index){
return <li key={index}>
{item}
<i className="cancle fa fa-times" onClick={()=>this.__onDeleteFile(item, index)} />
</li>;
},
__onInputClick: function (event){
this.props.onUploaderClick && this.props.onUploaderClick(event, this);
},
__onUploadCancle: function (){
},
render:function(){
this._items = [];
var _hiddens = this.state.hiddens||{};
_hiddens['FORWORD_URL'] = window.location.origin + '/_black.html';
return (
<form
className="c-uploader"
target="uploader-target"
encType="multipart/form-data"
action={Store.fixURL(this.props.action||'')}
method={this.props.method}
style={this.props.style}>
<iframe onLoad={this.__onIFrameLoad} className="uploader-target" name="uploader-target" />
<div className="input choose-file">
<i className={"icon fa fa-upload " + (this.state.uploading?'uploading':'')}></i>
{this.state.uploading && <i className="cancle fa fa-times" onClick={this.__onUploadCancle} />}
<span className="label">{this.state.placeholder}</span>
<input className="input" type="file" name={this.props.name} onChange={this.__onInputChange} onClick={this.__onInputClick} />
</div>
{
Object.keys(_hiddens).map(function (hidden, index){
return <input key={'hidden_' + index} type="hidden" name={hidden} value={_hiddens[hidden]} />;
})
}
<ul className="files">
{
this.state.files.map(this.__fileRender)
}
</ul>
</form>
);
}
});