fixes bug with duplicated activities and wrong date separators [fixes SCI-1866]

This commit is contained in:
zmagod 2018-01-03 13:48:59 +01:00
parent 219ef3baf6
commit 1d3881b649
8 changed files with 65 additions and 57 deletions

View file

@ -109,14 +109,14 @@
// Activity feed modal in main navigation menu
var activityModal = $('#activity-modal');
var activityModalBody = activityModal.find('.modal-body');
var initMoreBtn = function() {
activityModalBody.find('.btn-more-activities')
.on('ajax:success', function(e, data) {
$(data.html).insertBefore($(this).parents('li'));
$(this).attr('href', data.next_url);
if (data.activities_number < data.per_page) {
$(this).remove();
if(data.more_url) {
$(this).attr('href', data.more_url);
} else {
$(this).remove();
}
});
};

View file

@ -1,47 +1,33 @@
class ActivitiesController < ApplicationController
include ActivityHelper
before_action :load_vars
def index
@per_page = Constants::ACTIVITY_AND_NOTIF_SEARCH_LIMIT
@activities = current_user.last_activities(@last_activity_id,
@per_page + 1)
@overflown = @activities.length > @per_page
@activities = current_user.last_activities(@last_activity_id,
@per_page)
# Whether to hide date labels
@hide_today = params.include? :from
@day = @last_activity.present? ?
days_since_1970(@last_activity.created_at) :
days_since_1970(DateTime.current + 30.days)
more_url = url_for(activities_url(format: :json,
from: @activities.last.id)) if @overflown
respond_to do |format|
format.json {
render :json => {
per_page: @per_page,
activities_number: @activities.length,
next_url: more_url,
html: render_to_string({
partial: 'index.html.erb',
locals: {
more_activities_url: more_url,
hide_today: @hide_today,
day: @day
}
})
format.json do
render json: {
more_url: local_vars.fetch(:more_activities_url),
html: render_to_string(
partial: 'index.html.erb', locals: local_vars
)
}
}
end
end
end
def load_vars
@last_activity_id = params[:from].to_i || 0
@last_activity = Activity.find_by_id(@last_activity_id)
private
def local_vars
page = (params[:page] || 1).to_i
activities = current_user.last_activities
.page(page)
.per(Constants::ACTIVITY_AND_NOTIF_SEARCH_LIMIT)
unless activities.last_page?
more_url = url_for(activities_url(format: :json, page: page + 1))
end
{
activities: activities,
more_activities_url: more_url,
page: page
}
end
end

View file

@ -22,7 +22,7 @@ module ClientApi
{
activities: activities,
page: page,
more: !current_user.last_activities.page(page).last_page?,
more: !activities.last_page?,
timezone: current_user.time_zone
}
end

View file

@ -99,7 +99,7 @@ class GlobalActivitiesModal extends Component<Props, State> {
// when the backend bug will be fixed
const newDate = new Date(activity.createdAt);
// returns a label with "today" if the date of the activity is today
if (i === 0) {
if (i === 0 && newDate.toDateString() === new Date().toDateString()) {
return GlobalActivitiesModal.renderActivityDateElement(
i,
activity,
@ -108,8 +108,13 @@ class GlobalActivitiesModal extends Component<Props, State> {
}
// else checks if the previous activity is newer than current
// and displays a label with the date
const prevDate = new Date(arr[i - 1].createdAt);
if (prevDate.getDate() > newDate.getDate()) {
const prevDate =
i !== 0 ? new Date(arr[i - 1].createdAt) : new Date(1901, 1, 1);
// filter only date from createdAt without minutes and seconds
// used to compare dates
const parsePrevDate = new Date(prevDate.toDateString());
const parseNewDate = new Date(newDate.toDateString());
if (parsePrevDate.getTime() > parseNewDate.getTime()) {
return GlobalActivitiesModal.renderActivityDateElement(
i,
activity,

View file

@ -1,12 +1,14 @@
<ul class="no-style double-line content-activities">
<% if @activities.length == 0 then %>
<% if activities.empty? %>
<li><em><%= t'activities.index.no_activities' %></em></li>
<% else %>
<%= render 'activities/list.html.erb', activities: @activities, hide_today: hide_today, day: @day %>
<%= render 'activities/list.html.erb', activities: activities%>
<% end %>
<% if @last_activity_id < 1 and @overflown %>
<% if more_activities_url.present? && page == 1 %>
<li class="text-center">
<a class="btn btn-default btn-more-activities" href="<%= more_activities_url %>" data-remote="true">
<a class="btn btn-default btn-more-activities"
href="<%= more_activities_url %>"
data-remote="true">
<%= t'activities.index.more_activities' %></a>
</li>
<% end %>

View file

@ -1,18 +1,13 @@
<%
current_day = days_since_1970(DateTime.current)
%>
<% if !hide_today && activities.count > 0 && days_since_1970(activities[0].created_at) == current_day %>
<% if activities.first.created_at.to_date == Date.today %>
<li class="text-center activity-date-item">
<span class="label label-primary">
<%=t "activities.index.today" %>
</span>
</li>
<% end %>
<% activities.each do |activity| %>
<% activity_day = days_since_1970(activity.created_at) %>
<% if activity_day < current_day and activity_day < day %>
<% day = days_since_1970(activity.created_at) %>
<% activities.each_with_index do |activity, index| %>
<% prevDate = activities[index - 1] ? activities[index - 1].created_at.to_date : Date.new(1901, 1, 1) %>
<% if activity.created_at.to_date < prevDate %>
<li class="text-center activity-date-item">
<span class="label label-primary">
<%= activity.created_at.strftime('%d.%m.%Y') %>

View file

@ -0,0 +1,5 @@
FactoryGirl.define do
factory :user_project do
role 'owner'
end
end

View file

@ -179,4 +179,19 @@ describe User, type: :model do
it { is_expected.to respond_to(:recent_email_notification) }
it { is_expected.to respond_to(:system_message_email_notification) }
end
describe '#last_activities' do
let!(:user) { create :user }
let!(:project) { create :project }
let!(:user_projects) { create :user_project, project: project, user: user }
let!(:activity_one) { create :activity, user: user, project: project }
let!(:activity_two) { create :activity, user: user, project: project }
it 'is expected to return an array of user\'s activities' do
activities = user.last_activities
expect(activities.count).to eq 2
expect(activities).to include activity_one
expect(activities).to include activity_two
end
end
end