Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
581 changes: 260 additions & 321 deletions .rubocop_todo.yml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# frozen_string_literal: true

module Spree
module Admin
class UserGroupsController < ResourceController
end
end
end
17 changes: 17 additions & 0 deletions backend/app/controllers/spree/admin/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ def create
if @user.save
set_roles
set_stock_locations
set_user_group if current_store&.enforce_group_upon_signup

flash[:success] = t('spree.created_successfully')
redirect_to edit_admin_user_url(@user)
Expand Down Expand Up @@ -111,6 +112,10 @@ def user_params
attributes -= [:password, :password_confirmation]
end

if can? :manage, Spree::UserGroup
attributes += [:user_group_id]
end

params.require(:user).permit(attributes)
end

Expand Down Expand Up @@ -153,6 +158,18 @@ def set_stock_locations
Spree::StockLocation.accessible_by(current_ability).where(id: user_params[:stock_location_ids])
end
end

# Sets the user group for a user if they don't have one assigned
# This method checks if there's a user (@user) and if they don't have a user group on sign up
# If these conditions are met, it assigns the default cart user group from the current store
# If enforce_group_upon_signup is enabled on the store settings
# @return [void]
def set_user_group
if @user && @user.user_group.nil?
user_group = current_store.default_cart_user_group
@user.update(user_group: user_group) if user_group
end
end
end
end
end
11 changes: 11 additions & 0 deletions backend/app/views/spree/admin/shared/users_sub_menu.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<% Spree.deprecator.warn "Using the #{@virtual_path.inspect} partial is deprecated, please use MenuItem#children instead." %>

<ul class="admin-subnav" data-hook="admin_users_sub_tabs">
<% if can?(:admin, Spree.user_class) %>
<%= tab label: :users, url: spree.admin_users_path %>
<% end %>

<% if can?(:admin, Spree::UserGroup) %>
<%= tab label: :user_groups, url: spree.admin_user_groups_path %>
<% end %>
</ul>
14 changes: 14 additions & 0 deletions backend/app/views/spree/admin/stores/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,20 @@
<%= f.error_message_on :reverse_charge_status %>
<% end %>
<% end %>

<%= f.field_container :default_cart_user_group_id do %>
<%= f.label :default_cart_user_group_id %>
<%= f.collection_select :default_cart_user_group_id, Spree::UserGroup.all, :id, :group_name, { include_blank: true }, { class: 'custom-select' } %>
<%= f.error_message_on :default_cart_user_group_id %>
<% end %>

<%= f.field_container :enforce_group_upon_signup, class: %w(checkbox) do %>
<label>
<%= f.check_box(:enforce_group_upon_signup) %>
<%= t('spree.enforce_group_upon_signup') %>
</label>
<%= f.error_message_on :enforce_group_upon_signup %>
<% end %>
</div>
<div class="col-12 col-md-6">
<%= f.field_container :url do %>
Expand Down
9 changes: 9 additions & 0 deletions backend/app/views/spree/admin/user_groups/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<div data-hook="admin_user_group_form_fields" class="row">
<div data-hook="admin_user_group_form_group_name_field" class="col-5">
<%= f.field_container :group_name do %>
<%= f.label :group_name, class: 'required' %>
<%= f.text_field :group_name, class: 'fullwidth' %>
<%= error_message_on :user_group, :group_name %>
<% end %>
</div>
</div>
24 changes: 24 additions & 0 deletions backend/app/views/spree/admin/user_groups/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<% admin_breadcrumb(link_to plural_resource_name(Spree::LegacyUser), spree.admin_users_path) %>
<% admin_breadcrumb(link_to plural_resource_name(Spree::UserGroup), spree.admin_user_groups_path) %>
<% admin_breadcrumb(@user_group.group_name) %>

<% content_for :page_actions do %>
<% end %>

<div data-hook="admin_user_group_edit_form_header">
<%= render partial: 'spree/shared/error_messages', locals: { target: @user_group } %>
</div>

