diff --git a/CHANGELOG.md b/CHANGELOG.md index 75be34e929ed..99f6cfa17569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ end **Added**: - **decidim-assemblies**: Add members to assemblies. [\#3008](https://github.com/decidim/decidim/pull/3008) +- **decidim-assemblies**: An assembly member can be related to an existing user. [\#3302](https://github.com/decidim/decidim/pull/3302) - **decidim-meetings**: Add organizer to meeting and meeting types [\#3136](https://github.com/decidim/decidim/pull/3136) - **decidim-meetings**: Add Minutes entity to manage Minutes. [\#3213](https://github.com/decidim/decidim/pull/3213) - **decidim-admin**: Links to participatory space index & show pages from the admin dashboard. [\#3325](https://github.com/decidim/decidim/pull/3325) diff --git a/decidim-admin/lib/decidim/admin/form_builder.rb b/decidim-admin/lib/decidim/admin/form_builder.rb index fcb6edc9008c..099df0d7520b 100644 --- a/decidim-admin/lib/decidim/admin/form_builder.rb +++ b/decidim-admin/lib/decidim/admin/form_builder.rb @@ -19,7 +19,7 @@ class FormBuilder < Decidim::FormBuilder # @param [Hash] prompt_options # Prompt configuration. A hash with options: # - :url (String) The url where the ajax endpoint to fill the select - # - :text (String) Text to use as placeholder + # - :placeholder (String) Text to use as placeholder # - :no_results (String) (optional) Text to use when there are no matching results (default: No results found) # - :search_prompt (String) (optional) Text to prompt for search input (default: Type at least three characters to search) # diff --git a/decidim-assemblies/app/assets/javascripts/decidim/assemblies/admin/assembly_members.js.es6 b/decidim-assemblies/app/assets/javascripts/decidim/assemblies/admin/assembly_members.js.es6 index 2cf765d424e1..56859528f74b 100644 --- a/decidim-assemblies/app/assets/javascripts/decidim/assemblies/admin/assembly_members.js.es6 +++ b/decidim-assemblies/app/assets/javascripts/decidim/assemblies/admin/assembly_members.js.es6 @@ -1,6 +1,28 @@ ((exports) => { const { createFieldDependentInputs } = exports.DecidimAdmin; + const $assemblyMemberType = $("#assembly_member_existing_user"); + + createFieldDependentInputs({ + controllerField: $assemblyMemberType, + wrapperSelector: ".user-fields", + dependentFieldsSelector: ".user-fields--full-name", + dependentInputSelector: "input", + enablingCondition: ($field) => { + return $field.val() === "false" + } + }); + + createFieldDependentInputs({ + controllerField: $assemblyMemberType, + wrapperSelector: ".user-fields", + dependentFieldsSelector: ".user-fields--user-picker", + dependentInputSelector: "input", + enablingCondition: ($field) => { + return $field.val() === "true" + } + }); + const $assemblyMemberPosition = $("#assembly_member_position"); createFieldDependentInputs({ diff --git a/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_member.rb b/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_member.rb index 411e7a064307..0039c02cecce 100644 --- a/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_member.rb +++ b/decidim-assemblies/app/commands/decidim/assemblies/admin/create_assembly_member.rb @@ -61,7 +61,8 @@ def create_assembly_member! :position_other, :weight ).merge( - assembly: assembly + assembly: assembly, + user: form.user ), log_info ) diff --git a/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly_member.rb b/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly_member.rb index 8b1b5922b923..b4228bfb7d48 100644 --- a/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly_member.rb +++ b/decidim-assemblies/app/commands/decidim/assemblies/admin/update_assembly_member.rb @@ -57,6 +57,8 @@ def update_assembly_member! :position, :position_other, :weight + ).merge( + user: form.user ), log_info ) diff --git a/decidim-assemblies/app/forms/decidim/assemblies/admin/assembly_member_form.rb b/decidim-assemblies/app/forms/decidim/assemblies/admin/assembly_member_form.rb index c7ccd9166d99..3262c68cf8d5 100644 --- a/decidim-assemblies/app/forms/decidim/assemblies/admin/assembly_member_form.rb +++ b/decidim-assemblies/app/forms/decidim/assemblies/admin/assembly_member_form.rb @@ -18,11 +18,24 @@ class AssemblyMemberForm < Form attribute :designation_mode, String attribute :position, String attribute :position_other, String + attribute :user_id, Integer + attribute :existing_user, Boolean, default: false - validates :full_name, :designation_date, presence: true + validates :designation_date, presence: true + validates :full_name, presence: true, unless: proc { |object| object.existing_user } validates :position, inclusion: { in: Decidim::AssemblyMember::POSITIONS } validates :position_other, presence: true, if: ->(form) { form.position == "other" } validates :ceased_date, date: { after: :designation_date, allow_blank: true } + validates :user, presence: true, if: proc { |object| object.existing_user } + + def map_model(model) + self.user_id = model.decidim_user_id + self.existing_user = user_id.present? + end + + def user + @user ||= current_organization.users.find_by(id: user_id) + end def positions_for_select Decidim::AssemblyMember::POSITIONS.map do |position| diff --git a/decidim-assemblies/app/models/decidim/assembly_member.rb b/decidim-assemblies/app/models/decidim/assembly_member.rb index 2d2474ed613f..56169ecdbfbc 100644 --- a/decidim-assemblies/app/models/decidim/assembly_member.rb +++ b/decidim-assemblies/app/models/decidim/assembly_member.rb @@ -9,6 +9,7 @@ class AssemblyMember < ApplicationRecord POSITIONS = %w(president vice_president secretary other).freeze + belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User", optional: true belongs_to :assembly, foreign_key: "decidim_assembly_id", class_name: "Decidim::Assembly" alias participatory_space assembly diff --git a/decidim-assemblies/app/presenters/decidim/admin/assembly_member_presenter.rb b/decidim-assemblies/app/presenters/decidim/admin/assembly_member_presenter.rb new file mode 100644 index 000000000000..93f3e2dcd975 --- /dev/null +++ b/decidim-assemblies/app/presenters/decidim/admin/assembly_member_presenter.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Decidim + module Admin + # + # Decorator for assembly members + # + class AssemblyMemberPresenter < SimpleDelegator + def name + if user + "#{user.name} (#{Decidim::UserPresenter.new(user).nickname})" + else + full_name + end + end + + def position + return position_other if __getobj__.position == "other" + + I18n.t(__getobj__.position, scope: "decidim.admin.models.assembly_member.positions", default: "") + end + end + end +end diff --git a/decidim-assemblies/app/presenters/decidim/assembly_member_presenter.rb b/decidim-assemblies/app/presenters/decidim/assembly_member_presenter.rb index 44a72a3a1366..57850cc8153a 100644 --- a/decidim-assemblies/app/presenters/decidim/assembly_member_presenter.rb +++ b/decidim-assemblies/app/presenters/decidim/assembly_member_presenter.rb @@ -11,6 +11,14 @@ def age delegate :profile_url, :avatar_url, to: :user, allow_nil: true + def name + user ? user.name : full_name + end + + def nickname + user.nickname if user + end + def personal_information [ gender.presence, @@ -24,5 +32,15 @@ def position I18n.t(__getobj__.position, scope: "decidim.admin.models.assembly_member.positions", default: "") end + + private + + def user + @user ||= begin + if (user = __getobj__.user.presence) + Decidim::UserPresenter.new(user) + end + end + end end end diff --git a/decidim-assemblies/app/views/decidim/assemblies/admin/assembly_members/_form.html.erb b/decidim-assemblies/app/views/decidim/assemblies/admin/assembly_members/_form.html.erb index dabcf27c32c0..d99ad1750cba 100644 --- a/decidim-assemblies/app/views/decidim/assemblies/admin/assembly_members/_form.html.erb +++ b/decidim-assemblies/app/views/decidim/assemblies/admin/assembly_members/_form.html.erb @@ -6,8 +6,21 @@