diff --git a/app/assets/stylesheets/_application.scss b/app/assets/stylesheets/_application.scss index 84aa1b6..c65e7cc 100644 --- a/app/assets/stylesheets/_application.scss +++ b/app/assets/stylesheets/_application.scss @@ -1054,6 +1054,10 @@ ul.warnings li, @include _(border-radius, 50%); @include default-box-shadow(top, 2); } + + &.make-room { + margin-bottom: 2em; + } } .warning-info { @@ -2847,6 +2851,16 @@ html[data-lingua-franca-example="html"] { } } +.major-group { + border-bottom: 0.333em solid #EEE; + padding-bottom: 2em; + margin-bottom: 1em; + + &:last-child { + border-bottom: 0; + } +} + #main .workshop-list { list-style: none; padding: 0; diff --git a/app/controllers/conferences_controller.rb b/app/controllers/conferences_controller.rb index 89a0834..d6e32b9 100644 --- a/app/controllers/conferences_controller.rb +++ b/app/controllers/conferences_controller.rb @@ -1008,19 +1008,36 @@ class ConferencesController < ApplicationController when 'broadcast' @subject = params[:subject] @body = params[:body] + @send_to = params[:send_to] @register_template = :administration if params[:button] == 'send' + view_context.broadcast_to(@send_to).each do | user | + UserMailer.send_mail :broadcast do + [ + "#{request.protocol}#{request.host_with_port}", + @subject, + @body, + user, + @this_conference + ] + end + end return redirect_to administration_step_path(@this_conference.slug, :broadcast_sent) elsif params[:button] == 'preview' + @send_to_count = view_context.broadcast_to(@send_to).size @broadcast_step = :preview elsif params[:button] == 'test' @broadcast_step = :test - UserMailer.delay.broadcast( - "#{request.protocol}#{request.host_with_port}", - @subject, - @body, - current_user, - @this_conference) + UserMailer.send_mail :broadcast do + [ + "#{request.protocol}#{request.host_with_port}", + @subject, + @body, + current_user, + @this_conference + ] + end + @send_to_count = view_context.broadcast_to(@send_to).size end return render 'conferences/register' when 'locations' diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f63bda0..007fa71 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -878,15 +878,72 @@ module ApplicationHelper return html.html_safe end - def broadcast_methods - [ + def broadcast_to(to, conference = nil) + conference ||= @this_conference || @conference + + users = [] + + case to.to_sym + when :registered + ConferenceRegistration.where(conference_id: conference.id).each do | r | + users << r.user if ((r.steps_completed || []).include? 'questions') && r.user.present? + end + when :pre_registered + ConferenceRegistration.where(conference_id: conference.id).each do | r | + users << r.user if ((r.steps_completed || []).include? 'contact_info') && r.user.present? + end + when :workshop_facilitators + user_hash = {} + Workshop.where(conference_id: conference.id).each do | w | + w.active_facilitators.each do | u | + user_hash[u.id] ||= u if u.present? + end + end + users = user_hash.values + when :unregistered + ConferenceRegistration.where(conference_id: conference.id).each do | r | + users << r.user unless ((r.steps_completed || []).include? (conference.registration_status == :open ? 'questions' : 'contact_info')) || r.user.nil? + end + when :housing_providers + ConferenceRegistration.where(conference_id: conference.id, can_provide_housing: true).each do | r | + users << r.user if r.user.present? + end + when :guests + ConferenceRegistration.where(conference_id: conference.id, housing: 'house').each do | r | + users << r.user if r.user.present? + end + when :all + User.all.each do | u | + users << u if u.present? && (u.is_subscribed.nil? || u.is_subscribed) + end + end + + puts "Users:" + users.each do | u | + puts "\t#{u.id}\t#{u.email}" + end + return users + end + + def broadcast_options(conference = nil) + conference ||= @this_conference || @conference + + options = [ :registered, - :confirmed_registrations, - :unconfirmed_registrations, - :unconfirmed_registrations, + :pre_registered, :workshop_facilitators, - :everyone, + :unregistered, + :housing_providers, + :guests, + :all ] + + if conference.registration_status != :open + options -= [:registered, :guests] + options -= [:pre_registered] unless conference.registration_status != :pre + end + + return options end def admin_steps @@ -982,8 +1039,8 @@ module ApplicationHelper @confirmation_dlg ||= true args[:data] ||= {} args[:data][:confirmation] = true - button_tag args do - (button_name.to_s + content_tag(:template, confirmation_text, class: 'message')).html_safe + button_tag button_name, args do + ((_"forms.actions.generic.#{button_name.to_s}") + content_tag(:template, confirmation_text, class: 'message')).html_safe end end diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 1458e95..19d755b 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -36,8 +36,8 @@ class UserMailer < ActionMailer::Base @content = content @banner = nil @conference = Conference.find(conference) if conference.present? - @user = Conference.find(user) if user.present? - @subject = "[#{conference ? conference.title : 'Bike!Bike!'}] #{subject}" + @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 end diff --git a/app/views/conferences/_workshops.html.haml b/app/views/conferences/_workshops.html.haml index 9083203..6c728c1 100644 --- a/app/views/conferences/_workshops.html.haml +++ b/app/views/conferences/_workshops.html.haml @@ -1,6 +1,6 @@ = columns(medium: 12) do %h2=_@page_title -= columns(medium: 12) do += columns(medium: 12, class: 'major-group') do - if @my_workshops.present? %h3=_'articles.conference_registration.headings.Your_Workshops' %p=_'articles.conference_registration.paragraphs.Your_Workshops', :p @@ -9,17 +9,16 @@ %p=_'articles.conference_registration.paragraphs.Create_Workshop', :p = link_to (_'articles.conference_registration.headings.Add_Workshop'), create_workshop_path(@this_conference.slug), class: :button - if @requested_workshops.present? - = columns(medium: 12) do + = columns(medium: 12, class: 'major-group') do %h3=_'articles.conference_registration.headings.Workshops_You_Have_Requested' %p=_'articles.conference_registration.paragraphs.Workshops_You_Have_Requested', :p = render 'workshops/workshop_previews', :workshops => @requested_workshops - if @workshops_in_need.present? - = columns(medium: 12) do + = columns(medium: 12, class: 'major-group') do %h3=_'articles.conference_registration.headings.Workshops_Looking_For_Facilitators' %p=_'articles.conference_registration.paragraphs.Workshops_Looking_For_Facilitators', :p = render 'workshops/workshop_previews', :workshops => @workshops_in_need - if @workshops.present? - = columns(medium: 12) do + = columns(medium: 12, class: 'major-group') do %h3=_'articles.conference_registration.headings.All_Workshops' - -#%p=_'articles.conference_registration.paragraphs.All_Workshops', :p = render 'workshops/workshop_previews', :workshops => @workshops diff --git a/app/views/conferences/admin/_broadcast.html.haml b/app/views/conferences/admin/_broadcast.html.haml index ffb00d0..a0a2acd 100644 --- a/app/views/conferences/admin/_broadcast.html.haml +++ b/app/views/conferences/admin/_broadcast.html.haml @@ -2,6 +2,11 @@ - if @broadcast_step == :preview || @broadcast_step == :test = hidden_field_tag :subject, @subject = hidden_field_tag :body, @body + = hidden_field_tag :send_to, @send_to + - if @broadcast_step == :preview + %p= _'articles.conference_registration.paragraphs.admin.broadcast.test', vars: { send_to_count: "#{(@send_to_count || 0)}".html_safe } + - else + .warning-info.make-room= _'articles.conference_registration.paragraphs.admin.broadcast.preview', vars: { send_to_count: "#{(@send_to_count || 0)}".html_safe } .test-preview %h4=@subject = richtext @body, 4 @@ -10,10 +15,8 @@ = button_with_confirmation :send, (_'modals.admin.broadcast.confirm', vars: { number: @subscriber_count || 0 }), value: :send, class: :delete if @broadcast_step == :test = button_tag :edit, value: :edit - else + = selectfield :send_to, nil, broadcast_options, full: true = textfield :subject, @subject, required: true, big: true = textarea :body, @body, lang: @this_conference.locale, edit_on: :focus .actions.right = button_tag :preview, value: :preview - -# I18n.backend.enabled_locales.each do | locale | - -# if locale.to_s != @this_conference.locale.to_s - -#= textarea "info_translations[#{locale.to_s}]", (richtext @this_conference._info(locale)), label: 'translate.pages.Locale_Translation', vars: { language: _("languages.#{locale}") }, lang: locale diff --git a/config/locales/en.yml b/config/locales/en.yml index 7ba41e3..a792f3f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -5485,6 +5485,9 @@ en: schedule: published: Your scheulde is currently published and viewable on the front-page. Un-publishing the schedule will remove it from the front-page and show a list of proposed workshops instead. un_published: Your schedule is not yet published. Publishing the schedule will replace the list of proposed workshops on the front-page with the schedule as it is shown below. + broadcast: + test: Please take a look at this preview to ensure that you want to send this email. Clicking ‘Test’ will send the email only to you. Only after that then the email will be set to %{send_to_count} people. + preview: Clicking ‘Send’ will send this message to %{send_to_count} people. Please confirm that you have verified that the test email sent to you is what you want to be sent. companion: Is there someone who you would like us to ensure that you are housed with? arrival_and_departure: If you don't need housing, just tell us how long you plan to hang out with Bike!Bike! host: @@ -5698,6 +5701,7 @@ en: days: Days length: Length workshop_block: Block + send_to: Send To actions: generic: login: Sign In @@ -5741,6 +5745,15 @@ en: remove_interest: Click if you are no longer interested in this workshop show_interest: Click if you are interested in this workshop add: Add new + options: + send_to: + registered: Everyone who has registered + pre_registered: Everyone who has pre-registered or registered + unregistered: Everyone who has not completed their registration + workshop_facilitators: All workshop facilitators + housing_providers: Housing providers + guests: Everyone who has requested housing + all: Everyone page_titles: '403': Access_Denied: Access Denied