<div data-hook="admin_user_group_edit_form">
<%= form_for [:admin, @user_group] do |f| %>
<fieldset class="no-border-top">
<%= render partial: 'form', locals: { f: f } %>

<div class="clear"></div>

<div data-hook="admin_user_group_edit_form_buttons">
<%= render partial: 'spree/admin/shared/edit_resource_links' %>
</div>
</fieldset>
<% end %>
</div>
47 changes: 47 additions & 0 deletions backend/app/views/spree/admin/user_groups/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<% admin_breadcrumb(link_to plural_resource_name(Spree::LegacyUser), spree.admin_users_path) %>
<% admin_breadcrumb(plural_resource_name(Spree::UserGroup)) %>

<% content_for :page_actions do %>
<% if can?(:create, Spree::UserGroup) %>
<li>
<%= link_to t('spree.new_user_group'), new_object_url, id: 'admin_new_user_group_link', class: 'btn btn-primary' %>
</li>
<% end %>
<% end %>

<% if @user_groups.any? %>
<table class="index" id='listing_user_groups'>
<colgroup>
<col style="width: 40%">
<col style="width: 20%">
</colgroup>
<thead>
<tr data-hook="admin_user_groups_index_headers">
<th><%= Spree::UserGroup.human_attribute_name(:group_name) %></th>
<th data-hook="admin_user_groups_index_header_actions" class="actions"></th>
</tr>
</thead>
<tbody>
<% @user_groups.each do |user_group| %>
<tr id="<%= spree_dom_id user_group %>" data-hook="admin_user_groups_index_rows">
<td><%= link_to user_group.try(:group_name), edit_admin_user_group_path(user_group) %></td>
<td data-hook="admin_user_groups_index_row_actions" class="actions">
<% if can?(:update, user_group) %>
<%= link_to_edit user_group, no_text: true %>
<% end %>

<% if can?(:destroy, user_group) %>
<%= link_to_delete user_group, no_text: true %>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
<% else %>
<div class="no-objects-found">
<%= render 'spree/admin/shared/no_objects_found',
resource: Spree::UserGroup,
new_resource_url: new_object_url %>
</div>
<% end %>
24 changes: 24 additions & 0 deletions backend/app/views/spree/admin/user_groups/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<% admin_breadcrumb(link_to plural_resource_name(Spree::LegacyUser), spree.admin_users_path) %>
<% admin_breadcrumb(link_to plural_resource_name(Spree::UserGroup), spree.admin_user_groups_path) %>
<% admin_breadcrumb(t('spree.new_user_group')) %>

<% content_for :page_actions do %>
<% end %>

<div data-hook="admin_user_group_new_form_header">
<%= render partial: 'spree/shared/error_messages', locals: { target: @user_group } %>
</div>

<div data-hook="admin_user_group_new_form">
<%= form_for [:admin, @user_group] do |f| %>
<fieldset class="no-border-top">
<%= render partial: 'form', locals: { f: f } %>

<div class="clear"></div>

<div data-hook="admin_user_group_new_form_buttons">
<%= render partial: 'spree/admin/shared/new_resource_links' %>
</div>
</fieldset>
<% end %>
</div>
13 changes: 13 additions & 0 deletions backend/app/views/spree/admin/users/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,16 @@
<% end %>
</div>
</div>

<% if can?(:update, @user) && can?(:manage, :user_group) %>
<fieldset data-hook="admin_user_user_group" id="admin_user_edit_user_group">
<legend><%= t('spree.admin.user.user_group') %></legend>
<div>
<%= f.field_container :user_group_id do %>
<%= f.label :user_group_id, t('spree.admin.user.user_group') %>
<%= f.collection_select :user_group_id, Spree::UserGroup.all, :id, :group_name, { include_blank: true }, { class: 'custom-select' } %>
<%= f.error_message_on :user_group_id %>
<% end %>
</div>
</fieldset>
<% end %>
1 change: 1 addition & 0 deletions backend/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

resources :zones

resources :user_groups
resources :tax_categories

