diff --git a/README.md b/README.md index 7d8c8be..7ba041a 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,27 @@ Once installed and the server is restarted, there is no configuration needed. Si --- +### Developer API: Registering Custom Fields + +If you have built your own Redmine plugins that add custom columns to the issues database table, you can register those fields to be automatically copied when a subtask is created. +In your custom plugin's init.rb, append your field names (as symbols) to the SubtaskFieldCopier.registered_fields array. +It is best practice to wrap this in a Rails.configuration.to_prepare block and check if the module is defined, ensuring your plugin won't crash if the Subtask Field Copier is uninstalled: + +```Ruby +Rails.configuration.to_prepare do + if defined?(SubtaskFieldCopier) + # Register your custom issue fields here + SubtaskFieldCopier.registered_fields << :vehicle + SubtaskFieldCopier.registered_fields << :customer + + # Ensure there are no duplicates (useful for development hot-reloading) + SubtaskFieldCopier.registered_fields.uniq! + end +end +``` + +--- + ## License > The MIT License (MIT) diff --git a/lib/subtask_field_copier.rb b/lib/subtask_field_copier.rb index 7d621a9..a433ce1 100644 --- a/lib/subtask_field_copier.rb +++ b/lib/subtask_field_copier.rb @@ -10,6 +10,9 @@ module SubtaskFieldCopier + mattr_accessor :registered_fields + self.registered_fields = [] + def self.setup unless IssuesController.ancestors.include?(SubtaskFieldCopier::Patches::IssuesControllerPatch) IssuesController.prepend SubtaskFieldCopier::Patches::IssuesControllerPatch diff --git a/lib/subtask_field_copier/patches/issues_controller_patch.rb b/lib/subtask_field_copier/patches/issues_controller_patch.rb index d8505e5..58e04b8 100644 --- a/lib/subtask_field_copier/patches/issues_controller_patch.rb +++ b/lib/subtask_field_copier/patches/issues_controller_patch.rb @@ -28,17 +28,15 @@ module SubtaskFieldCopier end @issue.custom_field_values = cf_values - # --- COPY CUSTOMER, VEHICLE & ESTIMATE--- - if @issue.respond_to?(:customer=) && parent_issue.respond_to?(:customer) - @issue.customer = parent_issue.customer - end - - if @issue.respond_to?(:vehicle=) && parent_issue.respond_to?(:vehicle) - @issue.vehicle = parent_issue.vehicle - end - - if @issue.respond_to?(:estimate=) && parent_issue.respond_to?(:estimate) - @issue.estimate = parent_issue.estimate + # --- COPY REGISTERED FIELDS --- + # Iterate over any fields registered by other plugins + SubtaskFieldCopier.registered_fields.each do |field| + setter = "#{field}=" + + # Use metaprogramming to check if the setter/getter exists, then apply + if @issue.respond_to?(setter) && parent_issue.respond_to?(field) + @issue.send(setter, parent_issue.send(field)) + end end end end