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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/codeql-analysis.yml +6 -6
  3. data/.github/workflows/linters.yml +15 -3
  4. data/.github/workflows/tests.yml +7 -4
  5. data/.gitignore +2 -0
  6. data/.rubocop.yml +5 -0
  7. data/.stylelintrc.json +12 -155
  8. data/README.md +26 -7
  9. data/app/controllers/additional_tags_controller.rb +9 -9
  10. data/app/controllers/issue_tags_controller.rb +3 -1
  11. data/app/helpers/additional_tags_helper.rb +39 -30
  12. data/app/helpers/additional_tags_issues_helper.rb +1 -3
  13. data/app/helpers/additional_tags_wiki_helper.rb +6 -5
  14. data/app/models/additional_tag.rb +98 -0
  15. data/app/views/additional_tags/_tag_list.html.slim +10 -4
  16. data/app/views/additional_tags/merge.html.slim +0 -1
  17. data/app/views/additional_tags/settings/_general.html.slim +7 -1
  18. data/app/views/additional_tags/settings/_manage_tags.html.slim +8 -1
  19. data/app/views/context_menus/_issues_tags.html.slim +7 -1
  20. data/app/views/dashboards/blocks/_issue_tags.html.slim +3 -1
  21. data/app/views/issue_tags/_edit_modal.html.slim +7 -7
  22. data/app/views/issues/_tags.html.slim +6 -1
  23. data/app/views/issues/_tags_bulk_edit.html.slim +2 -1
  24. data/app/views/wiki/_tags_form.html.slim +4 -0
  25. data/app/views/wiki/_tags_show.html.slim +1 -1
  26. data/assets/javascripts/tags.js +3 -3
  27. data/assets/stylesheets/tags.css +41 -16
  28. data/config/locales/bg.yml +18 -11
  29. data/config/locales/cs.yml +19 -12
  30. data/config/locales/de.yml +19 -12
  31. data/config/locales/en.yml +19 -12
  32. data/config/locales/es.yml +19 -12
  33. data/config/locales/fr.yml +19 -12
  34. data/config/locales/it.yml +19 -12
  35. data/config/locales/ja.yml +18 -11
  36. data/config/locales/ko.yml +18 -11
  37. data/config/locales/pl.yml +19 -12
  38. data/config/locales/pt-BR.yml +18 -11
  39. data/config/locales/ru.yml +34 -27
  40. data/config/settings.yml +5 -5
  41. data/doc/images/additional-tags-framework.png +0 -0
  42. data/doc/images/additional-tags.gif +0 -0
  43. data/doc/images/tag-overview.png +0 -0
  44. data/lib/additional_tags/hooks/view_hook.rb +15 -2
  45. data/lib/additional_tags/patches/issue_patch.rb +53 -7
  46. data/lib/additional_tags/patches/issue_query_patch.rb +18 -0
  47. data/lib/additional_tags/patches/queries_helper_patch.rb +1 -3
  48. data/lib/additional_tags/patches/query_patch.rb +22 -1
  49. data/lib/additional_tags/patches/wiki_page_patch.rb +6 -1
  50. data/lib/additional_tags/plugin_version.rb +1 -1
  51. data/lib/additional_tags/tags.rb +34 -12
  52. data/lib/additional_tags.rb +5 -0
  53. data/package.json +8 -0
  54. metadata +6 -3
@@ -1,38 +1,45 @@
1
1
  fr:
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ invalid_mutually_exclusive_tags: "utilise des étiquettes mutuellement exclusives"
6
+ field_issue_tags: "Demande tags"
2
7
  field_tag_list: Tags
3
8
  field_tags: Tags
4
- field_issue_tags: "Demande tags"
5
9
  label_active_issue_tags: "Activer les tags demandes"
6
10
  label_active_wiki_tags: "Activer les tags wiki"
7
11
  label_add_tags: "Gérer les tags"
12
+ label_amount_entities_with_tags: "Montant %{name} avec tags"
13
+ label_amount_tags: "Montant tags"
8
14
  label_edit_tags: "Modifier les tags"
9
15
  label_manage_tags: "Gérer les tags"
10
16
  label_merge_selected_tags: "Fusionner les tags sélectionnées"
11
17
  label_open_issues_only: "Afficher uniquement les demandes ouverts"
18
+ label_quantity: "Quantité"
12
19
  label_show_with_count: "Afficher le montant sur l'tags"
20
+ label_tag_color_theme: "Thème de la couleur %{value}"
21
+ label_tags_colors: "Couleur"
22
+ label_tags_sidebar: "Afficher les tags sur la barre latérale comme"
23
+ label_tags_sort_by: "Trier les balises par"
24
+ label_tags_suggestion_order: "Ordre de suggestion"
13
25
  label_tags_tag: "Tag"
