/* * SonarQube :: Web * Copyright (C) 2009-2016 SonarSource SA * mailto:contact AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import $ from 'jquery'; import _ from 'underscore'; import Backbone from 'backbone'; import Marionette from 'backbone.marionette'; import Rules from './models/rules'; import MetaView from './rule/rule-meta-view'; import DescView from './rule/rule-description-view'; import ParamView from './rule/rule-parameters-view'; import ProfilesView from './rule/rule-profiles-view'; import CustomRulesView from './rule/custom-rules-view'; import ManualRuleCreationView from './rule/manual-rule-creation-view'; import CustomRuleCreationView from './rule/custom-rule-creation-view'; import IssuesView from './rule/rule-issues-view'; import Template from './templates/coding-rules-rule-details.hbs'; import confirmDialog from './confirm-dialog'; import { translate, translateWithParameters } from '../../helpers/l10n'; export default Marionette.LayoutView.extend({ className: 'coding-rule-details', template: Template, 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-edit-custom': 'editCustomRule', 'click .js-delete': 'deleteRule' }, initialize: function () { this.bindShortcuts(); this.customRules = new Rules(); if (this.model.get('isTemplate')) { this.fetchCustomRules(); } this.listenTo(this.options.app.state, 'change:selectedIndex', this.select); }, 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(0); }, onDestroy: 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 () { return this.model.getInactiveProfiles(this.options.actives, this.options.app.qualityProfiles); }, bindShortcuts: function () { var that = this; key('up', 'details', function () { that.options.app.controller.selectPrev(); return false; }); key('down', 'details', function () { that.options.app.controller.selectNext(); return false; }); key('left, backspace', '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(); }, editCustomRule: function () { new CustomRuleCreationView({ app: this.options.app, model: this.model }).render(); }, deleteRule: function () { var that = this, ruleType = this.model.has('templateKey') ? 'custom' : 'manual'; confirmDialog({ title: translate('delete'), html: translateWithParameters('coding_rules.delete.' + ruleType + '.confirm', this.model.get('name')), yesHandler: function () { var url = baseUrl + '/api/rules/delete', options = { key: that.model.id }; $.post(url, options).done(function () { that.options.app.controller.fetchList(); }); } }); }, select: function () { var selected = this.options.app.state.get('selectedIndex'), selectedRule = this.options.app.list.at(selected); this.options.app.controller.showDetails(selectedRule); }, 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')) }); } });