Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Task/255 move people manager managements to aside #44

Merged
merged 3 commits into from
Feb 27, 2024
Merged
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,8 @@ spec/reports
brakeman-output.tabs
rubocop-results.xml
config/environment.rb

.envrc
.tool-versions
.nvimrc
tags
38 changes: 38 additions & 0 deletions app/abilities/people_manager_ability.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# frozen_string_literal: true

# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of
# hitobito and licensed under the Affero General Public License version 3
# or later. See the COPYING file at the top-level directory or at
# https://github.com/hitobito/hitobito_youth.

class PeopleManagerAbility < AbilityDsl::Base
on(PeopleManager) do
class_side(:index).everybody
permission(:any).may(:new_managed, :new_manager).everybody
permission(:any).may(:create_managed, :destroy_managed).if_can_change_managed
permission(:any).may(:create_manager, :destroy_manager).if_can_change_manager
end

def if_can_change_manager
can?(:change_managers, subject.managed) || creating_new_managed_person?
end

def if_can_change_managed
can?(:update, subject.manager)
end

private

def creating_new_managed_person?
subject.managed&.new_record? &&
FeatureGate.enabled?('people.people_managers.self_service_managed_creation')
end

def can?(action, person)
ability.can?(action, person)
end

def ability
@ability ||= Ability.new(user)
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def update

def person
@person ||= Person.new.tap do |person|
person.managers = [current_user]
person.people_managers.build(manager: current_user, managed: person)
end
end

Expand Down
66 changes: 66 additions & 0 deletions app/controllers/people_managers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# frozen_string_literal: true

# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of
# hitobito and licensed under the Affero General Public License version 3
# or later. See the COPYING file at the top-level directory or at
# https://github.com/hitobito/hitobito_youth.

class PeopleManagersController < ApplicationController

before_action :authorize_action, except: [:index]
before_action :authorize_class, only: :index
helper_method :entry, :person

class_attribute :assoc

def index
end

def new
end

def create
assign_attributes
if entry.save
redirect_to redirect_to_path
else
render :new
end
end

def destroy
find_entry.destroy!
redirect_to redirect_to_path
end

private

def authorize_action
kind = assoc.to_s.split("_").last.singularize
action_to_authorize = :"#{action_name}_#{kind}"

authorize!(action_to_authorize, entry)
end

def authorize_class
authorize!(:index, PeopleManager)
end

def assign_attributes
entry.attributes = model_params
end

def entry
@entry ||= person.send(assoc).build
end

def find_entry
person.send(assoc).find_by(params[:id])
end

def person
@person ||= Person
.accessible_by(current_ability)
.find(params[:person_id])
end
end
31 changes: 31 additions & 0 deletions app/controllers/person/manageds_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# frozen_string_literal: true

# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of
# hitobito and licensed under the Affero General Public License version 3
# or later. See the COPYING file at the top-level directory or at
# https://github.com/hitobito/hitobito_youth.

class Person::ManagedsController < PeopleManagersController

helper_method :create_managed?

self.assoc = :people_manageds

private

def create_managed?
cannot?(:lookup_manageds, Person) &&
FeatureGate.enabled?('people.people_managers.self_service_managed_creation')
end

def redirect_to_path
person_manageds_path(person)
end

def model_params
params.require(:people_manager).permit(
:managed_id,
managed_attributes: [:first_name, :last_name, :gender, :birthday],
)
end
end
21 changes: 21 additions & 0 deletions app/controllers/person/managers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# frozen_string_literal: true

# Copyright (c) 2024, Schweizer Alpen-Club. This file is part of
# hitobito and licensed under the Affero General Public License version 3
# or later. See the COPYING file at the top-level directory or at
# https://github.com/hitobito/hitobito_youth.

class Person::ManagersController < PeopleManagersController

self.assoc = :people_managers

private

def redirect_to_path
person_managers_path(person)
end

def model_params
params.require(:people_manager).permit(:manager_id)
end
end
97 changes: 0 additions & 97 deletions app/controllers/youth/people_controller.rb

