redmineup 1.1.3 → 1.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitlab-ci.yml +7 -17
  4. data/README.md +74 -153
  5. data/app/assets/javascripts/consumer.js +37 -60
  6. data/app/assets/javascripts/consumer_worker.js +199 -0
  7. data/app/assets/javascripts/jquery.colorPicker.min.js +26 -0
  8. data/app/assets/javascripts/select2_helpers.js +10 -0
  9. data/app/assets/stylesheets/redmineup.css +509 -0
  10. data/app/views/redmineup/_additional_assets.html.erb +1 -0
  11. data/config/locales/en.yml +1 -0
  12. data/config/locales/ru.yml +1 -0
  13. data/config/routes.rb +4 -0
  14. data/doc/CHANGELOG +72 -25
  15. data/doc/active-record-mixins.md +156 -0
  16. data/doc/assets-money-and-utilities.md +71 -0
  17. data/doc/tagging-and-select2.md +108 -0
  18. data/lib/action_cable/connection/rup_connection.rb +17 -0
  19. data/lib/action_cable/server/rup_server.rb +4 -0
  20. data/lib/redmineup/acts_as_taggable/tag.rb +13 -3
  21. data/lib/redmineup/acts_as_taggable/up_acts_as_taggable.rb +9 -6
  22. data/lib/redmineup/acts_as_viewed/up_acts_as_viewed.rb +1 -1
  23. data/lib/redmineup/engine.rb +12 -2
  24. data/lib/redmineup/helpers/datetime_helper.rb +23 -0
  25. data/lib/redmineup/helpers/external_assets_helper.rb +14 -6
  26. data/lib/redmineup/helpers/form_tag_helper.rb +43 -0
  27. data/lib/redmineup/helpers/tags_helper.rb +41 -0
  28. data/lib/redmineup/hooks/views_layouts_hook.rb +1 -5
  29. data/lib/redmineup/money_helper.rb +10 -2
  30. data/lib/redmineup/patches/action_cable_base_patch.rb +9 -2
  31. data/lib/redmineup/patches/action_cable_patch.rb +2 -4
  32. data/lib/redmineup/patches/auto_completes_controller_patch.rb +19 -0
  33. data/lib/redmineup/patches/compatibility/sprite_patch.rb +1 -1
  34. data/lib/redmineup/patches/compatibility/user_patch.rb +3 -3
  35. data/lib/redmineup/version.rb +1 -1
  36. data/lib/redmineup.rb +16 -35
  37. data/test/acts_as_taggable/tag_test.rb +12 -9
  38. data/test/schema.rb +1 -1
  39. data/test/tags_helper_view_test.rb +41 -0
  40. data/test/test_helper.rb +2 -1
  41. metadata +14 -2
@@ -18,6 +18,7 @@ module Redmineup
18
18
  # * <tt>:allow_clear</tt> Provides support for clearable selections. Default value false.
19
19
  # * <tt>:min_input_length</tt> Minimum number of characters required to start a search. Default value 0.
20
20
  # * <tt>:format_state</tt> Defines template of search results in the drop-down.
21
+ # * <tt>:on_select</tt> Global JS callback name bound to `select2:select` event.
21
22
  # * <tt>:tags</tt> Used to enable tagging feature.
22
23
  #
23
24
  # <b>Note:</b> The HTML specification says when +multiple+ parameter passed to select and all options got deselected
@@ -49,6 +50,31 @@ module Redmineup
49
50
 
50
51
  alias select2 select2_tag
51
52
 
53
+ # Renders a select2 tag field for a tag list (standalone, no form object).
54
+ # Analogous to text_field_tag.
55
+ #
56
+ # ==== Example
57
+ # tag_list_field_tag 'entry[tag_list]', entry.tag_list,
58
+ # url: auto_complete_taggable_tags_path(taggable_type: 'DriveEntry')
59
+ def tag_list_field_tag(name, value = [], options = {})
60
+ url = options.delete(:url)
61
+ taggable_type = options.delete(:taggable_type)
62
+ width = options.delete(:width)
63
+ project_id = options.delete(:project_id)
64
+ placeholder = options.delete(:placeholder)
65
+ select2_tag(
66
+ name,
67
+ options_for_select(value, value),
68
+ {
69
+ multiple: true,
70
+ width: width || '95%',
71
+ url: url || auto_complete_taggable_tags_path(taggable_type: taggable_type, project_id: project_id),
72
+ placeholder: placeholder || l(:lable_redmineup_add_tag),
73
+ tags: true
74
+ }.merge(options)
75
+ )
76
+ end
77
+
52
78
  # Transforms select filters of +type+ fields into select2
