chris polzer
chris polzer

Reputation: 3367

jQuery Datepicker, select multiple dates and mark them via css at selection time, permanently

so I have spent a day developing and reading (teh other way around) to enable my jQuery datepicker to select and highlight mutliple dates.

For this I have managed to write the selected dates to an array which is visualized in a simple textfield.

What I could not manage is to permanently modify the look of the selected date in the datepicker.

I have implemented the "beforeShowDay:" option, which is working properly uppon loading the datepicker, but of course is not called directly on selecting a date. For this I guessed, I would need to refresh the view "onSelect", but the refresh is not working properly. Right now, I have some small methods for handling the datearray.

Uppon adding or removing a date, I am trying to refresh the datepicker.

Uppon selecting a date, I am either adding it to, or remove it from the dates-array. Also, onSelect, I am matching the selected day and try to addClass().

But once again, I think I missed something all the way round, as it is not shown in my datepicker.

Here's my code for now:

var dates = new Array();

function addDate(date) {
    if (jQuery.inArray(date, dates) < 0 && date) {
        dates.push(date);
    }
}

function removeDate(index) {
    dates.splice(index, 1);
}

// Adds a date if we don't have it yet, else remove it and update the dates
// textfield
function addOrRemoveDate(date) {
    var index = jQuery.inArray(date, dates);
    if (index >= 0) {
        removeDate(index);
        updateDatesField(dates);
    } else {
        addDate(date);
        updateDatesField(dates);
    }
    jQuery(calContainer).datepicker("refresh");
}


    var calContainer = document.getElementById("calendar-container");

    jQuery(calContainer).datepicker({
        minDate : new Date(),
        dateFormat : "@",
        onSelect : function(dateText, inst) {
            addOrRemoveDate(dateText);

            jQuery(".ui-datepicker-calendar tbody tr td a").each(function() {
                if (jQuery(this).text() == inst.selectedDay) {
                    jQuery(this).addClass("ui-state-highlight");
                    jQuery(this).parent().addClass("selected");
                }
            });
            // addTimeSelectorColumns(dates);
        },
        beforeShowDay : function(_date) {
            var gotDate = -1;
            for ( var index = 0; index < dates.length; index++) {
                if (_date.getTime() == dates[index]) {
                    gotDate = 1;
                } else {
                    gotDate = -1;
                }
            }

            if (gotDate >= 0) {
                return [ true, "ui-datepicker-today", "Event Name" ];
            }
            return [ true, "" ];
        }
    });
function updateDatesField(dates) {

    if (dates.length > 0) {
        var tmpDatesStrArr = new Array();
        var dateString = "";
        var datesField = document.getElementById("dates");

        for ( var index = 0; index < dates.length; index++) {
            var dateNum = dates[index];

            var tmpDate = new Date();
            tmpDate.setTime(dateNum);

            dateString = tmpDate.getDate() + "." + tmpDate.getMonth() + "."
                    + tmpDate.getFullYear();
            tmpDatesStrArr.push(dateString);
        }

        jQuery(datesField).val(tmpDatesStrArr);
    }
}

(I am still a beginner in Javascript/jQuery, so any help or hints towards my coding are welcome, btw...)

Upvotes: 0

Views: 3287

Answers (1)

William Niu
William Niu

Reputation: 15853

It depends whether you want to stick with jQuery UI or not. If you are open to other library, there is a jQuery Datepicker that supports multiple selection: jquery.datePicker with multiple select enabled. It may save you sometmie fiddling with jQuery UI's one, as it does not natively support multiple selection.

EDIT:

If your main library is not jQuery, I think you should look for a standalone or Prototype-dependent library instead. The JS Calendar looks promising. It natively supports multiple selection by detecting the Ctrl key.

Upvotes: 1

Related Questions