Skip to content

Commit 0710659

Browse files
abrilgzzdanielluo-msft
authored andcommitted
Add requestor field for Job Tenant Writers in the onboarding form
1 parent 1981fa0 commit 0710659

File tree

9 files changed

+59
-5
lines changed

9 files changed

+59
-5
lines changed

UI/web-app/src/components/Confirmation/Confirmation.base.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
manageMembershipIsAdvancedView,
2626
manageMembershipPeriod,
2727
manageMembershipQuery,
28+
manageMembershipRequestor,
2829
manageMembershipSelectedDestination,
2930
manageMembershipSelectedDestinationEndpoints,
3031
manageMembershipStartDate,
@@ -33,6 +34,7 @@ import {
3334
} from '../../store/manageMembership.slice';
3435
import { OnboardingSteps } from '../../models/OnboardingSteps';
3536
import { useLocation } from 'react-router-dom';
37+
import { selectIsJobTenantWriter } from '../../store/roles.slice';
3638

3739
const getClassNames = classNamesFunction<
3840
IConfirmationStyleProps,
@@ -60,9 +62,14 @@ export const ConfirmationBase: React.FunctionComponent<IConfirmationProps> = (pr
6062
const startDate: string = useSelector(manageMembershipStartDate);
6163
const thresholdPercentageForAdditions: number = useSelector(manageMembershipThresholdPercentageForAdditions);
6264
const thresholdPercentageForRemovals: number = useSelector(manageMembershipThresholdPercentageForRemovals);
65+
const requestor: string = useSelector(manageMembershipRequestor);
66+
6367
const isAdvancedView = useSelector(manageMembershipIsAdvancedView);
6468
const compositeQuery = useSelector(manageMembershipCompositeQuery);
6569
const globalQuery = useSelector(manageMembershipQuery);
70+
71+
const isJobTenantWriter = useSelector(selectIsJobTenantWriter);
72+
6673
const displayQuery: string = isAdvancedView ? JSON.stringify(globalQuery, null, 2) : JSON.stringify(compositeQuery, null, 2);
6774

6875
const SharePointDomain: string = `${process.env.REACT_APP_SHAREPOINTDOMAIN}`;
@@ -222,6 +229,16 @@ export const ConfirmationBase: React.FunctionComponent<IConfirmationProps> = (pr
222229
{thresholdPercentageForRemovals === -1 ? `${strings.ManageMembership.labels.noThresholdSet}`: `${thresholdPercentageForRemovals}%`}
223230
</Text>
224231
</Stack.Item>
232+
{isJobTenantWriter &&
233+
<Stack.Item align="start">
234+
<Text className={classNames.itemTitle} block>
235+
{strings.JobDetails.labels.requestor}
236+
</Text>
237+
<Text className={classNames.itemData} block>
238+
{requestor}
239+
</Text>
240+
</Stack.Item>
241+
}
225242
</Stack>
226243
</div>)}
227244

