From 2684958a5184c92d5f3e8c1feae741ffb71f326f Mon Sep 17 00:00:00 2001 From: Alexander Gebuhr <65446776+AlexanderGebuhr@users.noreply.github.com> Date: Fri, 14 May 2021 11:25:29 +0200 Subject: [PATCH 001/374] Extended constructors of dynamic form elements with parameter for dynamic form build --- .../dynamic-form-action-base.spec.ts | 33 +++--- .../dynamic-form-action.spec.ts | 31 ++++-- .../dynamic-form-action.ts | 5 +- .../dynamic-form-button-base.spec.ts | 6 +- .../dynamic-form-icon-base.spec.ts | 7 +- .../dynamic-form-array.component.spec.ts | 10 +- .../dynamic-form-array.spec.ts | 99 +++++++++-------- .../dynamic-form-array/dynamic-form-array.ts | 5 +- ...ynamic-form-control-evaluator-type.spec.ts | 7 +- .../dynamic-form-control.component.spec.ts | 7 +- .../dynamic-form-control.spec.ts | 103 ++++++++++-------- .../dynamic-form-control.ts | 5 +- .../dynamic-form-dictionary.component.spec.ts | 9 +- .../dynamic-form-dictionary.spec.ts | 79 ++++++++------ .../dynamic-form-dictionary.ts | 5 +- .../dynamic-form-container.component.spec.ts | 6 +- .../dynamic-form-content.component.spec.ts | 6 +- .../dynamic-form-element-base.spec.ts | 5 +- .../dynamic-form-element.component.spec.ts | 5 +- .../dynamic-form-element.spec.ts | 23 ++-- .../dynamic-form-element.ts | 10 +- .../dynamic-form-accordion-base.spec.ts | 5 +- .../dynamic-form-item.spec.ts | 19 +++- .../dynamic-form-items/dynamic-form-item.ts | 5 +- .../dynamic-form-items-base.spec.ts | 9 +- .../dynamic-form-items-factory.ts | 4 +- .../dynamic-form-items.spec.ts | 19 +++- .../dynamic-form-items/dynamic-form-items.ts | 5 +- .../dynamic-form-markdown.component.spec.ts | 5 +- .../dynamic-form-modal-base.spec.ts | 11 +- .../dynamic-form-modal-factory.ts | 2 +- .../dynamic-form-modal.spec.ts | 25 +++-- .../dynamic-form-modal/dynamic-form-modal.ts | 5 +- .../dynamic-form-field.spec.ts | 57 +++++----- .../dynamic-form-field/dynamic-form-field.ts | 5 +- .../dynamic-form-group.component.spec.ts | 7 +- .../dynamic-form-group.spec.ts | 51 +++++---- .../dynamic-form-group/dynamic-form-group.ts | 5 +- .../dynamic-form-input-base.spec.ts | 9 +- .../dynamic-form/dynamic-form.builder.spec.ts | 2 +- .../lib/dynamic-form/dynamic-form.builder.ts | 16 +-- .../src/lib/dynamic-form/dynamic-form.spec.ts | 23 ++-- .../core/src/lib/dynamic-form/dynamic-form.ts | 5 +- 43 files changed, 456 insertions(+), 304 deletions(-) diff --git a/libs/core/src/lib/dynamic-form-action/dynamic-form-action-base.spec.ts b/libs/core/src/lib/dynamic-form-action/dynamic-form-action-base.spec.ts index 819240c8e..f4b085768 100644 --- a/libs/core/src/lib/dynamic-form-action/dynamic-form-action-base.spec.ts +++ b/libs/core/src/lib/dynamic-form-action/dynamic-form-action-base.spec.ts @@ -1,6 +1,7 @@ import { DynamicFormLibraryService } from '../dynamic-form-library/dynamic-form-library.service'; import { DynamicForm } from '../dynamic-form/dynamic-form'; import { DynamicFormDefinition } from '../dynamic-form/dynamic-form-definition'; +import { DynamicFormBuilder } from '../dynamic-form/dynamic-form.builder'; import { DynamicFormAction } from './dynamic-form-action'; import { DynamicFormActionBase } from './dynamic-form-action-base'; import { DynamicFormActionDefinition } from './dynamic-form-action-definition'; @@ -13,19 +14,21 @@ class DynamicFormActionTestComponent extends DynamicFormActionBase { } describe('DynamicFormActionBase', () => { + let builder: DynamicFormBuilder; let actionService: DynamicFormActionService; let component: DynamicFormActionTestComponent; beforeEach(() => { const libraryService = new DynamicFormLibraryService({ name: 'test' }); + builder = {} as any; actionService = new DynamicFormActionService(libraryService, []); component = new DynamicFormActionTestComponent(actionService); }); it('creates instance', () => { const definition = { id: 'id', type: 'element', template: {} } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); component.action = action; @@ -50,8 +53,8 @@ describe('DynamicFormActionBase', () => { it('creates instance with dialog', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { id: 'id', type: 'element', template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); action.initDialog(dialog); @@ -77,7 +80,7 @@ describe('DynamicFormActionBase', () => { it('open, close, and toggle dialog throws if no dialog', () => { const definition = { id: 'id', type: 'element', template: {} } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); component.action = action; @@ -89,8 +92,8 @@ describe('DynamicFormActionBase', () => { it('opens, closes and toggles dialog', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, null, null, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); action.initDialog(dialog); component.action = action; @@ -111,8 +114,8 @@ describe('DynamicFormActionBase', () => { it('checks dialog', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { id: 'id', type: 'element', template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); action.initDialog(dialog); action.openDialog(); @@ -128,8 +131,8 @@ describe('DynamicFormActionBase', () => { it('does not check dialog if not open', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { id: 'id', type: 'element', template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); action.initDialog(dialog); @@ -143,7 +146,7 @@ describe('DynamicFormActionBase', () => { it('handles event by calling handle of action service', () => { const definition = { id: 'id', type: 'element', template: {} } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); const event = {} as Event; spyOn(actionService, 'handle'); @@ -157,8 +160,8 @@ describe('DynamicFormActionBase', () => { it('handles event by calling handle of action service if dialog and dialog is open', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { id: 'id', type: 'element', template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); const event = {} as Event; action.initDialog(dialog); @@ -177,8 +180,8 @@ describe('DynamicFormActionBase', () => { it('handles event by calling openDialog of action if dialog but dialog not open', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { id: 'id', type: 'element', template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction({} as any, {} as any, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, {} as any, {} as any, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); const event = {} as Event; action.initDialog(dialog); diff --git a/libs/core/src/lib/dynamic-form-action/dynamic-form-action.spec.ts b/libs/core/src/lib/dynamic-form-action/dynamic-form-action.spec.ts index d4e1123b3..ff83a2d86 100644 --- a/libs/core/src/lib/dynamic-form-action/dynamic-form-action.spec.ts +++ b/libs/core/src/lib/dynamic-form-action/dynamic-form-action.spec.ts @@ -2,17 +2,24 @@ import { DynamicFormField } from '../dynamic-form-field/dynamic-form-field'; import { DynamicFormFieldExpressionData } from '../dynamic-form-field/dynamic-form-field-expression-data'; import { DynamicForm } from '../dynamic-form/dynamic-form'; import { DynamicFormDefinition } from '../dynamic-form/dynamic-form-definition'; +import { DynamicFormBuilder } from '../dynamic-form/dynamic-form.builder'; import { DynamicFormAction } from './dynamic-form-action'; import { DynamicFormActionDefinition } from './dynamic-form-action-definition'; import { DynamicFormActionExpression } from './dynamic-form-action-expression'; import { DynamicFormActionExpressions } from './dynamic-form-action-expressions'; describe('DynamicFormAction', () => { + let builder: DynamicFormBuilder; + + beforeEach(() => { + builder = {} as any; + }); + it('creates instance', () => { const root = { classType: 'field' } as DynamicForm; const parent = { classType: 'field' } as DynamicFormField; const definition = { id: 'id', type: 'componentType', template: {}, children: [] } as DynamicFormActionDefinition; - const action = new DynamicFormAction(root, parent, definition); + const action = new DynamicFormAction(builder, root, parent, definition); expect(action.root).toBe(root); expect(action.parent).toBe(parent); @@ -43,7 +50,7 @@ describe('DynamicFormAction', () => { it('returns expression data with expression data of parent, root and dialog being undefined', () => { const definition = { template: {} } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); + const action = new DynamicFormAction(builder, null, null, definition); expect(action.expressionData.parent).toBeUndefined(); expect(action.expressionData.root).toBeUndefined(); @@ -58,7 +65,7 @@ describe('DynamicFormAction', () => { const parent = { expressionData: parentExpressionData } as DynamicFormField; const dialog = { expressionData: dialogExpressionData } as DynamicForm; const definition = { template: {} } as DynamicFormActionDefinition; - const action = new DynamicFormAction(root, parent, definition); + const action = new DynamicFormAction(builder, root, parent, definition); action.initDialog(dialog); expect(action.expressionData.parent).toEqual(parentExpressionData); @@ -68,7 +75,7 @@ describe('DynamicFormAction', () => { it('inits expressions', () => { const definition = { template: {} } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); + const action = new DynamicFormAction(builder, null, null, definition); const actionExpressions = { 'hidden': { value: true } as DynamicFormActionExpression, 'disabled': { value: false } as DynamicFormActionExpression @@ -84,8 +91,8 @@ describe('DynamicFormAction', () => { it('inits dialog', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, null, null, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); action.initDialog(dialog); @@ -107,7 +114,7 @@ describe('DynamicFormAction', () => { it('open, close and toggle dialog do not throw if no dialog', () => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); + const action = new DynamicFormAction(builder, null, null, definition); expect(() => action.openDialog()).not.toThrow(); expect(() => action.closeDialog()).not.toThrow(); @@ -117,8 +124,8 @@ describe('DynamicFormAction', () => { it('opens, closes and toggles dialog', (done) => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, null, null, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); const dialogOpenChanges = []; action.dialogOpenChanges.subscribe(open => { @@ -146,8 +153,8 @@ describe('DynamicFormAction', () => { it('dialogOpenChange ', (done) => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); - const dialog = new DynamicForm(dialogDefinition, {}); + const action = new DynamicFormAction(builder, null, null, definition); + const dialog = new DynamicForm(builder, dialogDefinition, {}); const dialogOpenChanges = []; action.dialogOpenChanges.subscribe(open => { @@ -171,7 +178,7 @@ describe('DynamicFormAction', () => { it('does not open, close or toggle dialog', (done) => { const dialogDefinition = { template: {} } as DynamicFormDefinition; const definition = { template: {}, dialogDefinition } as DynamicFormActionDefinition; - const action = new DynamicFormAction(null, null, definition); + const action = new DynamicFormAction(builder, null, null, definition); const dialogOpenChanges = []; action.dialogOpenChanges.subscribe(open => { diff --git a/libs/core/src/lib/dynamic-form-action/dynamic-form-action.ts b/libs/core/src/lib/dynamic-form-action/dynamic-form-action.ts index 1c4a306df..063c679c0 100644 --- a/libs/core/src/lib/dynamic-form-action/dynamic-form-action.ts +++ b/libs/core/src/lib/dynamic-form-action/dynamic-form-action.ts @@ -5,6 +5,7 @@ import { assignExpressionData } from '../dynamic-form-expression/dynamic-form-ex import { DynamicForm } from '../dynamic-form/dynamic-form'; import { DynamicFormDefinition } from '../dynamic-form/dynamic-form-definition'; import { DynamicFormTemplate } from '../dynamic-form/dynamic-form-template'; +import { DynamicFormBuilder } from '../dynamic-form/dynamic-form.builder'; import { DynamicFormActionDefinition } from './dynamic-form-action-definition'; import { DynamicFormActionExpressionData } from './dynamic-form-action-expression-data'; import { DynamicFormActionExpressions } from './dynamic-form-action-expressions'; @@ -20,8 +21,8 @@ export class DynamicFormAction< protected _dialog: DynamicForm; - constructor(root: DynamicForm, parent: DynamicFormElement, definition: Definition) { - super(root, parent, definition); + constructor(builder: DynamicFormBuilder, root: DynamicForm, parent: DynamicFormElement, definition: Definition) { + super(builder, root, parent, definition); this._dialogOpenSubject = new BehaviorSubject(false); this._dialogOpenChanges = this._dialogOpenSubject.asObservable(); } diff --git a/libs/core/src/lib/dynamic-form-action/dynamic-form-button/dynamic-form-button-base.spec.ts b/libs/core/src/lib/dynamic-form-action/dynamic-form-button/dynamic-form-button-base.spec.ts index d9bbcf6f7..78a5ad342 100644 --- a/libs/core/src/lib/dynamic-form-action/dynamic-form-button/dynamic-form-button-base.spec.ts +++ b/libs/core/src/lib/dynamic-form-action/dynamic-form-button/dynamic-form-button-base.spec.ts @@ -4,6 +4,7 @@ import { By } from '@angular/platform-browser'; import { DynamicFormField } from '../../dynamic-form-field/dynamic-form-field'; import { DynamicFormLibraryService } from '../../dynamic-form-library/dynamic-form-library.service'; import { DynamicForm } from '../../dynamic-form/dynamic-form'; +import { DynamicFormBuilder } from '../../dynamic-form/dynamic-form.builder'; import { DynamicFormAction } from '../dynamic-form-action'; import { DynamicFormActionService } from '../dynamic-form-action.service'; import { DynamicFormButtonBase } from './dynamic-form-button-base'; @@ -30,6 +31,7 @@ describe('DynamicFormButtonBase', () => { let fixture: ComponentFixture; let component: DynamicFormButtonTestComponent; let element: DynamicFormAction; + let builder: DynamicFormBuilder; beforeEach(() => { TestBed.configureTestingModule({ @@ -48,11 +50,13 @@ describe('DynamicFormButtonBase', () => { fixture = TestBed.createComponent(DynamicFormButtonTestComponent); component = fixture.componentInstance; + builder = {} as any; + const root = {} as DynamicForm; const parent = {} as DynamicFormField; const template = { label: 'label' } as DynamicFormButtonTemplate; const definition = { type: 'element', template } as DynamicFormButtonDefinition; - element = new DynamicFormAction(root, parent, definition); + element = new DynamicFormAction(builder, root, parent, definition); component.element = element; fixture.detectChanges(); diff --git a/libs/core/src/lib/dynamic-form-action/dynamic-form-icon/dynamic-form-icon-base.spec.ts b/libs/core/src/lib/dynamic-form-action/dynamic-form-icon/dynamic-form-icon-base.spec.ts index 9ae6a5de7..9c6abcb35 100644 --- a/libs/core/src/lib/dynamic-form-action/dynamic-form-icon/dynamic-form-icon-base.spec.ts +++ b/libs/core/src/lib/dynamic-form-action/dynamic-form-icon/dynamic-form-icon-base.spec.ts @@ -4,6 +4,7 @@ import { By } from '@angular/platform-browser'; import { DynamicFormField } from '../../dynamic-form-field/dynamic-form-field'; import { DynamicFormLibraryService } from '../../dynamic-form-library/dynamic-form-library.service'; import { DynamicForm } from '../../dynamic-form/dynamic-form'; +import { DynamicFormBuilder } from '../../dynamic-form/dynamic-form.builder'; import { DynamicFormAction } from '../dynamic-form-action'; import { DynamicFormActionService } from '../dynamic-form-action.service'; import { DynamicFormIconBase } from './dynamic-form-icon-base'; @@ -26,11 +27,11 @@ class DynamicFormIconTestComponent extends DynamicFormIconBase { } } - describe('DynamicFormIconBase', () => { let fixture: ComponentFixture; let component: DynamicFormIconTestComponent; let element: DynamicFormAction; + let builder: DynamicFormBuilder; beforeEach(() => { TestBed.configureTestingModule({ @@ -49,11 +50,13 @@ describe('DynamicFormIconBase', () => { fixture = TestBed.createComponent(DynamicFormIconTestComponent); component = fixture.componentInstance; + builder = {} as any; + const root = {} as DynamicForm; const parent = {} as DynamicFormField; const template = { label: 'label' } as DynamicFormIconTemplate; const definition = { type: 'element', template } as DynamicFormIconDefinition; - element = new DynamicFormAction(root, parent, definition); + element = new DynamicFormAction(builder, root, parent, definition); component.element = element; fixture.detectChanges(); diff --git a/libs/core/src/lib/dynamic-form-array/dynamic-form-array.component.spec.ts b/libs/core/src/lib/dynamic-form-array/dynamic-form-array.component.spec.ts index 48d939e11..971fc64b3 100644 --- a/libs/core/src/lib/dynamic-form-array/dynamic-form-array.component.spec.ts +++ b/libs/core/src/lib/dynamic-form-array/dynamic-form-array.component.spec.ts @@ -16,8 +16,11 @@ describe('DynamicFormArrayComponent', () => { let component: DynamicFormArrayComponent; let form: DynamicForm; let formArray: DynamicFormArray; + let builder: DynamicFormBuilder; beforeEach(() => { + builder = {} as any; + TestBed.configureTestingModule({ imports: [ DynamicFormArrayModule @@ -30,7 +33,7 @@ describe('DynamicFormArrayComponent', () => { DynamicFormConfigService, { provide: DynamicFormBuilder, - useValue: {} + useValue: builder }, DynamicFormValidationService ] @@ -39,8 +42,9 @@ describe('DynamicFormArrayComponent', () => { fixture = TestBed.createComponent(DynamicFormArrayComponent); component = fixture.componentInstance; - form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - formArray = new DynamicFormArray(form, form, { + + form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + formArray = new DynamicFormArray(builder, form, form, { id: 'id', key: 'key', index: 1, diff --git a/libs/core/src/lib/dynamic-form-array/dynamic-form-array.spec.ts b/libs/core/src/lib/dynamic-form-array/dynamic-form-array.spec.ts index d8e15fa6e..10d08f771 100644 --- a/libs/core/src/lib/dynamic-form-array/dynamic-form-array.spec.ts +++ b/libs/core/src/lib/dynamic-form-array/dynamic-form-array.spec.ts @@ -2,14 +2,21 @@ import { FormControl } from '@angular/forms'; import { DynamicFormField } from '../dynamic-form-field/dynamic-form-field'; import { DynamicForm } from '../dynamic-form/dynamic-form'; import { DynamicFormDefinition } from '../dynamic-form/dynamic-form-definition'; +import { DynamicFormBuilder } from '../dynamic-form/dynamic-form.builder'; import { DynamicFormArray } from './dynamic-form-array'; import { DynamicFormArrayDefinition } from './dynamic-form-array-definition'; describe('DynamicFormArray', () => { + let builder: DynamicFormBuilder; + + beforeEach(() => { + builder = {} as any; + }); + it('creates instance', () => { const definition = { id: 'id', key: 'key', index: 1, type: 'componentType', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); expect(formArray.root).toBe(form); expect(formArray.parent).toBe(form); @@ -41,24 +48,24 @@ describe('DynamicFormArray', () => { it('sets model to default value', () => { const defaultValue = [ { value: 0 }, { value: 1 } ]; const definition = { key: 'key', template: {}, defaultValue } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); expect(formArray.model).toEqual(defaultValue); }); it('sets model to default length', () => { const definition = { key: 'key', template: {}, defaultLength: 2 } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); expect(formArray.model).toEqual([ undefined, undefined ]); }); it('returns expression data with id, key, index and model', () => { const definition = { id: 'id', key: 'key', index: 1, type: 'componentType', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); expect(formArray.expressionData.id).toBe('id'); expect(formArray.expressionData.key).toBe('key'); @@ -69,8 +76,8 @@ describe('DynamicFormArray', () => { it('inits children and fields', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl() } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl() } as DynamicFormField @@ -84,8 +91,8 @@ describe('DynamicFormArray', () => { it('inits children and fields with empty array', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); formArray.initChildren(null); @@ -95,8 +102,8 @@ describe('DynamicFormArray', () => { it('pushes field', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl() } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl() } as DynamicFormField @@ -118,8 +125,8 @@ describe('DynamicFormArray', () => { it('pops field', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), destroy(): void {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), destroy(): void {} } as DynamicFormField @@ -144,8 +151,8 @@ describe('DynamicFormArray', () => { it('does not pop field if length is zero', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); spyOn(formArray.children, 'pop'); spyOn(formArray.model, 'pop'); @@ -162,8 +169,8 @@ describe('DynamicFormArray', () => { it('removes field', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), destroy(): void {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), destroy(): void {} } as DynamicFormField, @@ -199,8 +206,8 @@ describe('DynamicFormArray', () => { it('does not remove field if index is invalid', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); spyOn(formArray.children, 'splice'); spyOn(formArray.model, 'splice'); @@ -217,8 +224,8 @@ describe('DynamicFormArray', () => { it('clears fields', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), destroy(): void {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), destroy(): void {} } as DynamicFormField @@ -242,8 +249,8 @@ describe('DynamicFormArray', () => { it('does not clear fields if length is zero', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); spyOn(formArray.control, 'clear'); spyOn(formArray.control, 'markAsTouched'); @@ -256,8 +263,8 @@ describe('DynamicFormArray', () => { it('moves field down', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: { index: 0 }, control: new FormControl() } as DynamicFormField, { classType: 'field', definition: { index: 1 }, control: new FormControl() } as DynamicFormField @@ -281,8 +288,8 @@ describe('DynamicFormArray', () => { it('does not move field down', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: { index: 0 }, control: new FormControl() } as DynamicFormField, ]; @@ -303,8 +310,8 @@ describe('DynamicFormArray', () => { it('moves field up', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: { index: 0 }, control: new FormControl() } as DynamicFormField, { classType: 'field', definition: { index: 1 }, control: new FormControl() } as DynamicFormField @@ -326,8 +333,8 @@ describe('DynamicFormArray', () => { it('does not move field up', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: { index: 0 }, control: new FormControl() } as DynamicFormField, ]; @@ -348,8 +355,8 @@ describe('DynamicFormArray', () => { it('check calls check of all fields', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), check: () => {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), check: () => {} } as DynamicFormField @@ -367,8 +374,8 @@ describe('DynamicFormArray', () => { it('destroy calls destroy of all fields', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), destroy: () => {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), destroy: () => {} } as DynamicFormField @@ -386,8 +393,8 @@ describe('DynamicFormArray', () => { it('reset calls reset of all fields', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), reset: () => {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), reset: () => {} } as DynamicFormField @@ -405,8 +412,8 @@ describe('DynamicFormArray', () => { it('resetDefault calls resetDefault of all fields', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), resetDefault: () => {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), resetDefault: () => {} } as DynamicFormField @@ -425,8 +432,8 @@ describe('DynamicFormArray', () => { it('resetDefault calls patchValue of field if default value', () => { const defaultValue = [ { value: 0 }, { value: 1 } ]; const definition = { key: 'key', template: {}, defaultValue } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), resetDefault: () => {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), resetDefault: () => {} } as DynamicFormField @@ -444,8 +451,8 @@ describe('DynamicFormArray', () => { it('validate calls validate of all fields', () => { const definition = { key: 'key', template: {} } as DynamicFormArrayDefinition; - const form = new DynamicForm({ children: [] } as DynamicFormDefinition, {}); - const formArray = new DynamicFormArray(form, form, definition); + const form = new DynamicForm(builder, { children: [] } as DynamicFormDefinition, {}); + const formArray = new DynamicFormArray(builder, form, form, definition); const fields = [ { classType: 'field', definition: {}, control: new FormControl(), validate: () => {} } as DynamicFormField, { classType: 'field', definition: {}, control: new FormControl(), validate: () => {} } as DynamicFormField diff --git a/libs/core/src/lib/dynamic-form-array/dynamic-form-array.ts b/libs/core/src/lib/dynamic-form-array/dynamic-form-array.ts index 34a3c1e1e..e42416dfe 100644 --- a/libs/core/src/lib/dynamic-form-array/dynamic-form-array.ts +++ b/libs/core/src/lib/dynamic-form-array/dynamic-form-array.ts @@ -3,6 +3,7 @@ import { DynamicFormElement } from '../dynamic-form-element/dynamic-form-element import { DynamicFormField } from '../dynamic-form-field/dynamic-form-field'; import { DynamicFormFieldClassType } from '../dynamic-form-field/dynamic-form-field-class-type'; import { DynamicForm } from '../dynamic-form/dynamic-form'; +import { DynamicFormBuilder } from '../dynamic-form/dynamic-form.builder'; import { DynamicFormArrayDefinition } from './dynamic-form-array-definition'; import { DynamicFormArrayTemplate } from './dynamic-form-array-template'; @@ -11,8 +12,8 @@ export class DynamicFormArray< Definition extends DynamicFormArrayDefinition