additional_tags 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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