'use strict'; import React from 'react'; import { Link, History } from 'react-router'; import Moment from 'moment'; import Row from 'react-bootstrap/lib/Row'; import Col from 'react-bootstrap/lib/Col'; import Glyphicon from 'react-bootstrap/lib/Glyphicon'; import UserActions from '../../actions/user_actions'; import UserStore from '../../stores/user_store'; import CoaActions from '../../actions/coa_actions'; import CoaStore from '../../stores/coa_store'; import HistoryIterator from './history_iterator'; import MediaContainer from './media_container'; import CollapsibleParagraph from './../ascribe_collapsible/collapsible_paragraph'; import Form from './../ascribe_forms/form'; import Property from './../ascribe_forms/property'; import EditionDetailProperty from './detail_property'; import LicenseDetail from './license_detail'; import FurtherDetails from './further_details'; import EditionActionPanel from './edition_action_panel'; import AclProxy from '../acl_proxy'; import Note from './note'; import ApiUrls from '../../constants/api_urls'; import AscribeSpinner from '../ascribe_spinner'; import { getLangText } from '../../utils/lang_utils'; /** * This is the component that implements display-specific functionality */ let Edition = React.createClass({ propTypes: { actionPanelButtonListType: React.PropTypes.func, furtherDetailsType: React.PropTypes.func, edition: React.PropTypes.object, loadEdition: React.PropTypes.func }, mixins: [History], getDefaultProps() { return { furtherDetailsType: FurtherDetails }; }, getInitialState() { return UserStore.getState(); }, componentDidMount() { UserStore.listen(this.onChange); UserActions.fetchCurrentUser(); }, componentWillUnmount() { // Flushing the coa state is essential to not displaying the same // data to the user while he's on another edition // // BUGFIX: Previously we had this line in the componentWillUnmount of // CoaDetails, but since we're reloading the edition after performing an ACL action // on it, this resulted in multiple events occupying the dispatcher, which eventually // resulted in crashing the app. CoaActions.flushCoa(); UserStore.unlisten(this.onChange); }, onChange(state) { this.setState(state); }, render() { let FurtherDetailsType = this.props.furtherDetailsType; return (

{this.props.edition.title}


0}> 0}> 0}> {return {'bitcoin_id': this.props.edition.bitcoin_id}; }} label={getLangText('Personal note (private)')} defaultValue={this.props.edition.private_note ? this.props.edition.private_note : null} placeholder={getLangText('Enter your comments ...')} editable={true} successMessage={getLangText('Private note saved')} url={ApiUrls.note_private_edition} currentUser={this.state.currentUser}/> {return {'bitcoin_id': this.props.edition.bitcoin_id}; }} label={getLangText('Edition note (public)')} defaultValue={this.props.edition.public_note ? this.props.edition.public_note : null} placeholder={getLangText('Enter your comments ...')} editable={!!this.props.edition.acl.acl_edit} show={!!this.props.edition.public_note || !!this.props.edition.acl.acl_edit} successMessage={getLangText('Public edition note saved')} url={ApiUrls.note_public_edition} currentUser={this.state.currentUser}/> 0 || this.props.edition.other_data.length > 0}>
); } }); let EditionSummary = React.createClass({ propTypes: { actionPanelButtonListType: React.PropTypes.func, edition: React.PropTypes.object, currentUser: React.PropTypes.object, handleSuccess: React.PropTypes.func }, handleSuccess() { this.props.handleSuccess(); }, getStatus(){ let status = null; if (this.props.edition.status.length > 0){ let statusStr = this.props.edition.status.join().replace(/_/, ' '); status = ; if (this.props.edition.pending_new_owner && this.props.edition.acl.acl_withdraw_transfer){ status = ( ); } } return status; }, render() { let { actionPanelButtonListType, edition, currentUser } = this.props; return (
{this.getStatus()}
); } }); let CoaDetails = React.createClass({ propTypes: { edition: React.PropTypes.object }, getInitialState() { return CoaStore.getState(); }, componentDidMount() { let { edition } = this.props; CoaStore.listen(this.onChange); if(edition.coa) { CoaActions.fetchOrCreate(edition.coa, edition.bitcoin_id); } else { CoaActions.create(edition.bitcoin_id); } }, componentWillUnmount() { CoaStore.unlisten(this.onChange); }, onChange(state) { this.setState(state); }, render() { if(this.state.coa && this.state.coa.url_safe) { return (

); } else if(typeof this.state.coa === 'string'){ return (
{this.state.coa}
); } return (
); } }); let SpoolDetails = React.createClass({ propTypes: { edition: React.PropTypes.object }, render() { let bitcoinIdValue = ( {this.props.edition.bitcoin_id} ); let hashOfArtwork = ( {this.props.edition.hash_as_address} ); let ownerAddress = ( {this.props.edition.btc_owner_address_noprefix} ); return (
{bitcoinIdValue}
{hashOfArtwork}
{ownerAddress}

); } }); export default Edition;