From 44023e6ba043ea2e6588234c7b6ad9527b5b469f Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Tue, 18 Jun 2024 19:27:46 -0400 Subject: [PATCH] Util functions update, code improvement and lint fix Signed-off-by: Yi Cai --- .../ConditionalAccess/ConditionsForm.tsx | 4 +- .../ConditionalAccess/ConditionsFormRow.tsx | 36 ++++----- .../ConditionsFormRowFields.tsx | 74 ++++++++----------- plugins/rbac/src/utils/rbac-utils.ts | 31 ++++---- 4 files changed, 64 insertions(+), 81 deletions(-) diff --git a/plugins/rbac/src/components/ConditionalAccess/ConditionsForm.tsx b/plugins/rbac/src/components/ConditionalAccess/ConditionsForm.tsx index 5f8c875875..c4e44ef8dc 100644 --- a/plugins/rbac/src/components/ConditionalAccess/ConditionsForm.tsx +++ b/plugins/rbac/src/components/ConditionalAccess/ConditionsForm.tsx @@ -69,7 +69,7 @@ export const ConditionsForm = ({ React.useState(false); const flattenConditions = ( - conditions: Condition[], + conditionData: Condition[], ): PermissionCondition[] => { const flatConditions: PermissionCondition[] = []; @@ -92,7 +92,7 @@ export const ConditionsForm = ({ } } }; - conditions.forEach(processCondition); + conditionData.forEach(processCondition); return flatConditions; }; diff --git a/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRow.tsx b/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRow.tsx index 7eeeb5d633..5c242af751 100644 --- a/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRow.tsx +++ b/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRow.tsx @@ -127,17 +127,18 @@ export const ConditionsFormRow = ({ React.useState('simple-condition'); React.useEffect(() => { - let nestedConditions: ConditionsData[] = []; + const nestedConditions: ConditionsData[] = []; const criteriaTypes = [criterias.allOf, criterias.anyOf, criterias.not]; const extractNestedConditions = (conditions: ConditionsData[]) => { - Array.isArray(conditions) && - conditions?.forEach(c => { + if (Array.isArray(conditions)) { + conditions.forEach(c => { criteriaTypes.forEach(ct => { if (Object.keys(c).includes(ct)) { nestedConditions.push(c as ConditionsData); } }); }); + } }; switch (criteria) { @@ -154,6 +155,7 @@ export const ConditionsFormRow = ({ ) ) { nestedConditions.push(conditionRow.not as ConditionsData); + setNotConditionType('nested-condition'); } break; default: @@ -224,24 +226,16 @@ export const ConditionsFormRow = ({ conditionRow[criteria as keyof ConditionsData] as Condition[] )?.filter(con => Object.keys(con).includes('rule')) || [] : []; - let newCondition: Condition[] = []; - if (Array.isArray(updatedNestedConditionRow)) { - newCondition = [...existingSimpleCondition, ...updatedNestedConditionRow]; - } else { - newCondition = [...existingSimpleCondition, updatedNestedConditionRow]; - } - if (criteria === criterias.anyOf) { - onRuleChange({ - [criteria]: [...newCondition], - }); - } - if (criteria === criterias.allOf) { + const newCondition: Condition[] = Array.isArray(updatedNestedConditionRow) + ? [...existingSimpleCondition, ...updatedNestedConditionRow] + : [...existingSimpleCondition, updatedNestedConditionRow]; + + if (criteria === criterias.anyOf || criteria === criterias.allOf) { onRuleChange({ - [criteria]: [...newCondition], + [criteria]: newCondition, }); - } - if (criteria === criterias.not) { + } else if (criteria === criterias.not) { onRuleChange({ not: updatedNestedConditionRow as ConditionsData, }); @@ -287,7 +281,7 @@ export const ConditionsFormRow = ({ } }; - const handleAddNestedCondition = (criteria: string) => { + const handleAddNestedCondition = (currentCriteria: string) => { const newNestedCondition = { [criterias.allOf]: [ { @@ -302,7 +296,7 @@ export const ConditionsFormRow = ({ newNestedCondition, ]; updateRules( - criteria === criterias.not + currentCriteria === criterias.not ? newNestedCondition : updatedNestedConditionRow, ); @@ -707,7 +701,7 @@ export const ConditionsFormRow = ({ } onRuleChange={onRuleChange} conditionRow={nc} - criteria={criterias.not} + criteria={criteria} conditionRulesData={conditionRulesData} setErrors={setErrors} optionDisabled={ruleOption => diff --git a/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRowFields.tsx b/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRowFields.tsx index ff48dace24..28472e1ae2 100644 --- a/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRowFields.tsx +++ b/plugins/rbac/src/components/ConditionalAccess/ConditionsFormRowFields.tsx @@ -128,42 +128,38 @@ export const ConditionsFormRowFields = ({ } }; - const handleNestedConditionChange = ( - updateRules: (conditions: ConditionsData[] | ConditionsData) => void, - nestedConditionRow: ConditionsData[], - nestedConditionCriteria: string, - nestedConditionIndex: number, - ruleIndex: number, - newCondition: PermissionCondition, - ) => { - const updatedNestedConditionRow: ConditionsData[] = []; - - nestedConditionRow.forEach((c, index) => { - if (index === nestedConditionIndex) { - if (nestedConditionCriteria === criterias.not) { - updatedNestedConditionRow.push({ - [nestedConditionCriteria as keyof ConditionsData]: newCondition, - }); - } else { + const handleNestedConditionChange = (newCondition: PermissionCondition) => { + if ( + !nestedConditionRow || + !nestedConditionCriteria || + nestedConditionIndex === undefined || + !updateRules + ) { + return; + } + const updatedNestedConditionRow: ConditionsData[] = nestedConditionRow.map( + (c, i) => { + if (i === nestedConditionIndex) { + if (nestedConditionCriteria === criterias.not) { + return { + [nestedConditionCriteria]: newCondition, + }; + } const updatedNestedConditionRules = ( (c[ nestedConditionCriteria as keyof ConditionsData ] as PermissionCondition[]) || [] - ).map((_r, rindex) => { - if (rindex === ruleIndex) { - return newCondition; - } - return _r; - }); - updatedNestedConditionRow.push({ - [nestedConditionCriteria as keyof ConditionsData]: - updatedNestedConditionRules, + ).map((rule, rindex) => { + return rindex === ruleIndex ? newCondition : rule; }); + + return { + [nestedConditionCriteria]: updatedNestedConditionRules, + }; } - } else { - updatedNestedConditionRow.push(c); - } - }); + return c; + }, + ); updateRules( criteria === criterias.not @@ -173,22 +169,10 @@ export const ConditionsFormRowFields = ({ }; const onConditionChange = (newCondition: PermissionCondition) => { - if ( - nestedConditionRow && - nestedConditionCriteria && - nestedConditionIndex !== undefined && - updateRules - ) { - handleNestedConditionChange( - updateRules, - nestedConditionRow, - nestedConditionCriteria, - nestedConditionIndex, - ruleIndex || 0, - newCondition, - ); + if (nestedConditionRow) { + handleNestedConditionChange(newCondition); } else { - handleConditionChange(newCondition as PermissionCondition); + handleConditionChange(newCondition); } }; diff --git a/plugins/rbac/src/utils/rbac-utils.ts b/plugins/rbac/src/utils/rbac-utils.ts index 5d755c7577..ee0e3e2a51 100644 --- a/plugins/rbac/src/utils/rbac-utils.ts +++ b/plugins/rbac/src/utils/rbac-utils.ts @@ -214,7 +214,7 @@ export const getPermissionsData = ( }; export const getConditionUpperCriteria = ( - conditions: PermissionCriteria, + conditions: PermissionCriteria | string, ): string | undefined => { return Object.keys(conditions).find(key => [criterias.allOf, criterias.anyOf, criterias.not].includes(key), @@ -230,26 +230,31 @@ export const getConditionsData = ( case criterias.allOf: { const allOfConditions = (conditions as AllOfCriteria) .allOf; - if (allOfConditions.find(c => !!getConditionUpperCriteria(c))) { - return undefined; - } + allOfConditions.map(aoc => { + if (getConditionUpperCriteria(aoc)) { + return getConditionsData(aoc); + } + return aoc; + }); return { allOf: allOfConditions as PermissionCondition[] }; } case criterias.anyOf: { const anyOfConditions = (conditions as AnyOfCriteria) .anyOf; - if (anyOfConditions.find(c => !!getConditionUpperCriteria(c))) { - return undefined; - } + anyOfConditions.map(aoc => { + if (getConditionUpperCriteria(aoc)) { + return getConditionsData(aoc); + } + return aoc; + }); return { anyOf: anyOfConditions as PermissionCondition[] }; } case criterias.not: { - const notConditions = (conditions as NotCriteria) - .not; - if (getConditionUpperCriteria(notConditions)) { - return undefined; - } - return { not: notConditions as PermissionCondition }; + const notCondition = (conditions as NotCriteria).not; + const nestedCondition = getConditionUpperCriteria(notCondition) + ? getConditionsData(notCondition) + : notCondition; + return { not: nestedCondition as PermissionCondition }; } default: return { condition: conditions as PermissionCondition };