apply_value.rb 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. class FormUpdater::ApplyValue
  3. include Mixin::RequiredSubPaths
  4. attr_reader :context, :data, :meta, :result
  5. def initialize(context:, data:, meta:, result:)
  6. @context = context
  7. @data = data
  8. @meta = meta
  9. @result = result
  10. end
  11. FIELD_RENAMING_MAP = {
  12. 'formSenderType' => 'articleSenderType',
  13. }.freeze
  14. def perform(field:, config:, include_blank: false)
  15. # Skip fields without a configured value
  16. return if config['value'].blank? && !include_blank
  17. field = FIELD_RENAMING_MAP[field] || field
  18. result[field] ||= {}
  19. # Cache the field attribute
  20. field_attribute = ObjectManager::Attribute.get(object: 'Ticket', name: field)
  21. # Complex fields
  22. if (handler = find_handler(field:, field_attribute:))
  23. return handler.apply_value(field:, config:)
  24. end
  25. # Simple fields
  26. return if meta[:dirty_fields]&.include?(field) && data[field].present?
  27. result[field][:value] = config['value']
  28. end
  29. private
  30. def find_handler(field:, field_attribute:)
  31. FormUpdater::ApplyValue::Base
  32. .descendants
  33. .lazy
  34. .map { |handler_class| handler_class.new(context:, data:, meta:, result:) }
  35. .find { |elem| elem.can_handle_field?(field:, field_attribute:) }
  36. end
  37. end