событие года вид в fullcalendar v4 - PullRequest
1 голос
/ 12 февраля 2020

Я хотел бы отобразить год просмотра событий в fullcalendar v4. Просмотр года был добавлен в полный календарь до версии 2.2.7. Более поздняя версия не имеет этого. Итак, я решил создать годовой вид, используя пользовательский вид. Но я не понял, куда мне добавить часть html, которая отображает год по своему усмотрению. Вот как я создаю вид. Но плагин listYear способен отображать все события года в виде списка. Я хотел бы отображать события в календаре весь месяц на одном просмотре. Можно ли добавить нашу собственную таблицу html для отображения в календаре?

views: {
                    Year: {
                           type      : 'listYear',
                           duration  : { 
                                        months: 12
                                       },
                           start     :year+'-01-01',
                           end       :(year+1)+'-01-01',                            
                           buttonText:'year'
                            }
                }
  document.addEventListener('DOMContentLoaded', function() {

                    var year    =<?php echo $year;?>;
                var event   ='<?php echo json_encode($events);?>';
                event=JSON.parse(event);
                //console.log(event);
                //create event Array
                events_array=[];
                for(i=0;i<event.length;i++)
                {
                    //parameter for event Array-https://fullcalendar.io/docs/event-object
                    start_array=event[i]['start'].split(" ");
                    end_array=event[i]['end'].split(" ");

                    if(start_array[1]==='00:00:00')
                    {
                        start   =start_array[0];
                    }
                    else
                    {
                        start   =event[i]['start'];
                    }
                    if(end_array[1]==='00:00:00')
                    {
                        end     =end_array[0];
                    }
                    else
                    {
                        end     =event[i]['end'];
                    }
                    object_data={
                                         id     :event[i]['id'],
                                         title  :event[i]['remark']+'-'+event[i]['title'],
                                         start  :start,
                                         end    :end,
                                         color  :event[i]['color'],                                      
                                    }
                events_array.push(object_data);                     
                }



    var calendarEl = document.getElementById('calendar');

    var calendar = new FullCalendar.Calendar(calendarEl, {
      plugins: ['dayGrid','list'],
      header:
                        {
                            left    : 'prev,next today',
                            center  : 'title',
                            //version 2.2.7 able  to show year view.Year view has been implemented until version 2.2.7. 
                            //But , we are using 4 to use valid range (limiting the duration).Valid range available from 3.3.0
                            right   : 'Year,dayGridMonth,dayGridWeek,dayGridDay,listMonth'
                        },
            views: {
                        Year: {
                         /* type: 'timelineYear',*/
                          type: 'listYear',
                          duration: { months: 12
                                        /*weeks:1*/ },
                            start:year+'-01-01',
                            end: (year+1)+'-01-01',
                            /*intervalStart: $.fullCalendar.moment(year+'-01-01'),
                            intervalEnd: $.fullCalendar.moment((year+1)+'-01-01'),*/

                          buttonText: 'year'
                                }
                    },          
            defaultDate: year+'-01-01',
                        //set the year range limit - fullcalendar.min.js v3.3.0 & above support this
                        validRange: {
                                        start   : year+'-01-01',
                                        end     : (year+1)+'-01-01'
                                    },
                        defaultView : 'dayGridMonth',
                        editable    : false,//disable drag
                        events      : events_array,


                        //from [https://stackoverflow.com/questions/45698134/dayrender-not-properly-working-in-fullcalendar-on-given-dates]
                         dayRender: function (date, cell) 
                         {
                            var disabledDates = ["2016-02-10", "2016-02-15"];
                            //$.inArray returns the index of the element in the array, not a boolean indicating if the item exists in the array. If the element was not found, -1 will be returned.
                            /*if ($.inArray(date.format("YYYY-MM-DD"), disabledDates) > -1) 
                            {
                                cell.css("background-color", "green");
                            }
                            */
                        }

    });

    calendar.render();
  });

Заранее спасибо

1 Ответ

0 голосов
/ 18 февраля 2020

Моя цель - использовать версию 3 и выше, так как она поддерживает допустимую функцию диапазона, а настраиваемое представление версии 3 вполне понятно. Итак, я должен был использовать версию 3 для просмотра года. Этот год просмотра ограничен только одним годом, который состоит из 12 месяцев. Объявите пользовательский вид в полной реализации календаря.

просмотров: {CustomView: {type: 'custom',}}

Объявить кнопку year в заголовке для пользовательского представления года. Затем в customButtons: определите, что происходит, когда пользователь нажимает эту кнопку.

customButtons: {year: {text: 'year', click: function () {$ ('# calendar'). fullCalendar ('changeView', 'CustomView'); }}}

Затем получите ссылку (FC) на пространство имен root fullcalendar и класс (View), от которого наследуются все представления.

var F C = $. FullCalendar; var View = F C .View;

Построить представление внутри render: function() нашего класса CustomView. Создайте таблицу, содержащую 12 полей (3 столбца и 4 строки) и добавьте к f c -view. Затем упорядочите каждое событие в объекте с необходимой информацией и добавьте к events_array. events_array, содержащему объекты событий. Получить начало следующих 12 месяцев, с которого период месяца начинается в массиве months. Затем l oop в массиве месяцев и создание экземпляра представления fullcalendar в каждом поле этой таблицы, созданной с использованием идентификатора. Идентификатор - значение от months (например: «январь_2019»). Установите продолжительность один месяц и передайте в массив событий. Итак, каждое поле показывает вид за один месяц вместе с событиями. 12 полей показывают представление в течение 12 месяцев.

