2012-04-17 2 views
3

Я использую полный календарь JQuery вместе с Spring MVC.Удалить выбранное событие из Календаря

Hello, Я сделал демо, как that.

Цель: мне нужно, когда пользователь нажимает на событие, которое он уже вставил, появляется диалоговое окно и дает ему возможность удалить это событие или отменить его.

Проблема: теперь, когда пользователь нажимает на любой день, появляется диалоговое окно, позволяющее пользователю вводить заголовок для этого события, тогда пользователь нажимает «ОК», чтобы сохранить это событие.

Freemarker: Freemarker:

<script type="text/javascript"> 
    var resourceVacation; 

    function censor(censor) { 
     return (function() { 
      var i = 0; 
      return function(key, value) { 
       if (i !== 0 && typeof(censor) === 'object' && typeof(value) == 'object' && censor == value) 
        return '[Circular]';     

       ++i; // so we know we aren't using the original object anymore 

       return value; 
      } 
     })(censor); 
    } 


    function doAjax() { 

     $.each(resourceVacation, function(index) { 
      var tmpDate = resourceVacation[index].start; 
      tmpDate.setHours(tmpDate.getHours() - tmpDate.getTimezoneOffset()/60); 
      resourceVacation[index].start=tmpDate; 

     }); 
//  var arrays = [ 
//   {"id":111,"title":"event1","start":"2012-04-15T22:00:00.000Z","url":"http://yahoo.com/"} 
//  ]; 
//  var objects = {"id":111,"title":"event2","start":"2012-04-16T22:00:00.000Z","url":"http://yahoo2.com/"}; 
// 
//  arrays.push(objects); 
     var test = JSON.stringify(resourceVacation, censor(resourceVacation)); 
     var x = test; 
     $.ajax(
     { 
      url:"[@spring.url '/vacation/saveResourceVacation'/]", 
      type: "POST", 
      data :x , 
      dataType: "json", 
      contentType: "application/json" 
     }); 
    } 


    $(document).ready(function() { 

     var date = new Date(); 
     var d = date.getDate(); 
     var m = date.getMonth(); 
     var y = date.getFullYear(); 
     $.getJSON('[@spring.url '/vacation/loadResourceVacation'/]', function (data) { 
      var calendar = $('#calendar').fullCalendar({ 
       header: { 
        left: 'prev,next today', 
        center: 'title', 
        right: 'month,agendaWeek,agendaDay' 
       }, 
       selectable: true, 
       selectHelper: true, 
       select: 
         function(start, end, allDay) { 
          var title = prompt('Event Title:'); 

          if (title) { 
           start.setHours(start.getHours() - start.getTimezoneOffset()/60); 
//        var dat=$.fullCalendar.formatDate(start, "yyyy/MM/dd") 


           var newVacation= {id:133,title:'title',start:start,url: 'title'}; 
           resourceVacation.push(newVacation); 
           calendar.fullCalendar('renderEvent', 
           { 
            title: title, 
            start: start, 
            end: end, 
            allDay: allDay 
           }, 
             true // make the event "stick" 
             ); 
          } 
          calendar.fullCalendar('unselect'); 
         }, 
     eventClick: function(calEvent, jsEvent, view) { 

      alert('Event: ' + calEvent.title); 
      alert('start: ' + calEvent.start);    
     } 

       editable: true, 
       events:data 
      }); 
      resourceVacation = data; 
     }); 
    }); 


</script> 

Контроллер:

 @RequestMapping(value = "/vacation/loadResourceVacation", method = RequestMethod.GET) 
     public 
     @ResponseBody 
     String loadResourceVacation(HttpServletResponse response) throws Exception { 


      //Here I build my vacationFormBean 
      List<VacationFormBean> vacationFormBeanList= buildVacationFormBean(); 
      // Convert to JSON string. 
      String json = new Gson().toJson(vacationFormBeanList); 

      // Write JSON string. 
      response.setContentType("application/json"); 
      response.setCharacterEncoding("UTF-8");  

     return json; 
    } 

    @RequestMapping(value = "/vacation/saveResourceVacation", method = RequestMethod.POST) 
    public 
    @ResponseBody 
    void saveResourceVacation(@RequestBody String jsonString, Principal principal) throws Exception { 
     List<String> resourceVacations = extractVacationDatesFromJsonObject(jsonString); 

    } 

VacationFormBean:

public class VacationFormBean { 
    int id; // (With Setter & Getter) 
    String title; // (With Setter & Getter) 
    String start; // (With Setter & Getter) 
    String url; // (With Setter & Getter) 
} 

мне нужно что-то вроде этого:

enter image description here

====================== ОБНОВЛЕНИЕ =========================================== ====

