Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@soramitsu/soramitsu-js-ui",
"version": "0.8.4",
"version": "0.8.5",
"private": false,
"publishConfig": {
"registry": "https://nexus.iroha.tech/repository/npm-soramitsu/"
Expand Down
30 changes: 17 additions & 13 deletions src/components/Input/SFloatInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
v-float
:placeholder="placeholder"
:value="value"
:maxlength="maxlength"
v-bind="$attrs"
v-on="{
...$listeners,
Expand All @@ -25,6 +24,8 @@ const isNumberLikeValue = (value: any): boolean => {
return Number.isFinite(Number(value))
}

const decimalsValidator = x => x === undefined || x >= 0

@Component({
components: {
SInput
Expand All @@ -35,20 +36,16 @@ const isNumberLikeValue = (value: any): boolean => {
})
export default class SFloatInput extends Vue {
@Prop({ type: String, default: DEFAULT_VALUE }) readonly value!: string
@Prop({ default: '0.0', type: String }) readonly placeholder!: string
@Prop({
type: Number,
default: undefined,
validator: x => x === undefined || x >= 0
}) readonly decimals!: number

get maxlength (): any {
return this.valueMaxLength(this.value, this.decimals)
}
@Prop({ type: String, default: '0.0' }) readonly placeholder!: string
@Prop({ type: Number, default: undefined, validator: decimalsValidator }) readonly decimals!: number
@Prop({ type: [String, Number], default: undefined, validator: isNumberLikeValue }) readonly max!: string | number

handleInput (value: string): void {
const formatted = this.formatNumberField(value, this.decimals)
const newValue = isNumberLikeValue(formatted) ? formatted : DEFAULT_VALUE
const newValue = [
(v) => this.formatNumberField(v, this.decimals),
(v) => isNumberLikeValue(v) ? v : DEFAULT_VALUE,
(v) => this.checkValueForExtremum(v)
].reduce((buffer, rule) => rule(buffer), value)

this.onInput(newValue)
}
Expand Down Expand Up @@ -111,5 +108,12 @@ export default class SFloatInput extends Vue {

return fpIndex !== -1 ? fpIndex + 1 + decimals : undefined
}

private checkValueForExtremum (value: string): string {
if (!value) return value
if (this.max && (+value > +this.max)) return String(this.max)

return value
}
}
</script>
6 changes: 5 additions & 1 deletion src/stories/SFloatInput.stories.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { number, withKnobs } from '@storybook/addon-knobs'
import { number, text, withKnobs } from '@storybook/addon-knobs'

import { SFloatInput, SRow } from '../components'

Expand All @@ -14,6 +14,7 @@ export const configurable = () => ({
<s-float-input
v-model="model"
:decimals="decimals"
:max="max"
/>
</s-row>`,
data: () => ({
Expand All @@ -22,6 +23,9 @@ export const configurable = () => ({
props: {
decimals: {
default: number('Decimals', 18)
},
max: {
default: text('Max', '10000')
}
}
})