fixes mm-1318 only allow 5 files to be uploaded at a time
Этот коммит содержится в:
@@ -112,13 +112,28 @@ module.exports = React.createClass({
|
|||||||
return { messageText: '', uploadsInProgress: 0, previews: [], submitting: false };
|
return { messageText: '', uploadsInProgress: 0, previews: [], submitting: false };
|
||||||
},
|
},
|
||||||
setUploads: function(val) {
|
setUploads: function(val) {
|
||||||
var num = this.state.uploadsInProgress + val;
|
var oldInProgress = this.state.uploadsInProgress
|
||||||
this.setState({uploadsInProgress: num});
|
var newInProgress = oldInProgress + val;
|
||||||
|
|
||||||
|
if (newInProgress + this.state.previews.length > Constants.MAX_UPLOAD_FILES) {
|
||||||
|
newInProgress = Constants.MAX_UPLOAD_FILES - this.state.previews.length;
|
||||||
|
this.setState({limit_error: "Uploads limited to " + Constants.MAX_UPLOAD_FILES + " files maximum. Please use additional comments for more files."});
|
||||||
|
} else {
|
||||||
|
this.setState({limit_error: null});
|
||||||
|
}
|
||||||
|
|
||||||
|
var numToUpload = newInProgress - oldInProgress;
|
||||||
|
if (numToUpload <= 0) return 0;
|
||||||
|
|
||||||
|
this.setState({uploadsInProgress: newInProgress});
|
||||||
|
|
||||||
|
return numToUpload;
|
||||||
},
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
|
|
||||||
var server_error = this.state.server_error ? <div className='form-group has-error'><label className='control-label'>{ this.state.server_error }</label></div> : null;
|
var server_error = this.state.server_error ? <div className='form-group has-error'><label className='control-label'>{ this.state.server_error }</label></div> : null;
|
||||||
var post_error = this.state.post_error ? <label className='control-label'>{this.state.post_error}</label> : null;
|
var post_error = this.state.post_error ? <label className='control-label'>{this.state.post_error}</label> : null;
|
||||||
|
var limit_error = this.state.limit_error ? <div className='has-error'><label className='control-label'>{this.state.limit_error}</label></div> : null;
|
||||||
|
|
||||||
var preview = <div/>;
|
var preview = <div/>;
|
||||||
if (this.state.previews.length > 0 || this.state.uploadsInProgress > 0) {
|
if (this.state.previews.length > 0 || this.state.uploadsInProgress > 0) {
|
||||||
@@ -129,13 +144,6 @@ module.exports = React.createClass({
|
|||||||
uploadsInProgress={this.state.uploadsInProgress} />
|
uploadsInProgress={this.state.uploadsInProgress} />
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
var limit_previews = ""
|
|
||||||
if (this.state.previews.length > 5) {
|
|
||||||
limit_previews = <div className='has-error'><label className='control-label'>{ "Note: While all files will be available, only first five will show thumbnails." }</label></div>
|
|
||||||
}
|
|
||||||
if (this.state.previews.length > 20) {
|
|
||||||
limit_previews = <div className='has-error'><label className='control-label'>{ "Note: Uploads limited to 20 files maximum. Please use additional posts for more files." }</label></div>
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form onSubmit={this.handleSubmit}>
|
<form onSubmit={this.handleSubmit}>
|
||||||
@@ -159,7 +167,7 @@ module.exports = React.createClass({
|
|||||||
<input type="button" className="btn btn-primary comment-btn pull-right" value="Add Comment" onClick={this.handleSubmit} />
|
<input type="button" className="btn btn-primary comment-btn pull-right" value="Add Comment" onClick={this.handleSubmit} />
|
||||||
{ post_error }
|
{ post_error }
|
||||||
{ server_error }
|
{ server_error }
|
||||||
{ limit_previews }
|
{ limit_error }
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{ preview }
|
{ preview }
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ module.exports = React.createClass({
|
|||||||
false,
|
false,
|
||||||
function(data) {
|
function(data) {
|
||||||
PostStore.storeDraft(data.channel_id, user_id, null);
|
PostStore.storeDraft(data.channel_id, user_id, null);
|
||||||
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null });
|
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null, limit_error: null });
|
||||||
|
|
||||||
if (data.goto_location.length > 0) {
|
if (data.goto_location.length > 0) {
|
||||||
window.location.href = data.goto_location;
|
window.location.href = data.goto_location;
|
||||||
@@ -71,7 +71,7 @@ module.exports = React.createClass({
|
|||||||
client.createPost(post, ChannelStore.getCurrent(),
|
client.createPost(post, ChannelStore.getCurrent(),
|
||||||
function(data) {
|
function(data) {
|
||||||
PostStore.storeDraft(data.channel_id, data.user_id, null);
|
PostStore.storeDraft(data.channel_id, data.user_id, null);
|
||||||
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null });
|
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null, limit_error: null });
|
||||||
this.resizePostHolder();
|
this.resizePostHolder();
|
||||||
AsyncClient.getPosts(true);
|
AsyncClient.getPosts(true);
|
||||||
|
|
||||||
@@ -207,21 +207,36 @@ module.exports = React.createClass({
|
|||||||
return { channel_id: ChannelStore.getCurrentId(), messageText: messageText, uploadsInProgress: 0, previews: previews, submitting: false, initialText: messageText };
|
return { channel_id: ChannelStore.getCurrentId(), messageText: messageText, uploadsInProgress: 0, previews: previews, submitting: false, initialText: messageText };
|
||||||
},
|
},
|
||||||
setUploads: function(val) {
|
setUploads: function(val) {
|
||||||
var num = this.state.uploadsInProgress + val;
|
var oldInProgress = this.state.uploadsInProgress
|
||||||
|
var newInProgress = oldInProgress + val;
|
||||||
|
|
||||||
|
if (newInProgress + this.state.previews.length > Constants.MAX_UPLOAD_FILES) {
|
||||||
|
newInProgress = Constants.MAX_UPLOAD_FILES - this.state.previews.length;
|
||||||
|
this.setState({limit_error: "Uploads limited to " + Constants.MAX_UPLOAD_FILES + " files maximum. Please use additional posts for more files."});
|
||||||
|
} else {
|
||||||
|
this.setState({limit_error: null});
|
||||||
|
}
|
||||||
|
|
||||||
|
var numToUpload = newInProgress - oldInProgress;
|
||||||
|
if (numToUpload <= 0) return 0;
|
||||||
|
|
||||||
var draft = PostStore.getCurrentDraft();
|
var draft = PostStore.getCurrentDraft();
|
||||||
if (!draft) {
|
if (!draft) {
|
||||||
draft = {}
|
draft = {}
|
||||||
draft['message'] = '';
|
draft['message'] = '';
|
||||||
draft['previews'] = [];
|
draft['previews'] = [];
|
||||||
}
|
}
|
||||||
draft['uploadsInProgress'] = num;
|
draft['uploadsInProgress'] = newInProgress;
|
||||||
PostStore.storeCurrentDraft(draft);
|
PostStore.storeCurrentDraft(draft);
|
||||||
this.setState({uploadsInProgress: num});
|
this.setState({uploadsInProgress: newInProgress});
|
||||||
|
|
||||||
|
return numToUpload;
|
||||||
},
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
|
|
||||||
var server_error = this.state.server_error ? <div className='form-group has-error'><label className='control-label'>{ this.state.server_error }</label></div> : null;
|
var server_error = this.state.server_error ? <div className='form-group has-error'><label className='control-label'>{ this.state.server_error }</label></div> : null;
|
||||||
var post_error = this.state.post_error ? <label className='control-label'>{this.state.post_error}</label> : null;
|
var post_error = this.state.post_error ? <label className='control-label'>{this.state.post_error}</label> : null;
|
||||||
|
var limit_error = this.state.limit_error ? <div className='has-error'><label className='control-label'>{this.state.limit_error}</label></div> : null;
|
||||||
|
|
||||||
var preview = <div/>;
|
var preview = <div/>;
|
||||||
if (this.state.previews.length > 0 || this.state.uploadsInProgress > 0) {
|
if (this.state.previews.length > 0 || this.state.uploadsInProgress > 0) {
|
||||||
@@ -232,13 +247,6 @@ module.exports = React.createClass({
|
|||||||
uploadsInProgress={this.state.uploadsInProgress} />
|
uploadsInProgress={this.state.uploadsInProgress} />
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
var limit_previews = ""
|
|
||||||
if (this.state.previews.length > 5) {
|
|
||||||
limit_previews = <div className='has-error'><label className='control-label'>{ "Note: While all files will be available, only first five will show thumbnails." }</label></div>
|
|
||||||
}
|
|
||||||
if (this.state.previews.length > 20) {
|
|
||||||
limit_previews = <div className='has-error'><label className='control-label'>{ "Note: Uploads limited to 20 files maximum. Please use additional posts for more files." }</label></div>
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form id="create_post" ref="topDiv" role="form" onSubmit={this.handleSubmit}>
|
<form id="create_post" ref="topDiv" role="form" onSubmit={this.handleSubmit}>
|
||||||
@@ -260,7 +268,7 @@ module.exports = React.createClass({
|
|||||||
<div className={post_error ? 'post-create-footer has-error' : 'post-create-footer'}>
|
<div className={post_error ? 'post-create-footer has-error' : 'post-create-footer'}>
|
||||||
{ post_error }
|
{ post_error }
|
||||||
{ server_error }
|
{ server_error }
|
||||||
{ limit_previews }
|
{ limit_error }
|
||||||
{ preview }
|
{ preview }
|
||||||
<MsgTyping channelId={this.state.channel_id} parentId=""/>
|
<MsgTyping channelId={this.state.channel_id} parentId=""/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -12,18 +12,18 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
this.props.onUploadError(null);
|
this.props.onUploadError(null);
|
||||||
|
|
||||||
//This looks redundant, but must be done this way due to
|
// This looks redundant, but must be done this way due to
|
||||||
//setState being an asynchronous call
|
// setState being an asynchronous call
|
||||||
var numFiles = 0;
|
var numFiles = 0;
|
||||||
for(var i = 0; i < files.length && i <= 20 ; i++) {
|
for(var i = 0; i < files.length && i < Constants.MAX_UPLOAD_FILES; i++) {
|
||||||
if (files[i].size <= Constants.MAX_FILE_SIZE) {
|
if (files[i].size <= Constants.MAX_FILE_SIZE) {
|
||||||
numFiles++;
|
numFiles++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.setUploads(numFiles);
|
var numToUpload = this.props.setUploads(numFiles);
|
||||||
|
|
||||||
for (var i = 0; i < files.length && i <= 20; i++) {
|
for (var i = 0; i < files.length && i < numToUpload; i++) {
|
||||||
if (files[i].size > Constants.MAX_FILE_SIZE) {
|
if (files[i].size > Constants.MAX_FILE_SIZE) {
|
||||||
this.props.onUploadError("Files must be no more than " + Constants.MAX_FILE_SIZE/1000000 + " MB");
|
this.props.onUploadError("Files must be no more than " + Constants.MAX_FILE_SIZE/1000000 + " MB");
|
||||||
continue;
|
continue;
|
||||||
@@ -70,8 +70,8 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
self.props.onUploadError(null);
|
self.props.onUploadError(null);
|
||||||
|
|
||||||
//This looks redundant, but must be done this way due to
|
// This looks redundant, but must be done this way due to
|
||||||
//setState being an asynchronous call
|
// setState being an asynchronous call
|
||||||
var items = e.clipboardData.items;
|
var items = e.clipboardData.items;
|
||||||
var numItems = 0;
|
var numItems = 0;
|
||||||
if (items) {
|
if (items) {
|
||||||
@@ -87,9 +87,9 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.props.setUploads(numItems);
|
var numToUpload = self.props.setUploads(numItems);
|
||||||
|
|
||||||
for (var i = 0; i < items.length; i++) {
|
for (var i = 0; i < items.length && i < numToUpload; i++) {
|
||||||
if (items[i].type.indexOf("image") !== -1) {
|
if (items[i].type.indexOf("image") !== -1) {
|
||||||
var file = items[i].getAsFile();
|
var file = items[i].getAsFile();
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ module.exports = {
|
|||||||
PATCH_TYPES: ['patch'],
|
PATCH_TYPES: ['patch'],
|
||||||
ICON_FROM_TYPE: {'audio': 'audio', 'video': 'video', 'spreadsheet': 'ppt', 'pdf': 'pdf', 'code': 'code' , 'word': 'word' , 'excel': 'excel' , 'patch': 'patch', 'other': 'generic'},
|
ICON_FROM_TYPE: {'audio': 'audio', 'video': 'video', 'spreadsheet': 'ppt', 'pdf': 'pdf', 'code': 'code' , 'word': 'word' , 'excel': 'excel' , 'patch': 'patch', 'other': 'generic'},
|
||||||
MAX_DISPLAY_FILES: 5,
|
MAX_DISPLAY_FILES: 5,
|
||||||
|
MAX_UPLOAD_FILES: 5,
|
||||||
MAX_FILE_SIZE: 50000000, // 50 MB
|
MAX_FILE_SIZE: 50000000, // 50 MB
|
||||||
DEFAULT_CHANNEL: 'town-square',
|
DEFAULT_CHANNEL: 'town-square',
|
||||||
POST_CHUNK_SIZE: 60,
|
POST_CHUNK_SIZE: 60,
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user