Skip to content

Commit bb0b189

Browse files
authored
Create Rev79 Id input fields for Projects and Engagements (#1776)
API PR: SeedCompany/cord-api-v3#3666 This adds a "uses Rev79" checkbox to the Project edit for Momentum Projects. If true, a Rev79 project id and engagement community id input will be rendered.
1 parent e9f8619 commit bb0b189

File tree

7 files changed

+118
-22
lines changed

7 files changed

+118
-22
lines changed

src/scenes/Engagement/EditEngagement/EditEngagementDialog.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ export type EditableEngagementField = ExtractStrict<
6363
| 'firstScripture'
6464
| 'lukePartnership'
6565
| 'paratextRegistryId'
66+
| 'rev79CommunityId'
6667
| 'openToInvestorVisit'
6768
| 'usingAIAssistedTranslation'
6869
| 'marketable'
@@ -158,6 +159,9 @@ const fieldMapping: Record<
158159
paratextRegistryId: ({ props }) => (
159160
<TextField {...props} label="Paratext ID" />
160161
),
162+
rev79CommunityId: ({ props }) => (
163+
<TextField {...props} label="Rev79 Community ID" />
164+
),
161165
usingAIAssistedTranslation: ({ props }) => (
162166
<EnumField
163167
label="AI Assisted Translation"
@@ -223,6 +227,7 @@ export const EditEngagementDialog = ({
223227
lukePartnership: engagement.lukePartnership.value,
224228
firstScripture: engagement.firstScripture.value,
225229
paratextRegistryId: engagement.paratextRegistryId.value,
230+
rev79CommunityId: engagement.rev79CommunityId.value,
226231
openToInvestorVisit: engagement.openToInvestorVisit.value,
227232
usingAIAssistedTranslation:
228233
engagement.usingAIAssistedTranslation.value,

src/scenes/Engagement/LanguageEngagement/Header/LanguageEngagementHeader.graphql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ fragment LanguageEngagementHeader on LanguageEngagement {
4141
canEdit
4242
value
4343
}
44+
parent {
45+
usesRev79 {
46+
value
47+
}
48+
}
49+
... on LanguageEngagement {
50+
rev79CommunityId {
51+
canRead
52+
canEdit
53+
value
54+
}
55+
}
4456
...EditEngagement
4557
...EngagementToDelete
4658
}

src/scenes/Engagement/LanguageEngagement/Header/LanguageEngagementHeader.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export const LanguageEngagementHeader = ({
5454
const language = engagement.language.value;
5555
const langName = language?.name.value ?? language?.displayName.value;
5656
const ptRegistryId = engagement.paratextRegistryId;
57+
const rev79CommunityId = engagement.rev79CommunityId;
5758
const editable = canEditAny(engagement);
5859

5960
return (
@@ -172,6 +173,20 @@ export const LanguageEngagementHeader = ({
172173
empty="Enter Paratext ID"
173174
/>
174175
</Grid>
176+
{engagement.parent.usesRev79.value && (
177+
<Grid item>
178+
<DataButton
179+
onClick={() => show(['rev79CommunityId'])}
180+
secured={rev79CommunityId}
181+
redacted="You do not have permission to view Rev79 Community ID"
182+
children={
183+
rev79CommunityId.value &&
184+
`Rev79 Community ID: ${rev79CommunityId.value}`
185+
}
186+
empty="Enter Rev79 Community ID"
187+
/>
188+
</Grid>
189+
)}
175190
<Grid item>
176191
<AIAssistanceChip
177192
aiAssistance={engagement.usingAIAssistedTranslation}

src/scenes/Engagement/LanguageEngagement/LanguageEngagementDetail.graphql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ fragment LanguageEngagementDetail on LanguageEngagement {
1111
ceremony {
1212
...CeremonyCard
1313
}
14+
parent {
15+
...Id
16+
name {
17+
value
18+
}
19+
}
1420
products {
1521
# grab first page of products with engagement
1622
# if we'd rather wait until after engagement is loaded to start fetching this

src/scenes/Projects/Overview/ProjectOverview.graphql

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,16 @@ fragment ProjectOverview on Project {
9595
workflowEvents {
9696
...projectWorkflowEvent
9797
}
98-
98+
usesRev79 {
99+
canRead
100+
canEdit
101+
value
102+
}
103+
rev79ProjectId {
104+
canRead
105+
canEdit
106+
value
107+
}
99108
# We're including this in order to update the engagement status
100109
# when the project step changes.
101110
engagements {

src/scenes/Projects/Overview/ProjectOverview.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import { CreateLanguageEngagement } from '../../Engagement/LanguageEngagement/Cr
5454
import { DeleteProject } from '../Delete';
5555
import { useProjectCurrentDirectory, useUploadProjectFiles } from '../Files';
5656
import { ProjectListQueryVariables } from '../List/ProjectList.graphql';
57-
import { EditableProjectField, UpdateProjectDialog } from '../Update';
57+
import { ProjectFieldName, UpdateProjectDialog } from '../Update';
5858
import { ProjectWorkflowDialog } from '../Update/ProjectWorkflowDialog';
5959
import { useProjectId } from '../useProjectId';
6060
import { WorkflowEventsDrawer, WorkflowEventsIcon } from '../WorkflowEvents';
@@ -123,7 +123,7 @@ export const ProjectOverview = () => {
123123
const [workflowDrawerState, openWorkflowEvents] = useDialog();
124124

125125
const [editState, editField, fieldsBeingEdited] =
126-
useDialog<Many<EditableProjectField>>();
126+
useDialog<Many<ProjectFieldName>>();
127127
const [workflowState, openWorkflow, workflowProject] =
128128
useDialog<ProjectOverviewFragment>();
129129

@@ -233,7 +233,9 @@ export const ProjectOverview = () => {
233233
<Tooltip title="Edit Project Name">
234234
<IconButton
235235
aria-label="edit project name"
236-
onClick={() => editField(['name', 'departmentId'])}
236+
onClick={() =>
237+
editField(['name', 'departmentId', 'usesRev79'])
238+
}
237239
loading={!project}
238240
>
239241
<Edit />
@@ -437,6 +439,19 @@ export const ProjectOverview = () => {
437439
onClick={() => editField(['marketingLocation'])}
438440
/>
439441
</Grid>
442+
{project?.usesRev79.value === true && (
443+
<Grid item>
444+
<DataButton
445+
label="Rev79 Project ID"
446+
empty="None"
447+
loading={!project}
448+
secured={project.rev79ProjectId}
449+
redacted="You do not have permission to view Rev79 project ID"
450+
children={() => project.rev79ProjectId.value}
451+
onClick={() => editField('rev79ProjectId')}
452+
/>
453+
</Grid>
454+
)}
440455
</Grid>
441456

442457
<Grid container spacing={1} alignItems="center">

src/scenes/Projects/Update/UpdateProjectDialog.tsx

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ import {
1414
DisplayLocationFragment,
1515
ExtractStrict,
1616
} from '~/common';
17+
import { Link } from '~/components/Routing';
1718
import {
1819
DialogForm,
1920
DialogFormProps,
2021
} from '../../../components/Dialog/DialogForm';
2122
import {
23+
CheckboxField,
2224
DateField,
2325
EnumField,
2426
SecuredField,
@@ -28,7 +30,6 @@ import {
2830
import { LocationField } from '../../../components/form/Lookup';
2931
import { FieldRegionField } from '../../../components/form/Lookup/FieldRegion';
3032
import { FormattedDate } from '../../../components/Formatters';
31-
import { Link } from '../../../components/Routing';
3233
import {
3334
updateEngagementDateRanges,
3435
updatePartnershipsDateRanges,
@@ -47,7 +48,9 @@ export type EditableProjectField = ExtractStrict<
4748
| 'primaryLocation'
4849
| 'sensitivity'
4950
| 'marketingLocation'
51+
| 'rev79ProjectId'
5052
>;
53+
export type ProjectFieldName = EditableProjectField | 'usesRev79';
5154

5255
interface ProjectFieldProps {
5356
props: {
@@ -57,7 +60,7 @@ interface ProjectFieldProps {
5760
}
5861

5962
const fieldMapping: Record<
60-
EditableProjectField,
63+
ProjectFieldName,
6164
ComponentType<ProjectFieldProps>
6265
> = {
6366
name: ({ props }) => <TextField {...props} label="Project Name" />,
@@ -82,6 +85,16 @@ const fieldMapping: Record<
8285
marketingLocation: ({ props }) => (
8386
<LocationField {...props} label="Marketing Location" />
8487
),
88+
rev79ProjectId: ({ props }) => (
89+
<TextField {...props} label="Rev79 Project ID" />
90+
),
91+
usesRev79: ({ project }) => (
92+
<CheckboxField
93+
name="usesRev79"
94+
label="Uses Rev79"
95+
disabled={!project.usesRev79.canEdit}
96+
/>
97+
),
8598
departmentId: ({ props, project }) => {
8699
// deviate from canEdit=false standard UX, since this is tacked onto name edit
87100
if (!project.departmentId.canEdit) return null;
@@ -94,6 +107,7 @@ type UpdateProjectFormValues = Merge<
94107
{
95108
primaryLocation?: DisplayLocationFragment | null;
96109
fieldRegion?: DisplayFieldRegionFragment | null;
110+
usesRev79?: boolean;
97111
marketingLocation?: DisplayLocationFragment | null;
98112
}
99113
>;
@@ -103,7 +117,7 @@ type UpdateProjectDialogProps = Except<
103117
'onSubmit' | 'initialValues'
104118
> & {
105119
project: ProjectOverviewFragment;
106-
editFields?: Many<EditableProjectField>;
120+
editFields?: Many<ProjectFieldName>;
107121
planChangeId?: string;
108122
};
109123

@@ -112,8 +126,8 @@ export const UpdateProjectDialog = ({
112126
editFields: editFieldsProp,
113127
...props
114128
}: UpdateProjectDialogProps) => {
115-
const editFields = useMemo(
116-
() => many(editFieldsProp ?? []),
129+
const displayFieldsArray = useMemo(
130+
() => many(editFieldsProp ?? []) as ProjectFieldName[],
117131
[editFieldsProp]
118132
);
119133

@@ -130,15 +144,17 @@ export const UpdateProjectDialog = ({
130144
sensitivity: project.sensitivity,
131145
marketingLocation: project.marketingLocation.value,
132146
departmentId: project.departmentId.value,
147+
...(project.__typename === 'MomentumTranslationProject' && {
148+
rev79ProjectId: project.rev79ProjectId.value,
149+
usesRev79: Boolean(project.usesRev79.value),
150+
}),
133151
};
134152

135153
// Filter out irrelevant initial values so they don't get added to the mutation
136-
const filteredInitialValuesFields = pick(
137-
fullInitialValuesFields,
138-
editFields.flatMap((field) =>
139-
field === 'mouRange' ? ['mouStart', 'mouEnd'] : field
140-
)
154+
const keys = displayFieldsArray.flatMap((field) =>
155+
field === 'mouRange' ? ['mouStart', 'mouEnd'] : field
141156
);
157+
const filteredInitialValuesFields = pick(fullInitialValuesFields, keys);
142158

143159
return {
144160
id: project.id,
@@ -154,8 +170,11 @@ export const UpdateProjectDialog = ({
154170
project.sensitivity,
155171
project.marketingLocation.value,
156172
project.id,
157-
project.departmentId,
158-
editFields,
173+
project.departmentId.value,
174+
project.__typename,
175+
project.usesRev79.value,
176+
project.rev79ProjectId.value,
177+
displayFieldsArray,
159178
]);
160179

161180
return (
@@ -165,7 +184,9 @@ export const UpdateProjectDialog = ({
165184
submitLabel="Save"
166185
{...props}
167186
// Only simple properties are changeset aware, relationships are not.
168-
changesetAware={editFields.every((field) => !field.endsWith('Id'))}
187+
changesetAware={displayFieldsArray.every(
188+
(field) => !field.endsWith('Id')
189+
)}
169190
initialValues={initialValues}
170191
validate={(values) => {
171192
const start = values.mouStart;
@@ -182,18 +203,28 @@ export const UpdateProjectDialog = ({
182203
}}
183204
onSubmit={async (data, form) => {
184205
const { dirtyFields } = form.getState();
206+
const {
207+
primaryLocation,
208+
fieldRegion,
209+
marketingLocation,
210+
...inputData
211+
} = data;
212+
185213
await updateProject({
186214
variables: {
187215
input: {
188-
...data,
216+
...inputData,
189217
primaryLocation: dirtyFields.primaryLocation
190-
? data.primaryLocation?.id ?? null
218+
? primaryLocation?.id ?? null
191219
: undefined,
192220
fieldRegion: dirtyFields.fieldRegion
193-
? data.fieldRegion?.id ?? null
221+
? fieldRegion?.id ?? null
194222
: undefined,
195223
marketingLocation: dirtyFields.marketingLocation
196-
? data.marketingLocation?.id ?? null
224+
? marketingLocation?.id ?? null
225+
: undefined,
226+
usesRev79: dirtyFields.usesRev79
227+
? inputData.usesRev79
197228
: undefined,
198229
changeset: project.changeset?.id,
199230
},
@@ -284,11 +315,14 @@ export const UpdateProjectDialog = ({
284315
}}
285316
>
286317
<SubmitError />
287-
{editFields.map((name) => {
318+
{displayFieldsArray.map((name) => {
288319
const Field = fieldMapping[name];
289320
if (name === 'sensitivity') {
290321
return <Field props={{ name }} project={project} key={name} />;
291322
}
323+
if (name === 'usesRev79') {
324+
return <Field props={{ name }} project={project} key={name} />;
325+
}
292326
return (
293327
<SecuredField obj={project} name={name} key={name}>
294328
{(props) => <Field props={props} project={project} />}

0 commit comments

Comments
 (0)