53
79
  #
54
80
  # ==== Examples
@@ -86,3 +112,20 @@ module Redmineup
86
112
 
87
113
  end
88
114
  end
115
+
116
+ # Extends Rails FormBuilder with tag_list_field, analogous to f.text_field.
117
+ #
118
+ # ==== Example
119
+ # <%= f.tag_list_field :tag_list %>
120
+ ActionView::Helpers::FormBuilder.class_eval do
121
+ def tag_list_field(method, **options)
122
+ url = options.fetch(:url) {
123
+ @template.auto_complete_taggable_tags_path(taggable_type: @object.class.name)
124
+ }
125
+ @template.tag_list_field_tag(
126
+ "#{@object_name}[#{method}]",
127
+ @object.public_send(method),
128
+ {url: url}.merge(options.except(:url))
129
+ )
130
+ end
131
+ end
@@ -9,5 +9,46 @@ module Redmineup
9
9
  yield tag, classes[index]
10
10
  end
11
11
  end
12
+
13
+ def tag_link(url, tag_name, options = {})
14
+ count = options.delete(:count)
15
+ inner = link_to(tag_name, url, options)
16
+ inner << content_tag('span', "(#{count})", class: 'tag-count') if count
17
+ css = monochrome? ? 'tag-label' : 'tag-label-color'
18
+ style = monochrome? ? {} : { style: "background-color: #{Redmineup::ActsAsTaggable::Tag.color_from_name(tag_name)}" }
19
+ content_tag(:span, inner, { class: css }.merge(style))
20
+ end
21
+
22
+ def tag_separator
23
+ monochrome? ? ', ' : ' '
24
+ end
25
+
26
+ def monochrome?
27
+ @monochrome ||= defined?(RedmineupTags) && !RedmineupTags.use_colors?
28
+ end
29
+
30
+ def tag_links(tag_list, options = {}, &url_block)
31
+ return if tag_list.blank?
32
+ content_tag(:span, class: 'tag_list') do
33
+ safe_join(tag_list.map { |tag| tag_link(url_block.call(tag), tag, options.dup) }, tag_separator)
34
+ end
35
+ end
36
+
37
+ # Renders span.tag_list from an array of tag objects (respond to .name and .count).
38
+ # Resolves URL via `{key}_tag_url(name)` in the current view context.
39
+ #
40
+ # tag_cloud_links(contact.available_tags, :contact) # → contact_tag_url(name)
41
+ # tag_cloud_links(tags_cloud, :people) # → people_tag_url(name)
42
+ def tag_cloud_links(tags, key, options = {})
43
+ return if tags.blank?
44
+ url_method = :"#{key}_tag_url"
45
+ raise NoMethodError, "#{url_method} is not defined in view context" unless respond_to?(url_method, true)
46
+ content_tag(:span, class: 'tag_list') do
47
+ safe_join(tags.map { |tag|
48
+ tag_link(send(url_method, tag.name), tag.name, options.merge(count: tag.count).dup)
49
+ }, tag_separator)
50
+ end
51
+ end
52
+
12
53
  end
13
54
  end
@@ -3,11 +3,7 @@
3
3
  module Redmineup
4
4
  module Hooks
5
5
  class ViewsLayoutsHook < Redmine::Hook::ViewListener
6
- def view_layouts_base_html_head(_context = {})
7
- stylesheet_link_tag(:calendars, plugin: 'redmineup') +
8
- stylesheet_link_tag(:money, plugin: 'redmineup') +
9
- javascript_include_tag(:consumer, plugin: 'redmineup')
10
- end
6
+ render_on :view_layouts_base_html_head, partial: 'redmineup/additional_assets'
11
7
  end
12
8
  end
13
9
  end
@@ -8,11 +8,19 @@ module Redmineup
8
8
  price_to_currency(obj.try(price_field), obj.currency, options).to_s if obj.respond_to?(:currency)
9
9
  end
10
10
 
11
- def prices_collection_by_currency(prices_collection, options = {})
11
+ def prices_formatted_collection(prices_collection, options = {})
12
12
  return [] if prices_collection.blank? || prices_collection == 0