This file was deleted.

61 changes: 61 additions & 0 deletions app/helpers/dropdown/add_people_manager.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
module Dropdown
class AddPeopleManager < Base

delegate :can?, :cannot?, :new_person_manager_path, :new_person_managed_path, to: :template

def initialize(template, person, managers: true)
super(template, template.ti(:'link.add'), :plus)
@person = person
@managers = managers
init_items
end

def to_s
return '' if @items.none?
return single_action_button if @items.one?

super
end

private

def single_action_button
template.action_button(@items.first.label, @items.first.url, :plus, class: 'btn-sm' )
end

def init_items
add_assign_manager_item if create_manager?
add_assign_managed_item if create_managed?
add_create_managed_item if create_new_managed?
end

def add_assign_manager_item
add_item(t(:assign_manager_person_button), new_person_manager_path(@person))
end

def add_create_managed_item
add_item(t(:create_managed_person_button), new_person_managed_path(@person, create: true))
end

def add_assign_managed_item
add_item(t(:assign_managed_person_button), new_person_managed_path(@person))
end

def create_managed?
can?(:create_managed, PeopleManager.new(manager: @person))
end

def create_manager?
can?(:create_manager, PeopleManager.new(managed: @person))
end

def create_new_managed?
cannot?(:lookup_manageds, Person) &&
FeatureGate.enabled?('people.people_managers.self_service_managed_creation')
end

def t(key)
I18n.t(key, scope: [:people_managers])
end
end
end
2 changes: 2 additions & 0 deletions app/models/people_manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ class PeopleManager < ActiveRecord::Base

accepts_nested_attributes_for :managed
validates :manager_id, uniqueness: { scope: :managed_id }
validates :manager_id, presence: true
validates :managed_id, presence: true, unless: ->(p) { p.managed.present? }
validate :assert_manager_is_not_managed

after_create :create_paper_trail_versions_for_create_event
Expand Down
3 changes: 0 additions & 3 deletions app/models/youth/person.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@ module Youth::Person
has_many :managers, through: :people_managers
has_many :manageds, through: :people_manageds

accepts_nested_attributes_for :people_managers, allow_destroy: true
accepts_nested_attributes_for :people_manageds, allow_destroy: true

validates :nationality_j_s, inclusion: { in: NATIONALITIES_J_S, allow_blank: true }

validate :assert_either_only_managers_or_manageds
Expand Down
13 changes: 0 additions & 13 deletions app/views/people/_fields_youth.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,6 @@
-# or later. See the COPYING file at the top-level directory or at
-# https://github.com/hitobito/hitobito_youth.

- FeatureGate.if('people.people_managers') do
= field_set_tag do
- if can?(:change_managers, entry)
= f.labeled_inline_fields_for :people_managers, 'people/managers/fields', f.object.people_managers
- else
= f.labeled(:people_managers) do
%div.pt-1
%span.help-block.d-inline
= t('.no_permission_to_change_managers')

= field_set_tag do
= f.labeled_inline_fields_for :people_manageds, 'people/manageds/fields', f.object.people_manageds

= field_set_tag do
= f.labeled_input_fields(:ahv_number, :j_s_number)
= f.labeled_collection_select(:nationality_j_s,
Expand Down
17 changes: 17 additions & 0 deletions app/views/people/_show_right_youth.html.haml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
- # frozen_string_literal: true
-
- # Copyright (c) 2024, Schweizer Alpen-Club. This file is part of
- # hitobito and licensed under the Affero General Public License version 3
- # or later. See the COPYING file at the top-level directory or at
- # https://github.com/hitobito/hitobito.


- FeatureGate.if('people.people_managers') do
%section
- if entry.people_managers.any?
= render 'person/managers/list', person: entry
- elsif entry.people_manageds.any?
= render 'person/manageds/list', person: entry
- else
= render 'people_managers/list', person: entry

Loading
Loading