From 7ffbafde4c2ac1d11b88dc5f7a77b714faf80eec Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Mon, 3 Jun 2013 00:18:15 +0200 Subject: [PATCH] SONAR-3755 refactor rendering of issues --- .../sonar/core/issue/db/IssueChangeDao.java | 11 +++ .../core/issue/db/IssueChangeMapper.java | 2 + .../sonar/core/issue/db/IssueChangeMapper.xml | 8 ++ .../core/issue/db/IssueChangeDaoTest.java | 13 ++++ .../issue/InternalRubyIssueService.java | 20 +++-- ...ntService.java => IssueChangeService.java} | 10 ++- .../org/sonar/server/platform/Platform.java | 2 +- .../app/controllers/issue_controller.rb | 44 +++++++---- .../app/views/issue/_changelog.html.erb | 19 +++++ .../WEB-INF/app/views/issue/_issue.html.erb | 75 +++++++++++-------- .../issue/_manual_issue_created.html.erb | 3 + .../WEB-INF/app/views/issue/_rule.html.erb | 24 ++++++ .../WEB-INF/app/views/issue/_show.html.erb | 16 ++++ .../app/views/issue/_show_modal.html.erb | 6 ++ .../WEB-INF/app/views/issue/_view.html.erb | 24 ------ .../WEB-INF/app/views/issue/show.html.erb | 3 + .../WEB-INF/app/views/issue/view.html.erb | 3 - .../WEB-INF/app/views/issues/_list.html.erb | 2 +- .../app/views/shared/_source_display.erb | 2 +- .../src/main/webapp/javascripts/issue.js | 30 ++++++++ .../src/main/webapp/stylesheets/jquery-ui.css | 2 + .../src/main/webapp/stylesheets/layout.css | 4 - .../src/main/webapp/stylesheets/style.css | 18 +++-- .../issue/InternalRubyIssueServiceTest.java | 2 +- 24 files changed, 246 insertions(+), 97 deletions(-) rename sonar-server/src/main/java/org/sonar/server/issue/{IssueCommentService.java => IssueChangeService.java} (91%) create mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/_changelog.html.erb create mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/_manual_issue_created.html.erb create mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/_rule.html.erb create mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show.html.erb create mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show_modal.html.erb delete mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/_view.html.erb create mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/show.html.erb delete mode 100644 sonar-server/src/main/webapp/WEB-INF/app/views/issue/view.html.erb diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java index e6aee9a21b9..c06f5d61b8e 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java @@ -48,6 +48,17 @@ public class IssueChangeDao implements BatchComponent, ServerComponent { return selectByIssuesAndType(session, issueKeys, IssueChangeDto.TYPE_COMMENT); } + public List selectIssueChangelog(String issueKey) { + SqlSession session = mybatis.openSession(); + try { + IssueChangeMapper mapper = session.getMapper(IssueChangeMapper.class); + return mapper.selectByIssue(issueKey); + + } finally { + MyBatis.closeQuietly(session); + } + } + @CheckForNull public DefaultIssueComment selectCommentByKey(String commentKey) { SqlSession session = mybatis.openSession(); diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java index d778e70b6b8..b9c85f78fb1 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java @@ -45,4 +45,6 @@ public interface IssueChangeMapper { */ List selectByIssuesAndType(@Param("issueKeys") Collection issueKeys, @Param("changeType") String changeType); + + List selectByIssue(String issueKey); } diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml index ac4ca892f10..83cd957bd93 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml @@ -74,5 +74,13 @@ from issue_changes c where c.change_type=#{changeType} and c.kee=#{key} + + diff --git a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java index 89a901ef396..21a3f64bd34 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java @@ -62,6 +62,19 @@ public class IssueChangeDaoTest extends AbstractDaoTestCase { assertThat(second.markdownText()).isEqualTo("recent comment"); } + @Test + public void selectIssueChangelog() { + setupData("shared"); + + List changes = dao.selectIssueChangelog("1000"); + assertThat(changes).hasSize(3); + + // chronological order + assertThat(changes.get(0).getId()).isEqualTo(100); + assertThat(changes.get(1).getId()).isEqualTo(101); + assertThat(changes.get(2).getId()).isEqualTo(102); + } + @Test public void selectCommentsByIssues_empty_input() { // no need to connect to db diff --git a/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java b/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java index 8588fd26eae..4944d000b08 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java @@ -36,6 +36,7 @@ import org.sonar.api.utils.SonarException; import org.sonar.core.issue.ActionPlanStats; import org.sonar.core.issue.DefaultActionPlan; import org.sonar.core.issue.DefaultIssueBuilder; +import org.sonar.core.issue.db.IssueChangeDto; import org.sonar.core.issue.workflow.Transition; import org.sonar.core.resource.ResourceDao; import org.sonar.core.resource.ResourceDto; @@ -55,18 +56,18 @@ import java.util.Map; public class InternalRubyIssueService implements ServerComponent { private final IssueService issueService; - private final IssueCommentService commentService; + private final IssueChangeService changeService; private final ActionPlanService actionPlanService; private final IssueStatsFinder issueStatsFinder; private final ResourceDao resourceDao; private final ActionService actionService; public InternalRubyIssueService(IssueService issueService, - IssueCommentService commentService, + IssueChangeService changeService, ActionPlanService actionPlanService, IssueStatsFinder issueStatsFinder, ResourceDao resourceDao, ActionService actionService) { this.issueService = issueService; - this.commentService = commentService; + this.changeService = changeService; this.actionPlanService = actionPlanService; this.issueStatsFinder = issueStatsFinder; this.resourceDao = resourceDao; @@ -93,6 +94,11 @@ public class InternalRubyIssueService implements ServerComponent { return Issue.RESOLUTIONS; } + public List changelog(String issueKey) { + // TODO verify security + return changeService.changelog(issueKey); + } + public Issue doTransition(String issueKey, String transitionKey) { return issueService.doTransition(issueKey, transitionKey, UserSession.get()); } @@ -110,19 +116,19 @@ public class InternalRubyIssueService implements ServerComponent { } public IssueComment addComment(String issueKey, String text) { - return commentService.addComment(issueKey, text, UserSession.get()); + return changeService.addComment(issueKey, text, UserSession.get()); } public IssueComment deleteComment(String commentKey) { - return commentService.deleteComment(commentKey, UserSession.get()); + return changeService.deleteComment(commentKey, UserSession.get()); } public IssueComment editComment(String commentKey, String newText) { - return commentService.editComment(commentKey, newText, UserSession.get()); + return changeService.editComment(commentKey, newText, UserSession.get()); } public IssueComment findComment(String commentKey) { - return commentService.findComment(commentKey); + return changeService.findComment(commentKey); } /** diff --git a/sonar-server/src/main/java/org/sonar/server/issue/IssueCommentService.java b/sonar-server/src/main/java/org/sonar/server/issue/IssueChangeService.java similarity index 91% rename from sonar-server/src/main/java/org/sonar/server/issue/IssueCommentService.java rename to sonar-server/src/main/java/org/sonar/server/issue/IssueChangeService.java index d513de5cc8d..450f35c44d0 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/IssueCommentService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/IssueChangeService.java @@ -38,8 +38,9 @@ import org.sonar.server.user.UserSession; import java.util.Arrays; import java.util.Date; +import java.util.List; -public class IssueCommentService implements ServerComponent { +public class IssueChangeService implements ServerComponent { private final IssueUpdater updater; private final IssueChangeDao changeDao; @@ -47,7 +48,7 @@ public class IssueCommentService implements ServerComponent { private final DefaultIssueFinder finder; private final IssueNotifications issueNotifications; - public IssueCommentService(IssueUpdater updater, IssueChangeDao changeDao, IssueStorage storage, DefaultIssueFinder finder, IssueNotifications issueNotifications) { + public IssueChangeService(IssueUpdater updater, IssueChangeDao changeDao, IssueStorage storage, DefaultIssueFinder finder, IssueNotifications issueNotifications) { this.updater = updater; this.changeDao = changeDao; this.storage = storage; @@ -55,6 +56,11 @@ public class IssueCommentService implements ServerComponent { this.issueNotifications = issueNotifications; } + public List changelog(String issueKey) { + // TODO verify security + return changeDao.selectIssueChangelog(issueKey); + } + public IssueComment findComment(String commentKey) { return changeDao.selectCommentByKey(commentKey); } diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index 869e3b9aaf1..47225cd44a6 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -262,7 +262,7 @@ public final class Platform { servicesContainer.addSingleton(FunctionExecutor.class); servicesContainer.addSingleton(IssueWorkflow.class); servicesContainer.addSingleton(IssueService.class); - servicesContainer.addSingleton(IssueCommentService.class); + servicesContainer.addSingleton(IssueChangeService.class); servicesContainer.addSingleton(DefaultIssueFinder.class); servicesContainer.addSingleton(IssueStatsFinder.class); servicesContainer.addSingleton(PublicRubyIssueService.class); diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb index 8d38916322e..fe6e05e0397 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb @@ -22,17 +22,6 @@ class IssueController < ApplicationController helper SourceHelper - def view - require_parameters :id - init_issue - - if request.xhr? - render :partial => 'issue/view', :locals => {:issue => @issue, :issue_results => @issue_results, :snapshot => @snapshot, :show_source => true} - else - render :action => 'view' - end - end - # GET /issue/show/ # This URL is used by the Eclipse Plugin # @@ -46,7 +35,15 @@ class IssueController < ApplicationController def show require_parameters :id init_issue - render :action => 'view' + + if params[:modal] + render :partial => 'issue/show_modal' + elsif request.xhr? + render :partial => 'issue/show' + else + render :action => 'show' + end + end # Form used for: assign, comment, transition, change severity and plan @@ -153,7 +150,7 @@ class IssueController < ApplicationController issue_result = Internal.issues.create(params.merge({:component => component_key})) if issue_result.ok @issue_results = Api.issues.find(issue_result.get.key) - render :partial => 'issue/issue', :locals => {:issue => @issue_results.issues.get(0)} + render :partial => 'issue/manual_issue_created', :locals => {:issue => @issue_results.first} else render :partial => 'shared/result_messages', :status => 500, :locals => {:result => issue_result} end @@ -172,12 +169,31 @@ class IssueController < ApplicationController render :partial => 'project/widgets/issues/issues_list' end + # Display the rule description in the issue panel + def rule + verify_ajax_request + require_parameters :id + rule_key = params[:id].split(':') + @rule = Rule.first(:conditions => ['plugin_name=? and plugin_rule_key=?', rule_key[0], rule_key[1]], :include => :rule_note) + render :partial => 'issue/rule' + end + + # Display the changelog in the issue panel + def changelog + verify_ajax_request + require_parameters :id + @issue_results = Api.issues.find(params[:id]) + @issue = @issue_results.first() + @changes = Internal.issues.changelog(params[:id]) + render :partial => 'issue/changelog' + end + private def init_issue @issue_results = Api.issues.find(params[:id]) - @issue = @issue_results.issues.get(0) + @issue = @issue_results.first() resource = Project.by_key(@issue.componentKey()) @snapshot = resource.last_snapshot if resource.last_snapshot diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_changelog.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_changelog.html.erb new file mode 100644 index 00000000000..cdff4e04efe --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_changelog.html.erb @@ -0,0 +1,19 @@ +
    +
  • + <%= format_datetime(@issue.creationDate()) -%> + <% if @issue.reporter %> + - <%= message('issue.reported_by') -%> <%= @issue_results.user(@issue.reporter).name -%> + <% end %> + - <%= message('created') -%> +
  • + + <% @changes.each do |change| %> +
  • + <%= format_datetime(change.createdAt()) -%> - <%= change.userLogin -%> - <%= change.changeData -%> +
  • + <% end %> +
+ +
+ Hide<%= image_tag 'asc.png' -%> +
\ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_issue.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_issue.html.erb index 823d19a95cc..ec1de4dc521 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_issue.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_issue.html.erb @@ -1,12 +1,15 @@ -
+
- +
+ + + +
+ + ">   - - <% rule_name = Internal.rules.ruleL10nName(@issue_results.rule(issue)) %> - - <%= h rule_name -%> - + <%= h Internal.rules.ruleL10nName(@issue_results.rule(issue)) -%>   <% if issue.resolution %> <%= image_tag 'sep12.png' -%> @@ -21,12 +24,7 @@ <% end %> <%= image_tag 'sep12.png' -%>   - <% - created_at = Api::Utils.java_to_ruby_datetime(issue.creationDate()) - updated_at = Api::Utils.java_to_ruby_datetime(issue.updateDate()) - dates_title = "Created at #{format_datetime(created_at)} and updated at #{format_datetime(updated_at)}" - %> - <%= distance_of_time_in_words_to_now(created_at) -%> + <%= distance_of_time_in_words_to_now(Api::Utils.java_to_ruby_datetime(issue.creationDate())) -%>   <% if issue.reporter %> <%= image_tag 'sep12.png' -%> @@ -36,6 +34,8 @@ <% end %>
+ + <% unless issue.message.blank? %>
<%= Api::Utils.split_newlines(h(issue.message)).join('
') -%> @@ -51,11 +51,11 @@ <%= image_tag('reviews/comment.png') -%>  <%= @issue_results.user(comment.userLogin()).name() -%> (<%= distance_of_time_in_words_to_now(Api::Utils.java_to_ruby_datetime(comment.createdAt)) -%>) <% if current_user && current_user.login==comment.userLogin %> -   - <%= image_tag 'sep12.png' -%> -   - <%= message('edit') -%> - <%= message('delete') -%> +   + <%= image_tag 'sep12.png' -%> +   + <%= message('edit') -%> + <%= message('delete') -%> <% end %> <%= Internal.text.markdownToHtml(comment.markdownText) -%> @@ -63,21 +63,19 @@ <% end %> <% if current_user %> - <% transitions = Internal.issues.listTransitions(issue) %> -
<%= message('issue.comment.formlink') -%> <% unless issue.resolution %> <%= image_tag 'sep12.png' -%>   - <% if !issue.assignee %> + <% if issue.assignee %> + <%= message('assigned_to') -%> <%= h @issue_results.user(issue.assignee).name -%> + <% else %> <%= message('issue.assign.formlink') -%> - <% if issue.assignee!=current_user.login %> + <% if issue.assignee!=current_user.login %> [<%= message('issue.assign.to_me') -%>] - <% end %> - <% else %> - <%= message('assigned_to') -%> <%= @issue_results.user(issue.assignee).name -%> + <% end %> <% end %> <% end %> @@ -86,17 +84,18 @@ <%= image_tag 'sep12.png' -%>   - <% if !@issue_results.actionPlan(issue) %> - <%= message('issue.do_plan') -%> - <% else %> + <% if issue.actionPlanKey %> <%= message('issue.planned_for') -%> <%= h(@issue_results.actionPlan(issue).name()) -%> + <% else %> + <%= message('issue.do_plan') -%> <% end %> <% end %> <% + transitions = Internal.issues.listTransitions(issue) if transitions.size > 0 && transitions.first - transition = transitions.first + transition = transitions.first %> <%= image_tag 'sep12.png' -%>   @@ -111,15 +110,29 @@ <%= message('more_actions') -%>
<% end %>
+ <% elsif issue.assignee || issue.actionPlanKey %> +
+ <% if issue.assignee %> + <%= message('assigned_to') -%> <%= h @issue_results.user(issue.assignee).name -%> +   + <% end %> + <% if issue.actionPlanKey %> + <%= message('issue.planned_for') -%> <%= h(@issue_results.actionPlan(issue).name()) -%> + <% end %> +
<% end %>
\ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_manual_issue_created.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_manual_issue_created.html.erb new file mode 100644 index 00000000000..60c05dc18aa --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_manual_issue_created.html.erb @@ -0,0 +1,3 @@ +
+ <%= render :partial => 'issue/issue', :locals => {:issue => issue} -%> +
\ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_rule.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_rule.html.erb new file mode 100644 index 00000000000..100d2b2c420 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_rule.html.erb @@ -0,0 +1,24 @@ +
+ <% if @rule.description.strip.start_with?('

') %> + <%= Internal.text.interpretMacros(@rule.description) %> + <% else %> +

<%= Internal.text.interpretMacros(@rule.description) %>

+ <% end %> +
+ +<% if @rule.note %> +
+ <%= @rule.note.html_text -%> +
+<% end %> + +
+ Hide<%= image_tag 'asc.png' -%> +  <%= image_tag 'sep12.png' -%>  + <%= @rule.plugin_name -%> +  <%= image_tag 'sep12.png' -%>  + + <%= @rule.plugin_rule_key -%> + +
\ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show.html.erb new file mode 100644 index 00000000000..432e0912f80 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show.html.erb @@ -0,0 +1,16 @@ +
+
+ <%= h @issue_results.project(@issue).name() -%> +
+ <%= h @issue_results.component(@issue).longName() -%> +
+ +
+<%= render :partial => 'issue/issue', :locals => {:issue => @issue_results.first} -%> +
+ +<% if @snapshot && @issue.line && params[:source]!='false' %> +
+ <%= snapshot_html_source(@snapshot, {:line_range => (@issue.line-5)..(@issue.line+5), :highlighted_lines => [@issue.line]}) -%> +
+<% end %> diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show_modal.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show_modal.html.erb new file mode 100644 index 00000000000..3f7f25b0e4c --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_show_modal.html.erb @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_view.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_view.html.erb deleted file mode 100644 index 27a6ec1f630..00000000000 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/_view.html.erb +++ /dev/null @@ -1,24 +0,0 @@ -
-
-
-

Issue #<%= issue.key %>

-

<%= h issue_results.project(issue).name -%>

-

<%= h issue_results.component(issue).name -%>

-
- -
- <%= render :partial => 'issue/issue', :locals => {:issue => issue_results.issues.get(0)} -%> -
- - <% if snapshot && issue.line && show_source %> -
- <%= snapshot_html_source(snapshot, {:line_range => (issue.line-5)..(issue.line+5), :highlighted_lines => [issue.line]}) -%> -
- <% end %> -
-
- - diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/show.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/show.html.erb new file mode 100644 index 00000000000..bd91dd4939c --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/show.html.erb @@ -0,0 +1,3 @@ +
+ <%= render :partial => 'issue/show' -%> +
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/view.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issue/view.html.erb deleted file mode 100644 index 12044218f4a..00000000000 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/issue/view.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -
- <%= render :partial => 'issue/view', :locals => {:issue => @issue, :issue_results => @issue_results, :snapshot => @snapshot, :show_source => params[:source]!='false'} -%> -
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issues/_list.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issues/_list.html.erb index 5af382f732f..1c37bd8933e 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/issues/_list.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issues/_list.html.erb @@ -72,7 +72,7 @@ <%= message("issue.resolution.#{issue.resolution}") if issue.resolution -%> - 'view', :id => issue.key %>'> + 'show', :id => issue.key, :modal => true -%>'> <%= h truncate(issue.message, :length => 100) -%> diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/shared/_source_display.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/shared/_source_display.erb index 93811169004..43ab11dd10c 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/shared/_source_display.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/shared/_source_display.erb @@ -2,7 +2,7 @@ current_display_id = "sources_#{rand(100)}" %> - +