Skip to content

Commit

Permalink
Extract last_login into helper and component
Browse files Browse the repository at this point in the history
This DRYs things up a bit so that all pages of the users admin can reuse
the same helper, translations, and component.
  • Loading branch information
MadelineCollier committed Oct 15, 2024
1 parent c78a9de commit 9b3c12f
Show file tree
Hide file tree
Showing 17 changed files with 78 additions and 96 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,7 @@
<% end %>
<%= page_with_sidebar_aside do %>
<%= render component("ui/panel").new(title: t("spree.lifetime_stats")) do %>
<%= render component("ui/details_list").new(
items: [
{ label: t("spree.total_sales"), value: @user.display_lifetime_value.to_html },
{ label: t("spree.order_count"), value: @user.order_count.to_i },
{ label: t("spree.average_order_value"), value: @user.display_average_order_value.to_html },
{ label: t("spree.member_since"), value: @user.created_at.to_date },
{ label: t(".last_active"), value: last_login(@user) },
]
) %>
<% end %>
<%= render component("users/last_login").new(user: @user) %>
<% end %>
<% end %>
<% end %>
11 changes: 0 additions & 11 deletions admin/app/components/solidus_admin/users/addresses/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,6 @@ def tabs
]
end

def last_login(user)
return t('.last_login.never') if user.try(:last_sign_in_at).blank?

t(
'.last_login.login_time_ago',
# @note The second `.try` is here for the specs and for setups that use a
# custom User class which may not have this attribute.
last_login_time: time_ago_in_words(user.try(:last_sign_in_at))
).capitalize
end

def bill_address(address, type)
if address.present? && type == "bill"
address
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@ en:
items: Items
store_credit: Store Credit
last_active: Last Active
last_login:
login_time_ago: "%{last_login_time} ago"
never: Never
invitation_sent: Invitation sent
create_order_for_user: Create order for this user
update: Update
cancel: Cancel
Expand Down
12 changes: 1 addition & 11 deletions admin/app/components/solidus_admin/users/edit/component.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,7 @@
<% end %>
<%= page_with_sidebar_aside do %>
<%= render component("ui/panel").new(title: t("spree.lifetime_stats")) do %>
<%= render component("ui/details_list").new(
items: [
{ label: t("spree.total_sales"), value: @user.display_lifetime_value.to_html },
{ label: t("spree.order_count"), value: @user.order_count.to_i },
{ label: t("spree.average_order_value"), value: @user.display_average_order_value.to_html },
{ label: t("spree.member_since"), value: @user.created_at.to_date },
{ label: t(".last_active"), value: last_login(@user) },
]
) %>
<% end %>
<%= render component("users/last_login").new(user: @user) %>
<% end %>
<% end %>
<% end %>
10 changes: 0 additions & 10 deletions admin/app/components/solidus_admin/users/edit/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,6 @@ def tabs
]
end

def last_login(user)
return t('.last_login.never') if user.try(:last_sign_in_at).blank?

t(
'.last_login.login_time_ago',
# @note The second `.try` is only here for the specs to work.
last_login_time: time_ago_in_words(user.try(:last_sign_in_at))
).capitalize
end

def role_options
Spree::Role.all.map do |role|
{ label: role.name, id: role.id }
Expand Down
4 changes: 0 additions & 4 deletions admin/app/components/solidus_admin/users/edit/component.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@ en:
items: Items
store_credit: Store Credit
last_active: Last Active
last_login:
login_time_ago: "%{last_login_time} ago"
never: Never
invitation_sent: Invitation sent
create_order_for_user: Create order for this user
update: Update
cancel: Cancel
Expand Down
18 changes: 2 additions & 16 deletions admin/app/components/solidus_admin/users/index/component.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# frozen_string_literal: true

class SolidusAdmin::Users::Index::Component < SolidusAdmin::UsersAndRoles::Component
include SolidusAdmin::LastLoginHelper

def model_class
Spree.user_class
end
Expand Down Expand Up @@ -93,20 +95,4 @@ def columns
},
]
end

private

# @todo add logic to display "Invitation sent" when the user has not yet
# accepted the invitation and filled out account details. To be implemented
# in conjunction with the invitation logic.
def last_login(user)
return t('.last_login.never') if user.try(:last_sign_in_at).blank?

