Feature #25198 » display-rank-as-data-attribute.diff
| app/views/search/index.api.rsb | ||
|---|---|---|
| 1 | 1 |
api.array :results, api_meta(:total_count => @result_count, :offset => @offset, :limit => @limit) do |
| 2 |
@results.each do |result| |
|
| 2 |
@results.each do |result, rank|
|
|
| 3 | 3 |
api.result do |
| 4 | 4 |
api.id result.id |
| 5 | 5 |
api.title result.event_title |
| ... | ... | |
| 7 | 7 |
api.url url_for(result.event_url(:only_path => false)) |
| 8 | 8 |
api.description result.event_description |
| 9 | 9 |
api.datetime result.event_datetime |
| 10 |
api.rank rank |
|
| 10 | 11 |
end |
| 11 | 12 |
end |
| 12 | 13 |
end |
| app/views/search/index.html.erb | ||
|---|---|---|
| 41 | 41 |
</div> |
| 42 | 42 |
<h3><%= l(:label_result_plural) %> (<%= @result_count %>)</h3> |
| 43 | 43 |
<dl id="search-results"> |
| 44 |
<% @results.each do |e| %> |
|
| 44 |
<% @results.each do |e, rank| %>
|
|
| 45 | 45 |
<dt class="<%= e.event_type %>"> |
| 46 | 46 |
<%= content_tag('span', e.project, :class => 'project') unless @project == e.project %>
|
| 47 |
<%= link_to(highlight_tokens(e.event_title.truncate(255), @tokens), e.event_url) %> |
|
| 47 |
<%= link_to(highlight_tokens(e.event_title.truncate(255), @tokens), e.event_url, :data => { :rank => rank }) %>
|
|
| 48 | 48 |
</dt> |
| 49 | 49 |
<dd><span class="description"><%= highlight_tokens(e.event_description, @tokens) %></span> |
| 50 | 50 |
<span class="author"><%= format_time(e.event_datetime) %></span></dd> |
| lib/redmine/search.rb | ||
|---|---|---|
| 82 | 82 |
# Returns the results for the given offset and limit |
| 83 | 83 |
def results(offset, limit) |
| 84 | 84 |
result_ids_to_load = result_ids[offset, limit] || [] |
| 85 |
|
|
| 85 | ||
| 86 | 86 |
results_by_scope = Hash.new {|h,k| h[k] = []}
|
| 87 | 87 |
result_ids_to_load.group_by(&:first).each do |scope, scope_and_ids| |
| 88 | 88 |
klass = scope.singularize.camelcase.constantize |
| 89 | 89 |
results_by_scope[scope] += klass.search_results_from_ids(scope_and_ids.map(&:last)) |
| 90 | 90 |
end |
| 91 |
|
|
| 92 |
result_ids_to_load.map do |scope, id| |
|
| 93 |
results_by_scope[scope].detect {|record| record.id == id}
|
|
| 91 | ||
| 92 |
result_ids_to_load.map do |scope, rank, id|
|
|
| 93 |
[results_by_scope[scope].detect {|record| record.id == id}, rank]
|
|
| 94 | 94 |
end.compact |
| 95 | 95 |
end |
| 96 | 96 | |
| ... | ... | |
| 129 | 129 |
end |
| 130 | 130 |
# sort results, higher rank and id first |
| 131 | 131 |
ret.sort! {|a,b| b.last <=> a.last}
|
| 132 |
# only keep ids now that results are sorted
|
|
| 133 |
ret.map! {|scope, r| [scope, r.last]}
|
|
| 132 |
# [[scope, rank, id], ...]
|
|
| 133 |
ret.map! {|scope, r| [scope, r].flatten }
|
|
| 134 | 134 |
ret |
| 135 | 135 |
end |
| 136 | 136 |
end |