Search code examples
javascriptfullcalendarundefined

Add Event to Calendar in fullcalendar


I have a problem again and do not really get on with it. I would like to know that you can enter an appointment and I already have the following script. Unfortunately, no entries are entered in the calendar :-( can someone help me there? I've already asked quite a bit about google and co. Unfortunately, I come to no real point of help. can it be that I already use the eventRender and then want to use it again below?

here once my code:

<link rel='stylesheet' href='kalender2/fullcalendar.css' />
<script src='kalender2/fullcalendar.js'></script>
<script src='kalender2/locale/de.js'></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/bootstrap.bundle.min.js"></script>
<script src="kalender2/lib/hour.js"></script>

<script>
    var CalenderEvent;
    var datenPruefenDatenSenden;
    var terminPruefenDatenSenden;
    var datenPruefenDatenVerarbeiten;
    var termin_nachberechnung;
    var TerminAddZeit;
    var AddEventToCalener;
    $(document).ready(function() {
        function DeleteEvent(id){
            SendFormData(id,'',"delete");
            $('#calendar').fullCalendar('removeEvents',id);
        }
        var initialLocaleCode = 'de';
        $('#calendar').fullCalendar({
            header: {
                left: 'prev,next today',
                center: 'title',
                right: 'month,agendaWeek,agendaDay,listWeek'
            },
            dayClick: function(date, jsEvent, view) {
                $('#calenderAdEvent').modal('show');
                $('#start_date_add_day').val(date.format('DD.MM.YYYY'));
                $('#start_date_add_time').val(date.format('HH:mm'));
            },
            eventRender: function(eventObj, $el) {
                    $el.popover({
                        title: eventObj.title,
                        content: eventObj.description,
                        trigger: 'hover',
                        placement: 'top',
                        container: 'body'
                    });
                    $el.html(eventObj.title + '<span class="removebtn" onclick="DeleteEvent('+eventObj.id+');" id="Delete">X</span>');
                    $el.find(".removebtn").click(function() {
                        $('#calendar').fullCalendar('removeEvents',eventObj.id);
                    });
            },
            businessHours: [
                <?php echo $Offen;?>
            ],
            eventDrop: function( event, delta, revertFunc, jsEvent, ui, view ) {
                var Alertback = SendFormData(event.id,$.fullCalendar.moment(event.start._d), $.fullCalendar.moment(event.end._d),"update");
                alert(Alertback);
            },
            eventResize: function( event, delta, revertFunc, jsEvent, ui, view ) { 
                var Alertback = SendFormData(event.id,$.fullCalendar.moment(event.start._d), $.fullCalendar.moment(event.end._d),"update");
                alert(Alertback);
            },
            timezone: 'Europe/Berlin',
            nowIndicator: true,
            now: '<?php echo date("Y-m-d", time() ) .'T'. date("H:i:s");?>',
            locale: 'de',
            buttonIcons: true, // show the prev/next text
            defaultView: 'agendaWeek',
            defaultDate: '<?php echo date("Y-m-d", time() );?>',
            navLinks: true, // can click day/week names to navigate views
            editable: true,
            eventLimit: true, // allow "more" link when too many events
            allDaySlot: true,
            droppable: true,
            events: [
                <?php echo $aus;?>
            ],
            timeFormat: 'H(:mm)',
            eventClick: function(event, jsEvent, view) {
                CalenderEvent = event;
                $('#id_termin').val(event.id);
                $('#name').val(event.title);
                $('#Time_Event').val(event.TimeEvent);
                $('#description').val(event.description);
                $('#start_date_day').val(moment(event.start).format('DD.MM.YYYY'));
                $('#start_date_time').val(moment(event.start).format('HH:mm'));
                if(event.end) {
                    $('#end_date_day').val(moment(event.end).format('DD.MM.YYYY'));
                    $('#end_date_time').val(moment(event.end).format('HH:mm'));
                } else {
                    $('#end_date_day').val(moment(event.end).format('DD.MM.YYYY'));
                    $('#end_date_time').val(moment(event.end).format('HH:mm'));
                }
                $('#event_id').val(event.id);
                $('#calenderEditEvent').modal();
            }
        });

        datenPruefenDatenSenden = function(){
            var start = $('#start_date_day').val()+'//'+$('#start_date_time').val();
            var end = $('#end_date_day').val()+'//'+$('#end_date_time').val();
            var erg = SendFormData($("#id_termin").val(),start,end,'TerminEditSave');
            $('#calenderEditEvent').modal('hide');
            CalenderEvent.start = moment($('#start_date_day').val()+' '+$('#start_date_time').val(), "DD.MM.YYYY HH:MM");
            CalenderEvent.end = moment($('#end_date_day').val()+' '+$('#end_date_time').val(), "DD.MM.YYYY HH:MM");
            $('#calendar').fullCalendar('updateEvent', CalenderEvent);
        }

        datenPruefenDatenVerarbeiten = function (daten){
            if(daten == 1){$('#submit_erg').html('<div class="alert alert-danger">Termin&uuml;berschneidung</div><button class="btn btn-info" onclick="terminPruefenDatenSenden();">Erneut pr&uuml;fen</button>');}
            $('#submit_button').html('<button type="button" class="btn btn-warning" onclick="datenPruefenDatenSenden();">Termin Speichern</button>');
        }

        terminPruefenDatenSenden = function (){
            $('#submit_erg').html('');
            var start = $('#start_date_day').val()+'//'+$('#start_date_time').val();
            var end = $('#end_date_day').val()+'//'+$('#end_date_time').val();
            var erg = SendFormData($("#id_termin").val(),start,end,'pruefen');
        }

        termin_nachberechnung = function (){
            var TimePlus = new Hour($('#Time_Event').val());
            var zeit = new Hour($('#start_date_time').val()+':00');
            $('#end_date_time').val(zeit.add(TimePlus));
        }

        TerminAddZeit = function (){
            var erg = SendFormData($("#id_termin_add").val(),$('#start_date_add_time').val(),'','TimePlus');
            $('#start_date_add_time_end').val(erg);
        }
        AddEventToCalener = function(){
            var Start = moment($('#start_date_add_day').val()+' '+$('#start_date_add_time').val(), "DD.MM.YYYY HH:MM");
            var End = moment($('#start_date_add_day').val()+' '+$('#start_date_add_time_end').val(), "DD.MM.YYYY HH:MM");
            var event = new Object();
            event = {
                title: 'Testtermin',
                start: Start,
                end: End,
                allDay: false,
            };
            console.log(event);
            $('#calendar').fullCalendar('renderEvent', event);
        }
    });

    $(function() {
      $('[data-toggle="datepicker_bearbeiten"]').datepicker({
        autoHide: true,
        format: 'dd.mm.yyyy',
        zIndex: 2048,
      });
    });

    function SendFormData(id,start,end,aufruf){
        var erg;
        if(aufruf == 'update'){start = start/1000;end = end/1000;}
        $.ajax({type: "post",url: "kalender2/kalender.class.php",data : {id : id,sta : start,end : end,aufruf : aufruf}
        }).done(function( dataEnd ){if(aufruf == 'pruefen'){datenPruefenDatenVerarbeiten(dataEnd);}erg = dataEnd;});
        return erg;
    }


</script>

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

<div class="modal" id="calenderAdEvent" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Termin eintragen</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        <div class="input-group mb-3">
            <div class="input-group-prepend">
                <span class="input-group-text">Datum</span>
            </div>
            <input type="text" id="start_date_add_day" name="start_date_add_day" class="form-control">
        </div>
        <div class="input-group mb-3">
            <div class="input-group-prepend">
                <span class="input-group-text">Dienstleistung</span>
            </div>
            <select class="custom-select" id="id_termin_add">
                <option selected>bitte w&auml;hlen</option>
                <?php echo $dienst;?>
            </select>
        </div>
        <div class="input-group mb-3">
            <div class="input-group-prepend">
                <span class="input-group-text">Termin von</span>
            </div>
            <input type="text" id="start_date_add_time" name="start_date_add_time" class="form-control">
            <div class="input-group-append">
                <span class="input-group-text">-</span>
            </div>
             <input type="text" name="start_date_add_time_end" id="start_date_add_time_end" class="form-control">
        </div>
        <div class="input-group mb-3">
            <div class="input-group-prepend">
                <span class="input-group-text">Kundenname</span>
            </div>
            <input type="text" list="kunden" id="KundenName" name="KundenName" class="form-control" onkeyup="KundenListe();">
            <datalist id="kunden">
                <?php echo $KundenListe;?>
            </datalist>
            <div class="input-group-append">
                <span class="input-group-text">oder KN</span>
            </div>
             <input type="text" name="KIDTerminBuchen" id="KIDTerminBuchen" class="form-control">
        </div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" onclick="AddEventToCalener();">Save changes</button>
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
      </div>
    </div>
  </div>
</div>

<div class="modal" id="calenderEditEvent" tabindex="-1" role="dialog">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Termin bearbeiten</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text" id="basic-addon1">Start</span>
                    </div>
                    <input type="text" name="termin" id="start_date_day" class="form-control" data-toggle="datepicker_bearbeiten">
                    <input type="text" id="start_date_time" onkeyup="termin_nachberechnung('Hallo');" class="form-control datetimepicker-input" data-target="#datetimepicker3" data-target-input="nearest"/>
                    <div class="input-group-append">
                        <span class="input-group-text">
                                <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHfSURBVEhLzZW9L91hFMcvaby0HUi9VKJNE2ZbvWxERQdTO5h0YLCQWLAykehUJAYWIWZSjBJtojqQog1TUyotwl8g+HyfU7fXffm9Mfgkn+ScJzf3/J7n+Z3zi90HHuBrnMBveITneIhfcRhrMDJvcA8/Yw9W4RPMxqdYiwP4A1cwVLFcnMYNrNdCAtrZOwvjqGgb7mOfFvzIwU84g3laSOI5/rIwhTJcw1GXeaAdqECWy1LxKiIeok6gy2VpeIubmG4H1/gVEeX4FytcloDOehcbXJaZIEWE7mbOwv/oNV210JOgRXQap1jisn+oD/Sa+hG0iJjFDguNLVQf+BGmiApMWmgcoxrNDz3dBfa7zJsmXLbQ0KhQU3mhJlWBS9zWgg/VqL6J8wdLLcxIJ+p3O9iqBR9acN5CYx01izKhAj/xhcuCoYYct9AYwkELU4hSQHxEDdk4Or/vmHwvypcwbIFiPMPHLktA4zp5wkblA45YeBPtRuNa0/Q26G41uwpdloZe/IKPXBYeNetvbHSZB2Oocf3MZcGpwwO8MUq80Oun77l2lq8FD4pQD6bv/isthKESNa5PUB+ydmzGl6hG68ZF1LR9jwUYGY1rHcEU6k/VuAuoRlMfRL2/uyQWuwKiRlWN6WWKKwAAAABJRU5ErkJggg==">
                        </span>
                    </div>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text" id="basic-addon1">Ende</span>
                    </div>
                    <input type="text" name="termin" id="end_date_day" class="form-control" data-toggle="datepicker_bearbeiten">
                    <input type="text" id="end_date_time" class="form-control datetimepicker-input" data-target="#datetimepicker3" data-target-input="nearest"/>
                    <div class="input-group-append">
                        <span class="input-group-text">
                                <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHfSURBVEhLzZW9L91hFMcvaby0HUi9VKJNE2ZbvWxERQdTO5h0YLCQWLAykehUJAYWIWZSjBJtojqQog1TUyotwl8g+HyfU7fXffm9Mfgkn+ScJzf3/J7n+Z3zi90HHuBrnMBveITneIhfcRhrMDJvcA8/Yw9W4RPMxqdYiwP4A1cwVLFcnMYNrNdCAtrZOwvjqGgb7mOfFvzIwU84g3laSOI5/rIwhTJcw1GXeaAdqECWy1LxKiIeok6gy2VpeIubmG4H1/gVEeX4FytcloDOehcbXJaZIEWE7mbOwv/oNV210JOgRXQap1jisn+oD/Sa+hG0iJjFDguNLVQf+BGmiApMWmgcoxrNDz3dBfa7zJsmXLbQ0KhQU3mhJlWBS9zWgg/VqL6J8wdLLcxIJ+p3O9iqBR9acN5CYx01izKhAj/xhcuCoYYct9AYwkELU4hSQHxEDdk4Or/vmHwvypcwbIFiPMPHLktA4zp5wkblA45YeBPtRuNa0/Q26G41uwpdloZe/IKPXBYeNetvbHSZB2Oocf3MZcGpwwO8MUq80Oun77l2lq8FD4pQD6bv/isthKESNa5PUB+ydmzGl6hG68ZF1LR9jwUYGY1rHcEU6k/VuAuoRlMfRL2/uyQWuwKiRlWN6WWKKwAAAABJRU5ErkJggg==">
                        </span>
                    </div>
                </div>
                <input type="hidden" id="id_termin">
                <input type="hidden" id="Time_Event">
            </div>
            <div class="modal-footer">
                <span id="submit_erg"></span>
                <span id="submit_button"><button type="button" class="btn btn-info" onclick="terminPruefenDatenSenden();">Pr&uuml;fen</button></span>
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
</div>

I have done some more tests. As soon as I take the eventRender: function (eventObj, $ el) { ........ }, out, I use the function AddEventToCalener = function () { $ ('# calendar'). fullCalendar ('renderEvent', { title: 'dynamic event', start: '2018-11-26', allDay: true }); } successfully.

But as soon as I insert eventRender again, I get the following message:

Error: TOOLTIP: Option "content" provided type "undefined" but expected type "(string | element | function)"

So the problem is still that the event is not entered in the calendar. the console gives me the following with console.log

{…} ​ allDay: false ​ end: Object { _isAMomentObject: true, _i: "26.11.2018 12:00", _f: "DD.MM.YYYY HH:MM", … } ​ start: Object { _isAMomentObject: true, _i: "26.11.2018 11:30", _f: "DD.MM.YYYY HH:MM", … } ​ title: "Testtermin" ​ <prototype>: Object { … }

Solution

  • Your code is failing to add the event because of a missing field.

    In the eventRender function you create a popover, and the popover tries to read a property called "description" from the event:

    content: eventObj.description
    

    However, your AddEventToCalener() function defines an event like this:

    event = {
      title: 'Testtermin',
      start: Start,
      end: End,
      allDay: false,
    };
    

    In this event there is no "description" field specified. This means it's undefined, and therefore when eventRender runs and tries to create the popover, it crashes because it can't read that field. (I know this from the error message - it appears the popover code is programmed to check the type of the value given in the "content" option, and will only accept strings, HTML elements, or functions - it will not accept undefined variables.)

    For the eventRender/popover code to work you need to specify something for the field, even if it's just an empty string:

    event = {
      title: 'Testtermin',
      start: Start,
      end: End,
      allDay: false,
      description: ""
    };
    

    Also, your momentJS parsing string is incorrect - instead of

    "DD.MM.YYYY HH:MM"
    

    it should be

    "DD.MM.YYYY HH:mm"
    

    because MM signifies months, whereas mm signifies minutes. See http://momentjs.com/docs/#/parsing/string-format/ for documenation.