mirror of
https://github.com/ascribe/onion.git
synced 2024-12-22 17:33:14 +01:00
merge 456
This commit is contained in:
commit
9ad713f781
@ -23,16 +23,27 @@ class ContractListActions {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
makeContractPublic(contract){
|
|
||||||
contract.public = true;
|
changeContract(contract){
|
||||||
return Q.Promise((resolve, reject) => {
|
return Q.Promise((resolve, reject) => {
|
||||||
OwnershipFetcher.makeContractPublic(contract)
|
OwnershipFetcher.makeContractPublic(contract)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
console.log('Here is the result... ');
|
|
||||||
resolve(res);
|
resolve(res);
|
||||||
})
|
})
|
||||||
.catch((err)=> {
|
.catch((err)=> {
|
||||||
console.log('Here we have an error');
|
console.logGlobal(err);
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
removeContract(contractId){
|
||||||
|
return Q.Promise( (resolve, reject) => {
|
||||||
|
OwnershipFetcher.deleteContract(contractId)
|
||||||
|
.then((res) => {
|
||||||
|
resolve(res);
|
||||||
|
})
|
||||||
|
.catch( (err) => {
|
||||||
console.logGlobal(err);
|
console.logGlobal(err);
|
||||||
reject(err);
|
reject(err);
|
||||||
});
|
});
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import AppConstants from '../../constants/application_constants';
|
import AppConstants from '../../constants/application_constants';
|
||||||
import { getLangText } from '../../utils/lang_utils.js'
|
import { getLangText } from '../../utils/lang_utils.js';
|
||||||
|
|
||||||
let ButtonSubmitOrClose = React.createClass({
|
let ButtonSubmitOrClose = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
|
@ -9,11 +9,15 @@ import InputCheckbox from '../ascribe_forms/input_checkbox';
|
|||||||
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 ContractListActions from '../../actions/contract_list_actions';
|
||||||
|
|
||||||
import ReactS3FineUploader from '../ascribe_uploader/react_s3_fine_uploader';
|
import ReactS3FineUploader from '../ascribe_uploader/react_s3_fine_uploader';
|
||||||
|
|
||||||
import AppConstants from '../../constants/application_constants';
|
import AppConstants from '../../constants/application_constants';
|
||||||
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 { getCookie } from '../../utils/fetch_api_utils';
|
import { getCookie } from '../../utils/fetch_api_utils';
|
||||||
import { formSubmissionValidation } from '../ascribe_uploader/react_s3_fine_uploader_utils';
|
import { formSubmissionValidation } from '../ascribe_uploader/react_s3_fine_uploader_utils';
|
||||||
@ -46,8 +50,12 @@ let CreateContractForm = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
handleCreateSuccess(response) {
|
handleCreateSuccess(response) {
|
||||||
|
ContractListActions.fetchContractList();
|
||||||
let notification = new GlobalNotificationModel(getLangText('Contract %s successfully created', response.name), 'success', 5000);
|
let notification = new GlobalNotificationModel(getLangText('Contract %s successfully created', response.name), 'success', 5000);
|
||||||
GlobalNotificationActions.appendGlobalNotification(notification);
|
GlobalNotificationActions.appendGlobalNotification(notification);
|
||||||
|
|
||||||
|
// also refresh contract lists for the rest of the contract settings page
|
||||||
|
ContractListActions.fetchContractList();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -109,7 +117,7 @@ let CreateContractForm = React.createClass({
|
|||||||
label={getLangText('Contract name')}>
|
label={getLangText('Contract name')}>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="(e.g. Loan agreement #1)"
|
placeholder="(e.g. Contract - Loan agreement #1)"
|
||||||
required/>
|
required/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property
|
<Property
|
||||||
@ -118,10 +126,7 @@ let CreateContractForm = React.createClass({
|
|||||||
style={{paddingBottom: 0}}>
|
style={{paddingBottom: 0}}>
|
||||||
<InputCheckbox>
|
<InputCheckbox>
|
||||||
<span>
|
<span>
|
||||||
{' ' + getLangText('I agree to the Terms of Service') + ' '}
|
Make contract public (this will replace the current public contract)
|
||||||
(<a href="https://www.ascribe.io/terms" target="_blank" style={{fontSize: '0.9em', color: 'rgba(0,0,0,0.7)'}}>
|
|
||||||
{getLangText('read')}
|
|
||||||
</a>)
|
|
||||||
</span>
|
</span>
|
||||||
</InputCheckbox>
|
</InputCheckbox>
|
||||||
</Property>
|
</Property>
|
||||||
|
@ -12,8 +12,12 @@ let ActionPanel = React.createClass({
|
|||||||
]),
|
]),
|
||||||
buttons: React.PropTypes.element,
|
buttons: React.PropTypes.element,
|
||||||
onClick: React.PropTypes.func,
|
onClick: React.PropTypes.func,
|
||||||
ignoreFocus: React.PropTypes.bool
|
ignoreFocus: React.PropTypes.bool,
|
||||||
|
|
||||||
|
leftColumnWidth: React.PropTypes.string,
|
||||||
|
rightColumnWidth: React.PropTypes.string
|
||||||
},
|
},
|
||||||
|
|
||||||
getInitialState() {
|
getInitialState() {
|
||||||
return {
|
return {
|
||||||
isFocused: false
|
isFocused: false
|
||||||
@ -40,14 +44,21 @@ let ActionPanel = React.createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
|
||||||
|
let { leftColumnWidth, rightColumnWidth } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classnames('ascribe-panel-wrapper', {'is-focused': this.state.isFocused})}>
|
<div className={classnames('ascribe-panel-wrapper', {'is-focused': this.state.isFocused})}>
|
||||||
<div className="ascribe-panel-table">
|
<div
|
||||||
|
className="ascribe-panel-table"
|
||||||
|
style={{width: leftColumnWidth}}>
|
||||||
<div className="ascribe-panel-content">
|
<div className="ascribe-panel-content">
|
||||||
{this.props.content}
|
{this.props.content}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="ascribe-panel-table">
|
<div
|
||||||
|
className="ascribe-panel-table"
|
||||||
|
style={{width: rightColumnWidth}}>
|
||||||
<div className="ascribe-panel-content">
|
<div className="ascribe-panel-content">
|
||||||
{this.props.buttons}
|
{this.props.buttons}
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,97 +10,141 @@ import ContractListActions from '../../actions/contract_list_actions';
|
|||||||
|
|
||||||
import ActionPanel from '../ascribe_panel/action_panel';
|
import ActionPanel from '../ascribe_panel/action_panel';
|
||||||
|
|
||||||
import { getLangText } from '../../utils/lang_utils';
|
|
||||||
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';
|
||||||
|
|
||||||
let ContractSettings = React.createClass({
|
let ContractSettings = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
defaultExpanded: React.PropTypes.bool
|
defaultExpanded: React.PropTypes.bool
|
||||||
},
|
},
|
||||||
|
|
||||||
getInitialState(){
|
getInitialState(){
|
||||||
return ContractListStore.getState();
|
return ContractListStore.getState();
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
ContractListStore.listen(this.onChange);
|
ContractListStore.listen(this.onChange);
|
||||||
ContractListActions.fetchContractList();
|
ContractListActions.fetchContractList();
|
||||||
},
|
},
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
ContractListStore.unlisten(this.onChange);
|
ContractListStore.unlisten(this.onChange);
|
||||||
},
|
},
|
||||||
|
|
||||||
onChange(state) {
|
onChange(state) {
|
||||||
this.setState(state);
|
this.setState(state);
|
||||||
},
|
},
|
||||||
makeContractPublic(contract){
|
|
||||||
console.log(contract);
|
makeContractPublic(contract) {
|
||||||
ContractListActions.makeContractPublic(contract)
|
return () => {
|
||||||
.then(( ) => ContractListActions.fetchContractList())
|
contract.public = true;
|
||||||
.catch((error)=>{console.log('Error ', error);
|
ContractListActions.changeContract(contract)
|
||||||
let notification = new GlobalNotificationModel('Service is unavailable', 'danger', 10000);
|
.then(() => ContractListActions.fetchContractList())
|
||||||
GlobalNotificationActions.appendGlobalNotification(notification);
|
.catch((err) => {
|
||||||
});
|
let notification = new GlobalNotificationModel(err, 'danger', 10000);
|
||||||
|
GlobalNotificationActions.appendGlobalNotification(notification);
|
||||||
|
});
|
||||||
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
removeContract(contract) {
|
||||||
|
return () => {
|
||||||
|
ContractListActions.removeContract(contract.id)
|
||||||
|
.then(( ) => ContractListActions.fetchContractList())
|
||||||
|
.catch((err) => {
|
||||||
|
let notification = new GlobalNotificationModel(err, 'danger', 10000);
|
||||||
|
GlobalNotificationActions.appendGlobalNotification(notification);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
getPublicContracts(){
|
getPublicContracts(){
|
||||||
return this.state.contractList.filter((contract) => contract.public);
|
return this.state.contractList.filter((contract) => contract.public);
|
||||||
},
|
},
|
||||||
|
|
||||||
getPrivateContracts(){
|
getPrivateContracts(){
|
||||||
return this.state.contractList.filter((contract) => !contract.public);
|
return this.state.contractList.filter((contract) => !contract.public);
|
||||||
},
|
},
|
||||||
getblobEndName(contract){
|
|
||||||
return contract.blob.match(/.*\/(.*)/)[1];
|
|
||||||
},
|
|
||||||
render() {
|
render() {
|
||||||
let publicContracts = this.getPublicContracts();
|
let publicContracts = this.getPublicContracts();
|
||||||
let privateContracts = this.getPrivateContracts();
|
let privateContracts = this.getPrivateContracts();
|
||||||
console.log(this.state.contractList);
|
|
||||||
return (
|
return (
|
||||||
<CollapsibleParagraph
|
<CollapsibleParagraph
|
||||||
title={getLangText('Contract Settings')}
|
title={getLangText('Contract Settings')}
|
||||||
show={true}
|
show={true}
|
||||||
defaultExpanded={false}>
|
defaultExpanded={true}>
|
||||||
{/* this should be this.props.defaultExpanded */}
|
|
||||||
<CollapsibleParagraph
|
<CollapsibleParagraph
|
||||||
title={getLangText('List Contracts')}
|
title={getLangText('List Contracts')}
|
||||||
show={true}
|
show={true}
|
||||||
defaultExpanded={false}>
|
defaultExpanded={true}>
|
||||||
{<div>
|
<CollapsibleParagraph
|
||||||
<p>Public Contracts</p>
|
title={getLangText('Public Contracts')}
|
||||||
{(publicContracts.length > 0) ?
|
show={true}
|
||||||
publicContracts.map(
|
defaultExpanded={true}>
|
||||||
(contract) => {
|
{publicContracts.map((contract, i) => {
|
||||||
return (
|
return (
|
||||||
<ActionPanel title = {contract.name}
|
<ActionPanel
|
||||||
content = {this.getblobEndName(contract)}
|
key={i}
|
||||||
buttons = {<span>
|
title={contract.name}
|
||||||
<button className="btn btn-default btn-sm margin-left-2px">UPDATE</button>
|
content={contract.name}
|
||||||
<button className="btn btn-default btn-sm margin-left-2px">REMOVE</button>
|
buttons={
|
||||||
</span>}
|
<div className="pull-right">
|
||||||
/>);
|
<button className="btn btn-default btn-sm margin-left-2px">
|
||||||
}
|
UPDATE
|
||||||
) : null }
|
</button>
|
||||||
</div>}
|
<button
|
||||||
|
className="btn btn-default btn-sm margin-left-2px"
|
||||||
{<div>
|
onClick={this.removeContract(contract)}>
|
||||||
<p>Private Contracts</p>
|
REMOVE
|
||||||
{(privateContracts.length > 0) ?
|
</button>
|
||||||
privateContracts.map(
|
</div>
|
||||||
(contract) => {
|
}
|
||||||
|
leftColumnWidth="40%"
|
||||||
|
rightColumnWidth="60%"/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</CollapsibleParagraph>
|
||||||
|
<CollapsibleParagraph
|
||||||
|
title={getLangText('Private Contracts')}
|
||||||
|
show={true}
|
||||||
|
defaultExpanded={true}>
|
||||||
|
{privateContracts.map((contract, i) => {
|
||||||
return (
|
return (
|
||||||
<ActionPanel title = {contract.name}
|
<ActionPanel
|
||||||
content = {this.getblobEndName(contract)}
|
key={i}
|
||||||
buttons = {<span> <button className="btn btn-default btn-sm margin-left-2px">UPDATE</button>
|
title={contract.name}
|
||||||
<button className="btn btn-default btn-sm margin-left-2px" >REMOVE</button>
|
content={contract.name}
|
||||||
<button className="btn btn-default btn-sm margin-left-2px"
|
buttons={
|
||||||
onClick={this.makeContractPublic.bind(this, contract)}>MAKE PUBLIC</button> </span>}
|
<div className="pull-right">
|
||||||
/>);
|
<button className="btn btn-default btn-sm margin-left-2px">
|
||||||
}
|
UPDATE
|
||||||
) : null}
|
</button>
|
||||||
</div>}
|
<button
|
||||||
|
className="btn btn-default btn-sm margin-left-2px"
|
||||||
|
onClick={this.removeContract(contract)}>
|
||||||
|
REMOVE
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className="btn btn-default btn-sm margin-left-2px"
|
||||||
|
onClick={this.makeContractPublic(contract)}>
|
||||||
|
MAKE PUBLIC
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
leftColumnWidth="40%"
|
||||||
|
rightColumnWidth="60%"/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</CollapsibleParagraph>
|
||||||
</CollapsibleParagraph>
|
</CollapsibleParagraph>
|
||||||
<CollapsibleParagraph
|
<CollapsibleParagraph
|
||||||
title={getLangText('Create Contract')}
|
title={getLangText('Create Contract')}
|
||||||
show={true}
|
show={true}
|
||||||
defaultExpanded={false}>
|
defaultExpanded={true}>
|
||||||
<CreateContractForm />
|
<CreateContractForm />
|
||||||
</CollapsibleParagraph>
|
</CollapsibleParagraph>
|
||||||
</CollapsibleParagraph>
|
</CollapsibleParagraph>
|
||||||
|
@ -54,7 +54,7 @@ let ApiUrls = {
|
|||||||
'ownership_unconsigns': AppConstants.apiEndpoint + 'ownership/unconsigns/',
|
'ownership_unconsigns': AppConstants.apiEndpoint + 'ownership/unconsigns/',
|
||||||
'ownership_unconsigns_deny': AppConstants.apiEndpoint + 'ownership/unconsigns/deny/',
|
'ownership_unconsigns_deny': AppConstants.apiEndpoint + 'ownership/unconsigns/deny/',
|
||||||
'ownership_unconsigns_request': AppConstants.apiEndpoint + 'ownership/unconsigns/request/',
|
'ownership_unconsigns_request': AppConstants.apiEndpoint + 'ownership/unconsigns/request/',
|
||||||
'ownership_contract': AppConstants.apiEndpoint + 'ownership/contracts/${contract_id}',
|
'ownership_contract': AppConstants.apiEndpoint + 'ownership/contracts/${contract_id}/',
|
||||||
'ownership_contract_list': AppConstants.apiEndpoint + 'ownership/contracts/',
|
'ownership_contract_list': AppConstants.apiEndpoint + 'ownership/contracts/',
|
||||||
'piece': AppConstants.apiEndpoint + 'pieces/${piece_id}/',
|
'piece': AppConstants.apiEndpoint + 'pieces/${piece_id}/',
|
||||||
'piece_extradata': AppConstants.apiEndpoint + 'pieces/${piece_id}/extradata/',
|
'piece_extradata': AppConstants.apiEndpoint + 'pieces/${piece_id}/extradata/',
|
||||||
|
@ -25,6 +25,10 @@ let OwnershipFetcher = {
|
|||||||
|
|
||||||
makeContractPublic(contractObj){
|
makeContractPublic(contractObj){
|
||||||
return requests.put('ownership_contract', { body: contractObj, contract_id: contractObj.id });
|
return requests.put('ownership_contract', { body: contractObj, contract_id: contractObj.id });
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteContract(contractObjId){
|
||||||
|
return requests.delete(ApiUrls.ownership_contract, {contract_id: contractObjId});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,19 +52,6 @@ export function sumNumList(l) {
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function excludePropFromObject(obj, propList){
|
|
||||||
let clonedObj = mergeOptions({},obj);
|
|
||||||
for (let item in propList){
|
|
||||||
console.log(item);
|
|
||||||
if (clonedObj[propList[item]]){
|
|
||||||
console.log('deleting... ');
|
|
||||||
delete clonedObj[propList[item]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(clonedObj);
|
|
||||||
return clonedObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Taken from http://stackoverflow.com/a/4795914/1263876
|
Taken from http://stackoverflow.com/a/4795914/1263876
|
||||||
Behaves like C's format string function
|
Behaves like C's format string function
|
||||||
@ -207,4 +194,14 @@ function _mergeOptions(obj1, obj2) {
|
|||||||
*/
|
*/
|
||||||
export function escapeHTML(s) {
|
export function escapeHTML(s) {
|
||||||
return document.createElement('div').appendChild(document.createTextNode(s)).parentNode.innerHTML;
|
return document.createElement('div').appendChild(document.createTextNode(s)).parentNode.innerHTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function excludePropFromObject(obj, propList){
|
||||||
|
let clonedObj = mergeOptions({}, obj);
|
||||||
|
for (let item in propList){
|
||||||
|
if (clonedObj[propList[item]]){
|
||||||
|
delete clonedObj[propList[item]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return clonedObj;
|
||||||
}
|
}
|
@ -33,7 +33,7 @@ class Requests {
|
|||||||
// If this is the case, we can not try to parse it as JSON.
|
// If this is the case, we can not try to parse it as JSON.
|
||||||
if(responseText !== 'None') {
|
if(responseText !== 'None') {
|
||||||
let body = JSON.parse(responseText);
|
let body = JSON.parse(responseText);
|
||||||
|
|
||||||
if(body && body.errors) {
|
if(body && body.errors) {
|
||||||
let error = new Error('Form Error');
|
let error = new Error('Form Error');
|
||||||
error.json = body;
|
error.json = body;
|
||||||
@ -119,7 +119,9 @@ class Requests {
|
|||||||
|
|
||||||
return fetch(url, merged)
|
return fetch(url, merged)
|
||||||
.then(this.unpackResponse)
|
.then(this.unpackResponse)
|
||||||
.catch(this.handleError);
|
.catch( () => {
|
||||||
|
this.handleError();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
get(url, params) {
|
get(url, params) {
|
||||||
@ -134,28 +136,28 @@ class Requests {
|
|||||||
delete(url, params) {
|
delete(url, params) {
|
||||||
let paramsCopy = this._merge(params);
|
let paramsCopy = this._merge(params);
|
||||||
let newUrl = this.prepareUrl(url, paramsCopy, true);
|
let newUrl = this.prepareUrl(url, paramsCopy, true);
|
||||||
|
|
||||||
return this.request('delete', newUrl);
|
return this.request('delete', newUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
_putOrPost(url, paramsAndBody, method){
|
_putOrPost(url, paramsAndBody, method){
|
||||||
let paramsCopy = this._merge(paramsAndBody);
|
let paramsCopy = this._merge(paramsAndBody);
|
||||||
let params = excludePropFromObject(paramsAndBody,['body']);
|
let params = excludePropFromObject(paramsAndBody, ['body']);
|
||||||
|
|
||||||
let newUrl = this.prepareUrl(url, params);
|
let newUrl = this.prepareUrl(url, params);
|
||||||
let body = null;
|
let body = null;
|
||||||
if (paramsCopy && paramsCopy.body) {
|
if (paramsCopy && paramsCopy.body) {
|
||||||
console.log(paramsCopy.body);
|
|
||||||
body = JSON.stringify(paramsCopy.body);
|
body = JSON.stringify(paramsCopy.body);
|
||||||
}
|
}
|
||||||
return this.request(method, newUrl, { body });
|
return this.request(method, newUrl, { body });
|
||||||
}
|
}
|
||||||
|
|
||||||
post(url, params) {
|
post(url, params) {
|
||||||
return this._putOrPost(url,params,'post')
|
return this._putOrPost(url, params, 'post');
|
||||||
}
|
}
|
||||||
|
|
||||||
put(url, params){
|
put(url, params){
|
||||||
return this._putOrPost(url,params,'put')
|
return this._putOrPost(url, params, 'put');
|
||||||
}
|
}
|
||||||
|
|
||||||
defaults(options) {
|
defaults(options) {
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
/* Shrink the size of the headline for a nested element */
|
/* Shrink the size of the headline for a nested element */
|
||||||
.ascribe-collapsible-wrapper > div:first-child {
|
.ascribe-collapsible-wrapper > .ascribe-collapsible-content {
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
font-size: 90%;
|
font-size: 95%;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user