Skip to content

Commit

Permalink
add batch editing for events
Browse files Browse the repository at this point in the history
  • Loading branch information
elad-eyal committed Oct 9, 2019
1 parent b60ee7f commit 0c5ab8b
Show file tree
Hide file tree
Showing 12 changed files with 257 additions and 1 deletion.
30 changes: 30 additions & 0 deletions app/controllers/events_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ def start_review
def batch_actions
if params[:bulk_email]
bulk_send_email
elsif params[:bulk_set]
bulk_set
else
redirect_to events_path, alert: :illegal
end
Expand All @@ -141,6 +143,34 @@ def bulk_send_email
redirect_back(notice: t('emails_module.notice_mails_delivered'), fallback_location: root_path)
end
end

def bulk_set
authorize @conference, :orga?
events = search @conference.events

total_successful = 0
total_skipped = 0
total_failed = 0
events.each do |event|
if event.try(params[:bulk_set_attribute]) == params[:bulk_set_value]
total_skipped +=1
elsif event.update( params[:bulk_set_attribute] => params[:bulk_set_value] )
total_successful += 1
else
total_failed += 1
end
end

summary = [ t('events_module.bulk_edit.update_successful', count: total_successful),
(t('events_module.bulk_edit.update_skipped', count: total_skipped) if total_skipped > 0),
(t('events_module.bulk_edit.update_failed', count: total_failed) if total_failed > 0) ].join(' ')

if total_failed > 0
redirect_back alert: summary, fallback_location: root_path
else
redirect_back notice: summary, fallback_location: root_path
end
end

# GET /events/1
# GET /events/1.json
Expand Down
4 changes: 4 additions & 0 deletions app/models/event.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ def localized_event_type(locale = nil)
def track_name
track.try(:name)
end

def track_name=(name)
update(track: conference.tracks.find_by(name: name))
end

def end_time
start_time.since((time_slots * conference.timeslot_duration).minutes)
Expand Down
40 changes: 39 additions & 1 deletion app/views/events/_below_table.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,42 @@
id: 'bulk_email',
data: { confirm: t('notifications_module.send_unspecified_notification_confirm', count: @num_of_matching_events) },
class: 'danger'


