From eb4b3c44d6e22740652c720721682afe2732c75a Mon Sep 17 00:00:00 2001 From: Godwin Date: Sun, 11 Jun 2017 15:27:18 -0700 Subject: [PATCH] Update copy, tests, and administration --- app/assets/stylesheets/_application.scss | 39 +++++++++-- .../conference_administration_controller.rb | 61 +++++++++++------ app/controllers/conferences_controller.rb | 10 +-- app/helpers/widgets_helper.rb | 30 +++++---- app/mailers/user_mailer.rb | 67 ++++++++----------- .../_select_guest_table.html.haml | 8 ++- .../_stats.html.haml | 11 ++- app/views/conferences/_payment.html.haml | 30 --------- app/views/conferences/_questions.html.haml | 14 ---- .../_payment_form.html.haml | 14 ++-- .../registration_steps/_review.html.haml | 18 ++++- app/views/workshops/_form.html.haml | 13 ---- app/views/workshops/_show.html.haml | 2 +- .../workshops/_workshop_previews.html.haml | 5 +- app/views/workshops/delete.html.haml | 4 +- app/views/workshops/index.html.haml | 11 +-- app/views/workshops/new.html.haml | 2 +- app/views/workshops/show.html.haml | 2 +- config/locales/en.yml | 11 ++- config/routes.rb | 2 +- db/schema.rb | 1 - features/registration.feature | 20 +++--- features/step_definitions/interface_steps.rb | 1 + features/support/env.rb | 27 ++++++-- features/support/helper.rb | 2 +- features/support/paths.rb | 2 +- features/workshops.feature | 6 +- 27 files changed, 220 insertions(+), 193 deletions(-) delete mode 100644 app/views/conferences/_payment.html.haml delete mode 100644 app/views/conferences/_questions.html.haml delete mode 100644 app/views/workshops/_form.html.haml diff --git a/app/assets/stylesheets/_application.scss b/app/assets/stylesheets/_application.scss index e009886..940cb6c 100644 --- a/app/assets/stylesheets/_application.scss +++ b/app/assets/stylesheets/_application.scss @@ -622,6 +622,10 @@ button, &.center { text-align: center; + + button, .button { + margin-left: 0.5em; + } } &.right { @@ -654,6 +658,10 @@ button, button[value="cancel"], button.red { background-color: $red; } + + button.back { + background-color: $mid-gray; + } } #main { @@ -694,9 +702,23 @@ button, font-size: 0.9em; } + .option-space { + margin: 1.5em 0; + } + + .setting-option { + p { + display: inline-block; + margin: 0; + } + + button { + vertical-align: middle; + } + } + .custom-option { text-align: right; - border: 0.1rem solid $black; background-color: $white; input { @@ -708,13 +730,15 @@ button, border-right: 0; text-align: center; background-color: transparent; + border: 0.05rem solid $black; + border-bottom-style: none; } button { width: 100%; margin: 0; - border: 0; - border-top: inherit; + // border: 0; + // border-top: inherit; background-color: lighten($colour-1, 25%); } } @@ -3884,16 +3908,19 @@ body.policy .policy-agreement ul { .custom-option { margin-top: 1em; + display: table-row; input { display: table-cell; - width: 10em; + // width: 10em; + width: 50%; + border-right-style: none; + border-bottom-style: solid; } button { + display: table-cell; width: 50%; - border-top: 0; - border-left: inherit; } } } diff --git a/app/controllers/conference_administration_controller.rb b/app/controllers/conference_administration_controller.rb index cbf4c29..640273b 100644 --- a/app/controllers/conference_administration_controller.rb +++ b/app/controllers/conference_administration_controller.rb @@ -70,6 +70,17 @@ class ConferenceAdministrationController < ApplicationController end end + def previous_stats + set_conference + conference = Conference.find_by_slug(params[:conference_slug]) + return do_403 unless conference.is_public + get_stats(false, nil, conference) + logger.info "Generating #{conference.slug}.xls" + return respond_to do |format| + format.xlsx { render xlsx: '../conferences/stats', filename: "stats-#{conference.slug}" } + end + end + rescue_from ActiveRecord::PremissionDenied do |exception| do_403 end @@ -195,7 +206,7 @@ class ConferenceAdministrationController < ApplicationController end end return respond_to do |format| - format.xlsx { render xlsx: :stats, filename: "organizations" } + format.xlsx { render xlsx: '../conferences/stats', filename: "organizations" } end end end @@ -211,7 +222,7 @@ class ConferenceAdministrationController < ApplicationController if request.format.xlsx? logger.info "Generating stats.xls" return respond_to do |format| - format.xlsx { render xlsx: :stats, filename: "stats-#{DateTime.now.strftime('%Y-%m-%d')}" } + format.xlsx { render xlsx: '../conferences/stats', filename: "stats-#{DateTime.now.strftime('%Y-%m-%d')}" } end end @@ -251,7 +262,7 @@ class ConferenceAdministrationController < ApplicationController if request.format.xlsx? logger.info "Generating stats.xls" return respond_to do |format| - format.xlsx { render xlsx: :stats, filename: "stats-#{DateTime.now.strftime('%Y-%m-%d')}" } + format.xlsx { render xlsx: '../conferences/stats', filename: "stats-#{DateTime.now.strftime('%Y-%m-%d')}" } end else @registration_count = @registrations.size @@ -277,6 +288,11 @@ class ConferenceAdministrationController < ApplicationController end end end + + @past_conferences = [] + Conference.all.order("start_date DESC").each do |conference| + @past_conferences << conference if conference.is_public && @this_conference.id != conference.id + end end end @@ -354,7 +370,7 @@ class ConferenceAdministrationController < ApplicationController @excel_data[:data] << host_data end return respond_to do |format| - format.xlsx { render xlsx: :stats, filename: "housing" } + format.xlsx { render xlsx: '../conferences/stats', filename: "housing" } end end end @@ -406,8 +422,8 @@ class ConferenceAdministrationController < ApplicationController def administrate_publish_schedule end - def get_stats(html_format = false, id = nil) - @registrations = ConferenceRegistration.where(:conference_id => @this_conference.id).sort { |a,b| (a.user.present? ? (a.user.firstname || '') : '').downcase <=> (b.user.present? ? (b.user.firstname || '') : '').downcase } + def get_stats(html_format = false, id = nil, conference = @this_conference) + @registrations = ConferenceRegistration.where(conference_id: conference.id).sort { |a,b| (a.user.present? ? (a.user.firstname || '') : '').downcase <=> (b.user.present? ? (b.user.firstname || '') : '').downcase } @excel_data = { columns: [ :name, @@ -429,7 +445,6 @@ class ConferenceAdministrationController < ApplicationController :food, :companion, :companion_email, - :allergies, :other, :can_provide_housing, :first_day, @@ -448,7 +463,6 @@ class ConferenceAdministrationController < ApplicationController arrival: [:date, :day], departure: [:date, :day], registration_fees_paid: :money, - allergies: :text, other: :text, first_day: [:date, :day], last_day: [:date, :day], @@ -470,7 +484,6 @@ class ConferenceAdministrationController < ApplicationController food: 'forms.labels.generic.food', companion: 'articles.conference_registration.terms.companion', companion_email: 'articles.conference_registration.terms.companion_email', - allergies: 'forms.labels.generic.allergies', registration_fees_paid: 'articles.conference_registration.headings.fees_paid', other: 'forms.labels.generic.other_notes', can_provide_housing: 'articles.conference_registration.can_provide_housing', @@ -485,6 +498,11 @@ class ConferenceAdministrationController < ApplicationController }, data: [] } + + if conference.id != @this_conference.id + @excel_data[:columns] -= [:name, :email] + end + User.AVAILABLE_LANGUAGES.each do |l| @excel_data[:keys]["language_#{l}".to_sym] = "languages.#{l.to_s}" end @@ -524,10 +542,9 @@ class ConferenceAdministrationController < ApplicationController bike: r.bike.present? ? (view_context._"articles.conference_registration.questions.bike.#{r.bike}") : '', food: r.food.present? ? (view_context._"articles.conference_registration.questions.food.#{r.food}") : '', companion: companion, - companion_email: (housing_data['companions'] || ['']).first, - allergies: r.allergies, + companion_email: (housing_data['companion'] || { 'email' => ''})['email'], registration_fees_paid: r.registration_fees_paid, - other: r.other, + other: r.allergies.present? ? "#{r.allergies}\n\n#{r.other}" : r.other, can_provide_housing: r.can_provide_housing ? (view_context._'articles.conference_registration.questions.bike.yes') : '', first_day: availability[0].present? ? availability[0].strftime("%F %T") : '', last_day: availability[1].present? ? availability[1].strftime("%F %T") : '', @@ -677,12 +694,16 @@ class ConferenceAdministrationController < ApplicationController @housing_data[host_id][:guest_data][guest_id][:warnings][:space] = { actual: (view_context._"forms.labels.generic.#{space.to_s}"), expected: (view_context._"articles.conference_registration.questions.housing.#{guest.housing}")} end - companions = data['companions'] || [] - companions.each do |companion| - user = User.find_user(companion) - if user.present? + if data['companion'].present? + companion = if data['companion']['id'].present? + User.find(data['companion']['id']) + else + User.find_user(data['companion']['email']) + end + + if companion.present? reg = ConferenceRegistration.find_by( - user_id: user.id, + user_id: companion.id, conference_id: @this_conference.id ) if reg.present? && @guests[reg.id].present? @@ -1010,7 +1031,9 @@ class ConferenceAdministrationController < ApplicationController registration.send("#{key.to_s}=", value.present? ? Date.parse(value) : nil) when :companion_email registration.housing_data ||= {} - registration.housing_data['companions'] = [value] + registration.housing_data['companion'] ||= {} + registration.housing_data['companion']['email'] = value + registration.housing_data['companion']['id'] = User.find_user(value) when :preferred_language registration.user.locale = value user_changed = true @@ -1112,7 +1135,7 @@ class ConferenceAdministrationController < ApplicationController do_404 end - return true + return nil end def admin_update_broadcast diff --git a/app/controllers/conferences_controller.rb b/app/controllers/conferences_controller.rb index 5e2dfd1..b619066 100644 --- a/app/controllers/conferences_controller.rb +++ b/app/controllers/conferences_controller.rb @@ -8,7 +8,7 @@ class ConferencesController < ApplicationController def list @page_title = 'articles.conferences.headings.Conference_List' @conference_list = { future: [], passed: [] } - Conference.all.order("start_date DESC").each do | conference | + Conference.all.order("start_date DESC").each do |conference| if conference.is_public || conference.host?(current_user) @conference_list[conference.over? ? :passed : :future] << conference end @@ -337,10 +337,10 @@ class ConferencesController < ApplicationController if @registration.housing_data.blank? ConferenceRegistration.where( conference_id: @this_conference.id, can_provide_housing: [nil, false] - ).where.not(housing_data: nil).each do | r | + ).where.not(housing_data: nil).each do |r| @registration.housing_data = { companions: [ r.user.email ] - } if r.housing_data['companions'].present? && r.housing_data['companions'].include?(current_user.email) + } if r.housing_data['companion'].present? && (r.housing_data['companion']['id'] == current_user.id || r.housing_data['companion']['email'] == current_user.email) end @registration.housing_data ||= { } @@ -358,7 +358,7 @@ class ConferencesController < ApplicationController @workshops = Array.new # put wach workshop into the correct array - Workshop.where(conference_id: @this_conference.id).each do | workshop | + Workshop.where(conference_id: @this_conference.id).each do |workshop| if workshop.active_facilitator?(current_user) @my_workshops << workshop elsif workshop.requested_collaborator?(current_user) @@ -436,7 +436,7 @@ class ConferencesController < ApplicationController def registration_complete?(registration = @registration) completed_steps = registration.steps_completed || [] - required_steps(registration.conference).each do | step | + required_steps(registration.conference).each do |step| return true if step == :workshops return false unless completed_steps.include?(step.to_s) end diff --git a/app/helpers/widgets_helper.rb b/app/helpers/widgets_helper.rb index 9f7bb35..c18fc5a 100644 --- a/app/helpers/widgets_helper.rb +++ b/app/helpers/widgets_helper.rb @@ -100,14 +100,14 @@ module WidgetsHelper id = registration.id html = '' - @housing_data[id][:guests].each do | area, guests | + @housing_data[id][:guests].each do |area, guests| guest_rows = '' - guests.each do | guest_id, guest | + guests.each do |guest_id, guest| status_html = '' - @housing_data[id][:guest_data][guest_id][:errors].each do | error, value | + @housing_data[id][:guest_data][guest_id][:errors].each do |error, value| if value.is_a?(Array) - value.each do | v | + value.each do |v| status_html += content_tag(:li, _("errors.messages.housing.space.#{error.to_s}", vars: v)) end else @@ -115,9 +115,9 @@ module WidgetsHelper end end - @housing_data[id][:guest_data][guest_id][:warnings].each do | error, value | + @housing_data[id][:guest_data][guest_id][:warnings].each do |error, value| if value.is_a?(Array) - value.each do | v | + value.each do |v| status_html += content_tag(:li, _("warnings.messages.housing.space.#{error.to_s}", v)) end else @@ -132,7 +132,7 @@ module WidgetsHelper guest_rows += content_tag :tr, id: "hosted-guest-#{guest_id}" do (content_tag :td, guest[:guest].user.name) + (content_tag :td do - (guest[:guest].city + + (guest[:guest].from + (content_tag :a, (_'actions.workshops.Remove'), href: '#', class: 'remove-guest', data: { guest: guest_id })).html_safe end) + (content_tag :td, status_html.html_safe, class: [:state, status_html.present? ? :unhappy : :happy]) @@ -151,7 +151,7 @@ module WidgetsHelper status_html = '' if @housing_data[id][:warnings].present? && @housing_data[id][:warnings][:space].present? && @housing_data[id][:warnings][:space][area].present? - @housing_data[id][:warnings][:space][area].each do | w | + @housing_data[id][:warnings][:space][area].each do |w| status_html += content_tag(:li, _("warnings.messages.housing.space.#{w.to_s}")) end end @@ -179,18 +179,18 @@ module WidgetsHelper classes = ['host'] id = registration.id - @housing_data[id][:guests].each do | area, guests | + @housing_data[id][:guests].each do |area, guests| max_space = @housing_data[id][:space][area] || 0 area_name = (_"forms.labels.generic.#{area}") status_html = '' if @housing_data[id][:warnings].present? && @housing_data[id][:warnings][:space].present? && @housing_data[id][:warnings][:space][area].present? - @housing_data[id][:warnings][:space][area].each do | w | + @housing_data[id][:warnings][:space][area].each do |w| status_html += content_tag(:div, _("warnings.housing.space.#{w.to_s}"), class: 'warning') end end space_html = content_tag(:h5, area_name + _!(" (#{guests.size.to_s}/#{max_space.to_s})") + status_html.html_safe) guest_items = '' - guests.each do | guest_id, guest | + guests.each do |guest_id, guest| guest_items += content_tag(:li, guest[:guest].user.name, id: "hosted-guest-#{guest_id}") end space_html += content_tag(:ul, guest_items.html_safe) @@ -258,8 +258,12 @@ module WidgetsHelper end def companion(registration) - if registration.housing_data.present? && registration.housing_data['companions'].present? && registration.housing_data['companions'].first.present? - companion_user = User.find_user(registration.housing_data['companions'].first) + if registration.housing_data.present? && registration.housing_data['companion'].present? + companion_user = if registration.housing_data['companion']['id'].present? + User.find(registration.housing_data['companion']['id']) + else + User.find_user(registration.housing_data['companion']['email']) + end if companion_user.present? cr = ConferenceRegistration.where(user_id: companion_user.id).order(created_at: :desc).limit(1).first diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 3e0f999..a719094 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -11,8 +11,7 @@ class UserMailer < ActionMailer::Base def email_confirmation(confirmation) @confirmation = EmailConfirmation.find(confirmation) if confirmation.present? I18n.locale = @confirmation.user.locale if @confirmation.user.locale.present? - @subject = _'email.subject.confirm_email','Please confirm your email address' - mail to: @confirmation.user.named_email, subject: @subject + mail to: @confirmation.user.named_email, subject: clean_subject(_'email.subject.confirm_email','Please confirm your email address') end def registration_confirmation(registration) @@ -20,17 +19,17 @@ class UserMailer < ActionMailer::Base @conference = @registration.conference @user = @registration.user I18n.locale = @user.locale if @user.locale.present? - @subject = @conference.registration_status.to_sym == :pre ? + subject = @conference.registration_status.to_sym == :pre ? _( 'email.subject.pre_registration_confirmed', "Thank you for pre-registering for #{@conference.title}", - :vars => {:conference_title => @conference.title} + vars: {conference_title: @conference.title} ) : _( 'email.subject.registration_confirmed', "Thank you for registering for #{@conference.title}", - :vars => {:conference_title => @conference.title} + vars: {conference_title: @conference.title} ) - mail to: @user.named_email, subject: @subject + mail to: @user.named_email, subject: clean_subject(subject) end def broadcast(host, subject, content, user, conference) @@ -39,9 +38,8 @@ class UserMailer < ActionMailer::Base @banner = nil @conference = Conference.find(conference) if conference.present? @user = User.find(user) if user.present? - @subject = "[#{@conference ? @conference.title : 'Bike!Bike!'}] #{subject}" if @user && @user.named_email - mail to: @user.named_email, subject: @subject + mail to: @user.named_email, subject: clean_subject("[#{@conference ? @conference.title : 'Bike!Bike!'}] #{subject}") end end @@ -55,10 +53,8 @@ class UserMailer < ActionMailer::Base end @message = message @conference = Conference.find(@workshop.conference_id) - @subject = _('email.subject.workshop_facilitator_request', - "Request to facilitate #{@workshop.title} from #{@requester.name}", - :vars => {:workshop_title => @workshop.title, :requester_name => @requester.firstname}) - mail to: addresses, reply_to: addresses + [@requester.named_email], subject: @subject + subject = ActionView::Base.full_sanitizer.sanitize(_('email.subject.workshop_facilitator_request', vars: { workshop_title: @workshop.title, requester_name: @requester.firstname })) + mail to: addresses, reply_to: addresses + [@requester.named_email], subject: clean_subject(subject) end def workshop_facilitator_request_approved(workshop, user) @@ -66,10 +62,7 @@ class UserMailer < ActionMailer::Base @conference = Conference.find(@workshop.conference_id) @user = User.find(user) if user.present? I18n.locale = @user.locale if @user.locale.present? - @subject = (_'email.subject.workshop_request_approved', - "You have been added as a facilitator of #{@workshop.title}", - :vars => {:workshop_title => @workshop.title}) - mail to: @user.named_email, subject: @subject + mail to: @user.named_email, subject: clean_subject(_('email.subject.workshop_request_approved', vars: { workshop_title: @workshop.title })) end def workshop_facilitator_request_denied(workshop, user) @@ -77,10 +70,7 @@ class UserMailer < ActionMailer::Base @conference = @workshop.conference @user = User.find(user) if user.present? I18n.locale = @user.locale if @user.present? && @user.locale.present? - @subject = (_'email.subject.workshop_request_denied', - "Your request to facilitate #{@workshop.title} has been denied", - :vars => {:workshop_title => @workshop.title}) - mail to: @user.named_email, subject: @subject + mail to: @user.named_email, subject: clean_subject(_'email.subject.workshop_request_denied', vars: { workshop_title: @workshop.title }) end def workshop_translated(workshop, data, locale, user, translator) @@ -91,13 +81,10 @@ class UserMailer < ActionMailer::Base @user = User.find(user) if user.present? I18n.locale = @user.locale if @user.present? && @user.locale.present? @translator = User.find(translator) if translator.present? - @subject = (_'email.subject.workshop_translated', - "The #{@locale_name} translation for #{@workshop.title} has been modified", - vars: {language: @language_name, workshop_title: @workshop.title}) @wrapper_id = :full_width - mail to: @user.named_email, subject: @subject + mail to: @user.named_email, subject: clean_subject(_'email.subject.workshop_translated', vars: { language: @language_name, workshop_title: @workshop.title }) end def workshop_original_content_changed(workshop, data, user, translator) @@ -106,9 +93,6 @@ class UserMailer < ActionMailer::Base @user = User.find(user) if user.present? I18n.locale = @user.locale if @user.present? && @user.locale.present? @translator = User.find(translator) if translator.present? - @subject = (_'email.subject.workshop_original_content_changed', - "Original content for #{@workshop.title} has been modified", - vars: {workshop_title: @workshop.title}) @data.each do |field, values| diff = Diffy::Diff.new(values[:old], values[:new]) @data[field][:diff] = { @@ -119,7 +103,7 @@ class UserMailer < ActionMailer::Base @wrapper_id = :full_width - mail to: @user.named_email, subject: @subject + mail to: @user.named_email, subject: clean_subject(_'email.subject.workshop_original_content_changed', vars: { workshop_title: @workshop.title }) end def workshop_comment(workshop, comment, user) @@ -128,17 +112,16 @@ class UserMailer < ActionMailer::Base @user = User.find(user) if user.present? I18n.locale = @user.locale if @user.present? && @user.locale.present? - if @comment.reply? - @subject = (_'email.subject.workshop_comment.reply', vars: { user_name: @comment.user.name }) - else - @subject = (_'email.subject.workshop_comment.comment', vars: { user_name: @comment.user.name, workshop_title: @workshop.title }) - end + subject = if @comment.reply? + (_'email.subject.workshop_comment.reply', vars: { user_name: @comment.user.name }) + else + (_'email.subject.workshop_comment.comment', vars: { user_name: @comment.user.name, workshop_title: @workshop.title }) + end - mail to: @user.named_email, subject: @subject + mail to: @user.named_email, subject: clean_subject(subject) end def error_report(subject, message, report, exception, request, params, user, time = nil) - @subject = subject @message = message @report = report @exception = exception @@ -146,25 +129,23 @@ class UserMailer < ActionMailer::Base @params = params @time = time @user = User.find(user) if user.present? - mail to: 'goodgodwin@hotmail.com', subject: @subject + mail to: 'goodgodwin@hotmail.com', subject: clean_subject(subject) end def contact(from, subject, message, email_list) @message = message - @subject = subject @from = from.is_a?(Integer) ? User.find(from) : from - mail to: email_list.join(', '), subject: @subject, reply_to: @from.is_a?(User) ? @from.named_email : @from + mail to: email_list.join(', '), subject: clean_subject(subject), reply_to: @from.is_a?(User) ? @from.named_email : @from end def contact_details(from, subject, message, request, params) @message = message - @subject = "Details for: \"#{subject}\"" @from = from.is_a?(Integer) ? User.find(from) : from @request = request @params = params - mail to: 'goodgodwin@hotmail.com', subject: @subject + mail to: 'goodgodwin@hotmail.com', subject: clean_subject("Details for: \"#{subject}\"") end private @@ -178,4 +159,10 @@ class UserMailer < ActionMailer::Base end default_url_options[:host] = @host end + + def clean_subject(subject) + subject = ActionView::Base.full_sanitizer.sanitize(subject) unless Rails.env.test? + @subject = subject + return subject + end end diff --git a/app/views/conference_administration/_select_guest_table.html.haml b/app/views/conference_administration/_select_guest_table.html.haml index e33c2fc..b0075e4 100644 --- a/app/views/conference_administration/_select_guest_table.html.haml +++ b/app/views/conference_administration/_select_guest_table.html.haml @@ -16,23 +16,27 @@ %table.guests.admin-edit %tr %th.corner + %th=_'forms.labels.generic.organization' %th=_'forms.labels.generic.city' %th=_'forms.labels.generic.housing' %th=_'articles.admin.housing.headings.arrival_departure' %th=_'articles.conference_registration.headings.companion' %th=_'forms.labels.generic.food' - %th=_'forms.labels.generic.allergies' %th=_'forms.labels.generic.other' - @guests.each do | id, registration | %tr.selectable{class: get_housing_match(host, registration, space).to_s.gsub('_', '-'), data: {host: host.id, guest: id, space: space}} %th=registration.user.name + %td + - if registration.user.organizations.present? + = registration.user.organizations.first.name + - else + %em None %td=registration.city %td=registration.housing.present? ? (_"articles.conference_registration.questions.housing.#{registration.housing}") : '' %td=date_span(registration.arrival.to_date, registration.departure.to_date) - companion = companion(registration) %td=companion.present? ? (companion.is_a?(User) ? companion.named_email : (_"articles.conference_registration.terms.registration_status.#{companion}")) : '' %td=registration.food.present? ? (_"articles.conference_registration.questions.food.#{registration.food}") : '' - %td=registration.allergies %td .p=registration.other diff --git a/app/views/conference_administration/_stats.html.haml b/app/views/conference_administration/_stats.html.haml index 5cd1972..0600bd7 100644 --- a/app/views/conference_administration/_stats.html.haml +++ b/app/views/conference_administration/_stats.html.haml @@ -16,6 +16,11 @@ = (@completed_registrations || 0) > 0 ? "#{@donation_count} (#{number_to_percentage(@donation_count / @completed_registrations.to_f * 100.0)})" : "0" = data_set(:h3, 'articles.admin.stats.headings.donation_total') do = "$#{@donations || 0.00}" - .actions - = link_to (_'links.download.Excel'), administration_step_path(@this_conference.slug, :stats, :format => :xlsx), class: [:button, :download] - = link_to (_'links.download.Organizations_Excel'), administration_step_path(@this_conference.slug, :organizations, :format => :xlsx), class: [:button, :download, :subdued] + .actions.center + = link_to (_'links.download.Excel'), administration_step_path(@this_conference.slug, :stats, format: :xlsx), class: [:button, :download] + = link_to (_'links.download.Organizations_Excel'), administration_step_path(@this_conference.slug, :organizations, format: :xlsx), class: [:button, :download, :subdued] += columns(medium: 12) do + %h3=_'articles.admin.stats.headings.past_stats' + %ul.actions.center + - @past_conferences.each do |conference| + = link_to conference.title, previous_stats_path(@this_conference.slug, conference.slug, format: :xlsx), class: [:button, :download] diff --git a/app/views/conferences/_payment.html.haml b/app/views/conferences/_payment.html.haml deleted file mode 100644 index a76633d..0000000 --- a/app/views/conferences/_payment.html.haml +++ /dev/null @@ -1,30 +0,0 @@ -= columns(medium: 12) do - - if @registration.registration_fees_paid.present? - %p - %strong=_'articles.conference_registration.paragraphs.Payment_Made', :p, vars: { fees_paid: (number_to_currency @registration.registration_fees_paid, unit: '$') } - = _'articles.conference_registration.paragraphs.Payment_Add' - = @this_conference.payment_message.html_safe if @this_conference.payment_message.present? - - elsif @this_conference.payment_message.present? - = @this_conference.payment_message.html_safe - - else - %p=@this_conference.payment_message || (_'articles.conference_registration.paragraphs.Payment', :p) -= columns(large: 9, push: 1) do - = show_errors :payment - = form_tag register_path(@this_conference.slug), class: :payment do - = hidden_field_tag :button, :payment - - payment_amounts = @this_conference.payment_amounts.present? ? @this_conference.payment_amounts : Conference.default_payment_amounts - .graded-options{class: "option-count-#{payment_amounts.size}"} - - payment_amounts.each_with_index do | amount, i | - = button :amount_25, name: :amount, value: amount.to_f.to_s, class: "option-#{i + 1}" do - =_! (number_to_currency amount, unit: '$') - = form_tag register_path(@this_conference.slug), class: ['custom-payment', :centered] do - %span.currency=_!'$' # TODO: this needs to be localized - = numberfield :amount, nil, required: true, step: 0.01, min: 0.00, label: false - = button :custom_amount, value: :payment - %p=_'articles.conference_registration.paragraphs.currency','(amounts are in $USD)' - = form_tag register_path(@this_conference.slug), class: :payment do - = hidden_field_tag :button, :payment - .actions.skip - = button :skip, name: :amount, value: '0.0' - -= columns(large: 2) diff --git a/app/views/conferences/_questions.html.haml b/app/views/conferences/_questions.html.haml deleted file mode 100644 index c019a55..0000000 --- a/app/views/conferences/_questions.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -= columns(medium: 12) do - %p=_'articles.conference_registration.paragraphs.Registration_Info', :p, vars: { city: @this_conference.city_name } -= form_tag register_path(@this_conference.slug), class: [:centered, :clearfix] do - = columns(medium: 12) do - = radiobuttons :housing, ConferenceRegistration.all_housing_options, @registration.housing, 'articles.conference_registration.questions.housing', heading: 'articles.conference_registration.headings.housing', vertical: true, big: true, inline: true - = fieldset :hosting_dates, heading: 'articles.conference_registration.headings.arrival_and_departure', vars: { city: @this_conference.city_name } do - = selectfield :arrival, @registration.arrival || @this_conference.start_date, conference_days_options_list(:before_plus_one) - = selectfield :departure, @registration.departure || @this_conference.start_date, conference_days_options_list(:after_minus_one) - = radiobuttons :bike, ConferenceRegistration.all_bike_options, @registration.bike, 'articles.conference_registration.questions.bike', heading: 'articles.conference_registration.headings.bike', inline: true, big: true - = radiobuttons :food, ConferenceRegistration.all_food_options, @registration.food, 'articles.conference_registration.questions.food', heading: 'articles.conference_registration.headings.food', inline: true, big: true - = emailfield :companion, (@registration.housing_data['companions'] || [nil]).first, heading: 'articles.conference_registration.headings.companion', help: 'articles.conference_registration.paragraphs.companion', big: true - = textfield :allergies, @registration.allergies, heading: 'articles.conference_registration.headings.allergies' - = textarea :other, @registration.other, plain: true, heading: 'articles.conference_registration.headings.other' - = button :register, value: :questions diff --git a/app/views/registration_steps/_payment_form.html.haml b/app/views/registration_steps/_payment_form.html.haml index deeff6a..2d0d7c3 100644 --- a/app/views/registration_steps/_payment_form.html.haml +++ b/app/views/registration_steps/_payment_form.html.haml @@ -11,14 +11,16 @@ %p.center=_"articles.conference_registration.paragraphs.currency_details", :p, vars: { currency: (_"currencies.#{(@currencies || [@currency]).first}.displayName-count-other") } = save_registration_step do .registration-step-options - - if @currencies.present? && @currencies.length > 1 - = radiobuttons :currency, (@currencies.map { |c| [(_"currencies.#{c}.displayName-count-other"), c] }), @currency .options.graded-options{class: "option-count-#{@amounts.size}"} - @amounts.each_with_index do |option, i| - = button (number_to_currency option, unit: '$'), value: option, name: :value, class: [:unstyled, "option-#{i + 1}"] + = button "#{number_to_currency option, unit: '$'} #{_!@currency}".html_safe, value: option, name: :value, class: [:unstyled, "option-#{i + 1}"] + .option-space .custom-option - -# if Rails.env.test? - =# text_field_tag :custom_value, nil - -# else = number_field_tag :custom_value, 50.0, step: 0.05, min: 0.05 = button :custom_amount, name: :custom_amount, value: :custom, class: :unstyled + - if @currencies.present? && @currencies.length > 1 + .option-space + .setting-option + %p Change currency to: + - (@currencies - [@currency]).each do |c| + = button (_"currencies.#{c}.displayName-count-other"), name: :currency, value: c, class: :unstyled diff --git a/app/views/registration_steps/_review.html.haml b/app/views/registration_steps/_review.html.haml index ba63d20..763a2a5 100644 --- a/app/views/registration_steps/_review.html.haml +++ b/app/views/registration_steps/_review.html.haml @@ -41,8 +41,22 @@ = row do = columns(medium: 12) do %h3=_'articles.workshops.headings.Workshops', :t - %p=_'articles.conference_registration.paragraphs.workshops', :p + - if @this_conference.workshop_info.present? + = richtext @this_conference.workshop_info + - else + %p=_'articles.conference_registration.paragraphs.workshops', :p .actions.centered .buttons = link_to (_'articles.conference_registration.actions.View_Workshops'), workshops_path(@this_conference), class: :button - = link_to (_'actions.workshops.create'), create_workshop_path(@this_conference), class: [:button, :modify] \ No newline at end of file + = link_to (_'actions.workshops.create'), create_workshop_path(@this_conference), class: [:button, :modify] +- if @my_workshops.present? + = row do + = columns(medium: 12) do + %h3=_'articles.workshops.headings.Your_Workshops' + = render 'workshops/workshop_previews', workshops: @my_workshops += row do + = columns(medium: 12) do + %h3=_'articles.workshops.headings.Workshops_that_you_would_like_to_attend' + %p=_'articles.workshops.paragraphs.Workshops_that_you_would_like_to_attend', :p + - if @interested_workshops.present? + = render 'workshops/workshop_previews', workshops: @interested_workshops diff --git a/app/views/workshops/_form.html.haml b/app/views/workshops/_form.html.haml deleted file mode 100644 index b1ae173..0000000 --- a/app/views/workshops/_form.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -= form_for @workshop, url: conference_workshops_path(@conference, @workshop) do |f| - .columns - = f.text_field :title - = f.text_field :slug - .columns.medium-4 - %h2=_'workshop.form.help.title', :t - =_'workshop.form.help', :p - .columns.medium-8 - = f.text_area :info - = f.number_field :workshop_stream_id - = f.number_field :workshop_presentation_style - .columns - = f.actions :save diff --git a/app/views/workshops/_show.html.haml b/app/views/workshops/_show.html.haml index 82ac924..381275d 100644 --- a/app/views/workshops/_show.html.haml +++ b/app/views/workshops/_show.html.haml @@ -11,7 +11,7 @@ %span.interest-text=interest_text(workshop) = richtext workshop.info - if preview.blank? && translations_available_for_editing - .actions + .actions.center - translations_available_for_editing.each do |locale| = link_to (_'actions.workshops.Translate', "Translate into #{language_name(locale)}", :vars => {:language => language_name(locale)}), translate_workshop_url(workshop.conference.slug, workshop.id, locale), :class => [:button, :translate] = columns(medium: 6) do diff --git a/app/views/workshops/_workshop_previews.html.haml b/app/views/workshops/_workshop_previews.html.haml index 7892c7a..fc793dc 100644 --- a/app/views/workshops/_workshop_previews.html.haml +++ b/app/views/workshops/_workshop_previews.html.haml @@ -1,8 +1,9 @@ +- depth ||= 4 %ul.workshop-list - workshops.sort_by{ |w| w.title.downcase }.each do |w| - is_interested = w.interested?(current_user) %li{class: [is_interested ? :interested : nil]} - %h4.title=_!(w.title) + = content_tag("h#{depth}", w.title, class: :title) .workshop-interest - if w.can_show_interest?(current_user) = form_tag toggle_workshop_interest_path(w.conference.slug, w.id), class: 'js-xhr' do @@ -10,6 +11,6 @@ %span.interest-button=interest_button(w) - elsif w.interested_count > 0 %span.interest-text=interest_text(w) - .workshop-description=richtext w.info, 4 + .workshop-description=richtext w.info, depth .actions.right = link_to (_'articles.workshops.info.read_more'), view_workshop_path(w.conference.slug, w.id), class: ['workshop-link', :button, :small] diff --git a/app/views/workshops/delete.html.haml b/app/views/workshops/delete.html.haml index 68661b3..1b68471 100644 --- a/app/views/workshops/delete.html.haml +++ b/app/views/workshops/delete.html.haml @@ -5,7 +5,7 @@ %h2=_'articles.workshops.headings.Delete_Workshop',"Are you sure you want to delete the workshop: #{@workshop.title}?", vars: {title: "#{@workshop.title}".html_safe} %p=_'articles.workshops.paragraphs.Delete_Workshop' = form_tag delete_workshop_path(@this_conference.slug, @workshop.id), class: 'composition' do - .actions + .actions.center = button :confirm, value: :confirm, class: :delete - = button :cancel, value: :cancel + = button :cancel, value: :cancel, class: :back diff --git a/app/views/workshops/index.html.haml b/app/views/workshops/index.html.haml index 94e07d9..320090b 100644 --- a/app/views/workshops/index.html.haml +++ b/app/views/workshops/index.html.haml @@ -12,13 +12,8 @@ = row do = columns(medium: 12) do %p=_'articles.workshops.paragraphs.Workshops', :p + .actions.center + = link_to (_'actions.workshops.create','New Workshop'), create_workshop_path(@this_conference.slug), class: [:button, :modify] if @this_conference.registration_open = row do = columns(medium: 12) do - %h3=_'articles.workshops.headings.Your_Workshops' - = render 'workshops/workshop_previews', workshops: @my_workshops - = link_to (_'actions.workshops.create','New Workshop'), create_workshop_path(@this_conference.slug), class: [:button, :modify] if @conference.registration_open - = row do - = columns(medium: 12) do - %h3=_'articles.conference_registration.headings.All_Workshops' - -#%h3 All Workshops weather you like it or not - = render 'workshops/workshop_previews', workshops: @workshops \ No newline at end of file + = render 'workshops/workshop_previews', workshops: @workshops, depth: 3 \ No newline at end of file diff --git a/app/views/workshops/new.html.haml b/app/views/workshops/new.html.haml index 08299fa..8bd979b 100644 --- a/app/views/workshops/new.html.haml +++ b/app/views/workshops/new.html.haml @@ -33,7 +33,7 @@ = columns(medium: 12) do = textarea :notes, @workshop.notes, warning: 'articles.workshops.paragraphs.notes' = columns(medium: 12) do - .actions.next-prev + .actions.center = button :save, value: :save = button :cancel, value: :cancel, class: :subdued, formnovalidate: true diff --git a/app/views/workshops/show.html.haml b/app/views/workshops/show.html.haml index 6001f07..a41ce41 100644 --- a/app/views/workshops/show.html.haml +++ b/app/views/workshops/show.html.haml @@ -10,6 +10,6 @@ = render 'workshops/show', workshop: @workshop, translations_available_for_editing: @translations_available_for_editing, preview: false = row do = columns(medium: 12) do - .actions.next-prev + .actions.center = (link_to (_'actions.workshops.Edit'), edit_workshop_path(@this_conference.slug, @workshop.id), :class => [:button, :modify]) if @workshop.can_edit?(current_user) = (link_to (_'actions.workshops.Delete'), delete_workshop_path(@this_conference.slug, @workshop.id), :class => 'button delete') if @workshop.can_delete?(current_user) diff --git a/config/locales/en.yml b/config/locales/en.yml index 74bf774..6e3fa97 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1380,6 +1380,7 @@ en: so far as well as download more detailed data in spreadsheets. headings: bikes: Bikes + past_stats: Statistics from Previous Bike!Bike!s donation_count: Number of donations donation_total: Total donated food: @@ -1449,7 +1450,7 @@ en: instead of a guest form. If you want to consider surrounding cities as well, enter the distance from %{city} that you wish to be included as providers. Cities are measured from center to center. - housing: Pair each housing provider with a list of guests. + housing: Pair each housing provider with a list of guests. Try to match guests with hosts and other guests who are good matches and respect their requests, but also keep in mind that we cannot always respect all requests and part of the Bike!Bike! experience is getting to know new people. locations: heading: Locations description: Locations are used to schedule workshops, events, and meals. @@ -1705,7 +1706,7 @@ en: payment_form: Registration Fee Amount org_select: Which organization are you a member of? payment_type: Registration Fee Method - housing_other: Anything else? + housing_other: Other considerations housing_allergies: Do you have any allergies? housing_food: What are your eating habits? housing_bike: Would you like to borrow a bike? @@ -1753,6 +1754,7 @@ en: Workshops: Workshops workshops: Workshops Your_Workshops: Your Workshops + Workshops_that_you_would_like_to_attend: Workshops that you would like to_attend payment_confirm: Please confirm your payment Preview: Preview city: City @@ -1814,7 +1816,7 @@ en: payment_form: Please select one of the predefined options below or enter a custom amount. org_select: Please select the organization that you will be representing. This information will be used to help us contact and invite your organization next year and to populate the list of known organizations that will be displayed on bikecollectives.org. If you are involved with multiple oganizations, please select one for now, you will be able to add more organizations at a later date. payment_type: Registration is by donation but it enables us to pay for spaces, food, equipment, and more. If you can, paying now via PayPal enables us to prepare for the conference without risk of paying out of pocket. Otherwise, pleging to pay on arrival will help us to get a rough idea of what we can and cannot afford. - housing_other: Is there anything else that you would like to let us know? + housing_other: Do you have any special needs or considerations that we should know about for your stay such as allergies, disabilities, or a need for child care? Letting us know in advance will help us determine the best place for you to stay and make any necessary preparations for te conference itself. housing_allergies: Let us know if you have any allergies that we should be made aware of. housing_food: Please let us know your eating habits by selecting the option that best describes the type of food that you eat. We will use this to decide the best types of meals to prepare and how much food we will need. housing_bike: In order for us to get an idea of how many bikes we will need to prepare, please let us know if you would like to borrow a bike from us. @@ -2083,12 +2085,14 @@ en: notes: Notes Workshops: Workshops Your_Workshops: Your Workshops + Workshops_that_you_would_like_to_attend: Workshops that you would like to attend facilitate: Request to Facilitate ‘%{workshop_title}’ add_facilitator: Add a facilitator needs_facilitators: Looking for help? Comments: Comments Schedule: Schedule paragraphs: + Workshops_that_you_would_like_to_attend: Add workshops to your schedule by pressing the "+1" button beside a workshop. This will help you keep track of the wokshops that you would like to attend and help organizers to create a better schedule. Proposed_Workshops: Would you like to facilitate your own workshop? Simply register and visit the workshops page. If you have already registered you can access the page by restarting the registration process. @@ -2223,6 +2227,7 @@ en: send_to: Send To street_address: Street Address city: City + organization: Organization subregion: State / Province country: Country postal_code: Postal Code diff --git a/config/routes.rb b/config/routes.rb index cb19711..1095a73 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,7 +18,6 @@ BikeBike::Application.routes.draw do # post 'update' => 'conferences#registration_update', as: :registration_update get ':step' => 'conferences#register', as: :register_step - # get ':button/:confirmation_token' => 'conferences#register', as: :register_paypal_confirm end # Administration @@ -26,6 +25,7 @@ BikeBike::Application.routes.draw do root 'conference_administration#administration', as: :administrate_conference get ':step' => 'conference_administration#administration_step', as: :administration_step + get 'stats/:conference_slug' => 'conference_administration#previous_stats', as: :previous_stats post 'update/:step' => 'conference_administration#admin_update', as: :administration_update get 'events/edit/:id' => 'conference_administration#edit_event', as: :edit_event get 'locations/edit/:id' => 'conference_administration#edit_location', as: :edit_location diff --git a/db/schema.rb b/db/schema.rb index 83bf52f..931b775 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -110,7 +110,6 @@ ActiveRecord::Schema.define(version: 20170609030149) do t.boolean "is_participant" t.boolean "is_volunteer" t.string "confirmation_token" - t.binary "data_old" t.string "email" t.boolean "complete" t.boolean "completed" diff --git a/features/registration.feature b/features/registration.feature index c8d6ee7..c10fcd4 100644 --- a/features/registration.feature +++ b/features/registration.feature @@ -13,7 +13,7 @@ Feature: Registration When I enter my email address And press confirm email - Then I should see 'Confirm Email' + Then I should see 'Confirmation Sent' And I should get a 'confirmation' email When I click on the 'Confirm' link in the email @@ -80,7 +80,7 @@ Feature: Registration Then I should see 'Do you plan to attend the group ride?' When I click on the 'Yes' button - Then I should see 'Anything else?' + Then I should see 'Other considerations' When I fill in other with 'Thanks!' And click the 'Next' button @@ -90,7 +90,7 @@ Feature: Registration Then I should see 'Registration Fee Amount' When I click on the '$25.00' button - Then I should get a 'Thank you for registering for Bike!Bike! 2025' email + Then I should get a 'Thank you for registering' email And I should see 'Your registration is complete' And I should see 'Seattle' And see 'Bike Works' @@ -134,7 +134,7 @@ Feature: Registration When I enter my email address And press confirm email - Then I should see 'Confirm Email' + Then I should see 'Confirmation Sent' And I should get a 'confirmation' email When I click on the 'Confirm' link in the email @@ -196,7 +196,7 @@ Feature: Registration And click on 'pay now with PayPal' And click on the '$25.00' button And click the 'Confirm' button - Then I should get a 'Thank you for registering for Bike!Bike! 2025' email + Then I should get a 'Thank you for registering' email And I should see 'Moncton' And I should see 'Coopérative La Bikery Cooperative' And I should see 'I don't need a place to stay' @@ -215,7 +215,7 @@ Feature: Registration When I enter my email address And press confirm email - Then I should see 'Confirm Email' + Then I should see 'Confirmation Sent' And I should get a 'confirmation' email When I click on the 'Confirm' link in the email @@ -263,7 +263,7 @@ Feature: Registration And click on the 'No' button And click the 'Next' button And click on the 'Not now' button - Then I should get a 'Thank you for registering for Bike!Bike! 2025' email + Then I should get a 'Thank you for registering' email And I should see 'Ecum Secum' And I should see 'Because Reasons' And I should see 'I am vegetarian' @@ -281,7 +281,7 @@ Feature: Registration When I enter my email address And press confirm email - Then I should see 'Confirm Email' + Then I should see 'Confirmation Sent' And I should get a 'confirmation' email When I click on the 'Confirm' link in the email @@ -379,7 +379,7 @@ Feature: Registration When I enter my email address as 'me@bikebike.org' And press confirm email - Then I should see 'Confirm Email' + Then I should see 'Confirmation Sent' And I should get a 'confirmation' email When I click on the 'Confirm' link in the email @@ -543,7 +543,7 @@ Scenario: Housing providers can enter incorrect data and fix it When I enter my email address And press confirm email - Then I should see 'Confirm Email' + Then I should see 'Confirmation Sent' And I should get a 'confirmation' email When I click on the 'Confirm' link in the email diff --git a/features/step_definitions/interface_steps.rb b/features/step_definitions/interface_steps.rb index 1dbe7a4..9a347f9 100644 --- a/features/step_definitions/interface_steps.rb +++ b/features/step_definitions/interface_steps.rb @@ -162,5 +162,6 @@ Then /^(?:my |the )([A-Z][a-z]+ )?(workshop|conference|user|conference registrat object = TestState.send("last_#{type.gsub(' ', '_')}") attribute = attribute.gsub(' ', '_').downcase actual_value = locale ? object.get_column_for_locale!(attribute, get_locale(locale)) : object.send(attribute) + actual_value = ActionView::Base.full_sanitizer.sanitize(actual_value) expect(actual_value).send(negate ? :not_to : :to, (be == value)) end diff --git a/features/support/env.rb b/features/support/env.rb index 8265f30..91dcfcf 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -69,12 +69,32 @@ After do DatabaseCleaner.clean end -AfterStep do +def step_wait_time(keyword) + # give additional wait time to Given and When steps + + if keyword == 'And' || keyword == 'But' + keyword = @_last_keyword + end + + @_last_keyword = keyword + + case keyword + when 'Given' + return 1 + when 'When' + return 3 + end + + return 0.5 +end + +AfterStep do |scenario, step| # capture used selectors to generate css coverage - Marmara.record(page) if Marmara.recording? + Marmara.record(step.source.last.keyword) if Marmara.recording? # take some extra time between steps if we're recording - sleep(0.5) if LinguaFranca.recording? + keyword = step.source.last.keyword.strip + sleep(step_wait_time(keyword)) if LinguaFranca.recording? end Cucumber::Rails::Database.javascript_strategy = :transaction @@ -84,5 +104,4 @@ Geocoder.configure(timeout: 60) at_exit do Marmara.stop_recording if Marmara.recording? - # LinguaFranca.capture_translations if LinguaFranca.recording? end diff --git a/features/support/helper.rb b/features/support/helper.rb index 3171da5..15b9a49 100644 --- a/features/support/helper.rb +++ b/features/support/helper.rb @@ -85,7 +85,7 @@ end def emails_to(email_address, subject = nil) ActionMailer::Base.deliveries.select do |mail| mail.to.include?(email_address) && - (subject.nil? || mail.subject.downcase.include?(subject.downcase)) + (subject.nil? || ActionView::Base.full_sanitizer.sanitize(mail.subject).downcase.include?(subject.downcase)) end end diff --git a/features/support/paths.rb b/features/support/paths.rb index c94beca..78947e0 100644 --- a/features/support/paths.rb +++ b/features/support/paths.rb @@ -22,7 +22,7 @@ module NavigationHelpers path = :confirm args << TestState.last_token when /^google maps$/ - path = /^https?:\/\/www\.google\.com\/maps\/place\/.*/ + path = /^https?:\/\/www\.google\.com\/maps\/.*/ end if path.is_a?(Symbol) diff --git a/features/workshops.feature b/features/workshops.feature index 4487c8a..d6405c1 100644 --- a/features/workshops.feature +++ b/features/workshops.feature @@ -48,7 +48,7 @@ Feature: Workshops And should see 'Education' When I click the 'Workshops' link - Then I should see two workshops + Then I should see one workshop When I click on the 'Details' link Then I should see 'Tools' @@ -254,9 +254,7 @@ Feature: Workshops And I am on the workshops page - Then I should see seven workshops - And I should see two workshops under 'Your Workshops' - And see five workshops under 'All Other Workshops' + Then I should see five workshops And I should see '3-Speed Hubs and the trouble with Sexism No one is interested in this workshop yet' And see 'Bike Polo! Mallet making and game 5 people are interested in this workshop' And see 'The future of Bike! Bike! 10 people are interested in this workshop'