Skip to content

Commit e590766

Browse files
committed
Edit existing syncs configuration
1 parent 4cf5461 commit e590766

File tree

15 files changed

+100
-79
lines changed

15 files changed

+100
-79
lines changed

Service/GroupMembershipManagement/Hosts/WebApi/Services.WebApi/GetJobDetailsHandler.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ await _loggingRepository.LogMessageAsync(new LogMessage
7171
thresholdViolations: job.ThresholdViolations,
7272
thresholdPercentageForAdditions: job.ThresholdPercentageForAdditions,
7373
thresholdPercentageForRemovals: job.ThresholdPercentageForRemovals,
74-
endpoints: endpoints
74+
endpoints: endpoints,
75+
period: job.Period
7576
);
7677

7778
response.Model = dto;

Service/GroupMembershipManagement/Hosts/WebApi/WebApi.Models/DTOs/SyncJobDetails.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public SyncJobDetails(
1313
int thresholdViolations,
1414
int thresholdPercentageForAdditions,
1515
int thresholdPercentageForRemovals,
16-
List<string> endpoints)
16+
List<string> endpoints,
17+
int period)
1718
{
1819
StartDate = startDate;
1920
LastSuccessfulStartTime = lastSuccessfulStartTime;
@@ -23,6 +24,7 @@ public SyncJobDetails(
2324
ThresholdPercentageForAdditions = thresholdPercentageForAdditions;
2425
ThresholdPercentageForRemovals = thresholdPercentageForRemovals;
2526
Endpoints = endpoints;
27+
Period = period;
2628
}
2729

2830

@@ -34,5 +36,6 @@ public SyncJobDetails(
3436
public int ThresholdPercentageForAdditions { get; set; }
3537
public int ThresholdPercentageForRemovals { get; set; }
3638
public List<string> Endpoints { get; set; }
39+
public int Period { get; set; }
3740
}
3841
}

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { useStrings } from "../../store/hooks";
1919
import schemaDefinition from '../../models/schemas/Query.json';
2020
import { AppDispatch } from '../../store';
2121
import {
22-
manageMembershipIsEditingExistingJob,
2322
setAdvancedViewQuery,
2423
setIsAdvancedQueryValid,
2524
} from '../../store/manageMembership.slice';
@@ -71,7 +70,6 @@ export const AdvancedQueryBase: React.FunctionComponent<IAdvancedQueryProps> = (
7170
const dispatch = useDispatch<AppDispatch>();
7271
const [validationMessage, setValidationMessage] = useState<React.ReactNode | null>(null);
7372
const [localQuery, setLocalQuery] = useState<string>(query === '' ? defaultAdvancedViewQuery : query);
74-
const isEditingExistingJob = useSelector(manageMembershipIsEditingExistingJob);
7573
const schema = schemaDefinition;
7674
const ajv = new Ajv();
7775

@@ -168,7 +166,6 @@ export const AdvancedQueryBase: React.FunctionComponent<IAdvancedQueryProps> = (
168166
value={localQuery}
169167
onChange={handleQueryChange}
170168
onBlur={handleBlur}
171-
disabled={isEditingExistingJob}
172169
/>
173170
{validationMessage && (
174171
<div className={validationMessage === strings.ManageMembership.labels.validQuery ? classNames.successMessage : classNames.errorMessage}>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export const ConfirmationBase: React.FunctionComponent<IConfirmationProps> = (pr
183183
</Stack>
184184
</div>)}
185185

186-
{!locationState.jobId && (<div>
186+
<div>
187187
<div className={classNames.cardHeader}>
188188
<div className={classNames.cardTitle}>
189189
{strings.JobDetails.labels.configuration}
@@ -240,7 +240,7 @@ export const ConfirmationBase: React.FunctionComponent<IConfirmationProps> = (pr
240240
</Stack.Item>
241241
}
242242
</Stack>
243-
</div>)}
243+
</div>
244244

245245
<div>
246246
<div className={classNames.cardHeader}>

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
type IContentContainerStyleProps,
1515
type IContentContainerStyles,
1616
} from './ContentContainer.types';
17-
import { strings } from '../../services/localization/i18n/locales/en/translations';
17+
import { useStrings } from '../../store/hooks';
1818

1919
export const getClassNames = classNamesFunction<IContentContainerStyleProps, IContentContainerStyles>();
2020

@@ -27,6 +27,7 @@ export const ContentContainerBase: React.FunctionComponent<IContentContainerProp
2727
className,
2828
theme: useTheme(),
2929
});
30+
const strings = useStrings();
3031

