Skip to content

Commit 29a1e01

Browse files
committed
refactor: Code cleanup
1 parent 4d4f7f5 commit 29a1e01

File tree

8 files changed

+74
-64
lines changed

8 files changed

+74
-64
lines changed

src/VueDatePicker/components/ActionRow.vue

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
import { convertType, unrefElement } from '@/utils/util';
7777
import { useArrowNavigation, useDefaults, useValidation } from '@/composables';
7878
import { PickerBaseProps } from '@/props';
79-
import { formatDate, getDate, isDateAfter, isDateBefore, isDateEqual, resetDate } from '@/utils/date-utils';
79+
import { formatDate } from '@/utils/date-utils';
8080
8181
import type { PropType } from 'vue';
8282
@@ -101,10 +101,9 @@
101101
defaultedTextInput,
102102
defaultedInline,
103103
defaultedRange,
104-
propDates,
105104
getDefaultPattern,
106105
} = useDefaults(props);
107-
const { isValidTime } = useValidation(props);
106+
const { isTimeValid, isMonthValid } = useValidation(props);
108107
const { buildMatrix } = useArrowNavigation();
109108
110109
const cancelButtonRef = ref(null);
@@ -142,23 +141,12 @@
142141
: true;
143142
});
144143
145-
const disabled = computed(() => !isTimeValid.value || !isMonthValid.value || !validDateRange.value);
146-
147-
// todo - move into validation
148-
const isTimeValid = computed((): boolean => {
149-
if (!props.enableTimePicker || props.ignoreTimeValidation) return true;
150-
return isValidTime(props.internalModelValue);
151-
});
152-
153-
// todo - move into validation
154-
const isMonthValid = computed((): boolean => {
155-
if (!props.monthPicker) return true;
156-
if (defaultedRange.value.enabled && Array.isArray(props.internalModelValue)) {
157-
const invalid = props.internalModelValue.filter((value) => !isMonthWithinRange(value));
158-
return !invalid.length;
159-
}
160-
return isMonthWithinRange(props.internalModelValue as Date);
161-
});
144+
const disabled = computed(
145+
() =>
146+
!isTimeValid.value(props.internalModelValue) ||
147+
!isMonthValid.value(props.internalModelValue) ||
148+
!validDateRange.value,
149+
);
162150
163151
const handleCustomPreviewFormat = () => {
164152
const formatFn = defaultedPreviewFormat.value as (val: Date | Date[]) => string | string[];
@@ -215,35 +203,12 @@
215203
!Array.isArray(previewValue.value) ? previewValue.value : previewValue.value.join(dateSeparator()),
216204
);
217205
218-
// Todo - move into validation
219-
const isMonthWithinRange = (date: Date | string): boolean => {
220-
if (!props.monthPicker) return true;
221-
let valid = true;
222-
const dateToCompare = getDate(resetDate(date));
223-
if (propDates.value.minDate && propDates.value.maxDate) {
224-
const minDate = getDate(resetDate(propDates.value.minDate));
225-
const maxDate = getDate(resetDate(propDates.value.maxDate));
226-
return (
227-
(isDateAfter(dateToCompare, minDate) && isDateBefore(dateToCompare, maxDate)) ||
228-
isDateEqual(dateToCompare, minDate) ||
229-
isDateEqual(dateToCompare, maxDate)
230-
);
231-
}
232-
if (propDates.value.minDate) {
233-
const minDate = getDate(resetDate(propDates.value.minDate));
234-
235-
valid = isDateAfter(dateToCompare, minDate) || isDateEqual(dateToCompare, minDate);
236-
}
237-
if (propDates.value.maxDate) {
238-
const maxDate = getDate(resetDate(propDates.value.maxDate));
239-
valid = isDateBefore(dateToCompare, maxDate) || isDateEqual(dateToCompare, maxDate);
240-
}
241-
242-
return valid;
243-
};
244-
245206
const selectDate = (): void => {
246-
if (isTimeValid.value && isMonthValid.value && validDateRange.value) {
207+
if (
208+
isTimeValid.value(props.internalModelValue) &&
209+
isMonthValid.value(props.internalModelValue) &&
210+
validDateRange.value
211+
) {
247212
emit('select-date');
248213
} else {
249214
emit('invalid-select');

src/VueDatePicker/components/DatePicker/date-picker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ export const useDatePicker = (
582582
value,
583583
modelValue,
584584
range: defaultedRange.value.enabled,
585-
timezone: noTz ? undefined : defaultedTz.value!.timezone,
585+
timezone: noTz ? undefined : defaultedTz.value.timezone,
586586
});
587587

588588
selectOnAutoApply();

src/VueDatePicker/components/MonthPicker/month-picker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ export const useMonthPicker = (props: PickerBasePropsType, emit: VueEmit) => {
193193
value,
194194
modelValue,
195195
range: defaultedRange.value.enabled,
196-
timezone: noTz ? undefined : defaultedTz.value!.timezone,
196+
timezone: noTz ? undefined : defaultedTz.value.timezone,
197197
});
198198
emit('auto-apply');
199199
};