- if policy(@conference).manage?
%p
= link_to t('events_module.bulk_edit.toggle'), "#bulk_edit", data: { function: 'toggle', args: { target: '#bulk_edit' } }
#bulk_edit{style: "display:none;"}
- if @conference.tracks.any?
= simple_form_for(:bulk_edit_track, url: batch_actions_events_path(request.query_parameters), method: :post) do |f|
.actions
= f.label t('events_module.bulk_edit.set_new_track')
= f.hidden_field 'bulk_set_attribute', value: 'track_name', name: 'bulk_set_attribute'
= select_tag 'bulk_set_value', options_for_select(@conference.tracks.map { |t| t.name.to_s }), include_blank: t('select_one'), style: "width:400px"
= f.button :submit,
t('events_module.bulk_edit.set'),
name: 'bulk_set',
id: 'bulk_set',
data: { confirm: t('events_module.bulk_edit.set_events_confirm', count: @num_of_matching_events) },
class: 'danger'
= simple_form_for(:bulk_edit_event_type, url: batch_actions_events_path(request.query_parameters), method: :post) do |f|
.actions
= f.label t('events_module.bulk_edit.set_new_event_type')
= f.hidden_field 'bulk_set_attribute', value: 'event_type', name: 'bulk_set_attribute'
= select_tag 'bulk_set_value', options_for_select(translated_options(Event::TYPES)), include_blank: t('select_one'), style: "width:400px"
= f.button :submit,
t('events_module.bulk_edit.set'),
name: 'bulk_set',
id: 'bulk_set',
data: { confirm: t('events_module.bulk_edit.set_events_confirm', count: @num_of_matching_events) },
class: 'danger'
= simple_form_for(:bulk_edit_event_state, url: batch_actions_events_path(request.query_parameters), method: :post) do |f|
.actions
= f.label t('events_module.bulk_edit.set_new_state')
= f.hidden_field 'bulk_set_attribute', value: 'state', name: 'bulk_set_attribute'
= select_tag 'bulk_set_value', options_for_select(Event.state_machine.states.map { |st| [st.display_name, st.name.to_s] }), include_blank: t('select_one'), style: "width:400px"
= f.button :submit,
t('events_module.bulk_edit.set'),
name: 'bulk_set',
id: 'bulk_set',
data: { confirm: t('events_module.bulk_edit.set_events_confirm', count: @num_of_matching_events) },
class: 'danger'
19 changes: 19 additions & 0 deletions config/locales/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -960,6 +960,24 @@ de:
attachments_overview: Anhänge
average_feedback: 'Durchschnittliches Feedback:'
average_speaker_feedback: 'Durchschnittliches Feedback als Sprecher:'
bulk_edit:
set: einstellen
set_events_confirm:
one: Möchten Sie den Status für dieses Ereignis wirklich ändern?
other: Möchten Sie den Status für alle %{count}-Ereignisse wirklich ändern?
set_new_event_type: Ereignistyp ändern
set_new_state: Zustand zuweisen
set_new_track: Titel zuweisen
toggle: Bearbeiten Sie diese Ereignisse >>
update_failed:
one: "%{count}-Bearbeitung fehlgeschlagen."
other: "%{count} Änderungen fehlgeschlagen."
update_skipped:
one: "%{count} Bearbeitung übersprungen."
other: "%{count} Änderungen übersprungen."
update_successful:
one: "%{count} Bearbeitung erfolgreich abgeschlossen."
other: "%{count} Änderungen wurden erfolgreich abgeschlossen."
cancel_event: Event absagen
cancel_event_hint: Markieren Sie dieses Event als abgesagt. Üblicherweise bedeutet dies, dass die Referenten ihren Auftritt absagen mussten.
col_toggle_rooms: 'Räume wechseln:'
Expand Down Expand Up @@ -2033,6 +2051,7 @@ de:
login: Einloggen
signup: Anmelden
update_password: Aktualisiere mein Passwort
set: einstellen
settings: Einstellungen
show: Anzeige
show_account: Konto
Expand Down
19 changes: 19 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -944,6 +944,24 @@ en:
ago: "%{time_ago} ago"
all_events: All events
all_rating: All ratings
bulk_edit:
set: Set
set_new_state: Assign state
set_new_track: Assign track
set_new_event_type: Change event type
set_events_confirm:
one: you sure you want to change state for this event?
other: Are you sure you want to change state for all %{count} events?
toggle: "Edit these events >>"
update_successful:
one: "%{count} edit completed successfully."
other: "%{count} edits completed successfully."
update_skipped:
one: "%{count} edit skipped."
other: "%{count} edits skipped."
update_failed:
one: "%{count} edit failed."
other: "%{count} edits failed."
predefined_title_types:
handouts: handouts
media: media
Expand Down Expand Up @@ -2014,6 +2032,7 @@ en:
login: Log in
signup: Sign up
update_password: Update my password
set: Set
settings: Settings
show: Show
show_account: Account
Expand Down
19 changes: 19 additions & 0 deletions config/locales/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -995,6 +995,24 @@ es:
attachments_overview: Archivos adjuntos
average_feedback: 'Comentarios promedio:'
average_speaker_feedback: 'Comentarios promedio como ponente:'
bulk_edit:
set: Conjunto
set_events_confirm:
one: "¿Estás seguro de que quieres cambiar el estado de este evento?"
other: "¿Está seguro de que desea cambiar el estado de todos los eventos %{count}?"
set_new_event_type: Cambiar tipo de evento
set_new_state: Asignar estado
set_new_track: Asignar pista
toggle: Edita estos eventos >>
update_failed:
one: La edición %{count} falló.
other: Las ediciones %{count} fallaron.
update_skipped:
one: Edición %{count} omitida.
other: Ediciones %{count} omitidas.
update_successful:
one: Edición %{count} completada con éxito.
other: Las ediciones %{count} se completaron correctamente.
cancel_event: Cancelar evento
cancel_event_hint: Marque este evento como cancelado. Por lo general, esto significa que los oradores tuvieron que cancelar su apariencia.
col_toggle_rooms: 'Conmutar habitaciones:'
Expand Down Expand Up @@ -2071,6 +2089,7 @@ es:
login: Iniciar sesión
signup: Regístrate
update_password: Actualiza mi contraseña
set: Conjunto
settings: Personalización
show: Espectáculo
show_account: Cuenta
Expand Down
19 changes: 19 additions & 0 deletions config/locales/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -974,6 +974,24 @@ fr:
attachments_overview: Les pièces jointes
average_feedback: 'Moyenne des retours :'
average_speaker_feedback: 'Moyenne des retours par orateur :'
bulk_edit:
set: Ensemble
set_events_confirm:
one: vous êtes sûr de vouloir changer d'état pour cet événement?
other: Êtes-vous sûr de vouloir changer d'état pour tous les événements %{count}?
set_new_event_type: Changer le type d'événement
set_new_state: Attribuer l'état
set_new_track: Assigner une piste
toggle: Editer ces événements >>
update_failed:
one: "%{count} édition a échoué."
other: Les modifications de %{count} ont échoué.
update_skipped:
one: "%{count} édition ignorée."
other: "%{count} modifications ignorées."
update_successful:
one: "%{count} édition terminée avec succès."
other: "%{count} modifications terminées avec succès."
cancel_event: Annuler l’évènement
cancel_event_hint: |
Définit cet évènement comme annulé. Généralement, celà veut dire que l’orateur
Expand Down Expand Up @@ -2047,6 +2065,7 @@ fr:
login: Connexion
signup: Créer mon compte
update_password: Changer mon mot de passe
set: Ensemble
settings: Paramètres
show: Afficher
show_account: Compte
Expand Down
19 changes: 19 additions & 0 deletions config/locales/it.yml
Original file line number Diff line number Diff line change
Expand Up @@ -978,6 +978,24 @@ it:
attachments_overview: allegati
average_feedback: 'Rendimenti medi:'
average_speaker_feedback: 'Rendimenti medi per oratore:'
bulk_edit:
set: Impostato
set_events_confirm:
one: sei sicuro di voler cambiare stato per questo evento?
other: Sei sicuro di voler cambiare stato per tutti gli eventi %{count}?
set_new_event_type: Cambia tipo di evento
set_new_state: Assegna stato
set_new_track: Assegna traccia
toggle: Modifica questi eventi >>
update_failed:
one: Modifica di %{count} non riuscita.
other: "%{count} modifiche non riuscite."
update_skipped:
one: "%{count} modifica saltata."
other: "%{count} modifiche saltate."
update_successful:
one: "%{count} modifica completata correttamente."
other: "%{count} modifiche completate correttamente."
cancel_event: Annulla l'evento
cancel_event_hint: |
Imposta questo evento come cancellato. Generalmente, ciò significa che l'oratore
Expand Down Expand Up @@ -2051,6 +2069,7 @@ it:
login: Entra
signup: Crea il mio account
update_password: Cambia la mia password
set: Impostato
settings: impostazioni
show: Affiggere
show_account: conto
Expand Down
19 changes: 19 additions & 0 deletions config/locales/pt-BR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,24 @@ pt-BR:
attachments_overview: Anexos
average_feedback: 'Feedback médio:'
average_speaker_feedback: 'Feedback médio como palestrante:'
bulk_edit:
set: Conjunto
set_events_confirm:
one: Tem certeza de que deseja alterar o estado deste evento?
other: Tem certeza de que deseja alterar o estado de todos os eventos %{count}?
set_new_event_type: Alterar tipo de evento
set_new_state: Atribuir estado
set_new_track: Atribuir faixa
toggle: Editar esses eventos >>
update_failed:
one: A edição %{count} falhou.
other: As edições %{count} falharam.
update_skipped:
one: "%{count} edição ignorada."
other: edições %{count} ignoradas.
update_successful:
one: Edição %{count} concluída com sucesso.
other: edições %{count} concluídas com sucesso.
cancel_event: Cancelar evento
cancel_event_hint: Marque este evento como cancelado. Geralmente isso significa que os alto-falantes tiveram que cancelar sua aparência.
col_toggle_rooms: 'Alternar salas:'
Expand Down Expand Up @@ -2055,6 +2073,7 @@ pt-BR:
login: Entrar
signup: inscrever-se
update_password: Atualizar minha senha
set: Conjunto
settings: Configurações
show: Exibição
show_account: Conta
Expand Down
19 changes: 19 additions & 0 deletions config/locales/ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -953,6 +953,24 @@ ru:
attachments_overview: Вложения
average_feedback: 'Средняя оценка:'
average_speaker_feedback: 'Средняя обратная связь как динамик:'
bulk_edit:
set: Установлен
set_events_confirm:
one: Вы уверены, что хотите изменить состояние для этого события?
other: Вы уверены, что хотите изменить состояние для всех событий %{count}?
set_new_event_type: Изменить тип события
set_new_state: Назначить государство
set_new_track: Назначить трек
toggle: Редактировать эти события >>
update_failed:
one: Ошибка редактирования %{count}.
other: Ошибка редактирования %{count}.
update_skipped:
one: "%{count} правка пропущена."
other: "%{count} правок пропущено."
update_successful:
one: Редактирование %{count} завершено успешно.
other: Редактирование %{count} завершено успешно.
cancel_event: Отменить событие
cancel_event_hint: Отметьте это событие как отмененное. Обычно это означает, что ораторы должны были отменить свою внешность.
col_toggle_rooms: 'Переключить комнаты:'
Expand Down Expand Up @@ -2021,6 +2039,7 @@ ru:
login: Авторизоваться
signup: зарегистрироваться
update_password: Обновить мой пароль
set: Установлен
settings: настройки
show: дисплей
show_account: Счет
Expand Down
19 changes: 19 additions & 0 deletions config/locales/zh.yml
Original file line number Diff line number Diff line change
Expand Up @@ -953,6 +953,24 @@ zh:
attachments_overview: 附件
average_feedback: 平均反馈:
average_speaker_feedback: 以演讲者的平均反馈:
bulk_edit:
set:
set_events_confirm:
one: 您确定要更改此事件的状态?
other: 您确定要更改所有%{count}事件的状态吗?
set_new_event_type: 变更事件类型
set_new_state: 分配状态
set_new_track: 分配曲目
toggle: 编辑这些事件>>
update_failed:
one: "%{count}编辑失败。"
other: "%{count}编辑失败。"
update_skipped:
one: "%{count}编辑已跳过。"
other: "%{count}编辑已跳过。"
update_successful:
one: "%{count}编辑成功完成。"
other: "%{count}编辑成功完成。"
cancel_event: 取消活动
cancel_event_hint: 将此事件标记为已取消。通常这意味着扬声器必须取消它们的外观。
col_toggle_rooms: 切换房间:
Expand Down Expand Up @@ -2021,6 +2039,7 @@ zh:
login: 登录
signup: 注册
update_password: 更新我的密码
set:
settings: 设置
show: 显示
show_account: 帐户
Expand Down
32 changes: 32 additions & 0 deletions test/features/bulk_edit_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require 'test_helper'

class BulkEditTest < FeatureTest
setup do
@conference = create(:three_day_conference_with_events_and_speakers)
@event = @conference.events.last
@event.update( event_type: 'podium')
@admin = create(:admin_user)
end

it 'can bulk edit', js: true do
sign_in_user(@admin)

visit "/#{@conference.acronym}/events"
click_on 'podium'

find('form.bulk_edit_event_type', visible: :hidden)
click_on 'Edit these events'

find('form.bulk_edit_event_type').select 'Film', from: 'bulk_set_value'
find('form.bulk_edit_event_type').click_on 'Set'

assert_content page, 'edit completed successfully'
assert_content page, 'yielded no results'

click_on '[x]' # Back to "all events"
assert_content page, /(?i)film/ # @event was updated successfully
refute_content page, /(?i)podium/ # @event was updated successfully
assert_content page, /(?i)talk/ # Other events were not modified
end
end

0 comments on commit 0c5ab8b

Please sign in to comment.