aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/apps/projects/search.js
blob: 4d465b3665e49ece38b183195aef24bda235257c (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import _ from 'underscore';
import React from 'react';
import { TYPE, QUALIFIERS_ORDER } from './constants';
import DeleteView from './delete-view';
import RadioToggle from '../../components/shared/radio-toggle';
import Checkbox from '../../components/shared/checkbox';

export default React.createClass({
  propTypes: {
    onSearch: React.PropTypes.func.isRequired
  },

  onSubmit(e) {
    e.preventDefault();
    this.search();
  },

  search() {
    let q = this.refs.input.value;
    this.props.onSearch(q);
  },

  getTypeOptions() {
    return [
      { value: TYPE.ALL, label: 'All' },
      { value: TYPE.PROVISIONED, label: 'Provisioned' },
      { value: TYPE.GHOSTS, label: 'Ghosts' }
    ];
  },

  getQualifierOptions() {
    let options = this.props.topLevelQualifiers.map(q => {
      return { value: q, label: window.t('qualifiers', q) };
    });
    return _.sortBy(options, option => {
      return QUALIFIERS_ORDER.indexOf(option.value);
    });
  },

  renderCheckbox() {
    let isAllChecked = this.props.projects.length > 0 &&
            this.props.selection.length === this.props.projects.length;
    let thirdState = this.props.projects.length > 0 &&
            this.props.selection.length > 0 &&
            this.props.selection.length < this.props.projects.length;
    let isChecked = isAllChecked || thirdState;
    return <Checkbox onCheck={this.onCheck} initiallyChecked={isChecked} thirdState={thirdState}/>;
  },

  renderSpinner() {
    return <i className="spinner"/>;
  },

  onCheck(checked) {
    if (checked) {
      this.props.onAllSelected();
    } else {
      this.props.onAllDeselected();
    }
  },

  renderGhostsDescription () {
    if (this.props.type !== TYPE.GHOSTS || !this.props.ready) {
      return null;
    }
    return <div className="spacer-top alert alert-info">{window.t('bulk_deletion.ghosts.description')}</div>;
  },

  deleteProjects() {
    new DeleteView({
      deleteProjects: this.props.deleteProjects
    }).render();
  },

  renderQualifierFilter() {
    let options = this.getQualifierOptions();
    if (options.length < 2) {
      return null;
    }
    return (
        <td className="thin nowrap text-middle">
          <RadioToggle options={this.getQualifierOptions()} value={this.props.qualifiers}
                       name="projects-qualifier" onCheck={this.props.onQualifierChanged}/>
        </td>
    );
  },

  render() {
    let isSomethingSelected = this.props.projects.length > 0 && this.props.selection.length > 0;
    return (
        <div className="panel panel-vertical bordered-bottom spacer-bottom">
          <table className="data">
            <tbody>
            <tr>
              <td className="thin text-middle">
                {this.props.ready ? this.renderCheckbox() : this.renderSpinner()}
              </td>
              {this.renderQualifierFilter()}
              <td className="thin nowrap text-middle">
                <RadioToggle options={this.getTypeOptions()} value={this.props.type}
                             name="projects-type" onCheck={this.props.onTypeChanged}/>
              </td>
              <td className="text-middle">
                <form onSubmit={this.onSubmit} className="search-box">
                  <button className="search-box-submit button-clean">
                    <i className="icon-search"></i>
                  </button>
                  <input onChange={this.search}
                         value={this.props.query}
                         ref="input"
                         className="search-box-input"
                         type="search"
                         placeholder="Search"/>
                </form>
              </td>
              <td className="thin text-middle">
                <button onClick={this.deleteProjects} className="button-red"
                        disabled={!isSomethingSelected}>Delete
                </button>
              </td>
            </tr>
            </tbody>
          </table>
          {this.renderGhostsDescription()}
        </div>
    );
  }
});