13
13
  prices = prices_collection
14
14
  prices.reject!{|k, v| v.to_i == 0} if options[:hide_zeros]
15
- prices.collect{|k, v| content_tag(:span, price_to_currency(v, k, :symbol => true), :style => "white-space: nowrap;")}.compact
15
+ prices.map { |k, v| price_to_currency(v, k, symbol: true) }.compact
16
+ end
17
+
18
+ def prices_collection_by_currency(prices_collection, options = {})
19
+ formatted_prices = prices_formatted_collection(prices_collection, options)
20
+
21
+ formatted_prices.map do |formatted_price|
22
+ content_tag(:span, formatted_price, :style => "white-space: nowrap;")
23
+ end
16
24
  end
17
25
 
18
26
  def deal_currency_icon(currency)
@@ -7,8 +7,15 @@ module Redmineup
7
7
  end
8
8
 
9
9
  module ClassMethods
10
- def rup_broadcast_to(klass, model, message)
11
- ActionCable.rup_server(klass).broadcast(broadcasting_for(model), message)
10
+ def rup_broadcast_to(*args)
11
+ # TODO: Remove to 2 args after plugins update
12
+ if args.length == 3
13
+ klass, model, message = args
14
+ ActionCable.rup_server(klass).broadcast(broadcasting_for(model), message)
15
+ else
16
+ model, message = args
17
+ ActionCable.rup_server.broadcast(broadcasting_for(model), message)
18
+ end
12
19
  end
13
20
  end
14
21
  end
@@ -1,10 +1,9 @@
1
1
  module Redmineup
2
2
  module Patches
3
3
  module ActionCablePatch
4
-
5
4
  def self.included(base)
6
5
  base.class_eval do
7
- module_function def rup_server(klass = nil)
6
+ module_function def rup_server(klass = 'ActionCable::Connection::RupConnection')
8
7
  @rup_servers ||= {}
9
8
  return @rup_servers[klass] if @rup_servers[klass]
10
9
 
@@ -14,10 +13,9 @@ module Redmineup
14
13
  end
15
14
  end
16
15
  end
17
-
18
16
  end
19
17
  end
20
18
 
21
19
  unless ActionCable.included_modules.include?(Redmineup::Patches::ActionCablePatch)
22
- ActionCable.send(:include, Redmineup::Patches::ActionCablePatch)
20
+ ActionCable.include Redmineup::Patches::ActionCablePatch
23
21
  end
@@ -0,0 +1,19 @@
1
+ module Redmineup
2
+ module Patches
3
+ module AutoCompletesControllerPatch
4
+ DEFAULT_TAGS_LIMIT = 10
5
+
6
+ def taggable_tags
7
+ limit = params.delete(:limit) || DEFAULT_TAGS_LIMIT
8
+ klass = Object.const_get(params[:taggable_type].camelcase) if params[:taggable_type].present?
9
+
10
+ tags = klass && klass.available_tags(params.merge(limit: limit, name_like: params[:q])) || Redmineup::ActsAsTaggable::Tag.limit(limit)
11
+ render json: tags.map { |tag| { id: tag.name, text: tag.name } }
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ unless AutoCompletesController.included_modules.include?(Redmineup::Patches::AutoCompletesControllerPatch)
18
+ AutoCompletesController.include(Redmineup::Patches::AutoCompletesControllerPatch)
19
+ end
@@ -4,7 +4,7 @@ module Redmineup
4
4
  module SpritePatch
5
5
  def self.included(base)
6
6
  base.class_eval do
7
- def sprite_icon(icon_name, label = nil, icon_only: false, size: '18', css_class: nil, sprite: "icons", plugin: nil, rtl: false)
7
+ def sprite_icon(icon_name, label = '', icon_only: false, size: '18', css_class: nil, sprite: "icons", plugin: nil, rtl: false)
8
8
  label
9
9
  end
10
10
  end
@@ -16,6 +16,6 @@ module Redmineup
16
16
  end
17
17
  end
18
18
 
19
- unless ActionDispatch::Routing::Mapper.included_modules.include?(Redmineup::Patches::Compatibility::UserPatch)
20
- ActionDispatch::Routing::Mapper.send(:include, Redmineup::Patches::Compatibility::UserPatch)
21
- end
19
+ unless User.included_modules.include?(Redmineup::Patches::Compatibility::UserPatch)
20
+ User.send(:include, Redmineup::Patches::Compatibility::UserPatch)
21
+ end
@@ -1,3 +1,3 @@
1
1
  module Redmineup
2
- VERSION = '1.1.3'
2
+ VERSION = '1.1.11'
3
3
  end
data/lib/redmineup.rb CHANGED
@@ -44,6 +44,7 @@ require 'redmineup/liquid/drops/custom_field_enumeration_drop'
44
44
  require 'redmineup/helpers/external_assets_helper'
45
45
  require 'redmineup/helpers/form_tag_helper'
46
46
  require 'redmineup/helpers/calendars_helper'
47
+ require 'redmineup/helpers/datetime_helper'
47
48
  require 'redmineup/assets_manager'
48
49
 
49
50
  require 'redmineup/patches/liquid_patch'
@@ -65,6 +66,7 @@ require 'application_record' if !defined?(ApplicationRecord) && Rails.version <
65
66
  if Redmineup.cable_available?
66
67
  require 'action_cable/server/rup_configuration'
67
68
  require 'action_cable/server/rup_server'
69
+ require 'action_cable/connection/rup_connection'
68
70
  require 'redmineup/patches/action_cable_base_patch'
69
71
  require 'redmineup/patches/action_cable_patch'
70
72
  end
@@ -106,47 +108,26 @@ if defined?(ActionView::Base)
106
108
  ActionView::Base.send :include, Redmineup::CalendarsHelper
107
109
  ActionView::Base.send :include, Redmineup::ExternalAssetsHelper
108
110
  ActionView::Base.send :include, Redmineup::FormTagHelper
111
+ ActionView::Base.send :include, Redmineup::TagsHelper
109
112
  end
110
113
 
111
114
  def requires_redmineup(arg)
112
- def compare_versions(requirement, current)
113
- raise ArgumentError.new('wrong version format') unless check_version_format(requirement)
114
-
115
- requirement = requirement.split('.').collect(&:to_i)
116
- requirement <=> current.slice(0, requirement.size)
117
- end
115
+ arg = { version_or_higher: arg } unless arg.is_a?(Hash)
116
+ arg.assert_valid_keys(:version_or_higher)
118
117
 
119
- def check_version_format(version)
120
- version =~ /^\d+.?\d*.?\d*$/m
118
+ requirement = arg[:version_or_higher]
119
+ unless requirement.is_a?(String)
120
+ raise ArgumentError, ':version_or_higher accepts a version string only'
121
121
  end
122
122
 
123
- arg = { version_or_higher: arg } unless arg.is_a?(Hash)
124
- arg.assert_valid_keys(:version, :version_or_higher)
123
+ current = Gem::Version.new(Redmineup::VERSION)
124
+ required = Gem::Version.new(requirement)
125
125
 
126
- current = Redmineup::VERSION.split('.').map { |x| x.to_i }
127
- arg.each do |k, req|
128
- case k
129
- when :version_or_higher
130
- raise ArgumentError.new(':version_or_higher accepts a version string only') unless req.is_a?(String)
126
+ return true if required <= current
131
127
 
132
- unless compare_versions(req, current) <= 0
133
- Rails.logger.error "\033[31m[ERROR]\033[0m Redmine requires redmineup gem version #{req} or higher (you're using #{Redmineup::VERSION}).\n\033[31m[ERROR]\033[0m Please update with 'bundle update redmineup'." if Rails.logger
134
- abort "\033[31mRedmine requires redmineup gem version #{req} or higher (you're using #{Redmineup::VERSION}).\nPlease update with 'bundle update redmineup'.\033[0m"
135
- end
136
- when :version
137
- req = [req] if req.is_a?(String)
138
- if req.is_a?(Array)
139
- unless req.detect { |ver| compare_versions(ver, current) == 0 }
140
- abort "\033[31mRedmine requires redmineup gem version #{req} (you're using #{Redmineup::VERSION}).\nPlease update with 'bundle update redmineup'.\033[0m"
141
- end
142
- elsif req.is_a?(Range)
143
- unless compare_versions(req.first, current) <= 0 && compare_versions(req.last, current) >= 0
144
- abort "\033[31mRedmine requires redmineup gem version between #{req.first} and #{req.last} (you're using #{Redmineup::VERSION}).\nPlease update with 'bundle update redmineup'.\033[0m"
145
- end
146
- else
147
- raise ArgumentError.new(':version option accepts a version string, an array or a range of versions')
148
- end
149
- end
150
- end
151
- true
128
+ message = "Redmine requires redmineup gem version #{requirement} or higher " \
129
+ "(you're using #{Redmineup::VERSION}).\n" \
130
+ "Please update with 'bundle update redmineup --conservative'."
131
+ Rails.logger&.error("\033[31m[ERROR]\033[0m #{message}")
132
+ abort "\033[31m#{message}\033[0m"
152
133
  end
@@ -34,16 +34,19 @@ class TagTest < ActiveSupport::TestCase
34
34
  end
35
35
 
36
36
  def test_color
37
- colors = %w(#aaaaaa #bbbbbb)
38
- colorized = [tags(:bug), tags(:feature)]
39
- colorized.each do |tag|
40
- assert_equal colors.include?(tag.color), true
41
- end
37
+ assert_equal '#aaaaaa', tags(:feature).color # 11184810 = 0xaaaaaa
38
+ assert_equal '#bbbbbb', tags(:bug).color # 12303291 = 0xbbbbbb
39
+ # no DB color — falls back to color_from_name, not nil
40
+ assert_equal Redmineup::ActsAsTaggable::Tag.color_from_name('error'), tags(:error).color
41
+ assert_equal Redmineup::ActsAsTaggable::Tag.color_from_name('question'), tags(:question).color
42
+ end
42
43
 
43
- not_colorized = [tags(:error), tags(:question)]
44
- not_colorized.each do |tag|
45
- assert_nil tag.color
46
- end
44
+ def test_color_from_name
45
+ color = Redmineup::ActsAsTaggable::Tag.color_from_name('error')
46
+ assert_match(/\A#[0-9a-f]{6}\z/, color)
47
+ assert_equal color, Redmineup::ActsAsTaggable::Tag.color_from_name('error') # deterministic
48
+ assert_not_equal color, Redmineup::ActsAsTaggable::Tag.color_from_name('other')
49
+ assert_match(/\A#[0-9a-f]{6}\z/, Redmineup::ActsAsTaggable::Tag.color_from_name(nil))
47
50
  end
48
51
 
49
52
  def test_tag_is_equal_to_itself
data/test/schema.rb CHANGED
@@ -150,7 +150,7 @@ ActiveRecord::Schema.define version: 0 do
150
150
  t.column :viewer_id, :integer
151
151
  t.column :viewed_id, :integer
152
152
  t.column :viewed_type, :string
153
- t.column :ip, :string, limit: '24'
153
+ t.column :ip, :string, limit: '45'
154
154
  t.column :created_at, :datetime
155
155
  end
156
156
  end
@@ -0,0 +1,41 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class TagsHelperViewTest < ActionView::TestCase
4
+ include Redmineup::TagsHelper
5
+ include Redmineup::FormTagHelper
6
+
7
+ def stub_tag_url(name)
8
+ "/stub_tags/#{name}" # URL stub for tag_cloud_links(tags, :stub)
9
+ end
10
+
11
+ def test_tag_link
12
+ result = tag_link('/tags/error', 'error', count: 3)
13
+ assert_includes result, 'tag-label-color'
14
+ assert_includes result, 'background-color: #'
15
+ assert_includes result, '(3)'
16
+ end
17
+
18
+ def test_tag_links
19
+ result = tag_links(['error', 'bug']) { |t| "/tags/#{t}" }
20
+ assert_includes result, 'class="tag_list"'
21
+ assert_nil tag_links([]) { |t| "/tags/#{t}" }
22
+ end
23
+
24
+ def test_tag_cloud_links
25
+ result = tag_cloud_links(Issue.tag_counts, :stub)
26
+ assert_includes result, 'class="tag_list"'
27
+ assert_includes result, '/stub_tags/'
28
+ assert_nil tag_cloud_links([], :stub)
29
+ assert_raises(NoMethodError) { tag_cloud_links(Issue.tag_counts, :unknown_xyz) }
30
+ end
31
+
32
+ def test_tag_list_field_tag
33
+ result = tag_list_field_tag('issue[tag_list]', ['bug'],
34
+ url: '/auto_completes/taggable_tags',
35
+ width: '60%', tags: false,
36
+ placeholder: '+ add tag')
37
+ assert_includes result, 'name="issue[tag_list][]"'
38
+ assert_includes result, '"width":"60%"'
39
+ assert_includes result, '"tags":false'
40
+ end
41
+ end
data/test/test_helper.rb CHANGED
@@ -13,7 +13,8 @@ Dir.glob(File.expand_path('models/*.rb', __dir__)).each { |f| require f }
13
13
  class ActiveSupport::TestCase # :nodoc:
14
14
  include ActiveRecord::TestFixtures
15
15
 
16
- self.fixture_path = File.dirname(__FILE__) + '/fixtures/'
16
+ gem_fixtures_path = File.dirname(__FILE__) + '/fixtures/'
17
+ respond_to?(:fixture_paths=) ? self.fixture_paths = [gem_fixtures_path] : self.fixture_path = gem_fixtures_path
17
18
 
18
19
  self.use_transactional_tests = true if RUBY_VERSION > '1.9.3'
19
20
  self.use_instantiated_fixtures = false
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmineup
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - RedmineUP
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-10 00:00:00.000000000 Z
11
+ date: 2026-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -119,12 +119,16 @@ files:
119
119
  - app/assets/javascripts/Chart.bundle.min.js.bak
120
120
  - app/assets/javascripts/chart.min.js
121
121
  - app/assets/javascripts/consumer.js
122
+ - app/assets/javascripts/consumer_worker.js
123
+ - app/assets/javascripts/jquery.colorPicker.min.js
122
124
  - app/assets/javascripts/select2.js
123
125
  - app/assets/javascripts/select2_helpers.js
124
126
  - app/assets/stylesheets/calendars.css
125
127
  - app/assets/stylesheets/money.css
128
+ - app/assets/stylesheets/redmineup.css
126
129
  - app/assets/stylesheets/select2.css
127
130
  - app/controllers/redmineup_controller.rb
131
+ - app/views/redmineup/_additional_assets.html.erb
128
132
  - app/views/redmineup/_money.html.erb
129
133
  - app/views/redmineup/settings.html.erb
130
134
  - config/currency_iso.json
@@ -136,6 +140,10 @@ files:
136
140
  - config/routes.rb
137
141
  - doc/CHANGELOG
138
142
  - doc/LICENSE.txt
143
+ - doc/active-record-mixins.md
144
+ - doc/assets-money-and-utilities.md
145
+ - doc/tagging-and-select2.md
146
+ - lib/action_cable/connection/rup_connection.rb
139
147
  - lib/action_cable/server/rup_configuration.rb
140
148
  - lib/action_cable/server/rup_server.rb
141
149
  - lib/application_record.rb
@@ -162,6 +170,7 @@ files:
162
170
  - lib/redmineup/currency/loader.rb
163
171
  - lib/redmineup/engine.rb
164
172
  - lib/redmineup/helpers/calendars_helper.rb
173
+ - lib/redmineup/helpers/datetime_helper.rb
165
174
  - lib/redmineup/helpers/external_assets_helper.rb
166
175
  - lib/redmineup/helpers/form_tag_helper.rb
167
176
  - lib/redmineup/helpers/tags_helper.rb
@@ -183,6 +192,7 @@ files:
183
192
  - lib/redmineup/money_helper.rb
184
193
  - lib/redmineup/patches/action_cable_base_patch.rb
185
194
  - lib/redmineup/patches/action_cable_patch.rb
195
+ - lib/redmineup/patches/auto_completes_controller_patch.rb
186
196
  - lib/redmineup/patches/compatibility/application_controller_patch.rb
187
197
  - lib/redmineup/patches/compatibility/routing_mapper_patch.rb
188
198
  - lib/redmineup/patches/compatibility/sprite_patch.rb
@@ -238,6 +248,7 @@ files:
238
248
  - test/money_helper_test.rb
239
249
  - test/schema.rb
240
250
  - test/tags_helper_test.rb
251
+ - test/tags_helper_view_test.rb
241
252
  - test/test_helper.rb
242
253
  - test/vote_helper_test.rb
243
254
  homepage: https://www.redmineup.com
@@ -309,5 +320,6 @@ test_files:
309
320
  - test/money_helper_test.rb
310
321
  - test/schema.rb
311
322
  - test/tags_helper_test.rb
323
+ - test/tags_helper_view_test.rb
312
324
  - test/test_helper.rb
313
325
  - test/vote_helper_test.rb