diff --git a/packages/vue-vuetify/src/controls/NumberControlRenderer.vue b/packages/vue-vuetify/src/controls/NumberControlRenderer.vue index 872a522e3..9239b346c 100644 --- a/packages/vue-vuetify/src/controls/NumberControlRenderer.vue +++ b/packages/vue-vuetify/src/controls/NumberControlRenderer.vue @@ -75,16 +75,16 @@ const controlRenderer = defineComponent({ const options: any = this.appliedOptions; return options.step ?? 0.1; }, - precision(): number | undefined { - if (!this.step || Number.isInteger(this.step)) return undefined; - // Handle scientific notation and float imprecision - const stepStr = this.step.toString(); - if (stepStr.indexOf('e-') > -1) { - // Handle cases like 1e-3 - return parseInt(stepStr.split('e-')[1], 10); + precision(): number | null { + const options: any = this.appliedOptions; + + // If precision is explicitly configured in the UI Schema options, respect it + if (options.precision !== undefined && options.precision !== null) { + return Number(options.precision); } - const fraction = stepStr.split('.')[1]; - return fraction ? fraction.length : undefined; + + // Return null (not undefined) to allow Vuetify to accept any precision by default + return null; }, value(): number | null | undefined { if ( diff --git a/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts b/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts index 0f76ffd83..3d2493a1b 100644 --- a/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts +++ b/packages/vue-vuetify/tests/unit/controls/NumberControlRenderer.spec.ts @@ -57,3 +57,35 @@ describe('NumberControlRenderer.vue', () => { expect(wrapper.html()).toMatchSnapshot(); }); }); + +import { VNumberInput } from 'vuetify/components'; + +describe('NumberControlRenderer precision logic', () => { + const renderers = [numberControlRendererEntry]; + const schema = { type: 'number' }; + + beforeEach(() => { + clearAllIds(); + }); + + it('allows unlimited precision by default (passes null to v-number-input)', () => { + const uischema = { type: 'Control', scope: '#' }; + const wrapper = mountJsonForms(1.23456, schema, renderers, uischema); + + const numberInput = wrapper.findComponent(VNumberInput); + // Vuetify requires null to remove precision limits + expect(numberInput.props('precision')).toBeNull(); + }); + + it('respects explicitly configured precision via UI schema options', () => { + const uischema = { + type: 'Control', + scope: '#', + options: { precision: 3 } + }; + const wrapper = mountJsonForms(1.23456, schema, renderers, uischema); + + const numberInput = wrapper.findComponent(VNumberInput); + expect(numberInput.props('precision')).toBe(3); + }); +}); diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap index 0094a50bc..7e6bd2859 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap @@ -29,7 +29,7 @@ exports[`NumberControlRenderer.vue > should render component and match snapshot - +