web
You’re offline. This is a read only version of the page.
close
Skip to main content

Notifications

Announcements

Community site session details

Community site session details

Session Id :
Power Platform Community / Forums / Power Apps / Building a hierarchy b...
Power Apps
Unanswered

Building a hierarchy based on SharePoint column values

(0) ShareShare
ReportReport
Posted on by 76

I used to have a hierarchy in my OnStart that was handling expanding and retracting my Tasks based on SharePoint Columns.

My app was getting slower and slower as time passed on.

 

My code snippets are here:

ClearCollect(
 colTasks, 
 AddColumns(MYDATALIST,
 "Show", ThisRecord.TaskLvl = 0, 
 "Expanded", false, 
 "TaskHierarchy",If(ThisRecord.TaskLvl= 0, "0", If(ThisRecord.TaskLvl= 1, With({localOuterRecord: ThisRecord}, LookUp(MYDATALIST, Id=localOuterRecord.ParentId).TaskNo & "." & Text(localOuterRecord.TaskNo, "000")))),
 "ProjectCreationDate", If(ThisRecord.TaskLvl= 0, Oprettet, If(ThisRecord.TaskLvl= 1, With({localOuterRecord: ThisRecord}, LookUp(MYDATALIST, Id=localOuterRecord.ParentId).Oprettet)))
 )
 );
	
	
With(
 {localColTasks: colTasks}, 
 UpdateIf(
 colTasks As ThisTask, 
 ThisTask.TaskLvl=2,
 {
 TaskHierarchy: LookUp(localColTasks, Id=ThisTask.ParentId).TaskHierarchy & "." & Text(ThisTask.TaskNo, "000"),
 ProjectCreationDate: LookUp(localColTasks, Id=ThisTask.ParentId).ProjectCreationDate
 } //With({localOuterRecord: ThisRecord},LookUp(localColTasks, Id=OuterColTask.ParentId).TaskHierarchy & "." & OuterColTask.TaskNo)}
 ) 
)

 

Then in my gallery i had an icon that was handling the Expanding and retracting of my Tasks. Code is here:

