Skip to content

Commit 41fd179

Browse files
Add properties and substation properties fields in expert filters. (#406)
* Add properties and substation properties fields in expert filters. Signed-off-by: Franck LECUYER <[email protected]>
1 parent 704ef02 commit 41fd179

File tree

9 files changed

+301
-17
lines changed

9 files changed

+301
-17
lines changed

src/components/dialogs/commons/custom-mui-dialog/custom-mui-dialog.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const styles = {
4141
dialogPaper: {
4242
'.MuiDialog-paper': {
4343
width: 'auto',
44-
minWidth: '800px',
44+
minWidth: '1100px',
4545
margin: 'auto',
4646
},
4747
},

src/components/dialogs/filter/expert/expert-filter-constants.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,13 +501,42 @@ export const FIELDS_OPTIONS = {
501501
dataType: DataType.NUMBER,
502502
inputType: 'number',
503503
},
504+
PROPERTY: {
505+
name: FieldType.PROPERTY,
506+
label: 'property',
507+
dataType: DataType.PROPERTY,
508+
valueEditorType: 'select',
509+
defaultValue: '',
510+
},
511+
SUBSTATION_PROPERTY: {
512+
name: FieldType.SUBSTATION_PROPERTY,
513+
label: 'substationProperty',
514+
dataType: DataType.PROPERTY,
515+
valueEditorType: 'select',
516+
defaultValue: '',
517+
},
518+
SUBSTATION_PROPERTY_1: {
519+
name: FieldType.SUBSTATION_PROPERTY_1,
520+
label: 'substationProperty1',
521+
dataType: DataType.PROPERTY,
522+
valueEditorType: 'select',
523+
defaultValue: '',
524+
},
525+
SUBSTATION_PROPERTY_2: {
526+
name: FieldType.SUBSTATION_PROPERTY_2,
527+
label: 'substationProperty2',
528+
dataType: DataType.PROPERTY,
529+
valueEditorType: 'select',
530+
defaultValue: '',
531+
},
504532
};
505533

506534
export const fields: Record<string, Field[]> = {
507535
SUBSTATION: [
508536
FIELDS_OPTIONS.ID,
509537
FIELDS_OPTIONS.NAME,
510538
FIELDS_OPTIONS.COUNTRY,
539+
FIELDS_OPTIONS.PROPERTY,
511540
],
512541
VOLTAGE_LEVEL: [
513542
FIELDS_OPTIONS.ID,
@@ -516,6 +545,8 @@ export const fields: Record<string, Field[]> = {
516545
FIELDS_OPTIONS.NOMINAL_VOLTAGE,
517546
FIELDS_OPTIONS.LOW_VOLTAGE_LIMIT,
518547
FIELDS_OPTIONS.HIGH_VOLTAGE_LIMIT,
548+
FIELDS_OPTIONS.PROPERTY,
549+
FIELDS_OPTIONS.SUBSTATION_PROPERTY,
519550
],
520551
LINE: [
521552
FIELDS_OPTIONS.ID,
@@ -534,6 +565,9 @@ export const fields: Record<string, Field[]> = {
534565
FIELDS_OPTIONS.SHUNT_CONDUCTANCE_2,
535566
FIELDS_OPTIONS.SHUNT_SUSCEPTANCE_1,
536567
FIELDS_OPTIONS.SHUNT_SUSCEPTANCE_2,
568+
FIELDS_OPTIONS.PROPERTY,
569+
FIELDS_OPTIONS.SUBSTATION_PROPERTY_1,
570+
FIELDS_OPTIONS.SUBSTATION_PROPERTY_2,
537571
],
538572
TWO_WINDINGS_TRANSFORMER: [
539573
FIELDS_OPTIONS.ID,
@@ -561,6 +595,9 @@ export const fields: Record<string, Field[]> = {
561595
FIELDS_OPTIONS.PHASE_REGULATING,
562596
FIELDS_OPTIONS.PHASE_REGULATION_MODE,
563597
FIELDS_OPTIONS.PHASE_REGULATION_VALUE,
598+
FIELDS_OPTIONS.PROPERTY,
599+
FIELDS_OPTIONS.SUBSTATION_PROPERTY_1,
600+
FIELDS_OPTIONS.SUBSTATION_PROPERTY_2,
564601
],
565602
GENERATOR: [
566603
FIELDS_OPTIONS.ID,
@@ -581,6 +618,8 @@ export const fields: Record<string, Field[]> = {
581618
FIELDS_OPTIONS.MARGINAL_COST,
582619
FIELDS_OPTIONS.PLANNED_OUTAGE_RATE,
583620
FIELDS_OPTIONS.FORCED_OUTAGE_RATE,
621+
FIELDS_OPTIONS.PROPERTY,
622+
FIELDS_OPTIONS.SUBSTATION_PROPERTY,
584623
],
585624
LOAD: [
586625
FIELDS_OPTIONS.ID,
@@ -591,6 +630,8 @@ export const fields: Record<string, Field[]> = {
591630
FIELDS_OPTIONS.CONNECTED,
592631
FIELDS_OPTIONS.P0,
593632
FIELDS_OPTIONS.Q0,
633+
FIELDS_OPTIONS.PROPERTY,
634+
FIELDS_OPTIONS.SUBSTATION_PROPERTY,
594635
],
595636
BATTERY: [
596637
FIELDS_OPTIONS.ID,
@@ -603,6 +644,8 @@ export const fields: Record<string, Field[]> = {
603644
FIELDS_OPTIONS.MAX_P,
604645
FIELDS_OPTIONS.TARGET_P,
605646
FIELDS_OPTIONS.TARGET_Q,
647+
FIELDS_OPTIONS.PROPERTY,
648+
FIELDS_OPTIONS.SUBSTATION_PROPERTY,
606649
],
607650
SHUNT_COMPENSATOR: [
608651
FIELDS_OPTIONS.ID,
@@ -618,5 +661,7 @@ export const fields: Record<string, Field[]> = {
618661
FIELDS_OPTIONS.SWITCHED_ON_Q_AT_NOMINAL_V,
619662
FIELDS_OPTIONS.MAX_SUSCEPTANCE,
620663
FIELDS_OPTIONS.SWITCHED_ON_SUSCEPTANCE,
664+
FIELDS_OPTIONS.PROPERTY,
665+
FIELDS_OPTIONS.SUBSTATION_PROPERTY,
621666
],
622667
};

src/components/dialogs/filter/expert/expert-filter-utils.ts

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ import {
3232
RuleGroupTypeExport,
3333
RuleTypeExport,
3434
} from './expert-filter.type';
35-
import { microUnitToUnit, unitToMicroUnit } from 'utils/conversion-utils';
35+
import {
36+
isBlankOrEmpty,
37+
microUnitToUnit,
38+
unitToMicroUnit,
39+
} from 'utils/conversion-utils';
3640
import { validate as uuidValidate } from 'uuid';
3741

3842
type CustomRuleType = RuleType & { dataType: DataType };
@@ -56,6 +60,14 @@ const getDataType = (fieldName: string, operator: string) => {
5660
) {
5761
return DataType.FILTER_UUID;
5862
}
63+
// if (
64+
// fieldName === FieldType.PROPERTY ||
65+
// fieldName === FieldType.SUBSTATION_PROPERTY ||
66+
// fieldName === FieldType.SUBSTATION_PROPERTY_1 ||
67+
// fieldName === FieldType.SUBSTATION_PROPERTY_2
68+
// ) {
69+
// return DataType.PROPERTY;
70+
// }
5971
const field = Object.values(FIELDS_OPTIONS).find(
6072
(field) => field.name === fieldName
6173
);
@@ -140,6 +152,16 @@ export const getOperators = (fieldName: string, intl: IntlShape) => {
140152
name: operator.name,
141153
label: intl.formatMessage({ id: operator.label }),
142154
}));
155+
case DataType.PROPERTY:
156+
let propertiesOperators: {
157+
name: string;
158+
customName: string;
159+
label: string;
160+
}[] = [OPERATOR_OPTIONS.IS];
161+
return propertiesOperators.map((operator) => ({
162+
name: operator.name,
163+
label: intl.formatMessage({ id: operator.label }),
164+
}));
143165
}
144166
return defaultOperators;
145167
};
@@ -160,19 +182,34 @@ export function exportExpertRules(
160182
): RuleGroupTypeExport {
161183
function transformRule(rule: CustomRuleType): RuleTypeExport {
162184
const isValueAnArray = Array.isArray(rule.value);
185+
const dataType = getDataType(rule.field, rule.operator) as DataType;
163186
return {
164187
field: rule.field as FieldType,
165-
operator: Object.values(OPERATOR_OPTIONS).find(
166-
(operator) => operator.name === rule.operator
167-
)?.customName as OperatorType,
188+
operator:
189+
dataType !== DataType.PROPERTY
190+
? (Object.values(OPERATOR_OPTIONS).find(
191+
(operator) => operator.name === rule.operator
192+
)?.customName as OperatorType)
193+
: rule.value.propertyOperator,
168194
value:
169-
!isValueAnArray && rule.operator !== OperatorType.EXISTS
195+
!isValueAnArray &&
196+
rule.operator !== OperatorType.EXISTS &&
197+
dataType !== DataType.PROPERTY
170198
? changeValueUnit(rule.value, rule.field as FieldType)
171199
: undefined,
172-
values: isValueAnArray
173-
? changeValueUnit(rule.value, rule.field as FieldType)
174-
: undefined,
175-
dataType: getDataType(rule.field, rule.operator) as DataType,
200+
values:
201+
isValueAnArray && dataType !== DataType.PROPERTY
202+
? changeValueUnit(rule.value, rule.field as FieldType)
203+
: undefined,
204+
dataType: dataType,
205+
propertyName:
206+
dataType === DataType.PROPERTY
207+
? rule.value.propertyName
208+
: undefined,
209+
propertyValues:
210+
dataType === DataType.PROPERTY
211+
? rule.value.propertyValues
212+
: undefined,
176213
};
177214
}
178215

@@ -200,7 +237,13 @@ export function importExpertRules(
200237
query: RuleGroupTypeExport
201238
): CustomRuleGroupType {
202239
function parseValue(rule: RuleTypeExport) {
203-
if (rule.values) {
240+
if (rule.propertyName) {
241+
return {
242+
propertyName: rule.propertyName,
243+
propertyValues: rule.propertyValues,
244+
propertyOperator: rule.operator,
245+
};
246+
} else if (rule.values) {
204247
// values is a Set on server side, so need to sort
205248
if (rule.dataType === DataType.NUMBER) {
206249
return rule.values
@@ -224,9 +267,12 @@ export function importExpertRules(
224267
function transformRule(rule: RuleTypeExport): CustomRuleType {
225268
return {
226269
field: rule.field,
227-
operator: Object.values(OPERATOR_OPTIONS).find(
228-
(operator) => operator.customName === rule.operator
229-
)?.name as string,
270+
operator:
271+
rule.dataType !== DataType.PROPERTY
272+
? (Object.values(OPERATOR_OPTIONS).find(
273+
(operator) => operator.customName === rule.operator
274+
)?.name as string)
275+
: OperatorType.IS,
230276
value: parseValue(rule),
231277
dataType:
232278
rule.operator === OperatorType.IS_PART_OF ||
@@ -350,6 +396,18 @@ export const queryValidator: QueryValidator = (query) => {
350396
valid: false,
351397
reasons: [EMPTY_RULE],
352398
};
399+
} else if (
400+
rule.id &&
401+
getDataType(rule.field, rule.operator) === DataType.PROPERTY &&
402+
(isBlankOrEmpty(rule.value?.propertyName) ||
403+
isBlankOrEmpty(rule.value?.propertyOperator) ||
404+
isBlankOrEmpty(rule.value?.propertyValues) ||
405+
!rule.value?.propertyValues?.length)
406+
) {
407+
result[rule.id] = {
408+
valid: false,
409+
reasons: [EMPTY_RULE],
410+
};
353411
}
354412
};
355413

src/components/dialogs/filter/expert/expert-filter.type.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ export enum FieldType {
8686
PHASE_REGULATING = 'PHASE_REGULATING',
8787
PHASE_REGULATION_MODE = 'PHASE_REGULATION_MODE',
8888
PHASE_REGULATION_VALUE = 'PHASE_REGULATION_VALUE',
89+
PROPERTY = 'FREE_PROPERTIES',
90+
SUBSTATION_PROPERTY = 'SUBSTATION_PROPERTIES',
91+
SUBSTATION_PROPERTY_1 = 'SUBSTATION_PROPERTIES_1',
92+
SUBSTATION_PROPERTY_2 = 'SUBSTATION_PROPERTIES_2',
8993
}
9094

9195
export enum DataType {
@@ -95,6 +99,7 @@ export enum DataType {
9599
BOOLEAN = 'BOOLEAN',
96100
COMBINATOR = 'COMBINATOR',
97101
FILTER_UUID = 'FILTER_UUID',
102+
PROPERTY = 'PROPERTIES',
98103
}
99104

100105
export interface RuleTypeExport {
@@ -103,6 +108,8 @@ export interface RuleTypeExport {
103108
value: string | number | undefined;
104109
values: string[] | number[] | undefined;
105110
dataType: DataType;
111+
propertyName?: string;
112+
propertyValues?: string[];
106113
}
107114

108115
export interface RuleGroupTypeExport {

src/components/utils/field-constants.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,7 @@ export const EMPTY_GROUP = 'emptyGroup';
4545
export const INCORRECT_RULE = 'incorrectRule';
4646
export const BETWEEN_RULE = 'betweenRule';
4747
export const FILTER_UUID = 'FILTER_UUID';
48+
export const PROPERTY = 'PROPERTY';
49+
export const PROPERTY_NAME = 'propertyName';
50+
export const PROPERTY_VALUES = 'propertyValues';
51+
export const PROPERTY_OPERATOR = 'propertyOperator';

0 commit comments

Comments
 (0)