aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/apps/code/components/Code.js
blob: 7f364cf3939668c69c7128624017ba7a66cc219e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import classNames from 'classnames';
import React, { Component } from 'react';
import { connect } from 'react-redux';

import Components from './Components';
import Breadcrumbs from './Breadcrumbs';
import SourceViewer from './SourceViewer';
import { initComponent, browse } from '../actions';
import { TooltipsContainer } from '../../../components/mixins/tooltips-mixin';


class Code extends Component {
  componentDidMount () {
    const { dispatch, component, routing } = this.props;
    const selectedKey = (routing.path && decodeURIComponent(routing.path.substr(1))) || component.key;
    dispatch(initComponent(component.key, component.breadcrumbs))
        .then(() => dispatch(browse(selectedKey)));
  }

  componentWillReceiveProps (nextProps) {
    if (nextProps.routing !== this.props.routing) {
      const { dispatch, routing, component, fetching } = nextProps;
      if (!fetching) {
        const selectedKey = (routing.path && decodeURIComponent(routing.path.substr(1))) || component.key;
        dispatch(browse(selectedKey));
      }
    }
  }

  handleBrowse (component) {
    const { dispatch } = this.props;
    dispatch(browse(component.key));
  }

  render () {
    const { fetching, baseComponent, components, breadcrumbs, sourceViewer, coverageMetric } = this.props;
    const shouldShowBreadcrumbs = Array.isArray(breadcrumbs) && breadcrumbs.length > 1;
    const shouldShowComponents = !sourceViewer && components;
    const shouldShowSourceViewer = sourceViewer;

    const componentsClassName = classNames('spacer-top', { 'new-loading': fetching });

    return (
        <TooltipsContainer options={{ delay: { show: 500, hide: 0 } }}>
          <div className="page">
            <header className="page-header">
              <h1 className="page-title">{window.t('code.page')}</h1>

              <div
                  className="pull-left"
                  style={{ visibility: fetching ? 'visible' : 'hidden' }}>
                <i className="spinner"/>
              </div>

              {shouldShowBreadcrumbs && (
                  <Breadcrumbs
                      breadcrumbs={breadcrumbs}
                      onBrowse={this.handleBrowse.bind(this)}/>
              )}
            </header>

            {shouldShowComponents && (
                <div className={componentsClassName}>
                  <Components
                      baseComponent={baseComponent}
                      components={components}
                      coverageMetric={coverageMetric}
                      onBrowse={this.handleBrowse.bind(this)}/>
                </div>
            )}

            {shouldShowSourceViewer && (
                <div className="spacer-top">
                  <SourceViewer component={sourceViewer}/>
                </div>
            )}
          </div>
        </TooltipsContainer>
    );
  }
}

export default connect(state => {
  return Object.assign({ routing: state.routing }, state.current);
})(Code);