14
- label_use_colors: "Utiliser les couleurs"
15
- label_wiki_index_for_tag_html: "Pages wiki avec la tags <em>%{tag}</em>"
26
+ label_tags_without_color: "Sans couleur"
27
+ label_use_colors: "Utiliser des couleurs"
28
+ label_wiki_index_for_tag: "Pages wiki avec la tags"
29
+ label_with_chart: "Avec tableau"
30
+ label_with_table_of_values: "Avec tableau de valeur"
16
31
  notice_failed_to_add_tags: "Omission d'ajouter des tags"
17
32
  notice_tags_added: "Tags ajoutés"
18
33
  permission_add_wiki_tags: "Ajouter des tags wiki"
19
34
  permission_create_issue_tags: "Ajouter des tags de demandes"
20
35
  permission_edit_issue_tags: "Éditer les tags de demandes"
21
36
  permission_view_issue_tags: "Afficher les tags des demandes"
22
- tags_order_by_last_created: "Dernière création"
23
37
  tags_order_by_count: "Les plus utilisés"
38
+ tags_order_by_last_created: "Dernière création"
24
39
  tags_order_by_name: "Nom"
25
40
  tags_sidebar_cloud: "Cloud"
26
41
  tags_sidebar_list: "Liste"
27
42
  tags_sidebar_none: "Aucune"
28
43
  tags_sidebar_simple_cloud: "Simple cloud"
29
- label_tags_sidebar: "Afficher les tags sur la barre latérale comme"
30
44
  tags_sort_by_count: "Compter"
31
45
  tags_sort_by_name: "Nom"
32
- label_tags_sort_by: "Trier les balises par"
33
- label_tags_suggestion_order: "Ordre de suggestion"
34
- label_with_table_of_values: "Avec tableau de valeur"
35
- label_with_chart: "Avec tableau"
36
- label_amount_tags: "Montant tags"
37
- label_amount_entities_with_tags: "Montant %{name} avec tags"
38
- label_quantity: "Quantité"
@@ -1,38 +1,45 @@
1
1
  it:
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ invalid_mutually_exclusive_tags: "utilizza tag mutuamente esclusivi"
6
+ field_issue_tags: "Segnalazione tags"
2
7
  field_tag_list: Tags
3
8
  field_tags: Tags
4
- field_issue_tags: "Segnalazione tags"
5
9
  label_active_issue_tags: "Attivare i tag di segnalazione"
6
10
  label_active_wiki_tags: "Attivare i tag wiki"
7
11
  label_add_tags: "Aggiungi tag"
12
+ label_amount_entities_with_tags: Amount %{name} with tags
13
+ label_amount_tags: Amount tags
8
14
  label_edit_tags: "Modifica i tag"
9
15
  label_manage_tags: "Gestire i tag"
10
16
  label_merge_selected_tags: "Unisci i tag selezionati"
11
17
  label_open_issues_only: "Mostra solo i segnalazione"
18
+ label_quantity: "Numero"
12
19
  label_show_with_count: "Visualizzare l'importo sul tag"
20
+ label_tag_color_theme: "Tema colore %{value}"
21
+ label_tags_colors: Colore
22
+ label_tags_sidebar: "Visualizzare i tag sulla barra laterale come"
23
+ label_tags_sort_by: "Ordina i tag per"
24
+ label_tags_suggestion_order: "Ordine di suggerimento"
13
25
  label_tags_tag: "Tag"
14
- label_use_colors: "Utilizzare i colori"
15
- label_wiki_index_for_tag_html: "Pagine Wiki con tag <em>%{tag}</em>"
26
+ label_tags_without_color: "Senza colore"
27
+ label_use_colors: "Usa i colori"
28
+ label_wiki_index_for_tag: "Pagine Wiki con tag"
29
+ label_with_chart: "Con grafico"
30
+ label_with_table_of_values: "Con tabella di valori"
16
31
  notice_failed_to_add_tags: "Non è stato possibile aggiungere tag"
17
32
  notice_tags_added: "Tag aggiunti"
18
33
  permission_add_wiki_tags: "Aggiungi tag wiki"
19
34
  permission_create_issue_tags: "Aggiungi i tag di segnalazione"
20
35
  permission_edit_issue_tags: "Modifica i tag di segnalazione"
21
36
  permission_view_issue_tags: "Visualizzare i tag di segnalazione"
22
- tags_order_by_last_created: "Ultima creazione"
23
37
  tags_order_by_count: "I più usati"
38
+ tags_order_by_last_created: "Ultima creazione"
24
39
  tags_order_by_name: "Nome"
