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 / Loading spinner timer ...
Power Apps
Unanswered

Loading spinner timer for 30 seconds to queue Collection data before running flow

(0) ShareShare
ReportReport
Posted on by 1,599 Super User 2024 Season 1

Hello,

 

I have a Power App that has a button that runs a flow to create a PDF button - simples.

 

The main issue is that the onSelect code is processed so fast that it doesn't have enough time to collect the data from various SP list sources and hence doesn't include this dynamic data in the PDF unless the user waits a few minutes and does it again - then it works OK.

 

This is the Fx from the OnSelect property of my 'Create PDF' button:

 

// Set your variables first
Set(varItem, ThisItem);
Set(varBuildingPhoto, LookUp(BuildingPhotos, Title = ThisItem.spBuilding).'Link to item');
Set(varBuildingPhotoID, LookUp(BuildingPhotos, Title = ThisItem.spBuilding).ID);

// Add a loading indicator
Set(IsLoading, true);

// Your data collection and ClearCollect statements go here

// THIS INCLUDES ALL THE TOPIC HEADERS
ClearCollect(colSubtopics1, Distinct(Filter(SubtopicArgEvi_1,Building=varItem.spBuilding),Topic));

// THIS IS THE DISTINCT COLLECTION OF ORDER OF TOPICS
ClearCollect(colSubtopics, ForAll(Sequence(CountRows(colSubtopics1)), Patch(Last(FirstN(colSubtopics1,Value)),{Order:Value})));

ClearCollect(colTempAllSubtopics, AddColumns(Filter(SubtopicArgEvi_1,Building=varItem.spBuilding),"TopicOrder",0,"SubtopicOrder",0));
Clear(colTempAllSubtopicsB);
ForAll(colTempAllSubtopics, Collect(colTempAllSubtopicsB, {
 Top: colTempAllSubtopics[@Topic], 
 SubTop: colTempAllSubtopics[@Subtopic] & " - " & colTempAllSubtopics[@'Subtopic Breakdown'],
 Arg: colTempAllSubtopics[@Argument],
 Evid: colTempAllSubtopics[@Evidence],
 TopOrder: LookUp(colSubtopics,Value=colTempAllSubtopics[@Topic]).Order+2
}));

Clear(colAllSubtopics);

 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=3)), 3.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=3), Value)), {SubTopOrder: RoundUp(Value, 2)})));
 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=4)), 4.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=4), Value)), {SubTopOrder: RoundUp(Value, 2)})));
 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=5)), 5.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=5), Value)), {SubTopOrder: RoundUp(Value, 2)})));
 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=6)), 6.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=6), Value)), {SubTopOrder: RoundUp(Value, 2)})));
 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=7)), 7.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=7), Value)), {SubTopOrder: RoundUp(Value, 2)})));
 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=8)), 8.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=8), Value)), {SubTopOrder: RoundUp(Value, 2)})));
 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=9)), 9.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=9), Value)), {SubTopOrder: RoundUp(Value, 2)})));
 Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=10)), 10.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=10), Value)), {SubTopOrder: RoundUp(Value, 2)})));

// After your data is collected, update the loading indicator
Set(IsLoading, false);

// Use the If function to prevent PDF generation until data is loaded
If (!IsLoading,
 // Trigger the workflow when data is ready
 'BSC-PowerApps-v2'.Run(htmlBody_1.HtmlText, varBuildingPhoto, Now(), varBuildingPhotoID, htmlBody_2.HtmlText, htmlBody_3.HtmlText, varItem.ID),
 Notify("Please wait for data to load", NotificationType.Warning)
)

 
I have this loading spinner in a container that is displayed when IsLoading is set to true:

sudosaurus_0-1699474115474.png

and consequently this is hidden when IsLoading is set to false.

 

The problem is that this displays for about a second and seems a bit pointless - and not making any difference to the data being loaded in time.

 

Having spent a good couple of hours trying to get this working with my pal ChatGPT, it was suggested that I use a timer and set its duration to my chosen number of seconds (I thought 30 would be a good shout). However all the examples I was being given were unsupported in PowerApps.

 

Essentially I need a timer to start when IsLoading is set to true and have the loading spinner sit there for 30 seconds and then once the timer ends, the OnSelect statement then completes and starts the 'BSC-PowerApps-v2'.Run command to trigger the Power Automate flow.

How I get there is why I'm posting here.

 

What's the best way of achieving this? Whether its done via my spinner box or whether it has to be via a loading screen, I don't really mind.

 

Thanks,

Chris

 

