import React from 'react'; import { Form, Input, Card, Icon, Alert, Checkbox, Button, Tooltip } from 'antd'; import { ProposalDraft, CreateMilestone } from 'types'; import { getCreateErrors } from 'modules/create/utils'; interface State { milestones: ProposalDraft['milestones']; } interface Props { initialState: Partial; updateForm(form: Partial): void; } const DEFAULT_STATE: State = { milestones: [ { title: '', content: '', daysEstimated: '', payoutPercent: '', immediatePayout: false, }, ], }; export default class CreateFlowMilestones extends React.Component { constructor(props: Props) { super(props); this.state = { ...DEFAULT_STATE, ...(props.initialState || {}), }; // Don't allow for empty milestones array if (!this.state.milestones.length) { this.state = { ...this.state, milestones: [...DEFAULT_STATE.milestones], }; } } handleMilestoneChange = (index: number, milestone: CreateMilestone) => { const milestones = [...this.state.milestones]; milestones[index] = milestone; this.setState({ milestones }, () => { this.props.updateForm(this.state); }); }; addMilestone = () => { const { milestones: oldMilestones } = this.state; const milestones = [...oldMilestones, { ...DEFAULT_STATE.milestones[0] }]; this.setState({ milestones }); }; removeMilestone = (index: number) => { let milestones = this.state.milestones.filter((_, i) => i !== index); if (milestones.length === 0) { milestones = [...DEFAULT_STATE.milestones]; } this.setState({ milestones }, () => { this.props.updateForm(this.state); }); }; render() { const { milestones } = this.state; const errors = getCreateErrors(this.state, true); return (
{milestones.map((milestone, idx) => ( ))} {milestones.length < 10 && ( )} ); } } interface MilestoneFieldsProps { index: number; milestone: CreateMilestone; // previousMilestoneDateEstimate: moment.Moment | undefined; error: Falsy | string; onChange(index: number, milestone: CreateMilestone): void; onRemove(index: number): void; } const MilestoneFields = ({ index, milestone, error, onChange, onRemove, }: MilestoneFieldsProps) => (
onChange(index, { ...milestone, title: ev.currentTarget.value })} maxLength={80} />
onChange(index, { ...milestone, content: ev.currentTarget.value }) } maxLength={255} />
{ return onChange(index, { ...milestone, daysEstimated: ev.currentTarget.value, }); }} addonAfter="days" style={{ flex: 1, marginRight: '0.5rem' }} maxLength={6} /> onChange(index, { ...milestone, payoutPercent: ev.currentTarget.value, }) } addonAfter="%" style={{ maxWidth: '120px', width: '100%' }} maxLength={6} /> {index === 0 && (
onChange(index, { ...milestone, immediatePayout: ev.target.checked, }) } > Payout Immediately
)}
{error && ( )}
);