25
40
  tags_sidebar_cloud: "Cloud"
26
41
  tags_sidebar_list: "Elenco"
27
42
  tags_sidebar_none: "Nessuno"
28
43
  tags_sidebar_simple_cloud: "Simple cloud"
29
- label_tags_sidebar: "Visualizzare i tag sulla barra laterale come"
30
44
  tags_sort_by_count: "Contate"
31
45
  tags_sort_by_name: "Nome"
32
- label_tags_sort_by: "Ordina i tag per"
33
- label_tags_suggestion_order: "Ordine di suggerimento"
34
- label_with_table_of_values: With table of values
35
- label_with_chart: With chart
36
- label_amount_tags: Amount tags
37
- label_amount_entities_with_tags: Amount %{name} with tags
38
- label_quantity: "Numero"
@@ -1,38 +1,45 @@
1
1
  ja:
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ invalid_mutually_exclusive_tags: "は相互に排他的なタグを使用しています。"
6
+ field_issue_tags: "発行タグ"
2
7
  field_tag_list: Tags
3
8
  field_tags: Tags
4
- field_issue_tags: Issue tags
5
9
  label_active_issue_tags: "課題タグを有効にする"
6
10
  label_active_wiki_tags: "wikiのタグを有効にする"
7
11
  label_add_tags: "タグを追加"
12
+ label_amount_entities_with_tags: "金額 %{name} tags付き"
13
+ label_amount_tags: "金額 tags"
8
14
  label_edit_tags: "タグの編集"
9
15
  label_manage_tags: "タグの管理"
10
16
  label_merge_selected_tags: "選択したタグをマージ"
11
17
  label_open_issues_only: "開いている問題のみを表示"
18
+ label_quantity: "数量"
12
19
  label_show_with_count: "タグに金額を表示"
20
+ label_tag_color_theme: "カラーテーマ%{value}"
21
+ label_tags_colors: "カラー"
22
+ label_tags_sidebar: "サイドバーにタグを"
23
+ label_tags_sort_by: "タグを並べ替える"
24
+ label_tags_suggestion_order: "ご提案の順番"
13
25
  label_tags_tag: "Tag"
26
+ label_tags_without_color: "色なし"
14
27
  label_use_colors: "色を使う"
15
- label_wiki_index_for_tag_html: "タグが付いているウィキのページ <em>%{tag}</em>"
28
+ label_wiki_index_for_tag: "タグが付いているウィキのページ"
29
+ label_with_chart: "チャート付き"
30
+ label_with_table_of_values: "価値観のテーブル付き"
16
31
  notice_failed_to_add_tags: "タグの追加に失敗"
17
32
  notice_tags_added: "追加されたタグ"
18
33
  permission_add_wiki_tags: "wikiタグの追加"
19
34
  permission_create_issue_tags: "課題タグの追加"
20
35
  permission_edit_issue_tags: "課題タグの編集"
21
36
  permission_view_issue_tags: "課題タグの表示"
22
- tags_order_by_last_created: "最後に作成された"
23
37
  tags_order_by_count: "最も使用されている"
38
+ tags_order_by_last_created: "最後に作成された"
24
39
  tags_order_by_name: "名前"
25
40
  tags_sidebar_cloud: "クラウド"
26
41
  tags_sidebar_list: "リスト"
27
42
  tags_sidebar_none: "なし"
28
43
  tags_sidebar_simple_cloud: "シンプルなクラウド"
29
- label_tags_sidebar: "サイドバーにタグを"
30
44
  tags_sort_by_count: "伯爵"
31
45
  tags_sort_by_name: "名前"
32
- label_tags_sort_by: "タグを並べ替える"
33
- label_tags_suggestion_order: "ご提案の順番"
34
- label_with_table_of_values: "価値観のテーブル付き"
35
- label_with_chart: "チャート付き"
36
- label_amount_tags: "金額 tags"
37
- label_amount_entities_with_tags: "金額 %{name} tags付き"
38
- label_quantity: "数量"
@@ -1,38 +1,45 @@
1
1
  ko:
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ invalid_mutually_exclusive_tags: "상호 배타적인 태그 사용"
6
+ field_issue_tags: Issue tags
2
7
  field_tag_list: Tags
3
8
  field_tags: Tags
4
- field_issue_tags: Issue tags
5
9
  label_active_issue_tags: "이슈 태그 활성화"
6
10
  label_active_wiki_tags: "Wiki 태그 활성화"
7
11
  label_add_tags: "태그 추가"
12
+ label_amount_entities_with_tags: "TAG가 있는 금액 %{name}"
13
+ label_amount_tags: "금액 태그"
8
14
  label_edit_tags: "태그 편집"
