jQuery Datepicker setDate - найти следующий рабочий день в Datepicker 2 - PullRequest
0 голосов
/ 09 февраля 2020

В гравитационной форме я смог отключить выходные и паблики c праздники из DatePicker 1 (от даты) и Datepicker 2 (до даты).

В Datepicker 2 мы хотим выбрать первый рабочий день через три дня после даты, выбранной в DatePicker 1.

См .: http://returatrv.staging.wpengine.com/bestilling-container-borettslag/

Если вы выберете feb 17 в cal1, feb 20 будет выбран в DP2, что верно. SetDate - это getDate +3 дня.

Когда setDate заканчивается в выходные или в нерабочее время, он должен перейти к следующему рабочему дню. Если в DP1 выбрано 19 февраля, 24 должно быть выбрано в DP2 (первый рабочий день). Как я могу использовать уже существующий код (строка 9-15) для установки setDate на первый день без блокировки в массиве?

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

 optionsObj.beforeShowDay = function(date) { ...

для изменения setDate для DP2.

 set_date.setDate(set_date.getDate() + 3); //check if the result is in disabled days / weekends

Я был бы очень признателен за помощь по этому вопросу;) Хотя многие другие вопросы похожи (например, Добавление дней после даты выбрано, исключая выходные и праздники ), я не смог решить эту проблему.

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

    if (formId == <?php echo $skjemaID; ?> && fieldId == 7) {

     // Disable holidays and weekends from datapickers
     // Could I use this to find first work-day?
     optionsObj.beforeShowDay = function(date) {

     // array of holidays from external json-source
     currentDate = jQuery.datepicker.formatDate('yy-mm-dd', date),
     day = date.getDay();

      return [!(disabledDays.indexOf(currentDate) != -1 || day == 0 ||
        day == 6)];
    };


      optionsObj.minDate = 1;
      optionsObj.onClose = function(dateText, inst) {
        var min_date = $.datepicker.parseDate('dd/mm/yy', dateText),
            set_date = $.datepicker.parseDate('dd/mm/yy', dateText),
            end_date = $.datepicker.parseDate('dd/mm/yy', dateText);

            // set minDate in datepicker 1 to nest day
            min_date.setDate(min_date.getDate() + 1);

            // Find first workday after 3 days
            // Samples of expected behaviour:
            // Select feb 10 in dp1 - show feb 13 in dp2
            // Select feb 12 in dp1 - show feb 17 in dp2
            // Select feb 27 in dp1 - show mar in dp2

            set_date.setDate(set_date.getDate() +3);

            // Check if set_date is in disabledDays or weekend
            // if yes, add a day, check again
            // if not, select set_day in datepicker 2 

        $('#input_<?php echo $skjemaID; ?>_8').datepicker('option',
          'minDate', min_date).datepicker('setDate', set_date);
      };
    }
    return optionsObj;
  });

Пожалуйста, помогите мне в правильном направлении; Я довольно долго боролся с этим.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

После долгих испытаний я смог найти проблему и решить ее. Окончательный код (заменяющий optionsObj.onClose = function (dateText, inst))

optionsObj.onClose = function(dateText, inst) {

    var min_date = $.datepicker.parseDate('dd-mm-yy', dateText),
        set_date = $.datepicker.parseDate('dd-mm-yy', dateText);

  function isInArray(disabledDates, dateToCheck) {
   const day = dateToCheck.getDay();
    return !(disabledDates.indexOf(dateToCheck) != -1 || day === 0 || day == 6);
    } 

    min_date.setDate(min_date.getDate() + 1);
    set_date.setDate(set_date.getDate() + 2);

    do {
      set_date.setDate(set_date.getDate() + 1);
    }
    while (!isInArray(disabledDates, set_date));

    $('#input_<?php echo $skjemaID; ?>_8').datepicker('option',
      'minDate', min_date).datepicker('setDate', set_date);
  };

Спасибо за помощь, JSbin из Mo sh Feu заставил меня понять, что было не так.

0 голосов
/ 14 февраля 2020

Да, используйте функцию AddBusinessDays из связанного «аналогичного вопроса» и замените вызов на noWeekendsOrHolidays вашей функцией beforeShowDay. Вам также нужно будет указать дату начала вместо использования сегодня.

...