2018-11-13 08:07:09 -08:00
|
|
|
import { SagaIterator } from 'redux-saga';
|
2019-02-01 11:13:30 -08:00
|
|
|
import { takeEvery, takeLatest, put, take, call, select } from 'redux-saga/effects';
|
|
|
|
import { replace } from 'connected-react-router';
|
2018-11-15 08:02:16 -08:00
|
|
|
import {
|
|
|
|
postProposalDraft,
|
|
|
|
getProposalDrafts,
|
|
|
|
putProposal,
|
ZF Grants 2.1 (#496)
* fix ccr pagination defaults
* add ccr admin tests
* add ccr user tests
* checkpoint
* fix tslint
* request changes discussion flow mvp
* admin - add discussion status
* backend - add live drafts
* admin - add live drafts
* frontend - add live drafts
* frontend - add edit discussion proposal
* fix tsc
* include DISCUSSION status in propsal listview
* do not make live draft on admin request changes
* hide live drafts from user proposal draft list
* fix backend tests
* add admin tests
* add user tests
* fix: liking, viewing discussion proposals, admin menu
* admin - update hints for live drafts
* fe - add better messaging when updating a proposal
* be - fix like test
* remove TODO comments
* add new email types
* fix storybook
* add revision tab story
* backend - implement proposal revisions
* frontend - implement proposal revisions
* update revision tab story
* fix lint
* remove set detection
* email proposal followers on revision
* restrict banner to team members only
* misc bug fixes
* update, add backend tests
* add milestone title change to revision history story
* fix milestones display in preview
* allow archived proposals to be queried
* implement archived proposal page
* fix tsc
* implement archived proposal get route
* move styling into less
* remove proposal archive parent id
* handle archived proposal status
* cleanup
* remove contributions, switch to USD, implement quarters
* use Qs to preserve formatting
* handle edit only kyc
* prevent ARCHIVED proposals from being sent to admin
* display latest revision first
* admin - proposal & ccr reject permanently
* backend - proposal & ccr reject permanently
* frontend - proposal & ccr reject permanently
* fix tsc
* use $ in milestone payout email
* introduce custom filters to proposal listview
* hide archive link on first revision
* upgrade packages
* add bech32 implementation
* add z address validation with tests
* fix tslint
* use local address validation
* fix tests, remove blockchain mock gets
* add additional bad addresses
* update briefs to include page break message
* remove contributions routes, menu entry
* disable countribution count admin stats
* remove matching and pretty print in finance
* fix tslint
* separate out rejected permanently proposals
* make removing proposals generic
* allow linked tabs to be ignored
* remove rejected permanently, bugfix
* update preview link to point to rejected tab
* implement rejected permanently tab, add tab message
* refactor variable
* fix tslint
* fix tslint
* send ccr reject permanently email on rejection
* fix preview message
* wire up proposal arbiter and rejected emails
* disable tip jar in proposal and profile
* sync ccr/proposal drafts on create form init
* check invites on submit modal open
* update team invite language
* update team text when edit
* fix ccr rejected permanently tag
* text changes, email preview fix
* display changes requested tag when in discussion with changes requested
* enable social share on open for discussion proposals, update language
* place sort below filter
* derive filter from query string
* use better filter names in query params
* fix tslint
* create snapshot of original proposal on first revision
* clear invites between edits, account for additional changes not tracked in revisions
* update tests
* fix test
* remove print
* SameSite Fixes (#150)
* QA Fixes 2 (#151)
* set filters as query strings on change
* remove rejected permanently tags
* add dollar sign in financials legend
* fix tsc
* Copy Touchups (#152)
* Email Fixes (#155)
* fix ZEC in milestone payout emails
* fix links in rejected permanently CCR/proposal emails
* Poll for Team and Invite Changes in Create Flow (#153)
* poll for team and invite changes in create flow
* fix tslint
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* pretty print payouts by quarter (#156)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Remove Blockchain Module (#154)
* remove blockchain route from backend, remove calls to node
* revert blockchain_get removal
* Add Tags to Proposal Cards (#157)
* add tag to proposals and dynamically set v1 card height
* listen on window resize
* make card height props optional
* set tag in bottom right, remove dynamic card resize, add dynamic tag resize
* cleanup
* cleanup
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Improve Frontend Address Validation (#158)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Remove blockchain module (#162)
* remove blockchain route from backend, remove calls to node
* revert blockchain_get removal
* Remove Blockchain App (#160)
* remove blockchain app
* remove blockchain app from travis
Co-authored-by: Danny Skubak <skubakdj@gmail.com>
* Proposal Edit Fixes (#161)
* fe - display error if edit creation fails
* be - restrict live draft publish
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Restrict Arbiter Assignment (#159)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Email Copy updates
* Remove Admin Financials Card
* Hookup 'proposal_approved_without_funding' to admin email example
* bump various package versions
* Update yarn.lock files
* Attach 'proposal_approved_without_funding' to backend example email
* bump package versions
Co-authored-by: Danny Skubak <skubakdj@gmail.com>
2020-04-07 19:56:32 -07:00
|
|
|
deleteProposal,
|
2019-02-21 14:07:55 -08:00
|
|
|
getProposal,
|
2018-11-15 08:02:16 -08:00
|
|
|
} from 'api/api';
|
2019-02-01 11:13:30 -08:00
|
|
|
import { getDrafts, getDraftById, getFormState } from './selectors';
|
|
|
|
import {
|
|
|
|
createDraft,
|
|
|
|
fetchDrafts,
|
|
|
|
fetchAndCreateDrafts,
|
|
|
|
initializeForm,
|
|
|
|
deleteDraft,
|
|
|
|
} from './actions';
|
2018-11-13 08:07:09 -08:00
|
|
|
import types from './types';
|
|
|
|
|
|
|
|
export function* handleCreateDraft(action: ReturnType<typeof createDraft>): SagaIterator {
|
|
|
|
try {
|
2019-02-01 11:13:30 -08:00
|
|
|
const res: Yielded<typeof postProposalDraft> = yield call(
|
|
|
|
postProposalDraft,
|
|
|
|
action.payload.rfpId,
|
|
|
|
);
|
2018-11-13 08:07:09 -08:00
|
|
|
yield put({
|
|
|
|
type: types.CREATE_DRAFT_FULFILLED,
|
|
|
|
payload: res.data,
|
|
|
|
});
|
|
|
|
|
|
|
|
if (action.payload.redirect) {
|
2019-02-01 11:13:30 -08:00
|
|
|
yield put(replace(`/proposals/${res.data.proposalId}/edit`));
|
2018-11-13 08:07:09 -08:00
|
|
|
}
|
2018-11-13 08:07:37 -08:00
|
|
|
} catch (err) {
|
2018-11-13 08:07:09 -08:00
|
|
|
yield put({
|
|
|
|
type: types.CREATE_DRAFT_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-13 14:51:02 -08:00
|
|
|
export function* handleFetchDrafts(): SagaIterator {
|
|
|
|
try {
|
|
|
|
const res: Yielded<typeof getProposalDrafts> = yield call(getProposalDrafts);
|
|
|
|
yield put({
|
|
|
|
type: types.FETCH_DRAFTS_FULFILLED,
|
|
|
|
payload: res.data,
|
|
|
|
});
|
|
|
|
} catch (err) {
|
|
|
|
yield put({
|
|
|
|
type: types.FETCH_DRAFTS_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-14 08:43:00 -08:00
|
|
|
export function* handleSaveDraft(): SagaIterator {
|
|
|
|
try {
|
|
|
|
const draft: Yielded<typeof getFormState> = yield select(getFormState);
|
|
|
|
if (!draft) {
|
|
|
|
throw new Error('No form state to save draft');
|
|
|
|
}
|
|
|
|
yield call(putProposal, draft);
|
|
|
|
yield put({ type: types.SAVE_DRAFT_FULFILLED });
|
|
|
|
} catch (err) {
|
|
|
|
yield put({
|
|
|
|
type: types.SAVE_DRAFT_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-01 11:13:30 -08:00
|
|
|
export function* handleFetchAndCreateDrafts(
|
|
|
|
action: ReturnType<typeof fetchAndCreateDrafts>,
|
|
|
|
): SagaIterator {
|
|
|
|
yield put(fetchDrafts());
|
|
|
|
yield take([types.FETCH_DRAFTS_FULFILLED, types.FETCH_DRAFTS_PENDING]);
|
|
|
|
const drafts: Yielded<typeof getDrafts> = yield select(getDrafts);
|
|
|
|
|
|
|
|
// Back out if draft fetch failed and we don't have drafts
|
|
|
|
if (!drafts) {
|
|
|
|
console.warn('Fetch of drafts failed, not creating new draft');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create new draft if we don't have one for rfp (if provided) or if
|
|
|
|
// we don't have any at all
|
|
|
|
if (action.payload.rfpId) {
|
|
|
|
const rfpDraft = drafts.find(d => !!d.rfp && d.rfp.id === action.payload.rfpId);
|
|
|
|
if (!rfpDraft) {
|
|
|
|
yield put(createDraft(action.payload));
|
|
|
|
} else if (action.payload.redirect) {
|
|
|
|
// If we were supposed to redirect, redirect to existing rfp draft
|
|
|
|
yield put(replace(`/proposals/${rfpDraft.proposalId}/edit`));
|
|
|
|
}
|
|
|
|
} else if (drafts.length === 0) {
|
|
|
|
yield put(createDraft(action.payload));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-15 08:02:16 -08:00
|
|
|
export function* handleDeleteDraft(action: ReturnType<typeof deleteDraft>): SagaIterator {
|
|
|
|
try {
|
ZF Grants 2.1 (#496)
* fix ccr pagination defaults
* add ccr admin tests
* add ccr user tests
* checkpoint
* fix tslint
* request changes discussion flow mvp
* admin - add discussion status
* backend - add live drafts
* admin - add live drafts
* frontend - add live drafts
* frontend - add edit discussion proposal
* fix tsc
* include DISCUSSION status in propsal listview
* do not make live draft on admin request changes
* hide live drafts from user proposal draft list
* fix backend tests
* add admin tests
* add user tests
* fix: liking, viewing discussion proposals, admin menu
* admin - update hints for live drafts
* fe - add better messaging when updating a proposal
* be - fix like test
* remove TODO comments
* add new email types
* fix storybook
* add revision tab story
* backend - implement proposal revisions
* frontend - implement proposal revisions
* update revision tab story
* fix lint
* remove set detection
* email proposal followers on revision
* restrict banner to team members only
* misc bug fixes
* update, add backend tests
* add milestone title change to revision history story
* fix milestones display in preview
* allow archived proposals to be queried
* implement archived proposal page
* fix tsc
* implement archived proposal get route
* move styling into less
* remove proposal archive parent id
* handle archived proposal status
* cleanup
* remove contributions, switch to USD, implement quarters
* use Qs to preserve formatting
* handle edit only kyc
* prevent ARCHIVED proposals from being sent to admin
* display latest revision first
* admin - proposal & ccr reject permanently
* backend - proposal & ccr reject permanently
* frontend - proposal & ccr reject permanently
* fix tsc
* use $ in milestone payout email
* introduce custom filters to proposal listview
* hide archive link on first revision
* upgrade packages
* add bech32 implementation
* add z address validation with tests
* fix tslint
* use local address validation
* fix tests, remove blockchain mock gets
* add additional bad addresses
* update briefs to include page break message
* remove contributions routes, menu entry
* disable countribution count admin stats
* remove matching and pretty print in finance
* fix tslint
* separate out rejected permanently proposals
* make removing proposals generic
* allow linked tabs to be ignored
* remove rejected permanently, bugfix
* update preview link to point to rejected tab
* implement rejected permanently tab, add tab message
* refactor variable
* fix tslint
* fix tslint
* send ccr reject permanently email on rejection
* fix preview message
* wire up proposal arbiter and rejected emails
* disable tip jar in proposal and profile
* sync ccr/proposal drafts on create form init
* check invites on submit modal open
* update team invite language
* update team text when edit
* fix ccr rejected permanently tag
* text changes, email preview fix
* display changes requested tag when in discussion with changes requested
* enable social share on open for discussion proposals, update language
* place sort below filter
* derive filter from query string
* use better filter names in query params
* fix tslint
* create snapshot of original proposal on first revision
* clear invites between edits, account for additional changes not tracked in revisions
* update tests
* fix test
* remove print
* SameSite Fixes (#150)
* QA Fixes 2 (#151)
* set filters as query strings on change
* remove rejected permanently tags
* add dollar sign in financials legend
* fix tsc
* Copy Touchups (#152)
* Email Fixes (#155)
* fix ZEC in milestone payout emails
* fix links in rejected permanently CCR/proposal emails
* Poll for Team and Invite Changes in Create Flow (#153)
* poll for team and invite changes in create flow
* fix tslint
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* pretty print payouts by quarter (#156)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Remove Blockchain Module (#154)
* remove blockchain route from backend, remove calls to node
* revert blockchain_get removal
* Add Tags to Proposal Cards (#157)
* add tag to proposals and dynamically set v1 card height
* listen on window resize
* make card height props optional
* set tag in bottom right, remove dynamic card resize, add dynamic tag resize
* cleanup
* cleanup
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Improve Frontend Address Validation (#158)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Remove blockchain module (#162)
* remove blockchain route from backend, remove calls to node
* revert blockchain_get removal
* Remove Blockchain App (#160)
* remove blockchain app
* remove blockchain app from travis
Co-authored-by: Danny Skubak <skubakdj@gmail.com>
* Proposal Edit Fixes (#161)
* fe - display error if edit creation fails
* be - restrict live draft publish
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Restrict Arbiter Assignment (#159)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Email Copy updates
* Remove Admin Financials Card
* Hookup 'proposal_approved_without_funding' to admin email example
* bump various package versions
* Update yarn.lock files
* Attach 'proposal_approved_without_funding' to backend example email
* bump package versions
Co-authored-by: Danny Skubak <skubakdj@gmail.com>
2020-04-07 19:56:32 -07:00
|
|
|
yield call(deleteProposal, action.payload);
|
2018-11-15 08:02:16 -08:00
|
|
|
put({ type: types.DELETE_DRAFT_FULFILLED });
|
|
|
|
} catch (err) {
|
|
|
|
yield put({
|
|
|
|
type: types.DELETE_DRAFT_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
yield call(handleFetchDrafts);
|
|
|
|
}
|
|
|
|
|
2018-11-13 14:51:02 -08:00
|
|
|
export function* handleInitializeForm(
|
|
|
|
action: ReturnType<typeof initializeForm>,
|
|
|
|
): SagaIterator {
|
|
|
|
try {
|
ZF Grants 2.1 (#496)
* fix ccr pagination defaults
* add ccr admin tests
* add ccr user tests
* checkpoint
* fix tslint
* request changes discussion flow mvp
* admin - add discussion status
* backend - add live drafts
* admin - add live drafts
* frontend - add live drafts
* frontend - add edit discussion proposal
* fix tsc
* include DISCUSSION status in propsal listview
* do not make live draft on admin request changes
* hide live drafts from user proposal draft list
* fix backend tests
* add admin tests
* add user tests
* fix: liking, viewing discussion proposals, admin menu
* admin - update hints for live drafts
* fe - add better messaging when updating a proposal
* be - fix like test
* remove TODO comments
* add new email types
* fix storybook
* add revision tab story
* backend - implement proposal revisions
* frontend - implement proposal revisions
* update revision tab story
* fix lint
* remove set detection
* email proposal followers on revision
* restrict banner to team members only
* misc bug fixes
* update, add backend tests
* add milestone title change to revision history story
* fix milestones display in preview
* allow archived proposals to be queried
* implement archived proposal page
* fix tsc
* implement archived proposal get route
* move styling into less
* remove proposal archive parent id
* handle archived proposal status
* cleanup
* remove contributions, switch to USD, implement quarters
* use Qs to preserve formatting
* handle edit only kyc
* prevent ARCHIVED proposals from being sent to admin
* display latest revision first
* admin - proposal & ccr reject permanently
* backend - proposal & ccr reject permanently
* frontend - proposal & ccr reject permanently
* fix tsc
* use $ in milestone payout email
* introduce custom filters to proposal listview
* hide archive link on first revision
* upgrade packages
* add bech32 implementation
* add z address validation with tests
* fix tslint
* use local address validation
* fix tests, remove blockchain mock gets
* add additional bad addresses
* update briefs to include page break message
* remove contributions routes, menu entry
* disable countribution count admin stats
* remove matching and pretty print in finance
* fix tslint
* separate out rejected permanently proposals
* make removing proposals generic
* allow linked tabs to be ignored
* remove rejected permanently, bugfix
* update preview link to point to rejected tab
* implement rejected permanently tab, add tab message
* refactor variable
* fix tslint
* fix tslint
* send ccr reject permanently email on rejection
* fix preview message
* wire up proposal arbiter and rejected emails
* disable tip jar in proposal and profile
* sync ccr/proposal drafts on create form init
* check invites on submit modal open
* update team invite language
* update team text when edit
* fix ccr rejected permanently tag
* text changes, email preview fix
* display changes requested tag when in discussion with changes requested
* enable social share on open for discussion proposals, update language
* place sort below filter
* derive filter from query string
* use better filter names in query params
* fix tslint
* create snapshot of original proposal on first revision
* clear invites between edits, account for additional changes not tracked in revisions
* update tests
* fix test
* remove print
* SameSite Fixes (#150)
* QA Fixes 2 (#151)
* set filters as query strings on change
* remove rejected permanently tags
* add dollar sign in financials legend
* fix tsc
* Copy Touchups (#152)
* Email Fixes (#155)
* fix ZEC in milestone payout emails
* fix links in rejected permanently CCR/proposal emails
* Poll for Team and Invite Changes in Create Flow (#153)
* poll for team and invite changes in create flow
* fix tslint
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* pretty print payouts by quarter (#156)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Remove Blockchain Module (#154)
* remove blockchain route from backend, remove calls to node
* revert blockchain_get removal
* Add Tags to Proposal Cards (#157)
* add tag to proposals and dynamically set v1 card height
* listen on window resize
* make card height props optional
* set tag in bottom right, remove dynamic card resize, add dynamic tag resize
* cleanup
* cleanup
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Improve Frontend Address Validation (#158)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Remove blockchain module (#162)
* remove blockchain route from backend, remove calls to node
* revert blockchain_get removal
* Remove Blockchain App (#160)
* remove blockchain app
* remove blockchain app from travis
Co-authored-by: Danny Skubak <skubakdj@gmail.com>
* Proposal Edit Fixes (#161)
* fe - display error if edit creation fails
* be - restrict live draft publish
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Restrict Arbiter Assignment (#159)
Co-authored-by: Daniel Ternyak <dternyak@gmail.com>
* Email Copy updates
* Remove Admin Financials Card
* Hookup 'proposal_approved_without_funding' to admin email example
* bump various package versions
* Update yarn.lock files
* Attach 'proposal_approved_without_funding' to backend example email
* bump package versions
Co-authored-by: Danny Skubak <skubakdj@gmail.com>
2020-04-07 19:56:32 -07:00
|
|
|
yield put(fetchDrafts());
|
|
|
|
yield take([types.FETCH_DRAFTS_FULFILLED]);
|
|
|
|
|
2019-02-21 14:07:55 -08:00
|
|
|
const proposalId = action.payload;
|
|
|
|
let draft: Yielded<typeof getDraftById> = yield select(getDraftById, proposalId);
|
2018-11-13 14:51:02 -08:00
|
|
|
if (!draft) {
|
|
|
|
yield call(handleFetchDrafts);
|
2019-02-21 14:07:55 -08:00
|
|
|
draft = yield select(getDraftById, proposalId);
|
2018-11-13 14:51:02 -08:00
|
|
|
if (!draft) {
|
2019-02-21 14:07:55 -08:00
|
|
|
// If it's a real proposal, just not in draft form, redirect to it
|
|
|
|
try {
|
|
|
|
yield call(getProposal, proposalId);
|
|
|
|
yield put({ type: types.INITIALIZE_FORM_REJECTED });
|
|
|
|
yield put(replace(`/proposals/${action.payload}`));
|
|
|
|
return;
|
|
|
|
} catch (err) {
|
|
|
|
throw new Error('Proposal not found');
|
|
|
|
}
|
2018-11-13 14:51:02 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
yield put({
|
|
|
|
type: types.INITIALIZE_FORM_FULFILLED,
|
|
|
|
payload: draft,
|
|
|
|
});
|
|
|
|
} catch (err) {
|
|
|
|
yield put({
|
|
|
|
type: types.INITIALIZE_FORM_REJECTED,
|
|
|
|
payload: err.message || err.toString(),
|
|
|
|
error: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-13 08:07:09 -08:00
|
|
|
export default function* createSagas(): SagaIterator {
|
|
|
|
yield takeEvery(types.CREATE_DRAFT_PENDING, handleCreateDraft);
|
2018-11-13 14:51:02 -08:00
|
|
|
yield takeLatest(types.FETCH_DRAFTS_PENDING, handleFetchDrafts);
|
2018-11-14 08:43:00 -08:00
|
|
|
yield takeLatest(types.SAVE_DRAFT_PENDING, handleSaveDraft);
|
2018-11-15 08:02:16 -08:00
|
|
|
yield takeEvery(types.DELETE_DRAFT_PENDING, handleDeleteDraft);
|
2018-11-13 14:51:02 -08:00
|
|
|
yield takeEvery(types.INITIALIZE_FORM_PENDING, handleInitializeForm);
|
2019-02-01 11:13:30 -08:00
|
|
|
yield takeEvery(types.FETCH_AND_CREATE_DRAFTS, handleFetchAndCreateDrafts);
|
2018-11-13 08:07:37 -08:00
|
|
|
}
|