aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/coding-rules/rule-details-view.js
blob: c6c6d75cb64bec261a26a8215399c1fc556abcbf (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
define([
      'coding-rules/models/rules',
      'coding-rules/rule/rule-meta-view',
      'coding-rules/rule/rule-description-view',
      'coding-rules/rule/rule-parameters-view',
      'coding-rules/rule/rule-profiles-view',
      'coding-rules/rule/custom-rules-view',
      'coding-rules/rule/manual-rule-creation-view',
      'coding-rules/rule/rule-issues-view',
      'templates/coding-rules'
    ],
    function (Rules,
              MetaView,
              DescView,
              ParamView,
              ProfilesView,
              CustomRulesView,
              ManualRuleCreationView,
              IssuesView) {

      var $ = jQuery;

      return Marionette.Layout.extend({
        className: 'coding-rule-details',
        template: Templates['coding-rules-rule-details'],

        regions: {
          metaRegion: '.js-rule-meta',
          descRegion: '.js-rule-description',
          paramRegion: '.js-rule-parameters',
          profilesRegion: '.js-rule-profiles',
          customRulesRegion: '.js-rule-custom-rules',
          issuesRegion: '.js-rule-issues'
        },

        events: {
          'click .js-edit-manual': 'editManualRule',
          'click .js-delete': 'deleteRule'
        },

        initialize: function () {
          this.bindShortcuts();
          this.customRules = new Rules();
          if (this.model.get('isTemplate')) {
            this.fetchCustomRules();
          }
        },

        onRender: function () {
          this.metaRegion.show(new MetaView({
            app: this.options.app,
            model: this.model
          }));
          this.descRegion.show(new DescView({
            app: this.options.app,
            model: this.model
          }));
          this.paramRegion.show(new ParamView({
            app: this.options.app,
            model: this.model
          }));
          this.profilesRegion.show(new ProfilesView({
            app: this.options.app,
            model: this.model,
            collection: new Backbone.Collection(this.getQualityProfiles())
          }));
          this.customRulesRegion.show(new CustomRulesView({
            app: this.options.app,
            model: this.model,
            collection: this.customRules
          }));
          this.issuesRegion.show(new IssuesView({
            app: this.options.app,
            model: this.model
          }));
          this.$el.scrollParent().scrollTop(30);
        },

        onClose: function () {
          this.unbindShortcuts();
        },

        fetchCustomRules: function () {
          var that = this,
              url = baseUrl + '/api/rules/search',
              options = {
                template_key: this.model.get('key'),
                f: 'name,severity,params'
              };
          return $.get(url, options).done(function (data) {
            that.customRules.reset(data.rules);
          });
        },

        getQualityProfiles: function () {
          var that = this;
          return this.options.actives.map(function (profile) {
            var profileBase = _.findWhere(that.options.app.qualityProfiles, { key: profile.qProfile });
            if (profileBase != null) {
              _.extend(profile, profileBase);
            }
            return profile;
          });
        },

        bindShortcuts: function () {
          var that = this;
          key('up', 'details', function () {
            that.options.app.controller.selectPrev();
            that.options.app.controller.showDetailsForSelected();
            return false;
          });
          key('down', 'details', function () {
            that.options.app.controller.selectNext();
            that.options.app.controller.showDetailsForSelected();
            return false;
          });
          key('left', 'details', function () {
            that.options.app.controller.hideDetails();
            return false;
          });
        },

        unbindShortcuts: function () {
          key.deleteScope('details');
        },

        editManualRule: function () {
          new ManualRuleCreationView({
            app: this.options.app,
            model: this.model
          }).render();
        },

        deleteRule: function () {
          var that = this,
              ruleType = this.model.has('templateKey') ? 'custom' : 'manual';
          window.confirmDialog({
            title: t('delete'),
            html: tp('coding_rules.delete.' + ruleType + '.confirm', this.model.get('name')),
            yesHandler: function () {
              var p = window.process.addBackgroundProcess(),
                  url = baseUrl + '/api/rules/delete',
                  options = { key: that.model.id };
              $.post(url, options).done(function () {
                that.options.app.controller.fetchList();
                window.process.finishBackgroundProcess(p);
              }).fail(function () {
                window.process.failBackgroundProcess(p);
              });
            }
          });
        },

        serializeData: function () {
          var isManual = this.model.get('isManual'),
              isCustom = this.model.has('templateKey'),
              isEditable = this.options.app.canWrite && (isManual || isCustom),
              qualityProfilesVisible = !isManual;

          if (qualityProfilesVisible) {
            if (this.model.get('isTemplate')) {
              qualityProfilesVisible = !_.isEmpty(this.options.actives);
            }
            else {
              qualityProfilesVisible = (this.options.app.canWrite || !_.isEmpty(this.options.actives));
            }
          }

          return _.extend(Marionette.ItemView.prototype.serializeData.apply(this, arguments), {
            isEditable: isEditable,
            canWrite: this.options.app.canWrite,
            qualityProfilesVisible: qualityProfilesVisible,
            allTags: _.union(this.model.get('sysTags'), this.model.get('tags'))
          });
        }
      });

    });