Skip to content

Commit

Permalink
Upload rate question (#2837)
Browse files Browse the repository at this point in the history
  • Loading branch information
haworku authored Oct 21, 2024
1 parent de943d4 commit a6c5670
Show file tree
Hide file tree
Showing 22 changed files with 1,335 additions and 220 deletions.
2 changes: 1 addition & 1 deletion services/app-api/src/emailer/generateURLs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ function submissionSummaryURL(id: string, base: string): string {
}

function submissionQuestionResponseURL(id: string, base: string): string {
const pattern = RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
const pattern = RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
const toPath = compile(pattern, { encode: encodeURIComponent })
const path = toPath({ id })
const url = new URL(path, base).href
Expand Down
31 changes: 19 additions & 12 deletions services/app-web/src/constants/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const ROUTES = [
'AUTOMATED_EMAILS',
'SUPPORT_EMAILS',
'RATES_SUMMARY',
'RATES_UPLOAD_QUESTION',
'RATES_SUMMARY_QUESTIONS_AND_ANSWERS',
'RATE_EDIT',
'REPLACE_RATE',
Expand All @@ -34,10 +35,12 @@ const ROUTES = [
'SUBMISSIONS_REVISION',
'SUBMISSIONS_SUMMARY',
'SUBMISSIONS_MCCRSID',
'SUBMISSIONS_QUESTIONS_AND_ANSWERS',
'SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS',
'SUBMISSIONS_UPLOAD_CONTRACT_QUESTION',
'SUBMISSIONS_UPLOAD_CONTRACT_RESPONSE',
'SUBMISSIONS_RATE_QUESTIONS_AND_ANSWERS',
'SUBMISSIONS_UPLOAD_QUESTION',
'SUBMISSIONS_UPLOAD_RESPONSE',
'SUBMISSIONS_UPLOAD_CONTRACT_QUESTION',
'SUBMISSIONS_UPLOAD_CONTRACT_RESPONSE',
] as const // iterable union type
type RouteT = (typeof ROUTES)[number]
type RouteTWithUnknown = RouteT | 'UNKNOWN_ROUTE'
Expand Down Expand Up @@ -67,6 +70,8 @@ const RoutesRecord: Record<RouteT, string> = {
RATES_SUMMARY: '/rates/:id',
RATES_SUMMARY_QUESTIONS_AND_ANSWERS: '/rates/:id/question-and-answers',
RATE_EDIT: '/rates/:id/edit',
RATES_UPLOAD_QUESTION:
'/rates/:id/question-and-answers/:division/upload-questions',
REPLACE_RATE: '/submissions/:id/replace-rate/:rateID',
SUBMISSIONS: '/submissions',
SUBMISSIONS_NEW: '/submissions/new',
Expand All @@ -80,12 +85,13 @@ const RoutesRecord: Record<RouteT, string> = {
SUBMISSIONS_SUMMARY: '/submissions/:id',
SUBMISSIONS_MCCRSID: '/submissions/:id/mccrs-record-number',
SUBMISSIONS_REVISION: '/submissions/:id/revisions/:revisionVersion',
SUBMISSIONS_QUESTIONS_AND_ANSWERS: '/submissions/:id/question-and-answers',
SUBMISSIONS_RATE_QUESTIONS_AND_ANSWERS: 'submissions/:id/rate/:rateID/question-and-answers',
SUBMISSIONS_UPLOAD_QUESTION:
'/submissions/:id/question-and-answers/:division/upload-questions',
SUBMISSIONS_UPLOAD_RESPONSE:
SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS: '/submissions/:id/question-and-answers',
SUBMISSIONS_RATE_QUESTIONS_AND_ANSWERS: '/submissions/:id/rate/:rateID/question-and-answers',
SUBMISSIONS_UPLOAD_CONTRACT_QUESTION:
'/submissions/:id/question-and-answers/:division/upload-questions',
SUBMISSIONS_UPLOAD_CONTRACT_RESPONSE:
'/submissions/:id/question-and-answers/:division/:questionID/upload-response',

}

// Constants for releated descendant routes
Expand Down Expand Up @@ -117,7 +123,7 @@ const STATE_SUBMISSION_SUMMARY_ROUTES: RouteTWithUnknown[] = [
]

const QUESTION_RESPONSE_SHOW_SIDEBAR_ROUTES: RouteTWithUnknown[] = [
'SUBMISSIONS_QUESTIONS_AND_ANSWERS',
'SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS',
'SUBMISSIONS_RATE_QUESTIONS_AND_ANSWERS',
'SUBMISSIONS_SUMMARY',
'SUBMISSIONS_TYPE',
Expand Down Expand Up @@ -157,6 +163,7 @@ const PageTitlesRecord: Record<RouteT | 'UNKNOWN_ROUTE', string> = {
RATES_SUMMARY_QUESTIONS_AND_ANSWERS: 'Q&A',
RATE_EDIT: 'Edit rate',
REPLACE_RATE: 'Replace rate',
RATES_UPLOAD_QUESTION: 'Add rate questions',
SUBMISSIONS: 'Submissions',
SUBMISSIONS_NEW: 'New submission',
SUBMISSIONS_EDIT_TOP_LEVEL: 'Submissions',
Expand All @@ -169,10 +176,10 @@ const PageTitlesRecord: Record<RouteT | 'UNKNOWN_ROUTE', string> = {
SUBMISSIONS_REVIEW_SUBMIT: 'Review and submit',
SUBMISSIONS_REVISION: 'Submission revision',
SUBMISSIONS_SUMMARY: 'Submission summary',
SUBMISSIONS_QUESTIONS_AND_ANSWERS: 'Q&A',
SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS: 'Q&A',
SUBMISSIONS_UPLOAD_CONTRACT_QUESTION: 'Add questions',
SUBMISSIONS_UPLOAD_CONTRACT_RESPONSE: 'Add response',
SUBMISSIONS_RATE_QUESTIONS_AND_ANSWERS: 'Rate Q&A',
SUBMISSIONS_UPLOAD_QUESTION: 'Add questions',
SUBMISSIONS_UPLOAD_RESPONSE: 'Add response',
UNKNOWN_ROUTE: 'Not found',
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,14 @@ import {
UnlockedContract,
UpdateStateAssignmentsByStateMutationFn,
FetchMcReviewSettingsDocument,
FetchMcReviewSettingsQuery
FetchMcReviewSettingsQuery,
CreateRateQuestionMutation,
CreateRateQuestionInput,
CreateRateQuestionMutationFn,
RateQuestion,
FetchRateWithQuestionsDocument,
IndexRateQuestionsPayload,
FetchRateWithQuestionsQuery
} from '../gen/gqlClient'
import { ApolloError, GraphQLErrors } from '@apollo/client/errors'

Expand Down Expand Up @@ -307,7 +314,7 @@ export async function updateStateAssignmentsWrapper(
* workflow. So, when calling Q&A mutations the Q&A page will not refetch the data. The alternative would be to use
* cache.evict() to force a refetch, but would then cause the loading UI to show.
**/
export const createQuestionWrapper = async (
export const createContractQuestionWrapper = async (
createQuestion: CreateContractQuestionMutationFn,
input: CreateContractQuestionInput
): Promise<CreateContractQuestionMutation | GraphQLErrors | Error> => {
Expand Down Expand Up @@ -390,6 +397,90 @@ export const createQuestionWrapper = async (
}
}

export const createRateQuestionWrapper = async (
createQuestion: CreateRateQuestionMutationFn,
input: CreateRateQuestionInput
): Promise<CreateRateQuestionMutation | GraphQLErrors | Error> => {
try {
const result = await createQuestion({
variables: { input },
update(cache, { data }) {
if (data) {
const newQuestion = data.createRateQuestion.question as RateQuestion
const result =
cache.readQuery<FetchRateWithQuestionsQuery>(
{
query: FetchRateWithQuestionsDocument,
variables: {
input: {
rateID: newQuestion.rateID,
},
},
}
)

const rate = result?.fetchRate.rate

if (rate) {
const indexQuestionDivision =
divisionToIndexQuestionDivision(
newQuestion.division
)
const questions = rate.questions as IndexRateQuestionsPayload
const divisionQuestions =
questions[indexQuestionDivision]

cache.writeQuery({
query: FetchRateWithQuestionsDocument,
data: {
fetchRate: {
rate: {
...rate,
questions: {
...rate.questions,
[indexQuestionDivision]: {
totalCount:
divisionQuestions.totalCount
? divisionQuestions.totalCount +
1
: 1,
edges: [
{
__typename:
'RateQuestionEdge',
node: {
...newQuestion,
responses: [],
},
},
...divisionQuestions.edges,
],
},
},
},
},
},
})
}
}
},
onQueryUpdated: () => true,
})

if (result.data?.createRateQuestion) {
return result.data
} else {
recordJSException(
`[UNEXPECTED]: Error attempting to add question, no data present but returning 200.`
)
return new Error(ERROR_MESSAGES.question_error_generic)
}
} catch (error) {
return error
}
}


export const createResponseWrapper = async (
createResponse: CreateContractQuestionResponseMutationFn,
contractID: string,
Expand Down
21 changes: 15 additions & 6 deletions services/app-web/src/pages/App/AppRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import { SubmissionSideNav } from '../SubmissionSideNav'
import {
QuestionResponse,
UploadResponse,
UploadQuestions,
UploadContractQuestions,
} from '../QuestionResponse'
import { GraphQLExplorer } from '../GraphQLExplorer/GraphQLExplorer'
import { RateSummary } from '../RateSummary'
Expand All @@ -48,6 +48,7 @@ import {
DivisionAssignmentTable,
} from '../Settings/SettingsTables'
import { EditStateAssign } from '../Settings/EditStateAssign/EditStateAssign'
import { UploadRateQuestions } from '../QuestionResponse/UploadQuestions'
import { RateSummarySideNav } from '../SubmissionSideNav/RateSummarySideNav'
import { RateQuestionResponse } from '../QuestionResponse/RateQuestionResponse'

Expand Down Expand Up @@ -134,11 +135,11 @@ const StateUserRoutes = ({
)}
<Route element={<SubmissionSideNav />}>
<Route
path={RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS}
path={RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS}
element={<QuestionResponse />}
/>
<Route
path={RoutesRecord.SUBMISSIONS_UPLOAD_RESPONSE}
path={RoutesRecord.SUBMISSIONS_UPLOAD_CONTRACT_RESPONSE}
element={<UploadResponse />}
/>

Expand Down Expand Up @@ -217,19 +218,23 @@ const CMSUserRoutes = ({

<Route element={<SubmissionSideNav />}>
<Route
path={RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS}
path={RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS}
element={<QuestionResponse />}
/>
<Route
path={RoutesRecord.SUBMISSIONS_UPLOAD_QUESTION}
element={<UploadQuestions />}
path={RoutesRecord.SUBMISSIONS_UPLOAD_CONTRACT_QUESTION}
element={<UploadContractQuestions />}
/>
<Route
path={RoutesRecord.SUBMISSIONS_SUMMARY}
element={<SubmissionSummary />}
/>
</Route>

<Route
path={RoutesRecord.RATES_SUMMARY}
element={<RateSummary />}
/>
{showQAbyRates ? (
<>
<Route element={<RateSummarySideNav />}>
Expand All @@ -243,6 +248,10 @@ const CMSUserRoutes = ({
}
element={<RateQuestionResponse />}
/>
<Route
path={RoutesRecord.RATES_UPLOAD_QUESTION }
element={<UploadRateQuestions/>}
/>
{/*This route will cause the RateSummarySideNav to redirect to rate summary Q&A page*/}
<Route
path={
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -82,7 +82,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -241,7 +241,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -307,7 +307,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -379,7 +379,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -432,7 +432,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -479,7 +479,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -527,7 +527,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -575,7 +575,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down Expand Up @@ -616,7 +616,7 @@ describe('QuestionResponse', () => {
<Route element={<SubmissionSideNav />}>
<Route
path={
RoutesRecord.SUBMISSIONS_QUESTIONS_AND_ANSWERS
RoutesRecord.SUBMISSIONS_CONTRACT_QUESTIONS_AND_ANSWERS
}
element={<QuestionResponse />}
/>
Expand Down
Loading

0 comments on commit a6c5670

Please sign in to comment.