Skip to content

Commit f5c2d79

Browse files
update input event firing (#491)
* update input event firing * update model check
1 parent 130a589 commit f5c2d79

File tree

11 files changed

+174
-79
lines changed

11 files changed

+174
-79
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@soramitsu/soramitsu-js-ui",
3-
"version": "1.0.41",
3+
"version": "1.0.42",
44
"private": false,
55
"publishConfig": {
66
"registry": "https://nexus.iroha.tech/repository/npm-soramitsu/"

src/components/Checkbox/SCheckbox.vue

+15-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
</template>
1717

1818
<script lang="ts">
19-
import { Component, Mixins, ModelSync, Prop } from 'vue-property-decorator'
19+
import { Component, Mixins, Prop } from 'vue-property-decorator'
2020
import ElCheckbox from 'element-ui/lib/checkbox'
2121
2222
import SizeMixin from '../../mixins/SizeMixin'
@@ -26,6 +26,10 @@ import BorderRadiusMixin from '../../mixins/BorderRadiusMixin'
2626
components: { ElCheckbox }
2727
})
2828
export default class SCheckbox extends Mixins(SizeMixin, BorderRadiusMixin) {
29+
/**
30+
* Value of the checkbox item. Can be `string / number / boolean`
31+
*/
32+
@Prop() readonly value!: string | number | boolean
2933
/**
3034
* Label of the checkbox item
3135
*/
@@ -58,11 +62,16 @@ export default class SCheckbox extends Mixins(SizeMixin, BorderRadiusMixin) {
5862
* `false` by default
5963
*/
6064
@Prop({ default: false, type: Boolean }) readonly indeterminate!: boolean
61-
/**
62-
* Value of the checkbox item. Can be `string / number / boolean`
63-
*/
64-
@ModelSync('value', 'input', { type: [String, Number, Boolean] })
65-
readonly model!: string | number | boolean
65+
66+
get model (): string | number | boolean {
67+
return this.value
68+
}
69+
70+
set model (value: string | number | boolean) {
71+
if (this.value !== value) {
72+
this.$emit('input', value)
73+
}
74+
}
6675
6776
get computedClasses (): Array<string> {
6877
const cssClasses: Array<string> = []

src/components/DatePicker/SDatePicker/SDatePicker.vue

+16-7
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
</template>
3737

3838
<script lang="ts">
39-
import { Component, Mixins, ModelSync, Prop, Watch, Ref, Inject } from 'vue-property-decorator'
39+
import { Component, Mixins, Prop, Watch, Ref, Inject } from 'vue-property-decorator'
4040
import ElDatePicker from 'element-ui/lib/date-picker'
4141
import { ElForm } from 'element-ui/types/form'
4242
import { ElFormItem } from 'element-ui/types/form-item'
@@ -52,6 +52,11 @@ import { PickerTypes, PickerAlignment, InputTypes } from '../consts'
5252
components: { ElDatePicker, SIcon }
5353
})
5454
export default class SDatePicker extends Mixins(SizeMixin, BorderRadiusMixin) {
55+
/**
56+
* Value of date picker component. Can be used with `v-model`.
57+
* Can be date object / array with date objects for date range picker
58+
*/
59+
@Prop() readonly value!: any
5560
/**
5661
* Type of the date picker component. Available values:
5762
*
@@ -172,12 +177,16 @@ export default class SDatePicker extends Mixins(SizeMixin, BorderRadiusMixin) {
172177
* `true` by default
173178
*/
174179
@Prop({ type: Boolean, default: true }) readonly validateEvent!: boolean
175-
/**
176-
* Value of date picker component. Can be used with `v-model`.
177-
* Can be date object / array with date objects for date range picker
178-
*/
179-
@ModelSync('value', 'input')
180-
readonly model!: any
180+
181+
get model (): any {
182+
return this.value
183+
}
184+
185+
set model (value: any) {
186+
if (JSON.stringify(value) !== JSON.stringify(this.value)) {
187+
this.$emit('input', value)
188+
}
189+
}
181190
182191
@Watch('value')
183192
private handlePropChange (value: any): void {

src/components/Radio/SRadio/SRadio.vue

+17-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
:disabled="disabled"
88
:border="border"
99
:name="name"
10+
@change="handleChange"
1011
>
1112
<slot></slot>
1213
</component>
1314
</template>
1415

1516
<script lang="ts">
16-
import { Component, Mixins, Prop, ModelSync } from 'vue-property-decorator'
17+
import { Component, Mixins, Prop } from 'vue-property-decorator'
1718
import ElRadio from 'element-ui/lib/radio'
1819
import ElRadioButton from 'element-ui/lib/radio-button'
1920
@@ -51,7 +52,17 @@ export default class SRadio extends Mixins(SizeMixin, DesignSystemInject) {
5152
/**
5253
* Binding value of the radio component. Can be `string` / `number` / `boolean`
5354
*/
54-
@ModelSync('value', 'input', { type: [String, Number, Boolean] }) readonly model!: string | number | boolean
55+
@Prop({ type: [String, Number, Boolean] }) readonly value!: string | number | boolean
56+
57+
get model (): string | number | boolean {
58+
return this.value
59+
}
60+
61+
set model (value: string | number | boolean) {
62+
if (this.value !== value) {
63+
this.$emit('input', value)
64+
}
65+
}
5566
5667
get radioComponent () {
5768
return this.isRadioButton ? 'el-radio-button' : 'el-radio'
@@ -67,5 +78,9 @@ export default class SRadio extends Mixins(SizeMixin, DesignSystemInject) {
6778
}
6879
return cssClasses
6980
}
81+
82+
handleChange (value: string | number | boolean): void {
83+
this.$emit('change', value)
84+
}
7085
}
7186
</script>

src/components/Radio/SRadioGroup/SRadioGroup.vue

+12-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</template>
1010

1111
<script lang="ts">
12-
import { Component, Mixins, Prop, ModelSync } from 'vue-property-decorator'
12+
import { Component, Mixins, Prop } from 'vue-property-decorator'
1313
import ElRadioGroup from 'element-ui/lib/radio-group'
1414
1515
import SizeMixin from '../../../mixins/SizeMixin'
@@ -25,6 +25,16 @@ export default class SRadio extends Mixins(SizeMixin) {
2525
/**
2626
* Binding value of the radio group. Can be `string` / `number` / `boolean`
2727
*/
28-
@ModelSync('value', 'input', { type: [String, Number, Boolean] }) readonly groupModel!: string | number | boolean
28+
@Prop({ type: [String, Number, Boolean] }) readonly value!: string | number | boolean
29+
30+
get groupModel (): string | number | boolean {
31+
return this.value
32+
}
33+
34+
set groupModel (value: string | number | boolean) {
35+
if (this.value !== value) {
36+
this.$emit('input', value)
37+
}
38+
}
2939
}
3040
</script>

src/components/Select/SSelect/SSelect.vue

+27-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
@focus="handleFocus"
1919
@visible-change="handleVisibleChange"
2020
@clear="handleClear"
21+
@change="handleChange"
2122
:filterable="filterable"
2223
>
2324
<slot name="prefix" slot="prefix"></slot>
@@ -28,7 +29,7 @@
2829
</template>
2930

3031
<script lang="ts">
31-
import { Component, Mixins, ModelSync, Prop, Watch, Ref, Inject } from 'vue-property-decorator'
32+
import { Component, Mixins, Prop, Watch, Ref, Inject } from 'vue-property-decorator'
3233
import ElSelect from 'element-ui/lib/select'
3334
import { ElForm } from 'element-ui/types/form'
3435
import { ElFormItem } from 'element-ui/types/form-item'
@@ -39,10 +40,18 @@ import DesignSystemInject from '../../DesignSystem/DesignSystemInject'
3940
import { Autocomplete } from '../../Input/consts'
4041
import { InputTypes } from '../consts'
4142
43+
type SingleSelectValue = boolean | string | number;
44+
type MultipleSelectValue = Array<string | number>;
45+
type SelectValue = SingleSelectValue | MultipleSelectValue;
46+
4247
@Component({
4348
components: { ElSelect }
4449
})
4550
export default class SSelect extends Mixins(SizeMixin, BorderRadiusMixin, DesignSystemInject) {
51+
/**
52+
* Selected value. Can be used with `v-model`
53+
*/
54+
@Prop({ type: [Boolean, String, Number, Array] }) readonly value!: SelectValue
4655
/**
4756
* Input type of the select component. Available values: `"input"`, `"select"`.
4857
*
@@ -121,19 +130,24 @@ export default class SSelect extends Mixins(SizeMixin, BorderRadiusMixin, Design
121130
* `false` by default
122131
*/
123132
@Prop({ type: Boolean, default: false }) readonly filterable!: boolean
124-
/**
125-
* Selected value. Can be used with `v-model`
126-
*/
127-
@ModelSync('value', 'input')
128-
readonly model!: any
133+
134+
get model (): SelectValue {
135+
return this.value
136+
}
137+
138+
set model (value: SelectValue) {
139+
if (JSON.stringify(value) !== JSON.stringify(this.value)) {
140+
this.$emit('input', value)
141+
}
142+
}
129143
130144
@Ref('select') select!: any
131145
132146
@Inject({ default: '', from: 'elForm' }) elForm!: ElForm
133147
@Inject({ default: '', from: 'elFormItem' }) elFormItem!: ElFormItem
134148
135149
@Watch('model')
136-
private handleValueChange (value: any): void {
150+
private handleValueChange (): void {
137151
this.updateInputValue()
138152
}
139153
@@ -148,7 +162,7 @@ export default class SSelect extends Mixins(SizeMixin, BorderRadiusMixin, Design
148162
tags.remove()
149163
}
150164
const input = this.select.$el.getElementsByClassName('el-input__inner')[0] as HTMLInputElement
151-
input.value = this.model && this.model.length ? `${this.multipleTextPrefix || this.placeholder} (${this.model.length})` : ''
165+
input.value = Array.isArray(this.model) && (this.model as MultipleSelectValue).length ? `${this.multipleTextPrefix || this.placeholder} (${this.model.length})` : ''
152166
}
153167
154168
mounted (): void {
@@ -193,7 +207,7 @@ export default class SSelect extends Mixins(SizeMixin, BorderRadiusMixin, Design
193207
if (this.disabled) {
194208
cssClasses.push('s-disabled')
195209
}
196-
if ((!this.multiple && this.model) || (this.multiple && this.model.length !== 0)) {
210+
if ((!this.multiple && this.model) || (this.multiple && Array.isArray(this.model) && this.model.length !== 0)) {
197211
cssClasses.push('s-has-value')
198212
}
199213
return cssClasses
@@ -233,6 +247,10 @@ export default class SSelect extends Mixins(SizeMixin, BorderRadiusMixin, Design
233247
this.$emit('clear')
234248
}
235249
250+
handleChange (value: SelectValue): void {
251+
this.$emit('change', value)
252+
}
253+
236254
public focus (): void {
237255
this.select.focus()
238256
}

src/components/Slider/SSlider.vue

+13-9
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@
1919
:range="range"
2020
:marks="marks"
2121
:disabled="disabled"
22-
@input="handleInput"
2322
@change="handleChange"
2423
/>
2524
</div>
2625
</template>
2726

2827
<script lang="ts">
29-
import { Vue, Component, ModelSync, Prop, Watch } from 'vue-property-decorator'
28+
import { Vue, Component, Prop } from 'vue-property-decorator'
3029
import ElSlider from 'element-ui/lib/slider'
3130
3231
import { SliderInputSize } from './consts'
@@ -35,6 +34,10 @@ import { SliderInputSize } from './consts'
3534
components: { ElSlider }
3635
})
3736
export default class SSlider extends Vue {
37+
/**
38+
* Binding value
39+
*/
40+
@Prop({ default: 0, type: [Number, Array] }) readonly value!: number | number[]
3841
/**
3942
* Minimum value
4043
*/
@@ -99,14 +102,15 @@ export default class SSlider extends Vue {
99102
* Whether Slider is disabled
100103
*/
101104
@Prop({ default: false, type: Boolean }) readonly disabled!: boolean
102-
/**
103-
* Binding value
104-
*/
105-
@ModelSync('value', 'input', { default: 0, type: [Number, Array] })
106-
readonly model!: number | number[]
107105
108-
handleInput (value: number): void {
109-
this.$emit('input', value)
106+
get model (): number | number[] {
107+
return this.value
108+
}
109+
110+
set model (value: number | number[]) {
111+
if (JSON.stringify(value) !== JSON.stringify(this.value)) {
112+
this.$emit('input', value)
113+
}
110114
}
111115
112116
handleChange (value: number): void {

src/components/Switch/SSwitch.vue

+12-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</template>
1818

1919
<script lang="ts">
20-
import { Component, Mixins, ModelSync, Prop, Watch } from 'vue-property-decorator'
20+
import { Component, Mixins, Prop } from 'vue-property-decorator'
2121
import ElSwitch from 'element-ui/lib/switch'
2222
2323
import DesignSystemInject from '../DesignSystem/DesignSystemInject'
@@ -65,8 +65,17 @@ export default class SSwitch extends Mixins(DesignSystemInject) {
6565
/**
6666
* Value of switch
6767
*/
68-
@ModelSync('value', 'input', { type: [Boolean, String, Number] })
69-
readonly model!: boolean | string | number
68+
@Prop({ type: [Boolean, String, Number] }) readonly value!: boolean | string | number
69+
70+
get model (): boolean | string | number {
71+
return this.value
72+
}
73+
74+
set model (value: boolean | string | number) {
75+
if (this.value !== value) {
76+
this.$emit('input', value)
77+
}
78+
}
7079
7180
handleChange (value: boolean | string | number): void {
7281
this.$emit('change', value)

src/components/Tab/STabs/STabs.vue

+17-8
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
<script lang="ts">
2323
import Vue from 'vue'
24-
import { Component, Mixins, ModelSync, Prop } from 'vue-property-decorator'
24+
import { Component, Mixins, Prop } from 'vue-property-decorator'
2525
import ElTabs from 'element-ui/lib/tabs'
2626
2727
import DesignSystemInject from '../../DesignSystem/DesignSystemInject'
@@ -32,6 +32,12 @@ import { TabsType, TabsPosition } from '../consts'
3232
components: { ElTabs }
3333
})
3434
export default class STabs extends Mixins(BorderRadiusMixin, DesignSystemInject) {
35+
/**
36+
* Name of the selected tab. Can be used with `v-model`.
37+
*
38+
* First value by default
39+
*/
40+
@Prop({ type: String }) readonly value!: string
3541
/**
3642
* Type of tabs. Can be `"card"`/`"border-card"`/`"rounded"` or unset.
3743
*
@@ -73,13 +79,16 @@ export default class STabs extends Mixins(BorderRadiusMixin, DesignSystemInject)
7379
* If `false` is returned or a `Promise` is returned and then is rejected, switching will be prevented
7480
*/
7581
@Prop({ type: Function }) readonly beforeLeave!: (activeName: string, oldActiveName: string) => (false | Promise<any>)
76-
/**
77-
* Name of the selected tab. Can be used with `v-model`.
78-
*
79-
* First value by default
80-
*/
81-
@ModelSync('value', 'input', { type: String })
82-
readonly model!: string
82+
83+
get model (): string {
84+
return this.value
85+
}
86+
87+
set model (value: string) {
88+
if (this.value !== value) {
89+
this.$emit('input', value)
90+
}
91+
}
8392
8493
get computedType (): string {
8594
// neu tabs implemented only with TabsType.ROUNDED type

0 commit comments

Comments
 (0)