t(
'.last_login.login_time_ago',
# @note The second `.try` is here for the specs and for setups that use a
# custom User class which may not have this attribute.
last_login_time: time_ago_in_words(user.try(:last_sign_in_at))
).capitalize
end
end
4 changes: 0 additions & 4 deletions admin/app/components/solidus_admin/users/index/component.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,3 @@ en:
status:
active: Active
inactive: Inactive
last_login:
login_time_ago: "%{last_login_time} ago"
never: Never
invitation_sent: Invitation sent
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<%= render component("ui/panel").new(title: t("spree.lifetime_stats")) do %>
<%= render component("ui/details_list").new(
items: [
{ label: t("spree.total_sales"), value: @user.display_lifetime_value.to_html },
{ label: t("spree.order_count"), value: @user.order_count.to_i },
{ label: t("spree.average_order_value"), value: @user.display_average_order_value.to_html },
{ label: t("spree.member_since"), value: @user.created_at.to_date },
{ label: t(".last_active"), value: last_login(@user) },
]
) %>
<% end %>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

class SolidusAdmin::Users::LastLogin::Component < SolidusAdmin::BaseComponent
include SolidusAdmin::LastLoginHelper

def initialize(user:)
@user = user
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
en:
last_active: Last Active
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,7 @@
<% end %>
<%= page_with_sidebar_aside do %>
<%= render component("ui/panel").new(title: t("spree.lifetime_stats")) do %>
<%= render component("ui/details_list").new(
items: [
{ label: t("spree.total_sales"), value: @user.display_lifetime_value.to_html },
{ label: t("spree.order_count"), value: @user.order_count.to_i },
{ label: t("spree.average_order_value"), value: @user.display_average_order_value.to_html },
{ label: t("spree.member_since"), value: @user.created_at.to_date },
{ label: t(".last_active"), value: last_login(@user) },
]
) %>
<% end %>
<%= render component("users/last_login").new(user: @user) %>
<% end %>
<% end %>
<% end %>
10 changes: 0 additions & 10 deletions admin/app/components/solidus_admin/users/orders/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,6 @@ def tabs
]
end

def last_login(user)
return t('.last_login.never') if user.try(:last_sign_in_at).blank?

t(
'.last_login.login_time_ago',
# @note The second `.try` is only here for the specs to work.
last_login_time: time_ago_in_words(user.try(:last_sign_in_at))
).capitalize
end

def model_class
Spree::Order
end
Expand Down
4 changes: 0 additions & 4 deletions admin/app/components/solidus_admin/users/orders/component.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@ en:
items: Items
store_credit: Store Credit
last_active: Last Active
last_login:
login_time_ago: "%{last_login_time} ago"
never: Never
invitation_sent: Invitation sent
create_order_for_user: Create order for this user
no_orders_found: No Orders found.
create_one: Create One
Expand Down
16 changes: 16 additions & 0 deletions admin/app/helpers/solidus_admin/last_login_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

module SolidusAdmin
module LastLoginHelper
def last_login(user)
return t('solidus_admin.users.last_login.never') if user.try(:last_sign_in_at).blank?

t(
'solidus_admin.users.last_login.login_time_ago',
# @note The second `.try` is here for the specs and for setups that use a
# custom User class which may not have this attribute.
last_login_time: time_ago_in_words(user.try(:last_sign_in_at))
).capitalize
end
end
end
4 changes: 4 additions & 0 deletions admin/config/locales/users.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,7 @@ en:
ship:
success: "Shipping Address has been successfully updated."
error: "Address could not be updated."
last_login:
never: "Never"
login_time_ago: "%{last_login_time} ago"
invitation_sent: "Invitation sent"
31 changes: 31 additions & 0 deletions admin/spec/helpers/solidus_admin/last_login_helper_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# frozen_string_literal: true

require "spec_helper"

RSpec.describe SolidusAdmin::LastLoginHelper, type: :helper do
describe "#last_login" do
let(:user) { double("User") }

context "when user has never logged in" do
it "returns 'Never'" do
allow(user).to receive(:last_sign_in_at).and_return(nil)

expect(helper.last_login(user)).to eq("Never")
end
end

context "when user has logged in before" do
it "returns the time ago since the last login, capitalized" do
last_sign_in_time = 2.days.ago
allow(user).to receive(:last_sign_in_at).and_return(last_sign_in_time)

expect(helper)
.to receive(:time_ago_in_words)
.with(last_sign_in_time)
.and_return("2 days")

expect(helper.last_login(user)).to eq("2 days ago")
end
end
end
end

0 comments on commit 9b3c12f

Please sign in to comment.