diff options
-rw-r--r-- | app/controllers/spree/admin/users/subscriptions_controller.rb | 17 | ||||
-rw-r--r-- | app/overrides/views/admin_users_subscriptions_tab.rb | 8 | ||||
-rw-r--r-- | app/views/spree/admin/shared/_subscription_tab.html.erb | 2 | ||||
-rw-r--r-- | app/views/spree/admin/users/_subscription_tab.html.erb | 5 | ||||
-rw-r--r-- | app/views/spree/admin/users/subscriptions/index.html.erb | 44 | ||||
-rw-r--r-- | config/locales/en.yml | 2 | ||||
-rw-r--r-- | config/routes.rb | 4 | ||||
-rw-r--r-- | lib/solidus_subscriptions/engine.rb | 3 | ||||
-rw-r--r-- | spec/features/admin_users_subscription_tabs_spec.rb | 54 |
9 files changed, 137 insertions, 2 deletions
diff --git a/app/controllers/spree/admin/users/subscriptions_controller.rb b/app/controllers/spree/admin/users/subscriptions_controller.rb new file mode 100644 index 0000000..cb1548c --- /dev/null +++ b/app/controllers/spree/admin/users/subscriptions_controller.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Spree + module Admin + module Users + class SubscriptionsController < ResourceController + belongs_to 'spree/user', model_class: Spree.user_class + + private + + def model_class + ::SolidusSubscriptions::Subscription + end + end + end + end +end diff --git a/app/overrides/views/admin_users_subscriptions_tab.rb b/app/overrides/views/admin_users_subscriptions_tab.rb new file mode 100644 index 0000000..a69e16d --- /dev/null +++ b/app/overrides/views/admin_users_subscriptions_tab.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +Deface::Override.new( + virtual_path: 'spree/admin/users/_tabs', + name: 'solidus_subscriptions_admin_users_subscriptions_tab', + insert_bottom: "[data-hook='admin_user_tab_options']", + partial: 'spree/admin/users/subscription_tab' +) diff --git a/app/views/spree/admin/shared/_subscription_tab.html.erb b/app/views/spree/admin/shared/_subscription_tab.html.erb index de8c973..516f482 100644 --- a/app/views/spree/admin/shared/_subscription_tab.html.erb +++ b/app/views/spree/admin/shared/_subscription_tab.html.erb @@ -1,3 +1,3 @@ <% if can? :admin, SolidusSubscriptions::Subscription %> - <%= tab :subscriptions, icon: 'repeat' %> + <%= tab :subscriptions, icon: 'repeat', match_path: '/subscriptions' %> <% end %> diff --git a/app/views/spree/admin/users/_subscription_tab.html.erb b/app/views/spree/admin/users/_subscription_tab.html.erb new file mode 100644 index 0000000..cfb9205 --- /dev/null +++ b/app/views/spree/admin/users/_subscription_tab.html.erb @@ -0,0 +1,5 @@ +<% if can? :admin, @user.subscriptions %> + <li<%== ' class="active"' if current == :subscriptions %>> + <%= link_to t("spree.admin.user.subscriptions"), spree.admin_user_subscriptions_path(@user) %> + </li> +<% end %> diff --git a/app/views/spree/admin/users/subscriptions/index.html.erb b/app/views/spree/admin/users/subscriptions/index.html.erb new file mode 100644 index 0000000..064499a --- /dev/null +++ b/app/views/spree/admin/users/subscriptions/index.html.erb @@ -0,0 +1,44 @@ +<% admin_breadcrumb(link_to plural_resource_name(Spree::LegacyUser), spree.admin_users_path) %> +<% admin_breadcrumb(link_to @user.email, edit_admin_user_url(@user)) %> +<% admin_breadcrumb(plural_resource_name(SolidusSubscriptions::Subscription)) %> + +<%= render 'spree/admin/users/sidebar' %> +<%= render 'spree/admin/users/tabs', current: :subscriptions %> + +<fieldset> + <legend><%= plural_resource_name(SolidusSubscriptions::Subscription) %></legend> + + <% if @subscriptions.any? %> + <table id="subscriptions-table" class="index"> + <thead> + <tr> + <th><%= SolidusSubscriptions::Subscription.human_attribute_name(:created_at) %></th> + <th><%= SolidusSubscriptions::Subscription.human_attribute_name(:actionable_date) %></th> + <th><%= SolidusSubscriptions::Subscription.human_attribute_name(:interval) %></th> + <th><%= SolidusSubscriptions::Subscription.human_attribute_name(:state) %></th> + <th><%= SolidusSubscriptions::Subscription.human_attribute_name(:processing_state) %></th> + <th class="actions"></th> + </tr> + </thead> + + <tbody> + <% @subscriptions.each do |subscription| %> + <tr> + <td><%= l(subscription.created_at.to_date) %></td> + <td><%= subscription.actionable_date ? l(subscription.actionable_date.to_date) : '-' %></td> + <td><%= subscription.interval.inspect %></td> + <td><%= render 'spree/admin/subscriptions/state_pill', subscription: subscription %></td> + <td><%= render 'spree/admin/subscriptions/processing_state_pill', subscription: subscription %></td> + <td class="actions"> + <%= link_to_edit(subscription, no_text: true, url: edit_admin_subscription_path(subscription)) %> + </td> + </tr> + <% end %> + </tbody> + </table> + <% else %> + <div class="no-objects-found"> + <%= render 'spree/admin/shared/no_objects_found', resource: SolidusSubscriptions::Subscription %> + </div> + <% end %> +</fieldset> diff --git a/config/locales/en.yml b/config/locales/en.yml index 06efcd6..65426bf 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -56,6 +56,8 @@ en: subscription_events: index: title: Events + user: + subscriptions: Subscriptions promotion_rule_types: subscription_promotion_rule: name: Subscription diff --git a/config/routes.rb b/config/routes.rb index 147f747..35414e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,5 +25,9 @@ Spree::Core::Engine.routes.draw do resources :installments, only: [:index, :show] resources :subscription_events, only: :index end + + resources :users do + resources :subscriptions, only: [:index], controller: 'users/subscriptions' + end end end diff --git a/lib/solidus_subscriptions/engine.rb b/lib/solidus_subscriptions/engine.rb index c45ecfc..2f3067e 100644 --- a/lib/solidus_subscriptions/engine.rb +++ b/lib/solidus_subscriptions/engine.rb @@ -43,7 +43,8 @@ module SolidusSubscriptions [:subscriptions], 'repeat', url: :admin_subscriptions_path, - condition: ->{ can?(:admin, SolidusSubscriptions::Subscription) } + condition: ->{ can?(:admin, SolidusSubscriptions::Subscription) }, + match_path: '/subscriptions' ) end end diff --git a/spec/features/admin_users_subscription_tabs_spec.rb b/spec/features/admin_users_subscription_tabs_spec.rb new file mode 100644 index 0000000..f42123f --- /dev/null +++ b/spec/features/admin_users_subscription_tabs_spec.rb @@ -0,0 +1,54 @@ +require 'spec_helper' + +RSpec.describe 'User subscriptions tab', type: :feature do + stub_authorization! + + let(:user) { create(:user) } + + before do + allow(Spree.user_class).to receive(:find_by). + with(hash_including(:id)). + and_return(user) + end + + context 'when user has subscriptions' do + let!(:subscription) { + create(:subscription, + actionable_date: '2020-10-21', + interval_length: 10, + interval_units: :day, + user: user) + } + + before do + visit '/admin/' + click_link 'Users' + click_link subscription.user.email + within('.tabs') { click_link 'Subscriptions' } + end + + it 'lists user subscriptions' do + subscriptions_table = page.find('#subscriptions-table') + + expect(subscriptions_table).to have_content('2020-10-21') + expect(subscriptions_table).to have_content('10 days') + end + + it 'shows edit link to subscriptions' do + page.find("#subscriptions-table td.actions a.fa-edit").click + + expect(page).to have_current_path spree.edit_admin_subscription_path(subscription), ignore_query: true + end + end + + context 'when user does not have subscriptions' do + it 'displays no found message when user has no subscriptions' do + visit spree.admin_path + click_link 'Users' + click_link user.email + within('.tabs') { click_link 'Subscriptions' } + + expect(page).to have_content('No Subscriptions found.') + end + end +end |