Merge pull request #189 from lbryio/refactor-publish-page

Refactor Publish page + make styling of form fields more flexible
This commit is contained in:
Jeremy Kauffman 2017-03-02 12:19:59 -05:00 committed by GitHub
commit c2f9352466
4 changed files with 33 additions and 27 deletions

View file

@ -13,8 +13,8 @@ Web UI version numbers should always match the corresponding version of LBRY App
* *
### Changed ### Changed
* * Improved ability to style FormFields and form field labels
* * Refactored Publish page to use form field changes
* *
### Fixed ### Fixed

View file

@ -22,9 +22,12 @@ var FormField = React.createClass({
} }
}, },
componentWillMount: function() { componentWillMount: function() {
if (['text', 'radio', 'checkbox', 'file'].indexOf(this.props.type) != -1) { if (['text', 'radio', 'checkbox', 'file'].includes(this.props.type)) {
this._element = 'input'; this._element = 'input';
this._type = this.props.type; this._type = this.props.type;
} else if (this.props.type == 'text-number') {
this._element = 'input';
this._type = 'text';
} else { } else {
// Non <input> field, e.g. <select>, <textarea> // Non <input> field, e.g. <select>, <textarea>
this._element = this.props.type; this._element = this.props.type;
@ -56,8 +59,7 @@ var FormField = React.createClass({
getValue: function() { getValue: function() {
if (this.props.type == 'checkbox') { if (this.props.type == 'checkbox') {
return this.refs.field.checked; return this.refs.field.checked;
} } else if (this.props.type == 'file') {
else if (this.props.type == 'file') {
return this.refs.field.files[0].path; return this.refs.field.files[0].path;
} else { } else {
return this.refs.field.value; return this.refs.field.value;
@ -68,7 +70,7 @@ var FormField = React.createClass({
}, },
render: function() { render: function() {
// Pass all unhandled props to the field element // Pass all unhandled props to the field element
var otherProps = Object.assign({}, this.props); const otherProps = Object.assign({}, this.props);
delete otherProps.type; delete otherProps.type;
delete otherProps.hidden; delete otherProps.hidden;
@ -76,6 +78,7 @@ var FormField = React.createClass({
!this.props.hidden !this.props.hidden
? <div className="form-field-container"> ? <div className="form-field-container">
<this._element type={this._type} className="form-field" name={this.props.name} ref="field" placeholder={this.props.placeholder} <this._element type={this._type} className="form-field" name={this.props.name} ref="field" placeholder={this.props.placeholder}
className={'form-field--' + this.props.type + ' ' + (this.props.className || '')}
{...otherProps}> {...otherProps}>
{this.props.children} {this.props.children}
</this._element> </this._element>

View file

@ -4,18 +4,6 @@ import FormField from '../component/form.js';
import {Link} from '../component/link.js'; import {Link} from '../component/link.js';
import Modal from '../component/modal.js'; import Modal from '../component/modal.js';
var publishNumberStyle = {
width: '50px',
}, publishFieldLabelStyle = {
display: 'inline-block',
width: '118px',
textAlign: 'right',
verticalAlign: 'top',
}, publishFieldStyle = {
width: '330px',
};
var PublishPage = React.createClass({ var PublishPage = React.createClass({
_requiredFields: ['name', 'bid', 'meta_title', 'meta_author', 'meta_license', 'meta_description'], _requiredFields: ['name', 'bid', 'meta_title', 'meta_author', 'meta_license', 'meta_description'],
@ -301,7 +289,7 @@ var PublishPage = React.createClass({
<section className="card"> <section className="card">
<h4>Bid Amount</h4> <h4>Bid Amount</h4>
<div className="form-row"> <div className="form-row">
Credits <FormField ref="bid" style={publishNumberStyle} type="text" onChange={this.handleBidChange} value={this.state.bid} placeholder={this.state.nameResolved ? this.state.topClaimValue + 10 : 100} /> Credits <FormField ref="bid" type="text-number" onChange={this.handleBidChange} value={this.state.bid} placeholder={this.state.nameResolved ? this.state.topClaimValue + 10 : 100} />
<div className="help">How much would you like to bid for this name? <div className="help">How much would you like to bid for this name?
{ !this.state.nameResolved ? <span> Since this name is not currently resolved, you may bid as low as you want, but higher bids help prevent others from claiming your name.</span> { !this.state.nameResolved ? <span> Since this name is not currently resolved, you may bid as low as you want, but higher bids help prevent others from claiming your name.</span>
: (this.state.topClaimIsMine ? <span> You currently control this name with a bid of <strong>{this.state.myClaimValue}</strong> {this.state.myClaimValue == 1 ? 'credit' : 'credits'}.</span> : (this.state.topClaimIsMine ? <span> You currently control this name with a bid of <strong>{this.state.myClaimValue}</strong> {this.state.myClaimValue == 1 ? 'credit' : 'credits'}.</span>
@ -321,7 +309,7 @@ var PublishPage = React.createClass({
<label> <label>
<FormField type="radio" onChange={ () => { this.handleFeePrefChange(true) } } checked={this.state.isFee} /> { !this.state.isFee ? 'Choose fee...' : 'Fee ' } <FormField type="radio" onChange={ () => { this.handleFeePrefChange(true) } } checked={this.state.isFee} /> { !this.state.isFee ? 'Choose fee...' : 'Fee ' }
<span className={!this.state.isFee ? 'hidden' : ''}> <span className={!this.state.isFee ? 'hidden' : ''}>
<FormField type="text" onChange={this.handleFeeAmountChange} style={publishNumberStyle} /> <FormField type="select" onChange={this.handleFeeCurrencyChange}> <FormField type="text-number" onChange={this.handleFeeAmountChange} /> <FormField type="select" onChange={this.handleFeeCurrencyChange}>
<option value="USD">US Dollars</option> <option value="USD">US Dollars</option>
<option value="LBC">LBRY credits</option> <option value="LBC">LBRY credits</option>
</FormField> </FormField>
@ -339,10 +327,10 @@ var PublishPage = React.createClass({
<h4>Your Content</h4> <h4>Your Content</h4>
<div className="form-row"> <div className="form-row">
<label htmlFor="title">Title</label><FormField type="text" ref="meta_title" name="title" placeholder="My Show, Episode 1" style={publishFieldStyle} /> <label htmlFor="title">Title</label><FormField type="text" ref="meta_title" name="title" placeholder="My Show, Episode 1" />
</div> </div>
<div className="form-row"> <div className="form-row">
<label htmlFor="author">Author</label><FormField type="text" ref="meta_author" name="author" placeholder="My Company, Inc." style={publishFieldStyle} /> <label htmlFor="author">Author</label><FormField type="text" ref="meta_author" name="author" placeholder="My Company, Inc." />
</div> </div>
<div className="form-row"> <div className="form-row">
<label htmlFor="license">License</label><FormField type="select" ref="meta_license" name="license" onChange={this.handeLicenseChange}> <label htmlFor="license">License</label><FormField type="select" ref="meta_license" name="license" onChange={this.handeLicenseChange}>
@ -360,17 +348,17 @@ var PublishPage = React.createClass({
</div> </div>
{this.state.copyrightChosen {this.state.copyrightChosen
? <div className="form-row"> ? <div className="form-row">
<label htmlFor="copyright-notice" value={this.state.copyrightNotice}>Copyright notice</label><FormField type="text" name="copyright-notice" value={this.state.copyrightNotice} onChange={this.handleCopyrightNoticeChange} style={publishFieldStyle} /> <label htmlFor="copyright-notice" value={this.state.copyrightNotice}>Copyright notice</label><FormField type="text" name="copyright-notice" value={this.state.copyrightNotice} onChange={this.handleCopyrightNoticeChange} />
</div> </div>
: null} : null}
{this.state.otherLicenseChosen {this.state.otherLicenseChosen
? <div className="form-row"> ? <div className="form-row">
<label htmlFor="other-license-description">License description</label><FormField type="text" name="other-license-description" onChange={this.handleOtherLicenseDescriptionChange} style={publishFieldStyle} /> <label htmlFor="other-license-description">License description</label><FormField type="text" name="other-license-description" onChange={this.handleOtherLicenseDescriptionChange} />
</div> </div>
: null} : null}
{this.state.otherLicenseChosen {this.state.otherLicenseChosen
? <div className="form-row"> ? <div className="form-row">
<label htmlFor="other-license-url">License URL</label> <FormField type="text" name="other-license-url" style={publishFieldStyle} onChange={this.handleOtherLicenseUrlChange} /> <label htmlFor="other-license-url">License URL</label> <FormField type="text" name="other-license-url" onChange={this.handleOtherLicenseUrlChange} />
</div> </div>
: null} : null}
@ -386,7 +374,7 @@ var PublishPage = React.createClass({
</FormField> </FormField>
</div> </div>
<div className="form-row"> <div className="form-row">
<label htmlFor="description">Description</label> <FormField type="textarea" ref="meta_description" name="description" placeholder="Description of your content" style={publishFieldStyle} /> <label htmlFor="description">Description</label> <FormField type="textarea" ref="meta_description" name="description" placeholder="Description of your content" />
</div> </div>
<div className="form-row"> <div className="form-row">
<label><FormField type="checkbox" ref="meta_nsfw" name="nsfw" placeholder="Description of your content" /> Not Safe For Work</label> <label><FormField type="checkbox" ref="meta_nsfw" name="nsfw" placeholder="Description of your content" /> Not Safe For Work</label>
@ -398,7 +386,7 @@ var PublishPage = React.createClass({
<section className="card"> <section className="card">
<h4>Additional Content Information (Optional)</h4> <h4>Additional Content Information (Optional)</h4>
<div className="form-row"> <div className="form-row">
<label htmlFor="meta_thumbnail">Thumbnail URL</label> <FormField type="text" ref="meta_thumbnail" name="thumbnail" placeholder="http://mycompany.com/images/ep_1.jpg" style={publishFieldStyle} /> <label htmlFor="meta_thumbnail">Thumbnail URL</label> <FormField type="text" ref="meta_thumbnail" name="thumbnail" placeholder="http://mycompany.com/images/ep_1.jpg" />
</div> </div>
</section> </section>

View file

@ -255,6 +255,14 @@ input[type="text"], input[type="search"]
display: inline-block; display: inline-block;
} }
.form-field--text {
width: 330px;
}
.form-field--text-number {
width: 50px;
}
.form-field-advice-container { .form-field-advice-container {
position: relative; position: relative;
} }
@ -300,6 +308,13 @@ input[type="text"], input[type="search"]
color: #fff; color: #fff;
} }
.form-field-label {
width: 118px;
text-align: right;
vertical-align: top;
display: inline-block;
}
.sort-section { .sort-section {
display: block; display: block;