Skip to content

Commit f4714b6

Browse files
authored
Merge pull request #2312 from mikej/dietary-restrictions
Add support for dietary restrictions on member profiles
2 parents efbd40e + 9215f51 commit f4714b6

32 files changed

+174
-27
lines changed

app/assets/javascripts/application.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
//= require pickadate/picker.time
2525
//= require subscriptions-toggle
2626
//= require invitations
27+
//= require dietary-restrictions
2728
//= require cocoon
2829
//= require font_awesome5
2930

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
$(document).ready(function() {
2+
$('#member_dietary_restrictions_other').on('change', function () {
3+
const $otherDietaryRestrictions = $('#member_other_dietary_restrictions');
4+
const $elementToToggle = $otherDietaryRestrictions.parent();
5+
if ($elementToToggle.hasClass('d-none')) {
6+
$elementToToggle.removeClass('d-none').hide().slideDown(50);
7+
$otherDietaryRestrictions.focus();
8+
} else {
9+
$elementToToggle.slideUp(50, () => $elementToToggle.addClass('d-none'));
10+
}
11+
});
12+
});

app/assets/stylesheets/application.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,9 @@
2727
$primary: $dark-codebar-blue !default;
2828

2929
@import "bootstrap-custom";
30+
31+
/* Bootstrap's Reboot sets legends to float: left, which puts the first check box in a fieldset off to the
32+
right instead of underneath the legend. This overrides that. */
33+
legend {
34+
float: none !important;
35+
}

app/controllers/admin/members_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ def index
66
end
77

88
def show
9-
@member = Member.find(params[:id])
9+
@member = MemberPresenter.new(Member.find(params[:id]))
1010
load_attendance_data(@member)
1111

1212
@actions = admin_actions(@member).sort_by(&:created_at).reverse

app/controllers/concerns/member_concerns.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@ module InstanceMethods
1010

1111
def member_params
1212
params.require(:member).permit(
13-
:pronouns, :name, :surname, :email, :mobile, :about_you, :skill_list, :newsletter
14-
)
13+
:pronouns, :name, :surname, :email, :mobile, :about_you, :skill_list, :newsletter, :other_dietary_restrictions,
14+
dietary_restrictions: [],
15+
).tap do |params|
16+
# We want to keep Rails' hidden blank field in the form so that all dietary restrictions for a member can be
17+
# removed by submitting the form with all check boxes unticked. However, we want to remove the blank value
18+
# before setting the dietary restrictions attribute on the model.
19+
# See Gotcha section here:
20+
# https://api.rubyonrails.org/v7.1/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_check_boxes
21+
params[:dietary_restrictions] = params[:dietary_restrictions].reject(&:blank?) if params[:dietary_restrictions]
22+
end
1523
end
1624

1725
def suppress_notices

app/controllers/members_controller.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class MembersController < ApplicationController
22
include MemberConcerns
33

4-
before_action :set_member, only: %i[edit step2 profile update]
4+
before_action :set_member, only: %i[edit step2 update]
55
before_action :authenticate_member!, only: %i[edit step2 profile]
66
before_action :suppress_notices, only: %i[step2]
77

@@ -20,6 +20,7 @@ def step2
2020
end
2121

2222
def profile
23+
@member = MemberPresenter.new(current_user)
2324
render :show
2425
end
2526

app/models/member.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class Member < ApplicationRecord
2020
validates :email, uniqueness: true
2121
validates :about_you, length: { maximum: 255 }
2222

23+
DIETARY_RESTRICTIONS = %w[vegan vegetarian pescetarian halal gluten_free dairy_free other].freeze
24+
validates_inclusion_of :dietary_restrictions, in: DIETARY_RESTRICTIONS
25+
validates_presence_of :other_dietary_restrictions, if: :other_dietary_restrictions?
26+
2327
scope :accepted_toc, -> { where.not(accepted_toc_at: nil) }
2428
scope :order_by_email, -> { order(:email) }
2529
scope :subscribers, -> { joins(:subscriptions).order('created_at desc').uniq }
@@ -118,6 +122,10 @@ def recent_notes
118122
member_notes.where('created_at > ?', notes_from_date)
119123
end
120124

125+
def other_dietary_restrictions?
126+
dietary_restrictions.present? && dietary_restrictions.include?('other')
127+
end
128+
121129
def self.find_members_by_name(name)
122130
name.strip!
123131
name.eql?('') ? self.none : where("CONCAT(name, ' ', surname) ILIKE ?", "%#{name}%")

app/presenters/member_presenter.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ def pairing_details_array(role, tutorial, note)
2323
role.eql?('Coach') ? coach_pairing_details(note) : student_pairing_details(tutorial, note)
2424
end
2525

26+
def displayed_dietary_restrictions
27+
return [] if dietary_restrictions.nil?
28+
29+
(dietary_restrictions - ['other']).map(&:humanize).tap do |drs|
30+
drs << other_dietary_restrictions if other_dietary_restrictions? && other_dietary_restrictions.present?
31+
end.map(&:upcase_first)
32+
end
33+
2634
private
2735

2836
def coach_pairing_details(note)

app/views/admin/members/_profile.html.haml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@
1010
.mb-4
1111
%h5 Skills
1212
- @member.skills.each do |skill|
13-
.badge.bg-success= skill.name
13+
.badge.bg-secondary= skill.name
14+
15+
.mb-4
16+
%h5 Dietary Restrictions
17+
- if @member.dietary_restrictions.present?
18+
- @member.displayed_dietary_restrictions.each do |dr|
19+
.badge.bg-secondary.text-wrap.text-break.mb-1.text-start= dr
20+
- else
21+
.text-muted None
1422

1523
- if @workshop_attendances.positive? || @meeting_rsvps.positive? || @event_rsvps.positive?
1624
.attendance-summary.mt-4

app/views/admin/workshop/_attendances.html.haml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
= invitation.member.email
3232
- else
3333
= invitation.member.full_name
34+
- if invitation.member.dietary_restrictions.present?
35+
%p
36+
- invitation.member.displayed_dietary_restrictions.each do |dr|
37+
%span.badge.bg-secondary.text-wrap.text-break.mb-1.text-start= dr
3438
.col-6
3539
- if invitation.tutorial?
3640
%p.mb-1 Tutorial: #{invitation.tutorial}

0 commit comments

Comments
 (0)