@pega/dx-component-builder-sdk
Version:
Utility for building custom UI components
120 lines (105 loc) • 3.89 kB
text/typescript
import { CommonModule } from '@angular/common';
import { Component, forwardRef, Input, OnDestroy, OnInit } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
import { ComponentMapperComponent } from '@pega/angular-sdk-components';
import { PConnFieldProps } from '@pega/angular-sdk-components';
interface ScalarListProps extends Omit<PConnFieldProps, 'value'> {
// If any, enter additional props that only exist on ScalarList here
displayInModal: boolean;
value: any[];
componentType: string;
restProps?: object;
}
export class ScalarListComponent implements OnInit, OnDestroy {
pConn$: typeof PConnect;
formGroup$: FormGroup;
angularPConnectData: AngularPConnectData = {};
configProps$: ScalarListProps;
label$ = '';
value$: any;
displayMode$?: string = '';
items: any[];
isDisplayModeEnabled = false;
controlName$: string;
fieldControl = new FormControl('', null);
bHasForm$ = true;
bReadonly$ = false;
constructor(private angularPConnect: AngularPConnectService) {}
ngOnInit(): void {
// First thing in initialization is registering and subscribing to the AngularPConnect service
this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
this.controlName$ = this.angularPConnect.getComponentID(this);
// Then, continue on with other initialization
// call updateSelf when initializing
// this.updateSelf();
this.checkAndUpdate();
if (this.formGroup$) {
// add control to formGroup
this.formGroup$.addControl(this.controlName$, this.fieldControl);
this.fieldControl.setValue(this.value$);
this.bHasForm$ = true;
} else {
this.bReadonly$ = true;
this.bHasForm$ = false;
}
}
ngOnDestroy(): void {
if (this.formGroup$) {
this.formGroup$.removeControl(this.controlName$);
}
if (this.angularPConnectData.unsubscribeFn) {
this.angularPConnectData.unsubscribeFn();
}
}
// Callback passed when subscribing to store change
onStateChange() {
this.checkAndUpdate();
}
checkAndUpdate() {
// Should always check the bridge to see if the component should
// update itself (re-render)
const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
// ONLY call updateSelf when the component should update
if (bUpdateSelf) {
this.updateSelf();
}
}
// updateSelf
updateSelf(): void {
this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as ScalarListProps;
this.label$ = this.configProps$.label;
const componentType = this.configProps$.componentType;
const scalarValues = this.configProps$.value;
this.displayMode$ = this.configProps$.displayMode;
const restProps = this.configProps$.restProps;
console.log('scalar values: ', scalarValues);
this.items = scalarValues?.map(scalarValue => {
console.log('scalar value: ', scalarValue);
return this.pConn$.createComponent(
{
type: componentType,
config: {
value: scalarValue,
displayMode: 'DISPLAY_ONLY',
label: this.label$,
...restProps,
readOnly: true
}
},
'',
0,
{}
); // 2nd, 3rd, and 4th args empty string/object/null until typedef marked correctly as optional;
});
this.isDisplayModeEnabled = ['STACKED_LARGE_VAL', 'DISPLAY_ONLY'].includes(this.displayMode$ as string);
this.value$ = this.items;
}
}