1
0
Fork 0

Add action Settings::AppearancesController#update

This commit is contained in:
Alex Kotov 2019-09-04 04:11:55 +05:00
parent 1266668391
commit 9a4c08237c
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
12 changed files with 122 additions and 2 deletions

View File

@ -8,9 +8,24 @@ class Settings::AppearancesController < ApplicationController
authorize %i[settings appearance]
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
def set_account
@account = current_account.clone&.reload
end
def account_attributes_for_update
params.require(:account).permit(
policy(%i[settings appearance]).permitted_attributes_for_update,
)
end
end

View File

@ -9,6 +9,37 @@ module ApplicationHelper
controller_path.start_with?('staff')
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
tag.i class: 'text-muted' do
translate :none

View File

@ -4,4 +4,8 @@ class Settings::AppearancePolicy < ApplicationPolicy
def update?
!!account
end
def permitted_attributes_for_update
%i[timezone]
end
end

View File

@ -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 %>

View File

@ -5,6 +5,7 @@
</div>
<div class="col-md-9">
<%= render partial: 'form', locals: { account: @account } %>
</div>
</div>
</div>

View File

@ -44,6 +44,7 @@ en:
biography: Bio
avatar: Avatar
person: Person
timezone: Timezone
contact:
id: ID
contact_network: Contact network

View File

@ -44,6 +44,7 @@ ru:
biography: Биография
avatar: Аватар
person: Человек
timezone: Часовой пояс
contact:
id: ID
contact_network: Сеть контактов

View File

@ -9,3 +9,4 @@ en:
open_action: Open
create: Create
destroy_confirmation: 'Do you really want to destroy %{value}?'
save: Save

View File

@ -9,3 +9,4 @@ ru:
open_action: Открыть
create: Создать
destroy_confirmation: 'Вы действительно хотите удалить %{value}?'
save: Сохранить

View File

@ -32,7 +32,7 @@ Rails.application.routes.draw do
namespace :settings do
resource :profile, only: %i[edit update]
resource :appearance, only: :edit
resource :appearance, only: %i[edit update]
resource :person, only: %i[show new]
resources :contacts, only: %i[index create destroy]
resources :sessions, only: :index

View File

@ -5,7 +5,7 @@ FactoryBot.define do
public_name { Faker::Name.name }
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
factory :usual_account, parent: :initial_account do

View File

@ -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