Compare commits

...
2 Commits
Author SHA1 Message Date
ricky 31ca01d6cf 2026.8.1 2026-08-26 21:18:39 -04:00
ricky 7772526c8d Add support for registering custom fields in Subtask Field Copier 2026-08-26 21:18:29 -04:00
4 changed files with 32 additions and 10 deletions

No files matched your search

+21
View File
@@ -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 ## License
> The MIT License (MIT) > The MIT License (MIT)
+1 -1
View File
@@ -11,7 +11,7 @@ Redmine::Plugin.register :subtask_field_copier do
name 'Redmine subtask field copier' name 'Redmine subtask field copier'
author 'Rick Barrette' author 'Rick Barrette'
description 'Copies Issue attributes to subtasks' description 'Copies Issue attributes to subtasks'
version '2026.8.0' version '2026.8.1'
url 'https://github.com/rickbarrette/subtask_field_copier' url 'https://github.com/rickbarrette/subtask_field_copier'
author_url 'https://github.com/rickbarrette' author_url 'https://github.com/rickbarrette'
+3
View File
@@ -10,6 +10,9 @@
module SubtaskFieldCopier module SubtaskFieldCopier
mattr_accessor :registered_fields
self.registered_fields = []
def self.setup def self.setup
unless IssuesController.ancestors.include?(SubtaskFieldCopier::Patches::IssuesControllerPatch) unless IssuesController.ancestors.include?(SubtaskFieldCopier::Patches::IssuesControllerPatch)
IssuesController.prepend SubtaskFieldCopier::Patches::IssuesControllerPatch IssuesController.prepend SubtaskFieldCopier::Patches::IssuesControllerPatch
@@ -28,17 +28,15 @@ module SubtaskFieldCopier
end end
@issue.custom_field_values = cf_values @issue.custom_field_values = cf_values
# --- COPY CUSTOMER, VEHICLE & ESTIMATE--- # --- COPY REGISTERED FIELDS ---
if @issue.respond_to?(:customer=) && parent_issue.respond_to?(:customer) # Iterate over any fields registered by other plugins
@issue.customer = parent_issue.customer SubtaskFieldCopier.registered_fields.each do |field|
end setter = "#{field}="
if @issue.respond_to?(:vehicle=) && parent_issue.respond_to?(:vehicle) # Use metaprogramming to check if the setter/getter exists, then apply
@issue.vehicle = parent_issue.vehicle if @issue.respond_to?(setter) && parent_issue.respond_to?(field)
@issue.send(setter, parent_issue.send(field))
end end
if @issue.respond_to?(:estimate=) && parent_issue.respond_to?(:estimate)
@issue.estimate = parent_issue.estimate
end end
end end
end end