Proposal deadlines (#28)

* add proposal versioning

* remove deadlines

* remove acceptedWithFunding

* fix lint, remove commented code

* refactor backend to provide isVersionTwo

* refactor backend to provide isVersionTwo

* Revert "refactor backend to provide isVersionTwo"

This reverts commit e3b9bc661081e482326f83fa6aa517cf6bdebe6c.

* trigger ci

* remove "version"
This commit is contained in:
Daniel Ternyak 2019-10-11 14:52:52 -05:00 committed by GitHub
parent 746398c59b
commit 701a2f95a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 7 additions and 54 deletions

View File

@ -234,7 +234,7 @@ class Proposal(db.Model):
# Payment info # Payment info
target = db.Column(db.String(255), nullable=False) target = db.Column(db.String(255), nullable=False)
payout_address = db.Column(db.String(255), nullable=False) payout_address = db.Column(db.String(255), nullable=False)
deadline_duration = db.Column(db.Integer(), nullable=False) deadline_duration = db.Column(db.Integer(), nullable=True)
contribution_matching = db.Column(db.Float(), nullable=False, default=0, server_default=db.text("0")) contribution_matching = db.Column(db.Float(), nullable=False, default=0, server_default=db.text("0"))
contribution_bounty = db.Column(db.String(255), nullable=False, default='0', server_default=db.text("'0'")) contribution_bounty = db.Column(db.String(255), nullable=False, default='0', server_default=db.text("'0'"))
rfp_opt_in = db.Column(db.Boolean(), nullable=True) rfp_opt_in = db.Column(db.Boolean(), nullable=True)

View File

@ -228,7 +228,6 @@ def get_proposal_drafts():
"content": fields.Str(required=True), "content": fields.Str(required=True),
"target": fields.Str(required=True), "target": fields.Str(required=True),
"payoutAddress": fields.Str(required=True), "payoutAddress": fields.Str(required=True),
"deadlineDuration": fields.Int(required=True),
"milestones": fields.List(fields.Dict(), required=True), "milestones": fields.List(fields.Dict(), required=True),
"rfpOptIn": fields.Bool(required=False, missing=None), "rfpOptIn": fields.Bool(required=False, missing=None),
}) })

View File

@ -1,14 +1,11 @@
import React from 'react'; import React from 'react';
import { Input, Form, Radio } from 'antd'; import { Input, Form } from 'antd';
import { RadioChangeEvent } from 'antd/lib/radio';
import { ProposalDraft } from 'types'; import { ProposalDraft } from 'types';
import { getCreateErrors } from 'modules/create/utils'; import { getCreateErrors } from 'modules/create/utils';
import { ONE_DAY } from 'utils/time';
import { DONATION } from 'utils/constants'; import { DONATION } from 'utils/constants';
interface State { interface State {
payoutAddress: string; payoutAddress: string;
deadlineDuration: number;
} }
interface Props { interface Props {
@ -21,13 +18,12 @@ export default class CreateFlowPayment extends React.Component<Props, State> {
super(props); super(props);
this.state = { this.state = {
payoutAddress: '', payoutAddress: '',
deadlineDuration: ONE_DAY * 60,
...(props.initialState || {}), ...(props.initialState || {}),
}; };
} }
render() { render() {
const { payoutAddress, deadlineDuration } = this.state; const { payoutAddress } = this.state;
const errors = getCreateErrors(this.state, true); const errors = getCreateErrors(this.state, true);
const payoutHelp = const payoutHelp =
errors.payoutAddress || errors.payoutAddress ||
@ -52,31 +48,6 @@ export default class CreateFlowPayment extends React.Component<Props, State> {
onChange={this.handleInputChange} onChange={this.handleInputChange}
/> />
</Form.Item> </Form.Item>
<Form.Item label="Funding Deadline">
<Radio.Group
name="deadlineDuration"
value={deadlineDuration}
onChange={this.handleRadioChange}
size="large"
style={{ display: 'flex', textAlign: 'center' }}
>
{deadlineDuration === 300 && (
<Radio.Button style={{ flex: 1 }} value={300}>
5 minutes
</Radio.Button>
)}
<Radio.Button style={{ flex: 1 }} value={ONE_DAY * 30}>
30 Days
</Radio.Button>
<Radio.Button style={{ flex: 1 }} value={ONE_DAY * 60}>
60 Days
</Radio.Button>
<Radio.Button style={{ flex: 1 }} value={ONE_DAY * 90}>
90 Days
</Radio.Button>
</Radio.Group>
</Form.Item>
</Form> </Form>
); );
} }
@ -89,11 +60,4 @@ export default class CreateFlowPayment extends React.Component<Props, State> {
this.props.updateForm(this.state); this.props.updateForm(this.state);
}); });
}; };
private handleRadioChange = (event: RadioChangeEvent) => {
const { value, name } = event.target;
this.setState({ [name as string]: value } as any, () => {
this.props.updateForm(this.state);
});
};
} }