UI/web-app/src/components/RunConfiguration/RunConfiguration.base.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
IProcessedStyleSet,
77
classNamesFunction,
88
useTheme,
9-
ChoiceGroup, IChoiceGroupOption, DatePicker, Dropdown, Checkbox
9+
ChoiceGroup, IChoiceGroupOption, DatePicker, Dropdown, Checkbox,
10+
TextField
1011
} from '@fluentui/react';
1112
import {
1213
IRunConfigurationProps,
@@ -26,6 +27,7 @@ import {
2627
manageMembershipUseThresholdLimits,
2728
setNewJobPeriod,
2829
setNewJobStartDate,
30+
setNewJobRequestor,
2931
setNewJobThresholdPercentageForAdditions,
3032
setNewJobThresholdPercentageForRemovals,
3133
setShowDecreaseDropdown,
@@ -35,6 +37,7 @@ import {
3537
} from '../../store/manageMembership.slice';
3638
import { AppDispatch } from '../../store';
3739
import { useDispatch, useSelector } from 'react-redux';
40+
import { selectIsJobTenantWriter } from '../../store/roles.slice';
3841

3942
const getClassNames = classNamesFunction<
4043
IRunConfigurationStyleProps,
@@ -61,6 +64,7 @@ export const RunConfigurationBase: React.FunctionComponent<IRunConfigurationProp
6164
const startDateOption = useSelector(manageMembershipStartDateOption);
6265
const showIncreaseDropdown = useSelector(manageMembershipShowIncreaseDropdown);
6366
const showDecreaseDropdown = useSelector(manageMembershipShowDecreaseDropdown);
67+
const isJobTenantWriter = useSelector(selectIsJobTenantWriter);
6468

6569
const defaultIncreaseThreshold: number = 100;
6670
const defaultDecreaseThreshold: number = 20;
@@ -84,8 +88,22 @@ export const RunConfigurationBase: React.FunctionComponent<IRunConfigurationProp
8488
const increaseOptions = Array.from({ length: 10 }, (_, i) => ({ key: `${(i + 1) * 10}`, text: `${(i + 1) * 10}%` }));
8589
const decreaseOptions = Array.from({ length: 11 }, (_, i) => ({ key: `${i * 5}`, text: `${i * 5}%` }));
8690

91+
const handleRequestorChange = (ev: React.FormEvent<HTMLInputElement | HTMLTextAreaElement>, newValue?: string) => {
92+
dispatch(setNewJobRequestor(newValue || ''));
93+
};
94+
8795
return (
8896
<div className={classNames.root}>
97+
{isJobTenantWriter &&
98+
<TextField
99+
label={strings.ManageMembership.labels.requestor}
100+
placeholder={strings.ManageMembership.labels.requestor}
101+
onChange={handleRequestorChange}
102+
styles={{
103+
fieldGroup: classNames.textFieldFieldGroup,
104+
}}
105+
/>
106+
}
89107
<ChoiceGroup
90108
styles={{
91109
root: classNames.horizontalChoiceGroup,

UI/web-app/src/components/RunConfiguration/RunConfiguration.styles.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,14 @@ import {
6363
borderWidth: 1,
6464
borderColor: theme.palette.neutralQuaternary,
6565
background: theme.palette.white,
66-
}
66+
},
67+
textFieldFieldGroup: {
68+
borderRadius: 4,
69+
border: '1px solid',
70+
borderColor: theme.palette.neutralQuaternary,
71+
backgroud: theme.palette.white,
72+
width: 300
73+
},
6774
};
6875
};
6976

UI/web-app/src/components/RunConfiguration/RunConfiguration.types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
checkboxPairsContainer: IStyle;
1919
thresholdDropdown: IStyle;
2020
dropdownTitle: IStyle;
21+
textFieldFieldGroup: IStyle;
2122
}
2223

2324
export interface IRunConfigurationStyleProps {

UI/web-app/src/pages/ManageMembership/ManageMembership.base.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ import {
4242
setIsEditingExistingJob,
4343
manageMembershipIsEditingExistingJob,
4444
manageMembershipCompositeQuery,
45-
clearSourceParts
45+
clearSourceParts,
46+
manageMembershipRequestor
4647
} from '../../store/manageMembership.slice';
4748
import { getGroupEndpoints, getGroupOnboardingStatus } from '../../store/manageMembership.api';
4849
import { NewJob } from '../../models/NewJob';
@@ -133,7 +134,9 @@ export const ManageMembershipBase: React.FunctionComponent<IManageMembershipProp
133134
const period = useSelector(manageMembershipPeriod);
134135
const thresholdPercentageForAdditions = useSelector(manageMembershipThresholdPercentageForAdditions);
135136
const thresholdPercentageForRemovals = useSelector(manageMembershipThresholdPercentageForRemovals);
136-
const requestor = useSelector(selectAccountUsername);
137+
const currentUser = useSelector(selectAccountUsername) ?? '';
138+
const inputRequestor = useSelector(manageMembershipRequestor);
139+
const requestor: string = inputRequestor === '' ? currentUser : inputRequestor;
137140
const isEditingExistingJob = useSelector(manageMembershipIsEditingExistingJob);
138141
const advancedViewQuery = useSelector(manageMembershipQuery);
139142
const sourcePartsQuery = useSelector(manageMembershipCompositeQuery);
@@ -144,7 +147,7 @@ export const ManageMembershipBase: React.FunctionComponent<IManageMembershipProp
144147
} else {
145148
finalQuery = sourcePartsQuery;
146149
}
147-
150+
148151
const handleSearchDestinationChange = (selectedDestinations: IPersonaProps[] | undefined) => {
149152
dispatch(setHasChanges(true));
150153

UI/web-app/src/services/localization/IStrings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ export type IStrings = {
322322
groupMembership: string;
323323
groupOwnership: string;
324324
clickHere: string;
325+
requestor: string;
325326
}
326327
};
327328
copy: string;

UI/web-app/src/services/localization/i18n/locales/en/translations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ export const strings: IStrings = {
327327
groupMembership: 'Group Membership',
328328
groupOwnership: 'Group Ownership',
329329
clickHere: 'Click here',
330+
requestor: 'Requestor',
330331
}
331332
},
332333
copy: 'Copy',

UI/web-app/src/services/localization/i18n/locales/es/translations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ export const strings: IStrings = {
331331
groupMembership: 'Membresía de grupo',
332332
groupOwnership: 'Propietario de grupo',
333333
clickHere: 'Haz click aquí',
334+
requestor: 'Solicitante',
334335
}
335336
},
336337
copy: 'Copiar',

UI/web-app/src/store/manageMembership.slice.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ const manageMembershipSlice = createSlice({
9292
setNewJobQuery: (state, action: PayloadAction<SyncJobQuery>) => {
9393
state.newJob.query = action.payload;
9494
},
95+
setNewJobRequestor: (state, action: PayloadAction<string>) => {
96+
state.newJob.requestor = action.payload;
97+
},
9598
setIsAdvancedQueryValid: (state, action: PayloadAction<boolean>) => {
9699
state.isAdvancedQueryValid = action.payload;
97100
},
@@ -274,6 +277,7 @@ export const {
274277
setHasChanges,
275278
setCurrentStep,
276279
setNewJobQuery,
280+
setNewJobRequestor,
277281
setIsAdvancedQueryValid,
278282
setSelectedDestination,
279283
setNewJobStartDate,
@@ -313,6 +317,7 @@ export const manageMembershipStartDate = (state: RootState) => state.manageMembe
313317
export const manageMembershipPeriod = (state: RootState) => state.manageMembership.newJob.period;
314318
export const manageMembershipThresholdPercentageForAdditions = (state: RootState) => state.manageMembership.newJob.thresholdPercentageForAdditions;
315319
export const manageMembershipThresholdPercentageForRemovals = (state: RootState) => state.manageMembership.newJob.thresholdPercentageForRemovals;
320+
export const manageMembershipRequestor = (state: RootState) => state.manageMembership.newJob.requestor;
316321

317322
// 1- Select Destination
318323
export const manageMembershipSearchResults = (state: RootState) => state.manageMembership.searchResults;

0 commit comments

Comments
 (0)