diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html index 259538820b..82d438b7cc 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html @@ -1,23 +1,42 @@ - - - - - + + + + +
+ +
- - - -
+ + + +
+
+ + + + + + + + + + + + + + + diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts index 17131e9aaf..4e95039889 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts @@ -12,7 +12,7 @@ import { } from '@angular/core'; import { ControlContainer, FormGroup } from '@angular/forms'; import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties'; -import { FormPropList } from '../../models/form-props'; +import { FormPropList, GroupedFormPropList } from '../../models/form-props'; import { ExtensionsService } from '../../services/extensions.service'; import { EXTENSIONS_IDENTIFIER } from '../../tokens/extensions.token'; import { selfFactory } from '../../utils/factory.util'; @@ -38,14 +38,23 @@ export class ExtensibleFormComponent { @Input() set selectedRecord(record: R) { const type = !record || JSON.stringify(record) === '{}' ? 'create' : 'edit'; - this.propList = this.extensions[`${type}FormProps`].get(this.identifier).props; + const propList = this.extensions[`${type}FormProps`].get(this.identifier).props; + this.groupedPropList = this.createGroupedList(propList); this.record = record; } extraPropertiesKey = EXTRA_PROPERTIES_KEY; - propList!: FormPropList; + groupedPropList: GroupedFormPropList; record!: R; + createGroupedList(propList: FormPropList) { + const groupedFormPropList = new GroupedFormPropList(); + propList.forEach(item => { + groupedFormPropList.addItem(item.value); + }); + return groupedFormPropList; + } + get form(): FormGroup { return (this.container ? this.container.control : { controls: {} }) as FormGroup; } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts index 44b309d0c2..9973974ab6 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts @@ -21,6 +21,34 @@ export class FormProps extends Props> { protected _ctor: Type> = FormPropList; } +export interface FormPropGroup { + name: string; + className?: string; +} + +export class GroupedFormPropList { + public readonly items: GroupedFormPropItem[] = []; + addItem(item: FormProp) { + const groupName = item.group?.name; + let group = this.items.find(i => i.group?.name === groupName); + if (group) { + group.formPropList.addTail(item); + } else { + group = { + formPropList: new FormPropList(), + group: item.group, + }; + group.formPropList.addHead(item); + this.items.push(group); + } + } +} + +export interface GroupedFormPropItem { + group: FormPropGroup; + formPropList: FormPropList; +} + export class CreateFormPropsFactory extends PropsFactory> { protected _ctor: Type> = FormProps; } @@ -38,6 +66,7 @@ export class FormProp extends Prop { readonly defaultValue: boolean | number | string | Date; readonly options: PropCallback[]>> | undefined; readonly id: string | undefined; + readonly group?: FormPropGroup | undefined; constructor(options: FormPropOptions) { super( @@ -48,6 +77,7 @@ export class FormProp extends Prop { options.visible, options.isExtra, ); + this.group = options.group; this.asyncValidators = options.asyncValidators || (_ => []); this.validators = options.validators || (_ => []);