adding code to manage 'extra' facets

This commit is contained in:
Maria Teresa Paratore 2024-06-25 16:57:22 +02:00
parent edf27b2271
commit 4760074ea8
5 changed files with 122 additions and 48 deletions

View File

@ -121,7 +121,7 @@ public class InformationSystemService {
FacetSpecDTO fsdto = new FacetSpecDTO();
ArrayList<FacetPropGui> propsGui = new ArrayList<FacetPropGui>();
FacetType ft = (FacetType) type;
fsdto.setName(ft.getTypeName());
fsdto.setName(ft.getName());
fsdto.setDescription(ft.getDescription());
if(ft.getProperties()!=null ) {
for(PropertyDefinition pd:ft.getProperties() ) {
@ -146,6 +146,7 @@ public class InformationSystemService {
fsdto.setGuiProps(propsGui);
return fsdto;
}
public FacetSpecDTO getFacetSpecification(String facetName) throws Exception {
String currentCtx = SecretManagerProvider.instance.get().getContext();
@ -213,7 +214,10 @@ public class InformationSystemService {
case "Integer": tmp="number";
break;
//TODO: per ora uso "typeprop" come tipo speciale (ad es. per le authorization)
case "Property": tmp="typeprop";
//case "Property": tmp="typeprop";
case "PropertyType": tmp="typeprop";
log.debug("what?..."+typeForClient);
break;
default: try {
tmp = client.getType(typeForClient, false);

View File

@ -161,8 +161,11 @@ public class InformationSystemResource{
try {
informationSystemService.setUma(createUmaToken(currentContext));
List<Type> facets = informationSystemService.getFacetTypes();
facets.remove(0); //tolgo la facet madre
for(Type facet : facets) {
FacetSpecDTO facetSpec = informationSystemService.getFacetStructure(facet);
facetSpec.setRelation("ConsistsOf");
facetSpec.setRelationOptions(informationSystemService.getFacetRelationsOptions("ConsistsOf"));
facetSpecs.add(facetSpec);
}
ObjectMapper objectMapper = new ObjectMapper();

View File

@ -105,10 +105,10 @@
<input matInput formControlName="val" type="text"/>
<mat-error>{{checkForErrorsIn(facetTemplate.key,ind,i,'number')}}</mat-error>
</mat-form-field>
<mat-form-field *ngIf="x.get('tipo')?.value === 'complexType'">
<mat-form-field *ngIf="x.get('tipo')?.value === 'propertyType'">
<mat-label for="val">value</mat-label>
<textarea matInput style="width: 400px" formControlName="val"></textarea>
<mat-error>{{checkForErrorsIn(facetTemplate.key,ind,i,'complexType')}}</mat-error>
<mat-error>{{checkForErrorsIn(facetTemplate.key,ind,i,'propertyType')}}</mat-error>
</mat-form-field >
<mat-form-field *ngIf="x.get('tipo')?.value === 'boolean'">
<mat-label for="val">value</mat-label>
@ -160,12 +160,25 @@
(click)="removeFacet(facetTemplate.key,ind)" matTooltip="remove {{facetTemplate.key}}" matTooltipClass="tableTooltip"
matTooltipPosition="above"><mat-icon>delete_outline</mat-icon></button>
</div>
</div>
<button mat-flat-button color="primary"
(click)="addFacet(facetTemplate.key)" [disabled]="facetTemplate.value.max==='1'">
<mat-icon>add</mat-icon>Add new </button>
</div>
</div> <!-- ends the form -->
</div>
</div>
<!--per facet extra-->
<div [formGroup]="pippo">
<span>extra facets container</span>
</div>
<!--per facet extra/fine -->
<span>Add new facet</span>
<mat-label for="facetSelector" >Choose</mat-label>
<mat-select >
<mat-option id="facetSelector" *ngFor="let opt of allFacetsMap|keyvalue" [value]="opt.key" (onSelectionChange)="addGFacet(opt.key)">
{{opt.key}}
</mat-option>
</mat-select>
</div><!-- ends the form -->
</mat-dialog-content>
<mat-dialog-actions align="end">
<button mat-button type="submit" (click)="onSubmit()">Submit</button>

View File

@ -42,11 +42,13 @@ export class FacetComposerComponent implements OnInit {
selectedCredentialType: string|any;
myForm: FormGroup; //form complessiva
pippo: FormGroup; //form con facet extra
typeSpec: ITypeSpecification;
fieldsMap: Map<string, IFacetComposer>;
showPassword:boolean;
datePipe:DatePipe;
allFacetsMap: Map<string,IFacetComposer>;
// eslint-disable-next-line @typescript-eslint/member-ordering
constructor(private guiService: FacetComposerService, private fb: FormBuilder,
@ -58,7 +60,9 @@ export class FacetComposerComponent implements OnInit {
this.selectedType = '';
this.typeSpec = {} as ITypeSpecification;
this.fieldsMap = new Map<string,IFacetComposer>();
this.allFacetsMap = new Map<string,IFacetComposer>();
this.myForm = this.fb.group({});
this.pippo = this.fb.group({});
this.showPassword = false;
this.datePipe = new DatePipe('en-US');
}
@ -66,20 +70,25 @@ export class FacetComposerComponent implements OnInit {
ngOnInit(): void {
this.guiService.getFormStructure(this.titlePath,this.titleType).subscribe(res => {
this.typeSpec = res;
this.fieldsMap = new Map(res.facetSpecs.map((obj) => [obj.name+'_'+obj.relation, obj]));
//parto con una facet per tipo
this.createForm(res);
});
this.guiService.getAllFacets(this.titlePath).subscribe(
res2 => {
const allFacets = new Map(res2.map((item:IFacetComposer)=>[item.name,item]));
this.createForm(res,allFacets);
this.allFacetsMap = allFacets;
}
);
});
}
optionTypes = [
{ value: 'boolean'},
{ value: 'complexType'},
{ value: 'propertyType'},
{ value: 'date'},//text
{ value: 'datetime'},//text
{ value: 'password'},
@ -88,37 +97,47 @@ export class FacetComposerComponent implements OnInit {
{ value: 'text'}
];
/* <TextField
variant="standard"
style={{width:"50%"}}
//type='datetime'
type='datetime'
InputLabelProps={{
shrink: true
}}
defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().indexOf("T")|0) + 6|0)}
/>
*/
credentialTypes: string[] = ['username/password', 'clientId/secret', 'token/secret'];
//TODO: NOTA BENE--> FormGroup->access by NAME, FormArray->access by INDEX!!
createForm(fData:ITypeSpecification):void{
//TODO: NOTA BENE--> FormGroup->access by NAME, FormArray->access by INDEX!!
createForm(fData:ITypeSpecification, gfacetsMap:Map<string,IFacetComposer>):void{
for(let i=0; i<fData.facetSpecs.length; i++){
const facetSpec = fData.facetSpecs[i];
this.createFacetArrayEntry(facetSpec);
}
/*
console.debug('---------/gfacetsMap--------');
console.debug(gfacetsMap);
console.debug('---------gfacetsMap/--------');
*/
gfacetsMap.forEach((obj,deno)=>{
this.createGenericFacetArrayEntry(obj)
}
);
}
createFacetArrayEntry(item: IFacetComposer):void{
const nameplus:string = item.name+'_'+item.relation;
const singleFacetArray: FormArray = this.fb.array([]);
singleFacetArray.push(this.createFacetGroup(item,false));
singleFacetArray.push(this.createFacetGroup(item,false,false));
this.myForm.addControl(nameplus,singleFacetArray);
}
createGenericFacetArrayEntry(item: IFacetComposer):void{
const genericFacetArray: FormArray = this.fb.array([]);
//TODO: QUI NON CREA CORRETTAMENTE
genericFacetArray.push(this.createFacetGroup(item,false,true));
this.myForm.addControl(item.name,genericFacetArray);
/*
console.debug('---------/CONTROLS (generic)--------');
console.debug(this.myForm.controls);
console.debug('---------CONTROLS (generic)/--------');
*/
}
get extraProps():FormArray {
return this.fb.array([
this.extraProp
@ -144,11 +163,22 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
return this.fb.group({
updateOn: 'change'
})
}
get selectfacets():FormControl{
return this.fb.control({
})
}
getGPropsGroup(denoFacet:string, index:number):FormGroup{
return (this.getGenericFacetArray(denoFacet).controls[index]).get('gprops') as FormGroup;
}
getGExtraPropsArray(denoFacet:string, index:number):FormArray{
return (this.getGenericFacetArray(denoFacet).controls[index]).get('gextraProps') as FormArray;
}
getPropsGroup(denoFacet:string, index:number):FormGroup{
return (this.getSingleFacetArray(denoFacet).controls[index]).get('props') as FormGroup;
}
@ -175,7 +205,7 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
// eslint-disable-next-line no-useless-escape
valFc.setValidators([Validators.required,Validators.pattern('^\s*(true|false)\s*$')]);
}
if(newValue==='complexType'){
if(newValue==='propertyType'){
valFc.setValue('{}');
// eslint-disable-next-line no-useless-escape
valFc.setValidators([Validators.required, this.validateJsonString()]);
@ -206,13 +236,15 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
addFacet(deno:string): void {
const icf: IFacetComposer = <IFacetComposer>this.fieldsMap.get(deno);
const singleFacetArray = this.myForm.controls[deno] as FormArray;
singleFacetArray.push(this.createFacetGroup(icf,true));
singleFacetArray.push(this.createFacetGroup(icf,true,false));
}
addFacet2(deno:string): void {
const icf: IFacetComposer = <IFacetComposer>this.fieldsMap.get(deno);
addGFacet(deno:string): void {
const icf: IFacetComposer = <IFacetComposer>this.allFacetsMap.get(deno);
const singleFacetArray = this.myForm.controls[deno] as FormArray;
singleFacetArray.push(this.createFacetGroup(icf,true));
singleFacetArray.push(this.createFacetGroup(icf,true,true));
}
@ -253,7 +285,7 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
return errorMsg;
}
}else if(!this.checkIfEmpty(valFc.value)&& inputType==='complexType'){
}else if(!this.checkIfEmpty(valFc.value)&& inputType==='propertyType'){
if(!this.isJsonString(valFc.value)){
errorMsg = 'Please insert a valid JSON string';
return errorMsg;
@ -262,7 +294,6 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
{
if(valFc.hasError('pattern')){
if(!this.checkIfEmpty(valFc.value)&& inputType==='number'){
console.debug('++++++++ NAN - IS NUMBER +++++++');
errorMsg = valFc.value +' is not an integer';
return errorMsg;
}
@ -292,7 +323,6 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
// set parse error if it fails
isOk = false;
}
console.debug('>>>>>>>>JSON OK?.........'+isOk);
return isOk;
}
@ -318,7 +348,6 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
let errorMsg: string;
// eslint-disable-next-line prefer-const
errorMsg='';
console.debug('************');
const valFc = this.getPropsGroup(denoFacet,indexFct).get(prop.name)!;
/*
if(prop.validations.length>1){
@ -348,7 +377,15 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
createFacetGroup(item: IFacetComposer,isAdded: boolean):FormGroup{
createFacetGroup(item: IFacetComposer,isAdded: boolean,isGeneral:boolean):FormGroup{
//OK: da qui ci passa 22 volte
//console.debug('------->>>> In createFacetGroup - isGeneral? '+isGeneral);
if(isGeneral){
console.debug('-------/ In createFacetGroup - isGeneral - guiProps');
console.debug(item.guiProps);
console.debug('------- In createFacetGroup -----/');
}
const facetFg: FormGroup = this.fb.group({});
const nameFc = this.fb.control(item.name);
@ -365,7 +402,6 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
const relationFc = this.fb.control(item.relation);
facetFg.addControl('relationFacet', relationFc);
//this.itemRelations = item.relationOptions;
const addedFc = this.fb.control(isAdded);
facetFg.addControl('isAdded', addedFc);
@ -374,7 +410,7 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
//1. creo group con le properties
//2. aggiungo formgroup delle properties ai controls per la facet
return this.addPropertyControls(facetFg,item.guiProps);
return this.addPropertyControls(facetFg,item.guiProps,isGeneral);
}
@ -389,7 +425,7 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
}
addPropertyControls(facetFg:FormGroup, props: IFacetProps[]):FormGroup{
addPropertyControls(facetFg:FormGroup, props: IFacetProps[], isGeneral:boolean):FormGroup{
const propsFg = this.fb.group({});
let fc:FormControl;
@ -427,13 +463,23 @@ defaultValue={new Date().toISOString().substring(0, (new Date().toISOString().in
propsFg.addControl(prop.name,fc); //formGroup.addControl(prop_'controlName', formControl);
}
}
facetFg.addControl('props',propsFg);
if(!isGeneral){
facetFg.addControl('props',propsFg);
}else{
facetFg.addControl('gprops',propsFg);
}
return facetFg;
}
getSingleFacetArray(nameplus:string): FormArray {
return this.myForm.controls[nameplus] as FormArray;
}
getGenericFacetArray(facetName:string): FormArray {
return this.myForm.controls[facetName] as FormArray;
}
onSubmit() {

View File

@ -45,6 +45,14 @@ export class FacetComposerService {
return this.http.get<string>(serviceUrl,{params:queryParams});
}
getAllFacets(ctxPath:string): Observable<IFacetComposer[]> {
const serviceUrl = this.applicationConfigService.getEndpointFor('api/is/allfacets');
let queryParams = new HttpParams();
queryParams = queryParams.append("currentContext",ctxPath);
return this.http.get<IFacetComposer[]>(serviceUrl,{params:queryParams});
}
createResource(type:string, body:string): Observable<string> {
const headers = new HttpHeaders()