Skip to content

Commit ad01c20

Browse files
authored
separate creation of expert and explicit naming filter (#737)
Signed-off-by: Etienne LESOT <[email protected]>
1 parent 7498efd commit ad01c20

File tree

7 files changed

+34
-61
lines changed

7 files changed

+34
-61
lines changed

src/components/filter/FilterCreationDialog.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
77

8-
import { useCallback } from 'react';
8+
import { useCallback, useMemo } from 'react';
99
import { FieldValues, Resolver, useForm } from 'react-hook-form';
1010
import { yupResolver } from '@hookform/resolvers/yup';
1111
import { UUID } from 'crypto';
@@ -28,7 +28,6 @@ import { FILTER_EQUIPMENTS_ATTRIBUTES } from './explicitNaming/ExplicitNamingFil
2828
const emptyFormData = {
2929
[FieldConstants.NAME]: '',
3030
[FieldConstants.DESCRIPTION]: '',
31-
[FieldConstants.FILTER_TYPE]: FilterType.EXPERT.id,
3231
[FieldConstants.EQUIPMENT_TYPE]: null,
3332
...getExplicitNamingFilterEmptyFormData(),
3433
...getExpertFilterEmptyFormData(),
@@ -40,7 +39,6 @@ const formSchema = yup
4039
.shape({
4140
[FieldConstants.NAME]: yup.string().trim().required('nameEmpty'),
4241
[FieldConstants.DESCRIPTION]: yup.string().max(MAX_CHAR_DESCRIPTION, 'descriptionLimitError'),
43-
[FieldConstants.FILTER_TYPE]: yup.string().required(),
4442
[FieldConstants.EQUIPMENT_TYPE]: yup.string().required(),
4543
...explicitNamingFilterSchema,
4644
...expertFilterSchema,
@@ -56,6 +54,7 @@ export interface FilterCreationDialogProps {
5654
id: UUID;
5755
equipmentType: string;
5856
};
57+
filterType: { id: string; label: string };
5958
}
6059

6160
export function FilterCreationDialog({
@@ -64,6 +63,7 @@ export function FilterCreationDialog({
6463
activeDirectory,
6564
language,
6665
sourceFilterForExplicitNamingConversion = undefined,
66+
filterType,
6767
}: FilterCreationDialogProps) {
6868
const { snackError } = useSnackMessage();
6969

@@ -81,7 +81,7 @@ export function FilterCreationDialog({
8181

8282
const onSubmit = useCallback(
8383
(filterForm: FieldValues) => {
84-
if (filterForm[FieldConstants.FILTER_TYPE] === FilterType.EXPLICIT_NAMING.id) {
84+
if (filterType?.id === FilterType.EXPLICIT_NAMING.id) {
8585
saveExplicitNamingFilter(
8686
filterForm[FILTER_EQUIPMENTS_ATTRIBUTES],
8787
true,
@@ -97,7 +97,7 @@ export function FilterCreationDialog({
9797
onClose,
9898
activeDirectory
9999
);
100-
} else if (filterForm[FieldConstants.FILTER_TYPE] === FilterType.EXPERT.id) {
100+
} else if (filterType?.id === FilterType.EXPERT.id) {
101101
saveExpertFilter(
102102
null,
103103
filterForm[EXPERT_FILTER_QUERY],
@@ -115,17 +115,25 @@ export function FilterCreationDialog({
115115
);
116116
}
117117
},
118-
[activeDirectory, snackError, onClose]
118+
[activeDirectory, snackError, onClose, filterType]
119119
);
120-
120+
const titleId = useMemo(() => {
121+
if (sourceFilterForExplicitNamingConversion) {
122+
return 'convertIntoExplicitNamingFilter';
123+
}
124+
if (filterType?.id === FilterType.EXPERT.id) {
125+
return 'createNewCriteriaFilter';
126+
}
127+
return 'createNewExplicitNamingFilter';
128+
}, [sourceFilterForExplicitNamingConversion, filterType]);
121129
return (
122130
<CustomMuiDialog
123131
open={open}
124132
onClose={onClose}
125133
onSave={onSubmit}
126134
formSchema={formSchema}
127135
formMethods={formMethods}
128-
titleId={sourceFilterForExplicitNamingConversion ? 'convertIntoExplicitNamingFilter' : 'createNewFilter'}
136+
titleId={titleId}
129137
removeOptional
130138
disabledSave={!!nameError || !!isValidating}
131139
language={language}
@@ -134,6 +142,7 @@ export function FilterCreationDialog({
134142
<FilterForm
135143
creation
136144
activeDirectory={activeDirectory}
145+
filterType={filterType}
137146
sourceFilterForExplicitNamingConversion={sourceFilterForExplicitNamingConversion}
138147
/>
139148
</CustomMuiDialog>

src/components/filter/FilterForm.tsx

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
*/
77

88
import { Box } from '@mui/material';
9-
import { useFormContext, useWatch } from 'react-hook-form';
10-
import React, { useEffect } from 'react';
11-
import { HeaderFilterForm, FilterFormProps } from './HeaderFilterForm';
12-
import { FieldConstants } from '../../utils/constants/fieldConstants';
9+
import { FilterFormProps, HeaderFilterForm } from './HeaderFilterForm';
1310
import { ExplicitNamingFilterForm } from './explicitNaming/ExplicitNamingFilterForm';
1411
import { ExpertFilterForm } from './expert/ExpertFilterForm';
1512
import { FilterType } from './constants/FilterConstants';
@@ -19,38 +16,23 @@ export function FilterForm({
1916
sourceFilterForExplicitNamingConversion,
2017
creation,
2118
activeDirectory,
19+
filterType,
2220
}: Readonly<FilterFormProps>) {
23-
const { setValue } = useFormContext();
24-
25-
const filterType = useWatch({ name: FieldConstants.FILTER_TYPE });
26-
27-
// We do this because setValue don't set the field dirty
28-
const handleFilterTypeChange = (_event: React.ChangeEvent<HTMLInputElement>, value: string) => {
29-
setValue(FieldConstants.FILTER_TYPE, value);
30-
};
31-
32-
useEffect(() => {
33-
if (sourceFilterForExplicitNamingConversion) {
34-
setValue(FieldConstants.FILTER_TYPE, FilterType.EXPLICIT_NAMING.id);
35-
}
36-
}, [sourceFilterForExplicitNamingConversion, setValue]);
37-
3821
return (
3922
<>
4023
<Box sx={unscrollableDialogStyles.unscrollableHeader}>
4124
<HeaderFilterForm
4225
creation={creation}
4326
activeDirectory={activeDirectory}
4427
sourceFilterForExplicitNamingConversion={sourceFilterForExplicitNamingConversion}
45-
handleFilterTypeChange={handleFilterTypeChange}
4628
/>
4729
</Box>
48-
{filterType === FilterType.EXPLICIT_NAMING.id && (
30+
{filterType?.id === FilterType.EXPLICIT_NAMING.id && (
4931
<ExplicitNamingFilterForm
5032
sourceFilterForExplicitNamingConversion={sourceFilterForExplicitNamingConversion}
5133
/>
5234
)}
53-
{filterType === FilterType.EXPERT.id && <ExpertFilterForm />}
35+
{filterType?.id === FilterType.EXPERT.id && <ExpertFilterForm />}
5436
</>
5537
);
5638
}

src/components/filter/HeaderFilterForm.tsx

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77

88
import { Grid } from '@mui/material';
99
import { UUID } from 'crypto';
10-
import { FieldConstants, ElementType, MAX_CHAR_DESCRIPTION } from '../../utils';
11-
import { FilterType } from './constants/FilterConstants';
12-
import { UniqueNameInput, DescriptionField, RadioInput } from '../inputs';
10+
import { ElementType, FieldConstants, MAX_CHAR_DESCRIPTION } from '../../utils';
11+
import { DescriptionField, UniqueNameInput } from '../inputs';
1312
import yup from '../../utils/yupConfig';
1413

1514
export const filterStyles = {
@@ -26,28 +25,20 @@ export const filterStyles = {
2625
export interface FilterFormProps {
2726
creation?: boolean;
2827
activeDirectory?: UUID;
28+
filterType?: { id: string; label: string };
2929
sourceFilterForExplicitNamingConversion?: {
3030
id: UUID;
3131
equipmentType: string;
3232
};
33-
handleFilterTypeChange?: (event: React.ChangeEvent<HTMLInputElement>, value: string) => void;
3433
}
3534

3635
export const HeaderFilterSchema = {
3736
[FieldConstants.NAME]: yup.string().trim().required('nameEmpty'),
38-
[FieldConstants.FILTER_TYPE]: yup.string().required(),
3937
[FieldConstants.EQUIPMENT_TYPE]: yup.string().required(),
4038
[FieldConstants.DESCRIPTION]: yup.string().max(MAX_CHAR_DESCRIPTION, 'descriptionLimitError'),
4139
};
4240

43-
export function HeaderFilterForm({
44-
sourceFilterForExplicitNamingConversion,
45-
creation,
46-
activeDirectory,
47-
handleFilterTypeChange,
48-
}: Readonly<FilterFormProps>) {
49-
const filterTypes = Object.values(FilterType);
50-
41+
export function HeaderFilterForm({ creation, activeDirectory }: Readonly<FilterFormProps>) {
5142
return (
5243
<Grid container spacing={2}>
5344
<Grid item xs={12}>
@@ -61,20 +52,9 @@ export function HeaderFilterForm({
6152
fullWidth={false}
6253
/>
6354
</Grid>
64-
<>
65-
<Grid item xs={12}>
66-
<DescriptionField expandingTextSx={filterStyles.description} />
67-
</Grid>
68-
{creation && !sourceFilterForExplicitNamingConversion && (
69-
<Grid item>
70-
<RadioInput
71-
name={FieldConstants.FILTER_TYPE}
72-
options={filterTypes}
73-
formProps={{ onChange: handleFilterTypeChange }} // need to override this in order to do not activate the validate button when changing the filter type
74-
/>
75-
</Grid>
76-
)}
77-
</>
55+
<Grid item xs={12}>
56+
<DescriptionField expandingTextSx={filterStyles.description} />
57+
</Grid>
7858
</Grid>
7959
);
8060
}

src/components/filter/expert/ExpertFilterEditionDialog.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ export function ExpertFilterEditionDialog({
7171
reset({
7272
[FieldConstants.NAME]: name,
7373
[FieldConstants.DESCRIPTION]: description,
74-
[FieldConstants.FILTER_TYPE]: FilterType.EXPERT.id,
7574
[FieldConstants.EQUIPMENT_TYPE]: response[FieldConstants.EQUIPMENT_TYPE],
7675
[EXPERT_FILTER_QUERY]: importExpertRules(response[EXPERT_FILTER_QUERY]!),
7776
});
@@ -129,7 +128,7 @@ export function ExpertFilterEditionDialog({
129128
language={language}
130129
unscrollableFullHeight
131130
>
132-
{isDataReady && <FilterForm activeDirectory={activeDirectory} />}
131+
{isDataReady && <FilterForm activeDirectory={activeDirectory} filterType={FilterType.EXPERT} />}
133132
</CustomMuiDialog>
134133
);
135134
}

src/components/filter/explicitNaming/ExplicitNamingFilterEditionDialog.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ export function ExplicitNamingFilterEditionDialog({
7373
reset({
7474
[FieldConstants.NAME]: name,
7575
[FieldConstants.DESCRIPTION]: description,
76-
[FieldConstants.FILTER_TYPE]: FilterType.EXPLICIT_NAMING.id,
7776
[FieldConstants.EQUIPMENT_TYPE]: response[FieldConstants.EQUIPMENT_TYPE],
7877
[FILTER_EQUIPMENTS_ATTRIBUTES]: response[FILTER_EQUIPMENTS_ATTRIBUTES]?.map((row: any) => ({
7978
[FieldConstants.AG_GRID_ROW_UUID]: uuid4(),
@@ -131,7 +130,7 @@ export function ExplicitNamingFilterEditionDialog({
131130
language={language}
132131
unscrollableFullHeight
133132
>
134-
{isDataReady && <FilterForm activeDirectory={activeDirectory} />}
133+
{isDataReady && <FilterForm activeDirectory={activeDirectory} filterType={FilterType.EXPLICIT_NAMING} />}
135134
</CustomMuiDialog>
136135
);
137136
}

src/translations/en/filterEn.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ export const filterEn = {
4646
missingDistributionKeyError: 'Missing distribution key',
4747
filterCsvFileName: 'filterCreation',
4848
createNewFilter: 'Create a filter',
49+
createNewCriteriaFilter: 'Create a criteria based filter',
50+
createNewExplicitNamingFilter: 'Create an explicit naming filter',
4951
nameProperty: 'Name',
5052
Countries: 'Countries',
5153
Countries1: 'Countries 1',

src/translations/fr/filterFr.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ export const filterFr = {
4646
missingDistributionKeyError: 'Clé de répartition manquante',
4747
filterCsvFileName: 'creationFiltre',
4848
createNewFilter: 'Créer un filtre',
49+
createNewCriteriaFilter: 'Créer un filtre par critères',
50+
createNewExplicitNamingFilter: 'Créer un filtre par nommage',
4951
nameProperty: 'Nom',
5052
Countries: 'Pays',
5153
Countries1: 'Pays 1',

0 commit comments

Comments
 (0)