Skip to content

Commit

Permalink
refactor(forms): provide control components directly
Browse files Browse the repository at this point in the history
Blocked by runtime error:
ReferenceError: Cannot access 'DynControl' before initialization
  • Loading branch information
matheo committed Aug 27, 2022
1 parent bf11c77 commit afd045f
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 7 deletions.
7 changes: 7 additions & 0 deletions libs/forms/core/src/dyn-control-wrapper.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ export interface DynWrapperProvider extends DynBaseProvider {
component: Type<AbstractDynWrapper>;
}

export type DynWrapperArg = Type<AbstractDynWrapper> | DynWrapperProvider;

export function isWrapperProvider(obj: any): obj is DynWrapperProvider {
return Object.prototype.hasOwnProperty.call(obj, 'wrapper')
&& Object.prototype.hasOwnProperty.call(obj, 'component');
}

@Directive()
export abstract class DynWrapper<
TParams extends DynParams = DynParams,
Expand Down
8 changes: 8 additions & 0 deletions libs/forms/core/src/dyn-control.class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ export interface DynControlProvider extends DynBaseProvider {
component: Type<AbstractDynControl>;
}

export type DynControlArg = Type<AbstractDynControl> | DynControlProvider;

export function isControlProvider(obj: any): obj is DynControlProvider {
return Object.prototype.hasOwnProperty.call(obj, 'component')
&& Object.prototype.hasOwnProperty.call(obj, 'control')
&& Object.prototype.hasOwnProperty.call(obj, 'instance');
}

@Directive()
export abstract class DynControl<
TMode extends DynMode = DynMode,
Expand Down
27 changes: 27 additions & 0 deletions libs/forms/core/src/dyn-providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,33 @@ import {
DynValidator,
} from './types/validation.types';
import { isPlainObject } from './utils/merge.util';
import { DynControlArg, DynControlProvider, isControlProvider } from './dyn-control.class';
import { DynWrapperArg, DynWrapperProvider, isWrapperProvider } from './dyn-control-wrapper.class';

/**
* Mapper from plain Type<T> to DynControlProvider
*/
export function mapControls<T extends DynControlArg>() {
return (control: T): DynControlProvider => !isControlProvider(control)
? {
component: control,
control: (control as any).dynControl,
instance: (control as any).dynInstance,
}
: control;
}

/**
* Mapper from plain Type<T> to DynWrapperProvider
*/
export function mapWrappers<T extends DynWrapperArg>() {
return (wrapper: T): DynWrapperProvider => !isWrapperProvider(wrapper)
? {
component: wrapper,
wrapper: (wrapper as any).dynWrapper,
}
: wrapper;
}

/**
* Mapper to add the incoming priority
Expand Down
14 changes: 7 additions & 7 deletions libs/forms/core/src/module.providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import { DynLogDriver, DynLogger, DynLogLevel, DYN_LOG_LEVEL } from '@myndpm/dyn
import { DynCondition, DynMatcher } from './types/matcher.types';
import { DynFunction } from './types/params.types';
import { DynAsyncValidator, DynErrorHandler, DynValidator } from './types/validation.types';
import { DynControlProvider } from './dyn-control.class';
import { DynWrapperProvider } from './dyn-control-wrapper.class';
import { mapPriority } from './dyn-providers';
import { DynControlArg } from './dyn-control.class';
import { DynWrapperArg } from './dyn-control-wrapper.class';
import { mapControls, mapPriority, mapWrappers } from './dyn-providers';
import { DynFormFactory } from './form-factory.service';
import { DynFormHandlers } from './form-handlers.service';
import { DynFormRegistry } from './form-registry.service';
Expand All @@ -22,8 +22,8 @@ import {

export interface DynModuleProviders {
providers?: Provider[];
controls?: DynControlProvider[];
wrappers?: DynWrapperProvider[];
controls?: DynControlArg[];
wrappers?: DynWrapperArg[];
errorHandlers?: DynErrorHandler[];
functions?: DynFunction[];
validators?: DynValidator[];
Expand All @@ -47,12 +47,12 @@ export function getModuleProviders(args?: DynModuleProviders): Provider[] {
DynFormHandlers,
DynFormFactory,
...args?.providers ?? [],
...args?.controls?.map(mapPriority(args?.priority)).map((control) => ({
...args?.controls?.map(mapControls()).map(mapPriority(args?.priority)).map((control) => ({
provide: DYN_CONTROLS_TOKEN,
useValue: control,
multi: true,
})) ?? [],
...args?.wrappers?.map(mapPriority(args?.priority)).map((wrapper) => ({
...args?.wrappers?.map(mapWrappers()).map(mapPriority(args?.priority)).map((wrapper) => ({
provide: DYN_WRAPPERS_TOKEN,
useValue: wrapper,
multi: true,
Expand Down

0 comments on commit afd045f

Please sign in to comment.