From 0e0d73cbbd89a9ce5fd758974ab0041498c02673 Mon Sep 17 00:00:00 2001 From: Petko Bordjukov Date: Thu, 18 Apr 2024 18:57:26 +0300 Subject: [PATCH] Make volunteers choose a single main team --- .../management/volunteers_controller.rb | 7 +- .../public/volunteers_controller.rb | 2 +- app/models/volunteer.rb | 22 +- app/models/volunteer_search.rb | 2 +- .../management/volunteers/_form.html.slim | 3 +- app/views/management/volunteers/index.csv.erb | 5 +- .../management/volunteers/index.html.slim | 4 +- .../management/volunteers/show.html.slim | 6 +- config/locales/bg.yml | 81 +-- config/locales/en.yml | 468 ++++++++++-------- config/locales/management.bg.yml | 113 ++++- config/locales/management.en.yml | 107 +++- .../views/public/volunteers/_form.slim | 8 +- spec/support/feature_helpers.rb | 2 +- 14 files changed, 492 insertions(+), 338 deletions(-) diff --git a/app/controllers/management/volunteers_controller.rb b/app/controllers/management/volunteers_controller.rb index eb49a8b..ae18b36 100644 --- a/app/controllers/management/volunteers_controller.rb +++ b/app/controllers/management/volunteers_controller.rb @@ -4,7 +4,7 @@ module Management def index @filters = filter_params || {} - @volunteers = VolunteerSearch.new(scope: Volunteer.where(conference: current_conference).eager_load(:volunteer_teams), filters: params[:filters]).results + @volunteers = VolunteerSearch.new(scope: Volunteer.where(conference: current_conference).eager_load(:volunteer_team), filters: params[:filters]).results end def show @@ -30,13 +30,14 @@ module Management def filter_params params.fetch(:filters, {}).permit(:volunteer_team_id) end - + def volunteer_params params.require(:volunteer).permit(:name, :picture, :email, :phone, :tshirt_size, :tshirt_cut, :food_preferences, :previous_experience, :notes, :language, - volunteer_team_ids: []) + :volunteer_team_id, + additional_volunteer_team_ids: []) end end end diff --git a/app/controllers/public/volunteers_controller.rb b/app/controllers/public/volunteers_controller.rb index 249645d..6e93db6 100644 --- a/app/controllers/public/volunteers_controller.rb +++ b/app/controllers/public/volunteers_controller.rb @@ -34,7 +34,7 @@ module Public params.require(:volunteer).permit( :name, :picture, :email, :phone, :tshirt_size, :tshirt_cut, :food_preferences, :previous_experience, :notes, :language, - volunteer_team_ids: [] + :volunteer_team_id ) end end diff --git a/app/models/volunteer.rb b/app/models/volunteer.rb index e45bdd5..eded70f 100644 --- a/app/models/volunteer.rb +++ b/app/models/volunteer.rb @@ -11,26 +11,27 @@ class Volunteer < ActiveRecord::Base validates :food_preferences, inclusion: {in: FOOD_PREFERENCES.map(&:to_s)} validates :email, format: {with: /\A[^@]+@[^@]+\z/}, presence: true validates :phone, presence: true, format: {with: /\A[+\- \(\)0-9]+\z/} - validates :volunteer_teams, presence: true + validates :volunteer_team, presence: true validate :volunteer_teams_belong_to_conference phony_normalize :phone, default_country_code: "BG" belongs_to :conference - has_and_belongs_to_many :volunteer_teams + belongs_to :volunteer_team + has_and_belongs_to_many :additional_volunteer_teams, class_name: "VolunteerTeam" + before_create :ensure_main_volunteer_team_is_part_of_additional_volunteer_teams before_create :assign_unique_id - after_create :send_notification_to_organizers after_create :send_notification_to_volunteer private - def assign_unique_id - self.unique_id = Digest::SHA256.hexdigest(SecureRandom.uuid) + def ensure_main_volunteer_team_is_part_of_additional_volunteer_teams + self.additional_volunteer_teams |= [volunteer_team] if volunteer_team end - def send_notification_to_organizers - VolunteerMailer.team_notification(self).deliver_later + def assign_unique_id + self.unique_id = Digest::SHA256.hexdigest(SecureRandom.uuid) end def send_notification_to_volunteer @@ -39,8 +40,11 @@ class Volunteer < ActiveRecord::Base def volunteer_teams_belong_to_conference conference_volunteer_teams = conference.volunteer_teams - unless volunteer_teams.all? { |team| conference_volunteer_teams.include? team } - errors.add :volunteer_teams, :invalid_volunteer_team + unless additional_volunteer_teams.all? { |team| conference_volunteer_teams.include? team } + errors.add :additional_volunteer_teams, :invalid_volunteer_team + end + unless conference_volunteer_teams.include?(volunteer_team) + errors.add :volunteer_team, :invalid_volunteer_team end end end diff --git a/app/models/volunteer_search.rb b/app/models/volunteer_search.rb index 11af181..9fe1fdc 100644 --- a/app/models/volunteer_search.rb +++ b/app/models/volunteer_search.rb @@ -1,7 +1,7 @@ class VolunteerSearch include SearchObject.module(:sorting) - option(:volunteer_team_id) { |scope, value| scope.joins(:volunteer_teams).where volunteer_teams: {id: value} } + option(:volunteer_team_id) { |scope, value| scope.joins(:volunteer_team).where volunteer_team: {id: value} } sort_by "name" config[:defaults]["sort"] = "#{config[:sort_attributes].first} asc" diff --git a/app/views/management/volunteers/_form.html.slim b/app/views/management/volunteers/_form.html.slim index 50ace56..6186233 100644 --- a/app/views/management/volunteers/_form.html.slim +++ b/app/views/management/volunteers/_form.html.slim @@ -11,7 +11,8 @@ = f.input :name, autofocus: true = f.input :email - = f.association :volunteer_teams, as: :check_boxes, wrapper: :horizontal_radio_and_checkboxes, collection: current_conference.volunteer_teams + = f.association :volunteer_team, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, collection: current_conference.volunteer_teams + = f.association :additional_volunteer_teams, as: :check_boxes, wrapper: :horizontal_radio_and_checkboxes, collection: current_conference.volunteer_teams = f.input :phone, input_html: {value: @volunteer.phone.try(:phony_formatted, format: :international)} = f.input :language, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, collection: locale_collection, include_blank: false, checked: (@volunteer.language.presence || I18n.locale) = f.input :tshirt_size, collection: Volunteer::TSHIRT_SIZES, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, checked: (@volunteer.tshirt_size.presence || :m) diff --git a/app/views/management/volunteers/index.csv.erb b/app/views/management/volunteers/index.csv.erb index 506382c..090bcfd 100644 --- a/app/views/management/volunteers/index.csv.erb +++ b/app/views/management/volunteers/index.csv.erb @@ -1,4 +1,4 @@ -<%- csv_headers = %w{id name email language unique_id phone tshirt_size tshirt_cut food_preferences previous_experience notes teams} -%> +<%- csv_headers = %w{id name email language unique_id phone tshirt_size tshirt_cut food_preferences previous_experience notes team additional_teams} -%> <%= CSV.generate_line(csv_headers).html_safe -%> <%- @volunteers.each do |volunteer| -%> <%= CSV.generate_line([volunteer.id, @@ -12,5 +12,6 @@ volunteer.food_preferences, volunteer.previous_experience, volunteer.notes, - volunteer.volunteer_teams.map(&:name).join(', ')]).html_safe -%> + volunteer.volunteer_team.name, + volunteer.additional_volunteer_teams.map(&:name).join(', ')]).html_safe -%> <%- end -%> diff --git a/app/views/management/volunteers/index.html.slim b/app/views/management/volunteers/index.html.slim index 6d62c57..e989e9b 100644 --- a/app/views/management/volunteers/index.html.slim +++ b/app/views/management/volunteers/index.html.slim @@ -32,7 +32,7 @@ thead tr th = t '.profile' - th = Volunteer.human_attribute_name :volunteer_teams + th = Volunteer.human_attribute_name :volunteer_team th.actions tbody - @volunteers.each do |volunteer| @@ -50,7 +50,7 @@ p = icon(:envelope, volunteer.email) td - = volunteer.volunteer_teams.map(&:name).join(', ') + = volunteer.volunteer_team.name td.actions div.btn-group.btn-group-sm = action_buttons(current_conference, volunteer, [:show, :edit]) diff --git a/app/views/management/volunteers/show.html.slim b/app/views/management/volunteers/show.html.slim index 0004289..0f4287a 100644 --- a/app/views/management/volunteers/show.html.slim +++ b/app/views/management/volunteers/show.html.slim @@ -25,8 +25,10 @@ h4.media-heading = @volunteer.name hr - h4 = Volunteer.human_attribute_name(:volunteer_teams) - = @volunteer.volunteer_teams.map(&:name).join(', ') + h4 = Volunteer.human_attribute_name(:volunteer_team) + = @volunteer.volunteer_team.name + h4 = Volunteer.human_attribute_name(:additional_volunteer_teams) + = @volunteer.additional_volunteer_teams.map(&:name).join(', ') - if @volunteer.previous_experience.present? h4 = Volunteer.human_attribute_name(:previous_experience) = simple_format @volunteer.previous_experience diff --git a/config/locales/bg.yml b/config/locales/bg.yml index f6dbfe7..6b4c748 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -15,77 +15,6 @@ bg: change_feedback_for: Преоценете „%{title}“ by: от %{authors} feedback_incentive: Бихме били благодарни, ако споделите с нас мнението си за конференцията и събитията в нея. - management: - volunteers: - index: - all: Всички - profile: Профил - total: "%{current} от общо %{total}" - personal_profiles: - index: - no_profile: 'Този потребител няма въведен профил за текущата конференция.' - total: "%{current} от общо %{total}" - create: - successfully_created: "Профилът беше създаден успешно." - show: - contacts: "Данни за контакт" - event_propositions: "Предложения за събития" - conferences: - update_vote_data: - vote_data_successfully_updated: "Резултатите от гласуването бяха обновени успешно" - error_during_vote_data_save: "Възникна грешка при запазването на резултатите от гласуването" - error_during_connection_with_voting_endpoint: "Възникна грешка при опит за изтегляне на резултатите от гласуването: %{error}" - vote_results: - back_to: "Обратно към %{conference}" - vote_results: "Резултати от гласуването" - vote_data_never_updated: "Резултатите от гласуването не са изтеглени" - voting_results: "Резултати от гласуването" - vote_data_updated_at: "последно обновяване %{updated_at}" - vote_ratio: "%{votes} от общо %{total_votes} гласа" - fetch_vote_results: "Обнови резултатите от гласуването" - percent: "%" - rank: "Позиция" - unranked: "Няма данни" - export: Експорт - show: - full_vote_results: "Пълни резултати от гласуването" - vote_data_never_updated: "Резултатите от гласуването не са изтеглени" - voting_results: "Резултати от гласуването" - vote_data_updated_at: "последно обновяване %{updated_at}" - vote_ratio: "%{votes} от общо %{total_votes} гласа" - summary: 'Обобщение' - cfp_status: 'Състояние на CFP' - fetch_vote_results: "Обнови резултатите от гласуването" - percent: "%" - rank: "Позиция" - events: - conflicts: - conflicts: "Конфликти" - conflicts_of: "Конфликти на „%{event}“" - percent: "Процент" - hint_html: "Следващата таблица илюстрира какъв процент от посетителите, изявили интерес да присъстват на „%{event}“, биха желали да присъстват на всяко от посочените събития." - edit: - edit: "Редакция на %{event_type} „%{event_title}“" - speaker: - no_profile: 'Този потребител няма въведени профили в системата.' - profile_from: "профил от %{conference}" - create_profile: "Създай нов профил" - previous_event_propositions: 'Предишни предложения за събития' - contacts: "Информация за контакт" - show: - between_approved_events: "Между настоящото и одобрените събития" - no_approved_events: "Няма достатъчно одобрени събития" - rank: "Класиране" - review: "Преглед на %{event_type} „%{event_title}“" - conflicts: "Конфликти" - percent: "Процент" - index: - all: "Всички" - total: "%{current} от общо %{total}" - event: - create_profile: "Създай профил" - no_records: - no_records_found: 'Не бяха открити записи, които да отговарят на изискванията' abstract: "Резюме" helpers: submit: @@ -190,7 +119,8 @@ bg: previous_experience: Предишен опит notes: Бележки language: Език - volunteer_teams: Екипи доброволци + volunteer_team: Екип доброволци + additional_volunteer_teams: Допълнителни екипи доброволци track: color: "Цвят" description: "Описание" @@ -230,7 +160,9 @@ bg: attributes: picture: invalid_content_type: "невалиден формат на снимката" - volunteer_teams: + volunteer_team: + invalid_volunteer_team: "невалиден екип от доброволци" + additional_volunteer_teams: invalid_volunteer_team: "невалиден екип от доброволци" models: feedback: @@ -434,10 +366,11 @@ bg: public_email: E-mail адрес, който ще бъде видим за посетителите twitter: "Потребителското Ви име в Twitter" volunteer: + name: "Имайте предвид, че това име ще бъде изписано на грамотата ви за участие в конференцията" email: "Е-mail адресът Ви, който ще бъде видим само от организаторите" phone: "Мобилният Ви телефон, който ще бъде видим само за организаторите" picture: "Ваша снимка в jpeg, png или gif формат" - volunteer_teams: "Доброволческите екипи, от които искате да сте част. Подробни описания на екипите можете да намерите тук" + volunteer_team: "Доброволческият екип, от които искате да бъдете част. Подробни описания на екипите можете да намерите тук. Ако желаете да участвате в повече от един екип, споменете това в полето бележка." user: email: e-mail адресът Ви. Ще бъде видим само от организаторите password: "Парола с дължина между 8 и 128 символа" diff --git a/config/locales/en.yml b/config/locales/en.yml index d88d460..931f208 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,21 +1,21 @@ en: public: event_feedbacks: - new: &new_feedbacks_en - feedback_for: Rating '%{title}' + new: &new_feedbacks_bg + feedback_for: "Rating '%{title}'" submit: Submit success: The feedback was submitted successfully conference_feedbacks: - new: *new_feedbacks_en + new: *new_feedbacks_bg index: feedback_for_the_conference: Feedback for the conference - general_feedback_for: Submit general feedback for "%{title}" - change_general_feedback_for: Resubmit general feedback for "%{title}" - feedback_for: Submit feedback for "%{title}" - change_feedback_for: Resubmit feedback for "%{title}" - by: by %{authors} + general_feedback_for: "Submit general feedback for \"%{title}\"" + change_general_feedback_for: "Resubmit general feedback for \"%{title}\"" + feedback_for: "Submit feedback for \"%{title}\"" + change_feedback_for: "Resubmit feedback for \"%{title}\"" + by: "by %{authors}" feedback_incentive: We would be happy to receive your feedback about the conference and its events. - abstract: Abstract + abstract: "Abstract" helpers: submit: event: @@ -25,68 +25,90 @@ en: create: "Submit application" update: "Update application" actions: - are_you_sure: Are you sure? + are_you_sure: "Are you sure?" + clone: + button: "Clone %{model}" + title: "Clone existing %{model}" create: - button: Create %{model} - title: 'Create a new #{model}' + button: "Create %{model}" + title: "Create a new #{model}" destroy: - button: Destroy %{model} + button: "Destroy %{model}" edit: - button: Edit %{model} - title: Editing %{model} + button: "Edit %{model}" + title: "Editing %{model}" index: - button: Browse %{models} - title: Browse %{models} + button: "Browse %{models}" + title: "Browse %{models}" new: - title_f: New %{model} - title_m: New %{model} + title_f: "New %{model}" + title_m: "New %{model}" + title_c: "New %{model}" view: - button: View %{model} - title: Viewing %{model} + button: "View %{model}" + title: "Viewing %{model}" + attributes: + average_rating: Average rating + rating: Rating activerecord: attributes: feedback: author_email: E-mail rating: Rating comment: Comment + participation: + participant: Participant + approved: Confirmed by participant + proposition: + status: Status + statuses: + undecided: Undecided + approved: Approved + rejected: Rejected + backup: Backup conference: - description: Description + participants: "Participants" + description: "Description" email: E-mail - end_date: End date - host_name: Domain name - start_date: Start date - title: Title + end_date: "End date" + host_name: "Domain name" + start_date: "Start date" + planned_cfp_end_date: "Planned CFP End date" + title: "Title" event: - abstract: Abstract - agreement: I accept - description: Description - language: Language - length: Length - notes: Notes - subtitle: Sub-title - title: Title - track: Track - user: Speaker - feedbacks: Feedback + conference: "Conference" + status: "Statis" + abstract: "Abstract" + agreement: "I accept" + description: "Description" + language: "Language" + length: "Length" + notes: "Notes" + subtitle: "Sub-title" + title: "Title" + track: "Track" + rank: "Rank" + user: "Speaker" + participants: "Participants" + feedbacks: "Feedback" event_type: - description: Description - name: Name + description: "Description" + name: "Name" minimum_length: Minimum length maximum_length: Maximum length hall: - name: Name + name: "Name" personal_profile: - biography: Short biography - first_name: First name + biography: "Short biography" + first_name: "First name" github: Github account - last_name: Last name - mobile_phone: Mobile phone - organisation: Organization - picture: Photo - public_email: Public e-mail + last_name: "Last name" + mobile_phone: "Mobile phone" + organisation: "Organization" + picture: "Photo" + public_email: "Public e-mail" twitter: Twitter account volunteer: - language: Language picture: Picture name: Name email: E-mail @@ -96,109 +118,125 @@ en: food_preferences: Food preference previous_experience: Previous experience notes: Notes - volunteer_teams: Екипи доброволци - track: - color: Color - description: Description - name: Name - user: - current_password: Current password - email: E-mail language: Language - password: Password - password_confirmation: Password confirmation - remember_me: Remember me + volunteer_team: Volunteer team + additional_volunteer_teams: Additional volunteer teams + track: + color: "Color" + description: "Description" + name: "Name" + user: + current_password: "Current password" + email: E-mail + language: "Language" + password: "Password" + password_confirmation: "Password confirmation" + remember_me: "Remember me" + volunteer_team: + name: Name + description: Description + color: Color errors: models: event: attributes: track: - must_be_a_valid_track: must be one of the listed lecture tracks + must_be_a_valid_track: "must be one of the listed lecture tracks" length: must_be_between: "must be between %{minimum} and %{maximum} minutes" personal_profile: attributes: github: - invalid: can contain only alphabet characters, digits or a dash and cannot start with a dash + invalid: "can contain only alphabet characters, digits or a dash and cannot start with a dash" twitter: - invalid: can contain a maximum of 15 symbols that need to be alphabet characters, digits or an underscore + invalid: "can contain a maximum of 15 symbols that need to be alphabet characters, digits or an underscore" user: attributes: email: - invalid: is not a valid e-mail address + invalid: "is not a valid e-mail address" password_confirmation: - confirmation: does not match the password + confirmation: "does not match the password" volunteer: attributes: picture: invalid_content_type: "invalid picture format" + volunteer_team: + invalid_volunteer_team: "invalid volunteer team" + additional_volunteer_teams: + invalid_volunteer_team: "invalid volunteer team" models: + feedback: + one: Feedback + other: Feedback + participation: + one: Participation + other: Participation volunteership: one: volunteership other: volunteerships conference: - one: conference - other: conferences + one: "conference" + other: "conferences" event: - one: Suggestion - other: Suggestions + one: "Suggestion" + other: "Suggestions" event_type: - one: event type - other: event types + one: "event type" + other: "event types" hall: - one: hall - other: halls + one: "hall" + other: "halls" lecture: - one: Lecture - other: Lectures + one: "Lecture" + other: "Lectures" personal_profile: - one: Profile - other: Profiles + one: "Profile" + other: "Profiles" proposition: - one: Proposition - other: Propositions + one: "Proposition" + other: "Propositions" sponsorship_offer: - one: sponsor - other: sponsors + one: "sponsor" + other: "sponsors" track: - one: track - other: tracks + one: "track" + other: "tracks" volunteer_team: one: "volunteer team" other: "volunteer teams" user: - one: User - other: Users + one: "User" + other: "Users" volunteer: - one: volunteer - other: volunteers + one: "volunteer" + other: "volunteers" workshop: - one: Workshop - other: Workshops - change_pass: Change password - click_to_unlock: Click the link below to unlock - confirm_by_clicking: You can confirm your account by clicking the link below + one: "Workshop" + other: "Workshops" + change_pass: "Change password" + click_to_unlock: "Click the link below to unlock" + confirm_by_clicking: "You can confirm your account by clicking the link below" confirmations: - did_not_receive_confirmation_instructions: You have not received confirmation instructions? - resend: Send - resend_confirmation: Send confirmation E-mail - description: Description - did_not_get_confirmation: You did not receive confirmation instructions? - did_not_get_unlock: You did not receive unlock instructions? + did_not_receive_confirmation_instructions: "You have not received confirmation instructions?" + resend: "Send" + resend_confirmation: "Send confirmation E-mail" + description: "Description" + did_not_get_confirmation: "You did not receive confirmation instructions?" + did_not_get_unlock: "You did not receive unlock instructions?" do_not_want_pass_reset1: "If you don't want to change your password, please delete this E-mail." - do_not_want_pass_reset2: Your password will not be change unless you click the link above and enter a new password. - edit: Edit - edit_speaker_profile: Edit profile - edit_talk: Edit talk - edit_title: 'track "%{track}", duration: %{len} min' - edit_workshop: Edit workshop - enter: Enter + do_not_want_pass_reset2: "Your password will not be change unless you click the link above and enter a new password." + edit: "Edit" + edit_speaker_profile: "Edit profile" + edit_talk: "Edit talk" + edit_title: "track \"%{track}\", duration: %{len} min" + edit_workshop: "Edit workshop" + enter: "Enter" errors: messages: - improbable_phone: not a valid phone number + improbable_phone: "not a valid phone number" event_mailer: acceptance_notification: - subject: Your submission for %{conference} for the %{submission_type} "%{title}" has been approved + subject: "Your submission for %{conference} for the %{submission_type} \"%{title}\" has been approved" rejection_notification: subject: "Your submission for %{conference} for the %{submission_type} \"%{title}\" has not been approved" volunteer_mailer: @@ -206,77 +244,77 @@ en: subject: "Your application for \"volunteership\" on %{conference_name} was received" event_states: approved: - one: Approved - other: Approved + one: "Approved" + other: "Approved" backup: - one: Backup - other: Backup + one: "Backup" + other: "Backup" confirmed: - one: Confirmed - other: Confirmed + one: "Confirmed" + other: "Confirmed" rejected: - one: Rejected - other: Rejected + one: "Rejected" + other: "Rejected" undecided: - one: Undecided - other: Undecided - expected_validation: Awaiting confirmation of %{email} - hello: Hello, %{name} - home: Home + one: "Undecided" + other: "Undecided" + expected_validation: "Awaiting confirmation of %{email}" + hello: "Hello, %{name}" + home: "Home" home_title: "%{conference} - call for participation" - lecture_was_successfully_confirmed: Your lecture was confirmed successfully - license_notice: Please keep in mind that the presentations will later be published under the CC-BY-ND (Creative Commons – Attribution – No derivatives) license. + lecture_was_successfully_confirmed: "Your lecture was confirmed successfully" + license_notice: "Please keep in mind that the presentations will later be published under the CC-BY-ND (Creative Commons – Attribution – No derivatives) license." locales: - bg: Bulgarian + bg: "Bulgarian" en: English - login: Login - login_data: Account information - login_with: Log in with %{with} - logout: Log out - lostpass: Forgotten password? - meta_data: 'Language: %{language}, track: "%{track}", duration: %{length} m.' - my_talks: My lecture submissions - my_workshops: My workshop submissions - new_workshop_title: Submit a workshop - no_talks_submitted: You are yet to submit a lecture - no_workshops_submitted: You are yet to submit a workshop - of_motto: share the freedom - pass_update_hint1: Do not fill this in unless you want to change your password + login: "Login" + login_data: "Account information" + login_with: "Log in with %{with}" + logout: "Log out" + lostpass: "Forgotten password?" + meta_data: "Language: %{language}, track: \"%{track}\", duration: %{length} m." + my_talks: "My lecture submissions" + my_workshops: "My workshop submissions" + new_workshop_title: "Submit a workshop" + no_talks_submitted: "You are yet to submit a lecture" + no_workshops_submitted: "You are yet to submit a workshop" + of_motto: "share the freedom" + pass_update_hint1: "Do not fill this in unless you want to change your password" pass_update_hint2: "Fill this in if you'd like to change your password or E-mail address" passwords: - change_your_password: Change your password - confirm_your_new_password: Password confirmation - forgotten_password: Forgotten password - new_password: New password - send_instructions: Send instructions - please_fill_in_your_speaker_profile: Please fill in the data for your personal profile - registration: Registration + change_your_password: "Change your password" + confirm_your_new_password: "Password confirmation" + forgotten_password: "Forgotten password" + new_password: "New password" + send_instructions: "Send instructions" + please_fill_in_your_speaker_profile: "Please fill in the data for your personal profile" + registration: "Registration" registrations: - account_cancelation: Account deletion - add_phone_number: Add a phone number - are_you_sure: Are you sure you want to delete your registration - cancel_my_account: Delete my account - edit_account: Edit account + account_cancelation: "Account deletion" + add_phone_number: "Add a phone number" + are_you_sure: "Are you sure you want to delete your registration" + cancel_my_account: "Delete my account" + edit_account: "Edit account" leave_blank_if_you_do_not_want_to_change: "leave blank if you don't want to change it" - minimum_characters: at least %{minimum} symbols - sign_me_up: Sign me up - sign_up: Registration - unhappy: You are not happy? - update: Update - we_need_your_current_password: we need your current password in order to confirm the changes - resend_instructions_btn: Resend instructions - resend_instructions_header: Resend confirmation instructions - resend_unlock_instructions_title: Resend unlock instructions - send_lostpass_instructions: Resend lost password instructions + minimum_characters: "at least %{minimum} symbols" + sign_me_up: "Sign me up" + sign_up: "Registration" + unhappy: "You are not happy?" + update: "Update" + we_need_your_current_password: "we need your current password in order to confirm the changes" + resend_instructions_btn: "Resend instructions" + resend_instructions_header: "Resend confirmation instructions" + resend_unlock_instructions_title: "Resend unlock instructions" + send_lostpass_instructions: "Resend lost password instructions" sessions: - remember_me: Remember me - sign_in: Sign in - sign_in_heading: Sign in - sign_in_with: Sign in with %{with} - sign_out: Sign out + remember_me: "Remember me" + sign_in: "Sign in" + sign_in_heading: "Sign in" + sign_in_with: "Sign in with %{with}" + sign_out: "Sign out" simple_form: error_notification: - default_message: 'Please see the errors below:' + default_message: "Please see the errors below:" options: volunteer: tshirt_size: @@ -295,82 +333,84 @@ en: vegan: Vegan hints: feedback: - author_email: "Your E-mail address if you'd like to share it with us" + author_email: Your E-mail address if you'd like to share it with us rating: Select your rating for the event comment: Express your opinion in greater detail here conference: - description: Conference description + description: "Conference description" email: Orga team email - end_date: Last day of the conference - start_date: First day of the conference - title: Title of the conference + end_date: "Last day of the conference" + start_date: "First day of the conference" + planned_cfp_end_date: "The day before all speakers must have submitted their proposals. This field is informative, it is not enforced." + title: "Title of the conference" tracks: - color: Color - description: Short description - name: Track name + color: "Color" + description: "Short description" + name: "Track name" event: - abstract: An abstract of the event that will be published for the attendees to read (around 1 paragraph) - agreement: Indicate if you accept your workshop to be recorded and published under the CC-BY-ND (Creative Commons – Attribution – No Derivatives) license - description: Detailed description of the event (several paragraphs) - language: "Language in which the event will be lead" + abstract: "An abstract of the event that will be published for the attendees to read (around 1 paragraph)" + agreement: "Indicate if you accept your workshop to be recorded and published under the CC-BY-ND (Creative Commons – Attribution – No Derivatives) license" + description: "Detailed description of the event (several paragraphs)" + language: "" length: "Length of the event (in minutes). The length of a %{type} is between %{min} and %{max} minutes" notes: "Notes that you'd like the organisation team to read" subtitle: "" title: "" - track: The lecture track for your event + track: "The lecture track for your event" personal_profile: - biography: Describe yourself with a few sentences, writing about yourself in the third person :) - github: Your Github username - mobile_phone: A mobile phone that will be visible only by the organisation team - organisation: The organisation you represent - picture: Your photo + biography: "Describe yourself with a few sentences, writing about yourself in the third person :)" + github: "Your Github username" + mobile_phone: "A mobile phone that will be visible only by the organisation team" + organisation: "The organisation you represent" + picture: "Your photo" public_email: E-mail address that will be visible for the attendees - twitter: Your Twitter handle + twitter: "Your Twitter handle" volunteer: + name: "Keep in mind that this name will be written in your certificate for participation in the conference." email: "Your E-mail address. It will be visible only to the organizers" phone: "Your mobile phone. It will be visible only to the organizers" picture: "A picture of you in jpeg, png or gif format" - volunteer_teams: "The volunteer teams you'd like to be part of. You can find a description of each team here" + volunteer_team: "The volunteer team you'd like to be a part of. You can find a description of each team here. Leave a note in the Notes field if you wish to be a part of any additional teams." user: email: Your e-mail address. Will be visible to the organizers only. - password: Password with length between 8 and 128 symbols - password_confirmation: Repeat the password - 'no': false + password: "Password with length between 8 and 128 symbols" + password_confirmation: "Repeat the password" + 'no': "No" required: mark: "*" - text: Required field - 'yes': true - someone_requested_passreset: Someone requested to change the password of your account. The password can be changed by following the link below - speaker_profile: Speaker profile - submit_talk_header: Submit a new talk + text: "Required field" + 'yes': "Yes" + someone_requested_passreset: "Someone requested to change the password of your account. The password can be changed by following the link below" + speaker_profile: "Speaker profile" + submit_talk_header: "Submit a new talk" suggestion_and_speaker_count: "%{suggestions} submissions by %{speakers} speakers" - talks: Talks + talks: "Talks" unlocks: - did_not_receive_unlock_instructions: Did not receive unlock instructions? - resend: Resend - resend_unlock_instructions: Resend unlock instructions - update: Update + did_not_receive_unlock_instructions: "Did not receive unlock instructions?" + resend: "Resend" + resend_unlock_instructions: "Resend unlock instructions" + update: "Update" views: conference: - info: Conference details - see_details: See details + info: "Conference details" + see_details: "See details" events: - edit_event: Editing %{event_type} %{title} - event_successfully_created: Your %{event_type} submission was successfully created - event_successfully_updated: Your %{event_type} submission was successfully updated - successfully_confirmed: Your %{event_type} submission was successfully confirmed - error_on_confirmation: There was an error during the confirmation of your %{event_type} submission - no_events: You are yet to submit an event - submit_event: Submit a %{event_type} + edit_event: "Editing %{event_type} %{title}" + event_successfully_created: "Your %{event_type} submission was successfully created" + event_successfully_updated: "Your %{event_type} submission was successfully updated" + successfully_confirmed: "Your %{event_type} submission was successfully confirmed" + error_on_confirmation: "There was an error during the confirmation of your %{event_type} submission" + no_events: "You are yet to submit an event" + submit_event: "Submit a %{event_type}" navigation: - my_submissions: My submissions + my_submissions: "My submissions" personal_profiles: - successfully_created: Your personal profile was successfully created - successfully_updated: Your personal profile was successfully updated + successfully_created: "Your personal profile was successfully created" + successfully_updated: "Your personal profile was successfully updated" user: - info: User details + info: "User details" welcome: - submit_event: Submit %{event_type} + submit_event: "Submit %{event_type}" volunteers: new_volunteer_title: Apply for a volunteer edit_volunteer_title: "Volunteership application of %{name}" @@ -380,7 +420,7 @@ en: successful_application_edit: "Your application was successfully updated" error_occurred_while_applying: "There was an error and your application could not be sent" you_successfully_retracted_your_application_for: "Your application was successfully retracted" - welcome: Welcome, %{name} - what_we_ask: 'We would like to receive your lecture, workshop, and stand submissions that belong to the following tracks until %{date}:' - workshop_was_successfully_confirmed: The workshop was successfully confirmed - workshops: Workshops + welcome: "Welcome, %{name}" + what_we_ask: "We would like to receive your lecture, workshop, and stand submissions that belong to the following tracks until %{date}:" + workshop_was_successfully_confirmed: "The workshop was successfully confirmed" + workshops: "Workshops" diff --git a/config/locales/management.bg.yml b/config/locales/management.bg.yml index 04025c8..94d2ba6 100644 --- a/config/locales/management.bg.yml +++ b/config/locales/management.bg.yml @@ -11,6 +11,95 @@ bg: events: metadata: "%{type} на %{language} с продължителност %{length} минути" management: + volunteers: + index: + all: Всички + profile: Профил + total: "%{current} от общо %{total}" + personal_profiles: + index: + no_profile: 'Този потребител няма въведен профил за текущата конференция.' + total: "%{current} от общо %{total}" + create: + successfully_created: "Профилът беше създаден успешно." + show: + contacts: "Данни за контакт" + event_propositions: "Предложения за събития" + talk_history: Събития с участието на лектора + comments_from_the_audience: Коментари от аудиторията + no_comments_received: Все още няма коментари. + private_email: Личен e-mail + conferences: + update_vote_data: + vote_data_successfully_updated: "Резултатите от гласуването бяха обновени успешно" + error_during_vote_data_save: "Възникна грешка при запазването на резултатите от гласуването" + error_during_connection_with_voting_endpoint: "Възникна грешка при опит за изтегляне на резултатите от гласуването: %{error}" + vote_results: + back_to: "Обратно към %{conference}" + vote_results: "Резултати от гласуването" + vote_data_never_updated: "Резултатите от гласуването не са изтеглени" + voting_results: "Резултати от гласуването" + vote_data_updated_at: "последно обновяване %{updated_at}" + vote_ratio: "%{votes} от общо %{total_votes} гласа" + fetch_vote_results: "Обнови резултатите от гласуването" + percent: "%" + rank: "Позиция" + unranked: "Няма данни" + export: Експорт + show: + full_vote_results: "Пълни резултати от гласуването" + vote_data_never_updated: "Резултатите от гласуването не са изтеглени" + voting_results: "Резултати от гласуването" + vote_data_updated_at: "последно обновяване %{updated_at}" + vote_ratio: "%{votes} от общо %{total_votes} гласа" + summary: 'Обобщение' + cfp_status: 'Състояние на CFP' + fetch_vote_results: "Обнови резултатите от гласуването" + percent: "%" + rank: "Позиция" + events: + update: + event_successfully_updated: Събитието беше обновено успешно + show: + average_grade: Средна оценка + total_feedback_grades: + one: от %{total_grades} оценка + other: от %{total_grades} оценки + no_feedback_received: Все още няма обратна връзка + no_comments_received: Все още няма коментари + comments: Коментари + top_conflicts: Топ 5 конфликти + between_approved_events: "Между настоящото и одобрените събития" + no_approved_events: "Няма достатъчно одобрени събития" + rank: "Класиране" + review: "Преглед на %{event_type} „%{event_title}“" + conflicts: "Конфликти" + percent: "Процент" + speaker: + continue: Още... + other_event_propositions: Други предложени събития + the_participant_has_not_created_a_profile: Потребителят не си е създал профил в системата. + private_email: Личен e-mail + no_other_event_propositions: Няма други предложени събития + no_profile: 'Този потребител няма въведени профили в системата.' + profile_from: "профил от %{conference}" + create_profile: "Създай нов профил" + previous_event_propositions: 'Предишни предложения за събития' + contacts: "Информация за контакт" + conflicts: + conflicts: "Конфликти" + conflicts_of: "Конфликти на „%{event}“" + percent: "Процент" + hint_html: "Следващата таблица илюстрира какъв процент от посетителите, изявили интерес да присъстват на „%{event}“, биха желали да присъстват на всяко от посочените събития." + edit: + edit: "Редакция на %{event_type} „%{event_title}“" + index: + all: "Всички" + total: "%{current} от общо %{total}" + event: + create_profile: "Създай профил" + no_records: + no_records_found: 'Не бяха открити записи, които да отговарят на изискванията' feedback: index: feedback: Обратна връзка @@ -27,30 +116,6 @@ bg: feedback: anonymous: Анонимен about: относно - personal_profiles: - show: - talk_history: Събития с участието на лектора - comments_from_the_audience: Коментари от аудиторията - no_comments_received: Все още няма коментари. - private_email: Личен e-mail - events: - update: - event_successfully_updated: Събитието беше обновено успешно - show: - average_grade: Средна оценка - total_feedback_grades: - one: от %{total_grades} оценка - other: от %{total_grades} оценки - no_feedback_received: Все още няма обратна връзка - no_comments_received: Все още няма коментари - comments: Коментари - top_conflicts: Топ 5 конфликти - speaker: - continue: Още... - other_event_propositions: Други предложени събития - the_participant_has_not_created_a_profile: Потребителят не си е създал профил в системата. - private_email: Личен e-mail - no_other_event_propositions: Няма други предложени събития ratings: poor: Слаб average: Среден diff --git a/config/locales/management.en.yml b/config/locales/management.en.yml index 5009f1b..afd3f65 100644 --- a/config/locales/management.en.yml +++ b/config/locales/management.en.yml @@ -1,14 +1,65 @@ en: - are_you_sure: Are you sure? + are_you_sure: "Are you sure?" view: View home: Home + more_about_user: "" status: undecided: Undecided approved: Approved rejected: Rejected backup: Back-up + events: + metadata: "" management: + volunteers: + index: + all: "" + profile: "" + total: "" + personal_profiles: + index: + no_profile: '' + total: "" + create: + successfully_created: "" + show: + contacts: "" + event_propositions: "" + talk_history: "" + comments_from_the_audience: "" + no_comments_received: "" + private_email: "" + conferences: + update_vote_data: + vote_data_successfully_updated: "" + error_during_vote_data_save: "" + error_during_connection_with_voting_endpoint: "" + vote_results: + back_to: "" + vote_results: "" + vote_data_never_updated: "" + voting_results: "" + vote_data_updated_at: "" + vote_ratio: "" + fetch_vote_results: "" + percent: "" + rank: "" + unranked: "" + export: "" + show: + full_vote_results: "" + vote_data_never_updated: "" + voting_results: "" + vote_data_updated_at: "" + vote_ratio: "" + summary: '' + cfp_status: '' + fetch_vote_results: "" + percent: "" + rank: "" events: + update: + event_successfully_updated: "" show: average_grade: Average grade total_feedback_grades: @@ -17,3 +68,57 @@ en: no_feedback_received: No feedback received (yet) no_comments_received: No comments received (yet) comments: Comments + top_conflicts: "" + between_approved_events: "" + no_approved_events: "" + rank: "" + review: "" + conflicts: "" + percent: "" + speaker: + continue: "" + other_event_propositions: "" + the_participant_has_not_created_a_profile: "" + private_email: "" + no_other_event_propositions: "" + no_profile: '' + profile_from: "" + create_profile: "" + previous_event_propositions: '' + contacts: "" + conflicts: + conflicts: "" + conflicts_of: "" + percent: "" + hint_html: "" + edit: + edit: "" + index: + all: "" + total: "" + event: + create_profile: "" + no_records: + no_records_found: '' + feedback: + index: + feedback: "" + overall_organisation: "" + comments: "" + average_grade: "" + total_feedback_grades: + one: '' + other: '' + no_feedback_received: "" + no_comments_received: "" + events: "" + shared: + feedback: + anonymous: "" + about: "" + ratings: + poor: "" + average: "" + good: "" + very_good: "" + excellent: "" diff --git a/lib/initfest/views/public/volunteers/_form.slim b/lib/initfest/views/public/volunteers/_form.slim index af6c94a..55194ea 100644 --- a/lib/initfest/views/public/volunteers/_form.slim +++ b/lib/initfest/views/public/volunteers/_form.slim @@ -5,12 +5,14 @@ .form-inputs .input - = image_tag @volunteer.picture.variant(resize_to_limit: [150, 150]) if @volunteer.picture.attached? - = f.input :picture, as: :file, direct: true, wrapper: false + = image_tag(@volunteer.picture.variant(resize_to_limit: [150, 150])) if @volunteer.picture.attached? + = f.hidden_field :picture, value: @volunteer.picture.signed_id if @volunteer.picture.attached? + = f.input :picture, as: :file, required: false, direct: true, wrapper: false, input_html: {direct_upload: true} + = f.input :name, autofocus: true = f.input :email = f.input :phone, input_html: {value: @volunteer.phone.try(:phony_formatted, format: :international)} - = f.association :volunteer_teams, as: :check_boxes, wrapper: :default, collection: current_conference.volunteer_teams + = f.association :volunteer_team, as: :radio_buttons, wrapper: :default, collection: current_conference.volunteer_teams = f.input :language, as: :radio_buttons, collection: locale_collection, include_blank: false, wrapper: :default, checked: (@volunteer.language.presence || I18n.locale) = f.input :tshirt_size, collection: Volunteer::TSHIRT_SIZES, as: :radio_buttons, wrapper: :default, checked: (@volunteer.tshirt_size.presence || :m) = f.input :tshirt_cut, collection: Volunteer::TSHIRT_CUTS, as: :radio_buttons, wrapper: :default, checked: (@volunteer.tshirt_cut.presence || :unisex) diff --git a/spec/support/feature_helpers.rb b/spec/support/feature_helpers.rb index 281ca62..6d608e5 100644 --- a/spec/support/feature_helpers.rb +++ b/spec/support/feature_helpers.rb @@ -114,7 +114,7 @@ module FeatureHelpers fill_in Volunteer.human_attribute_name(:name), with: "Volunteer Foo" fill_in Volunteer.human_attribute_name(:email), with: "foo@example.com" fill_in Volunteer.human_attribute_name(:phone), with: "+359666666" - check VolunteerTeam.first.name + choose VolunteerTeam.first.name click_on I18n.t("helpers.submit.volunteer.create") end