Custom Plugin -> IssueHelper Extension -> Methods not found

Added by Christoph Kitzler 5 months ago

Hi!
I have writte a plugin to hide custom fields in Issues with a collapse checkbox. Since upgrade to Redmine 4.1.1 i get a method not found error :(

plugins init.rb:

require 'redmine'
require 'redmine_mp2'
Redmine::Plugin.register :redmine_mp2 do
  name 'Redmine MP2 Plugin'
  author 'MP2'
  description 'Changes for MP2 Dev Team'
  version '1.0.0'

  # required redmine version
  requires_redmine version_or_higher: '3.2.0'

  # add setting
  default_settings = {
    darkmode: 0
  }

  settings(default: default_settings, partial: 'settings/mp2settings')
end

class RedmineMP2Helper

    class << self

        def plugin
          Redmine::Plugin.find(:redmine_mp2)
        end

        # Get plugin setting value or it's default value in a safe way.
        # If the setting key is not found, returns nil.
        # If the plugin has not been registered yet, returns nil.
        def get_setting(name)
          begin
            if plugin
              if Setting["plugin_#{plugin.id}"]
                Setting["plugin_#{plugin.id}"][name]
              else
                if plugin.settings[:default].has_key?(name)
                  plugin.settings[:default][name]
                end
              end
            end
          rescue

            # We don't care about exceptions which can actually occur ie. when running
            # migrations and settings table has not yet been created.
            nil
          end
        end
    end
end

file "plugins/redmine_mp2/lib/redmine_mp2/redmine_mp2.rb"

if ActiveRecord::Base.connection.table_exists?(:settings)
    Rails.configuration.to_prepare do
        # Patches
        require_dependency 'redmine_mp2/patches/issue_patch'
        require_dependency 'redmine_mp2/patches/projects_controller_patch'
                require 'redmine_mp2/patches/issue_helper_patch'
                require 'redmine_mp2/patches/mail_handler_patch'
    end
end

file "plugins/redmine_mp2/lib/redmine_mp2/patches/issue_helper_patch.rb"

module RedmineMP2
    module Patches
        module IssuesHelperPatch
            def self.included(base)
                base.send(:include, InstanceMethods)
            end

            # Instance methods
            module InstanceMethods
                class IssueFieldsRowsMP2
                    include ActionView::Helpers::TagHelper

                    def initialize
                      @left = []
                      @right = []
                    end

                    def left(*args)
                      args.any? ? @left << cells(*args) : @left
                    end

                    def right(*args)
                      args.any? ? @right << cells(*args) : @right
                    end

                    def size
                      @left.size > @right.size ? @left.size : @right.size
                    end

                    def to_html
                      content =
                        content_tag('div', @left.reduce(&:+), :class => 'splitcontentleft') +
                        content_tag('div',
                            content_tag('a', 'Zusätzliche Informationen', :id => 'hideAttributes', :href => '#hideAttributes', :class => 'hideExpanded') +
                            content_tag('a', 'Zusätzliche Informationen', :id => 'showAttributes', :href => '#showAttributes', :class => 'showCollapsed') +
                            content_tag('div', @right.reduce(&:+), :class => 'detailsCollapsed'),
                        :class => 'splitcontentright')

                      content_tag('div', content, :class => 'splitcontent')
                    end

                    def cells(label, text, options={})
                      options[:class] = [options[:class] || "", 'attribute'].join(' ')
                      content_tag 'div',
                        content_tag('div', label + ":", :class => 'label') + content_tag('div', text, :class => 'value'),
                        options
                    end
                end

                def issue_fields_rows_mp2
                r = IssueFieldsRowsMP2.new
                yield r
                r.to_html
                end

                def render_half_width_custom_fields_rows_mp2(issue, rows)
                    values = issue.visible_custom_field_values.reject {|value| value.custom_field.full_width_layout?}
                    return if values.empty?
                    values.each_with_index do |value, i|
                        css = "cf_#{value.custom_field.id} collapsed" 
                        rows.right custom_field_name_tag(value.custom_field), show_value(value), :class => css
                    end
                end
            end        
        end
    end
end

unless IssuesHelper.included_modules.include? RedmineMP2::Patches::IssuesHelperPatch
  IssuesHelper.send(:prepend, RedmineMP2::Patches::IssuesHelperPatch)
end

I cloned the issues view (show.html.erb) and changed the method call from


...
<div class="attributes">
<%= issue_fields_rows do |rows|
  rows.left l(:field_status), @issue.status.name, :class => 'status'
  rows.left l(:field_priority), @issue.priority.name, :class => 'priority'
...

to


...
<div class="attributes">
<%= issue_fields_rows_mp2 do |rows|
  rows.left l(:field_status), @issue.status.name, :class => 'status'
  rows.left l(:field_priority), @issue.priority.name, :class => 'priority'
...

ActionView::Template::Error (undefined method `issue_fields_rows_mp2' for #<#<Class:0x0000000011074390>:0x000000000fd03c98>
Did you mean? issue_fields_rows):

and got a method not found error in redmine log. Can anybody tell me what i am doing wrong here?