3132
return (
3233

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import { searchDestinations } from '../../store/manageMembership.api';
2222
import { IsGroupMembershipSourcePartQuery } from '../../models/GroupMembershipSourcePart';
2323
import { useSelectedGroupById } from '../../store/groupPart.slice';
2424
import { searchGroups } from '../../store/groups.api';
25-
import { manageMembershipIsEditingExistingJob } from '../../store/manageMembership.slice';
2625

2726
export const getClassNames = classNamesFunction<GroupQuerySourceStyleProps, GroupQuerySourceStyles>();
2827

@@ -38,7 +37,6 @@ export const GroupQuerySourceBase: React.FunctionComponent<GroupQuerySourceProps
3837
const groupId: string = IsGroupMembershipSourcePartQuery(part.query) ? part.query.source : '';
3938
const [localSearchResults, setLocalSearchResults] = useState<IPersonaProps[]>([]);
4039
const selectedGroupPersona = useSelectedGroupById(groupId);
41-
const isEditingExistingJob = useSelector(manageMembershipIsEditingExistingJob);
4240

4341
const groupPersona: IPersonaProps = {
4442
id: groupId,
@@ -115,7 +113,6 @@ export const GroupQuerySourceBase: React.FunctionComponent<GroupQuerySourceProps
115113
selectedItems={selectedGroup}
116114
styles={{ text: classNames.groupPicker }}
117115
pickerCalloutProps={{ calloutMinWidth: 500 }}
118-
disabled={isEditingExistingJob}
119116
/>
120117
</div>
121118
);

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { fetchOrgLeaderDetails, fetchOrgLeaderDetailsUsingId } from '../../store
1919
import { getJobOwnerFilterSuggestions } from '../../store/jobs.api';
2020
import { updateOrgLeaderDetails, selectOrgLeaderDetails, selectObjectIdEmployeeIdMapping } from '../../store/orgLeaderDetails.slice';
2121
import { selectJobOwnerFilterSuggestions } from '../../store/jobs.slice';
22-
import { manageMembershipIsEditingExistingJob } from '../../store/manageMembership.slice';
2322
import { fetchDefaultSqlMembershipSourceAttributes } from '../../store/sqlMembershipSources.api';
2423
import { fetchAttributeValues } from '../../store/sqlMembershipSources.api';
2524
import { selectAttributes, selectSource, selectAttributeValues } from '../../store/sqlMembershipSources.slice';
@@ -54,7 +53,6 @@ export const HRQuerySourceBase: React.FunctionComponent<HRQuerySourceProps> = (p
5453
const orgLeaderDetails = useSelector(selectOrgLeaderDetails);
5554
const objectIdEmployeeIdMapping = useSelector(selectObjectIdEmployeeIdMapping);
5655
const ownerPickerSuggestions = useSelector(selectJobOwnerFilterSuggestions);
57-
const isEditingExistingJob = useSelector(manageMembershipIsEditingExistingJob);
5856
const [isDragAndDropEnabled, setIsDragAndDropEnabled] = useState(false);
5957
const [isDisabled, setIsDisabled] = useState(true);
6058
const [includeOrg, setIncludeOrg] = useState(false);
@@ -1540,7 +1538,6 @@ const checkType = (value: string, type: string | undefined): string => {
15401538
root: classNames.horizontalChoiceGroup,
15411539
flexContainer: classNames.horizontalChoiceGroupContainer
15421540
}}
1543-
disabled={isEditingExistingJob}
15441541
/>
15451542

15461543
{(includeOrg || (source?.manager?.id && objectIdEmployeeIdMapping[source.manager.id] && objectIdEmployeeIdMapping[source.manager.id].text !== undefined)) && (
@@ -1569,7 +1566,6 @@ const checkType = (value: string, type: string | undefined): string => {
15691566
onChange={handleOrgLeaderChange}
15701567
styles={{ root: classNames.textField, text: classNames.textFieldGroup }}
15711568
pickerCalloutProps={{directionalHint: DirectionalHint.bottomCenter}}
1572-
disabled={isEditingExistingJob}
15731569
/>
15741570
</div>
15751571
</Stack.Item>
@@ -1584,7 +1580,7 @@ const checkType = (value: string, type: string | undefined): string => {
15841580
</div>
15851581
<SpinButton
15861582
value={source.manager?.depth?.toString()}
1587-
disabled={isDisabled || isEditingExistingJob}
1583+
disabled={isDisabled}
15881584
min={0}
15891585
max={(partId === orgLeaderDetails.partId) ? orgLeaderDetails.maxDepth : 100}
15901586
step={1}
@@ -1607,7 +1603,6 @@ const checkType = (value: string, type: string | undefined): string => {
16071603
root: classNames.horizontalChoiceGroup,
16081604
flexContainer: classNames.horizontalChoiceGroupContainer
16091605
}}
1610-
disabled={isEditingExistingJob}
16111606
/>
16121607
</div>
16131608
</Stack.Item>
@@ -1629,7 +1624,6 @@ const checkType = (value: string, type: string | undefined): string => {
16291624
root: classNames.horizontalChoiceGroup,
16301625
flexContainer: classNames.horizontalChoiceGroupContainer
16311626
}}
1632-
disabled={isEditingExistingJob}
16331627
/>
16341628

16351629
{(source.filter && (filterTextEnabled || !attributes)) ?
@@ -1649,7 +1643,6 @@ const checkType = (value: string, type: string | undefined): string => {
16491643
styles={{ root: classNames.textField, fieldGroup: classNames.textFieldGroup }}
16501644
validateOnLoad={false}
16511645
validateOnFocusOut={false}
1652-
disabled={isEditingExistingJob}
16531646
></TextField></>
16541647
) : attributes && attributes.length > 0 && (includeFilter || source.filter) ?
16551648
(

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

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ import {
2323
setCompositeQuery,
2424
setIsAdvancedView,
2525
setIsAdvancedQueryValid,
26-
manageMembershipIsEditingExistingJob,
27-
resetManageMembership
2826
} from '../../store/manageMembership.slice';
2927
import { SourcePart } from '../SourcePart';
3028
import { useStrings } from '../../store/hooks';
@@ -43,8 +41,6 @@ export const MembershipConfigurationBase: React.FunctionComponent<MembershipConf
4341
const dispatch = useDispatch<AppDispatch>();
4442
const strings = useStrings();
4543

46-
const isEditingExistingJob = useSelector(manageMembershipIsEditingExistingJob);
47-
4844
const isAdvancedView = useSelector(manageMembershipIsAdvancedView);
4945
const sourceParts = useSelector(getSourcePartsFromState);
5046

@@ -120,13 +116,6 @@ export const MembershipConfigurationBase: React.FunctionComponent<MembershipConf
120116
dispatch(setCompositeQuery(compositeQuery));
121117
}, [dispatch, sourceParts]);
122118

123-
// Reset state on component unmount
124-
useEffect(() => {
125-
return () => {
126-
dispatch(resetManageMembership());
127-
};
128-
}, [dispatch]);
129-
130119
return (
131120
<div>
132121
<div className={classNames.toggleContainer}>
@@ -152,16 +141,13 @@ export const MembershipConfigurationBase: React.FunctionComponent<MembershipConf
152141
/>
153142
))}
154143
</div>
155-
{isEditingExistingJob ?
156-
<></> :
157144
<div className={classNames.addButtonContainer}>
158145
<DefaultButton
159146
iconProps={{ iconName: 'Add' }}
160147
onClick={newSourcePart}>
161148
{strings.ManageMembership.labels.addSourcePart}
162149
</DefaultButton>
163150
</div>
164-
}
165151
</>) : (<div className={classNames.card}>
166152
<AdvancedQuery
167153
query={advancedViewQuery}

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ import {
3333
setShowDecreaseDropdown,
3434
setShowIncreaseDropdown,
3535
setStartDateOption,
36-
setUseThresholdLimits
36+
setUseThresholdLimits,
37+
manageMembershipRequestor
3738
} from '../../store/manageMembership.slice';
3839
import { AppDispatch } from '../../store';
3940
import { useDispatch, useSelector } from 'react-redux';
@@ -57,6 +58,7 @@ export const RunConfigurationBase: React.FunctionComponent<IRunConfigurationProp
5758
const dispatch = useDispatch<AppDispatch>();
5859
const period: number = useSelector(manageMembershipPeriod);
5960
const startDate: string = useSelector(manageMembershipStartDate);
61+
const requestor: string = useSelector(manageMembershipRequestor);
6062
const thresholdPercentageForAdditions: number = useSelector(manageMembershipThresholdPercentageForAdditions);
6163
const thresholdPercentageForRemovals: number = useSelector(manageMembershipThresholdPercentageForRemovals);
6264

@@ -79,12 +81,17 @@ export const RunConfigurationBase: React.FunctionComponent<IRunConfigurationProp
7981
{ key: 'No', text: strings.no },
8082
];
8183

