name: 'issues/app'
out: '<%= pkg.assets %>build/js/issues/app.js'
- issuesOld: options:
- name: 'issues-old/app'
- out: '<%= pkg.assets %>build/js/issues-old/app.js'
-
measures: options:
name: 'measures/app'
out: '<%= pkg.assets %>build/js/measures/app.js'
'<%= pkg.assets %>js/templates/issues.js': [
'<%= pkg.sources %>hbs/issues/**/*.hbs'
]
- '<%= pkg.assets %>js/templates/issues-old.js': [
- '<%= pkg.sources %>hbs/issues-old/**/*.hbs'
- ]
'<%= pkg.assets %>js/templates/api-documentation.js': [
'<%= pkg.sources %>hbs/api-documentation/**/*.hbs'
]
+++ /dev/null
-<div class="navigator-filters-list"></div>
-<button class="navigator-filter-submit">{{t 'search_verb'}}</button>
+++ /dev/null
-<div class="line line-small">
- {{severityIcon severity}}{{translate "severities" severity}}
- {{statusIcon status}}{{translate "statuses" status}}
- {{#if resolution}}({{translate "resolutions" resolution}}){{/if}}
-
- <div class="line-right">
- {{fUpdateAge}}
- </div>
-</div>
-
-<div class="line line-nowrap" title="{{message}}">
- {{message}}
-</div>
-
-<div class="line">
- {{#unless singleProject}}
- <div class="subtitle line-nowrap">{{default projectLongName projectName}}</div>
- {{/unless}}
- <div class="subtitle line-nowrap">{{componentLongName}}</div>
-</div>
+++ /dev/null
-{{#unless maxResultsReached}}
- <div class="navigator-actions-order">
- {{#if sorting}}
- {{t 'issues.ordered_by'}} <strong class="navigator-actions-ordered-by">{{sorting.sortText}}</strong> {{#if sorting.asc}}<i class="icon-sort-asc"></i>{{else}}<i class="icon-sort-desc"></i>{{/if}}
- {{else}}
- Order
- {{/if}}
- </div>
- <ul class="navigator-actions-order-choices">
- <li data-sort="UPDATE_DATE" data-asc="true">{{t 'issues.sort.update_date'}} <i class="icon-sort-asc"></i></li>
- <li data-sort="UPDATE_DATE" data-asc="false">{{t 'issues.sort.update_date'}} <i class="icon-sort-desc"></i></li>
- <li data-sort="SEVERITY" data-asc="true">{{t 'issues.sort.severity'}} <i class="icon-sort-asc"></i></li>
- <li data-sort="SEVERITY" data-asc="false">{{t 'issues.sort.severity'}} <i class="icon-sort-desc"></i></li>
- <li data-sort="STATUS" data-asc="true">{{t 'issues.sort.status'}} <i class="icon-sort-asc"></i></li>
- <li data-sort="STATUS" data-asc="false">{{t 'issues.sort.status'}} <i class="icon-sort-desc"></i></li>
- </ul>
-{{/unless}}
-<div class="navigator-actions-total">
- {{t 'issues.found'}}: <strong>{{paging.fTotal}}</strong>
- {{#notEq paging.fTotal 0}}
- {{#if appState.canBulkChange}}
- <a href="{{bulkChangeUrl}}?{{query}}"
- class="navigator-actions-bulk icon-bulk-change" title="{{t 'bulk_change'}}"></a>
- {{/if}}
- {{/notEq}}
-</div>
+++ /dev/null
-{{#if items}}
- <ul class="navigator-filter-select-list">
- {{#each items}}
- <li>
- <label data-id="{{id}}">{{{name}}}</label>
- </li>
- {{/each}}
- </ul>
-{{/if}}
-<ul class="navigator-filter-select-list">
- <li class="manage">
- <label id="manage-favorites">{{t 'manage'}}</label>
- </li>
-</ul>
+++ /dev/null
-<h1 class="navigator-header-title">
- {{#if name}}
- {{name}}
- <span class="navigator-header-title-note">
- {{#unless shared}}
- [{{t 'issue_filter.private'}}]
- {{else}}
- {{#eq user currentUser}}
- [{{t 'issue_filter.shared_with_all_users'}}]
- {{else}}
- {{#if user}}
- [{{t 'issue_filter.shared'}}]
- {{/if}}
- {{/eq}}
- {{/unless}}
- </span>
- {{else}}
- {{t 'issues'}}
- {{/if}}
-</h1>
-
- <div class="navigator-header-actions button-group">
- <button id="issues-new-search">{{t 'issue_filter.new_search'}}</button>
-
- {{#if appState.canManageFilters}}
- {{#if canModify}}
- {{#if canSave}}<button id="issues-filter-save">{{t 'save'}}</button>{{/if}}
- {{/if}}
- {{#unless id}}<button id="issues-filter-save-as">{{t 'save_as'}}</button>{{/unless}}
- {{#if id}}<button id="issues-filter-copy">{{t 'copy'}}</button>{{/if}}
- {{#if canModify}}
- {{#if id}}<button id="issues-filter-edit">{{t 'edit'}}</button>{{/if}}
- {{/if}}
- {{/if}}
- </div>
-
-{{#if description}}
- <div class="navigator-header-description">{{description}}</div>
-{{/if}}
+++ /dev/null
-<ol class="navigator-results-list"></ol>
-<div class="navigator-results-loader">
- <i class="spinner"></i>
-</div>
+++ /dev/null
-{{t 'issue_filter.no_issues'}}
+++ /dev/null
-requirejs.config({
- baseUrl: baseUrl + '/js',
-
- paths: {
- 'backbone': 'third-party/backbone',
- 'backbone.marionette': 'third-party/backbone.marionette',
- 'handlebars': 'third-party/handlebars'
- },
-
- shim: {
- 'backbone.marionette': {
- deps: ['backbone'],
- exports: 'Marionette'
- },
- 'backbone': {
- exports: 'Backbone'
- },
- 'handlebars': {
- exports: 'Handlebars'
- }
- }
-
-});
-
-requirejs(
- [
- 'backbone', 'backbone.marionette', 'handlebars',
- 'issues-old/extra',
- 'navigator/filters/filter-bar',
- 'navigator/filters/base-filters',
- 'navigator/filters/checkbox-filters',
- 'navigator/filters/choice-filters',
- 'navigator/filters/ajax-select-filters',
- 'navigator/filters/favorite-filters',
- 'navigator/filters/range-filters',
- 'navigator/filters/context-filters',
- 'navigator/filters/read-only-filters',
- 'navigator/filters/action-plan-filters',
- 'navigator/filters/rule-filters',
-
- 'common/handlebars-extensions'
- ],
- function (Backbone, Marionette, Handlebars, Extra, FilterBar, BaseFilters, CheckboxFilterView,
- ChoiceFilters, AjaxSelectFilters, FavoriteFilters, RangeFilters, ContextFilterView,
- ReadOnlyFilterView, ActionPlanFilterView, RuleFilterView) {
- Handlebars.registerPartial('detailInnerTemplate', jQuery('#issue-detail-inner-template').html());
-
- var NavigatorApp = new Marionette.Application();
-
-
- NavigatorApp.addRegions({
- headerRegion: '.navigator-header',
- filtersRegion: '.navigator-filters',
- resultsRegion: '.navigator-results',
- actionsRegion: '.navigator-actions',
- detailsRegion: '.navigator-details'
- });
-
-
- NavigatorApp.addInitializer(function () {
- jQuery('html').addClass('navigator-page issues-page');
-
- this.appState = new Extra.AppState();
- window.SS.appState = this.appState;
-
- this.state = new Backbone.Model({
- query: ''
- });
-
- this.issues = new Extra.Issues();
- this.issues.sorting = {
- sort: 'UPDATE_DATE',
- asc: false
- };
- this.issuesPage = 1;
-
- this.filters = new BaseFilters.Filters();
-
- this.favoriteFilter = new Extra.FavoriteFilter();
- this.issuesHeaderView = new Extra.IssuesHeaderView({
- app: this,
- model: this.favoriteFilter
- });
- this.headerRegion.show(this.issuesHeaderView);
-
- this.issuesView = new Extra.IssuesView({
- app: this,
- collection: this.issues
- });
- this.resultsRegion.show(this.issuesView);
-
- this.issuesActionsView = new Extra.IssuesActionsView({
- app: this,
- collection: this.issues
- });
- this.actionsRegion.show(this.issuesActionsView);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.projectFilter = new BaseFilters.Filter({
- name: window.SS.phrases.project,
- property: 'componentRoots',
- type: AjaxSelectFilters.ProjectFilterView,
- enabled: true,
- optional: false
- });
- this.filters.add(this.projectFilter);
-
- this.assigneeChoices = {
- '!assigned': window.SS.phrases.unassigned
- };
- this.reporterChoices = {};
- if (window.SS.currentUser) {
- this.assigneeChoices[window.SS.currentUser] = window.SS.currentUserName + ' (' + window.SS.currentUser + ')';
- this.reporterChoices[window.SS.currentUser] = window.SS.currentUserName + ' (' + window.SS.currentUser + ')';
- }
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.severity,
- property: 'severities',
- type: ChoiceFilters.ChoiceFilterView,
- enabled: true,
- optional: false,
- choices: {
- 'BLOCKER': window.SS.phrases.severities.BLOCKER,
- 'CRITICAL': window.SS.phrases.severities.CRITICAL,
- 'MAJOR': window.SS.phrases.severities.MAJOR,
- 'MINOR': window.SS.phrases.severities.MINOR,
- 'INFO': window.SS.phrases.severities.INFO
- },
- choiceIcons: {
- 'BLOCKER': 'severity-blocker',
- 'CRITICAL': 'severity-critical',
- 'MAJOR': 'severity-major',
- 'MINOR': 'severity-minor',
- 'INFO': 'severity-info'
- }
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.status,
- property: 'statuses',
- type: ChoiceFilters.ChoiceFilterView,
- enabled: true,
- optional: false,
- choices: {
- 'OPEN': window.SS.phrases.statuses.OPEN,
- 'CONFIRMED': window.SS.phrases.statuses.CONFIRMED,
- 'REOPENED': window.SS.phrases.statuses.REOPENED,
- 'RESOLVED': window.SS.phrases.statuses.RESOLVED,
- 'CLOSED': window.SS.phrases.statuses.CLOSED
- },
- choiceIcons: {
- 'OPEN': 'status-open',
- 'CONFIRMED': 'status-confirmed',
- 'REOPENED': 'status-reopened',
- 'RESOLVED': 'status-resolved',
- 'CLOSED': 'status-closed'
- }
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.assignee,
- property: 'assignees',
- type: AjaxSelectFilters.AssigneeFilterView,
- enabled: true,
- optional: false,
- choices: this.assigneeChoices
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.resolution,
- property: 'resolutions',
- type: ChoiceFilters.ChoiceFilterView,
- enabled: true,
- optional: false,
- choices: {
- '!resolved=true': window.SS.phrases.resolutions.RESOLVED,
- '!resolved=false': window.SS.phrases.resolutions.UNRESOLVED,
- 'FALSE-POSITIVE': window.SS.phrases.resolutions['FALSE-POSITIVE'],
- 'FIXED': window.SS.phrases.resolutions.FIXED,
- 'REMOVED': window.SS.phrases.resolutions.REMOVED
- }
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.actionPlan,
- property: 'actionPlans',
- type: ActionPlanFilterView,
- enabled: false,
- optional: true,
- projectFilter: this.projectFilter,
- choices: {
- '!planned': window.SS.phrases.unplanned
- }
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.created,
- propertyFrom: 'createdAfter',
- propertyTo: 'createdBefore',
- type: RangeFilters.DateRangeFilterView,
- enabled: false,
- optional: true
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.createdAt,
- property: 'createdAt',
- type: ReadOnlyFilterView,
- enabled: false,
- optional: true,
- format: function(value) { return moment(value).format('YYYY-MM-DD HH:mm'); }
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.language,
- property: 'languages',
- type: ChoiceFilters.ChoiceFilterView,
- enabled: false,
- optional: true,
- choices: window.SS.languages
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.reporter,
- property: 'reporters',
- type: AjaxSelectFilters.ReporterFilterView,
- enabled: false,
- optional: true,
- choices: this.reporterChoices
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filters.add([
- new BaseFilters.Filter({
- name: window.SS.phrases.rule,
- property: 'rules',
- type: RuleFilterView,
- enabled: false,
- optional: true
- })
- ]);
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.filterBarView = new Extra.IssuesFilterBarView({
- app: this,
- collection: this.filters,
- extra: {
- sort: '',
- asc: false
- }
- });
-
- this.filtersRegion.show(this.filterBarView);
- });
-
-
- NavigatorApp.addInitializer(function () {
- var app = this;
-
- jQuery.when(this.appState.fetch()).done(function () {
-
- if (app.appState.get('favorites')) {
- app.filters.unshift(
- new BaseFilters.Filter({
- type: Extra.IssuesFavoriteFilterView,
- enabled: true,
- optional: false,
- choices: app.appState.get('favorites'),
- manageUrl: '/issues/manage'
- })
- );
- }
-
- app.router = new Extra.IssuesRouter({
- app: app
- });
- Backbone.history.start();
-
- app.favoriteFilter.on('change:query', function (model, query) {
- app.router.navigate(query, { trigger: true, replace: true });
- });
- });
- });
-
-
- NavigatorApp.addInitializer(function () {
- var app = this;
-
- window.onBulkIssues = function () {
- app.fetchFirstPage();
- jQuery('#modal').dialog('close');
- };
-
- window.onSaveAs = window.onCopy = window.onEdit = function (id) {
- jQuery('#modal').dialog('close');
- app.appState.fetch();
-
- var filter = new Extra.FavoriteFilter({ id: id });
- filter.fetch({
- success: function () {
- app.state.set('search', false);
- app.favoriteFilter.set(filter.toJSON());
- app.fetchFirstPage();
- }
- });
- };
- });
-
-
- NavigatorApp.addInitializer(function () {
- this.onResize = function() {
- var footerEl = jQuery('#footer'),
- footerHeight = footerEl.outerHeight(true);
-
- var resultsEl = jQuery('.navigator-results'),
- resultsHeight = jQuery(window).height() - resultsEl.offset().top -
- parseInt(resultsEl.css('margin-bottom'), 10) - footerHeight;
- resultsEl.height(resultsHeight);
-
- var detailsEl = jQuery('.navigator-details'),
- detailsWidth = jQuery(window).width() - detailsEl.offset().left -
- parseInt(detailsEl.css('margin-right'), 10) - 20,
- detailsHeight = jQuery(window).height() - detailsEl.offset().top -
- parseInt(detailsEl.css('margin-bottom'), 10) - footerHeight;
- detailsEl.width(detailsWidth).height(detailsHeight);
-
- var resultsLoadingEl = jQuery('.navigator-results-loader');
- resultsLoadingEl
- .css('top', resultsEl.offset().top)
- .css('left', resultsEl.offset().left)
- .width(resultsEl.width() + 10)
- .height(resultsEl.height() + 10);
- };
- jQuery(window).on('resize', this.onResize);
- this.onResize();
- });
-
-
- NavigatorApp.addInitializer(function () {
- var that = this;
- jQuery('body')
- .on('mousemove', function (e) {
- that.processResize(e);
- })
- .on('mouseup', function () {
- that.stopResize();
- });
- jQuery('.navigator-resizer').on('mousedown', function (e) {
- that.startResize(e);
- });
-
- var resultsWidth = localStorage.getItem('issuesResultsWidth');
- if (resultsWidth) {
- jQuery('.navigator-results').width(+resultsWidth);
- jQuery('.navigator-side').width(+resultsWidth + 20);
- this.onResize();
- }
- });
-
-
- NavigatorApp.startResize = function (e) {
- this.isResize = true;
- this.originalWidth = jQuery('.navigator-results').width();
- this.x = e.clientX;
- jQuery('html').attr('unselectable', 'on').css('user-select', 'none').on('selectstart', false);
- };
-
-
- NavigatorApp.processResize = function (e) {
- if (this.isResize) {
- var delta = e.clientX - this.x;
- jQuery('.navigator-results').width(this.originalWidth + delta);
- jQuery('.navigator-side').width(this.originalWidth + 20 + delta);
- localStorage.setItem('issuesResultsWidth', jQuery('.navigator-results').width());
- this.onResize();
- }
- };
-
-
- NavigatorApp.stopResize = function() {
- if (this.isResize) {
- jQuery('html').attr('unselectable', 'off').css('user-select', 'text').off('selectstart');
- }
- this.isResize = false;
- };
-
-
- NavigatorApp.getQuery = function (withoutId) {
- if (this.filterBarView) {
- var query = this.filterBarView.getQuery();
- if (!withoutId && this.favoriteFilter.id) {
- query['id'] = this.favoriteFilter.id;
- }
- return query;
- } else {
- return {};
- }
- };
-
-
- NavigatorApp.storeQuery = function (query, sorting) {
- if (sorting) {
- _.extend(query, {
- sort: sorting.sort,
- asc: '' + sorting.asc
- });
- }
-
- var queryString = _.map(query,function (v, k) {
- return [k, encodeURIComponent(v)].join('=');
- }).join('|');
- this.router.navigate(queryString, { replace: true });
- };
-
-
- NavigatorApp.restoreSorting = function (query) {
- var sort = _.findWhere(query, { key: 'sort' }),
- asc = _.findWhere(query, { key: 'asc' });
-
- if (sort && asc) {
- this.issues.sorting = {
- sort: sort.value,
- sortText: jQuery('[data-sort=' + sort.value + ']:first').text(),
- asc: asc.value === 'true'
- };
- }
- };
-
-
- NavigatorApp.fetchIssues = function (firstPage) {
- var query = this.getQuery(),
- fetchQuery = _.extend({
- pageIndex: this.issuesPage
- }, query);
-
- // SONAR-5086
- if (fetchQuery['actionPlans'] && fetchQuery['componentRoots']) {
- delete fetchQuery['componentRoots'];
- }
-
- if (this.issues.sorting) {
- _.extend(fetchQuery, {
- sort: this.issues.sorting.sort,
- asc: this.issues.sorting.asc
- });
- }
-
- _.extend(fetchQuery, {
- hideRules: true
- });
-
- if (this.favoriteFilter.id) {
- query['id'] = this.favoriteFilter.id;
- fetchQuery['id'] = this.favoriteFilter.id;
- }
-
- this.storeQuery(query, this.issues.sorting);
-
- var that = this;
- jQuery('.navigator-results').addClass('fetching');
- if (firstPage) {
- this.issues.fetch({
- data: fetchQuery,
- success: function () {
- jQuery('.navigator-results').removeClass('fetching');
- that.issuesView.selectFirst();
- }
- });
- this.detailsRegion.reset();
- } else {
- this.issues.fetch({
- data: fetchQuery,
- remove: false,
- success: function () {
- jQuery('.navigator-results').removeClass('fetching');
- }
- });
- }
- };
-
-
- NavigatorApp.fetchFirstPage = function () {
- this.issuesPage = 1;
- this.fetchIssues(true);
- };
-
-
- NavigatorApp.fetchNextPage = function () {
- if (this.issuesPage < this.issues.paging.pages) {
- this.issuesPage++;
- this.fetchIssues(false);
- }
- };
-
- window.requestMessages().done(function () {
- NavigatorApp.start();
- });
-
- });
+++ /dev/null
-define(
- [
- 'backbone',
- 'backbone.marionette',
- 'navigator/filters/filter-bar',
- 'navigator/filters/base-filters',
- 'navigator/filters/favorite-filters',
- 'navigator/filters/read-only-filters',
- 'component-viewer/main',
- 'templates/issues-old'
- ],
- function (Backbone, Marionette, FilterBarView, BaseFilters, FavoriteFiltersModule, ReadOnlyFilterView,
- ComponentViewer, Templates) {
-
- var AppState = Backbone.Model.extend({
-
- defaults: {
- canManageFilters: false,
- canBulkChange: false
- },
-
-
- url: function () {
- return baseUrl + '/api/issue_filters/app';
- }
-
- });
-
-
- var Issue = Backbone.Model.extend({
-
- url: function () {
- return baseUrl + '/api/issues/show?key=' + this.get('key');
- },
-
-
- parse: function (r) {
- return r.issue ? r.issue : r;
- }
-
- });
-
-
- var Issues = Backbone.Collection.extend({
- model: Issue,
-
-
- url: function () {
- return baseUrl + '/api/issues/search';
- },
-
-
- parse: function (r) {
-
- function find(source, key, keyField) {
- var searchDict = {};
- searchDict[keyField || 'key'] = key;
- return _.findWhere(source, searchDict) || key;
- }
-
- this.paging = r.paging;
- this.maxResultsReached = r.maxResultsReached;
-
- return r.issues.map(function (issue) {
- var component = find(r.components, issue.component),
- project = find(r.projects, issue.project),
- rule = find(r.rules, issue.rule);
-
- if (component) {
- _.extend(issue, {
- componentLongName: component.longName,
- componentQualifier: component.qualifier
- });
- }
-
- if (project) {
- _.extend(issue, {
- projectLongName: project.longName
- });
- }
-
- if (rule) {
- _.extend(issue, {
- ruleName: rule.name
- });
- }
-
- return issue;
- });
-
- }
- });
-
-
- var FavoriteFilter = Backbone.Model.extend({
-
- url: function () {
- return baseUrl + '/api/issue_filters/show/' + this.get('id');
- },
-
-
- parse: function (r) {
- return r.filter ? r.filter : r;
- }
- });
-
-
- var FavoriteFilters = Backbone.Collection.extend({
- model: FavoriteFilter,
-
-
- url: function () {
- return baseUrl + '/api/issue_filters/favorites';
- },
-
-
- parse: function (r) {
- return r.favoriteFilters;
- }
- });
-
-
- var IssueView = Marionette.ItemView.extend({
- template: Templates['issue-detail'],
- tagName: 'li',
-
-
- ui: {
- component: '.component'
- },
-
-
- events: {
- 'click': 'showDetails'
- },
-
-
- modelEvents: {
- 'change': 'render'
- },
-
-
- showDetails: function () {
- key.setScope('list');
- this.options.issuesView.selected = this.$el.parent().children().index(this.$el);
-
- this.options.issuesView.selectIssue(this.$el, false);
-
- var that = this,
- app = this.options.app,
- settings = localStorage.getItem('componentViewerSettings'),
- navigatorDetails = jQuery('.navigator-details'),
- componentViewer = new ComponentViewer({
- settings: settings,
- shouldStoreSettings: true,
- elementToFit: navigatorDetails,
- component: {
- project: this.model.get('project'),
- projectLongName: this.model.get('projectLongName')
- }
- }),
- showCallback = function () {
- navigatorDetails.removeClass('navigator-fetching');
- app.detailsRegion.show(componentViewer);
- componentViewer.settings.set('issues', false);
- componentViewer.open(that.model.get('component'));
- componentViewer.on('loaded', function() {
- componentViewer.off('loaded');
- componentViewer.showIssues(false, that.model.toJSON());
- });
- };
-
- navigatorDetails.empty().addClass('navigator-fetching');
- var issueKey = this.model.get('key');
- this.model.clear({ silent: true });
- this.model.set({ key: issueKey }, { silent: true });
- jQuery.when(this.model.fetch()).done(showCallback);
- },
-
-
- serializeData: function () {
- var projectFilter = this.options.app.filters.findWhere({ property: 'componentRoots' }),
- singleProject = _.isArray(projectFilter.get('value')) && projectFilter.get('value').length === 1;
-
- return _.extend({
- singleProject: singleProject
- }, this.model.toJSON());
- }
- });
-
-
- var NoIssuesView = Marionette.ItemView.extend({
- tagName: 'li',
- className: 'navigator-results-no-results',
- template: Templates['no-issues']
- });
-
-
- var IssuesView = Marionette.CompositeView.extend({
- template: Templates['issues'],
- itemViewContainer: '.navigator-results-list',
- itemView: IssueView,
- emptyView: NoIssuesView,
-
-
- initialize: function() {
- var openIssue = function(el) {
- el.click();
- };
- this.openIssue = _.debounce(openIssue, 300);
- },
-
-
- itemViewOptions: function () {
- return {
- issuesView: this,
- app: this.options.app
- };
- },
-
-
- selectIssue: function(el, open) {
- this.$('.active').removeClass('active');
- el.addClass('active');
- if (open) {
- this.openIssue(el);
- }
- },
-
-
- selectFirst: function() {
- this.selected = -1;
- this.selectNext();
- },
-
-
- selectNext: function() {
- if (this.selected < this.collection.length - 1) {
- this.selected++;
- var child = this.$(this.itemViewContainer).children().eq(this.selected),
- container = jQuery('.navigator-results'),
- containerHeight = container.height(),
- bottom = child.position().top + child.outerHeight();
- if (bottom > containerHeight) {
- container.scrollTop(container.scrollTop() - containerHeight + bottom);
- }
- this.selectIssue(child, true);
- }
- },
-
-
- selectPrev: function() {
- if (this.selected > 0) {
- this.selected--;
- var child = this.$(this.itemViewContainer).children().eq(this.selected),
- container = jQuery('.navigator-results'),
- top = child.position().top;
- if (top < 0) {
- container.scrollTop(container.scrollTop() + top);
- }
- this.selectIssue(child, true);
- }
- },
-
-
- onRender: function () {
- var that = this,
- $scrollEl = jQuery('.navigator-results'),
- scrollEl = $scrollEl.get(0),
- onScroll = function () {
- if (scrollEl.offsetHeight + scrollEl.scrollTop >= scrollEl.scrollHeight) {
- that.options.app.fetchNextPage();
- }
- },
- throttledScroll = _.throttle(onScroll, 300);
- $scrollEl.off('scroll').on('scroll', throttledScroll);
- this.bindShortcuts();
- },
-
-
- onAfterItemAdded: function () {
- var showLimitNotes = this.collection.maxResultsReached != null && this.collection.maxResultsReached;
- jQuery('.navigator').toggleClass('navigator-with-notes', showLimitNotes);
- jQuery('.navigator-notes').toggle(showLimitNotes);
- },
-
-
- close: function () {
- var scrollEl = jQuery('.navigator-results');
- scrollEl.off('scroll');
- Marionette.CollectionView.prototype.close.call(this);
- },
-
-
- bindShortcuts: function () {
- var that = this;
- key('up', 'list', function() {
- that.selectPrev();
- });
- key('down', 'list', function() {
- that.selectNext();
- });
- }
-
- });
-
-
- var IssuesActionsView = Marionette.ItemView.extend({
- template: Templates['issues-actions'],
-
-
- collectionEvents: {
- 'sync': 'render'
- },
-
-
- events: {
- 'click .navigator-actions-order': 'toggleOrderChoices',
- 'click .navigator-actions-order-choices': 'sort',
- 'click .navigator-actions-bulk': 'bulkChange'
- },
-
-
- ui: {
- orderChoices: '.navigator-actions-order-choices'
- },
-
-
- onRender: function () {
- if (!this.collection.sorting.sortText) {
- this.collection.sorting.sortText = this.$('[data-sort=' + this.collection.sorting.sort + ']:first').text();
- this.$('.navigator-actions-ordered-by').text(this.collection.sorting.sortText);
- }
- },
-
-
- toggleOrderChoices: function (e) {
- e.stopPropagation();
- this.ui.orderChoices.toggleClass('open');
- if (this.ui.orderChoices.is('.open')) {
- var that = this;
- jQuery('body').on('click.issues_actions', function () {
- that.ui.orderChoices.removeClass('open');
- });
- }
- },
-
-
- sort: function (e) {
- e.stopPropagation();
- this.ui.orderChoices.removeClass('open');
- jQuery('body').off('click.issues_actions');
- var el = jQuery(e.target),
- sort = el.data('sort'),
- asc = el.data('asc');
-
- if (sort != null && asc != null) {
- this.collection.sorting = {
- sort: sort,
- sortText: el.text(),
- asc: asc
- };
- this.options.app.fetchFirstPage();
- }
- },
-
-
- bulkChange: function(e) {
- e.preventDefault();
- openModalWindow(jQuery(e.currentTarget).prop('href'), {});
- },
-
-
- serializeData: function () {
- var data = Marionette.ItemView.prototype.serializeData.apply(this, arguments),
- bulkChangeData = this.options.app.getQuery(true),
- bulkChangeQuery = _.map(bulkChangeData,function (v, k) {
- return [k, encodeURIComponent(v)].join('=');
- }).join('&');
- return _.extend(data || {}, {
- paging: this.collection.paging,
- sorting: this.collection.sorting,
- maxResultsReached: this.collection.maxResultsReached,
- appState: window.SS.appState.toJSON(),
- bulkChangeUrl: baseUrl + '/issues/bulk_change_form',
- query: bulkChangeQuery
- });
- }
- });
-
-
-
- var IssuesDetailsFavoriteFilterView = FavoriteFiltersModule.DetailsFavoriteFilterView.extend({
- template: Templates['issues-details-favorite-filter'],
-
-
- applyFavorite: function (e) {
- var id = $j(e.target).data('id'),
- filter = new FavoriteFilter({ id: id }),
- app = this.options.filterView.options.app;
-
- filter.fetch({
- success: function () {
- app.state.set('search', false);
- app.favoriteFilter.clear({ silent: true });
- app.favoriteFilter.set(filter.toJSON());
- }
- });
-
- this.options.filterView.hideDetails();
- },
-
-
- serializeData: function () {
- return _.extend({}, this.model.toJSON(), {
- items: _.sortBy(this.model.get('choices'), function(item) {
- return item.name.toLowerCase();
- })
- });
- }
- });
-
-
-
- var IssuesFavoriteFilterView = FavoriteFiltersModule.FavoriteFilterView.extend({
-
- initialize: function () {
- BaseFilters.BaseFilterView.prototype.initialize.call(this, {
- detailsView: IssuesDetailsFavoriteFilterView
- });
-
- this.listenTo(window.SS.appState, 'change:favorites', this.updateFavorites);
- },
-
-
- updateFavorites: function () {
- this.model.set('choices', window.SS.appState.get('favorites'));
- this.render();
- }
- });
-
-
-
- var IssuesFilterBarView = FilterBarView.extend({
- template: Templates['filter-bar'],
-
- collectionEvents: {
- 'change:enabled': 'changeEnabled'
- },
-
-
- events: {
- 'click .navigator-filter-submit': 'search'
- },
-
-
- getQuery: function () {
- var query = {};
- this.collection.each(function (filter) {
- _.extend(query, filter.view.formatValue());
- });
- return query;
- },
-
-
- onAfterItemAdded: function (itemView) {
- if (itemView.model.get('type') === FavoriteFiltersModule.FavoriteFilterView ||
- itemView.model.get('type') === IssuesFavoriteFilterView) {
- jQuery('.navigator-header').addClass('navigator-header-favorite');
- }
- },
-
-
- addMoreCriteriaFilter: function() {
- var readOnlyFilters = this.collection.where({ type: ReadOnlyFilterView }),
- disabledFilters = _.difference(this.collection.where({ enabled: false }), readOnlyFilters);
- this.moreCriteriaFilter = new BaseFilters.Filter({
- type: require('navigator/filters/more-criteria-filters').MoreCriteriaFilterView,
- enabled: true,
- optional: false,
- filters: disabledFilters
- });
- this.collection.add(this.moreCriteriaFilter);
- },
-
-
- changeEnabled: function () {
- var disabledFilters = _.reject(this.collection.where({ enabled: false }), function (filter) {
- return filter.get('type') ===
- require('navigator/filters/more-criteria-filters').MoreCriteriaFilterView ||
- filter.get('type') === ReadOnlyFilterView;
- });
-
- if (disabledFilters.length === 0) {
- this.moreCriteriaFilter.set({ enabled: false }, { silent: true });
- } else {
- this.moreCriteriaFilter.set({ enabled: true }, { silent: true });
- }
- this.moreCriteriaFilter.set({ filters: disabledFilters }, { silent: true });
- this.moreCriteriaFilter.trigger('change:filters');
- },
-
-
- search: function () {
- this.$('.navigator-filter-submit').blur();
- this.options.app.state.set({
- query: this.options.app.getQuery(),
- search: true
- });
- this.options.app.fetchFirstPage();
- },
-
-
- fetchNextPage: function () {
- this.options.app.fetchNextPage();
- }
-
- });
-
-
- var IssuesHeaderView = Marionette.ItemView.extend({
- template: Templates['issues-header'],
-
-
- modelEvents: {
- 'change': 'render'
- },
-
-
- events: {
- 'click #issues-new-search': 'newSearch',
- 'click #issues-filter-save-as': 'saveAs',
- 'click #issues-filter-save': 'save',
- 'click #issues-filter-copy': 'copy',
- 'click #issues-filter-edit': 'edit'
- },
-
-
- initialize: function (options) {
- Marionette.ItemView.prototype.initialize.apply(this, arguments);
- this.listenTo(options.app.state, 'change', this.render);
- },
-
-
- newSearch: function () {
- this.model.clear();
- this.options.app.router.navigate('resolved=false', { trigger: true, replace: true });
- },
-
-
- saveAs: function () {
- var url = baseUrl + '/issues/save_as_form?' + (Backbone.history.fragment || '').replace(/\|/g, '&');
- openModalWindow(url, {});
- },
-
-
- save: function () {
- var that = this;
- url = baseUrl + '/issues/save/' + this.model.id + '?' + (Backbone.history.fragment || '').replace(/\|/g, '&');
- jQuery.ajax({
- type: 'POST',
- url: url
- }).done(function () {
- that.options.app.state.set('search', false);
- });
- },
-
-
- copy: function () {
- var url = baseUrl + '/issues/copy_form/' + this.model.id;
- openModalWindow(url, {});
- },
-
-
- edit: function () {
- var url = baseUrl + '/issues/edit_form/' + this.model.id;
- openModalWindow(url, {});
- },
-
-
- serializeData: function () {
- return _.extend({
- canSave: this.model.id && this.options.app.state.get('search'),
- appState: window.SS.appState.toJSON(),
- currentUser: window.SS.currentUser
- }, this.model.toJSON());
- }
-
- });
-
-
-
- var IssuesRouter = Backbone.Router.extend({
-
- routes: {
- '': 'emptyQuery',
- ':query': 'index'
- },
-
-
- initialize: function (options) {
- this.app = options.app;
- },
-
-
- parseQuery: function (query, separator) {
- return (query || '').split(separator || '|').map(function (t) {
- var tokens = t.split('=');
- return {
- key: tokens[0],
- value: decodeURIComponent(tokens[1])
- };
- });
- },
-
-
- emptyQuery: function () {
- this.navigate('resolved=false', { trigger: true, replace: true });
- },
-
-
- index: function (query) {
- var params = this.parseQuery(query);
-
- var idObj = _.findWhere(params, { key: 'id' });
- if (idObj) {
- var that = this,
- f = this.app.favoriteFilter;
- this.app.canSave = false;
- f.set('id', idObj.value);
- f.fetch({
- success: function () {
- var parsedFilter = that.parseQuery(f.get('query'));
- params = _.extend({}, params);
- params = _.extent(params, parsedFilter);
- that.loadResults(params);
- }
- });
- } else {
- this.loadResults(params);
- }
- },
-
-
- loadResults: function (params) {
- this.app.filterBarView.restoreFromQuery(params);
- this.app.restoreSorting(params);
- this.app.fetchFirstPage();
- }
-
- });
-
-
- /*
- * Export public classes
- */
-
- return {
- AppState: AppState,
- Issue: Issue,
- Issues: Issues,
- FavoriteFilter: FavoriteFilter,
- FavoriteFilters: FavoriteFilters,
- IssueView: IssueView,
- IssuesView: IssuesView,
- IssuesActionsView: IssuesActionsView,
- IssuesFilterBarView: IssuesFilterBarView,
- IssuesHeaderView: IssuesHeaderView,
- IssuesFavoriteFilterView: IssuesFavoriteFilterView,
- IssuesRouter: IssuesRouter
- };
-
- });
<li>
<a href="<%= ApplicationController.root_context -%>/issues/index" class="<%= 'selected' if selected_section==Navigation::SECTION_ISSUES -%>"><%= message('issues.page') -%></a>
</li>
- <li>
- <a href="<%= ApplicationController.root_context -%>/issues2/index" class="<%= 'selected' if selected_section==Navigation::SECTION_ISSUES2 -%>">Old Issues</a>
- </li>
<li>
<a href="<%= ApplicationController.root_context -%>/coding_rules" class="<%= 'selected' if selected_section==Navigation::SECTION_CODING_RULES -%>"><%= message('coding_rules.page') -%></a>
</li>