diff --git a/app/assets/stylesheets/views/profile.scss b/app/assets/stylesheets/views/profile.scss index 20ac4a7e4..958fe5877 100644 --- a/app/assets/stylesheets/views/profile.scss +++ b/app/assets/stylesheets/views/profile.scss @@ -179,3 +179,16 @@ border-bottom: unset; } } + +.badge-indicator { + font-size: var(--fs-s); + color: var(--base-0); + width: var(--su-6); + height: var(--su-6); + line-height: var(--su-6); + position: absolute; + background-color: var(--accent-brand); + right: var(--su-1); + bottom: -5px; + border-radius: 100%; +} \ No newline at end of file diff --git a/app/controllers/admin/badges_controller.rb b/app/controllers/admin/badges_controller.rb index 5f662bf6b..28bb792b3 100644 --- a/app/controllers/admin/badges_controller.rb +++ b/app/controllers/admin/badges_controller.rb @@ -41,7 +41,7 @@ module Admin private def badge_params - params.require(:badge).permit(:title, :description, :badge_image, :credits_awarded) + params.require(:badge).permit(:title, :description, :badge_image, :credits_awarded, :allow_multiple_awards) end end end diff --git a/app/models/badge.rb b/app/models/badge.rb index e6dd452b8..a4655b56f 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -10,6 +10,7 @@ class Badge < ApplicationRecord validates :description, presence: true validates :slug, presence: true validates :title, presence: true, uniqueness: true + validates :allow_multiple_awards, inclusion: { in: [true, false] } before_validation :generate_slug diff --git a/app/models/badge_achievement.rb b/app/models/badge_achievement.rb index 810b2b6d2..53cfbd4cb 100644 --- a/app/models/badge_achievement.rb +++ b/app/models/badge_achievement.rb @@ -14,7 +14,7 @@ class BadgeAchievement < ApplicationRecord counter_culture :user, column_name: "badge_achievements_count" - validates :badge_id, uniqueness: { scope: :user_id } + validates :badge_id, uniqueness: { scope: :user_id, if: :single_award_badge? } before_validation :render_rewarding_context_message_html after_create :award_credits @@ -53,4 +53,8 @@ class BadgeAchievement < ApplicationRecord Credit.add_to(user, badge.credits_awarded) end + + def single_award_badge? + badge&.allow_multiple_awards == false + end end diff --git a/app/views/admin/badges/edit.html.erb b/app/views/admin/badges/edit.html.erb index 245c47090..65668f70b 100644 --- a/app/views/admin/badges/edit.html.erb +++ b/app/views/admin/badges/edit.html.erb @@ -33,6 +33,14 @@ <%= form.text_field :credits_awarded, class: "crayons-textfield" %> +
+ <%= form.check_box :allow_multiple_awards, class: "crayons-checkbox" %> + <%= form.label :allow_multiple_awards, class: "crayons-field__label" do %> + Allow multiple awards +

Allows this badge to be awarded multiple times to the same user

+ <% end %> +
+
<%= submit_tag "Update badge", class: "c-btn c-btn--primary" %>
diff --git a/app/views/admin/badges/new.html.erb b/app/views/admin/badges/new.html.erb index cd626ce47..048683c36 100644 --- a/app/views/admin/badges/new.html.erb +++ b/app/views/admin/badges/new.html.erb @@ -22,6 +22,15 @@ <%= form.text_field :credits_awarded, class: "crayons-textfield" %> +
+ <%= form.check_box :allow_multiple_awards, class: "crayons-checkbox" %> + <%= form.label :allow_multiple_awards, class: "crayons-field__label" do %> + Allow multiple awards +

Allows this badge to be awarded multiple times to the same user

+ <% end %> +
+ +
<%= submit_tag "Create Badge", class: "c-btn c-btn--primary" %>
diff --git a/app/views/users/_badges_area.html.erb b/app/views/users/_badges_area.html.erb index 721edd98c..c317bd185 100644 --- a/app/views/users/_badges_area.html.erb +++ b/app/views/users/_badges_area.html.erb @@ -5,15 +5,17 @@
- <% achievements.each_with_index do |achievement, i| %> + <% achievements.group_by(&:badge_id).each_with_index do |(badge_id, badge_achievements), i| %> + <% achievement = badge_achievements.first %>
+ class="js-profile-badge <% if i >= limit %>hidden<% end %> relative"> <%= achievement.badge_title %> + <% if badge_achievements.length > 1 %>
"><%= badge_achievements.length %>
<% end %>