Skip to content

Commit 35685da

Browse files
committed
updated component
1 parent fdb55a9 commit 35685da

21 files changed

+439
-108
lines changed

src/component.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ export default defineComponent({
110110
return {
111111
config,
112112
maskedValue,
113+
unmaskedValue,
113114
input,
114115
change
115116
}

src/core.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ export function keydownHandler(event: KeyboardEvent, el: CustomInputElement) {
196196
const { options } = el
197197
const { prefix, suffix, decimal, min, separator } = options as Options
198198
const { key } = event
199+
200+
console.log(key)
199201
const regExp = new RegExp(`${prefix}|${suffix}`, 'g')
200202
const newValue = el.value.replace(regExp, '')
201203
const canNegativeInput = min === undefined || Number(min) < 0 || Number(min) !== min
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { mount } from '@vue/test-utils'
2+
import VueNumber from '../../src/component.vue'
3+
4+
describe('VueNumber', () => {
5+
it('renders the correct maskedValue and unmaskedValue when custom config', async () => {
6+
const wrapper = mount(VueNumber, {
7+
props: {
8+
modelValue: 123456.893,
9+
decimal: ',',
10+
separator: '.',
11+
prefix: 'Rs.',
12+
suffix: '%'
13+
}
14+
})
15+
16+
const input = wrapper.find('input')
17+
expect(input.element.value).toBe('Rs.123.456,89%')
18+
wrapper.setProps({ modelValue: '1234.568' })
19+
await input.trigger('input')
20+
await input.trigger('change')
21+
22+
expect(input.element.value).toBe('Rs.1.234,57%')
23+
expect(wrapper.vm.maskedValue).toBe('Rs.1.234,57%')
24+
expect(wrapper.vm.unmaskedValue).toBe('1234.57')
25+
expect(wrapper.emitted()['update:model-value'][0]).toEqual(['1234.57'])
26+
expect(wrapper.emitted()['input:model-value'][0]).toEqual(['1234.57'])
27+
})
28+
})
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { mount } from '@vue/test-utils'
2+
import VueNumber from '../../src/component.vue'
3+
4+
describe('VueNumber', () => {
5+
it('renders the correct maskedValue when minimumFractionDigits', async () => {
6+
const wrapper = mount(VueNumber, {
7+
props: {
8+
modelValue: 1000,
9+
minimumFractionDigits: 1
10+
}
11+
})
12+
13+
const input = wrapper.find('input')
14+
expect(input.element.value).toBe('1,000.0')
15+
wrapper.setProps({ modelValue: '1234.505' })
16+
await input.trigger('input')
17+
await input.trigger('change')
18+
19+
expect(input.element.value).toBe('1,234.51')
20+
expect(wrapper.vm.maskedValue).toBe('1,234.51')
21+
expect(wrapper.vm.unmaskedValue).toBe('1234.51')
22+
expect(wrapper.emitted()['input:model-value'][0]).toEqual(['1234.51'])
23+
expect(wrapper.emitted()['update:model-value'][0]).toEqual(['1234.51'])
24+
25+
wrapper.setProps({ modelValue: '1234' })
26+
await input.trigger('input')
27+
await input.trigger('change')
28+
29+
expect(input.element.value).toBe('1,234.0')
30+
expect(wrapper.vm.maskedValue).toBe('1,234.0')
31+
expect(wrapper.vm.unmaskedValue).toBe('1234')
32+
expect(wrapper.emitted()['input:model-value'][1]).toEqual(['1234'])
33+
expect(wrapper.emitted()['update:model-value'][1]).toEqual(['1234'])
34+
})
35+
})
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { mount } from '@vue/test-utils'
2+
import VueNumber from '../../src/component.vue'
3+
4+
describe('VueNumber', () => {
5+
it('renders the correct maskedValue and unmaskedValue when min and max prop added', async () => {
6+
const wrapper = mount(VueNumber, {
7+
props: {
8+
modelValue: 1000,
9+
min: 0,
10+
max: 5000
11+
}
12+
})
13+
14+
const input = wrapper.find('input')
15+
expect(input.element.value).toBe('1,000')
16+
wrapper.setProps({ modelValue: '-100.52' })
17+
await input.trigger('input')
18+
await input.trigger('change')
19+
20+
expect(input.element.value).toBe('0')
21+
expect(wrapper.vm.maskedValue).toBe('0')
22+
expect(wrapper.vm.unmaskedValue).toBe('0')
23+
expect(wrapper.emitted()['update:model-value'][0]).toEqual(['0'])
24+
expect(wrapper.emitted()['input:model-value'][0]).toEqual(['0'])
25+
26+
wrapper.setProps({ modelValue: '10000.52' })
27+
await input.trigger('input')
28+
await input.trigger('change')
29+
30+
expect(input.element.value).toBe('5,000')
31+
expect(wrapper.vm.maskedValue).toBe('5,000')
32+
expect(wrapper.vm.unmaskedValue).toBe('5000')
33+
expect(wrapper.emitted()['update:model-value'][1]).toEqual(['5000'])
34+
expect(wrapper.emitted()['input:model-value'][1]).toEqual(['5000'])
35+
36+
wrapper.setProps({ modelValue: '1325.259' })
37+
await input.trigger('input')
38+
await input.trigger('change')
39+
40+
expect(input.element.value).toBe('1,325.26')
41+
expect(wrapper.vm.maskedValue).toBe('1,325.26')
42+
expect(wrapper.vm.unmaskedValue).toBe('1325.26')
43+
expect(wrapper.emitted()['update:model-value'][2]).toEqual(['1325.26'])
44+
expect(wrapper.emitted()['input:model-value'][2]).toEqual(['1325.26'])
45+
})
46+
})
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { mount } from '@vue/test-utils'
2+
import VueNumber from '../../src/component.vue'
3+
4+
describe('VueNumber', () => {
5+
it('renders the correct maskedValue when reverseFill prop is true', async () => {
6+
const wrapper = mount(VueNumber, {
7+
props: {
8+
modelValue: 1000,
9+
reverseFill: true
10+
}
11+
})
12+
13+
const input = wrapper.find('input')
14+
expect(input.element.value).toBe('1,000.00')
15+
wrapper.setProps({ modelValue: '1234.505' })
16+
await input.trigger('input')
17+
await input.trigger('change')
18+
19+
expect(input.element.value).toBe('12,345.05')
20+
expect(wrapper.vm.maskedValue).toBe('12,345.05')
21+
expect(wrapper.vm.unmaskedValue).toBe('12345.05')
22+
expect(wrapper.emitted()['input:model-value'][0]).toEqual(['12345.05'])
23+
expect(wrapper.emitted()['update:model-value'][0]).toEqual(['12345.05'])
24+
25+
wrapper.setProps({ modelValue: '1234.00' })
26+
await input.trigger('input')
27+
await input.trigger('change')
28+
29+
expect(input.element.value).toBe('1,234.00')
30+
expect(wrapper.vm.maskedValue).toBe('1,234.00')
31+
expect(wrapper.vm.unmaskedValue).toBe('1234')
32+
expect(wrapper.emitted()['input:model-value'][1]).toEqual(['1234'])
33+
expect(wrapper.emitted()['update:model-value'][1]).toEqual(['1234'])
34+
})
35+
})

tests/component/component.spec.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { mount } from '@vue/test-utils'
2+
import VueNumber from '../../src/component.vue'
3+
4+
describe('VueNumber', () => {
5+
it('updates the maskedValue when input is changed', async () => {
6+
const wrapper = mount(VueNumber, {
7+
props: {
8+
modelValue: 1000.53
9+
}
10+
})
11+
12+
const input = wrapper.find('input')
13+
expect(input.element.value).toBe('1,000.53')
14+
input.setValue('1234.5')
15+
16+
expect(wrapper.vm.maskedValue).toBe('1,234.5')
17+
expect(wrapper.vm.unmaskedValue).toBe('1234.5')
18+
expect(wrapper.emitted()['input:model-value'][0]).toEqual(['1234.5'])
19+
expect(wrapper.emitted()['update:model-value'][0]).toEqual(['1234.5'])
20+
})
21+
22+
it('renders the correct maskedValue when masked prop is true', async () => {
23+
const wrapper = mount(VueNumber, {
24+
props: {
25+
modelValue: 1000,
26+
masked: true
27+
}
28+
})
29+
30+
const input = wrapper.find('input')
31+
expect(input.element.value).toBe('1,000')
32+
input.setValue('1234.5')
33+
34+
expect(wrapper.vm.maskedValue).toBe('1,234.5')
35+
expect(wrapper.vm.unmaskedValue).toBe('1234.5')
36+
expect(wrapper.emitted()['input:model-value'][0]).toEqual(['1,234.5'])
37+
expect(wrapper.emitted()['update:model-value'][0]).toEqual(['1,234.5'])
38+
})
39+
})
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { mount } from '@vue/test-utils'
2+
import directive from '../../src/directive'
3+
4+
describe('v-number directive', () => {
5+
it('should emit input event with the new value on input', async () => {
6+
const wrapper = mount({
7+
template: `<input v-number="options" type="text" :value="value" />`,
8+
directives: {
9+
number: directive
10+
},
11+
data() {
12+
return {
13+
value: 123456.893,
14+
options: {
15+
decimal: ',',
16+
separator: '.',
17+
prefix: 'Rs.',
18+
suffix: '%'
19+
}
20+
}
21+
}
22+
})
23+
24+
const input = wrapper.find('input')
25+
expect(input.element.value).toBe('Rs.123.456,89%')
26+
27+
await input.trigger('blur')
28+
expect(input.element.value).toBe('Rs.123.456,89%')
29+
30+
input.setValue(1234.568)
31+
expect(input.element.value).toBe('Rs.1.234,568%')
32+
33+
await input.trigger('blur')
34+
expect(input.element.value).toBe('Rs.1.234,57%')
35+
})
36+
})
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { mount } from '@vue/test-utils'
2+
import directive from '../../src/directive'
3+
4+
describe('v-number directive', () => {
5+
test('should emit input event with minimum fraction digits', async () => {
6+
const wrapper = mount({
7+
template: `<input v-number="options" type="text" :value="value" />`,
8+
directives: {
9+
number: directive
10+
},
11+
data() {
12+
return {
13+
value: 123456.893,
14+
options: {
15+
minimumFractionDigits: 2
16+
}
17+
}
18+
}
19+
})
20+
21+
const input = wrapper.find('input')
22+
expect(input.element.value).toBe('123,456.89')
23+
24+
await input.trigger('blur')
25+
expect(input.element.value).toBe('123,456.89')
26+
27+
input.setValue('1234.5')
28+
expect(input.element.value).toBe('1,234.5')
29+
30+
await input.trigger('blur')
31+
expect(input.element.value).toBe('1,234.50')
32+
})
33+
})
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { mount } from '@vue/test-utils'
2+
import directive from '../../src/directive'
3+
4+
describe('v-number directive', () => {
5+
it('should emit input event within range', async () => {
6+
const wrapper = mount({
7+
template: `<input v-number="options" type="text" :value="value" />`,
8+
directives: {
9+
number: directive
10+
},
11+
data() {
12+
return {
13+
value: 1.536,
14+
options: {
15+
min: 0,
16+
max: 50
17+
}
18+
}
19+
}
20+
})
21+
22+
const input = wrapper.find('input')
23+
expect(input.element.value).toBe('1.54')
24+
25+
input.setValue('1234.529')
26+
expect(input.element.value).toBe('1,234.529')
27+
await input.trigger('blur')
28+
expect(input.element.value).toBe('50')
29+
30+
input.setValue('-1234.568')
31+
expect(input.element.value).toBe('-1,234.568')
32+
await input.trigger('blur')
33+
expect(input.element.value).toBe('0')
34+
35+
input.setValue('12.568')
36+
expect(input.element.value).toBe('12.568')
37+
await input.trigger('blur')
38+
expect(input.element.value).toBe('12.57')
39+
})
40+
})

0 commit comments

Comments
 (0)