From 6f0cdc64c3b86e8d7c26da041eb7605bd4e77ac5 Mon Sep 17 00:00:00 2001 From: Ana Date: Fri, 22 Jul 2016 17:57:26 +0200 Subject: [PATCH] Introduce a "Save" button for the admin schedule The changes were saved after you drop an event, and now it only saves the schedule when you're done with the changes and click the "Save" button. --- app/assets/javascripts/osem-schedule.js | 146 +++++++++++------- app/assets/javascripts/osem-switch.js | 2 +- .../admin/event_schedules_controller.rb | 12 +- app/views/admin/schedules/show.html.haml | 2 + 4 files changed, 105 insertions(+), 57 deletions(-) diff --git a/app/assets/javascripts/osem-schedule.js b/app/assets/javascripts/osem-schedule.js index baae1933..fa9cec70 100644 --- a/app/assets/javascripts/osem-schedule.js +++ b/app/assets/javascripts/osem-schedule.js @@ -1,10 +1,13 @@ var url; // Should be initialize in Schedule.initialize var schedule_id; // Should be initialize in Schedule.initialize -function showError(error){ - // Delete other error messages before showing the new one +var events_to_save = {}; +var events_to_remove = {}; + +function showMessage(message, type){ + // Delete other messages before showing the new one $('.unobtrusive-flash-container').empty(); - UnobtrusiveFlash.showFlashMessage(error, {type: 'error'}); + UnobtrusiveFlash.showFlashMessage(message, {type: type}); } var Schedule = { @@ -14,66 +17,99 @@ var Schedule = { }, remove: function(element) { var e = $("#" + element); - var event_schedule_id = e.attr("event_schedule_id"); - if(event_schedule_id != null){ - var my_url = url + '/' + event_schedule_id; - var success_callback = function(data) { - console.log(data); - e.attr("event_schedule_id", null); - e.appendTo($(".unscheduled-events")); - e.find(".schedule-event-delete-button").hide(); + var event_id = e.attr("event_id"); + if(e.attr("event_schedule_id")!= null){ + events_to_remove[event_id] = { + event: e, + previous_parent: e.parent() + }; + } + delete events_to_save[event_id]; + var unscheduled = $(".unscheduled-events"); + e.appendTo(unscheduled); + e.find(".schedule-event-delete-button").hide(); + }, + add: function (previous_parent, new_parent, event) { + var params = { + previous_parent: previous_parent, + new_parent: new_parent, + event: event + } + var event_id = event.attr("event_id"); + events_to_save[event_id] = params; + delete events_to_remove[event_id]; + event.appendTo(new_parent); + $("#event-" + event_id).find(".schedule-event-delete-button").show(); + }, + saveEvents: function () { + var errors = ''; + for (var key in events_to_save){ + var event = events_to_save[key]['event']; + var event_schedule_id = event.attr("event_schedule_id"); + var new_parent = events_to_save[key]['new_parent']; + var my_url = url; + var type = 'POST'; + var params = { event_schedule: { + room_id: new_parent.attr("room_id"), + start_time: (new_parent.attr("date") + ' ' + new_parent.attr("hour")) + }}; + if(event_schedule_id != null){ + type = 'PUT'; + my_url += ('/' + event_schedule_id); } - var error_callback = function(data) { + else{ + params['event_schedule']['event_id'] = event.attr("event_id"); + params['event_schedule']['schedule_id'] = schedule_id; + } + var success_callback_save = function(data) { console.log(data); - showError($.parseJSON(data.responseText).errors); + event.attr("event_schedule_id", data.event_schedule_id); + } + var error_callback_save = function(data) { + console.log(data); + errors += $.parseJSON(data.responseText).errors; + event.appendTo(events_to_save[key]['previous_parent']); + if(parent.hasClass('unscheduled-events')) + event.find(".schedule-event-delete-button").hide(); } $.ajax({ + async: false, url: my_url, - type: 'DELETE', - success: success_callback, - error: error_callback, + type: type, + data: params, + success: success_callback_save, + error: error_callback_save, dataType : 'json' }); } - else{ - showError("The event couldn't be unscheduled"); - } - }, - add: function (previous_parent, new_parent, event) { - event.appendTo(new_parent); - var event_schedule_id = event.attr("event_schedule_id"); - var my_url = url; - var type = 'POST'; - var params = { event_schedule: { - room_id: new_parent.attr("room_id"), - start_time: (new_parent.attr("date") + ' ' + new_parent.attr("hour")) - }}; - if(event_schedule_id != null){ - type = 'PUT'; - my_url += ('/' + event_schedule_id); - } - else{ - params['event_schedule']['event_id'] = event.attr("event_id"); - params['event_schedule']['schedule_id'] = schedule_id; - } - var success_callback = function(data) { - console.log(data); - event.attr("event_schedule_id", data.event_schedule_id); - event.find(".schedule-event-delete-button").show(); + for (var key in events_to_remove){ + var event = events_to_remove[key]['event']; + var success_callback_remove = function(data) { + console.log(data); + event.attr("event_schedule_id", null); } - var error_callback = function(data) { - console.log(data); - showError($.parseJSON(data.responseText).errors); - event.appendTo(previous_parent); + var error_callback_remove = function(data) { + console.log(data); + errors += $.parseJSON(data.responseText).errors; + events_to_remove[key]['previous_parent'].append(event); + if(!parent.hasClass('unscheduled-events')) + event.find(".schedule-event-delete-button").show(); + } + $.ajax({ + async: false, + url: url + '/' + event.attr("event_schedule_id"), + type: 'DELETE', + success: success_callback_remove, + error: error_callback_remove, + dataType : 'json' + }); } - $.ajax({ - url: my_url, - type: type, - data: params, - success: success_callback, - error: error_callback, - dataType : 'json' - }); + events_to_remove = {}; + events_to_save = {}; + if(errors == '') + showMessage('Schedule correctly saved', 'notice'); + else + showMessage(errors, 'error'); } }; @@ -115,6 +151,10 @@ $(document).ready( function() { $(this).css("background-color", "#ffffff"); } }); + + $('.schedule-save').on('click', function(e) { + Schedule.saveEvents(); + }); }); function eventClicked(e, element){ diff --git a/app/assets/javascripts/osem-switch.js b/app/assets/javascripts/osem-switch.js index 1bdda72c..b98feb50 100644 --- a/app/assets/javascripts/osem-switch.js +++ b/app/assets/javascripts/osem-switch.js @@ -23,7 +23,7 @@ $(function () { } var callback = function(data) { - showError($.parseJSON(data.responseText).errors); + showMessage($.parseJSON(data.responseText).errors, 'error'); } $.ajax({ url: url, diff --git a/app/controllers/admin/event_schedules_controller.rb b/app/controllers/admin/event_schedules_controller.rb index 04713093..69de1b9c 100644 --- a/app/controllers/admin/event_schedules_controller.rb +++ b/app/controllers/admin/event_schedules_controller.rb @@ -6,7 +6,7 @@ module Admin if @event_schedule.save render json: { event_schedule_id: @event_schedule.id } else - render json: { errors: "The event couldn't be scheduled. #{@event_schedule.errors.full_messages.join('. ')}" }, status: 422 + render json: { errors: parse_errors(@event_schedule) }, status: 422 end end @@ -14,7 +14,7 @@ module Admin if @event_schedule.update(event_schedule_params) render json: { event_schedule_id: @event_schedule.id } else - render json: { errors: "The event couldn't be scheduled. #{@event_schedule.errors.full_messages.join('. ')}" }, status: 422 + render json: { errors: parse_errors(@event_schedule) }, status: 422 end end @@ -22,7 +22,7 @@ module Admin if @event_schedule.destroy render json: {} else - render json: { errors: "The event couldn't be unscheduled. #{@event_schedule.errors.full_messages.join('. ')}" }, status: 422 + render json: { errors: parse_errors(@event_schedule) }, status: 422 end end @@ -31,5 +31,11 @@ module Admin def event_schedule_params params.require(:event_schedule).permit(:schedule_id, :event_id, :room_id, :start_time) end + + def parse_errors(event_schedule) + title = event_schedule.event.try(:title).present? ? event_schedule.event.title : 'The event' + errors = event_schedule.errors.full_messages.present? ? " (#{event_schedule.errors.full_messages.join('. ')})" : '' + "#{title} couldn't be scheduled#{errors}. " + end end end diff --git a/app/views/admin/schedules/show.html.haml b/app/views/admin/schedules/show.html.haml index 9b2d3571..d6c44f34 100644 --- a/app/views/admin/schedules/show.html.haml +++ b/app/views/admin/schedules/show.html.haml @@ -17,6 +17,8 @@ off_color: 'warning', on_text: 'Yes', off_text: 'No' } + %button.btn.btn-success.schedule-save + Save .h4 Unscheduled events .unscheduled-events