Skip to content

Commit ee173f4

Browse files
committed
fix: emit date change event to match React
1 parent dd6afc2 commit ee173f4

File tree

2 files changed

+102
-23
lines changed

2 files changed

+102
-23
lines changed

src/components/CvDatePicker/CvDatePicker.stories.js

Lines changed: 99 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export default {
4444

4545
const template = `
4646
<div>
47-
<cv-date-picker v-bind="args" @change="onChange" :value="now">
47+
<cv-date-picker v-bind="args" :value="now" @change="onChange">
4848
</cv-date-picker>
4949
</div>
5050
`;
@@ -64,7 +64,12 @@ export const Default = Template.bind({});
6464
Default.args = initArgs;
6565
Default.parameters = {
6666
controls: {
67-
exclude: ['update:modelValue', 'invalid-message', 'modelValue'],
67+
exclude: [
68+
'update:modelValue',
69+
'invalid-message',
70+
'modelValue',
71+
'dateChange',
72+
],
6873
},
6974
};
7075
Default.parameters = storyParametersObject(
@@ -78,14 +83,13 @@ Default.parameters = storyParametersObject(
7883
const modelValue = ref(now);
7984
const templateVModel = `
8085
<div>
81-
<cv-date-picker v-bind="args" @change="onChange" v-model="modelValue">
86+
<cv-date-picker v-bind="args" v-model="modelValue">
8287
</cv-date-picker>
8388
</div>
8489
<div style="margin-top:2rem; background-color: #888888; padding:1rem">
8590
<div style="font-size: 150%;">Sample interaction</div>
8691
<label for="date-model" style='margin-right: 0.5rem'>V-model:</label>
87-
<input id="date-model" type="text" :value="modelValue.startDate || modelValue" @change="ev => { if (args.kind === 'range') { modelValue.startDate = ev.currentTarget.value } else { modelValue = ev.currentTarget.value } }"/>
88-
<input v-if="args.kind === 'range'" id="date-model" type="text" :value="modelValue.endDate" @change="ev => modelValue.endDate = ev.currentTarget.value"/>
92+
<input id="date-model" type="text" :value="modelValue" @change="ev => { modelValue = ev.currentTarget.value }"/>
8993
</div>
9094
`;
9195

@@ -96,7 +100,6 @@ const TemplateVModel = args => {
96100
args,
97101
modelValue,
98102
now,
99-
onChange: action('change'),
100103
}),
101104
template: templateVModel,
102105
};
@@ -106,7 +109,14 @@ export const vModel = TemplateVModel.bind({});
106109
vModel.args = initArgs;
107110
vModel.parameters = {
108111
controls: {
109-
exclude: ['update:modelValue', 'invalid-message', 'modelValue'],
112+
exclude: [
113+
'update:modelValue',
114+
'invalid-message',
115+
'modelValue',
116+
'kind',
117+
'value',
118+
'dateChange',
119+
],
110120
},
111121
};
112122
vModel.parameters = storyParametersObject(
@@ -115,11 +125,58 @@ vModel.parameters = storyParametersObject(
115125
vModel.args
116126
);
117127

128+
/* range v-model */
129+
const rangeValue = ref({ startDate: now, endDate: now });
130+
const templateRangeVModel = `
131+
<div>
132+
<cv-date-picker v-bind="args" kind="range" v-model="rangeValue">
133+
</cv-date-picker>
134+
</div>
135+
<div style="margin-top:2rem; background-color: #888888; padding:1rem">
136+
<div style="font-size: 150%;">Sample range interaction</div>
137+
<label for="date-model-1" style='margin-right: 0.5rem'>V-model:</label>
138+
<input id="date-model-1" type="text" :value="rangeValue.startDate" @change="ev => { rangeValue.startDate = ev.currentTarget.value }"/>
139+
<input id="date-model-2" type="text" :value="rangeValue.endDate" @change="ev => rangeValue.endDate = ev.currentTarget.value"/>
140+
</div>
141+
`;
142+
143+
const TemplateRangeVModel = args => {
144+
return {
145+
components: { CvDatePicker },
146+
setup: () => ({
147+
args,
148+
rangeValue,
149+
now,
150+
}),
151+
template: templateRangeVModel,
152+
};
153+
};
154+
155+
export const rangeVmodel = TemplateRangeVModel.bind({});
156+
rangeVmodel.args = initArgs;
157+
rangeVmodel.parameters = {
158+
controls: {
159+
exclude: [
160+
'update:modelValue',
161+
'invalid-message',
162+
'modelValue',
163+
'kind',
164+
'value',
165+
'dateChange',
166+
],
167+
},
168+
};
169+
rangeVmodel.parameters = storyParametersObject(
170+
rangeVmodel.parameters,
171+
templateRangeVModel,
172+
rangeVmodel.args
173+
);
174+
118175
/* INVALID MESSAGE STORY */
119176

120177
const templateInvalidMessage = `
121178
<div>
122-
<cv-date-picker v-bind="args" @change="onChange" :value="now">
179+
<cv-date-picker v-bind="args" :value="now" @change="onChange">
123180
</cv-date-picker>
124181
</div>
125182
`;
@@ -153,7 +210,7 @@ InvalidMessage.parameters = storyParametersObject(
153210

154211
const templateInvalidMessageSlot = `
155212
<div>
156-
<cv-date-picker v-bind="args" @change="onChange" :value="now">
213+
<cv-date-picker v-bind="args" :value="now" @change="onChange">
157214
<template #invalid-message>Invalid date slot</template>
158215
</cv-date-picker>
159216
</div>
@@ -194,7 +251,7 @@ InvalidMessageSlot.parameters = storyParametersObject(
194251
const singleValue = ref(now);
195252
const templateSingleUsingDate = `
196253
<div>
197-
<cv-date-picker v-bind="args" @change="onChange" kind="single" v-model="singleValue">
254+
<cv-date-picker v-bind="args" kind="single" v-model="singleValue" @dateChange="onDateChange">
198255
</cv-date-picker>
199256
</div>`;
200257
const templateSingleUsingDateVModel = `
@@ -212,7 +269,7 @@ const TemplateSingleUsingDate = args => {
212269
args,
213270
now,
214271
singleValue,
215-
onChange: action('change'),
272+
onDateChange: action('dateChange'),
216273
}),
217274
template: templateSingleUsingDate + templateSingleUsingDateVModel,
218275
};
@@ -258,7 +315,7 @@ function changeMaxDate(inc) {
258315
}
259316
const templateSingleUsingMinMax = `
260317
<div>
261-
<cv-date-picker v-bind='args' @change="onChange" kind="single" :value="now" :cal-options="calOptions">
318+
<cv-date-picker v-bind='args' kind="single" :value="now" :cal-options="calOptions" @dateChange="onDateChange">
262319
</cv-date-picker>
263320
<div style="margin-top:2rem; background-color: #888888; padding:1rem; width:fit-content">
264321
<div>Reactive updates</div>
@@ -280,7 +337,7 @@ const TemplateSingleUsingMinMax = args => {
280337
toggleDateFormat,
281338
buttonLabel,
282339
changeMaxDate,
283-
onChange: action('change'),
340+
onDateChange: action('dateChange'),
284341
}),
285342
template: templateSingleUsingMinMax,
286343
};
@@ -303,7 +360,14 @@ SingleUsingMinMax.args = initArgs;
303360

304361
SingleUsingMinMax.parameters = {
305362
controls: {
306-
exclude: ['update:modelValue', 'invalid-message', 'modelValue', 'kind'],
363+
exclude: [
364+
'update:modelValue',
365+
'invalid-message',
366+
'modelValue',
367+
'kind',
368+
'dateChange',
369+
'value',
370+
],
307371
},
308372
docs: {
309373
source: { code: codeMinMax },
@@ -317,8 +381,10 @@ SingleUsingMinMax.parameters = {
317381

318382
const templateRangeUsingDate = `
319383
<div>
320-
<cv-date-picker v-bind="args" @change="onChange" kind="range"
321-
:value="{startDate: now.toLocaleDateString(), endDate: tomorrow.toLocaleDateString()}">
384+
<cv-date-picker v-bind="args"
385+
kind="range"
386+
:value="{startDate: now.toLocaleDateString(), endDate: tomorrow.toLocaleDateString()}"
387+
@dateChange="onDateChange">
322388
</cv-date-picker>
323389
</div>
324390
`;
@@ -330,7 +396,7 @@ const TemplateRangeUsingDate = args => {
330396
args,
331397
now,
332398
tomorrow,
333-
onChange: action('change'),
399+
onDateChange: action('dateChange'),
334400
}),
335401
template: templateRangeUsingDate,
336402
};
@@ -340,7 +406,14 @@ export const RangeUsingDate = TemplateRangeUsingDate.bind({});
340406
RangeUsingDate.args = initArgs;
341407
RangeUsingDate.parameters = {
342408
controls: {
343-
exclude: ['update:modelValue', 'invalid-message', 'kind', 'modelValue'],
409+
exclude: [
410+
'update:modelValue',
411+
'invalid-message',
412+
'kind',
413+
'modelValue',
414+
'dateChange',
415+
'value',
416+
],
344417
},
345418
};
346419
RangeUsingDate.parameters = storyParametersObject(
@@ -353,8 +426,7 @@ RangeUsingDate.parameters = storyParametersObject(
353426

354427
const templateMinimal = `
355428
<div>
356-
<cv-date-picker v-bind="args" @change="onChange" :value="now">
357-
</cv-date-picker>
429+
<cv-date-picker v-bind="args" :value="now" @change="onChange"/>
358430
</div>
359431
`;
360432

@@ -373,7 +445,13 @@ const TemplateMinimal = args => {
373445
export const Minimal = TemplateMinimal.bind({});
374446
Minimal.parameters = {
375447
controls: {
376-
exclude: ['update:modelValue', 'invalid-message', 'modelValue'],
448+
exclude: [
449+
'update:modelValue',
450+
'invalid-message',
451+
'modelValue',
452+
'dateChange',
453+
'value',
454+
],
377455
},
378456
};
379457
Minimal.parameters = storyParametersObject(
@@ -395,7 +473,6 @@ const TemplateSkeleton = args => {
395473
components: { CvDatePicker, CvDatePickerSkeleton },
396474
setup: () => ({
397475
args,
398-
onChange: action('change'),
399476
}),
400477
template: templateSkeleton,
401478
};

src/components/CvDatePicker/CvDatePicker.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ const props = defineProps({
179179
const cvId = useCvId(props, true, 'date-picker-');
180180
const isLight = useIsLight(props);
181181
182-
const emit = defineEmits(['update:modelValue']);
182+
const emit = defineEmits(['update:modelValue', 'dateChange']);
183183
184184
const getKind = computed({
185185
get() {
@@ -332,6 +332,7 @@ const handleDatePick = (selectedDates, dateStr, instance) => {
332332
});
333333
334334
emit('update:modelValue', temp);
335+
emit('dateChange', selectedDates);
335336
} else if (isRange.value && selectedDates[0] && selectedDates[1]) {
336337
const startDate = dateToString(selectedDates[0]);
337338
const endDate = dateToString(selectedDates[1]);
@@ -345,6 +346,7 @@ const handleDatePick = (selectedDates, dateStr, instance) => {
345346
startDate: startDate,
346347
endDate: endDate,
347348
});
349+
emit('dateChange', selectedDates);
348350
}
349351
};
350352

0 commit comments

Comments
 (0)