ligne de temps courante de fullcalendar sur la vue de la semaine et la vue de jour

je comprends que, conformément à ce problème billet sur google code http://code.google.com/p/fullcalendar/issues/detail?id=143 qu'il y a un soloution flottant autour, cependant je ne peux pas l'air de trouver ça.

je me demandais si quelqu'un sait comment afficher un rouge solide ligne à l'heure actuelle sur le calendrier

20
demandé sur cweiske 2012-01-11 06:32:51

8 réponses

function setTimeline(view) {
    var parentDiv = jQuery(".fc-agenda-slots:visible").parent();
    var timeline = parentDiv.children(".timeline");
    if (timeline.length == 0) { //if timeline isn't there, add it
        timeline = jQuery("<hr>").addClass("timeline");
        parentDiv.prepend(timeline);
    }

    var curTime = new Date();

    var curCalView = jQuery("#calendar").fullCalendar('getView');
    if (curCalView.visStart < curTime && curCalView.visEnd > curTime) {
        timeline.show();
    } else {
        timeline.hide();
        return;
    }

    var curSeconds = (curTime.getHours() * 60 * 60) + (curTime.getMinutes() * 60) + curTime.getSeconds();
    var percentOfDay = curSeconds / 86400; //24 * 60 * 60 = 86400, # of seconds in a day
    var topLoc = Math.floor(parentDiv.height() * percentOfDay);

    timeline.css("top", topLoc + "px");

    if (curCalView.name == "agendaWeek") { //week view, don't want the timeline to go the whole way across
        var dayCol = jQuery(".fc-today:visible");
        var left = dayCol.position().left + 1;
        var width = dayCol.width()-2;
        timeline.css({
            left: left + "px",
            width: width + "px"
        });
    }

}

puis, dans la configuration:

viewDisplay: function(view) {
        try {
            setTimeline();
        } catch(err) {}
    },

et dans la css:

.timeline {
    position: absolute;
    left: 59px;
    border: none;
    border-top: 1px solid red;
    width: 100%;
    margin: 0;
    padding: 0;
    z-index: 999;
}

j'ai seulement essayé sur la vue de semaine puisque c'est tout ce que j'utilise.

Bonne chance.

Edit:

pour obtenir la chronologie à mettre à jour pendant la journée, vous pouvez essayer quelque chose comme ça dans le viewDisplay:

viewDisplay: function(view) {
            if(first){
                first = false;
            }else {
                window.clearInterval(timelineInterval);
            }
            timelineInterval = window.setInterval(setTimeline, 300000);
            try {
                setTimeline();
            } catch(err) {}
        },

vous aurez besoin de définir first=true en haut de l'étiquette. Cela déplacera la ligne de temps Toutes les 300 secondes = 5 minutes. Vous pouvez le baisser si vous besoin de plus lisse..

24
répondu Magnus Winter 2012-01-12 08:30:14

la solution de Magnus Winter fonctionne très bien, mais elle ne considère pas les options fullcalender minTime et maxTime. Si elles sont définies, alors la ligne de temps est égarée.

pour corriger ceci remplacer la définition de cursecondes et de pourcentage de jour dans le code de Magnus Winter par:

var curSeconds = ((curTime.getHours() - curCalView.opt("minTime")) * 60 * 60) + (curTime.getMinutes() * 60) + curTime.getSeconds();
var percentOfDay = curSeconds / ((curCalView.opt("maxTime") - curCalView.opt("minTime")) * 3600); // 60 * 60 = 3600, # of seconds in a hour
12
répondu Martin Pabst 2012-07-24 21:16:47

Il a été résolu dans la nouvelle version de FullCalendar (2.6.0)

http://fullcalendar.io/docs/current_date/nowIndicator/

$('#calendar').fullCalendar({       
    nowIndicator: true
});

nowIndicator

12
répondu Silvestre 2016-09-23 13:10:16

