mirror of
https://github.com/ascribe/onion.git
synced 2024-12-22 17:33:14 +01:00
Componentize the action available for selected prizes
This commit is contained in:
parent
311d03d09c
commit
8ff747e117
@ -0,0 +1,69 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import Moment from 'moment';
|
||||||
|
|
||||||
|
import ModalWrapper from '../../../../../ascribe_modal/modal_wrapper';
|
||||||
|
|
||||||
|
import LoanForm from '../../../../../ascribe_forms/form_loan';
|
||||||
|
|
||||||
|
import GlobalNotificationModel from '../../../../../../models/global_notification_model';
|
||||||
|
import GlobalNotificationActions from '../../../../../../actions/global_notification_actions';
|
||||||
|
|
||||||
|
import ApiUrls from '../../../../../../constants/api_urls';
|
||||||
|
|
||||||
|
import { getLangText } from '../../../../../../utils/lang_utils';
|
||||||
|
|
||||||
|
const SelectedPrizeLoanRequestButton = React.createClass({
|
||||||
|
propTypes: {
|
||||||
|
piece: React.PropTypes.object,
|
||||||
|
currentUser: React.PropTypes.object,
|
||||||
|
startLoanDate: React.PropTypes.object,
|
||||||
|
endLoanDate: React.PropTypes.object,
|
||||||
|
className: React.PropTypes.string,
|
||||||
|
handleSuccess: React.PropTypes.func
|
||||||
|
},
|
||||||
|
|
||||||
|
handleSuccess(res) {
|
||||||
|
const notification = new GlobalNotificationModel(res && res.notification || getLangText('You have successfully requested the loan, pending their confirmation.'), 'success', 4000);
|
||||||
|
GlobalNotificationActions.appendGlobalNotification(notification);
|
||||||
|
|
||||||
|
if (typeof this.props.handleSuccess === 'function') {
|
||||||
|
this.props.handleSuccess(res);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { currentUser, piece } = this.props;
|
||||||
|
|
||||||
|
// Can't use default props since those are only created once
|
||||||
|
const startLoanDate = this.props.startLoanDate || new Moment();
|
||||||
|
const endLoanDate = this.props.endLoanDate || (new Moment()).add(6, 'months');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalWrapper
|
||||||
|
trigger={
|
||||||
|
<button className='btn btn-default btn-sm'>
|
||||||
|
{getLangText('SEND LOAN REQUEST')}
|
||||||
|
</button>
|
||||||
|
}
|
||||||
|
handleSuccess={this.handleSuccess}
|
||||||
|
title={getLangText('REQUEST LOAN')}>
|
||||||
|
<LoanForm
|
||||||
|
loanHeading={null}
|
||||||
|
message={getLangText('Congratulations,\nYou have been selected for the prize.\n' +
|
||||||
|
'Please accept the loan request to proceed.')}
|
||||||
|
id={{ piece_id: piece.id }}
|
||||||
|
url={ApiUrls.ownership_loans_pieces_request}
|
||||||
|
email={currentUser.email}
|
||||||
|
gallery={piece.prize.name}
|
||||||
|
startDate={startLoanDate}
|
||||||
|
endDate={endLoanDate}
|
||||||
|
showPersonalMessage={true}
|
||||||
|
showPassword={false} />
|
||||||
|
</ModalWrapper>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default SelectedPrizeLoanRequestButton;
|
@ -6,6 +6,8 @@ import Moment from 'moment';
|
|||||||
|
|
||||||
import StarRating from 'react-star-rating';
|
import StarRating from 'react-star-rating';
|
||||||
|
|
||||||
|
import SelectedPrizeLoanRequestButton from '../ascribe_buttons/selected_prize_loan_request_button';
|
||||||
|
|
||||||
import ReactError from '../../../../../../mixins/react_error';
|
import ReactError from '../../../../../../mixins/react_error';
|
||||||
import { ResourceNotFoundError } from '../../../../../../models/errors';
|
import { ResourceNotFoundError } from '../../../../../../models/errors';
|
||||||
|
|
||||||
@ -34,9 +36,7 @@ import CollapsibleParagraph from '../../../../../../components/ascribe_collapsib
|
|||||||
import FurtherDetailsFileuploader from '../../../../../ascribe_detail/further_details_fileuploader';
|
import FurtherDetailsFileuploader from '../../../../../ascribe_detail/further_details_fileuploader';
|
||||||
|
|
||||||
import InputCheckbox from '../../../../../ascribe_forms/input_checkbox';
|
import InputCheckbox from '../../../../../ascribe_forms/input_checkbox';
|
||||||
import LoanForm from '../../../../../ascribe_forms/form_loan';
|
|
||||||
import ListRequestActions from '../../../../../ascribe_forms/list_form_request_actions';
|
import ListRequestActions from '../../../../../ascribe_forms/list_form_request_actions';
|
||||||
import ModalWrapper from '../../../../../ascribe_modal/modal_wrapper';
|
|
||||||
|
|
||||||
import GlobalNotificationModel from '../../../../../../models/global_notification_model';
|
import GlobalNotificationModel from '../../../../../../models/global_notification_model';
|
||||||
import GlobalNotificationActions from '../../../../../../actions/global_notification_actions';
|
import GlobalNotificationActions from '../../../../../../actions/global_notification_actions';
|
||||||
@ -52,13 +52,20 @@ import { setDocumentTitle } from '../../../../../../utils/dom_utils';
|
|||||||
/**
|
/**
|
||||||
* This is the component that implements resource/data specific functionality
|
* This is the component that implements resource/data specific functionality
|
||||||
*/
|
*/
|
||||||
let PieceContainer = React.createClass({
|
let PrizePieceContainer = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
params: React.PropTypes.object
|
params: React.PropTypes.object,
|
||||||
|
selectedPrizeActionButton: React.PropTypes.func
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [ReactError],
|
mixins: [ReactError],
|
||||||
|
|
||||||
|
getDefaultProps() {
|
||||||
|
return {
|
||||||
|
selectedPrizeActionButton: SelectedPrizeLoanRequestButton
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
getInitialState() {
|
getInitialState() {
|
||||||
return mergeOptions(
|
return mergeOptions(
|
||||||
PieceStore.getState(),
|
PieceStore.getState(),
|
||||||
@ -124,6 +131,7 @@ let PieceContainer = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
const { selectedPrizeActionButton } = this.props;
|
||||||
const { currentUser, piece } = this.state;
|
const { currentUser, piece } = this.state;
|
||||||
|
|
||||||
if (piece && piece.id) {
|
if (piece && piece.id) {
|
||||||
@ -170,7 +178,8 @@ let PieceContainer = React.createClass({
|
|||||||
<PrizePieceRatings
|
<PrizePieceRatings
|
||||||
loadPiece={this.loadPiece}
|
loadPiece={this.loadPiece}
|
||||||
piece={piece}
|
piece={piece}
|
||||||
currentUser={currentUser}/>
|
currentUser={currentUser}
|
||||||
|
selectedPrizeActionButton={selectedPrizeActionButton} />
|
||||||
}>
|
}>
|
||||||
<PrizePieceDetails piece={piece} />
|
<PrizePieceDetails piece={piece} />
|
||||||
</Piece>
|
</Piece>
|
||||||
@ -226,7 +235,8 @@ let PrizePieceRatings = React.createClass({
|
|||||||
propTypes: {
|
propTypes: {
|
||||||
loadPiece: React.PropTypes.func,
|
loadPiece: React.PropTypes.func,
|
||||||
piece: React.PropTypes.object,
|
piece: React.PropTypes.object,
|
||||||
currentUser: React.PropTypes.object
|
currentUser: React.PropTypes.object,
|
||||||
|
selectedPrizeActionButton: React.PropTypes.func
|
||||||
},
|
},
|
||||||
|
|
||||||
getInitialState() {
|
getInitialState() {
|
||||||
@ -271,48 +281,23 @@ let PrizePieceRatings = React.createClass({
|
|||||||
|
|
||||||
onRatingClick(event, args) {
|
onRatingClick(event, args) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
PrizeRatingActions.createRating(this.props.piece.id, args.rating).then(
|
PrizeRatingActions
|
||||||
this.refreshPieceData()
|
.createRating(this.props.piece.id, args.rating)
|
||||||
);
|
.then(this.refreshPieceData);
|
||||||
},
|
},
|
||||||
|
|
||||||
handleLoanRequestSuccess(message){
|
getSelectedActionButton() {
|
||||||
let notification = new GlobalNotificationModel(message, 'success', 4000);
|
const { currentUser, piece, selectedPrizeActionButton: SelectedPrizeActionButton } = this.props;
|
||||||
GlobalNotificationActions.appendGlobalNotification(notification);
|
|
||||||
},
|
|
||||||
|
|
||||||
getLoanButton(){
|
if (piece.selected && SelectedPrizeActionButton) {
|
||||||
let today = new Moment();
|
return (
|
||||||
let endDate = new Moment();
|
<span className="pull-right">
|
||||||
endDate.add(6, 'months');
|
<SelectedPrizeActionButton
|
||||||
return (
|
piece={piece}
|
||||||
<ModalWrapper
|
currentUser={currentUser} />
|
||||||
trigger={
|
</span>
|
||||||
<button className='btn btn-default btn-sm'>
|
);
|
||||||
{getLangText('SEND LOAN REQUEST')}
|
}
|
||||||
</button>
|
|
||||||
}
|
|
||||||
handleSuccess={this.handleLoanRequestSuccess}
|
|
||||||
title='REQUEST LOAN'>
|
|
||||||
<LoanForm
|
|
||||||
loanHeading={null}
|
|
||||||
message={getLangText('Congratulations,\nYou have been selected for the prize.\n' +
|
|
||||||
'Please accept the loan request to proceed.')}
|
|
||||||
id={{piece_id: this.props.piece.id}}
|
|
||||||
url={ApiUrls.ownership_loans_pieces_request}
|
|
||||||
email={this.props.currentUser.email}
|
|
||||||
gallery={this.props.piece.prize.name}
|
|
||||||
startDate={today}
|
|
||||||
endDate={endDate}
|
|
||||||
showPersonalMessage={true}
|
|
||||||
showPassword={false}
|
|
||||||
handleSuccess={this.handleLoanSuccess} />
|
|
||||||
</ModalWrapper>);
|
|
||||||
},
|
|
||||||
|
|
||||||
handleShortlistSuccess(message){
|
|
||||||
let notification = new GlobalNotificationModel(message, 'success', 2000);
|
|
||||||
GlobalNotificationActions.appendGlobalNotification(notification);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
refreshPieceData() {
|
refreshPieceData() {
|
||||||
@ -322,17 +307,16 @@ let PrizePieceRatings = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onSelectChange() {
|
onSelectChange() {
|
||||||
PrizeRatingActions.toggleShortlist(this.props.piece.id)
|
PrizeRatingActions
|
||||||
.then(
|
.toggleShortlist(this.props.piece.id)
|
||||||
(res) => {
|
.then((res) => {
|
||||||
this.refreshPieceData();
|
this.refreshPieceData();
|
||||||
return res;
|
|
||||||
})
|
if (res && res.notification) {
|
||||||
.then(
|
const notification = new GlobalNotificationModel(res.notification, 'success', 2000);
|
||||||
(res) => {
|
GlobalNotificationActions.appendGlobalNotification(notification);
|
||||||
this.handleShortlistSuccess(res.notification);
|
}
|
||||||
}
|
});
|
||||||
);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
render(){
|
render(){
|
||||||
@ -353,9 +337,7 @@ let PrizePieceRatings = React.createClass({
|
|||||||
</span>
|
</span>
|
||||||
</InputCheckbox>
|
</InputCheckbox>
|
||||||
</span>
|
</span>
|
||||||
<span className="pull-right">
|
{this.getSelectedActionButton()}
|
||||||
{this.props.piece.selected ? this.getLoanButton() : null}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
</CollapsibleParagraph>
|
</CollapsibleParagraph>
|
||||||
@ -374,13 +356,19 @@ let PrizePieceRatings = React.createClass({
|
|||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
{this.state.ratings.map((item, i) => {
|
{this.state.ratings.map((item, i) => {
|
||||||
let note = item.note ?
|
let note = item.note ? (
|
||||||
<div className="rating-note">
|
<div className="rating-note">
|
||||||
note: {item.note}
|
note: {item.note}
|
||||||
</div> : null;
|
</div>
|
||||||
|
) : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="rating-list">
|
<div
|
||||||
<div id="list-rating" className="row no-margin">
|
key={item.user}
|
||||||
|
className="rating-list">
|
||||||
|
<div
|
||||||
|
id="list-rating"
|
||||||
|
className="row no-margin">
|
||||||
<span className="pull-right">
|
<span className="pull-right">
|
||||||
<StarRating
|
<StarRating
|
||||||
ref={'rating' + i}
|
ref={'rating' + i}
|
||||||
@ -458,6 +446,7 @@ let PrizePieceDetails = React.createClass({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Property
|
<Property
|
||||||
|
key={label}
|
||||||
name={data}
|
name={data}
|
||||||
label={label}
|
label={label}
|
||||||
editable={false}
|
editable={false}
|
||||||
@ -485,4 +474,4 @@ let PrizePieceDetails = React.createClass({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
export default PieceContainer;
|
export default PrizePieceContainer;
|
||||||
|
Loading…
Reference in New Issue
Block a user