115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import type { RangeValue, PickerMode, Locale } from '../interface';
 | |
| import { getValue } from '../utils/miscUtil';
 | |
| import type { GenerateConfig } from '../generate';
 | |
| import { isSameDate, getQuarter } from '../utils/dateUtil';
 | |
| import type { ComputedRef, Ref } from 'vue';
 | |
| import { computed } from 'vue';
 | |
| 
 | |
| export default function useRangeDisabled<DateType>(
 | |
|   {
 | |
|     picker,
 | |
|     locale,
 | |
|     selectedValue,
 | |
|     disabledDate,
 | |
|     disabled,
 | |
|     generateConfig,
 | |
|   }: {
 | |
|     picker: Ref<PickerMode>;
 | |
|     selectedValue: Ref<RangeValue<DateType>>;
 | |
|     disabledDate?: Ref<(date: DateType) => boolean>;
 | |
|     disabled: ComputedRef<[boolean, boolean]>;
 | |
|     locale: Ref<Locale>;
 | |
|     generateConfig: Ref<GenerateConfig<DateType>>;
 | |
|   },
 | |
|   openRecordsRef: Ref<{
 | |
|     [x: number]: boolean;
 | |
|   }>,
 | |
| ) {
 | |
|   const startDate = computed(() => getValue(selectedValue.value, 0));
 | |
|   const endDate = computed(() => getValue(selectedValue.value, 1));
 | |
| 
 | |
|   function weekFirstDate(date: DateType) {
 | |
|     return generateConfig.value.locale.getWeekFirstDate(locale.value.locale, date);
 | |
|   }
 | |
| 
 | |
|   function monthNumber(date: DateType) {
 | |
|     const year = generateConfig.value.getYear(date);
 | |
|     const month = generateConfig.value.getMonth(date);
 | |
|     return year * 100 + month;
 | |
|   }
 | |
| 
 | |
|   function quarterNumber(date: DateType) {
 | |
|     const year = generateConfig.value.getYear(date);
 | |
|     const quarter = getQuarter(generateConfig.value, date);
 | |
|     return year * 10 + quarter;
 | |
|   }
 | |
| 
 | |
|   const disabledStartDate = (date: DateType) => {
 | |
|     if (disabledDate && disabledDate?.value?.(date)) {
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     // Disabled range
 | |
|     if (disabled[1] && endDate) {
 | |
|       return (
 | |
|         !isSameDate(generateConfig.value, date, endDate.value) &&
 | |
|         generateConfig.value.isAfter(date, endDate.value)
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     // Disabled part
 | |
|     if (openRecordsRef.value[1] && endDate.value) {
 | |
|       switch (picker.value) {
 | |
|         case 'quarter':
 | |
|           return quarterNumber(date) > quarterNumber(endDate.value);
 | |
|         case 'month':
 | |
|           return monthNumber(date) > monthNumber(endDate.value);
 | |
|         case 'week':
 | |
|           return weekFirstDate(date) > weekFirstDate(endDate.value);
 | |
|         default:
 | |
|           return (
 | |
|             !isSameDate(generateConfig.value, date, endDate.value) &&
 | |
|             generateConfig.value.isAfter(date, endDate.value)
 | |
|           );
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return false;
 | |
|   };
 | |
| 
 | |
|   const disabledEndDate = (date: DateType) => {
 | |
|     if (disabledDate.value?.(date)) {
 | |
|       return true;
 | |
|     }
 | |
| 
 | |
|     // Disabled range
 | |
|     if (disabled[0] && startDate) {
 | |
|       return (
 | |
|         !isSameDate(generateConfig.value, date, endDate.value) &&
 | |
|         generateConfig.value.isAfter(startDate.value, date)
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     // Disabled part
 | |
|     if (openRecordsRef.value[0] && startDate.value) {
 | |
|       switch (picker.value) {
 | |
|         case 'quarter':
 | |
|           return quarterNumber(date) < quarterNumber(startDate.value);
 | |
|         case 'month':
 | |
|           return monthNumber(date) < monthNumber(startDate.value);
 | |
|         case 'week':
 | |
|           return weekFirstDate(date) < weekFirstDate(startDate.value);
 | |
|         default:
 | |
|           return (
 | |
|             !isSameDate(generateConfig.value, date, startDate.value) &&
 | |
|             generateConfig.value.isAfter(startDate.value, date)
 | |
|           );
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return false;
 | |
|   };
 | |
| 
 | |
|   return [disabledStartDate, disabledEndDate];
 | |
| }
 |