Я добавил событие click в результате рекомендации domi27. Просьба ознакомиться с обновлениями freemarker. Я добавил метод сценария Java, который использует: http://arshaw.com/fullcalendar/docs/event_data/removeEvents/

Новый метод JS:

$('#calendar').fullCalendar('removeEvents', 1); 

Этот метод отлично работает с событиями, которые были первоначально загружены из контроллера. Однако, когда я пытаюсь использовать тот же метод для удаления новых событий, которые я только что добавил, ничего не происходит. Когда я запускаю «select event» для нового события, которое я создал, я получаю его идентификатор «undefined».

Как я уже упоминал на своем freemarker, это строки, которые я использую для создания нового объекта события, который я могу найти в списке.

var newVacation = {id:'133',title:'title',start:start,url: 'title'}; 
            resourceVacation.push(newVacation); 

Когда я отладки моего сценария, я наблюдаю разницу между объектами, загруженными из контроллера и нового объекта я создал, когда пользователь добавляет новое событие.

Вот старый объект, который я получил от контроллера, когда я инициировал календарь: enter image description here

Вот новый объект, который я получил после того, как я ввожу новое событие:

enter image description here

ответ

5

You может реализовать его следующим образом:

  1. Fetch click on event
  2. Отображение информации о (как) удалить это событие
  3. Вызови Ajax запрос обрабатывать удаление события в бэкэндом
  4. Удаление события из календаря фронтэнда

1) Во-первых описано здесь: http://arshaw.com/fullcalendar/docs/mouse/eventClick/

2) Довольно Простейшая JS: подтверждения («? на самом деле хотите удалить это событие»)

3) Вызов операции удаления с помощью JQuery, скорее всего, как вы делаете, чтобы сохранить бронирование

4) Удалить это событие через fullcalendars метод «removeEvents»: http://arshaw.com/fullcalendar/docs/event_data/removeEvents/

Вот короткий и очень простой пример:

eventClick: function(calEvent, jsEvent, view) { 
    /** 
    * calEvent is the event object, so you can access it's properties 
    */ 
    if(confirm("Really delete event " + calEvent.title + " ?")) { 
     // delete event in backend 
     jQuery.post(
      "/vacation/deleteEvent" 
      , { "id": calEvent.id } 
     ); 
     // delete in frontend 
     calendar.fullCalendar('removeEvents', calEvent.id); 
    } 
} 
+0

Спасибо. это полезно. Однако я стараюсь не идти на задний план. Я пытаюсь сделать это на стороне клиента, создав объект массива, а затем, когда пользователь нажимает «Сохранить», я конвертирую этот массив в объект JSON и отправляю его на сервер для процессии. Я обновил свой пост. Пожалуйста, просмотрите и верните меня. Спасибо за ваш ответ. – Echo

0

У меня есть сделать его работу следующим подходом: всякий раз, когда пользователь срабатывает ли событие «выбрать» или «щелчок» по всему календарю, я перехожу к поиску по дате, которую выбрал пользователь, и удаляю его из моего массива JS. Я использую: $ ('# calendar'). FullCalendar ('removeEvents', id), чтобы удалить его из всего события календаря.

[#ftl /] 
<script type="text/javascript"> 
var resourceVacation; 
var vacationStart; 

function censor(censor) { 
    return (function() { 
     var i = 0; 
     return function(key, value) { 
      if (i !== 0 && typeof(censor) === 'object' && typeof(value) == 'object' && censor == value) 
       return '[Circular]'; 

      ++i; // so we know we aren't using the original object anymore 

      return value; 
     } 
    })(censor); 
} 



function isVacation(day) { 
    for (var index = 0; index < resourceVacation.length; index++) { 
     if (resourceVacation[index].id == day) { 
      return true; 
     } 
    } 
    return false; 
} 

function deleteVacation(day) { 
    for (var index = 0; index < resourceVacation.length; index++) { 
     if (resourceVacation[index].id == day) 

      resourceVacation.splice(index,1); 
    } 

} 

function showTheCorrectDialog(vacationStartDay) { 
    var vacationID = $.fullCalendar.formatDate(vacationStartDay, "yyyy-MM-dd") 
    if (isVacation(vacationID)) 
     getDeletionConfirmationDialog(vacationID); 
    else 
     getInsertionConfirmationDialog(vacationStartDay) 
} 


function doAjax() { 

    $.each(resourceVacation, function(index) { 
     var tmpDate = resourceVacation[index].start; 

     tmpDate.setHours(tmpDate.getHours() - tmpDate.getTimezoneOffset()/60); 
     resourceVacation[index].start = tmpDate; 

    }); 
    var test = JSON.stringify(resourceVacation, censor(resourceVacation)); 
    var x = test; 
    $.ajax(
    { 
     url:"[@spring.url '/vacation/saveResourceVacation'/]", 
     type: "POST", 
     data :x , 
     dataType: "json", 
     contentType: "application/json" 
    }); 
} 


$(document).ready(function() { 
    var date = new Date(); 
    var d = date.getDate(); 
    var m = date.getMonth(); 
    var y = date.getFullYear(); 
    $.getJSON('[@spring.url '/vacation/loadResourceVacation'/]', function (data) { 
     var calendar = $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      selectable: true, 
      selectHelper: true, 
      select: 
        function(start, end, allDay) { 
         vacationStart = start; 
         showTheCorrectDialog(vacationStart); 

        }, 

      eventClick: function(calEvent, jsEvent, view) { 

       showTheCorrectDialog(calEvent.start); 

       // change the border color just for fun 
       $(this).css('border-color', 'red'); 
      }, 

      editable: true, 
      events 
        : 
        data 
     }); 
     resourceVacation = data; 
    }); 
}); 