82-
const frequencyOptions = [
84+
const predefinedFrequencyOptions = [
8385
{ key: '12', text: `12 ${strings.ManageMembership.labels.hrs}` },
8486
{ key: '24', text: `24 ${strings.ManageMembership.labels.hrs}` },
8587
{ key: '36', text: `36 ${strings.ManageMembership.labels.hrs}` }
8688
];
8789

90+
const frequencyOptions = [...predefinedFrequencyOptions];
91+
if (!predefinedFrequencyOptions.some(option => option.key === period.toString())) {
92+
frequencyOptions.push({ key: period.toString(), text: `${period} ${strings.ManageMembership.labels.hrs}` });
93+
}
94+
8895
const increaseOptions = Array.from({ length: 10 }, (_, i) => ({ key: `${(i + 1) * 10}`, text: `${(i + 1) * 10}%` }));
8996
const decreaseOptions = Array.from({ length: 11 }, (_, i) => ({ key: `${i * 5}`, text: `${i * 5}%` }));
9097

@@ -97,6 +104,7 @@ export const RunConfigurationBase: React.FunctionComponent<IRunConfigurationProp
97104
{isJobTenantWriter &&
98105
<TextField
99106
label={strings.ManageMembership.labels.requestor}
107+
value={requestor}
100108
placeholder={strings.ManageMembership.labels.requestor}
101109
onChange={handleRequestorChange}
102110
styles={{
@@ -143,7 +151,7 @@ export const RunConfigurationBase: React.FunctionComponent<IRunConfigurationProp
143151
className={classNames.controlWidth}
144152
label={strings.ManageMembership.labels.frequency}
145153
options={frequencyOptions}
146-
defaultSelectedKey={period.toString()}
154+
defaultSelectedKey={period ? period.toString() : undefined}
147155
onChange={(event, option) => {
148156
if (option) {
149157
dispatch(setNewJobPeriod(Number(option.key)));

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ export const SourcePartBase: React.FunctionComponent<SourcePartProps> = (props:
185185
required={true}
186186
selectedKey={part.query.type}
187187
onChange={handleSourceTypeChanged}
188-
disabled={isEditingExistingJob}
189188
/>
190189
<ChoiceGroup
191190
className={classNames.exclusionaryPart}
@@ -194,7 +193,6 @@ export const SourcePartBase: React.FunctionComponent<SourcePartProps> = (props:
194193
required={true}
195194
onChange={handleExclusionaryChange}
196195
selectedKey={isExclusionary ? 'Yes' : 'No'}
197-
disabled={isEditingExistingJob}
198196
/>
199197
{isEditingExistingJob ?
200198
<></>

0 commit comments

Comments
 (0)