Add action Settings::AppearancesController#update
This commit is contained in:
parent
1266668391
commit
9a4c08237c
|
@ -8,9 +8,24 @@ class Settings::AppearancesController < ApplicationController
|
||||||
authorize %i[settings appearance]
|
authorize %i[settings appearance]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# PATCH/PUT /settings/appearance
|
||||||
|
def update
|
||||||
|
authorize %i[settings appearance]
|
||||||
|
|
||||||
|
return render :edit unless @account.update account_attributes_for_update
|
||||||
|
|
||||||
|
redirect_to edit_settings_appearance_url
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_account
|
def set_account
|
||||||
@account = current_account.clone&.reload
|
@account = current_account.clone&.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_attributes_for_update
|
||||||
|
params.require(:account).permit(
|
||||||
|
policy(%i[settings appearance]).permitted_attributes_for_update,
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,6 +9,37 @@ module ApplicationHelper
|
||||||
controller_path.start_with?('staff')
|
controller_path.start_with?('staff')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def timezones_collection
|
||||||
|
[*negative_timezones_collection, *positive_timezones_collection].freeze
|
||||||
|
end
|
||||||
|
|
||||||
|
def positive_timezones_collection
|
||||||
|
0.upto(11).flat_map do |n|
|
||||||
|
s = n.to_s.rjust(2, '0')
|
||||||
|
|
||||||
|
[
|
||||||
|
"#{s}:00:00",
|
||||||
|
"#{s}:15:00",
|
||||||
|
"#{s}:30:00",
|
||||||
|
"#{s}:45:00",
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def negative_timezones_collection
|
||||||
|
12.downto(1).flat_map do |n|
|
||||||
|
s1 = n.to_s.rjust(2, '0')
|
||||||
|
s2 = (n - 1).to_s.rjust(2, '0')
|
||||||
|
|
||||||
|
[
|
||||||
|
"-#{s1}:00:00",
|
||||||
|
"-#{s2}:45:00",
|
||||||
|
"-#{s2}:30:00",
|
||||||
|
"-#{s2}:15:00",
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def none
|
def none
|
||||||
tag.i class: 'text-muted' do
|
tag.i class: 'text-muted' do
|
||||||
translate :none
|
translate :none
|
||||||
|
|
|
@ -4,4 +4,8 @@ class Settings::AppearancePolicy < ApplicationPolicy
|
||||||
def update?
|
def update?
|
||||||
!!account
|
!!account
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def permitted_attributes_for_update
|
||||||
|
%i[timezone]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
<%= simple_form_for account, url: settings_appearance_path do |f| %>
|
||||||
|
<%= f.error_notification %>
|
||||||
|
|
||||||
|
<%= f.input :timezone, as: :select, collection: timezones_collection %>
|
||||||
|
|
||||||
|
<%= f.button :submit, translate(:save) %>
|
||||||
|
<% end %>
|
|
@ -5,6 +5,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
|
<%= render partial: 'form', locals: { account: @account } %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -44,6 +44,7 @@ en:
|
||||||
biography: Bio
|
biography: Bio
|
||||||
avatar: Avatar
|
avatar: Avatar
|
||||||
person: Person
|
person: Person
|
||||||
|
timezone: Timezone
|
||||||
contact:
|
contact:
|
||||||
id: ID
|
id: ID
|
||||||
contact_network: Contact network
|
contact_network: Contact network
|
||||||
|
|
|
@ -44,6 +44,7 @@ ru:
|
||||||
biography: Биография
|
biography: Биография
|
||||||
avatar: Аватар
|
avatar: Аватар
|
||||||
person: Человек
|
person: Человек
|
||||||
|
timezone: Часовой пояс
|
||||||
contact:
|
contact:
|
||||||
id: ID
|
id: ID
|
||||||
contact_network: Сеть контактов
|
contact_network: Сеть контактов
|
||||||
|
|
|
@ -9,3 +9,4 @@ en:
|
||||||
open_action: Open
|
open_action: Open
|
||||||
create: Create
|
create: Create
|
||||||
destroy_confirmation: 'Do you really want to destroy %{value}?'
|
destroy_confirmation: 'Do you really want to destroy %{value}?'
|
||||||
|
save: Save
|
||||||
|
|
|
@ -9,3 +9,4 @@ ru:
|
||||||
open_action: Открыть
|
open_action: Открыть
|
||||||
create: Создать
|
create: Создать
|
||||||
destroy_confirmation: 'Вы действительно хотите удалить %{value}?'
|
destroy_confirmation: 'Вы действительно хотите удалить %{value}?'
|
||||||
|
save: Сохранить
|
||||||
|
|
|
@ -32,7 +32,7 @@ Rails.application.routes.draw do
|
||||||
|
|
||||||
namespace :settings do
|
namespace :settings do
|
||||||
resource :profile, only: %i[edit update]
|
resource :profile, only: %i[edit update]
|
||||||
resource :appearance, only: :edit
|
resource :appearance, only: %i[edit update]
|
||||||
resource :person, only: %i[show new]
|
resource :person, only: %i[show new]
|
||||||
resources :contacts, only: %i[index create destroy]
|
resources :contacts, only: %i[index create destroy]
|
||||||
resources :sessions, only: :index
|
resources :sessions, only: :index
|
||||||
|
|
|
@ -5,7 +5,7 @@ FactoryBot.define do
|
||||||
public_name { Faker::Name.name }
|
public_name { Faker::Name.name }
|
||||||
biography { Faker::Lorem.paragraph }
|
biography { Faker::Lorem.paragraph }
|
||||||
|
|
||||||
timezone { "#{[nil, :-].sample}#{rand(0..11).to_s.rjust(2, '0')}:00:00" }
|
timezone { "#{[nil, :-].sample}#{rand(1..11).to_s.rjust(2, '0')}:00:00" }
|
||||||
end
|
end
|
||||||
|
|
||||||
factory :usual_account, parent: :initial_account do
|
factory :usual_account, parent: :initial_account do
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'PATCH/PUT /settings/appearance' do
|
||||||
|
let(:current_account) { create :usual_account }
|
||||||
|
|
||||||
|
let :account_attributes do
|
||||||
|
{
|
||||||
|
timezone: timezone,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
let :timezone do
|
||||||
|
timezone = "#{[nil, :-].sample}#{rand(1..11).to_s.rjust(2, '0')}:00:00"
|
||||||
|
|
||||||
|
if timezone != current_account&.timezone
|
||||||
|
timezone
|
||||||
|
elsif current_account&.timezone == '02:00:00'
|
||||||
|
'05:00:00'
|
||||||
|
else
|
||||||
|
'02:00:00'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_in current_account.user if current_account&.user
|
||||||
|
end
|
||||||
|
|
||||||
|
def make_request
|
||||||
|
patch '/settings/appearance', params: { account: account_attributes }
|
||||||
|
end
|
||||||
|
|
||||||
|
for_account_types nil do
|
||||||
|
before { make_request }
|
||||||
|
|
||||||
|
specify do
|
||||||
|
expect(response).to have_http_status :forbidden
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for_account_types :usual, :personal, :superuser do
|
||||||
|
specify do
|
||||||
|
expect { make_request }.to \
|
||||||
|
change { current_account.reload.timezone }
|
||||||
|
.from(current_account.timezone)
|
||||||
|
.to(account_attributes[:timezone])
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'after request' do
|
||||||
|
before { make_request }
|
||||||
|
|
||||||
|
specify do
|
||||||
|
expect(response).to redirect_to edit_settings_appearance_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Reference in New Issue