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.
- checksums.yaml +4 -4
- data/.eslintrc.yml +17 -0
- data/.github/workflows/brakeman.yml +9 -14
- data/.github/workflows/linters.yml +11 -14
- data/.github/workflows/tests.yml +18 -25
- data/.rubocop.yml +4 -2
- data/.slim-lint.yml +1 -0
- data/README.md +27 -24
- data/additional_tags.gemspec +2 -2
- data/app/controllers/additional_tags_controller.rb +3 -5
- data/app/helpers/additional_tags_helper.rb +16 -10
- data/app/helpers/additional_tags_wiki_helper.rb +45 -5
- data/app/views/additional_tags/settings/_general.html.slim +9 -13
- data/app/views/wiki/tag_index.html.slim +1 -1
- data/assets/javascripts/tags.js +15 -15
- data/assets/stylesheets/tags.css +3 -3
- data/config/locales/bg.yml +4 -4
- data/config/locales/cs.yml +4 -4
- data/config/locales/de.yml +4 -4
- data/config/locales/en.yml +4 -4
- data/config/locales/es.yml +4 -4
- data/config/locales/fr.yml +4 -4
- data/config/locales/it.yml +4 -4
- data/config/locales/ja.yml +4 -4
- data/config/locales/ko.yml +4 -4
- data/config/locales/pl.yml +4 -4
- data/config/locales/pt-BR.yml +4 -4
- data/config/locales/ru.yml +4 -4
- data/init.rb +3 -1
- data/lib/additional_tags.rb +11 -4
- data/lib/additional_tags/hooks.rb +12 -2
- data/lib/additional_tags/patches/agile_query_patch.rb +1 -1
- data/lib/additional_tags/patches/auto_completes_controller_patch.rb +1 -1
- data/lib/additional_tags/patches/time_entry_query_patch.rb +3 -2
- data/lib/additional_tags/patches/wiki_controller_patch.rb +3 -14
- data/lib/additional_tags/patches/wiki_page_patch.rb +22 -1
- data/lib/additional_tags/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f6573f962ff7b251ce5afae13e2659985887d486d320fcb99f4c99892fa8a52
|
4
|
+
data.tar.gz: a258bcf71c8c53b40a5b7bcec92e9b6ff8a7dde6070fe5cfdc3eac0adb3d2ccb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46e6f62fae40af6b03d6b09a2b237f4049ab4d54ce30289e1fa7a74b9ee7f57df586feb3cf695f4268a86478365fee580db550e9b044c84281fcb464e2fde321
|
7
|
+
data.tar.gz: 8b1c9a8b5873b2b993f27d80186e9c7e0a024e201aba3c0125f47331c6fda50d673cbb1f572c17b2aef1b613b687f6a66c86c17d9b325f8c20e9c2bd8e6bf103
|
data/.eslintrc.yml
ADDED
@@ -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:
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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:
|
14
|
-
|
15
|
-
|
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:
|
17
|
+
- name: Setup Gemfile
|
19
18
|
run: |
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
data/.github/workflows/tests.yml
CHANGED
@@ -10,9 +10,12 @@ jobs:
|
|
10
10
|
|
11
11
|
strategy:
|
12
12
|
matrix:
|
13
|
-
ruby: ['2.6', '2.
|
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:
|
38
|
+
image: mysql:8.0
|
36
39
|
env:
|
37
|
-
|
38
|
-
MYSQL_PASSWORD: ''
|
39
|
-
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
40
|
+
MYSQL_ROOT_PASSWORD: 'BestPasswordEver'
|
40
41
|
ports:
|
41
|
-
|
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:
|
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
|
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
|
-
|
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
|
-
|
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.
|
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:
|
75
|
+
Enabled: true
|
76
|
+
Exclude:
|
77
|
+
- 'test/**/*'
|
data/.slim-lint.yml
CHANGED
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.
|
37
|
-
2.
|
38
|
-
3.
|
39
|
-
4.
|
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
|
-
-
|
44
|
-
-
|
45
|
-
-
|
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
|
-
|
48
|
+
### 1. Get right plugin version
|
50
49
|
|
51
|
-
|
50
|
+
To install stable version of additional_tags, use
|
52
51
|
|
53
52
|
```shell
|
54
|
-
cd
|
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
|
-
|
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
|
-
|
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.
|
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.
|
99
|
-
2.
|
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
|
-
|
124
|
-
|
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.
|
data/additional_tags.gemspec
CHANGED
@@ -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.
|
22
|
+
spec.required_ruby_version = '>= 2.5'
|
23
23
|
|
24
|
-
spec.add_runtime_dependency 'acts-as-taggable-on', '~>
|
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
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
108
|
-
|
109
|
-
|
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 },
|
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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
=
|
6
|
-
|
7
|
-
|
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
|
-
=
|
15
|
-
|
16
|
-
|
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
|
-
=
|
25
|
-
|
26
|
-
|
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 =
|
5
|
+
h2 = render_wiki_index_title @project, @tag
|
6
6
|
|
7
7
|
- if @pages.empty?
|
8
8
|
p.nodata = l :label_no_data
|
data/assets/javascripts/tags.js
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
$(function () {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
var $mostUsedTagsContainer = $(e.target).parent('.most_used_tags');
|
16
|
+
$mostUsedTagsContainer.empty();
|
17
|
+
$mostUsedTagsContainer.append(tagsHtml);
|
18
|
+
});
|
19
19
|
});
|
data/assets/stylesheets/tags.css
CHANGED
@@ -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
|
|
data/config/locales/bg.yml
CHANGED
@@ -12,7 +12,7 @@ bg:
|
|
12
12
|
label_show_with_count: "Показване на брой маркирани обекти"
|
13
13
|
label_tags_tag: "Маркер"
|
14
14
|
label_use_colors: "Използване на цветове"
|
15
|
-
|
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
|
-
|
29
|
+
label_tags_sidebar: "Показване на маркерите в страничния панел"
|
30
30
|
tags_sort_by_count: "брой обекти"
|
31
31
|
tags_sort_by_name: "Име"
|
32
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Сортиране на маркерите по"
|
33
|
+
label_tags_suggestion_order: "Ред на предлагане"
|
data/config/locales/cs.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Řazení značek podle"
|
33
|
+
label_tags_suggestion_order: "Objednávka návrhu"
|
data/config/locales/de.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
29
|
+
label_tags_sidebar: Zeige TAGs in der Sidebar
|
30
30
|
tags_sort_by_count: Anzahl
|
31
31
|
tags_sort_by_name: Name
|
32
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: Sortiere TAGs nach
|
33
|
+
label_tags_suggestion_order: Reihenfolge der Vorschläge
|
data/config/locales/en.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
29
|
+
label_tags_sidebar: "Display tags on sidebar as"
|
30
30
|
tags_sort_by_count: "Count"
|
31
31
|
tags_sort_by_name: "Name"
|
32
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Sort tags by"
|
33
|
+
label_tags_suggestion_order: "Suggestion order"
|
data/config/locales/es.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Ordenar las tags por"
|
33
|
+
label_tags_suggestion_order: "Orden de sugerencia"
|
data/config/locales/fr.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Trier les balises par"
|
33
|
+
label_tags_suggestion_order: "Ordre de suggestion"
|
data/config/locales/it.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Ordina i tag per"
|
33
|
+
label_tags_suggestion_order: "Ordine di suggerimento"
|
data/config/locales/ja.yml
CHANGED
@@ -12,7 +12,7 @@ ja:
|
|
12
12
|
label_show_with_count: "タグに金額を表示"
|
13
13
|
label_tags_tag: "Tag"
|
14
14
|
label_use_colors: "色を使う"
|
15
|
-
|
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
|
-
|
29
|
+
label_tags_sidebar: "サイドバーにタグを"
|
30
30
|
tags_sort_by_count: "伯爵"
|
31
31
|
tags_sort_by_name: "名前"
|
32
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "タグを並べ替える"
|
33
|
+
label_tags_suggestion_order: "ご提案の順番"
|
data/config/locales/ko.yml
CHANGED
@@ -12,7 +12,7 @@ ko:
|
|
12
12
|
label_show_with_count: "태그에 금액 표시"
|
13
13
|
label_tags_tag: "Tag"
|
14
14
|
label_use_colors: "색상 사용"
|
15
|
-
|
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
|
-
|
29
|
+
label_tags_sidebar: "사이드 바에 태그 표시"
|
30
30
|
tags_sort_by_count: "카운트"
|
31
31
|
tags_sort_by_name: "이름"
|
32
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "태그 정렬 기준"
|
33
|
+
label_tags_suggestion_order: "제안 순서"
|
data/config/locales/pl.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Sortuj znaczniki według"
|
33
|
+
label_tags_suggestion_order: "Zamówienie ofertowe"
|
data/config/locales/pt-BR.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
33
|
-
|
32
|
+
label_tags_sort_by: "Ordenar tags por"
|
33
|
+
label_tags_suggestion_order: "Pedido de sugestão"
|
data/config/locales/ru.yml
CHANGED
@@ -12,7 +12,7 @@ ru:
|
|
12
12
|
label_show_with_count: "Отображаемое количество на теге"
|
13
13
|
label_tags_tag: "Tag"
|
14
14
|
label_use_colors: "Использовать цвета"
|
15
|
-
|
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
|
-
|
29
|
+
label_tags_sidebar: "DОтображать теги на боковой панели как"
|
30
30
|
tags_sort_by_count: "Посчитать"
|
31
31
|
tags_sort_by_name: "Имя"
|
32
|
-
|
33
|
-
|
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
|
-
:
|
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
|
data/lib/additional_tags.rb
CHANGED
@@ -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,
|
73
|
-
compare
|
74
|
-
|
75
|
-
|
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
|
-
|
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:
|
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: :
|
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
|
-
.
|
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
|
-
|
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
|
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
|
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.
|
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:
|
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: '
|
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: '
|
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.
|
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.
|
174
|
+
rubygems_version: 3.1.6
|
174
175
|
signing_key:
|
175
176
|
specification_version: 4
|
176
177
|
summary: Redmine plugin for adding tag functionality
|