diff --git a/app/assets/stylesheets/_admin.scss b/app/assets/stylesheets/_admin.scss index 622af28..c765bc1 100644 --- a/app/assets/stylesheets/_admin.scss +++ b/app/assets/stylesheets/_admin.scss @@ -123,6 +123,7 @@ table, .table { td, .table-td { &.inner-table { padding: 0.5em; + vertical-align: top; table { margin: 0; @@ -133,6 +134,10 @@ table, .table { &.bold { @include font-family(secondary); } + + .rules { + font-size: 0.75em; + } } tbody th { @@ -859,7 +864,7 @@ nav.sub-menu { min-width: 15em; } - .host-notes { + .host-notes, .house-rules { @include font-family(primary); font-size: 0.85em; border: 0.1em solid $light-gray; @@ -876,6 +881,11 @@ nav.sub-menu { } } + .house-rules { + max-height: 30em; + overflow: auto; + } + .guest-notes { position: relative; float: left; diff --git a/app/assets/stylesheets/_application.scss b/app/assets/stylesheets/_application.scss index eceec87..3c15ad4 100644 --- a/app/assets/stylesheets/_application.scss +++ b/app/assets/stylesheets/_application.scss @@ -153,43 +153,6 @@ table, .table { } } - // td, .table-td { - // &.inner-table { - // padding: 0; - - // table { - // margin: 0; - // width: 100%; - // } - - // tr:first-child { - // td, th { - // border-top: 0; - // } - // } - - // tr:last-child { - // td, th { - // border-bottom: 0; - // } - // } - - // td, th { - // &:first-child { - // border-left: 0 - // } - - // &:last-child { - // border-right: 0 - // } - // } - // } - - // &.bold { - // @include font-family(secondary); - // } - // } - tbody th { width: 0.1rem; } @@ -1760,6 +1723,10 @@ ul.warnings { .text-field & { margin: 0 0 1em 0; } + + &.top-message { + margin-top: 2em; + } } .success-info { diff --git a/app/controllers/conference_administration_controller.rb b/app/controllers/conference_administration_controller.rb index 82d4529..a84416c 100644 --- a/app/controllers/conference_administration_controller.rb +++ b/app/controllers/conference_administration_controller.rb @@ -479,8 +479,10 @@ class ConferenceAdministrationController < ApplicationController end end + @excel_data[:data] << host_data end + return respond_to do |format| format.xlsx { render xlsx: '../conferences/stats', filename: "housing" } end diff --git a/app/controllers/workshops_controller.rb b/app/controllers/workshops_controller.rb index 60c9e2e..6aedb28 100644 --- a/app/controllers/workshops_controller.rb +++ b/app/controllers/workshops_controller.rb @@ -67,8 +67,8 @@ class WorkshopsController < ApplicationController else return do_403 unless @can_edit - @title = @workshop.title - @info = @workshop.info + @title = @workshop.title! + @info = @workshop.info! end @needs = JSON.parse(@workshop.needs || '[]').map &:to_sym diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index d8bfb5b..eb553ee 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -112,7 +112,7 @@ module AdminHelper end def get_housing_match(host, guest, space) - housing_data = guest.housing_data || [] + housing_data = guest.housing_data || {} if housing_data['host'].present? if housing_data['host'] == host.id diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb index a9ccbc2..ddaf0d6 100644 --- a/app/helpers/form_helper.rb +++ b/app/helpers/form_helper.rb @@ -137,7 +137,8 @@ module FormHelper if options[:warning].present? description_id ||= "#{id}-desc" - html += content_tag(:div, _(options[:warning], :s, 2), id: description_id, class: 'warning-info') + # html += content_tag(:div, _(options[:warning], :s, 2), id: description_id, class: 'warning-info') + html += status_bubble(_(options[:warning], :s, 2), :warning, id: description_id) end aria = {} diff --git a/app/helpers/geocoder_helper.rb b/app/helpers/geocoder_helper.rb index b607da3..ed1507f 100644 --- a/app/helpers/geocoder_helper.rb +++ b/app/helpers/geocoder_helper.rb @@ -85,8 +85,14 @@ module GeocoderHelper end def location_link(location) - return '' unless location.present? && location.address.present? - content_tag(:a, (_!location.address), href: "http://www.google.com/maps/place/#{location.latitude},#{location.longitude}") + return '' unless location.present? + address = if location.is_a?(Location) + location.street + else + location.address + end + return '' unless address.present? + content_tag(:a, (_!address), href: "http://www.google.com/maps/place/#{location.latitude},#{location.longitude}") end def same_city?(location1, location2) diff --git a/app/helpers/widgets_helper.rb b/app/helpers/widgets_helper.rb index b2f2a0a..6dee5e8 100644 --- a/app/helpers/widgets_helper.rb +++ b/app/helpers/widgets_helper.rb @@ -112,20 +112,20 @@ module WidgetsHelper @housing_data[id][:guest_data][guest_id][:errors].each do |error, value| if value.is_a?(Array) value.each do |v| - status_html += content_tag(:li, _("errors.messages.housing.space.#{error.to_s}", vars: v)) + status_html += content_tag(:li, _("errors.messages.housing.space.#{error.to_s}", vars: v).html_safe) end else - status_html += content_tag(:li, _("errors.messages.housing.space.#{error.to_s}", vars: value)) + status_html += content_tag(:li, _("errors.messages.housing.space.#{error.to_s}", vars: value).html_safe) end end @housing_data[id][:guest_data][guest_id][:warnings].each do |error, value| if value.is_a?(Array) value.each do |v| - status_html += content_tag(:li, _("warnings.messages.housing.space.#{error.to_s}", v)) + status_html += content_tag(:li, _("warnings.messages.housing.space.#{error.to_s}", v).html_safe) end else - status_html += content_tag(:li, _("warnings.messages.housing.space.#{error.to_s}", vars: value)) + status_html += content_tag(:li, _("warnings.messages.housing.space.#{error.to_s}", vars: value).html_safe) end end @@ -326,4 +326,23 @@ module WidgetsHelper end end end + + def strong(text) + content_tag(:strong, text) + end + + def phone_link(number) + content_tag(:a, number, href: "tel:#{number}") + end + + def email_link(email) + content_tag(:a, email, href: "mailto:#{email}") + end + + def status_bubble(text, status, attributes = {}) + attributes[:class] ||= [] + attributes[:class] = [attributes[:class]] unless attributes[:class].is_a?(Array) + attributes[:class] << "#{status}-info" + content_tag(:div, text.html_safe, attributes) + end end diff --git a/app/views/conference_administration/_hosts_table.html.haml b/app/views/conference_administration/_hosts_table.html.haml index 21ed137..aad077f 100644 --- a/app/views/conference_administration/_hosts_table.html.haml +++ b/app/views/conference_administration/_hosts_table.html.haml @@ -8,15 +8,22 @@ - first_row = true %table.hosts.admin-edit - - @hosts.each do |id, registration| - - unless first_row - %tr.spacer - %td - %tr.host - %th - .name=registration.user.name - .address=registration.housing_data['address'] - - if registration.housing_data['notes'].present? - .host-notes=paragraph(registration.housing_data['notes']) - %td.inner-table{colspan: 2}=host_guests_table(registration) - - first_row = false + - @hosts.sort_by{ |id, registration| registration.user.name }.each do |id, registration| + - if @housing_data[id][:space].map { |k,v| v }.sum > 0 + - unless first_row + %tr.spacer + %td + %tr.host + %th + .name=registration.user.name + .address=location_link(Location.find_location(registration.housing_data['address'], @this_conference.city)) + - if registration.housing_data['notes'].present? + .host-notes=paragraph(registration.housing_data['notes']) + - if registration.housing_data['info'].present? + %div=_'articles.conference_registration.headings.housing.Rules', :t + .house-rules + =richtext(registration.housing_data['info'], 4) + + %td.inner-table{colspan: 2} + =host_guests_table(registration) + - first_row = false diff --git a/app/views/registration_steps/_review.html.haml b/app/views/registration_steps/_review.html.haml index 672081b..e9efc23 100644 --- a/app/views/registration_steps/_review.html.haml +++ b/app/views/registration_steps/_review.html.haml @@ -39,6 +39,16 @@ - if @allow_reopen_attendance .actions.centered = button :reopen_registration, value: :reopen_registration +- if @host + = row do + = columns(medium: 12) do + %h3=_'articles.conferences.headings.housing_info', :t + %p=(_'articles.conference_registration.paragraphs.Housing', :p, vars: { name: strong(@host.user.name), address: location_link(Location.find_location(@host.housing_data['address'], @this_conference.city)), phone: phone_link(@host.housing_data['phone']), email: email_link(@host.user.email) }).html_safe + = row do + = columns(medium: 12) do + %h4=_'articles.conference_registration.headings.hosting_info', :t + = richtext @host.housing_data['info'] + = row do = columns(medium: 12) do %h3=_'articles.workshops.headings.Workshops', :t diff --git a/app/views/shared/_navbar.html.haml b/app/views/shared/_navbar.html.haml index b88673e..1a45d77 100644 --- a/app/views/shared/_navbar.html.haml +++ b/app/views/shared/_navbar.html.haml @@ -20,6 +20,6 @@ - locale_translation = language_name(locale, true) - translation_text = (_'translate.content.change_locale', "Read in #{locale_translation}", vars: {language: locale_translation}, locale: locale) %a{href: url, lang: locale, title: translation_text} - %span{aria: {hidden: true}}=_!locale + %span{aria: {hidden: :true}}=_!locale = off_screen translation_text \ No newline at end of file diff --git a/app/views/workshops/_show.html.haml b/app/views/workshops/_show.html.haml index ca2d29e..cad5cc1 100644 --- a/app/views/workshops/_show.html.haml +++ b/app/views/workshops/_show.html.haml @@ -13,7 +13,7 @@ - if preview.blank? && translations_available_for_editing .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] + = 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] - if logged_in? = columns(medium: 6) do %h3=_'articles.workshops.headings.facilitators' @@ -30,19 +30,19 @@ .details .email=_!u.email - if f.role.to_sym == :requested - =(link_to (_'actions.workshops.Approve'), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'approve'), :class => [:button, :modify]) - =(link_to (_'actions.workshops.Deny'), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'deny'), :class => [:button, :delete]) + =(link_to (_'actions.workshops.Approve'), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'approve'), class: [:button, :modify]) + =(link_to (_'actions.workshops.Deny'), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'deny'), class: [:button, :delete]) - elsif workshop.can_remove?(current_user, u) - =(link_with_confirmation (_'actions.workshops.Make_Owner'), (_'modals.workshops.facilitators.confirm_transfer_ownership', vars: { user_name: u.name}),approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'switch_ownership'), :class => [:button, :modify]) unless f.role.to_sym == :creator || !workshop.creator?(current_user) - =(link_with_confirmation (_"actions.workshops.#{is_this_user ? 'Leave' : 'Remove'}"), (_"modals.workshops.facilitators.confirm_remove#{is_this_user ? '_self' : ''}", vars: { user_name: u.name}), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'remove'), :class => [:button, :delete]) + =(link_with_confirmation (_'actions.workshops.Make_Owner'), (_'modals.workshops.facilitators.confirm_transfer_ownership', vars: { user_name: u.name}),approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'switch_ownership'), class: [:button, :modify]) unless f.role.to_sym == :creator || !workshop.creator?(current_user) + =(link_with_confirmation (_"actions.workshops.#{is_this_user ? 'Leave' : 'Remove'}"), (_"modals.workshops.facilitators.confirm_remove#{is_this_user ? '_self' : ''}", vars: { user_name: u.name}), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'remove'), class: [:button, :delete]) - if is_this_user && workshop.requested_collaborator?(current_user) .details - =(link_with_confirmation (_'actions.workshops.Cancel_Request'), (_'modals.workshops.facilitators.confirm_cancel_request'), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'remove'), :class => [:button, :delete]) + =(link_with_confirmation (_'actions.workshops.Cancel_Request'), (_'modals.workshops.facilitators.confirm_cancel_request'), approve_facilitate_workshop_request_path(workshop.conference.slug, workshop.id, f.user_id, 'remove'), class: [:button, :delete]) - unless preview.present? - =(link_to (_'actions.workshops.Facilitate'), facilitate_workshop_path(workshop.conference.slug, workshop.id), :class => [:button, workshop.needs_facilitators ? :accented : :subdued]) unless workshop.facilitator?(current_user) + =(link_to (_'actions.workshops.Facilitate'), facilitate_workshop_path(workshop.conference.slug, workshop.id), class: [:button, workshop.needs_facilitators ? :accented : :subdued]) unless workshop.facilitator?(current_user) - if is_facilitator %h4=_'articles.workshops.headings.add_facilitator','Add a facilitator' - = form_tag workshop_add_facilitator_path(workshop.conference.slug, workshop.id), :class => 'add-facilitator mini-flex-form' do + = form_tag workshop_add_facilitator_path(workshop.conference.slug, workshop.id), class: 'add-facilitator mini-flex-form' do .email-field.input-field = email_field_tag :email, nil, required: true = label_tag :email diff --git a/app/views/workshops/new.html.haml b/app/views/workshops/new.html.haml index 8bd979b..6f3f38d 100644 --- a/app/views/workshops/new.html.haml +++ b/app/views/workshops/new.html.haml @@ -11,6 +11,8 @@ = hidden_field_tag :translation, @translation - else %h2=_@page_title, :t + - unless @is_translating || @workshop.locale.to_s == I18n.locale.to_s + = status_bubble(_('articles.workshops.paragraphs.not_original_locale', vars: { original_locale: language_name(@workshop.locale), this_locale: language_name(I18n.locale), link: translate_workshop_url(@workshop.conference.slug, @workshop.id, I18n.locale) }), :warning, class: 'top-message') - else %h2=_@page_title, :t diff --git a/config/locales/en.yml b/config/locales/en.yml index 48b0588..567fddd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1833,7 +1833,11 @@ en: volunteering_info: Volunteering info additional_details: Additional details companion: Companion + Housing: Housing + housing: + Rules: House Rules paragraphs: + Housing: You are staying at %{address}, your host's name is %{name}. You can contact them by email %{email} or by phone at %{phone}. Please take some time to read their house rules below. pronoun: It is important that communications with you and about you are as respectful as possible. If you do not provide a pronoun organizers may assume he, she, or they based on your name or visual identity. @@ -2242,6 +2246,7 @@ en: we want to hear about everyone’s experience within the many configurations of community shops we’re coming from. notes: Notes are only viewable by conference hosts and workshop facilitators + not_original_locale: You are editing a %{original_locale} workshop, edit the %{this_locale} translation instead facilitate_request: Please tell the current workshop facilitators who you are, why you want to help facilitate the workshop, and how you think you will help make the workshop better. All of the current facilitators will diff --git a/config/locales/fr.yml b/config/locales/fr.yml index c408787..f720c5b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1333,6 +1333,7 @@ fr: d’avis à nouveau,veuillez cliquer sur le boutonci-dessous,maissouvenez-vousquesi vous attendez trop longtemps,votre hébergement et votre bicyclette pourraient être attribués à quelqu’un d’autre. + Housing: Vous restez à %{address}, le nom de votre hôte est %{name}. Vous pouvez les contacter par email %{email} ou par téléphone à %{phone}. Prenez le temps de lire les règles de leur maison ci-dessous. pronoun_optional: Il n’y a aucune obligation de choisir un pronom. pronoun: Il importe que lorsqu'on communique avec vous ou au sujet de vous, ce soit avec respect. Si vous ne précisez pas votre pronom, les organisateurs @@ -1617,6 +1618,7 @@ fr: facilitate_request_sent: Votre demande a été envoyée. Vous recevrez un courriel une fois qu’elle aura été approuvée ou rejetée, ou si l’un des animateurs ou l’une des animatrices a des questions. + not_original_locale: Vous éditez un atelier %{original_locale}, éditez la traduction %{this_locale} à la place notes: Les remarques ne peuvent être vues que par organisateurs et les organisatrices ainsi que par les personnes qui animent les présentations. needs: Si vous avez besoin du matériel qui suit, les organisateurs et les