diff --git a/.rubocop.yml b/.rubocop.yml index 70668f85b..6d31cc6bb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -286,6 +286,7 @@ Layout/LineLength: - 'packages/forest_admin_agent/lib/forest_admin_agent/http/forest_admin_api_requester.rb' - 'packages/forest_admin_agent/lib/forest_admin_agent/routes/resources/list.rb' - 'packages/forest_admin_agent/lib/forest_admin_agent/services/permissions.rb' + - 'packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb' - 'packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/action/form_layout_element.rb' - 'packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/override/context/create_override_customization_context.rb' - 'packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/override/context/update_override_customization_context.rb' diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb b/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb index 4e32b2940..ef5a86172 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/builder/agent_factory.rb @@ -80,13 +80,10 @@ def build_cache return unless @has_env_secret cache = @container.resolve(:cache) - @options[:customize_error_message] = @options[:customize_error_message] - &.source - &.strip - &.delete_prefix('config.customize_error_message =') - &.strip - @options[:logger] = @options[:logger]&.source&.strip&.delete_prefix('config.logger =')&.strip + @options[:customize_error_message] = + clean_option_value(@options[:customize_error_message], 'config.customize_error_message =') + @options[:logger] = clean_option_value(@options[:logger], 'config.logger =') cache.set('config', @options.to_h) end @@ -95,6 +92,14 @@ def build_logger @logger = Services::LoggerService.new(@options[:loggerLevel], @options[:logger]) @container.register(:logger, @logger) end + + def clean_option_value(option, prefix) + return unless option + + source = option.source + cleaned_option = source&.strip if source + cleaned_option&.delete_prefix(prefix)&.strip + end end end end diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb index d7ec0c2c4..3c1330bda 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/services/smart_action_checker.rb @@ -37,7 +37,7 @@ def can_execute? def can_approve? if smart_action[:userApprovalEnabled].include?(role_id) && - (smart_action[:userApprovalConditions].empty? || match_conditions(:userApprovalConditions)) && + (condition_by_role_id(smart_action[:userApprovalConditions]).blank? || match_conditions(:userApprovalConditions)) && (attributes[:signed_approval_request][:data][:attributes][:requester_id] != caller.id || smart_action[:selfApprovalEnabled].include?(role_id)) return true @@ -48,15 +48,17 @@ def can_approve? def can_trigger? if smart_action[:triggerEnabled].include?(role_id) && !smart_action[:approvalRequired].include?(role_id) - return true if smart_action[:triggerConditions].empty? || match_conditions(:triggerConditions) + if condition_by_role_id(smart_action[:triggerConditions]).blank? || match_conditions(:triggerConditions) + return true + end elsif smart_action[:approvalRequired].include?(role_id) && smart_action[:triggerEnabled].include?(role_id) - if smart_action[:approvalRequiredConditions].empty? || match_conditions(:approvalRequiredConditions) + if condition_by_role_id(smart_action[:approvalRequiredConditions]).blank? || match_conditions(:approvalRequiredConditions) raise RequireApproval.new( 'This action requires to be approved.', REQUIRE_APPROVAL_ERROR, smart_action[:userApprovalEnabled] ) - elsif smart_action[:triggerConditions].empty? || match_conditions(:triggerConditions) + elsif condition_by_role_id(smart_action[:triggerConditions]).blank? || match_conditions(:triggerConditions) return true end end @@ -71,11 +73,11 @@ def match_conditions(condition_name) else Nodes::ConditionTreeLeaf.new(pk, 'IN', attributes[:ids]) end - condition = smart_action[condition_name][0][:filter] + condition = condition_by_role_id(smart_action[condition_name]) conditional_filter = filter.override( condition_tree: ConditionTreeFactory.intersect( [ - ConditionTreeParser.from_plain_object(collection, condition), + ConditionTreeParser.from_plain_object(collection, condition[:filter]), filter.condition_tree, condition_filter ] @@ -90,6 +92,10 @@ def match_conditions(condition_name) INVALID_ACTION_CONDITION_ERROR ) end + + def condition_by_role_id(condition) + condition.find { |c| c['roleId'] == role_id } + end end end end diff --git a/packages/forest_admin_datasource_active_record/Gemfile b/packages/forest_admin_datasource_active_record/Gemfile index d3cfa3f4b..fcb660e5c 100644 --- a/packages/forest_admin_datasource_active_record/Gemfile +++ b/packages/forest_admin_datasource_active_record/Gemfile @@ -14,5 +14,5 @@ group :development, :test do gem 'simplecov', '~> 0.22', require: false gem 'simplecov-html', '~> 0.12.3' gem 'simplecov_json_formatter', '~> 0.1.4' - gem 'sqlite3', '< 2.0' + gem 'sqlite3' end diff --git a/packages/forest_admin_datasource_active_record/Gemfile-test b/packages/forest_admin_datasource_active_record/Gemfile-test index b9c9ef8bd..b9c65ad44 100644 --- a/packages/forest_admin_datasource_active_record/Gemfile-test +++ b/packages/forest_admin_datasource_active_record/Gemfile-test @@ -14,5 +14,5 @@ group :development, :test do gem 'simplecov', '~> 0.22', require: false gem 'simplecov-html', '~> 0.12.3' gem 'simplecov_json_formatter', '~> 0.1.4' - gem 'sqlite3', '< 2.0' + gem 'sqlite3' end diff --git a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb index 0d12b5441..30cf67ace 100644 --- a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb +++ b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/components/query/aggregation.rb @@ -46,7 +46,7 @@ def replace_fields end def override(**args) - Aggregation.new(**to_h.merge(args)) + Aggregation.new(**to_h, **args) end def apply(records, timezone, limit = nil)