Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как в flatpickr выделить определённые дни и диапазон дат? (https://javascript.ru/forum/misc/66358-kak-v-flatpickr-vydelit-opredeljonnye-dni-i-diapazon-dat.html)

drkrol 11.12.2016 00:57

Как в flatpickr выделить определённые дни и диапазон дат?
 
Здравствуйте. Есть такой календарь flatpickr https://chmln.github.io/flatpickr/ , и у него есть функция onDayCreate() https://chmln.github.io/flatpickr/#event-onDayCreate , которая позволяет добавить к датам свой span. Но у меня так и не получилось указать определённые даты и диапазон дат, к которым должны создаться span'ы. Подскажите, как это сделать?

рони 11.12.2016 02:54

drkrol,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .flatpickr-day.busy {
    background-color:  #FF0000 ;
  }

  </style>

</head>

<body>
<div id="slider"></div>
<link rel="stylesheet" href="https://unpkg.com/flatpickr/dist/flatpickr.min.css">
<script src="https://unpkg.com/flatpickr"></script>
<input class="flatpickr" type="text" placeholder="Select Date..">
<script>
var data = [(new Date(2016,11,17,0,0,0,0)).getTime(),(new Date(2016,11,21,0,0,0,0)).getTime() ];
flatpickr(".flatpickr", {
    onDayCreate: function(dObj, dStr, fp, dayElem){
       if(data.indexOf(dayElem.dateObj.getTime()) > -1  )
           // dayElem.innerHTML += "<span class='event busy'>test</span>";
              dayElem.classList.add("busy")
    }
});

</script>

</body>
</html>

drkrol 11.12.2016 15:24

рони,
а диапазон дат возможно как-нибудь? Чтобы не указывать все даты, а указать только начало и конец.

рони 11.12.2016 16:10

drkrol,
строка 25 для диапазона ...
var a = data[0], b = data[1];
 if (dayElem.dateObj.getTime() >= a && dayElem.dateObj.getTime() <= b)

drkrol 11.12.2016 17:39

спасибо
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .flatpickr-day.busy {
    background-color:  #FF0000 ;
  }

  </style>

</head>

<body>
<div id="slider"></div>
<link rel="stylesheet" href="https://unpkg.com/flatpickr/dist/flatpickr.min.css">
<script src="https://unpkg.com/flatpickr"></script>
<input class="flatpickr" type="text" placeholder="Select Date..">
<script>
var data = [(new Date(2016,11,17,0,0,0,0)).getTime(),(new Date(2016,11,21,0,0,0,0)).getTime() ];
flatpickr(".flatpickr", {
    onDayCreate: function(dObj, dStr, fp, dayElem){
var a = data[0], b = data[1];
 if (dayElem.dateObj.getTime() >= a && dayElem.dateObj.getTime() <= b)

           // dayElem.innerHTML += "<span class='event busy'>test</span>";
              dayElem.classList.add("busy")
    }
});

</script>

</body>
</html>


но на локальной машине всё работает)

рони 11.12.2016 18:11

drkrol, добавьте run, для запуска примера
[HTML run][/HTML]

drkrol 12.12.2016 03:17

рони,
Подскажи, а как обработать даты такого вида:
["2016-12-12", "2106-12-16"]
?

рони 12.12.2016 10:07

Цитата:

Сообщение от drkrol
Подскажи,

читайте документацию, там много интересного ...

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .flatpickr-day.busy {
    background-color:  #FF0000 ;
  }
  </style>

</head>

<body>
<div id="slider"></div>
<link rel="stylesheet" href="https://unpkg.com/flatpickr/dist/flatpickr.min.css">
<script src="https://unpkg.com/flatpickr"></script>
<input class="flatpickr" type="text" placeholder="Select Date..">
<script>
var data = ["2016-12-12", "2016-12-16"];
flatpickr(".flatpickr", {
    onDayCreate: function(dObj, dStr, fp, dayElem){
    var a = fp.parseDate(data[0]), b = fp.parseDate(data[1]);
    if (dayElem.dateObj.getTime() >= a && dayElem.dateObj.getTime() <= b)
              dayElem.classList.add("busy")
    }
});
</script>

</body>
</html>

drkrol 13.12.2016 02:26

рони,
то, что можете сделать вы, в документации нет...
Последняя просьба с flatpickr. Как в таком формате (["2016-12-12", "2016-12-16"];) вывести отдельно стоящие даты ( не диапазон). То есть первый код, но с датами в привычном виде. Я этот dateParce и туда, и сюда, но ничего не вышло

