1
0
mirror of https://github.com/ascribe/onion.git synced 2025-02-14 21:10:27 +01:00

Merge remote-tracking branch 'remotes/origin/AD-551-work-on-burn-down-list' into AD-419-decouple-piece-registration-from-

This commit is contained in:
diminator 2015-07-10 17:52:39 +02:00
commit e282da8474
7 changed files with 104 additions and 64 deletions

View File

@ -2,48 +2,43 @@
import React from 'react'; import React from 'react';
import AlertMixin from '../../mixins/alert_mixin'; import { getLangText } from '../../utils/lang_utils';
let InputCheckbox = React.createClass({ let InputCheckbox = React.createClass({
propTypes: { propTypes: {
submitted: React.PropTypes.bool.isRequired,
required: React.PropTypes.string.isRequired, required: React.PropTypes.string.isRequired,
label: React.PropTypes.string.isRequired label: React.PropTypes.string.isRequired
}, },
mixins: [AlertMixin],
getInitialState() { getInitialState() {
return { return {
value: null, show: false
alerts: null // needed in AlertMixin
}; };
}, },
handleChange(event) { handleFocus() {
this.setState({value: event.target.value}); this.refs.checkbox.getDOMNode().checked = !this.refs.checkbox.getDOMNode().checked;
this.setState({
show: this.refs.checkbox.getDOMNode().checked
});
}, },
render() { render() {
let alerts = (this.props.submitted) ? null : this.state.alerts;
return ( return (
<div className="form-group"> <span
{alerts} onClick={this.handleFocus}
<div className="input-checkbox-ascribe"> onFocus={this.handleFocus}>
<div className="checkbox"> <input type="checkbox" ref="checkbox"/>
<label> <span className="checkbox">
<input <span>
type="checkbox" {' ' + getLangText('I agree to the Terms of Service') + ' '}
required={this.props.required} (<a href="/terms" target="_blank" style={{fontSize: '0.9em', color: 'rgba(0,0,0,0.7)'}}>
onChange={this.handleChange} {getLangText('read')}
/> </a>)
{this.props.label} </span>
</label> </span>
</div> </span>
</div>
</div>
); );
} }
}); });

View File