9
15
  label_manage_tags: "태그 관리"
10
16
  label_merge_selected_tags: "선택한 태그 병합"
11
17
  label_open_issues_only: "미해결 문제 만 표시"
18
+ label_quantity: "수량"
12
19
  label_show_with_count: "태그에 금액 표시"
20
+ label_tag_color_theme: "색상 테마 %{value}"
21
+ label_tags_colors: "색깔"
22
+ label_tags_sidebar: "사이드 바에 태그 표시"
23
+ label_tags_sort_by: "태그 정렬 기준"
24
+ label_tags_suggestion_order: "제안 순서"
13
25
  label_tags_tag: "Tag"
26
+ label_tags_without_color: "무색"
14
27
  label_use_colors: "색상 사용"
15
- label_wiki_index_for_tag_html: "태그가있는 위키 페이지 <em>%{tag}</em>"
28
+ label_wiki_index_for_tag: "태그가있는 위키 페이지"
29
+ label_with_chart: "차트 포함"
30
+ label_with_table_of_values: "가치 테이블"
16
31
  notice_failed_to_add_tags: "태그를 추가하지 못했습니다."
17
32
  notice_tags_added: "추가 된 태그"
18
33
  permission_add_wiki_tags: "위키 태그 추가"
19
34
  permission_create_issue_tags: "문제 태그 추가"
20
35
  permission_edit_issue_tags: "이슈 태그 수정"
21
36
  permission_view_issue_tags: "문제 태그 표시"
22
- tags_order_by_last_created: "마지막 생성"
23
37
  tags_order_by_count: "가장 많이 사용"
38
+ tags_order_by_last_created: "마지막 생성"
24
39
  tags_order_by_name: "이름"
25
40
  tags_sidebar_cloud: "구름"
26
41
  tags_sidebar_list: "명부"
27
42
  tags_sidebar_none: "없음"
28
43
  tags_sidebar_simple_cloud: "단순 클라우드"
29
- label_tags_sidebar: "사이드 바에 태그 표시"
30
44
  tags_sort_by_count: "카운트"
31
45
  tags_sort_by_name: "이름"
32
- label_tags_sort_by: "태그 정렬 기준"
33
- label_tags_suggestion_order: "제안 순서"
34
- label_with_table_of_values: "가치 테이블"
35
- label_with_chart: "차트 포함"
36
- label_amount_tags: "금액 태그"
37
- label_amount_entities_with_tags: "TAG가 있는 금액 %{name}"
38
- label_quantity: "수량"
@@ -1,38 +1,45 @@
1
1
  pl:
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ invalid_mutually_exclusive_tags: "używa wzajemnie wykluczających się tagów"
6
+ field_issue_tags: "Znaczniki emisji"
2
7
  field_tag_list: Tags
3
8
  field_tags: Tags
4
- field_issue_tags: Issue tags
5
9
  label_active_issue_tags: "Aktywacja znaczników emisji"
6
10
  label_active_wiki_tags: "Aktywacja tagów wiki"
7
11
  label_add_tags: "Dodaj znaczniki"
12
+ label_amount_entities_with_tags: "Kwota %{name} z Tags"
13
+ label_amount_tags: "Kwota Tags"
8
14
  label_edit_tags: "Edycja tagów"
9
15
  label_manage_tags: "Zarządzaj tagami"
10
16
  label_merge_selected_tags: "Łączenie wybranych tagów"
11
17
  label_open_issues_only: "Wyświetlaj tylko sprawy otwarte"
18
+ label_quantity: "Ilość"
12
19
  label_show_with_count: "Wyświetlanie ilości na etykiecie"
20
+ label_tag_color_theme: "Kolorowy motyw %{value}"
21
+ label_tags_colors: Kolor
22
+ label_tags_sidebar: "Wyświetlać znaczniki na pasku bocznym jako"
23
+ label_tags_sort_by: "Sortuj znaczniki według"
24
+ label_tags_suggestion_order: "Zamówienie ofertowe"
13
25
  label_tags_tag: "Tag"
14
- label_use_colors: "Używaj kolorów"
15
- label_wiki_index_for_tag_html: "Strony Wiki z tagiem <em>%{tag}</em>"
26
+ label_tags_without_color: "Bez koloru"
27
+ label_use_colors: "Użyj kolorów"
28
+ label_wiki_index_for_tag: "Strony Wiki z tagiem"
29
+ label_with_chart: "Z wykresem"
30
+ label_with_table_of_values: "Z tabelą wartości"
16
31
  notice_failed_to_add_tags: "Nie dodano znaczników"
17
32
  notice_tags_added: "Tagi dodane"
18
33
  permission_add_wiki_tags: "Dodaj znaczniki wiki"