Select(Parent);
With({localItem: ThisItem},

UpdateIf(
 colTasks,
 // Show childTasks of current task
 !localItem.Expanded && ParentId = localItem.Id && TaskLvl <> 0,
 {Show: true},
 // Hide Hierarchy of current task
 localItem.Expanded && (localItem.ProjectId = ThisRecord.ProjectId) && !(ThisRecord.TaskLvl = 0) && (localItem.TaskHierarchy in ThisRecord.TaskHierarchy) && Id <> localItem.Id, 
 {Show: false, Expanded: false},
 // change Expanded field for this task
 Id = localItem.Id,
 {Expanded: !localItem.Expanded}
 
 );

 

finally i have a gallery that has some code in its Items:

SortByColumns(Filter(
 colTasks As OuterTask,
 // Never show rejected tasks..
 OuterTask.Status.Value <> "Rejected",

 (IsBlank(OuterTask.PrimaryAssignee) && ("Ikke tildelt" in Filter(colAssignees, Active).DisplayNameAssignee))
 
 // Always show if a childtask is to be shown
 || !IsBlank(LookUp(colTasks,
 // Childtask is a Childtask - ALSO FINDS ITSELF!
 OuterTask.ProjectId = ProjectId && OuterTask.TaskHierarchy in TaskHierarchy 
 // ChildTask has its Primary assignee set to Active in colAssignees.
 && !IsBlank(LookUp(colAssignees, Active && If(IsBlank(PrimaryAssignee), DisplayNameAssignee = "Ikke tildelt", DisplayNameAssignee = PrimaryAssignee.DisplayName)))
 // Should not take completed childtasks into account if toggle is off.
 && If(toggle_ShowCompletedTasks.Value, !(Status.Value = "Completed") || ((Status.Value = "Completed") && CompletedDateTime > (Today()-Slider_ShowCompletedTasksXDaysBackInTime.Value)), !(Status.Value = "Completed"))
 )),
 
 // Show completed tasks
 If(toggle_ShowCompletedTasks.Value, !(OuterTask.Status.Value = "Completed") || ((OuterTask.Status.Value = "Completed") && OuterTask.CompletedDateTime > (Today()-Slider_ShowCompletedTasksXDaysBackInTime.Value)), OuterTask.Status.Value <> "Completed"),
 
 // Backlog and TaskTypes
 !IsBlank(LookUp(colTasks As ProjectTask, 
 // Projekt is shown
 (ProjectTask.TaskLvl = 0) 
 && ProjectTask.Show 
 && (OuterTask.ProjectId = ProjectTask.ProjectId) 
 && If(Dd_ChoosePrio.Selected.Value = "Alle", true, ProjectTask.Prioritet = Dd_ChoosePrio.Selected.Value) 
 && If(Dd_ChoosePrio_TaskType.Selected.Value = "Alle", true, ProjectTask.TaskType = Dd_ChoosePrio_TaskType.Selected.Value)
 // Check if project is in backlog according to Toggle backlog
 && If(toggle_ShowBacklog.Value, 
 // 
 ((ProjectTask.Status.Value = "Backlog") || IsBlank(ProjectTask.Status.Value))
 , 
 ((ProjectTask.Status.Value <> "Backlog") && !IsBlank(ProjectTask.Status.Value))
 )
 // Show if projectTaskType is ON or projectTaskType is blank
 &&
 (IsBlank(ProjectTask.TaskType) || (ProjectTask.TaskType in Filter(colTaskTypes, ShowTaskType = true).TaskTypeLongName))
 ))
 ,
 !IsBlank(varUserConfig) && Text(OuterTask.TeamName) = varUserConfig.TeamName,
 OuterTask.Show
), 
 If(toggle_ShowBacklog, "ProjectCreationDate", "ProjectName"), SortOrder.Ascending,
 "TaskHierarchy", SortOrder.Ascending 
 
)

So in the filter i am choosing not to show my rejected tasks. i am only filtering on active tasks and i have a toggle that shows me backlog tasks.

 

And this Triumvirate used to work pretty good but i have been noticing an increase in the load time in the app. it takes about a minute (give or take) to load the app now.
I have considered moving all this to the StartScreen property of the OnStart BUT that would "just" be sweeping the problem under a rug as i would still have the users wait for all this to load in etc...

 

Is there not an easier way of doing this where my app doesnt have to suffer from long load times?

 

i have even made 3 new columns in my Data list called TaskLevel0, TaskLevel1 and TaskLevel2.

All i need to do is to somehow figure out how i can filter my gallery where it shows the correct levels attached to each other.

 

Here is a sample of how my data looks with the "old" code.

pro1.png

 

 

Here is how my SharePoint list 
pro2.png

 

So based on all of the above is there a faster  method where i can build and tell the gallery how the hierarchy needs to be structured based on my data.

 

 

 

Categories:
I have the same question (0)
  • VintagePush Profile Picture
    76 on at

    The only workaround i have taught of so far is actually a "move the problem further along" kind of a thing...

    In My onStart I "just" collect the TaskLevel0 stuff. Then when I land on my First page I have a hidden timer that starts automatically. It has a duration of 700. In the timers OnTimerEnd I then have it press a hidden button with my original code that used to be in my OnStart.

     

    This does help with my app starting A LOT faster now, BUT the drawback is that every time I land on that particular page from anywhere in the app the Timer is triggered and it takes 0.5 - 1 sec of time for the code to run again.

    If there are no suggestions on how to improve / optimize the code in my OnStart is there at least a suggestion on how I can have the Timer run once and be done with it and not run every time i land on the page.

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Forum hierarchy changes are complete!

In our never-ending quest to improve we are simplifying the forum hierarchy…

Ajay Kumar Gannamaneni – Community Spotlight

We are honored to recognize Ajay Kumar Gannamaneni as our Community Spotlight for December…

Leaderboard > Power Apps

#1
WarrenBelz Profile Picture

WarrenBelz 711 Most Valuable Professional

#2
Michael E. Gernaey Profile Picture

Michael E. Gernaey 319 Super User 2025 Season 2

#3
Power Platform 1919 Profile Picture

Power Platform 1919 268

Last 30 days Overall leaderboard