Browse Source

limit env's to only selected projects, or my projects (#64824)

Currently we list _every_ environment if you are a superuser.

This PR modifies the filter to only present environments for the
selected project, or "my projects" if selected
Nathan Hsieh 1 year ago
parent
commit
67b611d478
1 changed files with 49 additions and 7 deletions
  1. 49 7
      static/app/views/releases/thresholdsList/index.tsx

+ 49 - 7
static/app/views/releases/thresholdsList/index.tsx

@@ -86,16 +86,58 @@ function ReleaseThresholdList({}: Props) {
       projects.flatMap(project => {
         /**
          * Include environments from:
+         * all projects I can access if -1 is the only selected project.
+         * all member projects if 'my projects' (empty list) is selected.
          * all projects if the user is a superuser
          * the requested projects
-         * all member projects if 'my projects' (empty list) is selected.
+         */
+        const allProjectsSelectedICanAccess =
+          selectedProjectIds.length === 1 &&
+          selectedProjectIds[0] === String(ALL_ACCESS_PROJECTS) &&
+          project.hasAccess;
+        const myProjectsSelected = selectedProjectIds.length === 0 && project.isMember;
+        const allMemberProjectsIfSuperuser =
+          selectedProjectIds.length === 0 && user.isSuperuser;
+        if (
+          allProjectsSelectedICanAccess ||
+          myProjectsSelected ||
+          allMemberProjectsIfSuperuser ||
+          selectedProjectIds.includes(project.id)
+        ) {
+          return project.environments;
+        }
+
+        return [];
+      })
+    );
+    const envDiff = new Set([...allEnvSet].filter(x => !unSortedEnvs.has(x)));
+
+    // bubble the selected projects envs first, then concat the rest of the envs
+    return Array.from(unSortedEnvs)
+      .sort()
+      .concat([...envDiff].sort());
+  }, [projects, selection.projects]);
+
+  const getEnvironmentsAvailableToProject = useMemo((): string[] => {
+    const selectedProjectIds = selection.projects.map(id => String(id));
+    const allEnvSet = new Set(projects.flatMap(project => project.environments));
+    // NOTE: mostly taken from environmentSelector.tsx
+    const unSortedEnvs = new Set(
+      projects.flatMap(project => {
+        /**
+         * Include environments from:
          * all projects if -1 is the only selected project.
+         * all member projects if 'my projects' (empty list) is selected.
+         * the requested projects
          */
+        const allProjectsSelected =
+          selectedProjectIds.length === 1 &&
+          selectedProjectIds[0] === String(ALL_ACCESS_PROJECTS) &&
+          project.hasAccess;
+        const myProjectsSelected = selectedProjectIds.length === 0 && project.isMember;
         if (
-          (selectedProjectIds.length === 1 &&
-            selectedProjectIds[0] === String(ALL_ACCESS_PROJECTS) &&
-            project.hasAccess) ||
-          (selectedProjectIds.length === 0 && (project.isMember || user.isSuperuser)) ||
+          allProjectsSelected ||
+          myProjectsSelected ||
           selectedProjectIds.includes(project.id)
         ) {
           return project.environments;
@@ -178,7 +220,7 @@ function ReleaseThresholdList({}: Props) {
                   isError={isError}
                   refetch={refetch}
                   setTempError={setTempError}
-                  allEnvironmentNames={getAllEnvironmentNames} // TODO: determine whether to move down to threshold group table
+                  allEnvironmentNames={getEnvironmentsAvailableToProject}
                 />
               ))}
             {projectsWithoutThresholds.length > 0 && (
@@ -193,7 +235,7 @@ function ReleaseThresholdList({}: Props) {
                     <NoThresholdCard
                       key={proj.id}
                       project={proj}
-                      allEnvironmentNames={getAllEnvironmentNames} // TODO: determine whether to move down to threshold group table
+                      allEnvironmentNames={getAllEnvironmentNames}
                       refetch={refetch}
                       setTempError={setTempError}
                     />