additional_tags 1.0.6 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/codeql-analysis.yml +6 -6
- data/.github/workflows/linters.yml +15 -3
- data/.github/workflows/tests.yml +7 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +5 -0
- data/.stylelintrc.json +12 -155
- data/README.md +26 -7
- data/app/controllers/additional_tags_controller.rb +9 -9
- data/app/controllers/issue_tags_controller.rb +3 -1
- data/app/helpers/additional_tags_helper.rb +39 -30
- data/app/helpers/additional_tags_issues_helper.rb +1 -3
- data/app/helpers/additional_tags_wiki_helper.rb +6 -5
- data/app/models/additional_tag.rb +98 -0
- data/app/views/additional_tags/_tag_list.html.slim +10 -4
- data/app/views/additional_tags/merge.html.slim +0 -1
- data/app/views/additional_tags/settings/_general.html.slim +7 -1
- data/app/views/additional_tags/settings/_manage_tags.html.slim +8 -1
- data/app/views/context_menus/_issues_tags.html.slim +7 -1
- data/app/views/dashboards/blocks/_issue_tags.html.slim +3 -1
- data/app/views/issue_tags/_edit_modal.html.slim +7 -7
- data/app/views/issues/_tags.html.slim +6 -1
- data/app/views/issues/_tags_bulk_edit.html.slim +2 -1
- data/app/views/wiki/_tags_form.html.slim +4 -0
- data/app/views/wiki/_tags_show.html.slim +1 -1
- data/assets/javascripts/tags.js +3 -3
- data/assets/stylesheets/tags.css +41 -16
- data/config/locales/bg.yml +18 -11
- data/config/locales/cs.yml +19 -12
- data/config/locales/de.yml +19 -12
- data/config/locales/en.yml +19 -12
- data/config/locales/es.yml +19 -12
- data/config/locales/fr.yml +19 -12
- data/config/locales/it.yml +19 -12
- data/config/locales/ja.yml +18 -11
- data/config/locales/ko.yml +18 -11
- data/config/locales/pl.yml +19 -12
- data/config/locales/pt-BR.yml +18 -11
- data/config/locales/ru.yml +34 -27
- data/config/settings.yml +5 -5
- data/doc/images/additional-tags-framework.png +0 -0
- data/doc/images/additional-tags.gif +0 -0
- data/doc/images/tag-overview.png +0 -0
- data/lib/additional_tags/hooks/view_hook.rb +15 -2
- data/lib/additional_tags/patches/issue_patch.rb +53 -7
- data/lib/additional_tags/patches/issue_query_patch.rb +18 -0
- data/lib/additional_tags/patches/queries_helper_patch.rb +1 -3
- data/lib/additional_tags/patches/query_patch.rb +22 -1
- data/lib/additional_tags/patches/wiki_page_patch.rb +6 -1
- data/lib/additional_tags/plugin_version.rb +1 -1
- data/lib/additional_tags/tags.rb +34 -12
- data/lib/additional_tags.rb +5 -0
- data/package.json +8 -0
- metadata +6 -3
@@ -13,6 +13,7 @@ module AdditionalTags
|
|
13
13
|
alias_method :safe_attributes_without_tags=, :safe_attributes=
|
14
14
|
alias_method :safe_attributes=, :safe_attributes_with_tags=
|
15
15
|
|
16
|
+
validate :validate_tags
|
16
17
|
before_save :sort_tag_list
|
17
18
|
end
|
18
19
|
|
@@ -24,7 +25,7 @@ module AdditionalTags
|
|
24
25
|
|
25
26
|
def available_tags(**options)
|
26
27
|
options[:project_join] = project_joins
|
27
|
-
options[:permission]
|
28
|
+
options[:permission] ||= :view_wiki_pages
|
28
29
|
AdditionalTags::Tags.available_tags self, **options
|
29
30
|
end
|
30
31
|
|
@@ -106,6 +107,10 @@ module AdditionalTags
|
|
106
107
|
|
107
108
|
self.tag_list = AdditionalTags::Tags.sort_tags tag_list
|
108
109
|
end
|
110
|
+
|
111
|
+
def validate_tags
|
112
|
+
errors.add :tag_list, :invalid_mutually_exclusive_tags unless AdditionalTag.valid_mutually_exclusive_tag tag_list
|
113
|
+
end
|
109
114
|
end
|
110
115
|
end
|
111
116
|
end
|
data/lib/additional_tags/tags.rb
CHANGED
@@ -3,13 +3,27 @@
|
|
3
3
|
module AdditionalTags
|
4
4
|
class Tags
|
5
5
|
class << self
|
6
|
+
def visible_condition(user, **options)
|
7
|
+
permission = options[:permission] || :view_issue_tags
|
8
|
+
skip_pre_condition = options[:skip_pre_condition] || true
|
9
|
+
|
10
|
+
tag_access permission, user, skip_pre_condition: skip_pre_condition
|
11
|
+
end
|
12
|
+
|
6
13
|
def available_tags(klass, **options)
|
7
14
|
user = options[:user].presence || User.current
|
8
15
|
|
9
16
|
scope = ActsAsTaggableOn::Tag.where({})
|
10
|
-
|
17
|
+
if options[:project]
|
18
|
+
scope = if Setting.display_subprojects_issues?
|
19
|
+
scope.where subproject_sql(options[:project])
|
20
|
+
else
|
21
|
+
scope.where projects: { id: options[:project] }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
11
25
|
if options[:permission]
|
12
|
-
scope = scope.where tag_access(options[:permission], user)
|
26
|
+
scope = scope.where tag_access(options[:permission], user, skip_pre_condition: options[:skip_pre_condition])
|
13
27
|
elsif options[:visible_condition]
|
14
28
|
scope = scope.where klass.visible_condition(user)
|
15
29
|
end
|
@@ -18,14 +32,7 @@ module AdditionalTags
|
|
18
32
|
scope = scope.where "#{TAGGING_TABLE_NAME}.taggable_id!=?", options[:exclude_id] if options[:exclude_id]
|
19
33
|
scope = scope.where options[:where_field] => options[:where_value] if options[:where_field].present? && options[:where_value]
|
20
34
|
|
21
|
-
|
22
|
-
"#{TAG_TABLE_NAME}.name",
|
23
|
-
"#{TAG_TABLE_NAME}.taggings_count",
|
24
|
-
"COUNT(DISTINCT #{TAGGING_TABLE_NAME}.taggable_id) AS count"]
|
25
|
-
|
26
|
-
columns << "MIN(#{TAGGING_TABLE_NAME}.created_at) AS last_created" if options[:sort_by] == 'last_created'
|
27
|
-
|
28
|
-
scope.select(columns.to_list)
|
35
|
+
scope.select(table_columns(options[:sort_by]))
|
29
36
|
.joins(tag_for_joins(klass, **options.slice(:project_join, :project, :without_projects)))
|
30
37
|
.group("#{TAG_TABLE_NAME}.id, #{TAG_TABLE_NAME}.name, #{TAG_TABLE_NAME}.taggings_count").having('COUNT(*) > 0')
|
31
38
|
.order(build_order_sql(options[:sort_by], options[:order]))
|
@@ -125,8 +132,23 @@ module AdditionalTags
|
|
125
132
|
counts
|
126
133
|
end
|
127
134
|
|
135
|
+
def subproject_sql(project)
|
136
|
+
"#{Project.table_name}.lft >= #{project.lft} " \
|
137
|
+
"AND #{Project.table_name}.rgt <= #{project.rgt}"
|
138
|
+
end
|
139
|
+
|
128
140
|
private
|
129
141
|
|
142
|
+
def table_columns(sort_by)
|
143
|
+
columns = ["#{TAG_TABLE_NAME}.id",
|
144
|
+
"#{TAG_TABLE_NAME}.name",
|
145
|
+
"#{TAG_TABLE_NAME}.taggings_count",
|
146
|
+
"COUNT(DISTINCT #{TAGGING_TABLE_NAME}.taggable_id) AS count"]
|
147
|
+
|
148
|
+
columns << "MIN(#{TAGGING_TABLE_NAME}.created_at) AS last_created" if sort_by == 'last_created'
|
149
|
+
columns.to_list
|
150
|
+
end
|
151
|
+
|
130
152
|
def status_for_tag_value(scope:, tag_id:, group_id: nil, group_id_is_bool: false)
|
131
153
|
value = if group_id_is_bool || group_id
|
132
154
|
if group_id_is_bool
|
@@ -176,11 +198,11 @@ module AdditionalTags
|
|
176
198
|
joins
|
177
199
|
end
|
178
200
|
|
179
|
-
def tag_access(permission, user)
|
201
|
+
def tag_access(permission, user, skip_pre_condition: false)
|
180
202
|
projects_allowed = if permission.nil?
|
181
203
|
Project.visible.ids
|
182
204
|
else
|
183
|
-
Project.where(Project.allowed_to_condition(user, permission)).ids
|
205
|
+
Project.where(Project.allowed_to_condition(user, permission, skip_pre_condition: skip_pre_condition)).ids
|
184
206
|
end
|
185
207
|
|
186
208
|
if projects_allowed.present?
|
data/lib/additional_tags.rb
CHANGED
@@ -14,6 +14,11 @@ module AdditionalTags
|
|
14
14
|
setting(:tags_sidebar).present? && setting(:tags_sidebar) != 'none'
|
15
15
|
end
|
16
16
|
|
17
|
+
# color is used by default (if setting is missing, too)
|
18
|
+
def use_colors?
|
19
|
+
setting(:tags_color_theme).to_s != '0'
|
20
|
+
end
|
21
|
+
|
17
22
|
private
|
18
23
|
|
19
24
|
def setup
|
data/package.json
ADDED
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.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AlphaNodes
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: acts-as-taggable-on
|
@@ -92,6 +92,7 @@ files:
|
|
92
92
|
- app/helpers/additional_tags_wiki_helper.rb
|
93
93
|
- app/jobs/additional_tags_job.rb
|
94
94
|
- app/jobs/additional_tags_remove_unused_tag_job.rb
|
95
|
+
- app/models/additional_tag.rb
|
95
96
|
- app/models/migrate_tag.rb
|
96
97
|
- app/models/migrate_tagging.rb
|
97
98
|
- app/models/query_tags_column.rb
|
@@ -143,6 +144,7 @@ files:
|
|
143
144
|
- db/migrate/20201123093214_migrate_existing_tags.rb
|
144
145
|
- doc/images/additional-tags-framework.png
|
145
146
|
- doc/images/additional-tags.gif
|
147
|
+
- doc/images/tag-overview.png
|
146
148
|
- init.rb
|
147
149
|
- lib/additional_tags.rb
|
148
150
|
- lib/additional_tags/hooks/model_hook.rb
|
@@ -175,6 +177,7 @@ files:
|
|
175
177
|
- lib/additional_tags/plugin_version.rb
|
176
178
|
- lib/additional_tags/tags.rb
|
177
179
|
- lib/tasks/additional_tags.rake
|
180
|
+
- package.json
|
178
181
|
homepage: https://github.com/alphanodes/additional_tags
|
179
182
|
licenses:
|
180
183
|
- GPL-2.0
|
@@ -195,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
198
|
- !ruby/object:Gem::Version
|
196
199
|
version: '0'
|
197
200
|
requirements: []
|
198
|
-
rubygems_version: 3.3.
|
201
|
+
rubygems_version: 3.3.26
|
199
202
|
signing_key:
|
200
203
|
specification_version: 4
|
201
204
|
summary: Redmine plugin for adding tag functionality
|