19
34
  permission_create_issue_tags: "Dodaj znaczniki wydania"
20
35
  permission_edit_issue_tags: "Edycja znaczników wydania"
21
36
  permission_view_issue_tags: "Wyświetlanie znaczników emisji"
22
- tags_order_by_last_created: "Ostatnio stworzony"
23
37
  tags_order_by_count: "Najczęściej używany"
38
+ tags_order_by_last_created: "Ostatnio stworzony"
24
39
  tags_order_by_name: "Nazwa"
25
40
  tags_sidebar_cloud: "Cloud"
26
41
  tags_sidebar_list: "Lista"
27
42
  tags_sidebar_none: "Brak"
28
43
  tags_sidebar_simple_cloud: "Simple cloud"
29
- label_tags_sidebar: "Wyświetlać znaczniki na pasku bocznym jako"
30
44
  tags_sort_by_count: "Hrabia"
31
45
  tags_sort_by_name: "Nazwa"
32
- label_tags_sort_by: "Sortuj znaczniki według"
33
- label_tags_suggestion_order: "Zamówienie ofertowe"
34
- label_with_table_of_values: "Z tabelą wartości"
35
- label_with_chart: "Z wykresem"
36
- label_amount_tags: "Kwota Tags"
37
- label_amount_entities_with_tags: "Kwota %{name} z Tags"
38
- label_quantity: "Ilość"
@@ -1,38 +1,45 @@
1
1
  pt-BR:
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ invalid_mutually_exclusive_tags: "utiliza etiquetas mutuamente exclusivas"
6
+ field_issue_tags: Issue tags
2
7
  field_tag_list: Tags
3
8
  field_tags: Tags
4
- field_issue_tags: Issue tags
5
9
  label_active_issue_tags: "Ativar as etiquetas de emissão"
6
10
  label_active_wiki_tags: "Ativar as etiquetas wiki"
7
11
  label_add_tags: "Adicionar etiquetas"
12
+ label_amount_entities_with_tags: "Quantidade %{name} com etiquetas"
13
+ label_amount_tags: "Valor Etiquetas"
8
14
  label_edit_tags: "Editar etiquetas"
9
15
  label_manage_tags: "Gerenciar etiquetas"
10
16
  label_merge_selected_tags: "Fundir tags selecionadas"
11
17
  label_open_issues_only: "Exibir apenas questões em aberto"
18
+ label_quantity: "Quantidade"
12
19
  label_show_with_count: "Mostrar quantidade na etiqueta"
20
+ label_tag_color_theme: "Tema da cor %{value}"
21
+ label_tags_colors: "Cor"
22
+ label_tags_sidebar: "Mostrar etiquetas na barra lateral como"
23
+ label_tags_sort_by: "Ordenar tags por"
24
+ label_tags_suggestion_order: "Pedido de sugestão"
13
25
  label_tags_tag: "Tag"
26
+ label_tags_without_color: "Sem cor"
14
27
  label_use_colors: "Usar cores"
15
- label_wiki_index_for_tag_html: "Páginas Wiki com tag <em>%{tag}</em>"
28
+ label_wiki_index_for_tag: "Páginas Wiki com tag"
29
+ label_with_chart: "Com gráfico"
30
+ label_with_table_of_values: "Com tabela de valores"
16
31
  notice_failed_to_add_tags: "Falha em adicionar tags"
17
32
  notice_tags_added: "Tags adicionadas"
18
33
  permission_add_wiki_tags: "Adicionar etiquetas wiki"
19
34
  permission_create_issue_tags: "Adicionar etiquetas de edição"
20
35
  permission_edit_issue_tags: "Editar etiquetas de edição"
21
36
  permission_view_issue_tags: "Exibir etiquetas de edição"
22
- tags_order_by_last_created: "Última criação"
23
37
  tags_order_by_count: "Mais utilizados"
38
+ tags_order_by_last_created: "Última criação"
24
39
  tags_order_by_name: "Nome"
25
40
  tags_sidebar_cloud: "Cloud"
26
41
  tags_sidebar_list: "Lista"
27
42
  tags_sidebar_none: "Nenhum"
28
43
  tags_sidebar_simple_cloud: "Simple cloud"
29
- label_tags_sidebar: "Mostrar etiquetas na barra lateral como"
30
44
  tags_sort_by_count: "Conde"
31
45
  tags_sort_by_name: "Nome"
32
- label_tags_sort_by: "Ordenar tags por"
33
- label_tags_suggestion_order: "Pedido de sugestão"
34
- label_with_table_of_values: "Com tabela de valores"
35
- label_with_chart: "Com gráfico"
36
- label_amount_tags: "Valor Etiquetas"
37
- label_amount_entities_with_tags: "Quantidade %{name} com etiquetas"
38
- label_quantity: "Quantidade"
@@ -1,38 +1,45 @@
1
1
  ru:
2
- field_tag_list: Теги
3
- field_tags: Теги
4
- field_issue_tags: Теги задач
5
- label_active_issue_tags: "Активировать теги задач"
6
- label_active_wiki_tags: "Активировать теги вики"
7
- label_add_tags: "Добавьте теги"
8
- label_edit_tags: "Редактировать теги"
9
- label_manage_tags: "Управление тегами"
10
- label_merge_selected_tags: "Объединить выбранные теги"
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ invalid_mutually_exclusive_tags: "использует взаимоисключающие метки"
6
+ field_issue_tags: "Метки задач"
7
+ field_tag_list: "Метки"
8
+ field_tags: "Метки"
9
+ label_active_issue_tags: "Активировать метки задач"
10
+ label_active_wiki_tags: "Активировать метки вики"
11
+ label_add_tags: "Добавьте метки"
12
+ label_amount_entities_with_tags: "Сумма %{name} с метками"
13
+ label_amount_tags: "Метки Сумма"
14
+ label_edit_tags: "Редактировать метки"
15
+ label_manage_tags: "Управление метками"
16
+ label_merge_selected_tags: "Объединить выбранные метки"
11
17
  label_open_issues_only: "Отображать только открытые задачи"
12
- label_show_with_count: "Отображать количество на теге"
13
- label_tags_tag: "Тег"
18
+ label_quantity: "Количество"
19
+ label_show_with_count: "Отображать количество на метке"
20
+ label_tag_color_theme: "Цветовая тема %{value}"
21
+ label_tags_colors: "Цвет"
22
+ label_tags_sidebar: "Способ отображения меток на боковой панели"
23
+ label_tags_sort_by: "Сортировать метки по"
24
+ label_tags_suggestion_order: "Порядок предложения при вводе"
25
+ label_tags_tag: "Метка"
26
+ label_tags_without_color: "Без цвета"
14
27
  label_use_colors: "Использовать цвета"
15
- label_wiki_index_for_tag_html: "Вики-страницы с тегом <em>%{tag}</em>"
16
- notice_failed_to_add_tags: "Не удалось добавить теги"
17
- notice_tags_added: "Теги добавлены"
18
- permission_add_wiki_tags: "Добавление тегов вики"
19
- permission_create_issue_tags: "Добавление тегов задач"
20
- permission_edit_issue_tags: "Редактирование тегов задач"
21
- permission_view_issue_tags: "Просмотр тегов задач"
22
- tags_order_by_last_created: "Недавно созданные"
28
+ label_wiki_index_for_tag: "Вики-страницы с меткой"
29
+ label_with_chart: "С графиком"
30
+ label_with_table_of_values: "С таблицей значений"
31
+ notice_failed_to_add_tags: "Не удалось добавить метки"
32
+ notice_tags_added: "Метки добавлены"
33
+ permission_add_wiki_tags: "Добавление меток вики"
34
+ permission_create_issue_tags: "Добавление меток задач"
35
+ permission_edit_issue_tags: "Редактирование меток задач"
36
+ permission_view_issue_tags: "Просмотр меток задач"
23
37
  tags_order_by_count: "Наиболее часто используемые"
38
+ tags_order_by_last_created: "Недавно созданные"
24
39
  tags_order_by_name: "Имя"
25
40
  tags_sidebar_cloud: "Облако"
26
41
  tags_sidebar_list: "Список"
27
42
  tags_sidebar_none: "Нет"
28
43
  tags_sidebar_simple_cloud: "Простое облако"
29
- label_tags_sidebar: "Способ отображения тегов на боковой панели"
30
44
  tags_sort_by_count: "Количеству"
31
45
  tags_sort_by_name: "Имени"
32
- label_tags_sort_by: "Сортировать теги по"
33
- label_tags_suggestion_order: "Порядок предложения при вводе"
34
- label_with_table_of_values: "С таблицей значений"
35
- label_with_chart: "С графиком"
36
- label_amount_tags: "Теги Сумма"
37
- label_amount_entities_with_tags: "Сумма %{name} с тегами"
38
- label_quantity: "Количество"
data/config/settings.yml CHANGED
@@ -1,9 +1,9 @@
1
- active_issue_tags: 0
2
- active_wiki_tags: 0
3
- open_issues_only: 0
4
- show_with_count: 0
1
+ active_issue_tags: '0'
2
+ active_wiki_tags: '0'
3
+ open_issues_only: '0'
4
+ show_with_count: '0'
5
+ tags_color_theme: '1'
5
6
  tags_sidebar: 'none'