рони 13.12.2016 08:49

flatpickr выделение дат,данные строка или массив диапазона(начало/конец)
 
drkrol,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .flatpickr-day.busy {
    background-color:  #FF0000 ;
  }
  </style>

</head>

<body>
<div id="slider"></div>
<link rel="stylesheet" href="https://unpkg.com/flatpickr/dist/flatpickr.min.css">
<script src="https://unpkg.com/flatpickr"></script>
<input class="flatpickr" type="text" placeholder="Select Date..">
<script>
var data = ["2016-12-12", "2016-12-16", ["2016-12-28", "2016-12-30"]];//
flatpickr(".flatpickr", {
    onDayCreate: function(dObj, dStr, fp, dayElem) {
        var a = dayElem.dateObj.getTime();
        a = data.some(function(b) {
            return typeof b == "string" ? a == fp.parseDate(b).getTime() :
            a >= fp.parseDate(b[0]).getTime() && a <= fp.parseDate(b[1]).getTime()
        });
        if (a) dayElem.classList.add("busy")
    }
});
</script>

</body>
</html>

aleksmag 02.10.2018 15:21

необходимо в flatpickr сделать активными только пятницы и субботы
 
использую версию flatpicr.js 4.5.2 в стороннем компоненте

необобходимо сделать активными только пятницы и субботы

на сайте
https://flatpickr.js.org/examples/

в примерах есть такой код
но не понятно, куда его прописать, или где вызвать?

Disabling dates by a function:#
The function takes in a Date object, and should return a boolean value.
If the function returns true, the date will be disabled.

This flexibility allows us to use any arbitrary logic to disable dates.
The example below disables Saturdays and Sundays.


{
    "disable": [
        function(date) {
            // return true to disable
            return (date.getDay() === 5 || date.getDay() === 6);

        }
    ],
    "locale": {
        "firstDayOfWeek": 1 // start week on Monday
    }
}

рони 02.10.2018 17:12

flatpickr активные дни
 
aleksmag,
<!DOCTYPE html>

<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
    </style>

</head>

<body>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.js"></script>
<input class="flatpickr" type="text" placeholder="Select Date..">
<script>
flatpickr(".flatpickr",{
    "disable": [
        function(date) {
            // return true to disable
            return (date.getDay() != 5 && date.getDay() != 6);

        }
    ],
    "locale": {
        "firstDayOfWeek": 1 // start week on Monday
    }
});
</script>

</body>
</html>

aleksmag 03.10.2018 09:34

попробовал перенести данный код в секцию <head>
не заработало

обязательно ли этот код подлючать после input который вызывает этот календарь?

j0hnik 03.10.2018 10:00

aleksmag,
document.addEventListener("DOMContentLoaded", function(){
		flatpickr(".flatpickr",{
			"disable": [
			function(date) {
            // return true to disable
           return (date.getDay() != 5 && date.getDay() != 6);
         }
        ],
         "locale": {
       "firstDayOfWeek": 1 // start week on Monday
     }
   });
});


вот так попробуйте

Dilettante_Pro 03.10.2018 10:39

Цитата:

обязательно ли этот код подлючать после input который вызывает этот календарь?
Типовая компоновка страницы
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">       
    </style>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.js"></script>
    <script>
        window.onload = function () {
            flatpickr(".flatpickr", {
                "disable": [
        function (date) {
            // return true to disable
            return (date.getDay() != 5 && date.getDay() != 6);

        }
    ],
                "locale": {
                    "firstDayOfWeek": 1 // start week on Monday
                }
            });
        };
    </script>
</head>
<body>
    <input class="flatpickr" type="text" placeholder="Select Date..">
</body>
</html>