CustomView = View.extend ({render: function () {}}

Зарегистрируйте наш класс в системе представления.

F C .views.custom = CustomView;

<?php
require_once('bdd.php');
// information from sql
// $event_2 is events array 
// $event_3 are array of earliest event start and latest event end date, chosen period start and end date,
?>
 <html>
  <head>
   <style>
         #container 
         {
            width: 100%;
            position: relative;
         }
        #calendar
        {
             width: 900px; /*can be in percentage also.*/
            height: auto;
            margin: 0 auto;
            padding: 10px;
            position: relative;
        }
        td.fc-sun 
        {
            background-color: #535450 !important;
        }
    </style>
    <script src="js/jquery.js"></script>
     <script src="js/bootstrap.min.js"></script>
     <script src='js/moment.min.js'></script>
     <script src='v_3/fullcalendar.min.js'></script>    
    <link rel="stylesheet" href="v_3/fullcalendar.min.css" />
    <script>
        $(document).ready(function()
        {

            var event       ='<?php echo json_encode($events_2);?>';
            event           =JSON.parse(event);
            limit           ='<?php echo json_encode($events_3);?>';
            limit           =JSON.parse(limit);
            events_array=[];
                for(i=0;i<event.length;i++)
                {
                    //parameter for event Array-https://fullcalendar.io/docs/event-object
                    start_array=event[i]['start'].split(" ");
                    end_array=event[i]['end'].split(" ");

                    if(start_array[1]==='00:00:00')
                    {
                        start   =start_array[0];
                    }
                    else
                    {
                        start   =event[i]['start'];
                    }
                    if(end_array[1]==='00:00:00')
                    {
                        end     =end_array[0];
                    }
                    else
                    {
                        end     =event[i]['end'];
                    }
                    console.log(start+'=>'+end);
                    object_data=
                    {
                        id      :event[i]['id'],
                        title   :event[i]['remark']+'-'+event[i]['title'],
                        start   :start,
                        end :end,
                        color   :event[i]['color'],
                    }
                    events_array.push(object_data);
                }

                $('#calendar').fullCalendar
                ({
                    defaultDate: limit[0]['earliest'],
                    validRange: {
                                        start   : limit[0]['earliest'],
                                        end     : limit[0]['final']
                                    },
                    header      :
                                {
                                    left    :'prev,next,today',
                                    center  :'title',
                                    right   :'year,agendaWeek,month'
                                },

                    events      : events_array,
                    customButtons:
                    {
                        year:
                        {
                            text:'year',
                             click: function() 
                             {
                                $('#calendar').fullCalendar('changeView', 'CustomView');
                              }
                        }
                    },
                    views:
                    {
                        CustomView:
                        {
                            type: 'custom',
                        }
                    }
                })



            var view = $('#calendar').fullCalendar('getView');

            //custom view:
            var FC      = $.fullCalendar; //a reference to FullCalendar's root namespace
            var View    =FC.View;  //the class that all views must inherit from
            var CustomView;          //our subclass
            start_year  =limit[0]['earliest'].split("-")[0];
            end_year    =limit[0]['final'].split("-")[0];
            start_month =parseInt(limit[0]['fye_start'].split("-")[1]);

            CustomView = View.extend(
                {
                    render: function()
                    {
                        $('.fc-prev-button').addClass('fc-state-disabled');
                        $('.fc-next-button').addClass('fc-state-disabled');

                        //change the title
                        document.getElementsByClassName("fc-center")[0].getElementsByTagName('h2')[0].innerHTML = start_year;

                        //https://stackoverflow.com/questions/10832179/result-of-getting-next-12-months-in-javascript-is-messed-up
                        var months  =getNext12MonthNamesWithYear(limit[0]['fye_start']);
                        var table   ='<table align="center" style="width:100%">';
                        var m=0;
                        for(i=1;i<=4;i++)
                        {
                            table+='<tr>';
                            for(j=1;j<=3;j++)
                            {
                                table+='<td height="100"><div id="'+months[m]+'"></div></td>';
                                m++;
                            }
                            table+='</tr>';
                        }
                        table+='</table>';
                        $('.fc-view').append(table);
                        for(n=0;n<months.length;n++)
                        {
                            year =months[n].split("_")[1];
                            month=months[n].split("_")[0];
                            //https://stackoverflow.com/questions/13566552/easiest-way-to-convert-month-name-to-month-number-in-js-jan-01/27805696
                            month=getMonthFromString(month);//convert month string to month no

                            //month compulsory to have 2 digit
                            if(month>=10)
                            {
                                c=month;
                            }
                            else
                            {
                                c='0'+month;
                            }

                            $('#'+months[n]).fullCalendar
                            (
                                {
                                    header:
                                    {
                                        left:   '',
                                        center: 'title',
                                        right:  ''
                                    },
                                    events      : events_array,
                                    defaultDate : year+'-'+(c)+'-01',
                                    //set the year range limit - fullcalendar.min.js v3.3.1 & above support this
                                    defaultView:'month',
                                    duration:
                                    {
                                        months: 1
                                    }
                                })
                        }
                    },
                }
            )
            FC.views.custom = CustomView; // register our class with the view system*/
            })

function getNext12MonthNamesWithYear(date)
{
    var now = new Date(date);
    var month = now.getMonth();
    var year = now.getFullYear();

    var names = ['January', 'February', 'March', 'April', 'May', 'June',
        'July', 'August', 'September', 'October', 'November', 'December'];

    var res = [];
    for (var i = 0; i < 12; ++i)
    {
        res.push(names[month] + '_' + year);
        if (++month === 12)
        {
            month = 0;
            ++year;
        }
    }
    return res;
}
function getMonthFromString(mon)
{
    return new Date(Date.parse(mon +" 1, 2012")).getMonth()+1
}
    </script>   
</head>
<body>
     <div id='calendar'></div>
</body>

В ожидании лучшего решения.

...