Полный календарь показывает события как точки
Я пытаюсь изменить дизайн календаря с помощью полного календаря. То, что я хочу достичь, - это видимые события, которые могут вписываться в календарь, показаны как есть, и скрытые события (события, которые свернули в "+2 больше") в виде точек. Вот как это выглядит так:
var dayArray = [];
$(function() {
var todayDate = moment().startOf('day');
var YM = todayDate.format('YYYY-MM');
var YESTERDAY = todayDate.clone().subtract(1, 'day').format('YYYY-MM-DD');
var TODAY = todayDate.format('YYYY-MM-DD');
var TOMORROW = todayDate.clone().add(1, 'day').format('YYYY-MM-DD');
var NEXTMONTH = todayDate.clone().add(1, 'month').format('YYYY-MM');
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay,listWeek'
},
editable: true,
eventLimit: true, // allow "more" link when too many events
navLinks: true,
timeFormat: 'HH:mm',
slotLabelFormat: 'HH:mm',
views: {
basic: {
// options apply to basicWeek and basicDay views
},
agenda: {
// options apply to agendaWeek and agendaDay views
},
week: {
columnHeaderFormat: 'ddd D',
titleFormat: 'DD MMM YYYY'
},
day: {
// options apply to basicDay and agendaDay views
}
},
events: [
{
title: 'The AI Summit 2016',
start: YM + '-03',
end: YM + '-06',
backgroundColor: "#BCE4FD",
borderColor: "#26A8FB"
},
{
title: 'Spring 2016',
start: YM + '-09',
end: YM + '-14',
backgroundColor: "#BCE4FD",
borderColor: "#26A8FB"
},
{
title: 'Virtual Assistant Summit',
start: YM + '-17',
end: YM + '-20',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: "O'Reilly Summit 2016",
start: YM + '-23',
end: YM + '-26',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'SIGCHI 2016 Conference',
start: YM + '-18',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'Les Inggris 2016 Q4',
start: YM + '-11',
backgroundColor: "#BCE4FD",
borderColor: "#26A8FB"
},
{
title: 'Minds Mastering Mac',
start: YM + '-05',
end: YM + '-07',
backgroundColor: "#eee",
borderColor: "#aaa"
},
{
title: 'AAAI-16',
start: YM + '-18',
end: YM + '-20',
backgroundColor: "#eee",
borderColor: "#aaa"
},
{
title: 'Service Experience',
start: YM + '-26',
end: YM + '-29',
backgroundColor: "#eee",
borderColor: "#aaa"
},
{
title: 'Les Bahasa Perancis',
start: YM + '-26',
backgroundColor: "#B3EFDA",
borderColor: "#00c983"
},
{
title: 'SMS Las Vegas 2016',
start: YM + '-27',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
{
title: 'Leadership Training',
start: YM + '-27',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
{
title: 'Leadership Training 2',
start: YM + '-28',
end: YM + '-30',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
{
title: 'Leadership Camp Winter 2016',
start: YM + '-27',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'English Course',
start: YM + '-27',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'Sharing Session Hadoop',
start: NEXTMONTH + '-02',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
],
eventTextColor: "#333",
/*
eventAfterAllRender: function() {
var events = $('#calendar').fullCalendar('clientEvents');
console.log(events);
//get all dates with events
var startDateWithEvent = [];
var endDateWithEvent = [];
for (var i = 0; i < events.length; i++) {
startDateWithEvent[i] = events[i].start._i;
endDateWithEvent[i] = events[i].end._i;
}
startDateWithEvent = startDateWithEvent.push(endDateWithEvent);
var dateWithEvent = startDateWithEvent.filter(function(item, pos) {
return startDateWithEvent.indexOf(item) == pos;
});
console.log(dateWithEvent);
//get event colors of each date
for (var i = 0; i < dateWithEvent.length; i++) {
for (var j = 0; j < events.length; j++) {
if (dateWithEvent[i] == events[j].start._i) {
var eventObject = {};
eventObject.date = dateWithEvent[i];
eventObject.title = events[j].title;
eventObject.backgroundColor = events[j].backgroundColor;
eventObject.borderColor = events[j].borderColor;
dayArray.push(eventObject);
}
}
}
//get hidden only events
for (var i = 0; i < dayArray.length; i++) {
}
}*/
});
});
#calendar table {
display: table;
border: none !important;
}
.calendar-example {
line-height: 1.3;
}
.calendar-example h2 {
font-size: 22px;
}
.calendar-example a[data-goto] {
color: #444;
}
.fc-title {
font-size: 12px !important;
}
.fc-center h2 {
font-size: 22px;
color: #00c983;
font-weight: 400;
}
#calendar thead {
border: none !important;
}
.fc-day-header {
border: none !important;
font-size: 13px;
}
.fc-head {
line-height: 40px;
border: none !important;
}
.fc-body {
background-color: #f8f8f8;
}
.fc-day {
/*border-left: none !important;
border-right: none !important;*/
}
.fc-head-container {
/*border-right: none !important;
border-left: none !important;*/
}
.fc-day-number {
font-size: 13px;
margin-right: 4px;
margin-top: 4px;
width: 24px;
height: 24px;
border-radius: 3px;
line-height: 24px;
text-align: center;
color: #777;
}
.fc-day-number:hover {
text-decoration: none !important;
color: #777;
}
.fc-today {
background-color: #E6FAF3 !important;
}
.fc-today .fc-day-number {
background-color: #00c983;
font-weight: 700;
color: #fff;
}
.fc-widget-content {
border-right: solid 8px #f8f8f8 !important;
border-left: solid 8px #f8f8f8 !important;
}
.fc-more-cell > div {
text-align: right;
margin-right: 8px;
font-size: 14px;
color: #777;
}
.fc-more-cell > div > a:hover {
text-decoration: none;
color: #333;
}
.fc-content {
padding: 1px 4px;
}
.fc-widget-header {
border: none !important;
}
.fc-time {
font-size: 12px;
font-weight: 700;
}
.fc-time.fc-widget-content {
border: none;
}
.fc-time-grid .fc-slats .fc-minor td {
border-top-style: none !important;
}
.fc-axis.fc-time.fc-widget-content {
transform: translate(-8px, -12px);
}
.fc-popover.fc-more-popover,
.fc-popover.fc-more-popover .fc-widget-header,
.fc-popover.fc-more-popover .fc-widget-content {
background-color: #fff !important;
}
.fc-axis.fc-widget-content {
font-size: 12px;
font-weight: 700;
}
#calendar .dot-event {
width: 20px;
height: 20px;
border-radius: 50%;
display: inline-block;
margin-left: 10px;
vertical-align: text-bottom;
}
.red {
width: 10px;
height: 10px;
background-color: "#000";
}
<link rel="stylesheet" href="#" onclick="location.href='https://use.fontawesome.com/releases/v5.0.11/css/all.css'; return false;" integrity="sha384-p2jx59pefphTFIpeqCcISO9MdVfIm4pNnsL08A6v5vaQc4owkQqxMV8kg4Yvhaw/" crossorigin="anonymous">
<link href="#" onclick="location.href='https://fonts.googleapis.com/css?family=Open+Sans:400,400i,700,700i'; return false;" rel="stylesheet">
<link rel="stylesheet" href="#" onclick="location.href='https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.min.css'; return false;">
<div id="calendar"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.min.js"></script>
Ответы
Ответ 1
Возможно, вместо того, чтобы получать скрытые события, вы можете попытаться изменить стиль событий на основе типа представления. Тогда в месяцах события будут точки. Вы можете использовать обратный вызов eventRender (https://fullcalendar.io/docs/eventRender)
Вы также можете отфильтровать все клиентские события, загруженные текущим представлением, и получить его свойства с помощью $('#calendar').fullCalendar('clientEvents', filter)
(https://fullcalendar.io/docs/clientEvents)
Ответ 2
в этой ситуации полный календарь предоставляет событие Render function. Все события, проходящие через событие, вы должны проверять каждое событие в соответствии с тем, что ставит дизайн для точки и т.д.
eventRender: function(event, element) {
console.log(event);//here each event printed one bu one as render.start
//and end date of event
if(event.end){
///check the start and end date difference
}else {
//No end date for event
}
if(event.backgroundColor == '#BCE4FD'){
} }
Ответ 3
Запустить фрагмент и посмотреть, что вы хотели?
Часть CSS:
- Я добавил новый CSS, который вы можете найти после
/* New CSS */
в фрагменте. Я прокомментировал #calendar.dot-event
, но вы можете .fc-month-view.fc-day.fc-event-dot
точки через .fc-month-view.fc-day.fc-event-dot
. (Т.е. я использовал существующие стили /class
точек в FullCalendar)
Часть JS:
- Я удалил
dayArray
потому что это не нужно. Затем я устанавливаю eventLimit
в значение (и это должно быть) false
. Я также использовал eventAfterRender
а не eventAfterAllRender
, и только добавленный JS был включен в eventAfterRender
обратного вызова eventAfterRender
.
Часть HTML:
В принципе, никаких изменений. (кроме тех, которые динамически изменялись с помощью JavaScript)
(Вы также можете просто сравнить мой фрагмент с вашим, чтобы узнать, что изменилось.)
$(function() {
var todayDate = moment().startOf('day');
var YM = todayDate.format('YYYY-MM');
var YESTERDAY = todayDate.clone().subtract(1, 'day').format('YYYY-MM-DD');
var TODAY = todayDate.format('YYYY-MM-DD');
var TOMORROW = todayDate.clone().add(1, 'day').format('YYYY-MM-DD');
var NEXTMONTH = todayDate.clone().add(1, 'month').format('YYYY-MM');
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay,listWeek'
},
editable: true,
eventLimit: false, // Always FALSE
navLinks: true,
timeFormat: 'HH:mm',
slotLabelFormat: 'HH:mm',
views: {
basic: {
// options apply to basicWeek and basicDay views
},
agenda: {
// options apply to agendaWeek and agendaDay views
},
week: {
columnHeaderFormat: 'ddd D',
titleFormat: 'DD MMM YYYY'
},
day: {
// options apply to basicDay and agendaDay views
}
},
events: [
{
title: 'The AI Summit 2016',
start: YM + '-03',
end: YM + '-06',
backgroundColor: "#BCE4FD",
borderColor: "#26A8FB"
},
{
title: 'Spring 2016',
start: YM + '-09',
end: YM + '-14',
backgroundColor: "#BCE4FD",
borderColor: "#26A8FB"
},
{
title: 'Virtual Assistant Summit',
start: YM + '-17',
end: YM + '-20',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: "O'Reilly Summit 2016",
start: YM + '-23',
end: YM + '-26',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'SIGCHI 2016 Conference',
start: YM + '-18',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'Les Inggris 2016 Q4',
start: YM + '-11',
backgroundColor: "#BCE4FD",
borderColor: "#26A8FB"
},
{
title: 'Minds Mastering Mac',
start: YM + '-05',
end: YM + '-07',
backgroundColor: "#eee",
borderColor: "#aaa"
},
{
title: 'AAAI-16',
start: YM + '-18',
end: YM + '-20',
backgroundColor: "#eee",
borderColor: "#aaa"
},
{
title: 'Service Experience',
start: YM + '-26',
end: YM + '-29',
backgroundColor: "#eee",
borderColor: "#aaa"
},
{
title: 'Les Bahasa Perancis',
start: YM + '-26',
backgroundColor: "#B3EFDA",
borderColor: "#00c983"
},
{
title: 'SMS Las Vegas 2016',
start: YM + '-27',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
{
title: 'Leadership Training',
start: YM + '-27',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
{
title: 'Leadership Training 2',
start: YM + '-28',
end: YM + '-30',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
{
title: 'Leadership Camp Winter 2016',
start: YM + '-27',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'English Course',
start: YM + '-27',
backgroundColor: "#FFBCBA",
borderColor: "#D9624F"
},
{
title: 'Sharing Session Hadoop',
start: NEXTMONTH + '-02',
backgroundColor: "#DACAFD",
borderColor: "#8652FB"
},
],
eventTextColor: "#333",
eventAfterRender: function( event, element, view ){
// Enable for the 'month' view only.
if ( 'month' !== view.name ) {
return;
}
var a = moment( event.start, 'YYYY-MM-DD' ),
b = moment( event.end, 'YYYY-MM-DD' ),
duration = moment.duration( b.diff( a ) ),
row = element.closest( '.fc-row' ),
d = a.clone(), i, c;
var title = event.title;
if ( b.isValid() ) {
title += ' (' + $.fullCalendar.formatRange( a, b, 'MMM D YYYY' ) + ')';
}
// Add the event "dot", styled with the appropriate background color.
for ( i = 0; i <= duration._data.days; i++ ) {
if ( 0 === 1 ) {
c = a;
} else {
d.add( 1, 'days' );
c = d;
}
row.find( '.fc-day[data-date="' + c.format( 'YYYY-MM-DD' ) + '"]' )
.append(
'<a href="#" class="fc-event-dot" onclick="return false;" ' +
'style="background-color: ' + event.backgroundColor + ';" ' +
'title="' + title + '"></a>'
);
}
// Here you can either completely remove the default element, or just
// hide it visually on screen.
element.remove();
//element.addClass( 'hidden' );
}
});
});
#calendar table {
display: table;
border: none !important;
}
.calendar-example {
line-height: 1.3;
}
.calendar-example h2 {
font-size: 22px;
}
.calendar-example a[data-goto] {
color: #444;
}
.fc-title {
font-size: 12px !important;
}
.fc-center h2 {
font-size: 22px;
color: #00c983;
font-weight: 400;
}
#calendar thead {
border: none !important;
}
.fc-day-header {
border: none !important;
font-size: 13px;
}
.fc-head {
line-height: 40px;
border: none !important;
}
.fc-body {
background-color: #f8f8f8;
}
.fc-day {
/*border-left: none !important;
border-right: none !important;*/
}
.fc-head-container {
/*border-right: none !important;
border-left: none !important;*/
}
.fc-day-number {
font-size: 13px;
margin-right: 4px;
margin-top: 4px;
width: 24px;
height: 24px;
border-radius: 3px;
line-height: 24px;
text-align: center;
color: #777;
}
.fc-day-number:hover {
text-decoration: none !important;
color: #777;
}
.fc-today {
background-color: #E6FAF3 !important;
}
.fc-today .fc-day-number {
background-color: #00c983;
font-weight: 700;
color: #fff;
}
.fc-widget-content {
border-right: solid 8px #f8f8f8 !important;
border-left: solid 8px #f8f8f8 !important;
}
.fc-more-cell > div {
text-align: right;
margin-right: 8px;
font-size: 14px;
color: #777;
}
.fc-more-cell > div > a:hover {
text-decoration: none;
color: #333;
}
.fc-content {
padding: 1px 4px;
}
.fc-widget-header {
border: none !important;
}
.fc-time {
font-size: 12px;
font-weight: 700;
}
.fc-time.fc-widget-content {
border: none;
}
.fc-time-grid .fc-slats .fc-minor td {
border-top-style: none !important;
}
.fc-axis.fc-time.fc-widget-content {
transform: translate(-8px, -12px);
}
.fc-popover.fc-more-popover,
.fc-popover.fc-more-popover .fc-widget-header,
.fc-popover.fc-more-popover .fc-widget-content {
background-color: #fff !important;
}
.fc-axis.fc-widget-content {
font-size: 12px;
font-weight: 700;
}
/*#calendar .dot-event {
width: 20px;
height: 20px;
border-radius: 50%;
display: inline-block;
margin-left: 10px;
vertical-align: text-bottom;
}*/
.red {
width: 10px;
height: 10px;
background-color: "#000";
}
/* New CSS */
.fc-month-view .fc-row .fc-day {
/* Aligns the event dots at the bottom of the cell. */
vertical-align: bottom;
}
.fc-month-view .fc-day .fc-event-dot {
cursor: default;
/* Gives some spacing between the dots in a cell. */
margin-right: 2px;
}
.fc-month-view .hidden {
display: none;
}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.11/css/all.css" integrity="sha384-p2jx59pefphTFIpeqCcISO9MdVfIm4pNnsL08A6v5vaQc4owkQqxMV8kg4Yvhaw/" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,400i,700,700i" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.min.css">
<h3>Hover over the dot.</h3>
<div id="calendar"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.9.0/fullcalendar.min.js"></script>
Ответ 4
Прежде всего, название вашего вопроса. Полный календарь получает скрытые свойства событий, а не ваше точное требование. Потому что в этом отношении @Mariana уже ответил.
Ваше фактическое требование - показать события как точки, используя полный календарь.
Ответ на это требование заключается в том, что в настоящий момент полный календарь не предоставляет функцию отображения событий в виде цветных точек.
Но у вас есть альтернативы для достижения этого:
- Используйте Bootstrap Calendar, который прост в использовании и интеграции. GitHub
- Используйте Angular Bootstrap Calendar, но для этого вам нужно использовать AngularJS в своем проекте. Снимок экрана с ожидаемым выходом в вашем вопросе - это календарь углового бутстрапа.
- Настройте библиотеку полного календаря согласно вашему требованию (конечно, это время, а не хорошее решение)
Надеюсь, что это поможет вам.
Ответ 5
Не полное решение, но это может помочь в качестве быстрого решения, которое поможет вам в этом.
Вы можете преобразовать "больше" ссылок в соответствующее количество точек, которые можно щелкнуть как группу, чтобы отобразить popover, выполнив следующие действия:
Установите eventLimitText: ''
чтобы удалить текст "больше" (упрощает получение количества событий из текста). Затем получите все "больше" ссылок и преобразуйте их в соответствующее количество точек.
Пример JS:
$('.fc-more').each((i, elem) => {
let $elem = $(elem);
let num = $elem.text();
num = parseInt(num.substring(1));
$elem.text('');
for (let j = 0; j < num; j++) {
$elem.append('<div class="dot"></div>');
}
});
Пример CSS:
.dot {
background-color: blue;
width: 8px;
height: 8px;
margin-right: 2px;
border-radius: 50%;
display: inline-block;
}
Важно отметить, что это не создает отдельную кликабельную точку, которая соответствует одному событию, соответствующему цвету события. Получение этого решения может быть не тривиальным (вам может потребоваться установить eventLimit: false
и loop через все clientEvents
чтобы определить, какие дни имеют больше событий, чем вы хотите, преобразовать дополнительные события в индивидуально зависящие точки на основе цвета объекта события и других свойства, создайте свой собственный popover для отображения на клике и т.д.).