Невозможно выполнить чистое обновление старого jscalendar до новой версии jscal2 - PullRequest
3 голосов
/ 24 октября 2011

Почему мне нужно обновить
Мне нужно иметь функцию отключения навигации по датам после некоторой даты, поэтому я рассматриваю возможность обновления с jscalendar (http://www.dynarch.com/projects/calendar/old/) до jscal2 (http://www.dynarch.com/projects/calendar/))в моем проекте. Но на домашней странице и в документации нового jscal2 упоминаются следующие вещи -

  • Обратите внимание, что это совершенно новый продукт.

  • Обратите внимание, что он несовместим с нашим старым календарным проектом.

Задача
Итак, я запутался, есливозможно обновление с минимальными изменениями в моем текущем проекте, и если да, то как именно это сделать. Я уже разместил комментарий на сайте - http://www.dynarch.com/projects/calendar/discussion/ и жду ответа. Тем временем я думал, что те, кто имеетИспользованный продукт может помочь, поэтому вот мой вопрос.

Существующий код моего проекта использует версию 1.51 jscalendar (я вижу, что эта строка записана в файле calendar.js - calendar.js,v 1.51).Нет этого вспомогательного кода, который содержит function showCalendar(), который вызывает var cal = new Calendar(), вот так -

function setActiveStyleSheet()
function selected()
function closeHandler()
function showCalendar(){
    ...
    //some lines of code
    ... 
    var cal = new Calendar(1, null, selected, closeHandler);
    ...
    //some lines of code
    ... 
}
....

Проверьте то же самое здесь http://pastebin.com/QHAb0WdB

Но я нея не вижу этот вспомогательный скрипт в демоверсиях новой версии, которые я скачал сегодня.Я попытался, удалив включение всех файлов js / css старой версии, включенных файлов новой версии, но сохранив только тот же jscalendar.js, но он выдает эту ошибку js -

_dynarch_popupCalendar is not defined
[Break On This Error] if (_dynarch_popupCalendar != null) { 

Iкак я догадался, я мог бы ограничить прошедшую дату, добавив параметр onSelect к новой инициации Календаря следующим образом -

onSelect: function() {
   var date = Calendar.intToDate(this.selection.get());
   LEFT_CAL.args.min = date; // setting minimum date, so as to not allow browsing past this date
   LEFT_CAL.redraw();
   this.hide();
}

Но я ничего не пробовал после того, как изменение в вспомогательном скрипте не удалось.

Пожалуйста, дайте мне знать, если у вас есть представление о правильном процессе обновления.Я не уверен, что мне чего-то не хватает.

Я думал, что это будет так же просто, как просто изменить включение js, и это могут быть файлы css, и никаких изменений в коде не потребуется.Мне просто нужно установить еще несколько параметров конфигурации, соответствующих отключению дат, как я желаю.

Обновление
Упрощение сейчас !!

Прежде всегоисправление, это не обновление, потому что документ jscal2 (тот, который я хочу использовать) говорит -

  • Обратите внимание, что это совершенно новый продукт.

  • Обратите внимание, что он не совместим с нашим старым календарным проектом.

Я понял, что минимум, необходимый для вызова календаря, -

Calendar.setup({
    cont          : "calendar-container"  // a cont or a trigger
});

Все аргументы необязательны.Однако вы должны предоставить один из параметров cont (для встроенных календарей) или триггер для всплывающих календарей, либо предоставить собственный код для отображения всплывающего календаря.Мы увидим, как это можно сделать позже.

Я думаю, мне нужно написать этот код для отображения всплывающего календаря, например:

function showCalendar(){
    ...
    //some lines of code
    ... 
    var cal = new Calendar();
    ...
    //some code to display the calendar, based on the details already being passed to this function - which button was clicked, where to attach the calendar, etc.
    ... 
}

Но я сделалне вижу такого кода в документации.Я пытался с этим кодом, но не работает -

function trigger()
{

cal = new Calendar({
        inputField: "startdate",
        dateFormat: "%B %d, %Y",
        bottomBar: false,
        showTime:true
        }
});
cal.redraw(); //blind try - does not work, but it does not give any errors. But I 
don't see any other proper function to do this in the doc.  
}

Есть идеи, ребята?

Спасибо

Bounty Started
Нашлине очень хорошее, неоптимизированное решение, опубликовало его в ответе, но все еще ищет правильное решение.

1 Ответ

1 голос
/ 01 ноября 2011

Отвечаю сам, но все еще ищу правильное решение.Я написал этот код, чтобы продолжать использовать функцию showCalendar() после перехода с jscalendar на jsCal2 -

var instance = null; //tracker of calendar instances

function showCalendar(id, format, showsTime, showsOtherMonths) 
{
    //some code here


    //create a dummy holder so as to place the calendar inside, so that I can use the "cont" attribute. (Have to use either cont or trigger. )
    if(instance!=null)
    {
        instance.hide();
        instance = null;
        $("table.DynarchCalendar-topCont").remove(); //I am having to kill the earlier calendar instance on every calendar display call, because otherwise multiple instances were getting created in DOM, causing confusion. 

        //get date in input field - since earlier instance is killed

    }


if($("div#container").length == 0)
    {
        $('body').append('<div id="container" style="position: absolute;">&nbsp;</div>');
    }


        cal = new Calendar({
                cont: "container",
                inputField: id,
                dateFormat: format,
                bottomBar: false,
                min: minDateLimit,
                showTime: showsTime,
                weekNumbers: true,
                selection : intDate,
                onSelect: function() {

                    //set selected value into attached input field
                    var selectedDate = this.selection.get();
                    date = Calendar.intToDate(selectedDate);
                    date = Calendar.printDate(date, format);
                    $('#'+id).val(date);

                    this.hide();
                },
                onBlur: function() { //clicking outside hide calendar
                    this.hide();
            }
        });

    cal.moveTo(intDate); //since new instance of calendar is being created everytime, need to move to the date 
    cal.popup(id,"Br");
    instance = cal;

    return false;
}

Я много пытался найти какой-то правильный способ запуска всплывающего календаря из встроенной функции onclick (showcalendar () здесь функция).Но в документации нового календаря jscal2 инициация календаря поддерживает только обязательный метод, и нет способа сделать то же самое изнутри функции, которая вызывается из встроенного onclick.Вот документация - http://www.dynarch.com/projects/calendar/doc/ (проверьте параметры trigger и cont, один из которых является обязательным).Я применил некоторые грязные исправления, чтобы сделать то же самое, и в результате пришлось написать код, чтобы сделать некоторые вещи, которые в противном случае автоматически выполняются плагином (например, отображение выбранной даты = даты в поле ввода, при отображении календаря).

...