diff --git a/backend/grant/proposal/views.py b/backend/grant/proposal/views.py index 478b72b9..ebda9083 100644 --- a/backend/grant/proposal/views.py +++ b/backend/grant/proposal/views.py @@ -378,6 +378,10 @@ def post_proposal_update(proposal_id, title, content): "address": fields.Str(required=True, validate=validate.Length(max=255)), }) def post_proposal_team_invite(proposal_id, address): + for u in g.current_proposal.team: + if address == u.email_address: + return {"message": f"Cannot invite members already on the team"}, 400 + existing_invite = ProposalTeamInvite.query.filter_by( proposal_id=proposal_id, address=address diff --git a/frontend/client/components/Profile/ProfileInvite.less b/frontend/client/components/Profile/ProfileInvite.less index 22c82983..e125a882 100644 --- a/frontend/client/components/Profile/ProfileInvite.less +++ b/frontend/client/components/Profile/ProfileInvite.less @@ -7,6 +7,9 @@ margin-bottom: 1rem; &-info { + min-width: 0; + padding-right: 2rem; + &-title { font-size: 1.2rem; font-weight: 600; diff --git a/frontend/client/styles/antd-overrides.less b/frontend/client/styles/antd-overrides.less index b57ba7a1..e67a80a3 100644 --- a/frontend/client/styles/antd-overrides.less +++ b/frontend/client/styles/antd-overrides.less @@ -16,3 +16,20 @@ div.antd-pro-ellipsis-ellipsis { word-break: break-word; } + +// List items with long content can push the actions aside +.ant-list-item { + overflow: hidden; + + .ant-list-item-content, + .ant-list-item-meta, + .ant-list-item-meta-content { + min-width: 0; + } + + .ant-list-item-meta-title, + .ant-list-item-meta-description { + overflow: hidden; + text-overflow: ellipsis; + } +} \ No newline at end of file diff --git a/frontend/client/utils/api.ts b/frontend/client/utils/api.ts index 0d0f4a89..984d1ffa 100644 --- a/frontend/client/utils/api.ts +++ b/frontend/client/utils/api.ts @@ -149,6 +149,10 @@ export function massageSerializedState(state: AppState) { ); state.proposal.detail.contributionBounty = new BN((state.proposal.detail .contributionBounty as any) as string); + state.proposal.detail.milestones = state.proposal.detail.milestones.map(m => ({ + ...m, + amount: new BN((m.amount as any) as string, 16), + })); if (state.proposal.detail.rfp && state.proposal.detail.rfp.bounty) { state.proposal.detail.rfp.bounty = new BN( (state.proposal.detail.rfp.bounty as any) as string,