1
votes

Background

So I'm trying to change the layout type of a report by using report phasing.

https://github.com/Microsoft/PowerBI-JavaScript/wiki/Embed-For-Mobile

Problem

When calling updateSettings() my new LayoutType isn't adhered to, although other settings are, such are filterPaneEnabled.

The filter pane does disappear, however the type of report doesn't change.

Am I missing something?

My Logic

  1. Preload report
  2. Create config
  3. Load report using config
  4. Check device is mobile, and check report is mobile compatible
  5. Update config settings with new report type
  6. Render Report

My Code

Preload

function PreloadReport(accessToken, embedUrl, embedReportId, reportTitle) {

    // Create embedding config
    var config = {
        type: 'report',
        embedUrl: 'https://app.powerbi.com/reportEmbed'
    };

    var PreloadElement = powerbi.preload(config);

    $(PreloadElement).on('preloaded', function () {
        console.log("Report Preloaded.");
        LoadMetadata(accessToken, embedUrl, embedReportId, reportTitle);
    });
}

Load MetaData and then render

function LoadMetadata(accessToken, embedUrl, embedReportId, reportTitle) {

    try {

        // Get navigation container.
        ReportPagesList = $('#reportpagesbuttons');

        // Add on click event.
        ReportPagesList.on('click', 'a', function (event) {

            var button = event.target;
            var report = $(button).data('report');
            var page = $(button).data('page');

            //console.log('Attempting to set page to: ', page.name);
            Report.setPage(page.name)
                .then(function (response) {

                    ReportPageName = page.displayName;

                    // For appsights custom event.
                    ReportFullName = ReportTitle + ": " + ReportPageName;
                });
        });

        // Get models. models contains enums that can be used.
        var models = window['powerbi-client'].models;

        var config = {
            type: 'report',
            tokenType: models.TokenType.Embed,
            accessToken: accessToken,
            embedUrl: embedUrl,
            id: embedReportId,
            permissions: models.Permissions.All,
            settings: {
                filterPaneEnabled: true,
                navContentPaneEnabled: false,
                background: models.BackgroundType.Transparent,
                layoutType: models.LayoutType.Master,
                customLayout: {
                    displayOption: models.DisplayOption.FitToWidth
                }
            }
        };

        // Get a reference to the embedded report HTML element
        var embedContainer = $('#reportContainer')[0];

        // Embed the report and display it within the div container.
        Report = powerbi.load(embedContainer, config);

        Report.on("loaded",
            function () {

                console.log("Report loaded");
                if (jQuery.browser.mobile) {

                    //Do we need to load a different report based on view screen size?
                    Report.getPages().then(function (pages) {
                        pages[0].hasLayout(models.LayoutType.MobilePortrait).then(function (hasLayout) {
                            console.log("Has mobile layout = " + hasLayout);
                            console.log("Is Mobile device = " + jQuery.browser.mobile);

                            if (hasLayout === true) {

                                const newSettings = {
                                    filterPaneEnabled: false,
                                    layoutType: models.LayoutType.MobilePortrait
                                };
                                console.log("Updating mobile layout");
                                Report.updateSettings(newSettings);

                            }
                        });
                    });
                }

                Timer = new Timer();
                Timer.Start();

                //Generate nav items.
                generateReportNav(Report);
                Report.render();


            });

    } catch (ex) {

        //Send to app insights.
        appInsights.trackException(ex);
    }
1

1 Answers

0
votes

in order to solve this you need to first check if device is mobile and then load the report with the right layoutType(switch step 3 & 4). If you do this, you don't even need to change the layoutType after loading.