resources :products do
Expand Down
16 changes: 16 additions & 0 deletions backend/lib/spree/backend_configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,24 @@ def menu_items
label: :users,
icon: admin_updated_navbar ? 'ri-user-line' : 'user',
match_path: %r{/(users|store_credits)},
data_hook: :admin_users_sub_tabs,
partial: 'spree/admin/shared/users_sub_menu',
condition: -> { Spree.user_class && can?(:admin, Spree.user_class) },
url: :admin_users_path,
children: [
MenuItem.new(
label: :users,
condition: -> { Spree.user_class && can?(:admin, Spree.user_class) },
url: :admin_users_path
),
MenuItem.new(
label: :user_groups,
condition: -> {
can?(:admin, Spree::UserGroup)
},
url: :admin_user_groups_path
),
]
),
MenuItem.new(
label: :settings,
Expand Down
131 changes: 131 additions & 0 deletions backend/spec/controllers/spree/admin/user_groups_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Spree::Admin::UserGroupsController, type: :controller do
stub_authorization!

let(:user_group) { create(:user_group) }

describe '#index' do
it 'retrieves all user groups and assigns them to the view' do
get :index

expect(assigns(:user_groups)).to eq([user_group])
end
end

describe '#new' do
it 'prepares a new user group for the form' do
get :new

expect(assigns(:user_group)).to be_a_new(Spree::UserGroup)
end
end

describe '#edit' do
it 'loads the specified user group for editing' do
get :edit, params: { id: user_group.id }

expect(assigns(:user_group)).to eq(user_group)
end
end

describe '#create' do
context 'with valid params' do
let(:valid_attributes) { { group_name: 'New User Group' } }

it 'saves a new user group to the database' do
expect {
post :create, params: { user_group: valid_attributes }
}.to change(Spree::UserGroup, :count).by(1)
end

it 'makes the newly created user group available to the view' do
post :create, params: { user_group: valid_attributes }

expect(assigns(:user_group)).to be_a(Spree::UserGroup)
expect(assigns(:user_group)).to be_persisted
end

it 'redirects to the user groups list page' do
post :create, params: { user_group: valid_attributes }

expect(response).to redirect_to(spree.admin_user_groups_path)
end
end

context 'with invalid params' do
let(:invalid_attributes) { { group_name: nil } }

it 'does not save the user group and prepares a new instance for the form' do
post :create, params: { user_group: invalid_attributes }

expect(assigns(:user_group)).to be_a_new(Spree::UserGroup)
end

it 'renders the "new" form again' do
post :create, params: { user_group: invalid_attributes }

expect(response).to render_template('new')
end
end
end

describe '#update' do
context 'with valid params' do
let(:new_attributes) { { group_name: 'Updated Group Name' } }

it 'updates the user group with the provided attributes' do
put :update, params: { id: user_group.id, user_group: new_attributes }

user_group.reload

expect(user_group.group_name).to eq('Updated Group Name')
end

it 'makes the updated user group available to the view' do
put :update, params: { id: user_group.id, user_group: new_attributes }

expect(assigns(:user_group)).to eq(user_group)
end

it 'redirects to the user groups list page' do
put :update, params: { id: user_group.id, user_group: new_attributes }

expect(response).to redirect_to(spree.admin_user_groups_path)
end
end

context 'with invalid params' do
let(:invalid_attributes) { { group_name: nil } }

it 'does not update the user group and keeps the original instance' do
put :update, params: { id: user_group.id, user_group: invalid_attributes }

expect(assigns(:user_group)).to eq(user_group)
end

it 'renders the "edit" form again' do
put :update, params: { id: user_group.id, user_group: invalid_attributes }

expect(response).to render_template('edit')
end
end
end

describe '#destroy' do
it 'removes the user group from the database' do
user_group = create(:user_group)
expect {
delete :destroy, params: { id: user_group.id }
}.to change(Spree::UserGroup, :count).by(-1)
end

it 'redirects to the user groups list page' do
delete :destroy, params: { id: user_group.id }

expect(response).to redirect_to(spree.admin_user_groups_path)
end
end
end
Loading