Skip to content

Commit 1d53316

Browse files
committed
feat: Add option for multiple text-input parser patterns (resolves #106)
- fix: Changing value after submit, resets to previous value
1 parent 709cd79 commit 1d53316

File tree

4 files changed

+32
-3
lines changed

4 files changed

+32
-3
lines changed

index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ interface VueDatePicker {
138138
tabSubmit?: boolean;
139139
openMenu?: boolean;
140140
rangeSeparator?: string;
141-
format?: string;
141+
format?: string | string[] | ((value: string) => Date | null);
142142
};
143143
teleport?: string | HTMLElement;
144144
monthNameFormat?: 'long' | 'short';

src/VueDatePicker/components/DatepickerInput.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@
114114
const { value } = event.target as HTMLInputElement;
115115
const { format, rangeSeparator } = props.textInputOptions;
116116
if (value !== '') {
117+
if (props.textInputOptions?.openMenu && !props.isMenuOpen) {
118+
emit('open');
119+
}
117120
if (props.range) {
118121
const [dateOne, dateTwo] = value.split(`${rangeSeparator}`);
119122

src/VueDatePicker/interfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export interface ITextInputOptions {
4747
tabSubmit: boolean;
4848
openMenu: boolean;
4949
rangeSeparator: string;
50-
format?: null;
50+
format?: string | string[] | ((value: string) => Date | null);
5151
}
5252

5353
export interface IMonthValue {

src/VueDatePicker/utils/date-utils.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,40 @@ import type {
3737
IDateFilter,
3838
} from '@/interfaces';
3939

40-
export const parseFreeInput = (value: string, pattern: string): Date | null => {
40+
const parseTextToDate = (value: string, pattern: string): Date | null => {
4141
const parsedDate = parse(value, pattern.slice(0, value.length), new Date());
4242
if (isValid(parsedDate) && isDate(parsedDate)) {
4343
return parsedDate;
4444
}
4545
return null;
4646
};
4747

48+
export const parseFreeInput = (
49+
value: string,
50+
pattern: string | string[] | ((value: string) => Date | null),
51+
): Date | null => {
52+
if (typeof pattern === 'string') {
53+
return parseTextToDate(value, pattern);
54+
}
55+
56+
if (Array.isArray(pattern)) {
57+
let parsedDate = null;
58+
for (let i = 0; i < pattern.length; i++) {
59+
parsedDate = parseTextToDate(value, pattern[i]);
60+
if (parsedDate) {
61+
break;
62+
}
63+
}
64+
return parsedDate;
65+
}
66+
67+
if (typeof pattern === 'function') {
68+
return pattern(value);
69+
}
70+
71+
return null;
72+
};
73+
4874
export const resetDateTime = (value: Date | string): Date => {
4975
let dateParse = new Date(JSON.parse(JSON.stringify(value)));
5076
dateParse = setHours(dateParse, 0);

0 commit comments

Comments
 (0)