Fullcalendar - Change View for Mobile Devices

FullCalendar - Change View for Mobile Devices

Use function to detect mobile:

window.mobilecheck = function() {
var check = false;
(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
return check;
};

After that, on initalizing calendar, call this function and set defaultView like this:

defaultView: window.mobilecheck() ? "basicDay" : "agendaWeek"

Full calendar Mobile view

I used eventAfterAllRender. The function will handle the checking if the user uses a mobile device, it is a mobile device then it will simply change the calendar view from the default agendaWeek into agendaDay using the changeView method.

$(document).ready(function() {    $('#calendar').fullCalendar({      header: {        left: 'prev,next today',        center: 'title',        right: 'month,agendaWeek,agendaDay,listWeek'      },      defaultView: 'agendaWeek',      defaultDate: '2018-03-12',      events: [      {        title: 'All Day Event',        start: '2018-03-01',      },      {        title: 'Long Event',        start: '2018-03-07',        end: '2018-03-10'      },      {        id: 999,        title: 'Repeating Event',        start: '2018-03-09T16:00:00'      },      {        id: 999,        title: 'Repeating Event',        start: '2018-03-16T16:00:00'      },      {        title: 'Conference',        start: '2018-03-11',        end: '2018-03-13'      },      {        title: 'Meeting',        start: '2018-03-12T10:30:00',        end: '2018-03-12T12:30:00'      },      {        title: 'Lunch',        start: '2018-03-12T12:00:00'      },      {        title: 'Meeting',        start: '2018-03-12T14:30:00'      },      {        title: 'Happy Hour',        start: '2018-03-12T17:30:00'      },      {        title: 'Dinner',        start: '2018-03-12T20:00:00'      },      {        title: 'Birthday Party',        start: '2018-03-13T07:00:00'      },      {        title: 'Click for Google',        url: 'http://google.com/',        start: '2018-03-28'      }      ],      eventAfterAllRender: function(view) {        if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {          $('#calendar').fullCalendar('changeView', 'agendaDay');        } //IF MOBILE CHANGE VIEW TO AGENDA DAY      }    });  });
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script><script src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js'></script><script src='https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.min.js'></script><link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.css'><div id='calendar'></div>

Fullcalendar callback on mobile devices

It turned out that Angular Material 1.1.10 interfere with fullcalendar. It overrides touch handling in some way. And event is recognized as mousedown instead of touchstart.

Solution is to remove all pointer events from:

var START_EVENTS = 'mousedown touchstart pointerdown';
var MOVE_EVENTS = 'mousemove touchmove pointermove';
var END_EVENTS = 'mouseup mouseleave touchend touchcancel pointerup pointercancel';

via https://stackoverflow.com/a/42620599/5940387

How to make FullCalendar work on touch devices?

Have you tried including the Jquery UI Touch Punch?

By default, Jquery UI doesn't support Touch Events because it wasn't optimized for mobile devices.
Touch Punch solved my problems with the Jquery UI Drag&Drop functionalities, which seem to be used by FullCalendar as well.

Hope it helps!

fullcalendar dynamically change default view based on screen width

If by "dynamically change" you mean you want to change it when the user resizes their browser, then you need to listen for window resize.

$(window).resize(function() {
if(window.innerWidth < 800){
$('#event_calendar').fullCalendar('changeView', 'agendaDay');
} else {
$('#event_calendar').fullCalendar('changeView', 'agendaWeek');
}
});

But also check your browser console for errors. It looks like as of version 4.0+ those views have been renamed see changelog so you may need to pass different view names like this:

$(window).resize(function() {
if(window.innerWidth < 800){
$('#event_calendar').fullCalendar('changeView', 'timeGridDay');
} else {
$('#event_calendar').fullCalendar('changeView', 'timeGridWeek');
}
});

FullCalendar.js adjust header for mobile

Give each of them a width:100%; and display:block; that should do the trick.
At least I was able to get the demo one on teh fullcalendar.js website to do that.
You will then have to align them as you see fit.

.fc-header-left, fc-header-center, fc-header-right {
width: 100%;
display: block;
}


Related Topics



Leave a reply



Submit