...

Выбор периода в рамках одного календаря. Библиотека flatpickr

Тема в разделе "Примеры решений и дополнительных модулей", создана пользователем ksannikov, 13 окт 2025 в 09:35.

  1. ksannikov

    ksannikov Участник

    upload_2025-10-13_9-35-28.png
    Привет, покажу пример, как реализовать выбор периода в рамках одного календаря, при помощи библиотеки flatpickr.

    Все подробности в видео, а ниже используемый код.


    Разметка из виджета код и подключение стилей библиотеки:

    HTML:
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
    
    <elma-form-row class="elma-form-row">
        <elma-form-control class="elma-form-control text-base" style="max-width: 200px;">
            <input id="myDatePicker" type="text" placeholder="Выберите дату">
        </elma-form-control>
    </elma-form-row>
    Функции из вкладки скрипты:

    Код:
    
    import flatpickr from 'flatpickr.js'
    import Russian from "ru.js"

    declare const console:anywindowanydocumentany
    /** функция окончания отрисовки */
    async function endInit(): Promise<void> {
        if (
    flatpickr) {
            
    flatpickr("#myDatePicker", {
                
    //формат даты
                
    dateFormat"d.m.Y",
                
    //без выбора времени
                
    enableTimefalse,
                
    //мод для периода
                
    mode"range",
                
    //локализация
                
    localeRussian,
                
    //ивент при изменении значения
                
    onChangeasync (datesDate[]) => {
                    
    Context.data.start_date = new TDate(dates[0].getFullYear(), dates[0].getMonth() + 1dates[0].getDate())
                    
    Context.data.end_date dates[1] ? new TDate(dates[1].getFullYear(), dates[1].getMonth() + 1dates[1].getDate()) : undefined
                    await calcAmountDays
    ()
                }
            });
        }
    }
    /** Функция уничтожения */
    async function destroy(): Promise<void> {
        
    //убираем из разметки страницы календарик, предотвращение конфликтов
        
    document.querySelector('.flatpickr-calendar')?.remove()
    }

    /** расчет кол-ва дней отпуска */
    async function calcAmountDays(): Promise<void> {
        if (
    Context.data.start_date && Context.data.end_date) {
            
    Context.data.amount_days = ((Context.data.end_date.asDatetime(new TTime(12000)).unix() - Context.data.start_date.asDatetime(new TTime(12000)).unix()) / 86400) + 1
        
    } else {
            
    Context.data.amount_days 0
        
    }
    }
    Еще больше полезной информации в ТГ канале WhatDaELMA365