import { type Moment } from 'moment' import { defineComponent, type PropType, ref, type Ref, } from 'vue' import useClickOutside from '../../../../composables/use-click-outside' import MultipleCalendar from '../../calendars/multiple-calendar/multiple-calendar' import './multiple-calendar-input.scss' /** * Календарь с возможностью выбора нескольких дат. *

* Дизайн *

*/ export default defineComponent({ props: { /** * Определяет, активен ли компонент или отключен. */ isDisabled: { type: Boolean, default: false }, /** * Показать или скрыть лейбл-название над инпутом. */ isShowLabel: { type: Boolean, default: true }, /** * Текст лейбла (названия) над инпутом. */ label: { type: String, default: '' }, /** * Текст, который будет отображаться в случае отсутствия выбранных дат. */ placeholder: { type: String, default: '__.__.____' }, /** * Массив строк, представляющих ошибки, связанные с компонентом. */ errors: { type: Array as PropType, default: () => [] }, /** * Массив дат, представляющих выбранные дни. */ days: { type: Array as PropType, required: true }, /** * Функция, которая вызывается при изменении выбранных дней. */ onValueChange: { type: Function as PropType<(days: Moment[]) => void>, required: true }, /** * Максимальное количество отображаемых выбранных дат в заголовке компонента. */ maxChipsShow: { type: Number, default: 2 }, }, setup(props) { const isShowMultipleCalendar = ref(false) const calendar: Ref = ref(null) const isShowDropdown = ref(false) const onShowDropdown = () => { if (props.isDisabled || props.days.length < props.maxChipsShow || isShowMultipleCalendar.value) { return } isShowDropdown.value = !isShowDropdown.value } const onCloseDropdown = () => { if (isShowDropdown.value) isShowDropdown.value = false } const changeFlagShowMultipleCalendar = () => { if (props.isDisabled) return isShowMultipleCalendar.value = !isShowMultipleCalendar.value if (isShowMultipleCalendar.value) isShowDropdown.value = false } const clear = (e: MouseEvent) => { e.stopPropagation() if (props.onValueChange) props.onValueChange([]) } const clearOneDate = (clearDate: Moment) => { if (props.onValueChange) props.onValueChange(props.days.filter((el) => el !== clearDate)) } useClickOutside(calendar, () => { isShowMultipleCalendar.value = false }) const rednerChips = (d: Moment) => (
{d.format('DD.MM.YYYY')} {!props.isDisabled && (
{ e.stopPropagation() clearOneDate(d) }} class='ark-ui-multiple-calendar-input-head-chips-clear' /> )}
) return () => (
{props.label && props.isShowLabel &&
{props.label}
}
{props.days.length !== 0 ? props.days.slice(0, props.maxChipsShow).map(rednerChips) :
{props.placeholder}
} {props.days.length > props.maxChipsShow && (
+{props.days.length - props.maxChipsShow}
)}
{props.days.length > 0 && !props.isDisabled ? (
) :
}
{!props.isDisabled && props.errors.map((error) =>
{error}
)} {isShowMultipleCalendar.value && (
{ e.stopPropagation() }} > { if (props.onValueChange) props.onValueChange(v) }} disablePastDates={true} />
)} {isShowDropdown.value && (
{ props.days.slice(props.maxChipsShow, props.days.length).map(rednerChips) }
)}
) }, })