]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-20707 Update rules' state after bulk (de)activate
authorJeremy Davis <jeremy.davis@sonarsource.com>
Thu, 12 Oct 2023 13:31:02 +0000 (15:31 +0200)
committersonartech <sonartech@sonarsource.com>
Fri, 13 Oct 2023 20:02:55 +0000 (20:02 +0000)
server/sonar-web/src/main/js/apps/coding-rules/components/BulkChange.tsx
server/sonar-web/src/main/js/apps/coding-rules/components/BulkChangeModal.tsx
server/sonar-web/src/main/js/apps/coding-rules/components/CodingRulesApp.tsx

index d3cfbceceaedfb51b429e60b77feeaef6901d2c4..217180ebe7595feb5d779fc79f5348eb13e704fe 100644 (file)
@@ -35,6 +35,7 @@ import { Query } from '../query';
 import BulkChangeModal from './BulkChangeModal';
 
 interface Props {
+  onSubmit?: () => void;
   query: Query;
   referencedProfiles: Dict<Profile>;
   total: number;
@@ -136,6 +137,7 @@ export default class BulkChange extends React.PureComponent<Props, State> {
           <BulkChangeModal
             action={this.state.action}
             onClose={this.closeModal}
+            onSubmit={this.props.onSubmit}
             profile={this.state.profile}
             query={this.props.query}
             referencedProfiles={this.props.referencedProfiles}
index ae6c25ed529755f5ae84afbc2db1162b44e66b4b..6509e9c0d6d682221610b34784f8d2c5d04cc684 100644 (file)
@@ -33,6 +33,7 @@ interface Props {
   action: string;
   languages: Languages;
   onClose: () => void;
+  onSubmit?: () => void;
   profile?: Profile;
   query: Query;
   referencedProfiles: Dict<Profile>;
@@ -85,6 +86,15 @@ export class BulkChangeModal extends React.PureComponent<Props, State> {
     this.setState({ selectedProfiles });
   };
 
+  getProfiles = () => {
+    // if a profile is selected in the facet, pick it
+    // otherwise take all profiles selected in the dropdown
+
+    return this.props.profile
+      ? [this.props.profile.key]
+      : this.state.selectedProfiles.map((p) => p.key);
+  };
+
   getAvailableQualityProfiles = ({ query, referencedProfiles } = this.props) => {
     let profiles = Object.values(referencedProfiles);
     if (query.languages.length > 0) {
@@ -115,11 +125,7 @@ export class BulkChangeModal extends React.PureComponent<Props, State> {
 
     const method = this.props.action === 'activate' ? bulkActivateRules : bulkDeactivateRules;
 
-    // if a profile is selected in the facet, pick it
-    // otherwise take all profiles selected in the dropdown
-    const profiles: string[] = this.props.profile
-      ? [this.props.profile.key]
-      : this.state.selectedProfiles.map((p) => p.key);
+    const profiles = this.getProfiles();
 
     for (const profile of profiles) {
       looper = looper
@@ -151,6 +157,14 @@ export class BulkChangeModal extends React.PureComponent<Props, State> {
     );
   };
 
+  handleClose = () => {
+    if (this.props.onSubmit && this.state.finished) {
+      this.props.onSubmit();
+    }
+
+    this.props.onClose();
+  };
+
   renderResult = (result: ActivationResult) => {
     const { profile: profileKey } = result;
     const profile = this.props.referencedProfiles[profileKey];
@@ -246,7 +260,7 @@ export class BulkChangeModal extends React.PureComponent<Props, State> {
       <Modal
         headerTitle={header}
         isScrollable
-        onClose={this.props.onClose}
+        onClose={this.handleClose}
         body={<Spinner loading={this.state.submitting}>{formBody}</Spinner>}
         primaryButton={
           !this.state.finished && (
index b7108e1fbe9065ed5cd85a5500081b07ec7fe579..8060d11aadb087dfbc6d9cb8d6b054fac59bd5c0 100644 (file)
@@ -422,23 +422,16 @@ export class CodingRulesApp extends React.PureComponent<Props, State> {
   getRuleActivation = (rule: string) => {
     const { actives } = this.state;
     const query = parseQuery(this.props.location.query);
-    if (actives && actives[rule] && query.profile) {
-      return actives[rule][query.profile];
-    }
+
+    return actives?.[rule] && query.profile ? actives[rule][query.profile] : undefined;
   };
 
   getSelectedProfile = () => {
     const { referencedProfiles } = this.state;
     const query = parseQuery(this.props.location.query);
-    if (query.profile) {
-      return referencedProfiles[query.profile];
-    }
-  };
 
-  closeFacet = (facet: string) =>
-    this.setState((state) => ({
-      openFacets: { ...state.openFacets, [facet]: false },
-    }));
+    return query.profile ? referencedProfiles[query.profile] : undefined;
+  };
 
   handleRuleOpen = (ruleKey: string) => {
     this.props.router.push(this.getRulePath(ruleKey));
@@ -492,7 +485,7 @@ export class CodingRulesApp extends React.PureComponent<Props, State> {
         property = newState.openFacets.sonarsourceSecurity ? 'sonarsourceSecurity' : property;
       }
 
-      if (shouldRequestFacet(property) && (!state.facets || !state.facets[property])) {
+      if (shouldRequestFacet(property) && !state.facets?.[property]) {
         newState.loading = true;
         this.fetchFacet(property);
       }
@@ -544,7 +537,7 @@ export class CodingRulesApp extends React.PureComponent<Props, State> {
   handleRuleDeactivate = (profile: string, rule: string) =>
     this.setState((state) => {
       const { actives } = state;
-      if (actives && actives[rule]) {
+      if (actives?.[rule]) {
         const newRule = { ...actives[rule] };
         delete newRule[profile];
         return { actives: { ...actives, [rule]: newRule } };
@@ -558,7 +551,7 @@ export class CodingRulesApp extends React.PureComponent<Props, State> {
 
   renderBulkButton = () => {
     const { currentUser } = this.props;
-    const { canWrite, paging, referencedProfiles } = this.state;
+    const { canWrite = false, paging, referencedProfiles } = this.state;
     const query = parseQuery(this.props.location.query);
     const canUpdate = canWrite || Object.values(referencedProfiles).some((p) => p.actions?.edit);
 
@@ -568,7 +561,12 @@ export class CodingRulesApp extends React.PureComponent<Props, State> {
 
     return (
       paging && (
-        <BulkChange query={query} referencedProfiles={referencedProfiles} total={paging.total} />
+        <BulkChange
+          onSubmit={this.handleReload}
+          query={query}
+          referencedProfiles={referencedProfiles}
+          total={paging.total}
+        />
       )
     );
   };