6
7
  tags_sort_by: 'name'
7
8
  tags_sort_order: 'asc'
8
9
  tags_suggestion_order: 'name'
9
- use_colors: 1
Binary file
Binary file
@@ -63,9 +63,22 @@ module AdditionalTags
63
63
  def issues_bulk_tags_fix(issue, params)
64
64
  return unless params && params[:issue]
65
65
 
66
- old_tags = issue.tags.map(&:name)
66
+ common_tags =
67
+ if params[:common_tags].present?
68
+ params[:common_tags].split(ActsAsTaggableOn.delimiter).collect(&:strip)
69
+ else
70
+ []
71
+ end
72
+ current_tags = ActsAsTaggableOn::TagList.new issue.tags.to_a
67
73
  new_tags = Array(params[:issue][:tag_list]).reject(&:empty?)
68
- issue.tag_list = (old_tags + new_tags).uniq
74
+
75
+ tags_to_add = new_tags - common_tags
76
+ tags_to_remove = common_tags - new_tags
77
+
78
+ current_tags.add tags_to_add
79
+ current_tags.remove tags_to_remove
80
+
81
+ issue.tag_list = current_tags
69
82
  end
70
83
 
71
84
  def tags_journal(issue, params)
@@ -13,6 +13,8 @@ module AdditionalTags
13
13
  before_save :prepare_save_tag_change
14
14
  before_save :sort_tag_list
15
15
 
16
+ validate :validate_tags, if: proc { AdditionalTags.setting?(:active_issue_tags) }
17
+
16
18
  after_commit :add_remove_unused_tags_job, on: %i[update destroy],
17
19
  if: proc { AdditionalTags.setting?(:active_issue_tags) }
18
20
 
@@ -29,21 +31,58 @@ module AdditionalTags
29
31
  tags.all? { |tag| allowed_tags.include? tag }
30
32
  end
31
33
 
32
- def group_by_status_with_tags(project = nil)
33
- visible(User.current, project: project).joins(:status)
34
- .joins(:tags)
35
- .group(:is_closed, 'tag_id')
36
- .count
34
+ def group_by_status_with_tags(project = nil, user = User.current)
35
+ scope = if project && Setting.display_subprojects_issues?
36
+ visible(user).where(AdditionalTags::Tags.subproject_sql(project))
37
+ else
38
+ visible user, project: project
39
+ end
40
+
41
+ scope.joins(:status)
42
+ .joins(:tags)
43
+ .group(:is_closed, 'tag_id')
44
+ .count
37
45
  end
38
46
 
39
47
  def available_tags(**options)
40
- options[:permission] = :view_issues
48
+ options[:permission] ||= :view_issue_tags
41
49
  tags = AdditionalTags::Tags.available_tags self, **options
42
50
  return tags unless options[:open_issues_only]
43
51
 
44
52
  tags.joins("JOIN #{IssueStatus.table_name} ON #{IssueStatus.table_name}.id = #{table_name}.status_id")
45
53
  .where(issue_statuses: { is_closed: false })
46
54
  end
55
+
56
+ def common_tag_list_from_issues(ids)
57
+ common_tags = ActsAsTaggableOn::Tag.joins(:taggings)
58
+ .select(
59
+ "#{ActiveRecord::Base.connection.quote_table_name ActsAsTaggableOn.tags_table}.id",
60
+ "#{ActiveRecord::Base.connection.quote_table_name ActsAsTaggableOn.tags_table}.name"
61
+ )
62
+ .where(taggings: { taggable_type: 'Issue', taggable_id: ids })
63
+ .group(
64
+ "#{ActiveRecord::Base.connection.quote_table_name ActsAsTaggableOn.tags_table}.id",
65
+ "#{ActiveRecord::Base.connection.quote_table_name ActsAsTaggableOn.tags_table}.name"
66
+ )
67
+ .having('count(*) = ?', ids.count).to_a
68
+
69
+ ActsAsTaggableOn::TagList.new common_tags
70
+ end
71
+
72
+ def load_visible_tags(issues, user = User.current)
73
+ return if issues.blank?
74
+
75
+ available_projects = Project.where(AdditionalTags::Tags.visible_condition(user)).ids
76
+
77
+ issues.each do |issue|
78
+ tags = if available_projects.include? issue.project_id
79
+ issue.tags
80
+ else
81
+ []
82
+ end
83
+ issue.instance_variable_set :@visible_tags, tags
84
+ end
85
+ end
47
86
  end
48
87
 
49
88
  module InstanceMethods
@@ -62,7 +101,7 @@ module AdditionalTags
62
101
  tags = attrs.delete :tag_list
63
102
  tags = Array(tags).reject(&:empty?)
