Power Apps Portals – Print/Export Content

Power Apps Portals provides us with very quick and simple ways to expose data from the D365 system into an external portal. Often, we have requirements to export or print the data using current Word Templates present in D365, but unfortunately there is no OOB feature (currently) for performing this task.

In this post, I will describe what is available using the OOB configuration from the portal, and how to extend it in order to export the data in the application. The idea of this post is not explain the Portal objects (Web Template,  Entity List etc), you can find content on the Power Apps Portals on the following link: https://docs.microsoft.com/en-us/dynamics365/portals/configure-portal

For this demo, we will be using the following setup:

  • Power Apps Portals Starter (Version 9.2.2.15)

Before going to the step-by-step, below you can see what we will be achieving by going through the end of the post:

PrintPage

As a starting point, we will create an Entity List and Web Page record to present a list of the Active Contacts:

This is how the list will be rendered by default in your Portal page:

Capture02

For Entity List records, we have the option (OOB) to add an Export to Excel button, this can be achieved by:

  • Open your Entity List record
  • Navigate to tab Options
  • In the Grid Configuration add a “Download” action and add a label
Capture03

This is how the button is shown on the Portal, and once clicked, you will download an Excel file with the list content:

Capture04
Capture05

Unfortunately, this excel file is rendered just like our Advanced Find Export to Excel feature, which is not bad, but usually when we have a Website, we (and our customers) want this information to be presented in a friendlier way.

So now, we are going to the fun part, let’s extend this by creating our custom “Print Button”, which will use the standard JavaScript function to print a Page.

Now create a new Page Template and Web Template and make sure to associate the new Page Template to your existing Web Page:

Capture06
Capture07

For the Web Template record, I basically copied the content from the OOB Web Template “Full Page” and removed a few lines, leaving only the condition that will render the Entity List.

At this moment, nothing has changed and our Web Page is behaving exactly the same way as before.

Now, we are going back to our recently created Web Template, and add the following:

  • Give a name for the Div that is holding your Entity List
  • Add the Button for printing (outside the div)
  • Add the JavaScript code that will actually perform the printing (in the .JS code, I am actually creating a new HTML document, so we need to reference the .css here)

What I am also going to do, is add a new hidden DIV in the page with a custom logo (just create a Web File and upload your Logo in the notes), we can play around with showing/hiding the DIVs as we want in the JavaScript function, just make sure to set it up back to normal before the user closes the print window.

  • Add DIV with logo inside your print DIV
  • Show the Logo before setting the HTML content, also hide the Command Bar which will contain your Search Box / View Selector / Create or Download button (in case you setup any of those)
  • After setting the HTML Content, Hide the Logo and show again the Command Bar
  • In the top of the HTML, before the <head>, add:

Now we have our Logo being shown only for the printed window, and we have the same layout as the Portal webpage.

The following is the final code for the Web Template:

{% extends 'Layout 1 Column' %} {% block main %} {% include 'Page Copy' %} {% if page.adx_entitylist %}
<div id="printList">
    <div id="dvLogo" style="text-align:center; display:none">
        <img style="width: 300px;" src="/company-logo.png">
    </div>
    {% include 'entity_list' key: page.adx_entitylist.id %}
</div>
<form id="printForm">
    <input class="entitylist-download btn btn-info action" type="button" value="Print Contacts" id="btnPrint" />
</form>
{% endif %}
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
    $("#btnPrint").on("click", function() {
        document.getElementById('dvLogo').style.display = 'block';
        document.getElementsByClassName("view-toolbar grid-actions clearfix")[0].style.display = 'none';

        var divContents = $("#printList").html();

        document.getElementsByClassName("view-toolbar grid-actions clearfix")[0].style.display = 'block';
        document.getElementById('dvLogo').style.display = 'none';

        var printWindow = window.open('', '', 'height=600,width=800');
        printWindow.document.write('<link rel="stylesheet" href="/bootstrap.min.css" />');
        printWindow.document.write('<html><head><title> Active Contacts</title>');
        printWindow.document.write('</head><body>');
        printWindow.document.write(divContents);
        printWindow.document.write('</body></html>');
        printWindow.document.close();
        printWindow.print();
    });
</script>
{% endblock %}

Conclusion

You can also use the same implementation to any other Web Page in your Portal, this way you can, for example, create a custom Web Template for your entity, displaying the information the way you need and add the Print button, showing and hiding anything on the Web Page if required, like logos, sensitive information, etc.

Maybe in the future Microsoft provides us a way to export using Word or Excel templates, which would be a very nice feature.

I hope this post has been helpful to you and your Power Apps Portals implementation.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s