Categories:
I have the same question (0)
  • M_Ali_SZ365 Profile Picture
    1,110 on at

    Hi @sudosaurus ,

    Insert a Timer: Drag a timer control onto your canvas but keep it hidden by setting its Visible property to false.

    Set the Duration: Change the timer's Duration property to 30000 for a 30-second countdown.

    Stop AutoStart: Make sure the timer doesn’t start automatically by setting AutoStart to false.

    Update the Button's OnSelect: In your button's OnSelect code, add a command to start the timer after setting your variables and collections. It'll look something like this:

    // Your variable and collection setup code...
    Start(Timer1); // This starts the timer
    Set(IsLoading, true); // This shows your loading spinner

    Trigger the Flow After the Timer: In your timer's OnTimerEnd property, add the code to trigger your flow and to hide the loading spinner:

    'BSC-PowerApps-v2'.Run(...); // Add your flow run command here
    Set(IsLoading, false); // This will hide the spinner

    Handle the Spinner: Your spinner's visibility should be tied to the IsLoading variable. When IsLoading is true, the spinner shows, and when false, it disappears.

    With this setup, when you press the button to create a PDF, it starts the timer. The loading spinner appears and stays on screen while the timer counts down. Once the 30 seconds are up, the timer triggers the flow to create the PDF and the spinner goes away. This way, your data has time to load and get included in the PDF.

    Please accept this solution if it resolves the issue. ✅
    Best regards,
    Muhammad Ali

     

  • sudosaurus Profile Picture
    1,599 Super User 2024 Season 1 on at

    @M_Ali_SZ365 

    I am seeing this error:

    sudosaurus_0-1699478431282.png


    Otherwise, everything looks great!

     

  • M_Ali_SZ365 Profile Picture
    1,110 on at

    Hi @sudosaurus 
    Try this

    Instead of using Start(Timer1);, directly set the Timer_Start property to true within the button's OnSelect property like this:

    // Your variable and collection setup code...
    Set(Timer_Start, true); // This should start the Timer1
    Set(IsLoading, true); // This shows your loading spinner

     Please accept this solution if it resolves the issue. ✅
    Best regards,
    Muhammad Ali

  • sudosaurus Profile Picture
    1,599 Super User 2024 Season 1 on at

    @M_Ali_SZ365 

    How does it know what Timer_Start refers to? Considering my timer is named PDFPrepTimer.

  • M_Ali_SZ365 Profile Picture
    1,110 on at

    Hi @sudosaurus 

    Try This 

     Set a variable named Timer_Start to true like this: Set(Timer_Start, true);. This variable will control your timer.

    Set another variable named IsLoading to true like this: Set(IsLoading, true);. This variable is likely used to show a loading spinner or some other loading indicator.

    To make this work, make sure your timer control's Start property is set to Timer_Start. This way, when Timer_Start becomes true, your timer (PDFPrepTimer) will start running.

    Please accept this solution if it resolves the issue. ✅
    Best regards,
    Muhammad Ali

  • sudosaurus Profile Picture
    1,599 Super User 2024 Season 1 on at

    @M_Ali_SZ365 

    I have updated as advised in your last post, however I do not see the spinner appearing on screen.

    Here's the Fx of the 'Create PDF' button:

    // Set your variables first
    Set(varItem, ThisItem);
    Set(varBuildingPhoto, LookUp(BuildingPhotos, Title = ThisItem.spBuilding).'Link to item');
    Set(varBuildingPhotoID, LookUp(BuildingPhotos, Title = ThisItem.spBuilding).ID);
    
    // Data collection and ClearCollect statements go here
    
    // THIS INCLUDES ALL THE TOPIC HEADERS
    ClearCollect(colSubtopics1, Distinct(Filter(SubtopicArgEvi_1,Building=varItem.spBuilding),Topic));
    
    // THIS IS THE DISTINCT COLLECTION OF ORDER OF TOPICS
    ClearCollect(colSubtopics, ForAll(Sequence(CountRows(colSubtopics1)), Patch(Last(FirstN(colSubtopics1,Value)),{Order:Value})));
    
    ClearCollect(colTempAllSubtopics, AddColumns(Filter(SubtopicArgEvi_1,Building=varItem.spBuilding),"TopicOrder",0,"SubtopicOrder",0));
    Clear(colTempAllSubtopicsB);
    ForAll(colTempAllSubtopics, Collect(colTempAllSubtopicsB, {
     Top: colTempAllSubtopics[@Topic], 
     SubTop: colTempAllSubtopics[@Subtopic] & " - " & colTempAllSubtopics[@'Subtopic Breakdown'],
     Arg: colTempAllSubtopics[@Argument],
     Evid: colTempAllSubtopics[@Evidence],
     TopOrder: LookUp(colSubtopics,Value=colTempAllSubtopics[@Topic]).Order+2
    }));
    
    Clear(colAllSubtopics);
    
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=3)), 3.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=3), Value)), {SubTopOrder: RoundUp(Value, 2)})));
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=4)), 4.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=4), Value)), {SubTopOrder: RoundUp(Value, 2)})));
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=5)), 5.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=5), Value)), {SubTopOrder: RoundUp(Value, 2)})));
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=6)), 6.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=6), Value)), {SubTopOrder: RoundUp(Value, 2)})));
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=7)), 7.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=7), Value)), {SubTopOrder: RoundUp(Value, 2)})));
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=8)), 8.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=8), Value)), {SubTopOrder: RoundUp(Value, 2)})));
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=9)), 9.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=9), Value)), {SubTopOrder: RoundUp(Value, 2)})));
     Collect(colAllSubtopics, ForAll(Sequence(CountRows(Filter(colTempAllSubtopicsB, TopOrder=10)), 10.1, 0.1), Patch(Last(FirstN(Filter(colTempAllSubtopicsB, TopOrder=10), Value)), {SubTopOrder: RoundUp(Value, 2)})));
    
    Set(Timer_Start, true); // This should start PDFPrepTimer
    Set(IsLoading, true); // This shows your loading spinner


    For reference I have a testing button to make the spinner modal appear that has its OnSelect set to:

    UpdateContext({IsLoading: true})

    Which makes this appear:

    sudosaurus_0-1699480059906.png

    The '30' in the middle is the Timer and it's OnTimerStart property is set to:

    Timer_Start


    I've set the text property of the timer to the following so that it counts down from 30 to 0:

    Text(Time(0, 0, (PDFPrepTimer.Duration-PDFPrepTimer.Value)/1000), "ss")

     

    The OnTimerEnd property is set to:

    // Trigger the workflow when data is ready
    'BSC-PowerApps-v2'.Run(htmlBody_1.HtmlText, varBuildingPhoto, Now(), varBuildingPhotoID, htmlBody_2.HtmlText, htmlBody_3.HtmlText, varItem.ID);
    Set(IsLoading, false); // This will hide the spinner 

     

    Any ideas what I can do to resolve this?

  • M_Ali_SZ365 Profile Picture
    1,110 on at

    Hi @sudosaurus 

    You'll need to ensure a few things for the loading spinner to function as expected:

    The IsLoading variable should be used to control the visibility of the spinner. This means that the spinner's Visible property should be set to IsLoading.
    The timer's Start property should be bound to a variable that gets set to true when you want the timer to start (in this case, Timer_Start).
    There should be a sufficient delay between setting IsLoading to true and setting it to false. The timer's OnTimerEnd property should contain the logic that sets IsLoading to false, ensuring that the spinner shows for the entire duration of the timer.

    Here's what you can do to ensure the spinner works correctly:

    Bind the spinner's Visible property to IsLoading.
    Use a variable to start the timer and make sure the timer's Start property is bound to this variable.
    Only set IsLoading to false in the OnTimerEnd property of the timer after your PDF creation process has been initiated.
    Your code in the OnSelect of the 'Create PDF' button should look something like this:

    // Set your variables first
    Set(varItem, ThisItem);
    // ... [other variable sets] ...
    
    // Show the loading spinner
    Set(IsLoading, true);
    
    // Data collection and ClearCollect statements go here
    // ... [your ClearCollect and ForAll statements] ...
    
    // Start the timer
    Set(Timer_Start, true);

    Make sure PDFPrepTimer's Start property is set to Timer_Start, and its OnTimerEnd property should contain:

    // Trigger the flow when data is ready and stop the spinner
    'BSC-PowerApps-v2'.Run(...); // your flow run command
    Set(IsLoading, false); // Hide the spinner
    Set(Timer_Start, false); // Stop the timer

    Remember, the loading spinner control's Visible property must be tied to the IsLoading variable. Make sure this property is set correctly:

    Visible = IsLoading

    By following these steps, you should be able to see the spinner on the screen for the full duration of the timer (30 seconds) until the data loading and processing are complete.

    Please accept this solution if it resolves the issue. ✅
    Best regards,
    Muhammad Ali

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 793 Most Valuable Professional

#2
Michael E. Gernaey Profile Picture

Michael E. Gernaey 333 Super User 2025 Season 2

#3
Power Platform 1919 Profile Picture

Power Platform 1919 268

Last 30 days Overall leaderboard