sai krishna
sai krishna

Reputation: 99

It should Not allow to Select Date if Event Already exists in Full calendar

enter image description here

As you can see in the screen shot iam able to select a date which as an event already how to give an alert or disable the date with existing event.

Here i am Attaching the jquery source iam using i used select function to select the event please help me with this.

I have a requirement where i should be able to book only one event at a time and if the event is already created it should not allow another event to be created for the same day.

First: I have to disable the selection Second: I have to display an alert "Booked for the day"

/* initialize the calendar
         -----------------------------------------------------------------*/
        //Date for the calendar events (dummy data)
        var date = new Date()
        var d    = date.getDate(),
            m    = date.getMonth(),
            y    = date.getFullYear()
        $('#calendar').fullCalendar({
          header    : {
            left  : 'prev,next today',
            center: 'title',
            right : 'month,agendaWeek,agendaDay'
          },
          buttonText: {
            today: 'today',
            month: 'month',
            week : 'week',
            day  : 'day'
          },
          selectable: true,
            select: function(start, end, jsEvent, view) {
                if(start.isBefore(moment())) {
                    $('#calendar').fullCalendar('unselect');
                    return false;
                }
                 // start contains the date you have selected
                 // end contains the end date. 
                 // Caution: the end date is exclusive (new since v2).
                 $(".fc-state-highlight").removeClass("fc-state-highlight");
                 $("td[data-date="+start.format('YYYY-MM-DD')+"]").addClass("fc-state-highlight");
                 var allDay = !start.hasTime() && !end.hasTime();
                 //console.log(view);
                 alert(["Event Start date: " + moment(start).format(),
                        "Event End date: " + moment(end).format(),
                        "AllDay: " + allDay].join("\n"));
            },
          //Random default events
          events    : [
            {
              title          : 'All Day Event',
              start          : new Date(y, m, 1),
              backgroundColor: '#f56954', //red
              borderColor    : '#f56954' //red
            },
            {
              title          : 'Long Event',
              start          : new Date(y, m, d - 5),
              end            : new Date(y, m, d - 2),
              backgroundColor: '#f39c12', //yellow
              borderColor    : '#f39c12' //yellow
            },
            {
              title          : 'Meeting',
              start          : new Date(y, m, d, 10, 30),
              allDay         : true,
              backgroundColor: '#0073b7', //Blue
              borderColor    : '#0073b7' //Blue
            },
            {
              title          : 'Lunch',
              start          : new Date(y, m, d, 12, 0),
              end            : new Date(y, m, d, 14, 0),
              allDay         : false,
              backgroundColor: '#00c0ef', //Info (aqua)
              borderColor    : '#00c0ef' //Info (aqua)
            },
            {
              title          : 'Birthday Party',
              start          : new Date(y, m, d + 1, 19, 0),
              end            : new Date(y, m, d + 1, 22, 30),
              allDay         : false,
              backgroundColor: '#00a65a', //Success (green)
              borderColor    : '#00a65a' //Success (green)
            },
            {
              title          : 'Click for Google',
              start          : new Date(y, m, 28),
              end            : new Date(y, m, 29),
              url            : 'http://google.com/',
              backgroundColor: '#3c8dbc', //Primary (light-blue)
              borderColor    : '#3c8dbc' //Primary (light-blue)
            },
            {
            title: 'normal_event',
            start: "2018-02-05T12:00:00-00:00",
            end: "2018-02-05T13:00:00-00:00",
            id: 5,
            color: "#006633",
            editable: false,
            allDay: false
            }
          ],
          editable  : false,
          droppable : true, // this allows things to be dropped onto the calendar !!!
          drop      : function (date, allDay) { // this function is called when something is dropped

            // retrieve the dropped element's stored Event Object
            var originalEventObject = $(this).data('eventObject')

            // we need to copy it, so that multiple events don't have a reference to the same object
            var copiedEventObject = $.extend({}, originalEventObject)

            // assign it the date that was reported
            copiedEventObject.start           = date
            copiedEventObject.allDay          = allDay
            copiedEventObject.backgroundColor = $(this).css('background-color')
            copiedEventObject.borderColor     = $(this).css('border-color')

            // render the event on the calendar
            // the last `true` argument determines if the event "sticks" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/)
            $('#calendar').fullCalendar('renderEvent', copiedEventObject, true)

            // is the "remove after drop" checkbox checked?
            if ($('#drop-remove').is(':checked')) {
              // if so, remove the element from the "Draggable Events" list
              $(this).remove()
            }

          },
          //Read Events
            header: {
                left: '',
                center: 'prev title next',
                right: ''
            },
            eventClick:  function(event, jsEvent, view) {
                //set the values and open the modal
                //console.log(event);
                //$("#eventInfo").html(event.description);
                //$("#eventLink").attr('href', event.url);
                //$("#eventContent").dialog({ modal: true, title: event.title });
            },
        })

        /* ADDING EVENTS */
        var currColor = '#3c8dbc' //Red by default
        //Color chooser button
        var colorChooser = $('#color-chooser-btn')
        $('#color-chooser > li > a').click(function (e) {
          e.preventDefault()
          //Save color
          currColor = $(this).css('color')
          //Add color effect to button
          $('#add-new-event').css({ 'background-color': currColor, 'border-color': currColor })
        })
        $('#add-new-event').click(function (e) {
          e.preventDefault()
          //Get value and make sure it is not null
          var val = $('#new-event').val()
          if (val.length == 0) {
            return
          }

          //Create events
          var event = $('<div />')
          event.css({
            'background-color': currColor,
            'border-color'    : currColor,
            'color'           : '#fff'
          }).addClass('external-event')
          event.html(val)
          $('#external-events').prepend(event)

          //Add draggable funtionality
          init_events(event)

          //Remove event from text input
          $('#new-event').val('')
        })
    });

Upvotes: 1

Views: 4319

Answers (1)

ADyson
ADyson

Reputation: 61914

To stop users selecting days on the calendar where an event already exists, you can handle the "selectAllow" callback, which provides a way to control what selections a user can make. Within that, you can get the current events which occur on that day via the "clientEvents" method, and then compare the start and end dates with that of the selection:

selectAllow: function(selectInfo) {
  //since we're only interested in whole days, set all times to the start/end of their respective day
  selectInfo.start.startOf("day");
  selectInfo.end.startOf("day");

  var evts = $("#calendar").fullCalendar("clientEvents", function(evt) {
    var st = evt.start.clone().startOf("day");
    if (evt.end) { var ed = evt.end.clone().startOf("day"); }
    else { ed = st; }

    //return true if the event overlaps with the selection
    return (selectInfo.start.isSameOrBefore(ed) && selectInfo.end.isSameOrAfter(st));
  });

  //return true if there are no events overlapping that day
  return evts.length == 0;
},

See http://jsfiddle.net/sbxpv25p/181/ for a working demo

See https://fullcalendar.io/docs/selection/selectAllow/ for more info about this callback, and https://fullcalendar.io/docs/event_data/clientEvents/ to read about the clientEvents method

Upvotes: 2

Related Questions