Development (#250)
* Fixed fonts * Fixed assets * Fixed logo in emails * Switched to immediate email delivery * Fixed prod emails and added deployment tasks * Fixed deployments * Updated README * Added Bike Collectives Core to README * Fixed issue with map loading * Fixed issue with map loading * Added map JSON data to assets precompilation * Fixed error sending to conference administrators * Let error report signature wrap * Fixed backtrace in error reports * Fixed backtrace in error reports * Moved pronoun heading to make it more obvoius I moved the "Pronoun" heading directly above the input field. It turned out that a lot of users were entering "He or "She" in the name field, I believe that was because of the placement of the "Pronoun" heading. I also needed to remove the optional warning but I'm hoping that won't cause problems. * Added an error message when no email address is used on login * Fixed select guest table * Added house rules to housing admin and review * Edit workshop locale warning
This commit is contained in:
parent
4054f450fc
commit
f54c09f248
@ -123,6 +123,7 @@ table, .table {
|
|||||||
td, .table-td {
|
td, .table-td {
|
||||||
&.inner-table {
|
&.inner-table {
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
|
vertical-align: top;
|
||||||
|
|
||||||
table {
|
table {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -133,6 +134,10 @@ table, .table {
|
|||||||
&.bold {
|
&.bold {
|
||||||
@include font-family(secondary);
|
@include font-family(secondary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.rules {
|
||||||
|
font-size: 0.75em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tbody th {
|
tbody th {
|
||||||
@ -859,7 +864,7 @@ nav.sub-menu {
|
|||||||
min-width: 15em;
|
min-width: 15em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.host-notes {
|
.host-notes, .house-rules {
|
||||||
@include font-family(primary);
|
@include font-family(primary);
|
||||||
font-size: 0.85em;
|
font-size: 0.85em;
|
||||||
border: 0.1em solid $light-gray;
|
border: 0.1em solid $light-gray;
|
||||||
@ -876,6 +881,11 @@ nav.sub-menu {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.house-rules {
|
||||||
|
max-height: 30em;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.guest-notes {
|
.guest-notes {
|
||||||
position: relative;
|
position: relative;
|
||||||
float: left;
|
float: left;
|
||||||
|
@ -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 {
|
tbody th {
|
||||||
width: 0.1rem;
|
width: 0.1rem;
|
||||||
}
|
}
|
||||||
@ -1760,6 +1723,10 @@ ul.warnings {
|
|||||||
.text-field & {
|
.text-field & {
|
||||||
margin: 0 0 1em 0;
|
margin: 0 0 1em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.top-message {
|
||||||
|
margin-top: 2em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.success-info {
|
.success-info {
|
||||||
|
@ -479,8 +479,10 @@ class ConferenceAdministrationController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@excel_data[:data] << host_data
|
@excel_data[:data] << host_data
|
||||||
end
|
end
|
||||||
|
|
||||||
return respond_to do |format|
|
return respond_to do |format|
|
||||||
format.xlsx { render xlsx: '../conferences/stats', filename: "housing" }
|
format.xlsx { render xlsx: '../conferences/stats', filename: "housing" }
|
||||||
end
|
end
|
||||||
|
@ -67,8 +67,8 @@ class WorkshopsController < ApplicationController
|
|||||||
else
|
else
|
||||||
return do_403 unless @can_edit
|
return do_403 unless @can_edit
|
||||||
|
|
||||||
@title = @workshop.title
|
@title = @workshop.title!
|
||||||
@info = @workshop.info
|
@info = @workshop.info!
|
||||||
end
|
end
|
||||||
|
|
||||||
@needs = JSON.parse(@workshop.needs || '[]').map &:to_sym
|
@needs = JSON.parse(@workshop.needs || '[]').map &:to_sym
|
||||||
|
@ -112,7 +112,7 @@ module AdminHelper
|
|||||||
end
|
end
|
||||||
|
|
||||||
def get_housing_match(host, guest, space)
|
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'].present?
|
||||||
if housing_data['host'] == host.id
|
if housing_data['host'] == host.id
|
||||||
|
@ -137,7 +137,8 @@ module FormHelper
|
|||||||
|
|
||||||
if options[:warning].present?
|
if options[:warning].present?
|
||||||
description_id ||= "#{id}-desc"
|
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
|
end
|
||||||
|
|
||||||
aria = {}
|
aria = {}
|
||||||
|
@ -85,8 +85,14 @@ module GeocoderHelper
|
|||||||
end
|
end
|
||||||
|
|
||||||
def location_link(location)
|
def location_link(location)
|
||||||
return '' unless location.present? && location.address.present?
|
return '' unless location.present?
|
||||||
content_tag(:a, (_!location.address), href: "http://www.google.com/maps/place/#{location.latitude},#{location.longitude}")
|
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
|
end
|
||||||
|
|
||||||
def same_city?(location1, location2)
|
def same_city?(location1, location2)
|
||||||
|
@ -112,20 +112,20 @@ module WidgetsHelper
|
|||||||
@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)
|
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))
|
status_html += content_tag(:li, _("errors.messages.housing.space.#{error.to_s}", vars: v).html_safe)
|
||||||
end
|
end
|
||||||
else
|
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
|
||||||
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)
|
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))
|
status_html += content_tag(:li, _("warnings.messages.housing.space.#{error.to_s}", v).html_safe)
|
||||||
end
|
end
|
||||||
else
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -326,4 +326,23 @@ module WidgetsHelper
|
|||||||
end
|
end
|
||||||
end
|
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
|
end
|
||||||
|
@ -8,15 +8,22 @@
|
|||||||
|
|
||||||
- first_row = true
|
- first_row = true
|
||||||
%table.hosts.admin-edit
|
%table.hosts.admin-edit
|
||||||
- @hosts.each do |id, registration|
|
- @hosts.sort_by{ |id, registration| registration.user.name }.each do |id, registration|
|
||||||
- unless first_row
|
- if @housing_data[id][:space].map { |k,v| v }.sum > 0
|
||||||
%tr.spacer
|
- unless first_row
|
||||||
%td
|
%tr.spacer
|
||||||
%tr.host
|
%td
|
||||||
%th
|
%tr.host
|
||||||
.name=registration.user.name
|
%th
|
||||||
.address=registration.housing_data['address']
|
.name=registration.user.name
|
||||||
- if registration.housing_data['notes'].present?
|
.address=location_link(Location.find_location(registration.housing_data['address'], @this_conference.city))
|
||||||
.host-notes=paragraph(registration.housing_data['notes'])
|
- if registration.housing_data['notes'].present?
|
||||||
%td.inner-table{colspan: 2}=host_guests_table(registration)
|
.host-notes=paragraph(registration.housing_data['notes'])
|
||||||
- first_row = false
|
- 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
|
||||||
|
@ -39,6 +39,16 @@
|
|||||||
- if @allow_reopen_attendance
|
- if @allow_reopen_attendance
|
||||||
.actions.centered
|
.actions.centered
|
||||||
= button :reopen_registration, value: :reopen_registration
|
= 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
|
= row do
|
||||||
= columns(medium: 12) do
|
= columns(medium: 12) do
|
||||||
%h3=_'articles.workshops.headings.Workshops', :t
|
%h3=_'articles.workshops.headings.Workshops', :t
|
||||||
|
@ -20,6 +20,6 @@
|
|||||||
- locale_translation = language_name(locale, true)
|
- locale_translation = language_name(locale, true)
|
||||||
- translation_text = (_'translate.content.change_locale', "Read in #{locale_translation}", vars: {language: locale_translation}, locale: locale)
|
- translation_text = (_'translate.content.change_locale', "Read in #{locale_translation}", vars: {language: locale_translation}, locale: locale)
|
||||||
%a{href: url, lang: locale, title: translation_text}
|
%a{href: url, lang: locale, title: translation_text}
|
||||||
%span{aria: {hidden: true}}=_!locale
|
%span{aria: {hidden: :true}}=_!locale
|
||||||
= off_screen translation_text
|
= off_screen translation_text
|
||||||
|
|
@ -13,7 +13,7 @@
|
|||||||
- if preview.blank? && translations_available_for_editing
|
- if preview.blank? && translations_available_for_editing
|
||||||
.actions.center
|
.actions.center
|
||||||
- translations_available_for_editing.each do |locale|
|
- 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?
|
- if logged_in?
|
||||||
= columns(medium: 6) do
|
= columns(medium: 6) do
|
||||||
%h3=_'articles.workshops.headings.facilitators'
|
%h3=_'articles.workshops.headings.facilitators'
|
||||||
@ -30,19 +30,19 @@
|
|||||||
.details
|
.details
|
||||||
.email=_!u.email
|
.email=_!u.email
|
||||||
- if f.role.to_sym == :requested
|
- 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.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.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)
|
- 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.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.#{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)
|
- if is_this_user && workshop.requested_collaborator?(current_user)
|
||||||
.details
|
.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?
|
- 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
|
- if is_facilitator
|
||||||
%h4=_'articles.workshops.headings.add_facilitator','Add a 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.input-field
|
||||||
= email_field_tag :email, nil, required: true
|
= email_field_tag :email, nil, required: true
|
||||||
= label_tag :email
|
= label_tag :email
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
= hidden_field_tag :translation, @translation
|
= hidden_field_tag :translation, @translation
|
||||||
- else
|
- else
|
||||||
%h2=_@page_title, :t
|
%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
|
- else
|
||||||
%h2=_@page_title, :t
|
%h2=_@page_title, :t
|
||||||
|
|
||||||
|
@ -1833,7 +1833,11 @@ en:
|
|||||||
volunteering_info: Volunteering info
|
volunteering_info: Volunteering info
|
||||||
additional_details: Additional details
|
additional_details: Additional details
|
||||||
companion: Companion
|
companion: Companion
|
||||||
|
Housing: Housing
|
||||||
|
housing:
|
||||||
|
Rules: House Rules
|
||||||
paragraphs:
|
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
|
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
|
respectful as possible. If you do not provide a pronoun organizers may assume
|
||||||
he, she, or they based on your name or visual identity.
|
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
|
we want to hear about everyone’s experience within the many configurations
|
||||||
of community shops we’re coming from.
|
of community shops we’re coming from.
|
||||||
notes: Notes are only viewable by conference hosts and workshop facilitators
|
notes: Notes are only viewable by conference hosts and workshop facilitators
|
||||||
|
not_original_locale: You are editing a %{original_locale} workshop, <a href="%{link}">edit the %{this_locale} translation instead</a>
|
||||||
facilitate_request: Please tell the current workshop facilitators who you
|
facilitate_request: Please tell the current workshop facilitators who you
|
||||||
are, why you want to help facilitate the workshop, and how you think 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
|
will help make the workshop better. All of the current facilitators will
|
||||||
|
@ -1333,6 +1333,7 @@ fr:
|
|||||||
d’avis à nouveau,veuillez cliquer sur le boutonci-dessous,maissouvenez-vousquesi
|
d’avis à nouveau,veuillez cliquer sur le boutonci-dessous,maissouvenez-vousquesi
|
||||||
vous attendez trop longtemps,votre hébergement et votre bicyclette pourraient
|
vous attendez trop longtemps,votre hébergement et votre bicyclette pourraient
|
||||||
être attribués à quelqu’un d’autre.
|
ê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_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,
|
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
|
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
|
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
|
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.
|
ou l’une des animatrices a des questions.
|
||||||
|
not_original_locale: Vous éditez un atelier %{original_locale}, <a href="%{link}">éditez la traduction %{this_locale} à la place</a>
|
||||||
notes: Les remarques ne peuvent être vues que par organisateurs et les organisatrices
|
notes: Les remarques ne peuvent être vues que par organisateurs et les organisatrices
|
||||||
ainsi que par les personnes qui animent les présentations.
|
ainsi que par les personnes qui animent les présentations.
|
||||||
needs: Si vous avez besoin du matériel qui suit, les organisateurs et les
|
needs: Si vous avez besoin du matériel qui suit, les organisateurs et les
|
||||||
|
Loading…
x
Reference in New Issue
Block a user