This is an automated email from the ASF dual-hosted git repository.

michaelsmolina pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 87290dd  fix: Native filters cyclic dependency (#16921)
87290dd is described below

commit 87290ddcc8e9a50604b16d312be31fefcaf62f77
Author: Michael S. Molina <[email protected]>
AuthorDate: Thu Sep 30 14:55:54 2021 -0300

    fix: Native filters cyclic dependency (#16921)
---
 .../nativeFilters/FiltersConfigModal/utils.ts          | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
index fd699e9..a6698d2 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
@@ -42,6 +42,7 @@ export const validateForm = async (
       errors: [error],
     };
     form.setFields([fieldError]);
+    setCurrentFilterId(filterId);
   };
 
   try {
@@ -57,25 +58,34 @@ export const validateForm = async (
       }
     }
 
-    const validateCycles = (filterId: string, trace: string[] = []) => {
+    const validateCycles = (
+      filterId: string,
+      trace: string[] = [],
+    ): boolean => {
       if (trace.includes(filterId)) {
         addValidationError(
           filterId,
           'parentFilter',
           'Cannot create cyclic hierarchy',
         );
+        return false;
       }
       const parentId = formValues.filters?.[filterId]
         ? formValues.filters[filterId]?.parentFilter?.value
         : filterConfigMap[filterId]?.cascadeParentIds?.[0];
       if (parentId) {
-        validateCycles(parentId, [...trace, filterId]);
+        return validateCycles(parentId, [...trace, filterId]);
       }
+      return true;
     };
 
-    filterIds
+    const invalid = filterIds
       .filter(id => !removedFilters[id])
-      .forEach(filterId => validateCycles(filterId));
+      .some(filterId => !validateCycles(filterId));
+
+    if (invalid) {
+      return null;
+    }
 
     return formValues;
   } catch (error) {

Reply via email to