window.onload = function () { или вариант j0hnik

aleksmag 03.10.2018 11:55

странно
когда я просматривают код на сайте я вижу выше код примерно такой
который добавляет сам компонент использующий flatpickr

<script type="text/javascript">
var qlSiteOffset=0;

                var ConvertFormsConfig = {
                    "baseurl" : "https://mmk-tour.ru/",
                    "debug"   : false
                };
            
flatpickr.localize(flatpickr.l10ns.ru);

	document.addEventListener("DOMContentLoaded", function(event) { 
		flatpickr.l10ns.default.firstDayOfWeek = 1;
		flatpickr("#form1_datetime_274006968", {"mode":"single","dateFormat":"d.m.Y","defaultDate":"","minDate":"","maxDate":"","enableTime":false,"time_24hr":false,"minuteIncrement":5,"inline":false,"disableMobile":false,"locale":"ru"});
	});

flatpickr.localize(flatpickr.l10ns.ru);

	document.addEventListener("DOMContentLoaded", function(event) { 
		flatpickr.l10ns.default.firstDayOfWeek = 1;
		flatpickr("#form4_datetime_218294727", {"mode":"single","dateFormat":"d.m.Y","defaultDate":"","minDate":"","maxDate":"","enableTime":false,"time_24hr":false,"minuteIncrement":5,"inline":false,"disableMobile":false,"locale":"ru"});
	});

flatpickr.localize(flatpickr.l10ns.ru);

	document.addEventListener("DOMContentLoaded", function(event) { 
		flatpickr.l10ns.default.firstDayOfWeek = 1;
		flatpickr("#form1_datetime_1571408684", {"mode":"single","dateFormat":"d.m.Y","defaultDate":"","minDate":"","maxDate":"","enableTime":false,"time_24hr":false,"minuteIncrement":5,"inline":false,"disableMobile":false,"locale":"ru"});
	});

flatpickr.localize(flatpickr.l10ns.ru);

	document.addEventListener("DOMContentLoaded", function(event) { 
		flatpickr.l10ns.default.firstDayOfWeek = 1;
		flatpickr("#form4_datetime_877139813", {"mode":"single","dateFormat":"d.m.Y","defaultDate":"","minDate":"","maxDate":"","enableTime":false,"time_24hr":false,"minuteIncrement":5,"inline":false,"disableMobile":false,"locale":"ru"});
	});

	</script>


фактически есть 4 формы
flatpickr("#form4_datetime_1652290975",
но цифровое значения в этом параметре меняется каждый раз при обновлении страницы
т.е. я не могу переопределить код в скрипте ниже

начальные значения для этих форм начинаются как
#form1_datetime_
#form2_datetime_
#form3_datetime_
#form4_datetime_

как правильно мне поймать этот элемент чтобы прописать код типа?
flatpickr("#form4_datetime_1652290975",

aleksmag 04.10.2018 08:11

в общем до скрипта я докопался
как понял не работало потому что формат русской локали не соответствовал возращаемому значению функции

код для отключения дня недели выглядит так

flatpickr("#id_формы", {
            dateFormat: "Y-m-d",
            disable: [
			function(date) {
            // return true to disable
           return (date.getDay() != 5 && date.getDay() != 6);
         }
        ]
        });


код для отключения по диапозано дат выглядит так

flatpickr("#id_формы", {
            dateFormat: "Y-m-d",
            disable: [
        {
            from: "2018-10-08",
            to: "2018-10-14"
        },
        {
            from: "2018-10-22",
            to: "2018-10-29"
        }]
        });

Dilettante_Pro 04.10.2018 11:05

Если им сделать одинаковый класс, то достаточно одного обработчика
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">       
    </style>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.js"></script>
    <script>
document.addEventListener("DOMContentLoaded", function(event) {
            flatpickr(".flatpickr", {
                "disable": [
        function (date) {
            // return true to disable
            return (date.getDay() != 5 && date.getDay() != 6);

        }
    ],
                "locale": {
                    "firstDayOfWeek": 1 // start week on Monday
                }
            });
  });
    </script>
</head>
<body>
    <input class="flatpickr" type="text" placeholder="Select Date..">
    <input class="flatpickr" type="text" placeholder="Select Date..">
</body>
</html>

Dilettante_Pro 04.10.2018 11:15

Или по какой-то общей части id
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">       
    </style>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/flatpickr/4.5.1/flatpickr.min.js"></script>
    <script>
document.addEventListener("DOMContentLoaded", function(event) {
            flatpickr('[id*="_datetime_"]', {
                "disable": [
        function (date) {
            // return true to disable
            return (date.getDay() != 5 && date.getDay() != 6);

        }
    ],
                "locale": {
                    "firstDayOfWeek": 1 // start week on Monday
                }
            });
  });
    </script>
</head>
<body>
    <input id="form1_datetime_218294727" type="text" placeholder="Select Date..">
    <input id="form4_datetime_212222222" type="text" placeholder="Select Date..">
</body>
</html>


Часовой пояс GMT +3, время: 14:42.