CCRs (#86)
* CCRs API / Models boilerplate
* start on frontend
* backendy things
* Create CCR redux module, integrate API endpoints, create types
* Fix/Cleanup API
* Wire up CreateRequestDraftList
* bounty->target
* Add 'Create Request Flow' MVP
* cleanup
* Tweak filenames
* Simplify migrations
* fix migrations
* CCR Staking MVP
* tslint
* Get Pending Requests into Profile
* Remove staking requirement
* more staking related removals
* MVP Admin integration
* Make RFP when CCR is accepted
* Add pagination to CCRs in Admin
Improve styles for Proposals
* Hookup notifications
Adjust copy
* Simplify ccr->rfp relationship
Add admin approval email
Fixup copy
* Show Message on RFP Detail
Make Header CTAs change based on draft status
Adjust proposal card style
* Bugfix: Show header for non signed in users
* Add 'create a request' to intro
* Profile Created CCRs
RFP CCR attribution
* ignore
* CCR Price in USD (#85)
* init profile tipjar backend
* init profile tipjar frontend
* fix lint
* implement tip jar block
* fix wrapping, hide tip block on self
* init backend proposal tipjar
* init frontend proposal tipjar
* add hide title, fix bug
* uncomment rate limit
* rename vars, use null check
* allow address and view key to be unset
* add api tests
* fix tsc errors
* fix lint
* fix CopyInput styling
* fix migrations
* hide tipping in proposal if address not set
* add tip address to create flow
* redesign campaign block
* fix typo
* init backend changes
* init admin changes
* init frontend changes
* fix backend tests
* update campaign block
* be - init rfp usd changes
* admin - init rfp usd changes
* fe - fully adapt api util functions to usd
* fe - init rfp usd changes
* adapt profile created to usd
* misc usd changes
* add tip jar to dedicated card
* fix tipjar bug
* use zf light logo
* switch to zf grants logo
* hide profile tip jar if address not set
* add comment, run prettier
* conditionally add info icon and tooltip to funding line
* admin - disallow decimals in RFPs
* fe - cover usd string edge case
* add Usd as rfp bounty type
* fix migration order
* fix email bug
* adapt CCRs to USD
* implement CCR preview
* fix tsc
* Copy Updates and UX Tweaks (#87)
* Add default structure to proposal content
* Landing page copy
* Hide contributors tab for v2 proposals
* Minor UX tweaks for Liking/Following/Tipping
* Copy for Tipping Tooltip, proposal explainer for review, and milestone day estimate notice.
* Fix header styles bug and remove commented out styles.
* Revert "like" / "unfollow" hyphenication
* Comment out unused tests related to staking
Increase PROPOSAL_TARGET_MAX in .env.example
* Comment out ccr approval email send until ready
* Adjust styles, copy.
* fix proposal prune test (#88)
* fix USD display in preview, fix non-unique key (#90)
* Pre-stepper explainer for CCRs.
* Tweak styles
* Default content for CCRs
* fix tsc
* CCR approval and rejection emails
* add back admin_approval_ccr email templates
* Link ccr author name to profile in RFPs
* copy tweaks
* copy tweak
* hookup mangle user command
* Fix/add endif in jinja
* fix tests
* review
* fix review
2019-12-05 17:01:02 -08:00
|
|
|
import React from 'react';
|
|
|
|
import { connect } from 'react-redux';
|
|
|
|
import { Link } from 'react-router-dom';
|
|
|
|
import { Button, Divider, List, message, Popconfirm, Spin } from 'antd';
|
|
|
|
import Placeholder from 'components/Placeholder';
|
|
|
|
import { getIsVerified } from 'modules/auth/selectors';
|
|
|
|
import Loader from 'components/Loader';
|
|
|
|
import { CCRDraft, CCRSTATUS } from 'types';
|
|
|
|
import {
|
|
|
|
createCCRDraft,
|
|
|
|
deleteCCRDraft,
|
|
|
|
fetchAndCreateCCRDrafts,
|
|
|
|
} from 'modules/ccr/actions';
|
|
|
|
import { AppState } from 'store/reducers';
|
|
|
|
import './style.less';
|
|
|
|
|
|
|
|
interface StateProps {
|
|
|
|
drafts: AppState['ccr']['drafts'];
|
|
|
|
isFetchingDrafts: AppState['ccr']['isFetchingDrafts'];
|
|
|
|
fetchDraftsError: AppState['ccr']['fetchDraftsError'];
|
|
|
|
isCreatingDraft: AppState['ccr']['isCreatingDraft'];
|
|
|
|
createDraftError: AppState['ccr']['createDraftError'];
|
|
|
|
isDeletingDraft: AppState['ccr']['isDeletingDraft'];
|
|
|
|
deleteDraftError: AppState['ccr']['deleteDraftError'];
|
|
|
|
isVerified: ReturnType<typeof getIsVerified>;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface DispatchProps {
|
|
|
|
createCCRDraft: typeof createCCRDraft;
|
|
|
|
deleteCCRDraft: typeof deleteCCRDraft;
|
|
|
|
fetchAndCreateCCRDrafts: typeof fetchAndCreateCCRDrafts;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface OwnProps {
|
|
|
|
createIfNone?: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
type Props = StateProps & DispatchProps & OwnProps;
|
|
|
|
|
|
|
|
interface State {
|
|
|
|
deletingId: number | null;
|
|
|
|
}
|
|
|
|
|
|
|
|
class CCRDraftList extends React.Component<Props, State> {
|
|
|
|
state: State = {
|
|
|
|
deletingId: null,
|
|
|
|
};
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
|
|
this.props.fetchAndCreateCCRDrafts();
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidUpdate(prevProps: Props) {
|
|
|
|
const { isDeletingDraft, deleteDraftError, createDraftError } = this.props;
|
|
|
|
if (prevProps.isDeletingDraft && !isDeletingDraft) {
|
|
|
|
this.setState({ deletingId: null });
|
|
|
|
}
|
|
|
|
if (deleteDraftError && prevProps.deleteDraftError !== deleteDraftError) {
|
|
|
|
message.error(deleteDraftError, 3);
|
|
|
|
}
|
|
|
|
if (createDraftError && prevProps.createDraftError !== createDraftError) {
|
|
|
|
message.error(createDraftError, 3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const { drafts, isCreatingDraft, isFetchingDrafts, isVerified } = this.props;
|
|
|
|
const { deletingId } = this.state;
|
|
|
|
|
|
|
|
if (!isVerified) {
|
|
|
|
return (
|
|
|
|
<div className="CreateRequestDraftList">
|
|
|
|
<Placeholder
|
|
|
|
title="Your email is not verified"
|
|
|
|
subtitle="Please confirm your email before creating a request."
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!drafts || isCreatingDraft) {
|
|
|
|
return <Loader size="large" />;
|
|
|
|
}
|
|
|
|
|
|
|
|
let draftsEl;
|
|
|
|
if (drafts.length) {
|
|
|
|
draftsEl = (
|
|
|
|
<List
|
|
|
|
itemLayout="horizontal"
|
|
|
|
dataSource={drafts}
|
|
|
|
loading={isFetchingDrafts}
|
|
|
|
renderItem={(d: CCRDraft) => {
|
|
|
|
const actions = [
|
|
|
|
<Link key="edit" to={`/ccrs/${d.ccrId}/edit`}>
|
|
|
|
Edit
|
|
|
|
</Link>,
|
|
|
|
<Popconfirm
|
|
|
|
key="delete"
|
|
|
|
title="Are you sure?"
|
|
|
|
onConfirm={() => this.deleteDraft(d.ccrId)}
|
|
|
|
>
|
|
|
|
<a>Delete</a>
|
|
|
|
</Popconfirm>,
|
|
|
|
];
|
|
|
|
return (
|
|
|
|
<Spin tip="deleting..." spinning={deletingId === d.ccrId}>
|
|
|
|
<List.Item actions={actions}>
|
|
|
|
<List.Item.Meta
|
|
|
|
title={
|
|
|
|
<>
|
|
|
|
{d.title || <em>Untitled Request</em>}
|
2019-12-10 10:15:28 -08:00
|
|
|
{d.status === CCRSTATUS.REJECTED && <em> (changes requested)</em>}
|
CCRs (#86)
* CCRs API / Models boilerplate
* start on frontend
* backendy things
* Create CCR redux module, integrate API endpoints, create types
* Fix/Cleanup API
* Wire up CreateRequestDraftList
* bounty->target
* Add 'Create Request Flow' MVP
* cleanup
* Tweak filenames
* Simplify migrations
* fix migrations
* CCR Staking MVP
* tslint
* Get Pending Requests into Profile
* Remove staking requirement
* more staking related removals
* MVP Admin integration
* Make RFP when CCR is accepted
* Add pagination to CCRs in Admin
Improve styles for Proposals
* Hookup notifications
Adjust copy
* Simplify ccr->rfp relationship
Add admin approval email
Fixup copy
* Show Message on RFP Detail
Make Header CTAs change based on draft status
Adjust proposal card style
* Bugfix: Show header for non signed in users
* Add 'create a request' to intro
* Profile Created CCRs
RFP CCR attribution
* ignore
* CCR Price in USD (#85)
* init profile tipjar backend
* init profile tipjar frontend
* fix lint
* implement tip jar block
* fix wrapping, hide tip block on self
* init backend proposal tipjar
* init frontend proposal tipjar
* add hide title, fix bug
* uncomment rate limit
* rename vars, use null check
* allow address and view key to be unset
* add api tests
* fix tsc errors
* fix lint
* fix CopyInput styling
* fix migrations
* hide tipping in proposal if address not set
* add tip address to create flow
* redesign campaign block
* fix typo
* init backend changes
* init admin changes
* init frontend changes
* fix backend tests
* update campaign block
* be - init rfp usd changes
* admin - init rfp usd changes
* fe - fully adapt api util functions to usd
* fe - init rfp usd changes
* adapt profile created to usd
* misc usd changes
* add tip jar to dedicated card
* fix tipjar bug
* use zf light logo
* switch to zf grants logo
* hide profile tip jar if address not set
* add comment, run prettier
* conditionally add info icon and tooltip to funding line
* admin - disallow decimals in RFPs
* fe - cover usd string edge case
* add Usd as rfp bounty type
* fix migration order
* fix email bug
* adapt CCRs to USD
* implement CCR preview
* fix tsc
* Copy Updates and UX Tweaks (#87)
* Add default structure to proposal content
* Landing page copy
* Hide contributors tab for v2 proposals
* Minor UX tweaks for Liking/Following/Tipping
* Copy for Tipping Tooltip, proposal explainer for review, and milestone day estimate notice.
* Fix header styles bug and remove commented out styles.
* Revert "like" / "unfollow" hyphenication
* Comment out unused tests related to staking
Increase PROPOSAL_TARGET_MAX in .env.example
* Comment out ccr approval email send until ready
* Adjust styles, copy.
* fix proposal prune test (#88)
* fix USD display in preview, fix non-unique key (#90)
* Pre-stepper explainer for CCRs.
* Tweak styles
* Default content for CCRs
* fix tsc
* CCR approval and rejection emails
* add back admin_approval_ccr email templates
* Link ccr author name to profile in RFPs
* copy tweaks
* copy tweak
* hookup mangle user command
* Fix/add endif in jinja
* fix tests
* review
* fix review
2019-12-05 17:01:02 -08:00
|
|
|
</>
|
|
|
|
}
|
|
|
|
description={d.brief || <em>No description</em>}
|
|
|
|
/>
|
|
|
|
</List.Item>
|
|
|
|
</Spin>
|
|
|
|
);
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
draftsEl = (
|
|
|
|
<Placeholder
|
|
|
|
title="You have no drafts"
|
|
|
|
subtitle="Why not make one now? Click below to start."
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="CreateRequestDraftList">
|
|
|
|
<h2 className="CreateRequestDraftList-title">Your Request Drafts</h2>
|
|
|
|
{draftsEl}
|
|
|
|
<Divider>or</Divider>
|
|
|
|
<Button
|
|
|
|
className="CreateRequestDraftList-create"
|
|
|
|
type="primary"
|
|
|
|
size="large"
|
|
|
|
block
|
|
|
|
onClick={() => this.createDraft()}
|
|
|
|
loading={isCreatingDraft}
|
|
|
|
>
|
|
|
|
Create a new Request
|
|
|
|
</Button>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private createDraft = () => {
|
|
|
|
this.props.createCCRDraft();
|
|
|
|
};
|
|
|
|
|
|
|
|
private deleteDraft = (ccrId: number) => {
|
|
|
|
this.props.deleteCCRDraft(ccrId);
|
|
|
|
this.setState({ deletingId: ccrId });
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export default connect<StateProps, DispatchProps, OwnProps, AppState>(
|
|
|
|
state => ({
|
|
|
|
drafts: state.ccr.drafts,
|
|
|
|
isFetchingDrafts: state.ccr.isFetchingDrafts,
|
|
|
|
fetchDraftsError: state.ccr.fetchDraftsError,
|
|
|
|
isCreatingDraft: state.ccr.isCreatingDraft,
|
|
|
|
createDraftError: state.ccr.createDraftError,
|
|
|
|
isDeletingDraft: state.ccr.isDeletingDraft,
|
|
|
|
deleteDraftError: state.ccr.deleteDraftError,
|
|
|
|
isVerified: getIsVerified(state),
|
|
|
|
}),
|
|
|
|
{
|
|
|
|
createCCRDraft,
|
|
|
|
deleteCCRDraft,
|
|
|
|
fetchAndCreateCCRDrafts,
|
|
|
|
},
|
|
|
|
)(CCRDraftList);
|