64
103
 
65
- Additionals.debug "tags: #{tags.inspect} - project: #{project&.id} - access: #{user.allowed_to? :create_issue_tags, project}"
104
+ # Additionals.debug "tags: #{tags.inspect} - project: #{project&.id} - access: #{user.allowed_to? :create_issue_tags, project}"
66
105
 
67
106
  if user.allowed_to?(:create_issue_tags, project) ||
68
107
  user.allowed_to?(:edit_issue_tags, project) && Issue.allowed_tags?(tags)
@@ -88,6 +127,13 @@ module AdditionalTags
88
127
 
89
128
  self.tag_list = AdditionalTags::Tags.sort_tags tags
90
129
  end
130
+
131
+ def validate_tags
132
+ return if !User.current.allowed_to?(:create_issue_tags, project) &&
133
+ !(User.current.allowed_to?(:edit_issue_tags, project) && Issue.allowed_tags?(tags))
134
+
135
+ errors.add :tag_list, :invalid_mutually_exclusive_tags unless AdditionalTag.valid_mutually_exclusive_tag tag_list
136
+ end
91
137
  end
92
138
  end
93
139
  end
@@ -15,6 +15,9 @@ module AdditionalTags
15
15
 
16
16
  alias_method :available_columns_without_tags, :available_columns
17
17
  alias_method :available_columns, :available_columns_with_tags
18
+
19
+ alias_method :issues_without_tags, :issues
20
+ alias_method :issues, :issues_with_tags
18
21
  end
19
22
 
20
23
  module InstanceOverwriteMethods
@@ -29,9 +32,24 @@ module AdditionalTags
29
32
 
30
33
  self
31
34
  end
35
+
36
+ def sql_for_tags_field(field, _operator, values)
37
+ build_sql_for_tags_field_with_permission klass: queried_class,
38
+ operator: operator_for(field),
39
+ values: values,
40
+ permission: :view_issue_tags
41
+ end
32
42
  end
33
43
 
34
44
  module InstanceMethods
45
+ def issues_with_tags(**options)
46
+ issues = issues_without_tags(**options)
47
+ return issues unless has_column? :tags
48
+
49
+ Issue.load_visible_tags issues
50
+ issues
51
+ end
52
+
35
53
  def initialize_available_filters_with_tags
36
54
  initialize_available_filters_without_tags
37
55
 
@@ -15,9 +15,7 @@ module AdditionalTags
15
15
  module InstanceMethods
16
16
  def column_content_with_tags(column, item)
17
17
  if column.name == :issue_tags || item.is_a?(Issue) && column.name == :tags
18
- additional_tag_links column.value(item),
19
- tag_controller: 'issues',
20
- use_colors: AdditionalTags.setting?(:use_colors)
18
+ additional_tag_links item.instance_variable_get(:@visible_tags), tag_controller: 'issues'
21
19
  else
22
20
  column_content_without_tags column, item
23
21
  end
@@ -11,7 +11,9 @@ module AdditionalTags
11
11
 
12
12
  module InstanceMethods
13
13
  def sql_for_tags_field(field, _operator, values)
14
- build_sql_for_tags_field klass: queried_class, operator: operator_for(field), values: values
14
+ build_sql_for_tags_field klass: queried_class,
15
+ operator: operator_for(field),
16
+ values: values
15
17
  end
16
18
 
17
19
  def initialize_tags_filter(position: nil)
@@ -60,6 +62,25 @@ module AdditionalTags
60
62
  end
61
63
  end
62
64
 
65
+ # NOTE: should be used, if tags required permission check
66
+ def build_sql_for_tags_field_with_permission(klass:, operator:, values:, permission:)
67
+ compare = ['=', '*'].include?(operator) ? 'in' : 'not_in'
68
+ case operator
69
+ when '=', '!'
70
+ ids_list = klass.tagged_with(values, any: true).ids
71
+ # special case: filter with deleted tag
72
+ return '(1=0)' if ids_list.blank? && values.present? && operator == '='
73
+ else
74
+ allowed_projects = Project.where(Project.allowed_to_condition(User.current, permission))
75
+ .select(:id)
76
+ ids_list = klass.tagged_with(klass.available_tags(skip_pre_condition: true), any: true)
77
+ .where(project_id: allowed_projects).ids
78
+ end
79
+
80
+ "(#{klass.arel_table[:id].send(compare, ids_list).to_sql})"
81
+ end
82
+
83
+ # NOTE: should be used, if tags do not require permission check
63
84
  def build_sql_for_tags_field(klass:, operator:, values:)
64
85
  compare = ['=', '*'].include?(operator) ? 'IN' : 'NOT IN'
65
86
  case operator