@ -18,13 +18,22 @@ let Property = React.createClass({
]), ]),
footer: React.PropTypes.element, footer: React.PropTypes.element,
handleChange: React.PropTypes.func, handleChange: React.PropTypes.func,
ignoreFocus: React.PropTypes.bool ignoreFocus: React.PropTypes.bool,
className: React.PropTypes.string,
onClick: React.PropTypes.func,
onChange: React.PropTypes.func,
children: React.PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element),
React.PropTypes.element
]),
style: React.PropTypes.object
}, },
getDefaultProps() { getDefaultProps() {
return { return {
editable: true, editable: true,
hidden: false hidden: false,
className: ''
}; };
}, },
@ -36,12 +45,14 @@ let Property = React.createClass({
errors: null errors: null
}; };
}, },
componentWillReceiveProps(){ componentWillReceiveProps(){
this.setState({ this.setState({
initialValue: this.refs.input.getDOMNode().defaultValue, initialValue: this.refs.input.getDOMNode().defaultValue,
value: this.refs.input.getDOMNode().value value: this.refs.input.getDOMNode().value
}); });
}, },
reset(){ reset(){
// maybe do reset by reload instead of frontend state? // maybe do reset by reload instead of frontend state?
this.setState({value: this.state.initialValue}); this.setState({value: this.state.initialValue});
@ -62,26 +73,39 @@ let Property = React.createClass({
} }
this.setState({value: event.target.value}); this.setState({value: event.target.value});
}, },
handleFocus() { handleFocus() {
// if ignoreFocus (bool) is defined, then just ignore focusing on
// the property and input
if(this.props.ignoreFocus) { if(this.props.ignoreFocus) {
return; return;
} }
// if onClick is defined from the outside,
// just call it
if(this.props.onClick) {
this.props.onClick();
}
this.refs.input.getDOMNode().focus(); this.refs.input.getDOMNode().focus();
this.setState({ this.setState({
isFocused: true isFocused: true
}); });
}, },
handleBlur() { handleBlur() {
this.setState({ this.setState({
isFocused: false isFocused: false
}); });
}, },
handleSuccess(){ handleSuccess(){
this.setState({ this.setState({
isFocused: false, isFocused: false,
errors: null errors: null
}); });
}, },
setErrors(errors){ setErrors(errors){
this.setState({ this.setState({
errors: errors.map((error) => { errors: errors.map((error) => {
@ -89,9 +113,11 @@ let Property = React.createClass({
}) })
}); });
}, },
clearErrors(){ clearErrors(){
this.setState({errors: null}); this.setState({errors: null});
}, },
getClassName() { getClassName() {
if(this.props.hidden){ if(this.props.hidden){
return 'is-hidden'; return 'is-hidden';
@ -108,6 +134,7 @@ let Property = React.createClass({
return ''; return '';
} }
}, },
renderChildren() { renderChildren() {
return ReactAddons.Children.map(this.props.children, (child) => { return ReactAddons.Children.map(this.props.children, (child) => {
return ReactAddons.addons.cloneWithProps(child, { return ReactAddons.addons.cloneWithProps(child, {
@ -120,6 +147,7 @@ let Property = React.createClass({
}); });
}); });
}, },
render() { render() {
let tooltip = <span/>; let tooltip = <span/>;
if (this.props.tooltip){ if (this.props.tooltip){
@ -139,12 +167,13 @@ let Property = React.createClass({
<div <div
className={'ascribe-settings-wrapper ' + this.getClassName()} className={'ascribe-settings-wrapper ' + this.getClassName()}
onClick={this.handleFocus} onClick={this.handleFocus}
onfocus={this.handleFocus}> onFocus={this.handleFocus}
style={this.props.style}>
<OverlayTrigger <OverlayTrigger
delay={500} delay={500}
placement="top" placement="top"
overlay={tooltip}> overlay={tooltip}>
<div className="ascribe-settings-property"> <div className={'ascribe-settings-property ' + this.props.className}>
{this.state.errors} {this.state.errors}
<span>{ this.props.label}</span> <span>{ this.props.label}</span>
{this.renderChildren()} {this.renderChildren()}

View File

@ -13,8 +13,10 @@ import GlobalNotificationActions from '../actions/global_notification_actions';
import Form from './ascribe_forms/form'; import Form from './ascribe_forms/form';
import Property from './ascribe_forms/property'; import Property from './ascribe_forms/property';
import FormPropertyHeader from './ascribe_forms/form_property_header';
import InputCheckbox from './ascribe_forms/input_checkbox'; import InputCheckbox from './ascribe_forms/input_checkbox';
import apiUrls from '../constants/api_urls'; import apiUrls from '../constants/api_urls';
@ -66,9 +68,6 @@ let SignupContainer = React.createClass({
return ( return (
<div className="ascribe-login-wrapper"> <div className="ascribe-login-wrapper">
<br/> <br/>
<div className="ascribe-login-text ascribe-login-header">
{getLangText('Welcome to')} ascribe...
</div>
<SignupForm handleSuccess={this.handleSuccess}/> <SignupForm handleSuccess={this.handleSuccess}/>
</div> </div>
); );
@ -77,6 +76,10 @@ let SignupContainer = React.createClass({
let SignupForm = React.createClass({ let SignupForm = React.createClass({
propTypes: {
handleSuccess: React.PropTypes.func
},
mixins: [Router.Navigation], mixins: [Router.Navigation],
handleSuccess(response){ handleSuccess(response){
@ -94,6 +97,7 @@ let SignupForm = React.createClass({
getLangText('Store it in a safe place') + '!'; getLangText('Store it in a safe place') + '!';
return ( return (
<Form <Form
className="ascribe-form-bordered"
ref='form' ref='form'
url={apiUrls.users_signup} url={apiUrls.users_signup}
handleSuccess={this.handleSuccess} handleSuccess={this.handleSuccess}
@ -106,6 +110,9 @@ let SignupForm = React.createClass({
<img src="https://s3-us-west-2.amazonaws.com/ascribe0/media/thumbnails/ascribe_animated_medium.gif" /> <img src="https://s3-us-west-2.amazonaws.com/ascribe0/media/thumbnails/ascribe_animated_medium.gif" />
</button> </button>
}> }>
<FormPropertyHeader>
<h3>{getLangText('Welcome to ascribe')}</h3>
</FormPropertyHeader>
<Property <Property
name='email' name='email'
label={getLangText('Email')}> label={getLangText('Email')}>
@ -142,16 +149,12 @@ let SignupForm = React.createClass({
type="text" type="text"
placeholder={getLangText('Enter a promocode here (Optional)')}/> placeholder={getLangText('Enter a promocode here (Optional)')}/>
</Property> </Property>
<hr /> <Property
<InputCheckbox name="terms"
name='terms' className="ascribe-settings-property-collapsible-toggle"
required="required" style={{paddingBottom: 0}}>
label={ <InputCheckbox />
<div> </Property>
<a href="/terms" target="_blank" style={{fontSize: '0.9em', color: 'rgba(0,0,0,0.7)'}}>
{getLangText('I agree to the')}&nbsp;{getLangText('Terms of Service')}
</a>
</div>}/>
</Form> </Form>
); );
} }

View File

@ -207,6 +207,8 @@ const languages = {
'Specify editions': 'Specify editions', 'Specify editions': 'Specify editions',
'Editions': 'Editions', 'Editions': 'Editions',
'Create editions': 'Create editions', 'Create editions': 'Create editions',
'I agree to the Terms of Service': 'I agree to the Terms of Service',
'read': 'read',
}, },
'de': { 'de': {
'ID': 'ID', 'ID': 'ID',
@ -414,6 +416,8 @@ const languages = {
'Specify editions': 'Specify editions', 'Specify editions': 'Specify editions',
'Editions': 'Editions', 'Editions': 'Editions',
'Create editions': 'Create editions', 'Create editions': 'Create editions',
'I agree to the Terms of Service': 'I agree to the Terms of Service',
'read': 'read',
}, },
'fr': { 'fr': {
'ID': 'ID', 'ID': 'ID',
@ -621,6 +625,8 @@ const languages = {
'Specify editions': 'Specify editions', 'Specify editions': 'Specify editions',
'Editions': 'Editions', 'Editions': 'Editions',
'Create editions': 'Create editions', 'Create editions': 'Create editions',
'I agree to the Terms of Service': 'I agree to the Terms of Service',
'read': 'read',
} }
}; };

View File

@ -122,8 +122,11 @@ $ascribe-accordion-list-font: 'Source Sans Pro';
} }
span.ascribe-accordion-list-table-toggle { span.ascribe-accordion-list-table-toggle {
::selection { background: transparent; } -webkit-user-select: none;
::-moz-selection { background: transparent; } -moz-user-select: none;
-khtml-user-select: none;
-ms-user-select: none;
&:hover { &:hover {
color: $ascribe-color-dark; color: $ascribe-color-dark;
cursor:pointer; cursor:pointer;

View File

@ -28,13 +28,13 @@
.is-error { .is-error {
background-color: rgba(169, 68, 66, 0.05); background-color: rgba(169, 68, 66, 0.05);
border-left: 3px solid rgba(169, 68, 66, 1); border-left: 3px solid rgba(169, 68, 66, 1);
div { > div {
span { > span {
color: rgba(169, 68, 66, 1); color: rgba(169, 68, 66, 1);
font-size: 0.9em; font-size: 0.9em;
margin-right: 1em; margin-right: 1em;
} }
input, textarea { > input, > textarea {
color: #666; color: #666;
} }
} }
@ -46,20 +46,18 @@
.is-fixed { .is-fixed {
cursor: default; cursor: default;
div { > div {
cursor: default; cursor: default;
span { > span {
cursor: default; cursor: default;
} }
input, div, pre, textarea { > input, > div, > pre, > textarea {
cursor: default; cursor: default;
color: #666; color: #666;
} }
} }
} }
.ascribe-settings-property { .ascribe-settings-property {
display: inline-block; display: inline-block;
width: 100%; width: 100%;
@ -72,19 +70,19 @@
cursor:pointer; cursor:pointer;
input, div, span:not(.glyphicon), pre, textarea, select { > input, > div, > span:not(.glyphicon), > pre, > textarea, > select {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
} }
span { > span {
font-weight: normal; font-weight: normal;
font-size: 0.9em; font-size: 0.9em;
color: rgba(0,0,0,.5); color: rgba(0,0,0,.5);
} }
div { > div {
/* margin-top: 10px; */ /* margin-top: 10px; */
div:not(.file-drag-and-drop div) { > div:not(.file-drag-and-drop div) {
padding-left: 0; padding-left: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: normal; font-weight: normal;
@ -94,11 +92,11 @@
} }
} }
.progressbar-container, .progressbar-progress { > .progressbar-container, .progressbar-progress {
margin-top: 0 !important; margin-top: 0 !important;
} }
input, pre, textarea, select { > input, > pre, > textarea, > select {
font-weight: 400; font-weight: 400;
font-size: 1.1em; font-size: 1.1em;
width:100%; width:100%;
@ -121,7 +119,7 @@
} }
textarea{ > textarea{
color: #666; color: #666;
margin-top: 1em; margin-top: 1em;
padding: 0; padding: 0;
@ -155,14 +153,15 @@
color: rgba(0, 0, 0, .5); color: rgba(0, 0, 0, .5);
vertical-align:middle; vertical-align:middle;
span { > span {
position: relative; position: relative;
top: 1px; top: 1px;
left: 5px; left: 5px;
&:hover { -webkit-user-select: none;
color: rgba(2, 182, 163, 1); -moz-user-select: none;
} -khtml-user-select: none;
-ms-user-select: none;
} }
} }

View File

@ -97,6 +97,11 @@ hr {
padding-right:0; padding-right:0;
} }
.clear-margins {
margin-top:0;
margin-bottom:0;
}
.ascribe-color { .ascribe-color {
color: $ascribe-color; color: $ascribe-color;
} }