app/forms/decidim/budgets/admin/component_form.rb in decidim-budgets-0.23.6 vs app/forms/decidim/budgets/admin/component_form.rb in decidim-budgets-0.24.0.rc1

- old
+ new

@@ -5,39 +5,86 @@ module Admin # A form object for the budgets component. Used to attach the component # to a participatory process from the admin panel. # class ComponentForm < Decidim::Admin::ComponentForm - validate :budget_voting_rule_enabled_setting, :budget_voting_rule_value_setting + validate :budget_voting_rule_enabled_setting, + :budget_voting_rule_threshold_value_setting, + :budget_voting_rule_minimum_value_setting, + :budget_voting_rule_projects_value_setting private # Validations on budget settings: # - a voting rule must be enabled. def budget_voting_rule_enabled_setting return unless manifest&.name == :budgets + rule_settings = [ + :vote_rule_threshold_percent_enabled, + :vote_rule_minimum_budget_projects_enabled, + :vote_rule_selected_projects_enabled + ] + active_rules = rule_settings.select { |key| settings.public_send(key) == true } i18n_error_scope = "decidim.components.budgets.settings.global.form.errors" - if settings.vote_rule_threshold_percent_enabled.blank? && settings.vote_rule_minimum_budget_projects_enabled.blank? - settings.errors.add(:vote_rule_threshold_percent_enabled, I18n.t(:budget_voting_rule_required, scope: i18n_error_scope)) - settings.errors.add(:vote_rule_minimum_budget_projects_enabled, I18n.t(:budget_voting_rule_required, scope: i18n_error_scope)) + if active_rules.blank? + rule_settings.each do |key| + settings.errors.add(key, I18n.t(:budget_voting_rule_required, scope: i18n_error_scope)) + end end - if settings.vote_rule_threshold_percent_enabled && settings.vote_rule_minimum_budget_projects_enabled - settings.errors.add(:vote_rule_threshold_percent_enabled, I18n.t(:budget_voting_rule_only_one, scope: i18n_error_scope)) - settings.errors.add(:vote_rule_minimum_budget_projects_enabled, I18n.t(:budget_voting_rule_only_one, scope: i18n_error_scope)) + if active_rules.length > 1 + rule_settings.each do |key| + settings.errors.add(key, I18n.t(:budget_voting_rule_only_one, scope: i18n_error_scope)) + end end end # - the value must be a valid number - def budget_voting_rule_value_setting + def budget_voting_rule_threshold_value_setting return unless manifest&.name == :budgets + return unless settings.vote_rule_threshold_percent_enabled invalid_percent_number = settings.vote_threshold_percent.blank? || settings.vote_threshold_percent.to_i.negative? - settings.errors.add(:vote_threshold_percent) if settings.vote_rule_threshold_percent_enabled && invalid_percent_number + settings.errors.add(:vote_threshold_percent) if invalid_percent_number + end + def budget_voting_rule_minimum_value_setting + return unless manifest&.name == :budgets + return unless settings.vote_rule_minimum_budget_projects_enabled + invalid_minimum_number = settings.vote_minimum_budget_projects_number.blank? || (settings.vote_minimum_budget_projects_number.to_i < 1) - settings.errors.add(:vote_minimum_budget_projects_number) if settings.vote_rule_minimum_budget_projects_enabled && invalid_minimum_number + settings.errors.add(:vote_minimum_budget_projects_number) if invalid_minimum_number + end + + def budget_voting_rule_projects_value_setting + return unless manifest&.name == :budgets + return unless settings.vote_rule_selected_projects_enabled + + budget_voting_projects_value_setting_min + budget_voting_projects_value_setting_max + budget_voting_projects_value_setting_both + end + + def budget_voting_projects_value_setting_min + return if settings.vote_selected_projects_minimum.present? && settings.vote_selected_projects_minimum.to_i >= 0 + + settings.errors.add(:vote_selected_projects_minimum) + end + + def budget_voting_projects_value_setting_max + return if settings.vote_selected_projects_maximum.present? && settings.vote_selected_projects_maximum.to_i.positive? + + settings.errors.add(:vote_selected_projects_maximum) + end + + def budget_voting_projects_value_setting_both + return if settings.errors[:vote_selected_projects_minimum].present? + return if settings.errors[:vote_selected_projects_maximum].present? + return if settings.vote_selected_projects_maximum >= settings.vote_selected_projects_minimum + + settings.errors.add(:vote_selected_projects_minimum) + settings.errors.add(:vote_selected_projects_maximum) end end end end end