diff --git a/app/controllers/spree/admin/users_controller.rb b/app/controllers/spree/admin/users_controller.rb index 6cc594cca0..34714ba233 100644 --- a/app/controllers/spree/admin/users_controller.rb +++ b/app/controllers/spree/admin/users_controller.rb @@ -57,12 +57,6 @@ module Spree end end - def accept_terms_of_services - @user.update(terms_of_service_accepted_at: DateTime.now) - - head :ok - end - protected def collection diff --git a/app/reflexes/enterprise/user_reflex.rb b/app/reflexes/enterprise/user_reflex.rb new file mode 100644 index 0000000000..8996a2ab30 --- /dev/null +++ b/app/reflexes/enterprise/user_reflex.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class Enterprise + class UserReflex < ApplicationReflex + def accept_terms_of_services + current_user.update(terms_of_service_accepted_at: DateTime.now) + + morph "#banner-container", "" + end + end +end diff --git a/app/views/admin/_terms_of_service_banner.html.haml b/app/views/admin/_terms_of_service_banner.html.haml index 17b3603986..03a961ebcd 100644 --- a/app/views/admin/_terms_of_service_banner.html.haml +++ b/app/views/admin/_terms_of_service_banner.html.haml @@ -1,9 +1,9 @@ -.banner-container +.banner-container#banner-container - if @terms_of_service_banner == true - %div{ class: "terms-of-service-banner", data: { controller: "terms-of-service-banner", "terms-of-service-banner-url-value": accept_terms_of_services_admin_user_path(current_spree_user&.id) }} + .terms-of-service-banner .column-left %p= t("admin.terms_of_service_have_been_updated_html", tos_link: link_to(t("admin.terms_of_service"), TermsOfServiceFile.current_url, target: "_blank")) .column-right - %button{ data: { action: "click->terms-of-service-banner#accept click->terms-of-service-banner#close_banner" } } + %button{ data: { reflex: "click->Enterprise::User#accept_terms_of_services", id: current_spree_user&.id } } = t("admin.accept_terms_of_service") diff --git a/app/webpacker/controllers/terms_of_service_banner_controller.js b/app/webpacker/controllers/terms_of_service_banner_controller.js deleted file mode 100644 index aca1dd08dd..0000000000 --- a/app/webpacker/controllers/terms_of_service_banner_controller.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Controller } from "stimulus"; - -export default class extends Controller { - static values = { url: String }; - - accept() { - const token = document.querySelector('meta[name="csrf-token"]').content; - // We don't really care if the update fails, if it fails it will result in the banner still - // being shown. - fetch(this.urlValue, { method: "post", headers: { "X-CSRF-Token": token } }); - } - - close_banner() { - this.element.remove(); - } -} diff --git a/config/routes/spree.rb b/config/routes/spree.rb index 46e22d2384..462073b486 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -48,11 +48,7 @@ Spree::Core::Engine.routes.draw do get '/search/known_users' => "search#known_users", :as => :search_known_users get '/search/customers' => 'search#customers', :as => :search_customers - resources :users do - member do - post :accept_terms_of_services - end - end + resources :users constraints FeatureToggleConstraint.new(:admin_style_v3, negate: true) do # Show old bulk products screen diff --git a/spec/controllers/spree/admin/users_controller_spec.rb b/spec/controllers/spree/admin/users_controller_spec.rb index 841696a970..96e7cc4df4 100644 --- a/spec/controllers/spree/admin/users_controller_spec.rb +++ b/spec/controllers/spree/admin/users_controller_spec.rb @@ -38,21 +38,4 @@ describe Spree::Admin::UsersController do expect(response).to redirect_to('/unauthorized') end end - - describe "#accept_terms_of_services" do - let(:user) { create(:user) } - - before do - allow(controller).to receive_messages spree_current_user: user - user.spree_roles << Spree::Role.find_or_create_by(name: 'admin') - end - - it "updates terms_of_service_accepted_at" do - expect do - spree_post :accept_terms_of_services, id: user.id - end.to change { user.reload.terms_of_service_accepted_at } - - expect(response).to have_http_status(:ok) - end - end end diff --git a/spec/javascripts/stimulus/terms_of_service_banner_controller_test.js b/spec/javascripts/stimulus/terms_of_service_banner_controller_test.js deleted file mode 100644 index 7ba5416063..0000000000 --- a/spec/javascripts/stimulus/terms_of_service_banner_controller_test.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @jest-environment jsdom - */ - -import { Application } from "stimulus" -import terms_of_service_banner_controller from "../../../app/webpacker/controllers/terms_of_service_banner_controller" - -describe("TermsOfServiceBannerController", () => { - beforeAll(() => { - const application = Application.start() - application.register("terms-of-service-banner", terms_of_service_banner_controller) - }) - - beforeEach(() => { - document.body.innerHTML = ` - -
-
- Terms of service has been updated - - -
-
- ` - }) - - describe("#close", () => { - it("removes the banner", () => { - const closeButton = document.getElementById("test-close-banner") - closeButton.click() - - expect(document.getElementById("test-controller-div")).toBeNull() - }) - }) - - describe("#accept", () => { - it("fires a request to accept terms of service", () => { - const mockFetch = jest.fn().mockImplementation( (_url, _options) => - Promise.resolve({ - ok: true, - json: () => "", - }) - ) - window.fetch = (_url, _options) => { - return mockFetch(_url, _options) - } - - const button = document.getElementById("test-accept-banner") - - button.click() - - expect(mockFetch).toHaveBeenCalledWith( - "admin/users/10/accept_terms_of_service", - { headers: { "X-CSRF-Token": "abc123authenticitytoken" }, method: "post" } - ) - }) - }) -}) diff --git a/spec/reflexes/enterprise/user_reflex_spec.rb b/spec/reflexes/enterprise/user_reflex_spec.rb new file mode 100644 index 0000000000..b70f01321d --- /dev/null +++ b/spec/reflexes/enterprise/user_reflex_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "reflex_helper" + +describe Enterprise::UserReflex, type: :reflex do + let(:current_user) { create(:user) } + let(:context) { { url: spree.admin_dashboard_url, connection: { current_user: } } } + + describe "#accept_terms_of_services" do + subject(:reflex) do + build_reflex( + method_name: :accept_terms_of_services, **context, params: { id: current_user.id } + ) + end + + it "updates terms_of_service_accepted_at" do + expect{ + reflex.run(:accept_terms_of_services) + current_user.reload + }.to change{ current_user.terms_of_service_accepted_at } + end + + it "removes banner from the page" do + expect(reflex.run(:accept_terms_of_services)).to morph("#banner-container").with("") + end + end +end