beaucoup de solution, le cumul de tous les changements dans le thread pour obtenir ce travail pour fullcalendar-2.1.0-beta1 et a fait quelques changements mineurs pour que cela fonctionne pour moi.

var timelineInterval;

$calendar.fullCalendar({
  ...,
  viewRender: function(view) {              
    if(typeof(timelineInterval) != 'undefined'){
      window.clearInterval(timelineInterval); 
    }
    timelineInterval = window.setInterval(setTimeline, 300000);
    try {
      setTimeline();
    } catch(err) {}
  },
  ...
});

function setTimeline(view) {
  var parentDiv = $('.fc-slats:visible').parent();
  var timeline = parentDiv.children(".timeline");
  if (timeline.length == 0) { //if timeline isn't there, add it
    timeline = $("<hr>").addClass("timeline");
    parentDiv.prepend(timeline);
  }

  var curTime = new Date();

  var curCalView = $("#calendar").fullCalendar('getView');
  if (curCalView.intervalStart < curTime && curCalView.intervalEnd > curTime) {
    timeline.show();
  } else {
    timeline.hide();
    return;
  }
  var calMinTimeInMinutes = strTimeToMinutes(curCalView.opt("minTime"));
  var calMaxTimeInMinutes = strTimeToMinutes(curCalView.opt("maxTime"));
  var curSeconds = (( ((curTime.getHours() * 60) + curTime.getMinutes()) - calMinTimeInMinutes) * 60) + curTime.getSeconds();
  var percentOfDay = curSeconds / ((calMaxTimeInMinutes - calMinTimeInMinutes) * 60);

  var topLoc = Math.floor(parentDiv.height() * percentOfDay);
  var timeCol = $('.fc-time:visible');
  timeline.css({top: topLoc + "px", left: (timeCol.outerWidth(true))+"px"});

  if (curCalView.name == "agendaWeek") { //week view, don't want the timeline to go the whole way across
    var dayCol = $(".fc-today:visible");
    var left = dayCol.position().left + 1;
    var width = dayCol.width() + 1;
    timeline.css({left: left + "px", width: width + "px"});
  }
}

function strTimeToMinutes(str_time) {
  var arr_time = str_time.split(":");
  var hour = parseInt(arr_time[0]);
  var minutes = parseInt(arr_time[1]);
  return((hour * 60) + minutes);
}

Mes modifications

A changer

var parentDiv = jQuery(".fc-agenda-slots:visible").parent();

var parentDiv = jQuery(".fc-slats:visible").parent();

sinon aucune chronologie ne serait rendue. Devinez Calendrier Complet a changé cela.


puis j'ai eu un problème avec la position gauche de la ligne en vue de jour donc j'ai changé

timeline.css("top", topLoc + "px");

var timeCol = $('.fc-time:visible');
timeline.css({top: topLoc + "px", left: (timeCol.outerWidth(true))+"px"});

aussi la largeur de la ligne de temps dans agendaWeek est mauvaise donc j'ai changé

var width = dayCol.width() - 2;

var width = dayCol.width() + 1;

Je n'ai pas expliqué pourquoi, je l'ai simplement changé pour que ça ait l'air correct.

7
répondu Thorval 2014-09-15 14:42:28

Martin Pabst a fait un bon point, mais il ne fonctionne pas si vous mettez min et max time comme cordes (ex. "07: 30").

Pour le résoudre:

function strTimeToMinutes(str_time) {
  var arr_time = str_time.split(":");
  var hour = parseInt(arr_time[0]);
  var minutes = parseInt(arr_time[1]);
  return((hour * 60) + minutes);
}

et remplacer ses définitions par:

var calMinTimeInMinutes = strTimeToMinutes(curCalView.opt("minTime"));
var calMaxTimeInMinutes = strTimeToMinutes(curCalView.opt("maxTime"));

