Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery UI Datepicker with jQuery tipsy

Any ideas how to implement tipsy tooltips over jQuery's UI Datepicker? Basically I want to get a tooltip when the user moves on a specific date in the Datepicker. The Datepicker will be displayed inline and always visible.

Thanks!

like image 525
remedix Avatar asked Feb 19 '10 22:02

remedix


People also ask

How to use jQuery UI datepicker?

The datepicker is tied to a standard form input field. Focus on the input (click, or use the tab key) to open an interactive calendar in a small overlay. Choose a date, click elsewhere on the page (blur the input), or hit the Esc key to close. If a date is chosen, feedback is shown as the input's value.

How can change date format in jQuery ui datepicker?

inside the jQuery script code just paste the code. $( ". selector" ). datepicker({ dateFormat: 'yy-mm-dd' });

How to use datepicker in js?

We can include datepicker feature in our javascript program by specifying the below inside the <head> and <body> tags. Inside <head> we have to use “datepicker. min. css” and inside <body> tag use “datepicker.

How do I change date format in picker?

Double-click the date picker, text box, or expression box control whose data you want to format. In the Control Properties dialog box, do one of the following: If you are working with a text box control or a date picker control, click the Data tab.


1 Answers

That sounds pretty cool,

Here's my solution. Read the comments.

(function($){


/** 
 * Returns a dictionary, where the keys are the day of the month, 
 * and the value is the text.
 * @param year - The year of the events.
 * @param month - The month of the events.
 * @param calendarID - Events for a specific calendar.
 */
function getMonthEvents(year, month, calendarId){
  return {11: "My birthday.", 23: "My anniversary" };
}

// Receives January->1
function addTipsys(year, month, calendarId){
   var theEvents = getMonthEvents(year, month, calendarId);
   var theDateLinks = $('#' + calendarId + ' .ui-datepicker-calendar a');
   for(eventDay in theEvents){
      // Minus one, because the date in the tipies are regular dates (1-31)
      // and the links are 0-based.
      theDateLinks.eq(eventDay-1)  // select the right link
         .attr('original-title', theEvents[eventDay])  // set the text
         .tipsy();   // init the tipsy, set your properties.
   }
}

// Because the the event `onChangeMonthYear` get's called before updating 
// the items, we'll add our code after the elements get rebuilt. We will hook 
// to the `_updateDatepicker` method in the `Datepicker`.
// Saves the original function.
var _updateDatepicker_o = $.datepicker._updateDatepicker;
// Replaces the function.
$.datepicker._updateDatepicker = function(inst){ 
   // First we call the original function from the appropiate context.
   _updateDatepicker_o.apply(this, [inst]); 
   // No we can update the Tipsys.
   addTipsys(inst.drawYear, inst.drawMonth+1, inst.id);
};

// Finally the calendar initializer.
$(function(){
   // Creates the date picker, with your options.
   $("#datepicker").datepicker();
   // Gets the date and initializes the first round of tipsies.
   var currentDate = $('#datepicker').datepicker('getDate');
   // month+1 because the event considers January->1
   // Last element is null, because, it doesn't actualy get used in the hanlder.
   addTipsys(currentDate.getYear(), currentDate.getMonth()+1, 'datepicker');
});

})(jQuery);

Inconveniences:

  1. The _updateDatepicker method get's called also when the user selects a day form the visible month, or when you set a date via datepicker('setDate', theDate), which could be a little inefficient.

  2. It relies in a private function of the Datepicker, if in future versions they decide to change it's functionality, or change the name, this code will break. Although because of the nature of the function I don't see that happening soon.

NOTE: My first approach was to hook to the onChangeMonthYear event of the ui.datepicker, but because the event is triggered, before the replacing of the dates in the calendar, the addTipsys method, would add the tipsy's to the calendar dates that are about to get cleared. Therefore the need to call the addTipsys event AFTER the elements get refreshed.

EASY HACK: Hook a method to the onChangeMonthYear event of your calendar, and do a setTimeout to call the tipsy's. Some validation will need to be done.

like image 107
guzart Avatar answered Oct 02 '22 20:10

guzart