From 9d260635ca8d2f16aac1288509182c6284ba5264 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Fri, 23 Oct 2020 11:53:39 +1100 Subject: [PATCH] Move to more reliable custom field metaprogramming --- .../custom_wizard/admin/custom_fields.rb | 1 - lib/custom_wizard/custom_field.rb | 30 ++++--------------- plugin.rb | 27 +++++++++++++++-- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/controllers/custom_wizard/admin/custom_fields.rb b/controllers/custom_wizard/admin/custom_fields.rb index 259150a0..6359d08f 100644 --- a/controllers/custom_wizard/admin/custom_fields.rb +++ b/controllers/custom_wizard/admin/custom_fields.rb @@ -26,7 +26,6 @@ class CustomWizard::AdminCustomFieldsController < CustomWizard::AdminController end if all_fields_saved - CustomWizard::CustomField.register_fields render json: success_json else render json: error_json diff --git a/lib/custom_wizard/custom_field.rb b/lib/custom_wizard/custom_field.rb index 3009bf12..b658a958 100644 --- a/lib/custom_wizard/custom_field.rb +++ b/lib/custom_wizard/custom_field.rb @@ -80,31 +80,13 @@ class ::CustomWizard::CustomField end end - def self.register_fields - self.list.each do |field| - klass = field.klass.classify.constantize - - klass.register_custom_field_type(field.name, field.type.to_sym) - - klass.define_method(field.name) do - custom_fields[field.name] + def self.list_by(attr, value) + self.list.select do |cf| + if attr == 'serializers' + cf.send(attr).include?(value) + else + cf.send(attr) == value end - - if field.serializers.any? - field.serializers.each do |serializer| - serializer_klass = "#{serializer}_serializer".classify.constantize - - serializer_klass.class_eval { attributes(field.name.to_sym) } - - serializer_klass.define_method(field.name) do - if serializer == 'topic_view' - object.topic.send(field.name) - else - object.send(field.name) - end - end - end - end end end end \ No newline at end of file diff --git a/plugin.rb b/plugin.rb index 1510983b..82ee9855 100644 --- a/plugin.rb +++ b/plugin.rb @@ -162,8 +162,31 @@ after_initialize do ::Wizard::Step.prepend CustomWizardStepExtension CustomWizard::Wizard.register_styles + + CustomWizard::CustomField::CLASSES.each do |klass| + add_model_callback(klass.to_sym, :after_initialize) do + CustomWizard::CustomField.list_by('klass', klass).each do |field| + klass.classify + .constantize + .register_custom_field_type(field.name, field.type.to_sym) + end + end + end - CustomWizard::CustomField.register_fields - + CustomWizard::CustomField::SERIALIZERS.each do |serializer_klass| + "#{serializer_klass}_serializer".classify.constantize.class_eval do + CustomWizard::CustomField.list_by('serializers', serializer_klass).each do |field| + attributes(field.name.to_sym) + class_eval %{def #{field.name} + if "#{serializer_klass}" == "topic_view" + object.topic.custom_fields["#{field.name}"] + else + object.custom_fields["#{field.name}"] + end + end} + end + end + end + DiscourseEvent.trigger(:custom_wizard_ready) end