function getInsertionConfirmationDialog(vacationStart) { 
     var complimentaryVacationHTML = "<input type = \"radio\" name = \"vacationTypes\" value = \"Complimentary\">Complimentary<br>"; 

    var scheduledVacationHTML = "<input type = \"radio\" name = \"vacationTypes\" value = \"Scheduled\" checked=\"checked\">Scheduled<br>"; 


    $('html').append('<div id="insertionConfirmDialog" align="left">' + 
      complimentaryVacationHTML +scheduledVacationHTML + ' </div > '); 
    var selectedVacationType = ""; 
    var insertionConfirmDialog = $('#insertionConfirmDialog'); 
    insertionConfirmDialog.dialog({ 
     modal: true, 
     autoOpen: false, 
     resizable:false, 
     title: 'Please select the vacation type', 
     width: 300, 
     height: 310, 
     buttons: { 
      'Ok': function() { 
       selectedVacationType = $(this).find('input:checked').val(); 
       $(this).remove(); 

       vacationStart.setHours(vacationStart.getHours() - vacationStart.getTimezoneOffset()/60); 
       var vacationID = $.fullCalendar.formatDate(vacationStart, "yyyy-MM-dd") 

       var newVacation = {id:vacationID,title:selectedVacationType,start:vacationStart}; 
       resourceVacation.push(newVacation); 
       $('#calendar').fullCalendar('refetchEvents', 
       { 
        title: selectedVacationType, 
        start: vacationStart, 

        allDay: true 
       }, 
         true // make the event "stick" 
         ); 

       $('#calendar').fullCalendar('unselect'); 
      }, 
      Cancel: function() { 
       $(this).remove(); 
      } 
     } 
    }); 

    insertionConfirmDialog.dialog('open'); 
} 

function getDeletionConfirmationDialog(vacationStart) { 


    $('html').append('<div id="deletionConfirmDialog" align="left"><p>Are you sure you need to delete your vacation on:'+vacationStart +'</p>'+ 
      ' </div > '); 
    var deletionConfirmDialog = $('#deletionConfirmDialog'); 
    deletionConfirmDialog.dialog({ 
     modal: true, 
     autoOpen: false, 
     resizable:false, 
     title: 'Delete Confirmation', 
     width: 300, 
     height: 310, 
     buttons: { 
      'Delete': function() { 
       $(this).remove(); 

       deleteVacation(vacationStart); 
       $('#calendar').fullCalendar('removeEvents', vacationStart); 

      }, 
      Cancel: function() { 
       $(this).remove(); 
      } 
     } 
    }); 

    deletionConfirmDialog.dialog('open'); 
} 


</script> 
<style type='text/css'> 


    body { 
     margin-top: 40px; 
     text-align: center; 
     font-size: 14px; 
     font-family: "Lucida Grande", Helvetica, Arial, Verdana, sans-serif; 
    } 

    #calendar { 
     width: 900px; 
     margin: 0 auto; 
    } 

</style> 
<body> 
<input type="button" id="editProject" name="editProject" class="btn btn-inverse" 
     value="Save Vacations" 
     onclick="doAjax()" 
     /> 


<div id='calendar'></div> 

</body> 
[@footer/] 
+1

Просто из любопытства ... Что делать, если пользователь добавляет/удаляет значительное количество событий и просто закрывает все? Было просто сравнение с календарем Google, на котором все будут основываться. Итак, какое-либо предупреждение для пользователя? –

+0

Это хороший комментарий. По моему сценарию ничего не случилось, поскольку я просто заходил на сервер, как только пользователь нажимает «Сохранить изменения». Я считаю, что все имеет свои затраты. Но мне нравится, что вы упомянули в отношении предупреждения, чтобы уведомить пользователя. Фактически я бы применил его по моему коду. Спасибо Admirer. – Echo