Skip to content

Commit f07b6be

Browse files
authored
Introduce 'useGrouping' option
Introduce 'useGrouping' option for Angular's NumberControlRenderer to disable grouping.
1 parent 612a38a commit f07b6be

File tree

3 files changed

+122
-6
lines changed

3 files changed

+122
-6
lines changed

packages/angular-material/src/controls/number.renderer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ import {
3030
isNumberControl,
3131
or,
3232
RankedTester,
33-
rankWith
33+
rankWith,
34+
StatePropsOfControl
3435
} from '@jsonforms/core';
36+
import merge from 'lodash/merge';
3537

3638
@Component({
3739
selector: 'NumberControlRenderer',
@@ -123,18 +125,20 @@ export class NumberControlRenderer extends JsonFormsControl {
123125
return '';
124126
};
125127

126-
mapAdditionalProps() {
128+
mapAdditionalProps(props:StatePropsOfControl) {
127129
if (this.scopedSchema) {
128130
const defaultStep = isNumberControl(this.uischema, this.rootSchema)
129131
? 0.1
130132
: 1;
131133
this.min = this.scopedSchema.minimum;
132134
this.max = this.scopedSchema.maximum;
133135
this.multipleOf = this.scopedSchema.multipleOf || defaultStep;
136+
const appliedUiSchemaOptions = merge({}, props.config, this.uischema.options);
134137
const currentLocale = getLocale(this.jsonFormsService.getState());
135138
if (this.locale === undefined || this.locale !== currentLocale) {
136139
this.locale = currentLocale;
137140
this.numberFormat = new Intl.NumberFormat(this.locale, {
141+
useGrouping: appliedUiSchemaOptions.useGrouping,
138142
maximumFractionDigits: this.MAXIMUM_FRACTIONAL_DIGITS
139143
});
140144
this.determineDecimalSeparator();

packages/angular-material/test/number-control.spec.ts

Lines changed: 115 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,25 @@
2323
THE SOFTWARE.
2424
*/
2525
import { DebugElement } from '@angular/core';
26+
import { ComponentFixture } from '@angular/core/testing';
27+
import { FlexLayoutModule } from '@angular/flex-layout';
2628
import { ReactiveFormsModule } from '@angular/forms';
2729
import { MatError, MatFormFieldModule } from '@angular/material/form-field';
2830
import { MatInputModule } from '@angular/material/input';
2931
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
32+
import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular';
3033
import {
34+
baseSetup,
3135
ErrorTestExpectation,
36+
getJsonFormsService,
3237
numberAdditionalPropsTest,
3338
numberBaseTest,
3439
numberErrorTest,
35-
numberInputEventTest
40+
numberInputEventTest,
41+
prepareComponent
3642
} from '@jsonforms/angular-test';
37-
import { FlexLayoutModule } from '@angular/flex-layout';
43+
import { Actions, ControlElement, JsonFormsCore } from '@jsonforms/core';
3844
import { NumberControlRenderer, NumberControlRendererTester } from '../src';
39-
import { JsonFormsAngularService } from '@jsonforms/angular';
4045

4146
describe('Material number field tester', () => {
4247
const uischema = {
@@ -100,3 +105,110 @@ describe(
100105
'Number control Additional Props Tests',
101106
numberAdditionalPropsTest(testConfig, 'input', toSelect)
102107
);
108+
109+
describe(
110+
'Number control custom', () => {
111+
let fixture: ComponentFixture<any>;
112+
let numberNativeElement: any;
113+
let component: JsonFormsControl;
114+
baseSetup(testConfig);
115+
116+
const defaultSchema = {
117+
type: 'object',
118+
properties: {
119+
foo: { type: 'number' }
120+
}
121+
};
122+
const defaultData = {foo:1000000};
123+
const defaultUischema: ControlElement = {
124+
type: 'Control',
125+
scope: '#/properties/foo'
126+
};
127+
128+
beforeEach(() => {
129+
const preparedComponents = prepareComponent(
130+
testConfig, 'input', toSelect);
131+
fixture = preparedComponents.fixture;
132+
numberNativeElement = preparedComponents.numberNativeElement;
133+
component = preparedComponents.component;
134+
});
135+
136+
it('default grouping behavior', () => {
137+
const uischema = Object.assign({},defaultUischema);
138+
component.uischema = uischema;
139+
const state:JsonFormsCore = {
140+
data: defaultData,
141+
schema: defaultSchema,
142+
uischema: uischema
143+
};
144+
getJsonFormsService(component).init({
145+
core: state, i18n: {
146+
locale: 'en',
147+
localizedSchemas: undefined,
148+
localizedUISchemas: undefined
149+
}
150+
});
151+
getJsonFormsService(component).updateCore(
152+
Actions.init(state.data, state.schema)
153+
);
154+
component.ngOnInit();
155+
fixture.detectChanges();
156+
157+
expect(numberNativeElement.value).toBe('1,000,000');
158+
});
159+
160+
it('should use config for grouping', () => {
161+
const uischema = Object.assign({},defaultUischema);
162+
component.uischema = uischema;
163+
const state:JsonFormsCore = {
164+
data: defaultData,
165+
schema: defaultSchema,
166+
uischema: uischema
167+
};
168+
getJsonFormsService(component).init({
169+
core: state, i18n: {
170+
locale: 'en',
171+
localizedSchemas: undefined,
172+
localizedUISchemas: undefined
173+
},config: {
174+
useGrouping: false
175+
},
176+
});
177+
getJsonFormsService(component).updateCore(
178+
Actions.init(state.data, state.schema)
179+
);
180+
component.ngOnInit();
181+
fixture.detectChanges();
182+
183+
expect(numberNativeElement.value).toBe('1000000');
184+
});
185+
it('should use uischema for grouping', () => {
186+
const uischema = Object.assign({},defaultUischema);
187+
uischema.options = {
188+
useGrouping: false
189+
}
190+
component.uischema = uischema;
191+
const state:JsonFormsCore = {
192+
data: defaultData,
193+
schema: defaultSchema,
194+
uischema: uischema
195+
};
196+
getJsonFormsService(component).init({
197+
core: state, i18n: {
198+
locale: 'en',
199+
localizedSchemas: undefined,
200+
localizedUISchemas: undefined
201+
},config: {
202+
useGrouping: true
203+
},
204+
});
205+
getJsonFormsService(component).updateCore(
206+
Actions.init(state.data, state.schema)
207+
);
208+
component.ngOnInit();
209+
fixture.detectChanges();
210+
211+
expect(numberNativeElement.value).toBe('1000000');
212+
});
213+
}
214+
);

packages/angular-test/src/number.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ interface ComponentResult<C extends JsonFormsControl> {
4343
numberNativeElement?: any;
4444
}
4545

46-
const prepareComponent = <C extends JsonFormsControl>(
46+
export const prepareComponent = <C extends JsonFormsControl>(
4747
testConfig: TestConfig<C>,
4848
instance?: string,
4949
elementToUse?: (element: DebugElement) => any

0 commit comments

Comments
 (0)