src/VueDatePicker/composables/calendar-class.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const useCalendarClass = (modelValue: WritableComputedRef<InternalModuleV
1616
// Track hovered date
1717
const hoveredDate = ref<Date | null>(null);
1818
// Today date
19-
const today = ref<Date>(localToTz(new Date(), defaultedTz.value!.timezone));
19+
const today = ref<Date>(localToTz(new Date(), defaultedTz.value.timezone));
2020

2121
/**
2222
* When using range picker keep track of hovered value in the calendar

src/VueDatePicker/composables/model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { localToTz } from '@/utils/timezone';
1111
export const useModel = (props: PickerBasePropsType, emit: VueEmit) => {
1212
const { defaultedRange, defaultedTz } = useDefaults(props);
1313

14-
const today = getDate(localToTz(getDate(), defaultedTz.value!.timezone));
14+
const today = getDate(localToTz(getDate(), defaultedTz.value.timezone));
1515
const calendars = ref<ICalendarData[]>([{ month: getMonth(today), year: getYear(today) }]);
1616

1717
// Time values

src/VueDatePicker/composables/validation.ts

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import {
88
isDateAfter,
99
isDateBefore,
1010
isDateEqual,
11+
resetDate,
1112
setTimeValue,
1213
} from '@/utils/date-utils';
1314
import { useDefaults } from '@/composables/defaults';
1415
import { convertType, getMapDate } from '@/utils/util';
1516

1617
import type { InternalModuleValue, DisabledTimesFn, DisabledTime, TimeModel, MaybeDate } from '@/interfaces';
1718
import type { PickerBasePropsType, AllPropsType } from '@/props';
19+
import { computed } from 'vue';
1820

1921
export const useValidation = (props: PickerBasePropsType | AllPropsType) => {
2022
const { defaultedFilters, defaultedRange, propDates } = useDefaults(props);
@@ -125,14 +127,16 @@ export const useValidation = (props: PickerBasePropsType | AllPropsType) => {
125127
return true;
126128
};
127129

128-
// If min or max range is set, validate given range
129-
const checkMinMaxRange = (secondDate: Date, modelValue: InternalModuleValue, index = 0): boolean => {
130-
if (
131-
Array.isArray(modelValue) &&
130+
const shouldCheckMinMaxRange = (modelValue: InternalModuleValue, index: number): modelValue is Array<Date> => {
131+
return (Array.isArray(modelValue) &&
132132
modelValue[index] &&
133133
(defaultedRange.value.maxRange || defaultedRange.value.minRange) &&
134-
isValidYear(modelValue[index])
135-
) {
134+
isValidYear(modelValue[index])) as boolean;
135+
};
136+
137+
// If min or max range is set, validate given range
138+
const checkMinMaxRange = (secondDate: Date, modelValue: InternalModuleValue, index = 0): boolean => {
139+
if (shouldCheckMinMaxRange(modelValue, index)) {
136140
const absoluteDiff = differenceInCalendarDays(secondDate, modelValue[index]);
137141
const daysInBetween = getDaysInBetween(modelValue[index], secondDate);
138142
const disabledDates =
@@ -241,12 +245,54 @@ export const useValidation = (props: PickerBasePropsType | AllPropsType) => {
241245
return checkDisabledTimes(date, isValid);
242246
};
243247

248+
const isMonthWithinRange = (date: Date | string): boolean => {
249+
if (!props.monthPicker) return true;
250+
let valid = true;
251+
const dateToCompare = getDate(resetDate(date));
252+
if (propDates.value.minDate && propDates.value.maxDate) {
253+
const minDate = getDate(resetDate(propDates.value.minDate));
254+
const maxDate = getDate(resetDate(propDates.value.maxDate));
255+
return (
256+
(isDateAfter(dateToCompare, minDate) && isDateBefore(dateToCompare, maxDate)) ||
257+
isDateEqual(dateToCompare, minDate) ||
258+
isDateEqual(dateToCompare, maxDate)
259+
);
260+
}
261+
if (propDates.value.minDate) {
262+
const minDate = getDate(resetDate(propDates.value.minDate));
263+
264+
valid = isDateAfter(dateToCompare, minDate) || isDateEqual(dateToCompare, minDate);
265+
}
266+
if (propDates.value.maxDate) {
267+
const maxDate = getDate(resetDate(propDates.value.maxDate));
268+
valid = isDateBefore(dateToCompare, maxDate) || isDateEqual(dateToCompare, maxDate);
269+
}
270+
271+
return valid;
272+
};
273+
274+
const isTimeValid = computed(() => (internalModelValue: InternalModuleValue): boolean => {
275+
if (!props.enableTimePicker || props.ignoreTimeValidation) return true;
276+
return isValidTime(internalModelValue);
277+
});
278+
279+
const isMonthValid = computed(() => (internalModelValue: InternalModuleValue): boolean => {
280+
if (!props.monthPicker) return true;
281+
if (defaultedRange.value.enabled && Array.isArray(internalModelValue)) {
282+
const invalid = internalModelValue.filter((value) => !isMonthWithinRange(value));
283+
return !invalid.length;
284+
}
285+
return isMonthWithinRange(internalModelValue as Date);
286+
});
287+
244288
return {
245289
isDisabled,
246290
validateDate,
247291
validateMonthYearInRange,
248292
isDateRangeAllowed,
249293
checkMinMaxRange,
250294
isValidTime,
295+
isTimeValid,
296+
isMonthValid,
251297
};
252298
};

src/VueDatePicker/utils/date-utils.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
getSeconds,
1616
getYear,
1717
getMonth,
18-
parseISO,
1918
eachDayOfInterval,
2019
addMonths,
2120
startOfWeek,

src/VueDatePicker/utils/timezone.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ export const dateToTimezoneSafe = (date: Date | string | number, tz?: TimeZoneCo
1515
return d;
1616
};
1717

18+
const getDateInTz = (date: Date | number | string, tz: TimeZoneConfig) => {
19+
return tz.dateInTz ? localToTz(new Date(date), tz.dateInTz) : getDate(date);
20+
};
21+
1822
// Converts specific date to a Date object based on a provided timezone
1923
export const sanitizeDateToLocal = (date: MaybeDate, tz?: TimeZoneConfig) => {
2024
if (!date) return null;
2125
if (!tz) return getDate(date);
2226
const local = getDate(date);
23-
return tz.exactMatch
24-
? tz.dateInTz
25-
? localToTz(new Date(date), tz.dateInTz)
26-
: getDate(date)
27-
: localToTz(local, tz.timezone);
27+
return tz.exactMatch ? getDateInTz(date, tz) : localToTz(local, tz.timezone);
2828
};

0 commit comments

Comments
 (0)