From 81a875c6486c44e79905f092f1e5b024bbb64278 Mon Sep 17 00:00:00 2001 From: eladeyal-intel Date: Wed, 9 Oct 2019 14:28:39 +0300 Subject: [PATCH] add batch editing for events see #581 --- app/controllers/events_controller.rb | 66 +++++++++++++++++++ app/models/event.rb | 4 ++ app/views/events/_below_table.html.haml | 84 +++++++++++++++++++++++++ config/locales/de.yml | 29 +++++++++ config/locales/en.yml | 32 ++++++++++ config/locales/es.yml | 29 +++++++++ config/locales/fr.yml | 29 +++++++++ config/locales/it.yml | 29 +++++++++ config/locales/pt-BR.yml | 29 +++++++++ config/locales/ru.yml | 43 +++++++++++++ config/locales/zh.yml | 29 +++++++++ test/features/bulk_edit_test.rb | 32 ++++++++++ 12 files changed, 435 insertions(+) create mode 100644 test/features/bulk_edit_test.rb diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 1cc69ecb3..7930ce235 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -149,6 +149,10 @@ def start_review def batch_actions if params[:bulk_email] bulk_send_email + elsif params[:bulk_set] + bulk_set + elsif params[:bulk_add_person] + bulk_add_person else redirect_to events_path, alert: :illegal end @@ -171,7 +175,69 @@ 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_with_review_averages.includes(:track) + + 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 + def bulk_add_person + authorize @conference, :orga? + events = search @conference.events_with_review_averages.includes(:track) + + person_id = params[:person_id] + event_role = params[:event_role] + redirect_back(alert: t('ability.denied'), fallback_location: root_path) and return if person_id.blank? or event_role.blank? + + total_successful = 0 + total_skipped = 0 + total_failed = 0 + + events.each do |event| + if EventPerson.where(event: event, person_id: person_id, event_role: event_role).any? + total_skipped +=1 + elsif event.update( event_people_attributes: { 'x' => { person_id: person_id, + event_role: event_role } } ) + 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 def show diff --git a/app/models/event.rb b/app/models/event.rb index 9c2204414..066cc9ab3 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -90,6 +90,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) diff --git a/app/views/events/_below_table.html.haml b/app/views/events/_below_table.html.haml index c1f60084a..ab60ed8bd 100644 --- a/app/views/events/_below_table.html.haml +++ b/app/views/events/_below_table.html.haml @@ -13,4 +13,88 @@ 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| + = 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('set'), + name: 'bulk_set', + id: 'bulk_set', + data: { confirm: t('events_module.bulk_edit.set_track_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| + = 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(@conference.allowed_event_types_as_list)), include_blank: t('select_one'), style: "width:400px" + = f.button :submit, + t('set'), + name: 'bulk_set', + id: 'bulk_set', + data: { confirm: t('events_module.bulk_edit.set_events_type_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| + = 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| [t(st.name.to_s, scope: 'conferences_module'), st.name.to_s] }), + include_blank: t('select_one'), style: "width:400px" + = f.button :submit, + t('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_add_person, + url: batch_actions_events_path(request.query_parameters), + method: :post, + data: { persons: Person.fullname_options } ) do |f| + .peoplefilter + = f.label t('events_module.bulk_edit.add_person') + = text_field_tag :filter, 'filter', style: "width:200px" + = select_tag :person_id, + options_for_select(Person.all.sort_by(&:full_name).map{|p| [p.full_name_annotated, p.id]}), + name: :person_id, + include_blank: t('select_one'), + style: "width:200px" + = select_tag :event_role, + options_for_select(translated_options(EventPerson::ROLES)), + include_blank: t('select_one'), + style: "width:200px" + = f.button :submit, + t('add'), + name: 'bulk_add_person', + id: 'bulk_add_person', + data: { confirm: t('events_module.bulk_edit.add_person_confirm', count: @num_of_matching_events) }, + class: 'danger' +:javascript + attach_filter = function(set) { + form = $("form.bulk_edit_add_person"); + var persons = form.data()["persons"]; + var q = $(set).find('input[name=filter]'); + var list = $(set).find('select[name=person_id]'); + + q.on('input', function(e) { + $(list).empty(); + $(list).append($('