Gravity Forms: advanced use of Datepicker

If you want to use Gravity Forms’ Datepicker in an advanced way, you’re going to have to quickly use Javascript code. A good solution is to use the free Code Chest plugin from Gravity Wiz.

In all examples :
– Form ID: 3
– ID of the ‘start date’ datepicker field: 110
– ID of the ‘end date’ datepicker field: 111
– Date fields are in FR format (‘dd.mm.yyyy’ i.e. ‘27.12.2025’)

Here are a few examples:

1. Basic example

The start date must be greater than or equal to the current date. The end date must be greater than the start date; by default, it must correspond to the start date + 1 day.

gform.addFilter( 'gform_datepicker_options_pre_init', function( optionsObj, formId, fieldId ) {
    if ( formId == 3 && (fieldId == 110 || fieldId == 111) ) {
        optionsObj.minDate = 0;
        optionsObj.dateFormat = 'dd.mm.yy';
        optionsObj.onClose = function (dateText, inst) {
            var dateArray = dateText.split('.');
            var day = parseInt(dateArray[0], 10);
            var month = parseInt(dateArray[1], 10) - 1;
            var year = parseInt(dateArray[2], 10);
            var dateSelected = new Date(year, month, day);
            var dateMin = new Date(dateSelected.getTime() + (24 * 60 * 60 * 1000));
            jQuery('#input_3_111').datepicker('option', 'minDate', dateMin).datepicker('setDate', dateMin);
        };
    }
    return optionsObj;
});

2. Advanced example

Same as above, but it is not possible to select Sunday as the start date:

gform.addFilter( 'gform_datepicker_options_pre_init', function( optionsObj, formId, fieldId ) {
    if ( formId == 3 && (fieldId == 110 || fieldId == 111) ) {
        optionsObj.minDate = 0;
        optionsObj.dateFormat = 'dd.mm.yy';
        optionsObj.onClose = function (dateText, inst) {
            var dateArray = dateText.split('.');
            var day = parseInt(dateArray[0], 10);
            var month = parseInt(dateArray[1], 10) - 1;
            var year = parseInt(dateArray[2], 10);
            var dateSelected = new Date(year, month, day);
            var dateMin = new Date(dateSelected.getTime() + (24 * 60 * 60 * 1000));
            jQuery('#input_3_111').datepicker('option', 'minDate', dateMin).datepicker('setDate', dateMin);
        };
    }
    if ( formId == 3 && (fieldId == 110 ) ) {
        optionsObj.firstDay = 1;
        optionsObj.beforeShowDay = function(date) {
            var day = date.getDay();
            return [(day == 1 || day == 2 || day == 3 || day == 4 || day == 5 || day == 6)];
        };
	}	
	return optionsObj;
});

3. More advanced example

We added 2 conditions :

– The datepicker allows you to select dates between 24.6.2024 and 28.6.2024

– The end date must be between 1 and 3 days after the start date

To make your life easier, all the configuration is done at the start of the script using variables.

Are you ready for a 66 lines-code-script ?

gform.addFilter('gform_datepicker_options_pre_init', function(optionsObj, formId, fieldId) {

// START config
var formID = 3;
var fieldStartID = 110;
var fieldEndID = 111;
optionsObj.dateFormat = 'dd.mm.yy';
var startDate = new Date(2024, 5, 24); // 24.06.2024
var endDate = new Date(2024, 5, 28); // 28.06.2024
var minDelay = 1;
var maxDelay = 3;
// END config

	if (formId == formID && (fieldId == fieldStartID || fieldId == fieldEndID)) {
		if (fieldId == fieldStartID) {
			optionsObj.minDate = startDate;
			endDate.setDate(endDate.getDate() - minDelay);
			optionsObj.maxDate = endDate;
		} else if (fieldId == fieldEndID) {
			startDate.setDate(startDate.getDate() + minDelay);
			optionsObj.minDate = startDate;
			optionsObj.maxDate = endDate;
		}
		optionsObj.onClose = function(dateText, inst) {
			var startDate = jQuery('#input_'+formID+'_'+fieldStartID).datepicker('getDate');
			var endDate = jQuery('#input_'+formID+'_'+fieldEndID).datepicker('getDate');

			if (fieldId == fieldStartID && !endDate) {
				if (!endDate || startDate > endDate) {
					var defaultEndDate = new Date(startDate);
					defaultEndDate.setDate(startDate.getDate() + minDelay);
					jQuery('#input_'+formID+'_'+fieldEndID).datepicker('setDate', defaultEndDate);
				}
			} else if (fieldId == fieldStartID && endDate) {
				if (startDate > endDate) {
					jQuery('#input_'+formID+'_'+fieldEndID).datepicker('setDate', null);
				} else {
					var maxEndDate = new Date(startDate);
					maxEndDate.setDate(maxEndDate.getDate() + maxDelay);

					var lastDate = endDate;
					
					if (endDate > lastDate) {
						jQuery('#input_'+formID+'_'+fieldEndID).datepicker('setDate', lastDate);
					} else if (maxEndDate < endDate) {
						jQuery('#input_'+formID+'_'+fieldEndID).datepicker('setDate', maxEndDate);
					}
				}
			} else if (fieldId == fieldEndID && startDate) {
				if (endDate < startDate) {
					jQuery('#input_'+formID+'_'+fieldStartID).datepicker('setDate', endDate);
				} else {
					var minStartDate = new Date(endDate);
					minStartDate.setDate(minStartDate.getDate() - maxDelay);
					var firstDate = startDate;
					if (startDate < firstDate) {
						jQuery('#input_'+formID+'_'+fieldStartID).datepicker('setDate', firstDate);
					} else if (minStartDate > startDate) {
						jQuery('#input_'+formID+'_'+fieldStartID).datepicker('setDate', minStartDate);
					}
				}
			}
		};
	}
	return optionsObj;
});

To manage conditions easily and without code, you can use the Gravity Wiz plugin, which offers plenty of advanced features for Gravity Forms.

Submit a Comment

Your email address will not be published. Required fields are marked *