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:
parent
746398c59b
commit
701a2f95a9
|
@ -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)
|
||||||
|
|
|
@ -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),
|
||||||
})
|
})
|
||||||
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
|
@ -47,7 +47,6 @@ const createExampleProposal = (): Partial<ProposalDraft> => {
|
||||||
immediatePayout: false,
|
immediatePayout: false,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
deadlineDuration: 300,
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue