[FIXED] PrimeNG tree component

Issue

I should make a Primeng tree. This is my model.

export interface Profiles {
  active?: true,
  description?: string,
  function?: [
    string
  ],
  id?: number,
  macroFunction?: string,
  name?: string,
  nodeTree?: [
    {
      children?: [
        string
      ],
      data?: {
        description?: string,
        flag?: true,
        functionFK?: string,
        id?: number,
        order?: number,
        parent?: number
      }
    }
  ]
}

I don’t know how to do the http call and the rest.

I thought about something like that:
service:

 postProfiles(): Promise<Profiles > {
    const url = 'profiles/create';
    return this.http.post<Profiles >(url, {})
      .toPromise()
  }

ts –> http

node: Profile[];
selectedNode: Profile;
    ngOnInit() {
            this.nodeService.postProfiles().then(node=> this.selectedNode= node);
        }

HTML

<p-tree [value]="node" selectionMode="single" [(selection)]="selectedNode"></p-tree>

Can someone help me? What’s wrong?
Thanks in advance!

Done! I hope it’ll be useful

node:any; 

this.ricercaService.getTree().subscribe( (res) => { 
this.node = res.nodeTree; 
}, 
(error) => { c
onsole.log(error); 
});

HTML –

<p-tree *ngIf="node" [value]="node" selectionMode="checkbox" [(selection)]="selectedNode"> <ng-template let-node pTemplate="default"> <b>{{ node.data.description }}</b> </ng-template> </p-tree> – 

Solution

There are 2 problems with your code :

Here are some fixes

  • Service :

    // It's better to keep using Observable instead of Promise as it is more flexible and powerful
    // and shareReplay() avoid requesting your server again if subscribed multiple times
    postProfiles(): Observable<Profiles[]> {
        const url = 'profiles/create';
        return this.http.post<Profiles[]>(url, {}).pipe(shareReplay());
    }
    
  • Component :

     // This is your profiles transformed into TreeNode from PrimeNG
     nodes$: Observable<TreeNode[]>;
     selectedNode: TreeNode;
    
     ngOnInit() {
         // Here we map each Profile into TreeNode
         this.nodes$ = this.nodeService.postProfiles().pipe(
             map(profiles => profiles.map(p => ({
                 label: p.name,
                 children: p?.nodeTree?.children.map(child => ({
                     label: child.label
                 })
             })
         );
     }
    
  • Template (HTML) :

     <!-- The "| async" subscribe to this observable and use the value received -->
     <p-tree [value]="nodes | async" selectionMode="single" [(selection)]="selectedNode"></p-tree>
    

Answered By – Chaniro

Answer Checked By – Katrina (Easybugfix Volunteer)

Leave a Reply

(*) Required, Your email will not be published