View File

@ -118,13 +118,6 @@ class CreateReview extends React.Component<Props> {
content: <code>{form.payoutAddress}</code>, content: <code>{form.payoutAddress}</code>,
error: errors.payoutAddress, error: errors.payoutAddress,
}, },
{
key: 'deadlineDuration',
content: `${Math.floor(
moment.duration((form.deadlineDuration || 0) * 1000).asDays(),
)} days`,
error: errors.deadlineDuration,
},
], ],
}, },
]; ];

View File

@ -47,7 +47,6 @@ const createExampleProposal = (): Partial<ProposalDraft> => {
immediatePayout: false, immediatePayout: false,
}, },
], ],
deadlineDuration: 300,
}; };
}; };

View File

@ -54,7 +54,9 @@ export class ProposalCampaignBlock extends React.Component<Props, State> {
const { target, funded, percentFunded } = proposal; const { target, funded, percentFunded } = proposal;
const datePublished = proposal.datePublished || Date.now() / 1000; const datePublished = proposal.datePublished || Date.now() / 1000;
const isRaiseGoalReached = funded.gte(target); const isRaiseGoalReached = funded.gte(target);
const deadline = (datePublished + proposal.deadlineDuration) * 1000; const deadline = proposal.deadlineDuration
? (datePublished + proposal.deadlineDuration) * 1000
: 0;
const isFrozen = const isFrozen =
proposal.stage === PROPOSAL_STAGE.FAILED || proposal.stage === PROPOSAL_STAGE.FAILED ||
proposal.stage === PROPOSAL_STAGE.CANCELED; proposal.stage === PROPOSAL_STAGE.CANCELED;

View File

@ -30,7 +30,6 @@ interface CreateFormErrors {
content?: string; content?: string;
payoutAddress?: string; payoutAddress?: string;
milestones?: string[]; milestones?: string[];
deadlineDuration?: string;
} }
export type KeyOfForm = keyof CreateFormErrors; export type KeyOfForm = keyof CreateFormErrors;
@ -44,7 +43,6 @@ export const FIELD_NAME_MAP: { [key in KeyOfForm]: string } = {
content: 'Details', content: 'Details',
payoutAddress: 'Payout address', payoutAddress: 'Payout address',
milestones: 'Milestones', milestones: 'Milestones',
deadlineDuration: 'Funding deadline',
}; };
const requiredFields = [ const requiredFields = [
@ -54,7 +52,6 @@ const requiredFields = [
'target', 'target',
'content', 'content',
'payoutAddress', 'payoutAddress',
'deadlineDuration',
]; ];
export function getCreateErrors( export function getCreateErrors(
@ -240,7 +237,6 @@ export function makeProposalPreviewFromDraft(draft: ProposalDraft): ProposalDeta
dateCreated: Date.now() / 1000, dateCreated: Date.now() / 1000,
datePublished: Date.now() / 1000, datePublished: Date.now() / 1000,
dateApproved: Date.now() / 1000, dateApproved: Date.now() / 1000,
deadlineDuration: 86400 * 60,
target: toZat(draft.target), target: toZat(draft.target),
funded: Zat('0'), funded: Zat('0'),
contributionMatching: 0, contributionMatching: 0,

View File

@ -39,12 +39,12 @@ export interface ProposalDraft {
stage: PROPOSAL_STAGE; stage: PROPOSAL_STAGE;
target: string; target: string;
payoutAddress: string; payoutAddress: string;
deadlineDuration: number;
milestones: CreateMilestone[]; milestones: CreateMilestone[];
team: User[]; team: User[];
invites: TeamInvite[]; invites: TeamInvite[];
status: STATUS; status: STATUS;
isStaked: boolean; isStaked: boolean;
deadlineDuration?: number;
rfp?: RFP; rfp?: RFP;
rfpOptIn?: boolean; rfpOptIn?: boolean;
} }