]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9325 Load only displayed setting values on the Settings page
authorStas Vilchik <stas.vilchik@sonarsource.com>
Wed, 18 Oct 2017 13:40:11 +0000 (15:40 +0200)
committerStas Vilchik <stas.vilchik@sonarsource.com>
Thu, 19 Oct 2017 09:07:32 +0000 (11:07 +0200)
server/sonar-web/src/main/js/apps/settings/components/CategoryDefinitionsList.js
server/sonar-web/src/main/js/apps/settings/components/SubCategoryDefinitionsList.js
server/sonar-web/src/main/js/apps/settings/store/actions.js

index bc5217855fb00b8cf84707d1f864cb0ec4ee281f..ca86a38825ae2a852905d570db2b56ebe436dfab 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 // @flow
-import React from 'react';
 import { connect } from 'react-redux';
 import SubCategoryDefinitionsList from './SubCategoryDefinitionsList';
+import { fetchValues } from '../store/actions';
 import { getSettingsAppSettingsForCategory } from '../../../store/rootReducer';
 
-function CategoryDefinitionsList(props) {
-  return <SubCategoryDefinitionsList {...props} />;
-}
-
 const mapStateToProps = (state, ownProps) => ({
   settings: getSettingsAppSettingsForCategory(
     state,
@@ -35,4 +31,6 @@ const mapStateToProps = (state, ownProps) => ({
   )
 });
 
-export default connect(mapStateToProps)(CategoryDefinitionsList);
+const mapDispatchToProps = { fetchValues };
+
+export default connect(mapStateToProps, mapDispatchToProps)(SubCategoryDefinitionsList);
index 4a08b134fd1b9ea958521cada3e73f5e8a38b799..45f0c6d07ca083643b6b3bc2f8aab10c80ce4912 100644 (file)
@@ -20,7 +20,7 @@
 // @flow
 import React from 'react';
 import PropTypes from 'prop-types';
-import { groupBy, sortBy } from 'lodash';
+import { groupBy, isEqual, sortBy } from 'lodash';
 import DefinitionsList from './DefinitionsList';
 import EmailForm from './EmailForm';
 import { getSubCategoryName, getSubCategoryDescription } from '../utils';
@@ -28,9 +28,27 @@ import { getSubCategoryName, getSubCategoryDescription } from '../utils';
 export default class SubCategoryDefinitionsList extends React.PureComponent {
   static propTypes = {
     component: PropTypes.object,
+    fetchValues: PropTypes.func,
     settings: PropTypes.array.isRequired
   };
 
+  componentDidMount() {
+    this.fetchValues();
+  }
+
+  componentDidUpdate(prevProps /*: Object */) {
+    const prevKeys = prevProps.settings.map(setting => setting.definition.key);
+    const keys = this.props.settings.map(setting => setting.definition.key);
+    if (prevProps.component !== this.props.component || !isEqual(prevKeys, keys)) {
+      this.fetchValues();
+    }
+  }
+
+  fetchValues() {
+    const keys = this.props.settings.map(setting => setting.definition.key).join();
+    this.props.fetchValues(keys, this.props.component && this.props.component.key);
+  }
+
   renderEmailForm(subCategoryKey /*: string */) {
     const isEmailSettings = this.props.category === 'general' && subCategoryKey === 'email';
     if (!isEmailSettings) {
index 8c42137cf57f7da865673dcb5ef9671228713beb..1e61966af34f021528c7dfb1689e9e98822bf6e0 100644 (file)
@@ -35,8 +35,8 @@ import { translate } from '../../../helpers/l10n';
 import { getSettingsAppDefinition, getSettingsAppChangedValue } from '../../../store/rootReducer';
 
 export const fetchSettings = componentKey => dispatch => {
-  return getDefinitions(componentKey)
-    .then(definitions => {
+  return getDefinitions(componentKey).then(
+    definitions => {
       const filtered = definitions
         .filter(definition => definition.type !== 'LICENSE')
         // do not display this setting on project level
@@ -45,15 +45,19 @@ export const fetchSettings = componentKey => dispatch => {
             componentKey == null || definition.key !== 'sonar.branch.longLivedBranches.regex'
         );
       dispatch(receiveDefinitions(filtered));
-      const keys = filtered.map(definition => definition.key).join();
-      return getValues(keys, componentKey);
-    })
-    .then(settings => {
+    },
+    e => parseError(e).then(message => dispatch(addGlobalErrorMessage(message)))
+  );
+};
+
+export const fetchValues = (keys, componentKey) => dispatch =>
+  getValues(keys, componentKey).then(
+    settings => {
       dispatch(receiveValues(settings, componentKey));
       dispatch(closeAllGlobalMessages());
-    })
-    .catch(e => parseError(e).then(message => dispatch(addGlobalErrorMessage(message))));
-};
+    },
+    () => {}
+  );
 
 export const saveValue = (key, componentKey) => (dispatch, getState) => {
   dispatch(startLoading(key));