From 54d244c1d873546a6f07acd8ddf62bd70339c368 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Tue, 20 Oct 2020 20:02:13 +1100 Subject: [PATCH] Make custom field metaprogramming dynamic --- .../custom_wizard/admin/custom_fields.rb | 1 + lib/custom_wizard/custom_field.rb | 28 +++++++++++++++++++ plugin.rb | 21 +------------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/controllers/custom_wizard/admin/custom_fields.rb b/controllers/custom_wizard/admin/custom_fields.rb index 6359d08f..259150a0 100644 --- a/controllers/custom_wizard/admin/custom_fields.rb +++ b/controllers/custom_wizard/admin/custom_fields.rb @@ -26,6 +26,7 @@ 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 96c21ebb..3009bf12 100644 --- a/lib/custom_wizard/custom_field.rb +++ b/lib/custom_wizard/custom_field.rb @@ -79,4 +79,32 @@ class ::CustomWizard::CustomField self.new(data) 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] + 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 bf840879..1510983b 100644 --- a/plugin.rb +++ b/plugin.rb @@ -163,26 +163,7 @@ after_initialize do CustomWizard::Wizard.register_styles - CustomWizard::CustomField.list.each do |field| - self.send("register_#{field.klass}_custom_field_type", field.name, field.type.to_sym) - - add_to_class(field.klass.to_sym, field.name.to_sym) do - custom_fields[field.name] - end - - if field.serializers.any? - field.serializers.each do |klass| - klass = klass.to_sym - add_to_serializer(klass, field.name.to_sym) do - if klass == :topic_view - object.topic.send(field.name) - else - object.send(field.name) - end - end - end - end - end + CustomWizard::CustomField.register_fields DiscourseEvent.trigger(:custom_wizard_ready) end