Skip to content

Commit fedbc8f

Browse files
committed
Closes #1
- New prop : RangeHeaderText (Allow to customize input text on range)
1 parent 614d406 commit fedbc8f

File tree

6 files changed

+51
-13
lines changed

6 files changed

+51
-13
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ Using `v-model`
115115
| inline | Boolean | false | Inline datepicker |
116116
| type | String | 'date' | Determines the type of the picker - date/month/quarter |
117117
| range | Boolean | false | Enable/disable Date range (actually only available for date ) |
118+
| rangeInputText | String | '%d ~ %d' | When range is enabled, Allow to customize date text in input |
118119
| rangeHeaderText | String | 'From %d To %d ' | When range is enabled, set text before date in datepicker header |
119120
| rangePresets | Array | | Allow to add custom range presets to range datepicker. (Max custom presets = 6) Example: `[{ name: 'This year', dates: { start: ..., end: ... } }]` |
120121
| tabindex | String\|Number | '0' | Specify input tabindex |

doc-src/src/App.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,7 @@
707707
:min-date="examples.range.min"
708708
:end-date="examples.range.end"
709709
:range-presets="examples.range.presets"
710+
:range-input-text="examples.range.inputText"
710711
placeholder="Start - End"
711712
validate
712713
range
@@ -725,6 +726,7 @@
725726
<span class="token attr-name">:min-date</span>="{{ examples.range.min }}"
726727
<span class="token attr-name">:end-date</span>="{{ examples.range.end }}"
727728
<span class="token attr-name">:range-presets</span>="{{ examples.range.presets }}"
729+
<span class="token attr-name">:range-input-text</span>="{{ examples.range.inputText }}"
728730
<span class="token attr-name">placeholder</span>="Start - End"
729731
<span class="token attr-name">validate </span>
730732
<span class="token attr-name">range </span>
@@ -902,6 +904,7 @@ export default {
902904
dates: undefined,
903905
min: '2018-02-12',
904906
end: '2019-08-12',
907+
inputText: 'From %d to %d',
905908
presets: [{
906909
name: 'This year',
907910
dates: {

src/components/datepicker/DatePicker.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
:name="name"
99
:date="value"
1010
:type="type"
11-
:range="range"
1211
:format="inputFormat"
12+
:range="range"
13+
:range-input-text="rangeInputText"
1314
:locale="locale"
1415
:placeholder="placeholder"
1516
:color="color"
@@ -84,6 +85,7 @@ export default {
8485
type: { type: String, default: 'date' },
8586
// Range
8687
range: { type: Boolean, default: false },
88+
rangeInputText: { type: String, default: '%d ~ %d' },
8789
rangeHeaderText: { type: String, default: 'From %d To %d' },
8890
rangePresets: { type: Array, default: undefined },
8991
// Current Value from v-model

src/components/datepicker/DatePickerCustomInput.vue

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export default {
4343
format: { type: String },
4444
type: { type: String },
4545
range: { type: Boolean },
46+
rangeInputText: { type: String },
4647
locale: { type: Object },
4748
placeholder: { type: String },
4849
color: { type: String },
@@ -64,8 +65,14 @@ export default {
6465
// Displayed Date
6566
dateFormatted () {
6667
if (!this.isDateDefined) return;
67-
if (this.range) {
68-
return getRangeDatesFormatted(this.date, this.locale, this.format);
68+
if (this.range && this.rangeInputText) {
69+
const textSplitted = this.rangeInputText.split('%d').reduce((texts, text, index) => ({
70+
...texts,
71+
...(index === 0 && { start: text.trim() }),
72+
...(index === 1 && { end: text.trim() }),
73+
}), {});
74+
const datesSplitted = getRangeDatesFormatted(this.date, this.locale, this.format).split(' ~ ');
75+
return `${textSplitted.start} ${datesSplitted[0]} ${textSplitted.end} ${datesSplitted[1]}`.trim();
6976
}
7077
return formatDateWithLocale(this.date, this.locale, this.format);
7178
},

src/components/datepicker/DatePickerHeader.vue

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,11 @@ export default {
8484
},
8585
dateFormatted () {
8686
if (this.range && this.rangeHeaderText) {
87-
const textSplitted = this.rangeHeaderText.split('%d').reduce((texts, text, index) => {
88-
return {
89-
...texts,
90-
...(index === 0 && { start: text.trim() }),
91-
...(index === 1 && { end: text.trim() }),
92-
};
93-
}, {});
87+
const textSplitted = this.rangeHeaderText.split('%d').reduce((texts, text, index) => ({
88+
...texts,
89+
...(index === 0 && { start: text.trim() }),
90+
...(index === 1 && { end: text.trim() }),
91+
}), {});
9492
const datesSplitted = getRangeDatesFormatted(this.mutableDate, this.locale, this.formatHeader).split(' ~ ');
9593
return [`${textSplitted.start} ${datesSplitted[0]}`, `${textSplitted.end} ${datesSplitted[1]}`];
9694
}

tests/unit/components/datepicker/DatePickerCustonInput.spec.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ describe('DatePickerCustomInput', () => {
99
const dummyDate = dayjs(new Date([2019, 5, 16]));
1010

1111
beforeEach(() => {
12-
mountComponent = ({ date, range, disabled = false } = {}) =>
12+
mountComponent = ({ date, range, rangeInputText = '%d ~ %d', disabled = false } = {}) =>
1313
shallowMount(DatePickerCustomInput, {
1414
propsData: {
1515
name: 'datepicker',
@@ -19,6 +19,7 @@ describe('DatePickerCustomInput', () => {
1919
color: 'color',
2020
disabled,
2121
range,
22+
rangeInputText,
2223
},
2324
});
2425
});
@@ -83,13 +84,39 @@ describe('DatePickerCustomInput', () => {
8384
[{ date: dayjs('2019-4-12') }, '12 April 2019'],
8485
[{ date: dayjs('2019-4-12') }, '12 April 2019'],
8586
[
86-
{ range: true, date: { start: dayjs('2018-5-16'), end: undefined }, formatHeader: 'YYYY-MM-DD' },
87+
{
88+
range: true,
89+
date: { start: dayjs('2018-5-16'), end: undefined },
90+
formatHeader: 'YYYY-MM-DD',
91+
},
8792
undefined,
8893
],
8994
[
90-
{ range: true, date: { start: dayjs('2018-5-16'), end: dayjs('2019-5-16') }, formatHeader: 'YYYY~MM-DD' },
95+
{
96+
range: true,
97+
date: { start: dayjs('2018-5-16'), end: dayjs('2019-5-16') },
98+
formatHeader: 'YYYY~MM-DD',
99+
},
91100
'16 May 2018 ~ 16 May 2019',
92101
],
102+
[
103+
{
104+
range: true,
105+
rangeInputText: 'From %d to %d',
106+
date: { start: dayjs('2018-5-16'), end: dayjs('2019-5-16') },
107+
formatHeader: 'YYYY~MM-DD',
108+
},
109+
'From 16 May 2018 to 16 May 2019',
110+
],
111+
[
112+
{
113+
range: true,
114+
rangeInputText: '%d to %d',
115+
date: { start: dayjs('2018-5-16'), end: dayjs('2019-5-16') },
116+
formatHeader: 'YYYY~MM-DD',
117+
},
118+
'16 May 2018 to 16 May 2019',
119+
],
93120
])('When props equal %p, should return %p', (props, expectedResult) => {
94121
const wrapper = mountComponent(props);
95122
expect(wrapper.vm.dateFormatted).toEqual(expectedResult);

0 commit comments

Comments
 (0)