app/models/dialog_group.rb
class DialogGroup < ApplicationRecord
include DialogMixin
has_many :dialog_fields, -> { order(:position) }, :dependent => :destroy
belongs_to :dialog_tab
validate :validate_children
alias_attribute :order, :position
def each_dialog_field(&block)
dialog_fields.each(&block)
end
def dialog_resources
dialog_fields
end
def update_dialog_fields(fields)
updated_fields = []
fields.each do |field|
field['options'].try(:symbolize_keys!)
if field.key?('id')
DialogField.find(field['id']).tap do |dialog_field|
resource_action_fields = field.delete('resource_action') || {}
update_resource_fields(resource_action_fields, dialog_field)
dialog_field.update(field.except('id', 'href', 'dialog_group_id', 'dialog_field_responders'))
updated_fields << dialog_field
end
else
updated_fields << DialogImportService.new.build_dialog_fields('dialog_fields' => [field]).first
end
end
self.dialog_fields = updated_fields
end
def validate_children
if dialog_fields.blank?
errors.add(:base, _("Box %{box_label} must have at least one Element") % {:box_label => label})
end
dialog_fields.each do |df|
next if df.valid?
df.errors.full_messages.each do |err_msg|
errors.add(:base, _("Box %{box_label} / %{error_message}") % {:box_label => label, :error_message => err_msg})
end
end
end
def deep_copy
dup.tap do |new_group|
new_group.dialog_fields = dialog_fields.collect(&:deep_copy)
end
end
private
def update_resource_fields(resource_action_fields, dialog_field)
if resource_action_fields.key?('id')
dialog_field.resource_action.update(resource_action_fields.except('id'))
elsif resource_action_fields.present?
dialog_field.resource_action = ResourceAction.create(resource_action_fields)
end
end
end