additional_tags 1.0.0 → 1.0.1

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.yml +17 -0
  3. data/.github/workflows/brakeman.yml +9 -14
  4. data/.github/workflows/linters.yml +11 -14
  5. data/.github/workflows/tests.yml +18 -25
  6. data/.rubocop.yml +4 -2
  7. data/.slim-lint.yml +1 -0
  8. data/README.md +27 -24
  9. data/additional_tags.gemspec +2 -2
  10. data/app/controllers/additional_tags_controller.rb +3 -5
  11. data/app/helpers/additional_tags_helper.rb +16 -10
  12. data/app/helpers/additional_tags_wiki_helper.rb +45 -5
  13. data/app/views/additional_tags/settings/_general.html.slim +9 -13
  14. data/app/views/wiki/tag_index.html.slim +1 -1
  15. data/assets/javascripts/tags.js +15 -15
  16. data/assets/stylesheets/tags.css +3 -3
  17. data/config/locales/bg.yml +4 -4
  18. data/config/locales/cs.yml +4 -4
  19. data/config/locales/de.yml +4 -4
  20. data/config/locales/en.yml +4 -4
  21. data/config/locales/es.yml +4 -4
  22. data/config/locales/fr.yml +4 -4
  23. data/config/locales/it.yml +4 -4
  24. data/config/locales/ja.yml +4 -4
  25. data/config/locales/ko.yml +4 -4
  26. data/config/locales/pl.yml +4 -4
  27. data/config/locales/pt-BR.yml +4 -4
  28. data/config/locales/ru.yml +4 -4
  29. data/init.rb +3 -1
  30. data/lib/additional_tags.rb +11 -4
  31. data/lib/additional_tags/hooks.rb +12 -2
  32. data/lib/additional_tags/patches/agile_query_patch.rb +1 -1
  33. data/lib/additional_tags/patches/auto_completes_controller_patch.rb +1 -1
  34. data/lib/additional_tags/patches/time_entry_query_patch.rb +3 -2
  35. data/lib/additional_tags/patches/wiki_controller_patch.rb +3 -14
  36. data/lib/additional_tags/patches/wiki_page_patch.rb +22 -1
  37. data/lib/additional_tags/version.rb +1 -1
  38. metadata +7 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 743d2eba1f678392ca6d7197ef8ac31cc7b6ee05c183f7b74eba826510ecaf72
4
- data.tar.gz: '09edc2c9f4990f6437b299e3495cb925f1eaefa47011ea49289d3e509273a72f'
3
+ metadata.gz: 5f6573f962ff7b251ce5afae13e2659985887d486d320fcb99f4c99892fa8a52
4
+ data.tar.gz: a258bcf71c8c53b40a5b7bcec92e9b6ff8a7dde6070fe5cfdc3eac0adb3d2ccb
5
5
  SHA512:
6
- metadata.gz: edc36542d6caedfb732258d6431363954c44704f9ccafbb69d308ebd372e86824b90975f82fdbfb441f8b4c3c17833e020477dce1dd33a687054e527fbf9b5de
7
- data.tar.gz: fd341693f9dbe550a2587aa60220a95c20c1b1b2a2e0ecd34226abcabf15d084ca044063e93d8ac7280d9546d6c0b1626f7cd02954c83b8c415e2b779f65b78c
6
+ metadata.gz: 46e6f62fae40af6b03d6b09a2b237f4049ab4d54ce30289e1fa7a74b9ee7f57df586feb3cf695f4268a86478365fee580db550e9b044c84281fcb464e2fde321
7
+ data.tar.gz: 8b1c9a8b5873b2b993f27d80186e9c7e0a024e201aba3c0125f47331c6fda50d673cbb1f572c17b2aef1b613b687f6a66c86c17d9b325f8c20e9c2bd8e6bf103
data/.eslintrc.yml ADDED
@@ -0,0 +1,17 @@
1
+ env:
2
+ browser: true
3
+ jquery: true
4
+ extends: 'eslint:recommended'
5
+ rules:
6
+ indent:
7
+ - error
8
+ - 2
9
+ linebreak-style:
10
+ - error
11
+ - unix
12
+ quotes:
13
+ - error
14
+ - single
15
+ semi:
16
+ - error
17
+ - always
@@ -12,25 +12,20 @@ jobs:
12
12
 
13
13
  - name: Install package dependencies
14
14
  run: >
15
- sudo apt-get install --yes --quiet
16
- pandoc
15
+ sudo apt-get install --yes --quiet pandoc
17
16
 
18
- - name: Set up Ruby 2.6
19
- uses: actions/setup-ruby@v1
20
- with:
21
- ruby-version: 2.6.x
22
-
23
- - name: Set Gemfile
17
+ - name: Setup Gemfile
24
18
  run: |
25
- echo "source 'https://rubygems.org'" > Gemfile
26
- echo "group :test do" >> Gemfile
27
- echo " gem 'brakeman', require: false" >> Gemfile
28
- echo " gem 'pandoc-ruby', require: false" >> Gemfile
29
- echo "end">> Gemfile
19
+ cp test/support/gemfile.rb Gemfile
20
+
21
+ - name: Setup Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: 2.6
25
+ bundler-cache: true
30
26
 
31
27
  - name: Setup gems
32
28
  run: |
33
- gem install bundler
34
29
  bundle install --jobs 4 --retry 3
35
30
 
36
31
  - name: Run Brakeman
@@ -10,25 +10,22 @@ jobs:
10
10
  steps:
11
11
  - uses: actions/checkout@v1
12
12
 
13
- - name: Set up Ruby 2.6
14
- uses: actions/setup-ruby@v1
15
- with:
16
- ruby-version: 2.6.x
13
+ - name: Install package dependencies
14
+ run: >
15
+ sudo apt-get install --yes --quiet pandoc
17
16
 
18
- - name: Set Gemfile
17
+ - name: Setup Gemfile
19
18
  run: |
20
- echo "source 'https://rubygems.org'" > Gemfile
21
- echo "group :test do" >> Gemfile
22
- echo " gem 'pandoc-ruby', require: false" >> Gemfile
23
- echo " gem 'rubocop', require: false" >> Gemfile
24
- echo " gem 'rubocop-performance', require: false" >> Gemfile
25
- echo " gem 'rubocop-rails', require: false" >> Gemfile
26
- echo " gem 'slim_lint', require: false" >> Gemfile
27
- echo "end" >> Gemfile
19
+ cp test/support/gemfile.rb Gemfile
20
+
21
+ - name: Setup Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: 2.6
25
+ bundler-cache: true
28
26
 
29
27
  - name: Setup gems
30
28
  run: |
31
- gem install bundler
32
29
  bundle install --jobs 4 --retry 3
33
30
 
34
31
  - name: Run RuboCop
@@ -10,9 +10,12 @@ jobs:
10
10
 
11
11
  strategy:
12
12
  matrix:
13
- ruby: ['2.6', '2.4']
14
- redmine: ['4.1-stable', 'master']
13
+ ruby: ['2.7', '2.6', '2.5']
14
+ redmine: ['4.1-stable', '4.2-stable', 'master']
15
15
  db: ['postgres', 'mysql']
16
+ exclude:
17
+ - ruby: '2.7'
18
+ redmine: 4.1-stable
16
19
  fail-fast: false
17
20
 
18
21
  services:
@@ -32,13 +35,12 @@ jobs:
32
35
  --health-retries 5
33
36
 
34
37
  mysql:
35
- image: mysql:5.7
38
+ image: mysql:8.0
36
39
  env:
37
- MYSQL_USER: root
38
- MYSQL_PASSWORD: ''
39
- MYSQL_ALLOW_EMPTY_PASSWORD: yes
40
+ MYSQL_ROOT_PASSWORD: 'BestPasswordEver'
40
41
  ports:
41
- - 3306:3306
42
+ # will assign a random free host port
43
+ - 3306/tcp
42
44
  options: >-
43
45
  --health-cmd="mysqladmin ping"
44
46
  --health-interval=10s
@@ -48,7 +50,7 @@ jobs:
48
50
  steps:
49
51
  - name: Verify MySQL connection from host
50
52
  run: |
51
- mysql --host 127.0.0.1 --port 3306 -uroot -e "SHOW DATABASES"
53
+ mysql --host 127.0.0.1 --port ${{ job.services.mysql.ports[3306] }} -uroot -pBestPasswordEver -e "SHOW DATABASES"
52
54
  if: matrix.db == 'mysql'
53
55
 
54
56
  - name: Checkout Redmine
@@ -82,37 +84,27 @@ jobs:
82
84
  libmysqlclient-dev
83
85
 
84
86
  - name: Setup Ruby
85
- uses: actions/setup-ruby@v1
87
+ uses: ruby/setup-ruby@v1
86
88
  with:
87
89
  ruby-version: ${{ matrix.ruby }}
88
-
89
- - name: Setup Cache
90
- uses: actions/cache@v1
91
- with:
92
- path: vendor
93
- key: v1-ruby-${{ matrix.ruby }}-redmine-${{ matrix.redmine }}
94
-
95
- - name: Setup Bundler
96
- run: |
97
- gem install bundler -v '~> 1.0'
98
- bundle config path "$(pwd)/vendor/bundle"
90
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
99
91
 
100
92
  - name: Prepare Redmine source
101
93
  working-directory: redmine
102
94
  run: |
103
- sed -i '/rubocop/d' Gemfile
104
- rm -f .rubocop*
105
95
  cp plugins/additional_tags/test/support/database-${{ matrix.db }}.yml config/database.yml
106
96
  cp plugins/additional_tags/test/support/configuration.yml config/configuration.yml
107
97
 
108
98
  - name: Install Ruby dependencies
109
99
  working-directory: redmine
110
100
  run: |
111
- bundle install --jobs=4 --retry=3 --without development
101
+ bundle config set --local without 'development'
102
+ bundle install --jobs=4 --retry=3
112
103
 
113
104
  - name: Generate session store secret
114
105
  env:
115
106
  RAILS_ENV: test
107
+ MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
116
108
  working-directory: redmine
117
109
  run: |
118
110
  bundle exec rake generate_secret_token
@@ -120,6 +112,7 @@ jobs:
120
112
  - name: Run Redmine DB and migration tasks
121
113
  env:
122
114
  RAILS_ENV: test
115
+ MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
123
116
  working-directory: redmine
124
117
  run: |
125
118
  bundle exec rake db:create db:migrate redmine:plugins:migrate
@@ -127,13 +120,13 @@ jobs:
127
120
  - name: Run tests
128
121
  env:
129
122
  RAILS_ENV: test
130
- REDMINE_VERSION: ${{ matrix.redmine }}
123
+ MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
131
124
  working-directory: redmine
132
125
  run: bundle exec rake redmine:plugins:test NAME=additional_tags RUBYOPT="-W0"
133
126
 
134
127
  - name: Run uninstall test
135
128
  env:
136
129
  RAILS_ENV: test
137
- REDMINE_VERSION: ${{ matrix.redmine }}
130
+ MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
138
131
  working-directory: redmine
139
132
  run: bundle exec rake redmine:plugins:migrate NAME=additional_tags VERSION=0
data/.rubocop.yml CHANGED
@@ -6,7 +6,7 @@ Rails:
6
6
  Enabled: true
7
7
 
8
8
  AllCops:
9
- TargetRubyVersion: 2.4
9
+ TargetRubyVersion: 2.5
10
10
  TargetRailsVersion: 5.2
11
11
  NewCops: enable
12
12
 
@@ -72,4 +72,6 @@ Style/HashTransformValues:
72
72
  Enabled: false
73
73
 
74
74
  Naming/VariableNumber:
75
- Enabled: false
75
+ Enabled: true
76
+ Exclude:
77
+ - 'test/**/*'
data/.slim-lint.yml CHANGED
@@ -23,3 +23,4 @@ linters:
23
23
  - Style/IfUnlessModifier
24
24
  - Style/WhileUntilModifier
25
25
  - Style/Next
26
+ - Layout/SpaceBeforeBrackets
data/README.md CHANGED
@@ -30,33 +30,32 @@ Start using it, too. The example image shows the centralized tag management in t
30
30
 
31
31
  ![screenshot](https://raw.githubusercontent.com/AlphaNodes/additional_tags/master/doc/images/additional-tags-framework.png)
32
32
 
33
-
34
33
  ## Why another Tag plugin?
35
34
 
36
- 1. Main reason: a stable tag solution for a current Redmine version is needed - NOW
37
- 2. Other plugins are no longer maintained or not available on a public community plattform as github or gitlab
38
- 3. Redmine (core) does not support tags. A feature request for issue tags exists since 2008, see [#1448](https://www.redmine.org/issues/1448).
39
- 4. Lots of plugins are using its own tag implementation (redmine_knowledgebase, redmine_contacts, redmine_products, redmine_passwords, redmine_db, ....). A common functional base was required. This plugin closes this gap. It would be great, if other plugins would use ``additional_tags`` for it.
35
+ 1. Main reason: a stable tag solution for a current Redmine version is needed - NOW
36
+ 2. Other plugins are no longer maintained or not available on a public community plattform as github or gitlab
37
+ 3. Redmine (core) does not support tags. A feature request for issue tags exists since 2008, see [#1448](https://www.redmine.org/issues/1448).
38
+ 4. Lots of plugins are using its own tag implementation (redmine_knowledgebase, redmine_contacts, redmine_products, redmine_passwords, redmine_db, ....). A common functional base was required. This plugin closes this gap. It would be great, if other plugins would use ``additional_tags`` for it.
40
39
 
41
40
  ## Requirements
42
41
 
43
- - Redmine `>= 4.1.0`
44
- - Ruby `>= 2.4.10`
45
- - Redmine plugins: [additionals](https://www.redmine.org/plugins/additionals)
42
+ - Redmine `>= 4.1.0`
43
+ - Ruby `>= 2.5`
44
+ - Redmine plugins: [additionals](https://www.redmine.org/plugins/additionals)
46
45
 
47
46
  ## Installing
48
47
 
49
- Choose 1a OR 1b
48
+ ### 1. Get right plugin version
50
49
 
51
- 1a. Clone this repository into `redmine/plugins/additional_tags`.
50
+ To install stable version of additional_tags, use
52
51
 
53
52
  ```shell
54
- cd redmine/plugins
55
- git clone https://github.com/alphanodes/additionals.git
56
- git clone https://github.com/alphanodes/additional_tags.git
53
+ cd $REDMINE_ROOT
54
+ git clone -b stable https://www.github.com/alphanodes/additionals.git plugins/additionals
55
+ git clone -b 1.0.0 https://www.github.com/alphanodes/additional_tags.git plugins/additional_tags
57
56
  ```
58
57
 
59
- 1b. Add the gem to your Gemfile.local:
58
+ It is also possible to use stable version as a gem package as an alternative. If you want it, add this to your $REDMINE_ROOT/Gemfile.local:
60
59
 
61
60
  ```ruby
62
61
  gem 'additional_tags'
@@ -65,15 +64,22 @@ gem 'additional_tags'
65
64
  At the moment, additionals should be installed before using gem method. In later versions
66
65
  addtionals plugins is usable as gem, too.
67
66
 
68
- 2. Install dependencies and migrate database.
67
+ If you want to use the latest development version, use
68
+
69
+ ```shell
70
+ cd $REDMINE_ROOT
71
+ git clone https://github.com/alphanodes/additionals.git plugins/additionals
72
+ git clone https://github.com/alphanodes/additional_tags.git plugins/additional_tags
73
+ ```
74
+
75
+ ### 2. Install dependencies and migrate database.
69
76
 
70
77
  ```shell
71
78
  bundle install
72
79
  bundle exec rake redmine:plugins:migrate RAILS_ENV=production
73
80
  ```
74
81
 
75
- 3. Restart your Redmine web server.
76
-
82
+ ### 3. Restart your Redmine web server.
77
83
 
78
84
  ## Running tests
79
85
 
@@ -95,12 +101,11 @@ If you use [redmine_tags](https://github.com/ixti/redmine_tags) or [redmineup_ta
95
101
  ``additional_tags`` uses its own database tables, to prevent conflicts with other plugins (e.g. redmine_knowledgebase, redmine_contacts, etc)
96
102
  To migrate your data to ``additional_tags`` use the following steps (order is important):
97
103
 
98
- 1. Remove plugin directory of your old plugin, e.g plugin/redmine_tags
99
- 2. Install ``additional_tags`` as is descript above (this automatically migrate data to new tables)
104
+ 1. Remove plugin directory of your old plugin, e.g plugin/redmine_tags
105
+ 2. Install ``additional_tags`` as is descript above (this automatically migrate data to new tables)
100
106
 
101
107
  The old database tables are existing after these steps.
102
108
 
103
-
104
109
  ## Uninstall
105
110
 
106
111
  ```shell
@@ -109,18 +114,16 @@ bundle exec rake redmine:plugins:migrate NAME=additional_tags VERSION=0 RAILS_EN
109
114
  rm -rf plugins/additional_tags
110
115
  ```
111
116
 
112
-
113
117
  ## License
114
118
 
115
119
  This plugin is licensed under the terms of GNU/GPL v2.
116
120
  See LICENSE for details.
117
121
 
118
-
119
122
  ## Credits
120
123
 
121
124
  The source code is a (almost) rewrite of
122
125
 
123
- - [redmine_tags](https://github.com/ixti/redmine_tags)
124
- - [redmineup_tags](https://www.redmine.org/plugins/redmineup_tags)
126
+ - [redmine_tags](https://github.com/ixti/redmine_tags)
127
+ - [redmineup_tags](https://www.redmine.org/plugins/redmineup_tags)
125
128
 
126
129
  Special thanks to the original author and contributors for making this awesome hook for Redmine.
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.bindir = 'exe'
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
- spec.required_ruby_version = '>= 2.4'
22
+ spec.required_ruby_version = '>= 2.5'
23
23
 
24
- spec.add_runtime_dependency 'acts-as-taggable-on', '~> 6.0'
24
+ spec.add_runtime_dependency 'acts-as-taggable-on', '~> 7.0'
25
25
 
26
26
  spec.add_development_dependency 'bundler'
27
27
  spec.add_development_dependency 'rake'
@@ -10,11 +10,9 @@ class AdditionalTagsController < ApplicationController
10
10
 
11
11
  def destroy
12
12
  @tags.each do |tag|
13
- begin
14
- tag.reload.destroy
15
- rescue ::ActiveRecord::RecordNotFound
16
- Rails.logger.warn "Tag #{tag} could not be deleted"
17
- end
13
+ tag.reload.destroy
14
+ rescue ::ActiveRecord::RecordNotFound
15
+ Rails.logger.warn "Tag #{tag} could not be deleted"
18
16
  end
19
17
  redirect_back_or_default @tag_list_path
20
18
  end
@@ -104,9 +104,12 @@ module AdditionalTagsHelper
104
104
  options[:link],
105
105
  style: tag_style
106
106
  elsif options[:link_wiki_tag]
107
- link_to safe_join(tag_name),
108
- project_wiki_index_path(options[:project], tag: tag_object.name),
109
- style: tag_style
107
+ link = if options[:project].present?
108
+ project_wiki_index_path options[:project], tag: tag_object.name
109
+ else
110
+ wiki_path tag_object.name
111
+ end
112
+ link_to safe_join(tag_name), link, style: tag_style
110
113
  else
111
114
  link_to safe_join(tag_name),
112
115
  tag_url(tag_object.name, options),
@@ -146,19 +149,22 @@ module AdditionalTagsHelper
146
149
  s.join sep
147
150
  end
148
151
 
152
+ def additional_tag_sep(use_colors)
153
+ if use_colors.nil? || use_colors
154
+ ' '
155
+ else
156
+ ', '
157
+ end
158
+ end
159
+
149
160
  def additional_tag_links(tag_list, options = {})
150
161
  return if tag_list.blank?
151
162
 
152
- sep = if options[:use_colors].nil? || options[:use_colors]
153
- ' '
154
- else
155
- ', '
156
- end
157
-
158
163
  unsorted = options.delete(:unsorted)
159
164
  tag_list = AdditionalTags::Tags.sort_tag_list(tag_list) unless unsorted
160
165
 
161
- safe_join tag_list.map { |tag| additional_tag_link tag, options }, sep
166
+ safe_join tag_list.map { |tag| additional_tag_link tag, options },
167
+ additional_tag_sep(options[:use_colors])
162
168
  end
163
169
 
164
170
  private
@@ -8,10 +8,50 @@ module AdditionalTagsWikiHelper
8
8
  end
9
9
 
10
10
  def render_sidebar_tags
11
- render_tags_list sidebar_tags,
12
- show_count: AdditionalTags.setting?(:show_with_count),
13
- style: AdditionalTags.setting(:tags_sidebar).to_sym,
14
- link_wiki_tag: true,
15
- project: @project
11
+ options = { show_count: AdditionalTags.setting?(:show_with_count),
12
+ style: AdditionalTags.setting(:tags_sidebar).to_sym,
13
+ link_wiki_tag: true,
14
+ project: @project }
15
+
16
+ render_tags_list sidebar_tags, options
17
+ end
18
+
19
+ def render_wiki_index_title(project, tag = nil)
20
+ if tag.present?
21
+ if project.nil?
22
+ title = [link_to(l(:label_wiki), wiki_index_path)]
23
+ title << Additionals::LIST_SEPARATOR
24
+ title << t(:label_wiki_index_for_tag_html, tag: tag)
25
+ safe_join title, ' '
26
+ else
27
+ t :label_wiki_index_for_tag_html, tag: tag
28
+ end
29
+ else
30
+ l :label_wiki
31
+ end
32
+ end
33
+
34
+ def wiki_pages_with_tag(tag, project = nil)
35
+ wiki = project&.wiki
36
+
37
+ scope = if wiki
38
+ wiki.pages
39
+ else
40
+ WikiPage.joins(wiki: :project)
41
+ end
42
+
43
+ scope = scope.visible(User.current, project: project) if scope.respond_to? :visible
44
+
45
+ scope = scope.joins(AdditionalTags::Tags.tag_to_joins(WikiPage))
46
+ .where("LOWER(#{ActiveRecord::Base.connection.quote_table_name(ActsAsTaggableOn.tags_table)}.name) = LOWER(:p)",
47
+ p: tag.to_s.strip)
48
+ .with_updated_on
49
+ .joins(wiki: :project)
50
+
51
+ if wiki.nil?
52
+ scope.order "#{Project.table_name}.name, #{WikiPage.table_name}.title"
53
+ else
54
+ scope.includes(:parent).order "#{WikiPage.table_name}.title"
55
+ end
16
56
  end
17
57
  end
@@ -2,30 +2,26 @@ fieldset.settings
2
2
  legend = l :label_general
3
3
 
4
4
  p
5
- = label_tag 'settings[tags_sidebar]', l(:tags_sidebar)
6
- = select_tag 'settings[tags_sidebar]',
7
- options_for_select(%w[none list cloud simple_cloud].collect { |v| [l("tags_sidebar_#{v}"), v] },
8
- @settings[:tags_sidebar])
5
+ = additionals_settings_select :tags_sidebar,
6
+ options_for_select(%w[none list cloud simple_cloud].collect { |v| [l("tags_sidebar_#{v}"), v] },
7
+ @settings[:tags_sidebar])
9
8
 
10
9
  p
11
10
  = additionals_settings_checkbox :show_with_count
12
11
 
13
12
  p
14
- = label_tag 'settings[tags_sort_by]', l(:tags_sort_by)
15
- = select_tag 'settings[tags_sort_by]',
16
- options_for_select(%w[name count].collect { |v| [l("tags_sort_by_#{v}"), v] },
17
- @settings[:tags_sort_by])
13
+ = additionals_settings_select :tags_sort_by,
14
+ options_for_select(%w[name count].collect { |v| [l("tags_sort_by_#{v}"), v] },
15
+ @settings[:tags_sort_by])
18
16
  '
19
17
  = select_tag 'settings[tags_sort_order]',
20
18
  options_for_select([[l(:label_ascending), 'asc'], [l(:label_descending), 'desc']],
21
19
  @settings[:tags_sort_order])
22
20
 
23
21
  p
24
- = label_tag 'settings[tags_suggestion_order]', l(:tags_suggestion_order)
25
- = select_tag 'settings[tags_suggestion_order]',
26
- options_for_select(%w[name last_created count].collect { |v| [l("tags_order_by_#{v}"), v] },
27
- @settings['tags_suggestion_order'])
28
-
22
+ = additionals_settings_select :tags_suggestion_order,
23
+ options_for_select(%w[name last_created count].collect { |v| [l("tags_order_by_#{v}"), v] },
24
+ @settings['tags_suggestion_order'])
29
25
  p
30
26
  = additionals_settings_checkbox :use_colors
31
27
 
@@ -2,7 +2,7 @@
2
2
  - if User.current.allowed_to? :edit_wiki_pages, @project
3
3
  = link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project), remote: true, class: 'icon icon-add'
4
4
 
5
- h2 = l :label_wiki_index_for_tag, @tag
5
+ h2 = render_wiki_index_title @project, @tag
6
6
 
7
7
  - if @pages.empty?
8
8
  p.nodata = l :label_no_data
@@ -1,19 +1,19 @@
1
1
  $(function () {
2
- $('body').on('click', '.most_used_tags .most_used_tag', function (e) {
3
- var $tagsSelect = $('select#issue_tag_list');
4
- var tag = e.target.innerText;
5
- if ($tagsSelect.find("option[value='" + tag + "']").length === 0) {
6
- var newOption = new Option(tag, tag, true, true);
7
- $tagsSelect.append(newOption).trigger("change");
8
- }
2
+ $('body').on('click', '.most_used_tags .most_used_tag', function (e) {
3
+ var $tagsSelect = $('select#issue_tag_list');
4
+ var tag = e.target.innerText;
5
+ if ($tagsSelect.find('option[value=\'' + tag + '\']').length === 0) {
6
+ var newOption = new Option(tag, tag, true, true);
7
+ $tagsSelect.append(newOption).trigger('change');
8
+ }
9
9
 
10
- mostUsedTags = $.grep(mostUsedTags, function(t) { return t != tag; });
11
- var tagsHtml = mostUsedTags.map(function(tag) {
12
- return '<span class="most_used_tag">' + tag + '</span>';
13
- }).join(', ');
10
+ var mostUsedTags = $.grep(mostUsedTags, function(t) { return t != tag; });
11
+ var tagsHtml = mostUsedTags.map(function(tag) {
12
+ return '<span class="most_used_tag">' + tag + '</span>';
13
+ }).join(', ');
14
14
 
15
- var $mostUsedTagsContainer = $(e.target).parent('.most_used_tags');
16
- $mostUsedTagsContainer.empty();
17
- $mostUsedTagsContainer.append(tagsHtml);
18
- });
15
+ var $mostUsedTagsContainer = $(e.target).parent('.most_used_tags');
16
+ $mostUsedTagsContainer.empty();
17
+ $mostUsedTagsContainer.append(tagsHtml);
18
+ });
19
19
  });
@@ -1,6 +1,6 @@
1
1
  /* stylelint-disable font-family-no-missing-generic-family-keyword */
2
2
 
3
- #admin-menu a.tags::before {
3
+ #admin-menu a.additional-tags::before {
4
4
  font-family: Font Awesome\ 5 Free;
5
5
  font-size: 1.2em;
6
6
  font-weight: 900;
@@ -8,12 +8,12 @@
8
8
  padding-right: 4px;
9
9
  }
10
10
 
11
- #admin-menu a.tags {
11
+ #admin-menu a.additional-tags {
12
12
  padding-left: 0;
13
13
  }
14
14
 
15
15
  /* Mobile menu style FontAwesome icon */
16
- .flyout-is-active #admin-menu li a.tags {
16
+ .flyout-is-active #admin-menu li a.additional-tags {
17
17
  padding-left: 8px !important;
18
18
  }
19
19
 
@@ -12,7 +12,7 @@ bg:
12
12
  label_show_with_count: "Показване на брой маркирани обекти"
13
13
  label_tags_tag: "Маркер"
14
14
  label_use_colors: "Използване на цветове"
15
- label_wiki_index_for_tag: "Wiki страници с маркер %{value}"
15
+ label_wiki_index_for_tag_html: "Wiki страници с маркер <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Добавянето на маркери е неуспешно"
17
17
  notice_tags_added: "Маркерите са добавени"
18
18
  permission_add_wiki_tags: "Добавяне на маркери за wiki страници"
@@ -26,8 +26,8 @@ bg:
26
26
  tags_sidebar_list: "Списък"
27
27
  tags_sidebar_none: "Не"
28
28
  tags_sidebar_simple_cloud: "Обикновен облак"
29
- tags_sidebar: "Показване на маркерите в страничния панел"
29
+ label_tags_sidebar: "Показване на маркерите в страничния панел"
30
30
  tags_sort_by_count: "брой обекти"
31
31
  tags_sort_by_name: "Име"
32
- tags_sort_by: "Сортиране на маркерите по"
33
- tags_suggestion_order: "Ред на предлагане"
32
+ label_tags_sort_by: "Сортиране на маркерите по"
33
+ label_tags_suggestion_order: "Ред на предлагане"
@@ -12,7 +12,7 @@ cs:
12
12
  label_show_with_count: "Zobrazit částku na značce"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Použijte barvy"
15
- label_wiki_index_for_tag: "Wiki stránky se značkou %{value}"
15
+ label_wiki_index_for_tag_html: "Wiki stránky se značkou <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Přidání značek se nezdařilo"
17
17
  notice_tags_added: "Přidány značky"
18
18
  permission_add_wiki_tags: "Přidejte značky wiki"
@@ -26,8 +26,8 @@ cs:
26
26
  tags_sidebar_list: "Seznam"
27
27
  tags_sidebar_none: "Žádný"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "Zobrazit značky na postranním panelu jako"
29
+ label_tags_sidebar: "Zobrazit značky na postranním panelu jako"
30
30
  tags_sort_by_count: "Počet"
31
31
  tags_sort_by_name: "Název"
32
- tags_sort_by: "Řazení značek podle"
33
- tags_suggestion_order: "Objednávka návrhu"
32
+ label_tags_sort_by: "Řazení značek podle"
33
+ label_tags_suggestion_order: "Objednávka návrhu"
@@ -12,7 +12,7 @@ de:
12
12
  label_show_with_count: Zeige Anzahl zu TAG
13
13
  label_tags_tag: TAG
14
14
  label_use_colors: Farben verwenden
15
- label_wiki_index_for_tag: Wiki Seiten mit TAG %{value}
15
+ label_wiki_index_for_tag_html: Wiki Seiten mit TAG <em>%{tag}</em>
16
16
  notice_failed_to_add_tags: Fehler beim hinzufügen der TAGs
17
17
  notice_tags_added: Tags hinzugefügt
18
18
  permission_add_wiki_tags: Wiki TAGs hinzufügen
@@ -26,8 +26,8 @@ de:
26
26
  tags_sidebar_list: Liste
27
27
  tags_sidebar_none: Keine
28
28
  tags_sidebar_simple_cloud: Einfache Cloud
29
- tags_sidebar: Zeige TAGs in der Sidebar
29
+ label_tags_sidebar: Zeige TAGs in der Sidebar
30
30
  tags_sort_by_count: Anzahl
31
31
  tags_sort_by_name: Name
32
- tags_sort_by: Sortiere TAGs nach
33
- tags_suggestion_order: Reihenfolge der Vorschläge
32
+ label_tags_sort_by: Sortiere TAGs nach
33
+ label_tags_suggestion_order: Reihenfolge der Vorschläge
@@ -12,7 +12,7 @@ en:
12
12
  label_show_with_count: "Display amount on tag"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Use colors"
15
- label_wiki_index_for_tag: "Wiki pages with tag %{value}"
15
+ label_wiki_index_for_tag_html: "Wiki pages with tag <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Failed to add tags"
17
17
  notice_tags_added: "Tags added"
18
18
  permission_add_wiki_tags: "Add wiki tags"
@@ -26,8 +26,8 @@ en:
26
26
  tags_sidebar_list: "List"
27
27
  tags_sidebar_none: "None"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "Display tags on sidebar as"
29
+ label_tags_sidebar: "Display tags on sidebar as"
30
30
  tags_sort_by_count: "Count"
31
31
  tags_sort_by_name: "Name"
32
- tags_sort_by: "Sort tags by"
33
- tags_suggestion_order: "Suggestion order"
32
+ label_tags_sort_by: "Sort tags by"
33
+ label_tags_suggestion_order: "Suggestion order"
@@ -12,7 +12,7 @@ es:
12
12
  label_show_with_count: "Mostrar la cantidad en la tags"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Usar los colores"
15
- label_wiki_index_for_tag: "Páginas Wiki con la tags %{value}"
15
+ label_wiki_index_for_tag_html: "Páginas Wiki con la tags <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "No se han añadido tags"
17
17
  notice_tags_added: "Tags añadidas"
18
18
  permission_add_wiki_tags: "Añadir tags wiki"
@@ -26,8 +26,8 @@ es:
26
26
  tags_sidebar_list: "Lista"
27
27
  tags_sidebar_none: "Ninguno"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "Mostrar las tags en la barra lateral como"
29
+ label_tags_sidebar: "Mostrar las tags en la barra lateral como"
30
30
  tags_sort_by_count: "Cuenta"
31
31
  tags_sort_by_name: "Nombre"
32
- tags_sort_by: "Ordenar las tags por"
33
- tags_suggestion_order: "Orden de sugerencia"
32
+ label_tags_sort_by: "Ordenar las tags por"
33
+ label_tags_suggestion_order: "Orden de sugerencia"
@@ -12,7 +12,7 @@ fr:
12
12
  label_show_with_count: "Afficher le montant sur l'tags"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Utiliser les couleurs"
15
- label_wiki_index_for_tag: "Pages wiki avec la tags %{value}"
15
+ label_wiki_index_for_tag_html: "Pages wiki avec la tags <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Omission d'ajouter des tags"
17
17
  notice_tags_added: "Tags ajoutés"
18
18
  permission_add_wiki_tags: "Ajouter des tags wiki"
@@ -26,8 +26,8 @@ fr:
26
26
  tags_sidebar_list: "Liste"
27
27
  tags_sidebar_none: "Aucune"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "Afficher les tags sur la barre latérale comme"
29
+ label_tags_sidebar: "Afficher les tags sur la barre latérale comme"
30
30
  tags_sort_by_count: "Compter"
31
31
  tags_sort_by_name: "Nom"
32
- tags_sort_by: "Trier les balises par"
33
- tags_suggestion_order: "Ordre de suggestion"
32
+ label_tags_sort_by: "Trier les balises par"
33
+ label_tags_suggestion_order: "Ordre de suggestion"
@@ -12,7 +12,7 @@ it:
12
12
  label_show_with_count: "Visualizzare l'importo sul tag"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Utilizzare i colori"
15
- label_wiki_index_for_tag: "Pagine Wiki con tag %{value}"
15
+ label_wiki_index_for_tag_html: "Pagine Wiki con tag <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Non è stato possibile aggiungere tag"
17
17
  notice_tags_added: "Tag aggiunti"
18
18
  permission_add_wiki_tags: "Aggiungi tag wiki"
@@ -26,8 +26,8 @@ it:
26
26
  tags_sidebar_list: "Elenco"
27
27
  tags_sidebar_none: "Nessuno"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "Visualizzare i tag sulla barra laterale come"
29
+ label_tags_sidebar: "Visualizzare i tag sulla barra laterale come"
30
30
  tags_sort_by_count: "Contate"
31
31
  tags_sort_by_name: "Nome"
32
- tags_sort_by: "Ordina i tag per"
33
- tags_suggestion_order: "Ordine di suggerimento"
32
+ label_tags_sort_by: "Ordina i tag per"
33
+ label_tags_suggestion_order: "Ordine di suggerimento"
@@ -12,7 +12,7 @@ ja:
12
12
  label_show_with_count: "タグに金額を表示"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "色を使う"
15
- label_wiki_index_for_tag: "タグが付いているウィキのページ %{value}"
15
+ label_wiki_index_for_tag_html: "タグが付いているウィキのページ <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "タグの追加に失敗"
17
17
  notice_tags_added: "追加されたタグ"
18
18
  permission_add_wiki_tags: "wikiタグの追加"
@@ -26,8 +26,8 @@ ja:
26
26
  tags_sidebar_list: "リスト"
27
27
  tags_sidebar_none: "なし"
28
28
  tags_sidebar_simple_cloud: "シンプルなクラウド"
29
- tags_sidebar: "サイドバーにタグを"
29
+ label_tags_sidebar: "サイドバーにタグを"
30
30
  tags_sort_by_count: "伯爵"
31
31
  tags_sort_by_name: "名前"
32
- tags_sort_by: "タグを並べ替える"
33
- tags_suggestion_order: "ご提案の順番"
32
+ label_tags_sort_by: "タグを並べ替える"
33
+ label_tags_suggestion_order: "ご提案の順番"
@@ -12,7 +12,7 @@ ko:
12
12
  label_show_with_count: "태그에 금액 표시"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "색상 사용"
15
- label_wiki_index_for_tag: "태그가있는 위키 페이지 %{value}"
15
+ label_wiki_index_for_tag_html: "태그가있는 위키 페이지 <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "태그를 추가하지 못했습니다."
17
17
  notice_tags_added: "추가 된 태그"
18
18
  permission_add_wiki_tags: "위키 태그 추가"
@@ -26,8 +26,8 @@ ko:
26
26
  tags_sidebar_list: "명부"
27
27
  tags_sidebar_none: "없음"
28
28
  tags_sidebar_simple_cloud: "단순 클라우드"
29
- tags_sidebar: "사이드 바에 태그 표시"
29
+ label_tags_sidebar: "사이드 바에 태그 표시"
30
30
  tags_sort_by_count: "카운트"
31
31
  tags_sort_by_name: "이름"
32
- tags_sort_by: "태그 정렬 기준"
33
- tags_suggestion_order: "제안 순서"
32
+ label_tags_sort_by: "태그 정렬 기준"
33
+ label_tags_suggestion_order: "제안 순서"
@@ -12,7 +12,7 @@ pl:
12
12
  label_show_with_count: "Wyświetlanie ilości na etykiecie"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Używaj kolorów"
15
- label_wiki_index_for_tag: "Strony Wiki z tagiem %{value}"
15
+ label_wiki_index_for_tag_html: "Strony Wiki z tagiem <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Nie dodano znaczników"
17
17
  notice_tags_added: "Tagi dodane"
18
18
  permission_add_wiki_tags: "Dodaj znaczniki wiki"
@@ -26,8 +26,8 @@ pl:
26
26
  tags_sidebar_list: "Lista"
27
27
  tags_sidebar_none: "Brak"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "Wyświetlać znaczniki na pasku bocznym jako"
29
+ label_tags_sidebar: "Wyświetlać znaczniki na pasku bocznym jako"
30
30
  tags_sort_by_count: "Hrabia"
31
31
  tags_sort_by_name: "Nazwa"
32
- tags_sort_by: "Sortuj znaczniki według"
33
- tags_suggestion_order: "Zamówienie ofertowe"
32
+ label_tags_sort_by: "Sortuj znaczniki według"
33
+ label_tags_suggestion_order: "Zamówienie ofertowe"
@@ -12,7 +12,7 @@ pt-BR:
12
12
  label_show_with_count: "Mostrar quantidade na etiqueta"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Usar cores"
15
- label_wiki_index_for_tag: "Páginas Wiki com tag %{value}"
15
+ label_wiki_index_for_tag_html: "Páginas Wiki com tag <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Falha em adicionar tags"
17
17
  notice_tags_added: "Tags adicionadas"
18
18
  permission_add_wiki_tags: "Adicionar etiquetas wiki"
@@ -26,8 +26,8 @@ pt-BR:
26
26
  tags_sidebar_list: "Lista"
27
27
  tags_sidebar_none: "Nenhum"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "Mostrar etiquetas na barra lateral como"
29
+ label_tags_sidebar: "Mostrar etiquetas na barra lateral como"
30
30
  tags_sort_by_count: "Conde"
31
31
  tags_sort_by_name: "Nome"
32
- tags_sort_by: "Ordenar tags por"
33
- tags_suggestion_order: "Pedido de sugestão"
32
+ label_tags_sort_by: "Ordenar tags por"
33
+ label_tags_suggestion_order: "Pedido de sugestão"
@@ -12,7 +12,7 @@ ru:
12
12
  label_show_with_count: "Отображаемое количество на теге"
13
13
  label_tags_tag: "Tag"
14
14
  label_use_colors: "Использовать цвета"
15
- label_wiki_index_for_tag: "Вики-страницы с тегом %{value}"
15
+ label_wiki_index_for_tag_html: "Вики-страницы с тегом <em>%{tag}</em>"
16
16
  notice_failed_to_add_tags: "Не удалось добавить теги"
17
17
  notice_tags_added: "Теги добавлены"
18
18
  permission_add_wiki_tags: "Добавить вики-теги"
@@ -26,8 +26,8 @@ ru:
26
26
  tags_sidebar_list: "Список"
27
27
  tags_sidebar_none: "Нет"
28
28
  tags_sidebar_simple_cloud: "Simple cloud"
29
- tags_sidebar: "DОтображать теги на боковой панели как"
29
+ label_tags_sidebar: "DОтображать теги на боковой панели как"
30
30
  tags_sort_by_count: "Посчитать"
31
31
  tags_sort_by_name: "Имя"
32
- tags_sort_by: "Сортировать метки по"
33
- tags_suggestion_order: "Порядок предложения"
32
+ label_tags_sort_by: "Сортировать метки по"
33
+ label_tags_suggestion_order: "Порядок предложения"
data/init.rb CHANGED
@@ -23,7 +23,9 @@ Redmine::Plugin.register :additional_tags do
23
23
  end
24
24
 
25
25
  menu :admin_menu,
26
- :tags, { controller: 'settings', action: 'plugin', id: 'additional_tags' }, caption: :field_tags
26
+ :additional_tags,
27
+ { controller: 'settings', action: 'plugin', id: 'additional_tags' },
28
+ caption: :field_tags
27
29
  end
28
30
 
29
31
  Rails.configuration.to_prepare do
@@ -69,10 +69,17 @@ module AdditionalTags
69
69
  setting(:tags_sidebar).present? && setting(:tags_sidebar) != 'none'
70
70
  end
71
71
 
72
- def sql_for_tags_field(klass, operator, value)
73
- compare = operator.eql?('=') ? 'IN' : 'NOT IN'
74
- ids_list = klass.tagged_with(value).map(&:id).push(0).join(',')
75
- "(#{klass.table_name}.id #{compare} (#{ids_list})) "
72
+ def sql_for_tags_field(klass, operator, values)
73
+ compare = ['=', '*'].include?(operator) ? 'IN' : 'NOT IN'
74
+
75
+ case operator
76
+ when '=', '!'
77
+ ids_list = klass.tagged_with(values, any: true).pluck :id
78
+ "(#{klass.table_name}.id #{compare} (#{ids_list.join ','}))" if ids_list.present?
79
+ else
80
+ entries = ActsAsTaggableOn::Tagging.where taggable_type: klass.name
81
+ "(#{klass.table_name}.id #{compare} (#{entries.select(:taggable_id).to_sql}))"
82
+ end
76
83
  end
77
84
 
78
85
  private
@@ -13,14 +13,18 @@ module AdditionalTags
13
13
  render_on :view_reports_issue_report_split_content_right, partial: 'tags_simple'
14
14
  render_on :view_wiki_form_bottom, partial: 'tags_form_bottom'
15
15
  render_on :view_wiki_show_bottom, partial: 'tags_show'
16
- render_on :view_wiki_show_sidebar_bottom, partial: 'tags_sidebar'
16
+ render_on :view_wiki_show_sidebar_bottom, partial: 'wiki/tags_sidebar'
17
17
 
18
18
  def controller_issues_edit_before_save(context = {})
19
19
  tags_journal context[:issue], context[:params]
20
20
  end
21
21
 
22
22
  def controller_issues_bulk_edit_before_save(context = {})
23
- tags_journal context[:issue], context[:params]
23
+ issue = context[:issue]
24
+ params = context[:params]
25
+
26
+ issues_bulk_tags_fix issue, params
27
+ tags_journal issue, params
24
28
  end
25
29
 
26
30
  # this hook is missing in redmine core at the moment
@@ -53,6 +57,12 @@ module AdditionalTags
53
57
 
54
58
  private
55
59
 
60
+ def issues_bulk_tags_fix(issue, params)
61
+ old_tags = issue.tags.map(&:name)
62
+ new_tags = Array(params[:issue][:tag_list]).reject(&:empty?)
63
+ issue.tag_list = (old_tags + new_tags).uniq
64
+ end
65
+
56
66
  def tags_journal(issue, params)
57
67
  return unless params && params[:issue] && params[:issue][:tag_list]
58
68
 
@@ -17,7 +17,7 @@ module AdditionalTags
17
17
  def sql_for_tags_field(_field, operator, value)
18
18
  case operator
19
19
  when '=', '!'
20
- issues = Issue.tagged_with(value.clone)
20
+ issues = Issue.tagged_with(value.clone, any: true)
21
21
  when '!*'
22
22
  issues = Issue.joins(:tags).uniq
23
23
  else
@@ -22,7 +22,7 @@ module AdditionalTags
22
22
 
23
23
  def wiki_tags
24
24
  @name = params[:q].to_s
25
- @tags = WikiPage.available_tags project: @project, name_like: @name
25
+ @tags = WikiPage.available_tags project: nil, name_like: @name
26
26
  render layout: false, partial: 'additional_tag_list', locals: { unsorted: true }
27
27
  end
28
28
 
@@ -22,7 +22,7 @@ module AdditionalTags
22
22
  return unless AdditionalTags.setting?(:active_issue_tags) && User.current.allowed_to?(:view_issue_tags, project, global: true)
23
23
 
24
24
  add_available_filter 'issue.tags',
25
- type: :list,
25
+ type: :list_optional,
26
26
  name: l('label_attribute_of_issue', name: l(:field_tags)),
27
27
  values: -> { available_issue_tags_values }
28
28
  end
@@ -45,7 +45,8 @@ module AdditionalTags
45
45
 
46
46
  def available_issue_tags_values
47
47
  Issue.available_tags(project: project)
48
- .map { |c| [c.name, c.name] }
48
+ .pluck(:name)
49
+ .map { |name| [name, name] }
49
50
  end
50
51
  end
51
52
  end
@@ -8,6 +8,8 @@ module AdditionalTags
8
8
  helper :additional_tags
9
9
  helper :additional_tags_wiki
10
10
 
11
+ include AdditionalTagsWikiHelper
12
+
11
13
  before_action :find_page_for_update_tags, only: :update_tags
12
14
  end
13
15
 
@@ -27,7 +29,7 @@ module AdditionalTags
27
29
  @tag = params[:tag]
28
30
  return super unless AdditionalTags.setting?(:active_wiki_tags) && @tag.present?
29
31
 
30
- load_pages_for_index_with_tag
32
+ @pages = wiki_pages_with_tag @tag, @project
31
33
 
32
34
  respond_to do |format|
33
35
  format.html do
@@ -39,19 +41,6 @@ module AdditionalTags
39
41
 
40
42
  private
41
43
 
42
- def load_pages_for_index_with_tag
43
- pattern = "%#{@tag.to_s.strip}%"
44
- @pages = @wiki.pages
45
- .joins(AdditionalTags::Tags.tag_to_joins(WikiPage))
46
- .where("LOWER(#{ActiveRecord::Base.connection.quote_table_name(ActsAsTaggableOn.tags_table)}.name) LIKE LOWER(:p)",
47
- p: pattern)
48
- .with_updated_on
49
- .distinct
50
- .reorder("#{WikiPage.table_name}.title")
51
- .includes(wiki: :project)
52
- .includes(:parent).to_a
53
- end
54
-
55
44
  # find_existing_page can not be used from wiki_controller, because it would be disable index only rule
56
45
  def find_page_for_update_tags
57
46
  @page = @wiki.find_page params[:id]
@@ -8,7 +8,9 @@ module AdditionalTags
8
8
 
9
9
  acts_as_ordered_taggable
10
10
 
11
- safe_attributes 'tag_list'
11
+ alias_method :safe_attributes_without_tags=, :safe_attributes=
12
+ alias_method :safe_attributes=, :safe_attributes_with_tags=
13
+
12
14
  before_save :sort_tag_list
13
15
  end
14
16
 
@@ -26,6 +28,25 @@ module AdditionalTags
26
28
  end
27
29
 
28
30
  module InstanceMethods
31
+ def safe_attributes_with_tags=(attrs, user = User.current)
32
+ if !attrs.is_a?(Array) && attrs && attrs[:tag_list]
33
+ tags = attrs[:tag_list]
34
+ tags = Array(tags).reject(&:empty?)
35
+
36
+ # only assign it, if changed
37
+ if tags == tag_list ||
38
+ !AdditionalTags.setting?(:active_wiki_tags) ||
39
+ !user.allowed_to?(:add_wiki_tags, project)
40
+ attrs.delete :tag_list
41
+ else
42
+ attrs[:tag_list] = tags
43
+ self.tag_list = tags
44
+ end
45
+ end
46
+
47
+ send 'safe_attributes_without_tags=', attrs, user
48
+ end
49
+
29
50
  private
30
51
 
31
52
  def sort_tag_list
@@ -1,3 +1,3 @@
1
1
  module AdditionalTags
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.0.1'.freeze unless defined? VERSION
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: additional_tags
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - AlphaNodes
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-25 00:00:00.000000000 Z
11
+ date: 2021-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts-as-taggable-on
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '6.0'
19
+ version: '7.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '6.0'
26
+ version: '7.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +59,7 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".eslintrc.yml"
62
63
  - ".github/workflows/brakeman.yml"
63
64
  - ".github/workflows/linters.yml"
64
65
  - ".github/workflows/tests.yml"
@@ -163,14 +164,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
163
164
  requirements:
164
165
  - - ">="
165
166
  - !ruby/object:Gem::Version
166
- version: '2.4'
167
+ version: '2.5'
167
168
  required_rubygems_version: !ruby/object:Gem::Requirement
168
169
  requirements:
169
170
  - - ">="
170
171
  - !ruby/object:Gem::Version
171
172
  version: '0'
172
173
  requirements: []
173
- rubygems_version: 3.0.3
174
+ rubygems_version: 3.1.6
174
175
  signing_key:
175
176
  specification_version: 4
176
177
  summary: Redmine plugin for adding tag functionality