Forum Discussion

Sreejith's avatar
Sreejith
Advocate I
10 years ago
Solved

How to define Table DataViewMappings

Hi,

I want to make a custom visual with just two columns, one for text and other for a link button.

Ho can I define the dataview model.? I couldnot find any doc that defines a dataview for Table like one for Categorical

 

dataViewMappings: [{
                             categorical(Table?): {
                                            categories: {
                                                              for: { in: 'Category' },
                                                                          dataReductionAlgorithm: { top: {} }
                                                                        },
                                                             values: {
                                                           select: [{ bind: { to: 'Message' } }]
                                                                },
                                              }
                                  }],

 

How can I achieve this?

Thank you.

  • Basically, if your dataRoles array is defined as follows:

     

    dataRoles: [
    	{
    		displayName: 'Title',
    		name: 'title',
    		kind: powerbi.VisualDataRoleKind.Grouping
    	},
    	{
    		displayName: 'Url',
    		name: 'url',
    		kind: powerbi.VisualDataRoleKind.Grouping
    	}
    ]

    Then your dataViewMappings array should look like this(I omitted the conditions[] array for clarity):

     

    dataViewMappings: [{
        table: {
            rows: {
                select: [{for: { in: 'title' }},{for: { in: 'url' }}]
            }
        }
    }]

    The above will result in:

     

    1. There will be two field wells displayed in Power BI, titled "Title" and "Url".

    2. Your dataViews[index] object will have the following properties(among others...):

    • dataViews[index].table.columns[] array, which will contain that will contain some metadata about each column.
    • dataViews[index].table.rows[] array, which will contain arrays with values corresponding to the column indices.
    • dataViews[index].table.identities[] array, which will contain DataViewScopeIdentity objects corresponding to row numbers.
    • dataViews[index].table.identityFields[] array, which will contain the identityFields for each column.

    Note that while the "columns" property is belongs to the table object, the other three are actually in its prototype.

     

    A personal recommendation would be to log the dataView to the console and go through it yourself, and maybe play with the different mapping options. It's currently the best way I know to understand how these things work(Due to lack of documentation).

     

    Also, note that you cannot have link buttons inside Power BI visuals. This is a security measure(called Sandboxing) taken by Microsoft, since it can be used to perform various malicious actions, such as Clickjacking and Cross-Site Scripting attacks, which is not something you want to be possible anywhere near your precious confidential corporate data.

3 Replies

  • Basically, if your dataRoles array is defined as follows:

     

    dataRoles: [
    	{
    		displayName: 'Title',
    		name: 'title',
    		kind: powerbi.VisualDataRoleKind.Grouping
    	},
    	{
    		displayName: 'Url',
    		name: 'url',
    		kind: powerbi.VisualDataRoleKind.Grouping
    	}
    ]

    Then your dataViewMappings array should look like this(I omitted the conditions[] array for clarity):

     

    dataViewMappings: [{
        table: {
            rows: {
                select: [{for: { in: 'title' }},{for: { in: 'url' }}]
            }
        }
    }]

    The above will result in:

     

    1. There will be two field wells displayed in Power BI, titled "Title" and "Url".

    2. Your dataViews[index] object will have the following properties(among others...):

    • dataViews[index].table.columns[] array, which will contain that will contain some metadata about each column.
    • dataViews[index].table.rows[] array, which will contain arrays with values corresponding to the column indices.
    • dataViews[index].table.identities[] array, which will contain DataViewScopeIdentity objects corresponding to row numbers.
    • dataViews[index].table.identityFields[] array, which will contain the identityFields for each column.

    Note that while the "columns" property is belongs to the table object, the other three are actually in its prototype.

     

    A personal recommendation would be to log the dataView to the console and go through it yourself, and maybe play with the different mapping options. It's currently the best way I know to understand how these things work(Due to lack of documentation).

     

    Also, note that you cannot have link buttons inside Power BI visuals. This is a security measure(called Sandboxing) taken by Microsoft, since it can be used to perform various malicious actions, such as Clickjacking and Cross-Site Scripting attacks, which is not something you want to be possible anywhere near your precious confidential corporate data.

  • Greg_Deckler's avatar
    Greg_Deckler
    Community Champion

    I am not aware of a way to have a link button in a visual currently.

    • Sreejith's avatar
      Sreejith
      Advocate I

      Greg_Deckler I could create a link button using SVG and on click it was redirecting.

        this.htmlContents = d3.select(options.element.get(0)).append("svg")

                                    .attr("width",400)   

                                  .attr("height", 200);

                                 

                                  this.htmlContents.append("a").attr("xlink:href", "http://en.wikipedia.org/wiki/")

                                  .append("rect") 

                                  .attr("x", 100)

                                  .attr("y", 50)

                                  .attr("height", 100)

                                  .attr("width", 200)

                                  .style("fill", "lightgreen")

                                  .attr("rx", 10)

                                  .attr("ry", 10);

                                 

                                 this.htmlContents.append("text")

                                  .attr("x", 200)

                                  .attr("y", 100)

                                  .style("fill", "black")

                                  .style("font-size", "20px")

                                  .attr("dy", ".35em")

                                  .attr("text-anchor", "middle")

                                  .style("pointer-events", "none")

                                  .text("Resolve");

      But when I added the same to a table cell, errror occurs "Refused to display "https://app/powerbi.com/www/wiki.org" in a frame because it set X-Frame-Opttions to deny

      "