var curSeconds = (( ((curTime.getHours() * 60) + curTime.getMinutes()) - calMinTimeInMinutes) * 60) + curTime.getSeconds();                       
var percentOfDay = curSeconds / ((calMaxTimeInMinutes - calMinTimeInMinutes) * 60);
6
répondu eMgz 2013-04-22 21:48:28

Génial solution, m'a beaucoup aidé, merci à vous tous! Ce sont les changements nécessaires pour que cette solution fonctionne avec le nouveau FullCalendar v2.

Modifier la ligne: if (curCalView.visStart < curTime && curCalView.visEnd > curTime) {

À: if (curCalView.intervalStart < curTime && curCalView.intervalEnd > curTime) {

Et préfèrent utiliser: viewRender: function(view) {

au lieu de: viewDisplay: function(view) {

3
répondu Awerealis 2014-07-08 00:50:27

j'ai trouvé cette solution pour la version 2.3.2. Il est basé sur des exemples précédents.

    var timelineIntervalPromise;
    var renderCurrentTimeline = function(view, element, anchor) {
      var currentDate = moment().tz(security.currentUser.timeZone.id);
      var intervalStart = view.intervalStart.clone().tz(security.currentUser.timeZone.id)
        .year(view.intervalStart.year())
        .month(view.intervalStart.month())
        .day(view.intervalStart.day())
        .time('00:00:00');
      var intervalEnd = view.intervalEnd.clone().tz(security.currentUser.timeZone.id)
        .year(view.intervalEnd.year())
        .month(view.intervalEnd.month())
        .day(view.intervalEnd.day())
        .time('00:00:00');

      if (view.name === 'month' || !currentDate.isBetween(intervalStart, intervalEnd)) {
        return;
      }

      var timeGrid = element.find('.fc-time-grid');
      var timeline = angular.element('<hr class="timeline" />');
      timeGrid.find('hr.timeline').remove();
      timeGrid.prepend(timeline);

      var calMinTimeInMinutes = moment.duration(view.opt('minTime')).asMinutes();
      var calMaxTimeInMinutes = moment.duration(view.opt('maxTime')).asMinutes();
      var curSeconds = (( ((currentDate.hours() * 60) + currentDate.minutes()) - calMinTimeInMinutes) * 60) + currentDate.seconds();
      var percentOfDay = curSeconds / ((calMaxTimeInMinutes - calMinTimeInMinutes) * 60);
      var topLoc = Math.floor(timeGrid.height() * percentOfDay);
      var timeCol = element.find('.fc-time:visible');
      timeline.css({top: topLoc, left: timeCol.outerWidth(true)});
      if (angular.isUndefined(anchor) || anchor === true) {
        timeGrid.parent().scrollTop(timeline.offset().top);
      }

      if (view.name === 'agendaWeek') { // Week view, don't want the timeline to go the whole way across.
        var dayCol = element.find('.fc-time-grid .fc-bg .fc-today');
        var left = dayCol.position().left + 1;
        var width = dayCol.width() + 1;
        timeline.css({left: left, width: width});
      }

      if (angular.isDefined(timelineIntervalPromise)) {
        $interval.cancel(timelineIntervalPromise);
      }
      timelineIntervalPromise = $interval(function() {
        var view = uiCalendarConfig.calendars.eventCalendar.fullCalendar('getView');
        renderCurrentTimeline(view, view.el, false);
      }, 300000);
    };
2
répondu Vladimír Gorej 2015-08-07 11:39:31

Pour le faire fonctionner avec la version 2.2.7 lors de l'aide personnalisée min et max de temps, j'ai ajouté

var slotsDiv  = $('.fc-slats:visible');

avant la ligne

var parentDiv = $('.fc-slats:visible').parent();

et changé la ligne

var topLoc = Math.floor(parentDiv.height() * percentOfDay);

var topLoc = Math.floor(slotsDiv.height() * percentOfDay);

ainsi la fonction utilise la hauteur div correcte pour calculer la position de la ligne de temps.

0
répondu João Marques 2015-05-08 19:04:00