Skip to content

Commit 7d4102b

Browse files
Feature/write form from type (#114)
* feat(rxformmapper): create form from type * test(rxformmapper): test fromType method * docs: add fromType documentation
1 parent 4297485 commit 7d4102b

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,14 @@ This method converts our class instance into reactive form instance
163163
this.form = formMapper.writeForm(new Post());
164164
```
165165

166+
### fromType
167+
168+
This method converts our class type into reactive form instance
169+
170+
```typescript
171+
this.form = formMapper.fromType(Post);
172+
```
173+
166174
### readForm
167175

168176
This method converts our form instance into specific class instance

projects/rx-form-mapper/src/lib/services/rx-form-mapper.service.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,19 @@ import { ValidatorResolver } from './validator-resolver';
99

1010
@Injectable()
1111
export class RxFormMapper {
12-
constructor(private readonly customMapperResolver: CustomMapperResolver, private readonly validatorResolver: ValidatorResolver) {}
12+
public constructor(
13+
private readonly customMapperResolver: CustomMapperResolver,
14+
private readonly validatorResolver: ValidatorResolver
15+
) {}
16+
17+
public fromType<T>(type: Type<T>): FormGroup {
18+
if (isNil(type)) {
19+
throw new Error('type cannot be inferred implicitly');
20+
}
21+
22+
const formWriter = new FormWriter(void(0), this.customMapperResolver, this.validatorResolver);
23+
return ModelBinder.instance.getMetadata(type).accept(formWriter) as FormGroup;
24+
}
1325

1426
public writeForm<T>(value: T): FormGroup;
1527
public writeForm<T>(value: T, type: Type<T>): FormGroup;

projects/rx-form-mapper/src/lib/tests/rx-form-mapper.spec.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,29 @@ describe('RxFormMapper', () => {
4040
expect(formMapper.writeForm(new Test(), Test)).toBeTruthy();
4141
}));
4242

43-
it('writeModel should not accept undefined type', inject([RxFormMapper], (mapper: RxFormMapper) => {
43+
it('fromType should create form', inject([RxFormMapper], (formMapper: RxFormMapper) => {
44+
class Test {
45+
@FormControl()
46+
public name: string;
47+
}
48+
49+
expect(formMapper.fromType(Test).get('name')).toBeTruthy();
50+
}));
51+
52+
it('fromType should throw error', inject([RxFormMapper], (formMapper: RxFormMapper) => {
53+
class Test {
54+
@FormControl()
55+
public name: string;
56+
}
57+
58+
expect(() => formMapper.fromType(null)).toThrow();
59+
}));
60+
61+
it('writeForm should not accept undefined type', inject([RxFormMapper], (mapper: RxFormMapper) => {
4462
expect(() => mapper.writeForm(null, null)).toThrow();
4563
}));
4664

47-
it('writeModel should return FormGroup', inject([RxFormMapper], (mapper: RxFormMapper) => {
65+
it('writeForm should return FormGroup', inject([RxFormMapper], (mapper: RxFormMapper) => {
4866
class TestClass {}
4967
expect(mapper.writeForm(null, TestClass) instanceof NgFormGroup).toBeTruthy();
5068
}));

0 commit comments

Comments
 (0)