mirror of
https://github.com/ascribe/onion.git
synced 2025-01-05 11:25:09 +01:00
Merge remote-tracking branch 'origin/master' into AD-1080-restyle-webapp-with-new-corporate-identity
Conflicts: js/components/ascribe_detail/edition_container.js js/components/logout_container.js
This commit is contained in:
commit
fad6caca63
@ -22,7 +22,7 @@
|
|||||||
"react/jsx-sort-props": 0,
|
"react/jsx-sort-props": 0,
|
||||||
"react/jsx-uses-react": 1,
|
"react/jsx-uses-react": 1,
|
||||||
"react/jsx-uses-vars": 1,
|
"react/jsx-uses-vars": 1,
|
||||||
"react/no-did-mount-set-state": 1,
|
"react/no-did-mount-set-state": [1, "allow-in-func"],
|
||||||
"react/no-did-update-set-state": 1,
|
"react/no-did-update-set-state": 1,
|
||||||
"react/no-multi-comp": 0,
|
"react/no-multi-comp": 0,
|
||||||
"react/no-unknown-property": 1,
|
"react/no-unknown-property": 1,
|
||||||
|
@ -9,6 +9,9 @@ import Edition from './edition';
|
|||||||
|
|
||||||
import AscribeSpinner from '../ascribe_spinner';
|
import AscribeSpinner from '../ascribe_spinner';
|
||||||
|
|
||||||
|
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
|
||||||
*/
|
*/
|
||||||
@ -64,6 +67,8 @@ let EditionContainer = React.createClass({
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
if(this.state.edition && this.state.edition.title) {
|
if(this.state.edition && this.state.edition.title) {
|
||||||
|
setDocumentTitle([this.state.edition.artist_name, this.state.edition.title].join(', '));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Edition
|
<Edition
|
||||||
edition={this.state.edition}
|
edition={this.state.edition}
|
||||||
|
@ -39,6 +39,7 @@ import AscribeSpinner from '../ascribe_spinner';
|
|||||||
|
|
||||||
import { mergeOptions } from '../../utils/general_utils';
|
import { mergeOptions } from '../../utils/general_utils';
|
||||||
import { getLangText } from '../../utils/lang_utils';
|
import { getLangText } from '../../utils/lang_utils';
|
||||||
|
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
|
||||||
@ -211,6 +212,8 @@ let PieceContainer = React.createClass({
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
if(this.state.piece && this.state.piece.title) {
|
if(this.state.piece && this.state.piece.title) {
|
||||||
|
setDocumentTitle([this.state.piece.artist_name, this.state.piece.title].join(', '));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Piece
|
<Piece
|
||||||
piece={this.state.piece}
|
piece={this.state.piece}
|
||||||
|
@ -103,14 +103,17 @@ let Video = React.createClass({
|
|||||||
* ReactJS is responsible for DOM manipulation but VideoJS updates the DOM
|
* ReactJS is responsible for DOM manipulation but VideoJS updates the DOM
|
||||||
* to install itself to display the video, therefore ReactJS complains that we are
|
* to install itself to display the video, therefore ReactJS complains that we are
|
||||||
* changing the DOM under its feet.
|
* changing the DOM under its feet.
|
||||||
|
* The component supports a fall-back to HTML5 video tag.
|
||||||
*
|
*
|
||||||
* What we do is the following:
|
* What we do is the following:
|
||||||
* 1) set `state.ready = false`
|
* 1) set `state.libraryLoaded = null` (state.libraryLoaded can be in three states: `null`
|
||||||
* 2) render the cover using the `<Image />` component (because ready is false)
|
* if we don't know anything about it, `true` if the external library has been loaded,
|
||||||
|
* `false` if we failed to load the external library)
|
||||||
|
* 2) render the cover using the `<Image />` component (because libraryLoaded is null)
|
||||||
* 3) on `componentDidMount`, we load the external `css` and `js` resources using
|
* 3) on `componentDidMount`, we load the external `css` and `js` resources using
|
||||||
* the `InjectInHeadMixin`, attaching a function to `Promise.then` to change
|
* the `InjectInHeadMixin`, attaching a function to `Promise.then` to change
|
||||||
* `state.ready` to true
|
* `state.libraryLoaded` to true
|
||||||
* 4) when the promise is succesfully resolved, we change `state.ready` triggering
|
* 4) when the promise is succesfully resolved, we change `state.libraryLoaded` triggering
|
||||||
* a re-render
|
* a re-render
|
||||||
* 5) the new render calls `prepareVideoHTML` to get the raw HTML of the video tag
|
* 5) the new render calls `prepareVideoHTML` to get the raw HTML of the video tag
|
||||||
* (that will be later processed and expanded by VideoJS)
|
* (that will be later processed and expanded by VideoJS)
|
||||||
@ -129,18 +132,19 @@ let Video = React.createClass({
|
|||||||
mixins: [InjectInHeadMixin],
|
mixins: [InjectInHeadMixin],
|
||||||
|
|
||||||
getInitialState() {
|
getInitialState() {
|
||||||
return { ready: false, videoMounted: false };
|
return { libraryLoaded: null, videoMounted: false };
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
Q.all([
|
Q.all([
|
||||||
this.inject('//vjs.zencdn.net/4.12/video-js.css'),
|
this.inject('//vjs.zencdn.net/4.12/video-js.css'),
|
||||||
this.inject('//vjs.zencdn.net/4.12/video.js')
|
this.inject('//vjs.zencdn.net/4.12/video.js')])
|
||||||
]).then(this.ready);
|
.then(() => this.setState({libraryLoaded: true}))
|
||||||
|
.fail(() => this.setState({libraryLoaded: false}));
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidUpdate() {
|
componentDidUpdate() {
|
||||||
if (this.state.ready && !this.state.videoMounted) {
|
if (this.state.libraryLoaded && !this.state.videoMounted) {
|
||||||
window.videojs('#mainvideo');
|
window.videojs('#mainvideo');
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
this.setState({videoMounted: true});
|
this.setState({videoMounted: true});
|
||||||
@ -149,11 +153,9 @@ let Video = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
window.videojs('#mainvideo').dispose();
|
if (this.state.videoMounted) {
|
||||||
},
|
window.videojs('#mainvideo').dispose();
|
||||||
|
}
|
||||||
ready() {
|
|
||||||
this.setState({ready: true, videoMounted: false});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
prepareVideoHTML() {
|
prepareVideoHTML() {
|
||||||
@ -171,7 +173,7 @@ let Video = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
if (this.state.ready) {
|
if (this.state.libraryLoaded !== null) {
|
||||||
return (
|
return (
|
||||||
<div dangerouslySetInnerHTML={{__html: this.prepareVideoHTML() }}/>
|
<div dangerouslySetInnerHTML={{__html: this.prepareVideoHTML() }}/>
|
||||||
);
|
);
|
||||||
|
@ -96,7 +96,11 @@ let AccountSettings = React.createClass({
|
|||||||
title={getLangText('Account')}
|
title={getLangText('Account')}
|
||||||
defaultExpanded={true}>
|
defaultExpanded={true}>
|
||||||
{content}
|
{content}
|
||||||
<CopyrightAssociationForm currentUser={this.props.currentUser}/>
|
<AclProxy
|
||||||
|
aclObject={this.props.whitelabel}
|
||||||
|
aclName="acl_view_settings_copyright_association">
|
||||||
|
<CopyrightAssociationForm currentUser={this.props.currentUser}/>
|
||||||
|
</AclProxy>
|
||||||
{profile}
|
{profile}
|
||||||
</CollapsibleParagraph>
|
</CollapsibleParagraph>
|
||||||
);
|
);
|
||||||
|
@ -23,6 +23,7 @@ import GlobalNotificationActions from '../../actions/global_notification_actions
|
|||||||
import AclProxy from '../acl_proxy';
|
import AclProxy from '../acl_proxy';
|
||||||
|
|
||||||
import { getLangText } from '../../utils/lang_utils';
|
import { getLangText } from '../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../utils/dom_utils';
|
||||||
import { mergeOptions, truncateTextAtCharIndex } from '../../utils/general_utils';
|
import { mergeOptions, truncateTextAtCharIndex } from '../../utils/general_utils';
|
||||||
|
|
||||||
|
|
||||||
@ -86,6 +87,8 @@ let ContractSettings = React.createClass({
|
|||||||
let privateContracts = this.getPrivateContracts();
|
let privateContracts = this.getPrivateContracts();
|
||||||
let createPublicContractForm = null;
|
let createPublicContractForm = null;
|
||||||
|
|
||||||
|
setDocumentTitle(getLangText('Contracts settings'));
|
||||||
|
|
||||||
if(publicContracts.length === 0) {
|
if(publicContracts.length === 0) {
|
||||||
createPublicContractForm = (
|
createPublicContractForm = (
|
||||||
<CreateContractForm
|
<CreateContractForm
|
||||||
|
@ -15,6 +15,8 @@ import APISettings from './api_settings';
|
|||||||
import AclProxy from '../acl_proxy';
|
import AclProxy from '../acl_proxy';
|
||||||
|
|
||||||
import { mergeOptions } from '../../utils/general_utils';
|
import { mergeOptions } from '../../utils/general_utils';
|
||||||
|
import { getLangText } from '../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let SettingsContainer = React.createClass({
|
let SettingsContainer = React.createClass({
|
||||||
@ -53,6 +55,8 @@ let SettingsContainer = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Account settings'));
|
||||||
|
|
||||||
if (this.state.currentUser && this.state.currentUser.username) {
|
if (this.state.currentUser && this.state.currentUser.username) {
|
||||||
return (
|
return (
|
||||||
<div className="settings-container">
|
<div className="settings-container">
|
||||||
|
@ -12,6 +12,7 @@ import { getLangText } from '../../../utils/lang_utils';
|
|||||||
// Taken from: https://github.com/fedosejev/react-file-drag-and-drop
|
// Taken from: https://github.com/fedosejev/react-file-drag-and-drop
|
||||||
let FileDragAndDrop = React.createClass({
|
let FileDragAndDrop = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
|
className: React.PropTypes.string,
|
||||||
onDrop: React.PropTypes.func.isRequired,
|
onDrop: React.PropTypes.func.isRequired,
|
||||||
onDragOver: React.PropTypes.func,
|
onDragOver: React.PropTypes.func,
|
||||||
onInactive: React.PropTypes.func,
|
onInactive: React.PropTypes.func,
|
||||||
@ -108,6 +109,7 @@ let FileDragAndDrop = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
handleOnClick() {
|
handleOnClick() {
|
||||||
|
let evt;
|
||||||
// when multiple is set to false and the user already uploaded a piece,
|
// when multiple is set to false and the user already uploaded a piece,
|
||||||
// do not propagate event
|
// do not propagate event
|
||||||
if(this.props.dropzoneInactive) {
|
if(this.props.dropzoneInactive) {
|
||||||
@ -119,16 +121,18 @@ let FileDragAndDrop = React.createClass({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Firefox only recognizes the simulated mouse click if bubbles is set to true,
|
try {
|
||||||
// but since Google Chrome propagates the event much further than needed, we
|
evt = new MouseEvent('click', {
|
||||||
// need to stop propagation as soon as the event is created
|
view: window,
|
||||||
var evt = new MouseEvent('click', {
|
bubbles: true,
|
||||||
view: window,
|
cancelable: true
|
||||||
bubbles: true,
|
});
|
||||||
cancelable: true
|
} catch(e) {
|
||||||
});
|
// For browsers that do not support the new MouseEvent syntax
|
||||||
|
evt = document.createEvent('MouseEvents');
|
||||||
|
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);
|
||||||
|
}
|
||||||
|
|
||||||
evt.stopPropagation();
|
|
||||||
this.refs.fileinput.getDOMNode().dispatchEvent(evt);
|
this.refs.fileinput.getDOMNode().dispatchEvent(evt);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -160,10 +164,10 @@ let FileDragAndDrop = React.createClass({
|
|||||||
<div className="file-drag-and-drop-hashing-dialog">
|
<div className="file-drag-and-drop-hashing-dialog">
|
||||||
<p>{getLangText('Computing hash(es)... This may take a few minutes.')}</p>
|
<p>{getLangText('Computing hash(es)... This may take a few minutes.')}</p>
|
||||||
<p>
|
<p>
|
||||||
<a onClick={this.props.handleCancelHashing}> {getLangText('Cancel hashing')}</a>
|
<a onClick={handleCancelHashing}> {getLangText('Cancel hashing')}</a>
|
||||||
</p>
|
</p>
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
now={Math.ceil(this.props.hashingProgress)}
|
now={Math.ceil(hashingProgress)}
|
||||||
label="%(percent)s%"
|
label="%(percent)s%"
|
||||||
className="ascribe-progress-bar"/>
|
className="ascribe-progress-bar"/>
|
||||||
</div>
|
</div>
|
||||||
@ -191,12 +195,23 @@ let FileDragAndDrop = React.createClass({
|
|||||||
handleResumeFile={this.handleResumeFile}
|
handleResumeFile={this.handleResumeFile}
|
||||||
areAssetsDownloadable={areAssetsDownloadable}
|
areAssetsDownloadable={areAssetsDownloadable}
|
||||||
areAssetsEditable={areAssetsEditable}/>
|
areAssetsEditable={areAssetsEditable}/>
|
||||||
|
{/*
|
||||||
|
Opera doesn't trigger simulated click events
|
||||||
|
if the targeted input has `display:none` set.
|
||||||
|
Which means we need to set its visibility to hidden
|
||||||
|
instead of using `display:none`.
|
||||||
|
|
||||||
|
See:
|
||||||
|
- http://stackoverflow.com/questions/12880604/jquery-triggerclick-not-working-on-opera-if-the-element-is-not-displayed
|
||||||
|
*/}
|
||||||
<input
|
<input
|
||||||
multiple={multiple}
|
multiple={multiple}
|
||||||
ref="fileinput"
|
ref="fileinput"
|
||||||
type="file"
|
type="file"
|
||||||
style={{
|
style={{
|
||||||
display: 'none',
|
visibility: 'hidden',
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
height: 0,
|
height: 0,
|
||||||
width: 0
|
width: 0
|
||||||
}}
|
}}
|
||||||
|
@ -13,10 +13,13 @@ import AscribeSpinner from './ascribe_spinner';
|
|||||||
|
|
||||||
import ApiUrls from '../constants/api_urls';
|
import ApiUrls from '../constants/api_urls';
|
||||||
import { getLangText } from '../utils/lang_utils';
|
import { getLangText } from '../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let CoaVerifyContainer = React.createClass({
|
let CoaVerifyContainer = React.createClass({
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Verify your Certificate of Authenticity'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="ascribe-login-wrapper">
|
<div className="ascribe-login-wrapper">
|
||||||
<br/>
|
<br/>
|
||||||
|
@ -6,6 +6,7 @@ import { Link } from 'react-router';
|
|||||||
import LoginForm from './ascribe_forms/form_login';
|
import LoginForm from './ascribe_forms/form_login';
|
||||||
|
|
||||||
import { getLangText } from '../utils/lang_utils';
|
import { getLangText } from '../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let LoginContainer = React.createClass({
|
let LoginContainer = React.createClass({
|
||||||
@ -26,6 +27,8 @@ let LoginContainer = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Log in'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="ascribe-login-wrapper">
|
<div className="ascribe-login-wrapper">
|
||||||
<LoginForm
|
<LoginForm
|
||||||
|
@ -9,6 +9,7 @@ import UserActions from '../actions/user_actions';
|
|||||||
import { alt, altWhitelabel, altUser, altThirdParty } from '../alt';
|
import { alt, altWhitelabel, altUser, altThirdParty } from '../alt';
|
||||||
|
|
||||||
import { getLangText } from '../utils/lang_utils';
|
import { getLangText } from '../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let LogoutContainer = React.createClass({
|
let LogoutContainer = React.createClass({
|
||||||
@ -25,6 +26,8 @@ let LogoutContainer = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Log out'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="ascribe-loading-position">
|
<div className="ascribe-loading-position">
|
||||||
<AscribeSpinner color='dark-blue' size='lg'/>
|
<AscribeSpinner color='dark-blue' size='lg'/>
|
||||||
|
@ -11,6 +11,7 @@ import AscribeSpinner from './ascribe_spinner';
|
|||||||
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';
|
||||||
import { getLangText } from '../utils/lang_utils';
|
import { getLangText } from '../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let PasswordResetContainer = React.createClass({
|
let PasswordResetContainer = React.createClass({
|
||||||
@ -76,6 +77,8 @@ let PasswordRequestResetForm = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Reset your password'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form
|
<Form
|
||||||
ref="form"
|
ref="form"
|
||||||
|
@ -26,6 +26,7 @@ import AppConstants from '../constants/application_constants';
|
|||||||
|
|
||||||
import { mergeOptions } from '../utils/general_utils';
|
import { mergeOptions } from '../utils/general_utils';
|
||||||
import { getLangText } from '../utils/lang_utils';
|
import { getLangText } from '../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let PieceList = React.createClass({
|
let PieceList = React.createClass({
|
||||||
@ -155,6 +156,8 @@ let PieceList = React.createClass({
|
|||||||
let loadingElement = <AscribeSpinner color='dark-blue' size='lg'/>;
|
let loadingElement = <AscribeSpinner color='dark-blue' size='lg'/>;
|
||||||
let AccordionListItemType = this.props.accordionListItemType;
|
let AccordionListItemType = this.props.accordionListItemType;
|
||||||
|
|
||||||
|
setDocumentTitle(getLangText('Collection'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<PieceListToolbar
|
<PieceListToolbar
|
||||||
|
@ -22,6 +22,7 @@ import RegisterPieceForm from './ascribe_forms/form_register_piece';
|
|||||||
|
|
||||||
import { mergeOptions } from '../utils/general_utils';
|
import { mergeOptions } from '../utils/general_utils';
|
||||||
import { getLangText } from '../utils/lang_utils';
|
import { getLangText } from '../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let RegisterPiece = React.createClass( {
|
let RegisterPiece = React.createClass( {
|
||||||
@ -115,6 +116,8 @@ let RegisterPiece = React.createClass( {
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Register a new piece'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Row className="no-margin">
|
<Row className="no-margin">
|
||||||
<Col xs={12} sm={10} md={8} smOffset={1} mdOffset={2}>
|
<Col xs={12} sm={10} md={8} smOffset={1} mdOffset={2}>
|
||||||
|
@ -6,6 +6,7 @@ import { Link } from 'react-router';
|
|||||||
import SignupForm from './ascribe_forms/form_signup';
|
import SignupForm from './ascribe_forms/form_signup';
|
||||||
|
|
||||||
import { getLangText } from '../utils/lang_utils';
|
import { getLangText } from '../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let SignupContainer = React.createClass({
|
let SignupContainer = React.createClass({
|
||||||
@ -28,6 +29,8 @@ let SignupContainer = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Sign up'));
|
||||||
|
|
||||||
if (this.state.submitted){
|
if (this.state.submitted){
|
||||||
return (
|
return (
|
||||||
<div className="ascribe-login-wrapper">
|
<div className="ascribe-login-wrapper">
|
||||||
|
@ -40,6 +40,7 @@ import DetailProperty from '../../../../ascribe_detail/detail_property';
|
|||||||
import ApiUrls from '../../../../../constants/api_urls';
|
import ApiUrls from '../../../../../constants/api_urls';
|
||||||
import { mergeOptions } from '../../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../../utils/general_utils';
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -112,12 +113,22 @@ let PieceContainer = React.createClass({
|
|||||||
// Only show the artist name if you are the participant or if you are a judge and the piece is shortlisted
|
// Only show the artist name if you are the participant or if you are a judge and the piece is shortlisted
|
||||||
let artistName = ((this.state.currentUser.is_jury && !this.state.currentUser.is_judge) ||
|
let artistName = ((this.state.currentUser.is_jury && !this.state.currentUser.is_judge) ||
|
||||||
(this.state.currentUser.is_judge && !this.state.piece.selected )) ?
|
(this.state.currentUser.is_judge && !this.state.piece.selected )) ?
|
||||||
<span className="glyphicon glyphicon-eye-close" aria-hidden="true"/> : this.state.piece.artist_name;
|
null : this.state.piece.artist_name;
|
||||||
|
|
||||||
// Only show the artist email if you are a judge and the piece is shortlisted
|
// Only show the artist email if you are a judge and the piece is shortlisted
|
||||||
let artistEmail = (this.state.currentUser.is_judge && this.state.piece.selected ) ?
|
let artistEmail = (this.state.currentUser.is_judge && this.state.piece.selected ) ?
|
||||||
<DetailProperty label={getLangText('REGISTREE')} value={ this.state.piece.user_registered } /> : null;
|
<DetailProperty label={getLangText('REGISTREE')} value={ this.state.piece.user_registered } /> : null;
|
||||||
|
|
||||||
|
if (artistName === null) {
|
||||||
|
setDocumentTitle(this.state.piece.title);
|
||||||
|
} else {
|
||||||
|
setDocumentTitle([artistName, this.state.piece.title].join(', '));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (artistName === null) {
|
||||||
|
artistName = <span className="glyphicon glyphicon-eye-close" aria-hidden="true"/>;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Piece
|
<Piece
|
||||||
piece={this.state.piece}
|
piece={this.state.piece}
|
||||||
|
@ -6,6 +6,7 @@ import { Link } from 'react-router';
|
|||||||
import LoginForm from '../../../ascribe_forms/form_login';
|
import LoginForm from '../../../ascribe_forms/form_login';
|
||||||
|
|
||||||
import { getLangText } from '../../../../utils/lang_utils';
|
import { getLangText } from '../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let LoginContainer = React.createClass({
|
let LoginContainer = React.createClass({
|
||||||
@ -14,6 +15,8 @@ let LoginContainer = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Log in'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="ascribe-login-wrapper">
|
<div className="ascribe-login-wrapper">
|
||||||
<LoginForm
|
<LoginForm
|
||||||
|
@ -17,6 +17,7 @@ import AccordionListItemPrize from './ascribe_accordion_list/accordion_list_item
|
|||||||
|
|
||||||
import { mergeOptions } from '../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../utils/general_utils';
|
||||||
import { getLangText } from '../../../../utils/lang_utils';
|
import { getLangText } from '../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../utils/dom_utils';
|
||||||
|
|
||||||
let PrizePieceList = React.createClass({
|
let PrizePieceList = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
@ -63,6 +64,8 @@ let PrizePieceList = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Collection'));
|
||||||
|
|
||||||
let orderParams = ['artist_name', 'title'];
|
let orderParams = ['artist_name', 'title'];
|
||||||
if (this.state.currentUser.is_jury) {
|
if (this.state.currentUser.is_jury) {
|
||||||
orderParams = ['rating', 'title'];
|
orderParams = ['rating', 'title'];
|
||||||
|
@ -11,6 +11,7 @@ import InputTextAreaToggable from '../../../ascribe_forms/input_textarea_toggabl
|
|||||||
import InputCheckbox from '../../../ascribe_forms/input_checkbox';
|
import InputCheckbox from '../../../ascribe_forms/input_checkbox';
|
||||||
|
|
||||||
import { getLangText } from '../../../../utils/lang_utils';
|
import { getLangText } from '../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let PrizeRegisterPiece = React.createClass({
|
let PrizeRegisterPiece = React.createClass({
|
||||||
@ -32,6 +33,8 @@ let PrizeRegisterPiece = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Submit to the prize'));
|
||||||
|
|
||||||
if(this.state.prize && this.state.prize.active){
|
if(this.state.prize && this.state.prize.active){
|
||||||
return (
|
return (
|
||||||
<RegisterPiece
|
<RegisterPiece
|
||||||
|
@ -24,6 +24,7 @@ import AscribeSpinner from '../../../ascribe_spinner';
|
|||||||
import ApiUrls from '../../../../constants/api_urls';
|
import ApiUrls from '../../../../constants/api_urls';
|
||||||
|
|
||||||
import { getLangText } from '../../../../utils/lang_utils';
|
import { getLangText } from '../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let Settings = React.createClass({
|
let Settings = React.createClass({
|
||||||
@ -45,6 +46,8 @@ let Settings = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Account settings'));
|
||||||
|
|
||||||
let prizeSettings = null;
|
let prizeSettings = null;
|
||||||
if (this.state.currentUser.is_admin){
|
if (this.state.currentUser.is_admin){
|
||||||
prizeSettings = <PrizeSettings />;
|
prizeSettings = <PrizeSettings />;
|
||||||
|
@ -4,6 +4,7 @@ import React from 'react';
|
|||||||
import SignupForm from '../../../ascribe_forms/form_signup';
|
import SignupForm from '../../../ascribe_forms/form_signup';
|
||||||
|
|
||||||
import { getLangText } from '../../../../utils/lang_utils';
|
import { getLangText } from '../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../utils/dom_utils';
|
||||||
|
|
||||||
let SignupContainer = React.createClass({
|
let SignupContainer = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
@ -25,6 +26,8 @@ let SignupContainer = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Sign up'));
|
||||||
|
|
||||||
if (this.state.submitted){
|
if (this.state.submitted){
|
||||||
return (
|
return (
|
||||||
<div className="ascribe-login-wrapper">
|
<div className="ascribe-login-wrapper">
|
||||||
|
@ -8,6 +8,7 @@ import LicenseActions from '../../../../../actions/license_actions';
|
|||||||
import LicenseStore from '../../../../../stores/license_store';
|
import LicenseStore from '../../../../../stores/license_store';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
import { mergeOptions } from '../../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../../utils/general_utils';
|
||||||
|
|
||||||
let CCRegisterPiece = React.createClass({
|
let CCRegisterPiece = React.createClass({
|
||||||
@ -81,6 +82,7 @@ let CCRegisterPiece = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Register a new piece'));
|
||||||
return (
|
return (
|
||||||
<RegisterPiece
|
<RegisterPiece
|
||||||
enableLocalHashing={false}
|
enableLocalHashing={false}
|
||||||
|
@ -18,6 +18,7 @@ import WalletPieceContainer from '../../ascribe_detail/wallet_piece_container';
|
|||||||
import AscribeSpinner from '../../../../../ascribe_spinner';
|
import AscribeSpinner from '../../../../../ascribe_spinner';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../../utils/dom_utils';
|
||||||
import { mergeOptions } from '../../../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../../../utils/general_utils';
|
||||||
|
|
||||||
let CylandPieceContainer = React.createClass({
|
let CylandPieceContainer = React.createClass({
|
||||||
@ -61,6 +62,8 @@ let CylandPieceContainer = React.createClass({
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
if(this.state.piece && this.state.piece.title) {
|
if(this.state.piece && this.state.piece.title) {
|
||||||
|
setDocumentTitle([this.state.piece.artist_name, this.state.piece.title].join(', '));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<WalletPieceContainer
|
<WalletPieceContainer
|
||||||
piece={this.state.piece}
|
piece={this.state.piece}
|
||||||
|
@ -16,6 +16,7 @@ import UserActions from '../../../../../actions/user_actions';
|
|||||||
|
|
||||||
import { mergeOptions } from '../../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../../utils/general_utils';
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
|
|
||||||
let CylandLanding = React.createClass({
|
let CylandLanding = React.createClass({
|
||||||
|
|
||||||
@ -51,6 +52,8 @@ let CylandLanding = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle('CYLAND MediaArtLab');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="container ascribe-form-wrapper">
|
<div className="container ascribe-form-wrapper">
|
||||||
<div className="row">
|
<div className="row">
|
||||||
|
@ -9,6 +9,7 @@ import UserStore from '../../../../../stores/user_store';
|
|||||||
import CylandAccordionListItem from './cyland_accordion_list/cyland_accordion_list_item';
|
import CylandAccordionListItem from './cyland_accordion_list/cyland_accordion_list_item';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let CylandPieceList = React.createClass({
|
let CylandPieceList = React.createClass({
|
||||||
@ -34,6 +35,8 @@ let CylandPieceList = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Collection'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<PieceList
|
<PieceList
|
||||||
|
@ -34,6 +34,7 @@ import SlidesContainer from '../../../../ascribe_slides_container/slides_contain
|
|||||||
import ApiUrls from '../../../../../constants/api_urls';
|
import ApiUrls from '../../../../../constants/api_urls';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
import { mergeOptions } from '../../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../../utils/general_utils';
|
||||||
import { getAclFormMessage } from '../../../../../utils/form_utils';
|
import { getAclFormMessage } from '../../../../../utils/form_utils';
|
||||||
|
|
||||||
@ -177,6 +178,8 @@ let CylandRegisterPiece = React.createClass({
|
|||||||
let datetimeWhenWeAllWillBeFlyingCoolHoverboardsAndDinosaursWillLiveAgain = new Moment();
|
let datetimeWhenWeAllWillBeFlyingCoolHoverboardsAndDinosaursWillLiveAgain = new Moment();
|
||||||
datetimeWhenWeAllWillBeFlyingCoolHoverboardsAndDinosaursWillLiveAgain.add(1000, 'years');
|
datetimeWhenWeAllWillBeFlyingCoolHoverboardsAndDinosaursWillLiveAgain.add(1000, 'years');
|
||||||
|
|
||||||
|
setDocumentTitle(getLangText('Register a new piece'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SlidesContainer
|
<SlidesContainer
|
||||||
ref="slidesContainer"
|
ref="slidesContainer"
|
||||||
|
@ -27,6 +27,7 @@ import Property from '../../../../ascribe_forms/property';
|
|||||||
import AppConstants from '../../../../../constants/application_constants';
|
import AppConstants from '../../../../../constants/application_constants';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
import { mergeOptions } from '../../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../../utils/general_utils';
|
||||||
|
|
||||||
|
|
||||||
@ -148,6 +149,8 @@ let IkonotvContractNotifications = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Contacts notifications'));
|
||||||
|
|
||||||
if (this.state.contractAgreementListNotifications &&
|
if (this.state.contractAgreementListNotifications &&
|
||||||
this.state.contractAgreementListNotifications.length > 0) {
|
this.state.contractAgreementListNotifications.length > 0) {
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ import WalletPieceContainer from '../../ascribe_detail/wallet_piece_container';
|
|||||||
import AscribeSpinner from '../../../../../ascribe_spinner';
|
import AscribeSpinner from '../../../../../ascribe_spinner';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../../utils/dom_utils';
|
||||||
import { mergeOptions } from '../../../../../../utils/general_utils';
|
import { mergeOptions } from '../../../../../../utils/general_utils';
|
||||||
|
|
||||||
|
|
||||||
@ -95,6 +96,7 @@ let IkonotvPieceContainer = React.createClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(this.state.piece && this.state.piece.title) {
|
if(this.state.piece && this.state.piece.title) {
|
||||||
|
setDocumentTitle([this.state.piece.artist_name, this.state.piece.title].join(', '));
|
||||||
return (
|
return (
|
||||||
<WalletPieceContainer
|
<WalletPieceContainer
|
||||||
piece={this.state.piece}
|
piece={this.state.piece}
|
||||||
|
@ -10,6 +10,7 @@ import UserStore from '../../../../../stores/user_store';
|
|||||||
import UserActions from '../../../../../actions/user_actions';
|
import UserActions from '../../../../../actions/user_actions';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let IkonotvLanding = React.createClass({
|
let IkonotvLanding = React.createClass({
|
||||||
@ -54,6 +55,8 @@ let IkonotvLanding = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle('ikonoTV');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="ikonotv-landing">
|
<div className="ikonotv-landing">
|
||||||
<header>
|
<header>
|
||||||
|
@ -9,6 +9,7 @@ import UserStore from '../../../../../stores/user_store';
|
|||||||
import IkonotvAccordionListItem from './ikonotv_accordion_list/ikonotv_accordion_list_item';
|
import IkonotvAccordionListItem from './ikonotv_accordion_list/ikonotv_accordion_list_item';
|
||||||
|
|
||||||
import { getLangText } from '../../../../../utils/lang_utils';
|
import { getLangText } from '../../../../../utils/lang_utils';
|
||||||
|
import { setDocumentTitle } from '../../../../../utils/dom_utils';
|
||||||
|
|
||||||
|
|
||||||
let IkonotvPieceList = React.createClass({
|
let IkonotvPieceList = React.createClass({
|
||||||
@ -34,6 +35,8 @@ let IkonotvPieceList = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
setDocumentTitle(getLangText('Register a new piece'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<PieceList
|
<PieceList
|
||||||
|
9
js/utils/dom_utils.js
Normal file
9
js/utils/dom_utils.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the title in the browser window.
|
||||||
|
*/
|
||||||
|
export function setDocumentTitle(title) {
|
||||||
|
document.title = title;
|
||||||
|
}
|
@ -57,12 +57,14 @@ class Requests {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleError(err) {
|
handleError(url) {
|
||||||
if (err instanceof TypeError) {
|
return (err) => {
|
||||||
throw new Error('Server did not respond to the request. (Not even displayed a 500)');
|
if (err instanceof TypeError) {
|
||||||
} else {
|
throw new Error('For: ' + url + ' - Server did not respond to the request. (Not even displayed a 500)');
|
||||||
throw err;
|
} else {
|
||||||
}
|
throw err;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
getUrl(url) {
|
getUrl(url) {
|
||||||
@ -118,7 +120,7 @@ class Requests {
|
|||||||
merged.method = verb;
|
merged.method = verb;
|
||||||
return fetch(url, merged)
|
return fetch(url, merged)
|
||||||
.then(this.unpackResponse)
|
.then(this.unpackResponse)
|
||||||
.catch(this.handleError);
|
.catch(this.handleError(url));
|
||||||
}
|
}
|
||||||
|
|
||||||
get(url, params) {
|
get(url, params) {
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
"react": "0.13.2",
|
"react": "0.13.2",
|
||||||
"react-bootstrap": "0.25.1",
|
"react-bootstrap": "0.25.1",
|
||||||
"react-datepicker": "^0.12.0",
|
"react-datepicker": "^0.12.0",
|
||||||
"react-router": "^1.0.0-rc1",
|
"react-router": "1.0.0-rc1",
|
||||||
"react-router-bootstrap": "^0.19.0",
|
"react-router-bootstrap": "^0.19.0",
|
||||||
"react-star-rating": "~1.3.2",
|
"react-star-rating": "~1.3.2",
|
||||||
"react-textarea-autosize": "^2.5.2",
|
"react-textarea-autosize": "^2.5.2",
|
||||||
|
Loading…
Reference in New Issue
Block a user