UNPKG

@deliverysolutions/ngx-powerbi

Version:

TypeScript library for embedding Power BI assets (reports/dashboards/tiles) in your application. This TypeScript library is built on top of the official powerbi-client library provided by Microsoft.

1 lines 17.3 kB
{"version":3,"file":"deliverysolutions-ngx-powerbi.mjs","sources":["../../../projects/ngx-powerbi/src/lib/ngx-powerbi.service.ts","../../../projects/ngx-powerbi/src/lib/ngx-powerbi.component.ts","../../../projects/ngx-powerbi/src/lib/ngx-powerbi.module.ts","../../../projects/ngx-powerbi/src/public-api.ts","../../../projects/ngx-powerbi/src/deliverysolutions-ngx-powerbi.ts"],"sourcesContent":["import { Injectable, Optional } from '@angular/core';\nimport {\n Embed,\n factories,\n IEmbedConfiguration,\n Report,\n service as pbiService,\n Tile\n} from 'powerbi-client';\n\nexport function powerBiServiceFactory() {\n return new pbiService.Service(\n factories.hpmFactory,\n factories.wpmpFactory,\n factories.routerFactory\n );\n}\n\n@Injectable({\n providedIn: 'root',\n useFactory: powerBiServiceFactory\n})\nexport class NgxPowerBiService {\n private powerBiCoreService: pbiService.Service;\n\n constructor(@Optional() private service?: pbiService.Service) {\n if (!service) {\n this.powerBiCoreService = new pbiService.Service(\n factories.hpmFactory,\n factories.wpmpFactory,\n factories.routerFactory\n );\n } else {\n this.powerBiCoreService = service;\n }\n }\n\n /**\n * Creates new report\n * @param HTMLElement Parent HTML element\n * @param IEmbedConfiguration Embed configuration\n * @returns Embed Embedded object\n */\n createReport(element: HTMLElement, config: IEmbedConfiguration): Embed {\n return this.powerBiCoreService.createReport(element, config);\n }\n\n /**\n * Given a configuration based on an HTML element,\n * if the component has already been created and attached to the element, reuses the component instance and existing iframe,\n * otherwise creates a new component instance.\n *\n * @param HTMLElement Parent HTML element\n * @param IEmbedConfiguration Embed configuration\n * @returns Embed Embedded object\n */\n embed(element: HTMLElement, config: IEmbedConfiguration): Embed {\n return this.powerBiCoreService.embed(element, config);\n }\n\n /**\n * Given a configuration based on an HTML element,\n * if the component has already been created and attached to the element, reuses the component instance and existing iframe,\n * otherwise creates a new component instance.\n * This is used for the phased embedding API, once element is loaded successfully, one can call 'render' on it.\n *\n * @param HTMLElement} Parent HTML element\n * @param IEmbedConfiguration Embed configuration\n * @returns Embed Embedded object\n */\n load(element: HTMLElement, config: IEmbedConfiguration): Embed {\n return this.powerBiCoreService.load(element, config);\n }\n\n /**\n * Adds an event handler for DOMContentLoaded, which searches the DOM for elements that have the 'powerbi-embed-url' attribute,\n * and automatically attempts to embed a Power BI component based on information from other powerbi-* attributes.\n *\n * Note: Only runs if `config.autoEmbedOnContentLoaded` is true when the service is created.\n * This handler is typically useful only for applications that are rendered on the server so that all\n * required data is available when the handler is called.\n */\n enableAutoEmbed(): void {\n return this.powerBiCoreService.enableAutoEmbed();\n }\n\n /**\n * Returns an instance of the component associated with the element.\n *\n * @param HTMLElement Parent HTML element\n * @returns (Report | Tile) Embedded report/tile object\n */\n get(element: HTMLElement): Embed {\n return this.powerBiCoreService.get(element);\n }\n\n /**\n * Finds an embed instance by the name or unique ID that is provided.\n *\n * @param string} uniqueId or name of the report/tile\n * @returns (Report | Tile) Embedded report/tile object\n */\n findById(uniqueId: string): Report | Tile {\n return this.powerBiCoreService.find(uniqueId);\n }\n\n /**\n * Given an HTML element that has a component embedded within it,\n * removes the component from the list of embedded components,\n * removes the association between the element and the component, and removes the iframe.\n *\n * @param HTMLElement Parent HTML element\n * @returns void\n */\n reset(element: HTMLElement): void {\n return this.powerBiCoreService.reset(element);\n }\n\n /**\n * handles tile events\n *\n * @param IEvent<any> event\n */\n handleTileEvents(event: pbiService.IEvent<any>): void {\n return this.powerBiCoreService.handleTileEvents(event);\n }\n\n /**\n * API for warm starting Power BI embedded endpoints.\n * Use this API to preload Power BI Embedded in the background.\n *\n * @param embed.IEmbedConfiguration Embed configuration\n * @param HTMLElement [element=undefined]\n */\n preload(\n config: IEmbedConfiguration,\n element: HTMLElement\n ): HTMLIFrameElement {\n return this.powerBiCoreService.preload(config, element);\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n AfterViewInit,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport * as pbi from 'powerbi-client';\nimport * as models from 'powerbi-models';\n\nimport { NgxPowerBiService } from './ngx-powerbi.service';\n\nexport const enum TokenType {\n Aad = 'Aad',\n Embed = 'Embed'\n}\n\nexport const enum ReportType {\n Dashboard = 'Dashboard',\n Report = 'Report',\n Tile = 'Tile'\n}\n\n@Component({\n selector: 'ngx-powerbi-component',\n template: '<div #ngxPowerBiIFrame style=\"height:100%; width: 100%;\"></div>',\n styles: []\n})\nexport class NgxPowerBiComponent implements AfterViewInit, OnChanges, OnDestroy {\n // Public properties\n @Input() accessToken: string;\n @Input() tokenType: TokenType;\n @Input() embedUrl: string;\n @Input() id: string;\n @Input() type: ReportType;\n @Input() name: string;\n @Input() options: models.ISettings;\n @Output() embedded = new EventEmitter<number>();\n @ViewChild('ngxPowerBiIFrame', {static: true}) ngxPowerBiIFrameRef: ElementRef;\n\n // Private fields\n private component: pbi.Embed;\n private powerBiService: NgxPowerBiService;\n\n constructor(private ngxPowerBiService: NgxPowerBiService) {\n this.powerBiService = ngxPowerBiService;\n }\n\n ngAfterViewInit() {\n // Embed the report inside the view child that we have fetched from the DOM\n if (\n this.ngxPowerBiIFrameRef.nativeElement &&\n this.validateRequiredAttributes()\n ) {\n this.embed(this.ngxPowerBiIFrameRef.nativeElement, this.getConfig());\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!this.ngxPowerBiIFrameRef) {\n return;\n }\n const {\n accessToken,\n tokenType,\n embedUrl,\n id,\n type,\n name,\n options\n } = changes;\n\n // TODO: Validate these conditions\n /*if (\n (accessToken.previousValue !== undefined || accessToken.previousValue === accessToken.currentValue) &&\n embedUrl.previousValue === embedUrl.currentValue\n ) {\n return;\n }*/\n\n if (this.validateRequiredAttributes()) {\n const config = this.getConfig(\n accessToken && accessToken.currentValue,\n tokenType && tokenType.currentValue,\n embedUrl && embedUrl.currentValue,\n id && id.currentValue,\n type && type.currentValue,\n name && name.currentValue,\n options && options.currentValue\n );\n this.embed(this.ngxPowerBiIFrameRef.nativeElement, config);\n } else if (this.component) {\n this.reset(this.ngxPowerBiIFrameRef.nativeElement);\n }\n }\n\n ngOnDestroy() {\n if (this.component) {\n this.reset(this.ngxPowerBiIFrameRef.nativeElement);\n }\n }\n\n /**\n * Ensure required attributes (embedUrl and accessToken are valid before attempting to embed)\n */\n private validateRequiredAttributes(): boolean {\n return (\n typeof this.embedUrl === 'string' &&\n this.embedUrl.length > 0 &&\n (typeof this.accessToken === 'string' && this.accessToken.length > 0)\n );\n }\n\n /**\n * Get the model class compatible token enum from our token type enum\n * @param tokenType - Token type in our custom enum format\n * @returns Token type in powerbi-models.TokenType enum format\n */\n private getTokenType(tokenType: TokenType): models.TokenType {\n if (tokenType) {\n switch (tokenType) {\n case TokenType.Aad:\n return models.TokenType.Aad;\n case TokenType.Embed:\n return models.TokenType.Embed;\n default:\n return models.TokenType.Aad;\n }\n } else {\n // default is AAD\n return models.TokenType.Aad;\n }\n }\n\n /**\n * Returns an embed configuration object.\n * @param accessToken - Access token required to embed a component\n * @param tokenType - type of accessToken: Aad or Embed\n * @param embedUrl - Embed URL obtained through Power BI REST API or Portal\n * @param id - component/element GUID\n * @param type - type of embedded component e.g. 'dashboard, report or tile'\n * @param name - name of the embedded component\n * @param options - Embed configuration options\n * @returns Embed configuration object\n */\n private getConfig(\n accessToken?: string,\n tokenType?: TokenType,\n embedUrl?: string,\n id?: string,\n type?: ReportType,\n name?: string,\n options?: models.ISettings\n ): pbi.IEmbedConfiguration {\n // For null arguments - use the initial value\n // For specified arguments - use the current value\n return {\n type: type ? type : this.type ? this.type : ReportType.Report,\n embedUrl: embedUrl ? embedUrl : this.embedUrl,\n accessToken: accessToken ? accessToken : this.accessToken,\n tokenType: tokenType\n ? this.getTokenType(tokenType)\n : this.getTokenType(this.tokenType),\n id: id ? id : this.id,\n uniqueId: name ? name : this.name,\n settings: options ? options : this.options\n };\n }\n\n /**\n * Given an HTMLElement, construct an embed configuration based on attributes and pass to service.\n * @param element - native element where the embedding needs to be done\n * @param config - configuration to be embedded\n */\n private embed(element: HTMLElement, config: pbi.IEmbedConfiguration) {\n /*if (this.options) {\n const newConfig = { config, ...this.options };\n }*/\n\n this.component = this.powerBiService.embed(element, config);\n this.embedded.emit(this.component as any);\n }\n\n /**\n * Reset the component that has been removed from DOM.\n * @param element - native element where the embedded was made\n */\n reset(element: HTMLElement) {\n this.powerBiService.reset(element);\n this.component = null;\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { NgxPowerBiComponent } from './ngx-powerbi.component';\n\n@NgModule({\n imports: [],\n declarations: [NgxPowerBiComponent],\n exports: [NgxPowerBiComponent]\n})\nexport class NgxPowerBiModule {}\n","/*\n * Public API Surface of ngx-powerbi\n */\n\nexport * from './lib/ngx-powerbi.service';\nexport * from './lib/ngx-powerbi.component';\nexport * from './lib/ngx-powerbi.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["pbiService","service","i1.NgxPowerBiService"],"mappings":"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"}