Browse Source

Merge pull request #13839 from abpframework/issue/13834

Add grouping ability to extensible-form.component.html
pull/14050/head
Muhammed Altuğ 4 years ago
committed by GitHub
parent
commit
6b053bb621
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html
  2. 7
      npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts
  3. 56
      npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html
  4. 15
      npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts
  5. 31
      npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts

1
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html

@ -1,4 +1,5 @@
<ng-container [ngSwitch]="getComponent(prop)"
[ngClass]="containerClassName"
*abpPermission="prop.permission; runChangeDetection: false">
<ng-template ngSwitchCase="template">

7
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts

@ -60,6 +60,8 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
asterisk = '';
containerClassName = 'mb-3 form-group'
options$: Observable<ABP.Option<any>[]> = of([]);
validators: ValidatorFn[] = [];
@ -183,7 +185,7 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
ngOnChanges({ prop, data }: SimpleChanges) {
const currentProp = prop?.currentValue as FormProp;
const { options, readonly, disabled, validators, template } = currentProp || {};
const { options, readonly, disabled, validators, className, template } = currentProp || {};
if (template) {
this.injectorForCustomComponent = Injector.create({
providers: [
@ -211,6 +213,9 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
this.validators = validators(this.data);
this.setAsterisk();
}
if(className !== undefined){
this.containerClassName = className;
}
const [keyControl, valueControl] = this.getTypeaheadControls();
if (keyControl && valueControl)

56
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html

@ -1,23 +1,45 @@
<ng-container *ngIf="form">
<ng-container *abpPropData="let data; fromList: propList; withRecord: record">
<ng-container *ngFor="let prop of propList; let first = first; trackBy: track.by('name')">
<ng-container *ngIf="prop.visible(data)">
<ng-container
[formGroupName]="extraPropertiesKey"
*ngIf="extraProperties.controls[prop.name]; else tempDefault"
>
<abp-extensible-form-prop [class]="prop.className" [prop]="prop" [data]="data"></abp-extensible-form-prop>
<ng-container *ngFor="let groupedProp of groupedPropList.items">
<ng-container *abpPropData="let data; fromList: groupedProp.formPropList; withRecord: record">
<div *ngIf="groupedProp.group?.className; else withoutClassName"
[class]="groupedProp.group?.className" [attr.data-name]="groupedProp.group?.className">
<ng-container [ngTemplateOutlet]="propListTemplate" [ngTemplateOutletContext]="{groupedProp:groupedProp,data:data}">
</ng-container>
</div>
<ng-template #tempDefault>
<abp-extensible-form-prop [class]="prop.className"
*ngIf="form.get(prop.name)"
[prop]="prop"
[data]="data"
[first]="first"
></abp-extensible-form-prop>
</ng-template>
</ng-container>
<ng-template #withoutClassName>
<ng-container [ngTemplateOutlet]="propListTemplate" [ngTemplateOutletContext]="{groupedProp:groupedProp,data:data}">
</ng-container>
</ng-template>
</ng-container>
</ng-container>
</ng-container>
<ng-template let-groupedProp="groupedProp" let-data="data" #propListTemplate>
<ng-container *ngFor="let prop of groupedProp.formPropList; let first = first; trackBy: track.by('name')">
<ng-container *ngIf="prop.visible(data)">
<ng-container
[formGroupName]="extraPropertiesKey"
*ngIf="extraProperties.controls[prop.name]; else tempDefault"
>
<abp-extensible-form-prop [prop]="prop" [data]="data"
[class]="prop.className">
</abp-extensible-form-prop>
</ng-container>
<ng-template #tempDefault>
<abp-extensible-form-prop
[class]="prop.className"
*ngIf="form.get(prop.name)"
[prop]="prop"
[data]="data"
[first]="first"
></abp-extensible-form-prop>
</ng-template>
</ng-container>
</ng-container>
</ng-template>

15
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<R = any> {
@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<R>;
groupedPropList: GroupedFormPropList;
record!: R;
createGroupedList(propList: FormPropList<R>) {
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;
}

31
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts

@ -21,6 +21,34 @@ export class FormProps<R = any> extends Props<FormPropList<R>> {
protected _ctor: Type<FormPropList<R>> = FormPropList;
}
export interface FormPropGroup {
name: string;
className?: string;
}
export class GroupedFormPropList<R = any> {
public readonly items: GroupedFormPropItem[] = [];
addItem(item: FormProp<R>) {
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<R = any> extends PropsFactory<FormProps<R>> {
protected _ctor: Type<FormProps<R>> = FormProps;
}
@ -40,6 +68,7 @@ export class FormProp<R = any> extends Prop<R> {
readonly id: string | undefined;
readonly template?: Type<any>;
readonly className?: string;
readonly group?: FormPropGroup | undefined;
constructor(options: FormPropOptions<R>) {
super(
@ -52,6 +81,8 @@ export class FormProp<R = any> extends Prop<R> {
options.template,
options.className,
);
this.group = options.group;
this.className = options.className;
this.asyncValidators = options.asyncValidators || (_ => []);
this.validators = options.validators || (_ => []);

Loading…
Cancel
Save