$("#sidebar_content .changesets").html(html);
}
- function displayMoreChangesets(html) {
- $("#sidebar_content .changeset_more").replaceWith(html);
- const oldList = $("#sidebar_content .changesets ol").first();
- const newList = oldList.next("ol");
- newList.children().appendTo(oldList);
- newList.remove();
+ function displayMoreChangesets(div, html) {
+ const oldList = $("#sidebar_content .changesets ol");
+
+ div.replaceWith(html);
+
+ const prevNewList = oldList.prevAll("ol");
+ if (prevNewList.length) {
+ prevNewList.next(".changeset_more").remove();
+ prevNewList.children().prependTo(oldList);
+ prevNewList.remove();
+ }
+
+ const nextNewList = oldList.nextAll("ol");
+ if (nextNewList.length) {
+ nextNewList.prev(".changeset_more").remove();
+ nextNewList.children().appendTo(oldList);
+ nextNewList.remove();
+ }
}
function update() {
if (params.has("before")) {
data.set("before", params.get("before"));
}
+ if (params.has("after")) {
+ data.set("after", params.get("after"));
+ }
fetch(location.pathname + "?" + data)
.then(response => response.text())
div.find(".loader").show();
$.get($(this).attr("href"), function (html) {
- displayMoreChangesets(html);
+ displayMoreChangesets(div, html);
updateMap();
});
}
class ChangesetsController < ApplicationController
include UserMethods
+ include PaginationMethods
layout "site"
# list non-empty changesets in reverse chronological order
def index
param! :before, Integer, :min => 1
+ param! :after, Integer, :min => 1
- @params = params.permit(:display_name, :bbox, :friends, :nearby, :before, :list)
+ @params = params.permit(:display_name, :bbox, :friends, :nearby, :before, :after, :list)
- if request.format == :atom && @params[:before]
- redirect_to url_for(@params.merge(:before => nil)), :status => :moved_permanently
+ if request.format == :atom && (@params[:before] || @params[:after])
+ redirect_to url_for(@params.merge(:before => nil, :after => nil)), :status => :moved_permanently
return
end
changesets = changesets.where(:user => current_user.nearby)
end
- changesets = changesets.where(:changesets => { :id => ...@params[:before] }) if @params[:before]
-
- @changesets = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags, :comments)
+ @changesets, @newer_changesets_id, @older_changesets_id = get_page_items(changesets, :includes => [:user, :changeset_tags, :comments])
render :action => :index, :layout => false
end
-<% if @changesets.present? %>
- <ol class="changesets list-group list-group-flush">
- <%= render @changesets %>
- </ol>
-<% if @changesets.size == 20 -%>
- <div class="changeset_more mt-3 text-center">
- <%= link_to t(".load_more"), url_for(@params.merge(:before => @changesets.last.id)), :class => "btn btn-primary" %>
+<% if @newer_changesets_id %>
+ <div class="changeset_more my-3 text-center">
+ <%= link_to t(".load_more"), url_for(@params.merge(:before => nil, :after => @newer_changesets_id)), :class => "btn btn-primary" %>
<div class="text-center loader">
<div class="spinner-border" role="status">
<span class="visually-hidden"><%= t("browse.start_rjs.loading") %></span>
</div>
</div>
</div>
-<% end -%>
+<% end %>
+<% if @changesets.present? %>
+ <ol class="changesets list-group list-group-flush">
+ <%= render @changesets %>
+ </ol>
<% elsif params[:bbox] %>
<p class="mx-3"><%= params[:before] ? t(".no_more_area") : t(".empty_area") %></p>
<% elsif params[:display_name] %>
<% else %>
<p class="mx-3"><%= params[:before] ? t(".no_more") : t(".empty") %></p>
<% end %>
+<% if @older_changesets_id -%>
+ <div class="changeset_more my-3 text-center">
+ <%= link_to t(".load_more"), url_for(@params.merge(:before => @older_changesets_id, :after => nil)), :class => "btn btn-primary" %>
+ <div class="text-center loader">
+ <div class="spinner-border" role="status">
+ <span class="visually-hidden"><%= t("browse.start_rjs.loading") %></span>
+ </div>
+ </div>
+ </div>
+<% end -%>
%w[-1 0 fred].each do |id|
get history_path(:format => "html", :list => "1", :before => id)
assert_redirected_to :controller => :errors, :action => :bad_request
+
+ get history_path(:format => "html", :list => "1", :after => id)
+ assert_redirected_to :controller => :errors, :action => :bad_request
end
end
check_index_result [changeset1]
end
+ def test_index_after_id
+ changeset1 = create(:changeset, :num_changes => 1)
+ changeset2 = create(:changeset, :num_changes => 1)
+
+ get history_path(:format => "html", :after => changeset1.id), :xhr => true
+ assert_response :success
+ assert_template "history"
+ assert_template :layout => "xhr"
+ assert_select "h2", :text => "Changesets", :count => 1
+
+ get history_path(:format => "html", :list => "1", :after => changeset1.id), :xhr => true
+ assert_response :success
+ assert_template "index"
+
+ check_index_result [changeset2]
+ end
+
##
# Check that a list with a next page link works
def test_index_more
assert_redirected_to :action => :feed
end
+ def test_feed_after
+ get history_feed_path(:format => "atom", :after => 100)
+ assert_redirected_to :action => :feed
+ end
+
private
##
end
end
+ test "user history starts after specified changeset" do
+ user = create(:user)
+ changeset0 = create(:changeset)
+ changeset1 = create_visible_changeset(user, "1st-changeset-in-history")
+ changeset2 = create_visible_changeset(user, "2nd-changeset-in-history")
+
+ visit "#{user_path user}/history?after=#{changeset2.id}"
+
+ within_sidebar do
+ assert_no_link "1st-changeset-in-history"
+ assert_no_link "2nd-changeset-in-history"
+ end
+
+ visit "#{user_path user}/history?after=#{changeset1.id}"
+
+ within_sidebar do
+ assert_no_link "1st-changeset-in-history"
+ assert_link "2nd-changeset-in-history"
+ end
+
+ visit "#{user_path user}/history?after=#{changeset0.id}"
+
+ within_sidebar do
+ assert_link "1st-changeset-in-history"
+ assert_link "2nd-changeset-in-history"
+ end
+ end
+
private
def create_visible_changeset(user, comment)