]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7530 Add pagination on the Project Measures page (#977)
authorStas Vilchik <vilchiks@gmail.com>
Mon, 16 May 2016 11:35:58 +0000 (13:35 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Mon, 16 May 2016 11:35:58 +0000 (13:35 +0200)
server/sonar-web/src/main/js/apps/component-measures/details/drilldown/ListView.js
server/sonar-web/src/main/js/apps/component-measures/details/drilldown/ListViewContainer.js
server/sonar-web/src/main/js/apps/component-measures/details/drilldown/TreeView.js
server/sonar-web/src/main/js/apps/component-measures/details/drilldown/TreeViewContainer.js
server/sonar-web/src/main/js/apps/component-measures/store/listViewActions.js
server/sonar-web/src/main/js/apps/component-measures/store/treeViewActions.js

index 87dd4c9e085aa307cd4107e8251016b8f16801c0..3fd24c2c26547d562c0500b52106b3e11b52fd1a 100644 (file)
@@ -24,6 +24,7 @@ import ComponentsList from './ComponentsList';
 import ListHeader from './ListHeader';
 import Spinner from '../../components/Spinner';
 import SourceViewer from '../../../code/components/SourceViewer';
+import ListFooter from '../../../../components/shared/list-footer';
 
 export default class ListView extends React.Component {
   static contextTypes = {
@@ -76,6 +77,11 @@ export default class ListView extends React.Component {
     onFetchList(baseComponent, metric, Number(periodIndex));
   }
 
+  handleFetchMore () {
+    const periodIndex = this.props.location.query.period || 1;
+    this.props.onFetchMore(Number(periodIndex));
+  }
+
   changeSelected (selected) {
     this.props.onSelect(selected);
   }
@@ -90,7 +96,7 @@ export default class ListView extends React.Component {
   }
 
   render () {
-    const { component, components, metrics, metric, leakPeriod, selected, fetching } = this.props;
+    const { component, components, metrics, metric, leakPeriod, selected, total, fetching } = this.props;
     const { onSelectNext, onSelectPrevious } = this.props;
 
     const breadcrumbs = [component];
@@ -114,12 +120,18 @@ export default class ListView extends React.Component {
           {!selected && (
               <div className={classNames({ 'new-loading': fetching })}>
                 {(!fetching || components.length !== 0) ? (
-                    <ComponentsList
-                        components={components}
-                        metrics={metrics}
-                        selected={selected}
-                        metric={metric}
-                        onClick={this.handleClick.bind(this)}/>
+                    <div>
+                      <ComponentsList
+                          components={components}
+                          metrics={metrics}
+                          selected={selected}
+                          metric={metric}
+                          onClick={this.handleClick.bind(this)}/>
+                      <ListFooter
+                          count={components.length}
+                          total={total}
+                          loadMore={this.handleFetchMore.bind(this)}/>
+                    </div>
                 ) : (
                     <Spinner/>
                 )}
index b3333a13d7a633fe774437acf81e86445e98c83c..c96c55863835d379730f8bd1584067ba3ba37f07 100644 (file)
@@ -21,7 +21,7 @@ import { connect } from 'react-redux';
 import pick from '../../../../../../../node_modules/lodash/pick';
 
 import ListView from './ListView';
-import { fetchList, selectComponent, selectNext, selectPrevious } from '../../store/listViewActions';
+import { fetchList, fetchMore, selectComponent, selectNext, selectPrevious } from '../../store/listViewActions';
 
 const mapStateToProps = state => {
   const drilldown = pick(state.list, [
@@ -42,6 +42,7 @@ const mapStateToProps = state => {
 const mapDispatchToProps = dispatch => {
   return {
     onFetchList: (baseComponent, metric, periodIndex) => dispatch(fetchList(baseComponent, metric, periodIndex)),
+    onFetchMore: periodIndex => dispatch(fetchMore(periodIndex)),
     onSelect: component => dispatch(selectComponent(component)),
     onSelectNext: component => dispatch(selectNext(component)),
     onSelectPrevious: component => dispatch(selectPrevious(component))
index 913819049474994d88b3194d4e6c4e293e43e0f8..d42bbf7167b5d7f81540414b0187d8a3e5f4c93e 100644 (file)
@@ -23,6 +23,7 @@ import ComponentsList from './ComponentsList';
 import ListHeader from './ListHeader';
 import Spinner from '../../components/Spinner';
 import SourceViewer from '../../../code/components/SourceViewer';
+import ListFooter from '../../../../components/shared/list-footer';
 
 export default class TreeView extends React.Component {
   componentDidMount () {
@@ -66,6 +67,10 @@ export default class TreeView extends React.Component {
     onStart(baseComponent, metric, Number(periodIndex));
   }
 
+  handleFetchMore () {
+    this.props.onFetchMore();
+  }
+
   changeSelected (selected) {
     this.props.onSelect(selected);
   }
@@ -88,7 +93,7 @@ export default class TreeView extends React.Component {
   }
 
   render () {
-    const { components, metrics, breadcrumbs, metric, leakPeriod, selected, fetching } = this.props;
+    const { components, metrics, breadcrumbs, metric, leakPeriod, selected, total, fetching } = this.props;
     const { onSelectNext, onSelectPrevious } = this.props;
 
     const selectedIndex = components.indexOf(selected);
@@ -108,12 +113,18 @@ export default class TreeView extends React.Component {
           {!selected && (
               <div>
                 {(!fetching || components.length !== 0) ? (
-                    <ComponentsList
-                        components={components}
-                        metrics={metrics}
-                        selected={selected}
-                        metric={metric}
-                        onClick={this.handleClick.bind(this)}/>
+                    <div>
+                      <ComponentsList
+                          components={components}
+                          metrics={metrics}
+                          selected={selected}
+                          metric={metric}
+                          onClick={this.handleClick.bind(this)}/>
+                      <ListFooter
+                          count={components.length}
+                          total={total}
+                          loadMore={this.handleFetchMore.bind(this)}/>
+                    </div>
                 ) : (
                     <Spinner/>
                 )}
index f21cc86f0c4b1144a2872e783d79bd06c7b654f2..4900542ad243b67c0548b23eef9fcc17531c10a4 100644 (file)
@@ -25,6 +25,7 @@ import {
     start,
     drilldown,
     useBreadcrumbs,
+    fetchMore,
     selectComponent,
     selectNext,
     selectPrevious
@@ -52,6 +53,7 @@ const mapDispatchToProps = dispatch => {
     onStart: (rootComponent, metric, periodIndex) => dispatch(start(rootComponent, metric, periodIndex)),
     onDrilldown: component => dispatch(drilldown(component)),
     onUseBreadcrumbs: component => dispatch(useBreadcrumbs(component)),
+    onFetchMore: () => dispatch(fetchMore()),
     onSelect: component => dispatch(selectComponent(component)),
     onSelectNext: component => dispatch(selectNext(component)),
     onSelectPrevious: component => dispatch(selectPrevious(component))
index 18037ac3c68907fc5fd1736964f878255846a9c8..8e61e53dd0a95df3b25e90a0f993a42c5e3ab1b8 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import { getComponentTree } from '../../../api/components';
-import { enhanceWithMeasure, filterOutEmptyMeasures } from '../utils';
+import { enhanceWithMeasure } from '../utils';
 import { startFetching, stopFetching } from './statusActions';
 import complementary from '../config/complementary';
 
@@ -35,8 +35,8 @@ function getComplementary (metric) {
 
 function makeRequest (baseComponent, metric, options, periodIndex = 1) {
   const asc = metric.direction === 1;
-  const ps = 200;
-  const finalOptions = { asc, ps };
+  const ps = 100;
+  const finalOptions = { asc, ps, metricSortFilter: 'withMeasuresOnly' };
 
   if (metric.key.indexOf('new_') === 0) {
     Object.assign(options, {
@@ -59,7 +59,7 @@ function fetchLeaves (baseComponent, metric, pageIndex = 1, periodIndex = 1) {
   const options = { p: pageIndex };
 
   return makeRequest(baseComponent, metric, options, periodIndex).then(r => {
-    const nextComponents = filterOutEmptyMeasures(enhanceWithMeasure(r.components, metric.key, periodIndex));
+    const nextComponents = enhanceWithMeasure(r.components, metric.key, periodIndex);
 
     return {
       components: nextComponents,
@@ -94,6 +94,18 @@ export function fetchList (baseComponent, metric, periodIndex = 1) {
   };
 }
 
+export function fetchMore (periodIndex) {
+  return (dispatch, getState) => {
+    const { baseComponent, metric, pageIndex, components } = getState().list;
+    dispatch(startFetching());
+    return fetchLeaves(baseComponent, metric, pageIndex + 1, periodIndex).then(r => {
+      const nextComponents = [...components, ...r.components];
+      dispatch(updateStore({ ...r, components: nextComponents }));
+      dispatch(stopFetching());
+    });
+  };
+}
+
 /**
  * Select specified component from the list
  * @param component A component to select
index 782ddfd7ebc321f6367643927a6b26acb809f1ff..49cc3ff504d0b121c811463d8f030c2adbaae739 100644 (file)
@@ -20,7 +20,7 @@
 import initial from 'lodash/initial';
 
 import { getComponentTree } from '../../../api/components';
-import { filterOutEmptyMeasures, enhanceWithMeasure } from '../utils';
+import { enhanceWithMeasure } from '../utils';
 import { startFetching, stopFetching } from './statusActions';
 import complementary from '../config/complementary';
 
@@ -68,7 +68,7 @@ function getComplementary (metric) {
 function makeRequest (rootComponent, baseComponent, metric, options, periodIndex = 1) {
   const asc = metric.direction === 1;
   const ps = 100;
-  const finalOptions = { asc, ps };
+  const finalOptions = { asc, ps, metricSortFilter: 'withMeasuresOnly' };
 
   if (metric.key.indexOf('new_') === 0) {
     Object.assign(options, {
@@ -98,7 +98,7 @@ function fetchComponents (rootComponent, baseComponent, metric, pageIndex = 1, p
   const options = { p: pageIndex };
 
   return makeRequest(rootComponent, baseComponent, metric, options, periodIndex).then(r => {
-    const nextComponents = filterOutEmptyMeasures(enhanceWithMeasure(r.components, metric.key, periodIndex));
+    const nextComponents = enhanceWithMeasure(r.components, metric.key, periodIndex);
 
     return {
       baseComponent,
@@ -188,6 +188,18 @@ export function useBreadcrumbs (component) {
   };
 }
 
+export function fetchMore () {
+  return (dispatch, getState) => {
+    const { rootComponent, baseComponent, metric, pageIndex, components, periodIndex } = getState().tree;
+    dispatch(startFetching());
+    return fetchComponents(rootComponent, baseComponent, metric, pageIndex + 1, periodIndex).then(r => {
+      const nextComponents = [...components, ...r.components];
+      dispatch(updateStore({ ...r, components: nextComponents }));
+      dispatch(stopFetching());
+    });
+  };
+}
+
 /**
  * Select given component from the list
  * @param component