From 6d909afd7a2f3fd446bcb80fe1fecda6b2ebcddc Mon Sep 17 00:00:00 2001 From: Ali Hamud Date: Wed, 14 Mar 2018 15:45:16 +0000 Subject: [PATCH] Merged PR 4079: push bookmarks changes to master --- dist/powerbi-client.d.ts | 166 +++++++++++++++++++++++++++++--------- dist/powerbi.js | 167 ++++++++++++++++++++++++++++++++------- dist/powerbi.min.js | 6 +- src/bookmarksManager.ts | 136 +++++++++++++++++++++++++++++++ src/report.ts | 71 +++++++++-------- 5 files changed, 444 insertions(+), 102 deletions(-) create mode 100644 src/bookmarksManager.ts diff --git a/dist/powerbi-client.d.ts b/dist/powerbi-client.d.ts index 59c97eda..1b07988c 100644 --- a/dist/powerbi-client.d.ts +++ b/dist/powerbi-client.d.ts @@ -1,11 +1,4 @@ /*! powerbi-client v2.4.7 | (c) 2016 Microsoft Corporation MIT */ -declare module "config" { - const config: { - version: string; - type: string; - }; - export default config; -} declare module "util" { /** * Raises a custom event with event data on the specified HTML element. @@ -659,6 +652,7 @@ declare module "report" { import { IFilterable } from "ifilterable"; import { Page } from "page"; import { IReportLoadConfiguration } from 'powerbi-models'; + import { BookmarksManager } from "bookmarksManager"; /** * A Report node within a report hierarchy * @@ -686,6 +680,7 @@ declare module "report" { static navContentPaneEnabledAttribute: string; static typeAttribute: string; static type: string; + bookmarksManager: BookmarksManager; /** * Creates an instance of a Power BI Report. * @@ -862,6 +857,42 @@ declare module "report" { refresh(): Promise; } } +declare module "create" { + import * as service from "service"; + import * as models from 'powerbi-models'; + import * as embed from "embed"; + export class Create extends embed.Embed { + constructor(service: service.Service, element: HTMLElement, config: embed.IEmbedConfiguration, phasedRender?: boolean); + /** + * Gets the dataset ID from the first available location: createConfig or embed url. + * + * @returns {string} + */ + getId(): string; + /** + * Validate create report configuration. + */ + validate(config: embed.IEmbedConfigurationBase): models.IError[]; + /** + * Populate config for create + * + * @param {IEmbedConfigurationBase} + * @returns {void} + */ + populateConfig(baseConfig: embed.IEmbedConfigurationBase): void; + /** + * Adds the ability to get datasetId from url. + * (e.g. http://embedded.powerbi.com/appTokenReportEmbed?datasetId=854846ed-2106-4dc2-bc58-eb77533bf2f1). + * + * By extracting the ID we can ensure that the ID is always explicitly provided as part of the create configuration. + * + * @static + * @param {string} url + * @returns {string} + */ + static findIdFromEmbedUrl(url: string): string; + } +} declare module "dashboard" { import * as service from "service"; import * as embed from "embed"; @@ -1275,41 +1306,98 @@ declare module "service" { preload(config: embed.IEmbedConfigurationBase, element?: HTMLElement): HTMLIFrameElement; } } -declare module "create" { +declare module "bookmarksManager" { import * as service from "service"; - import * as models from 'powerbi-models'; import * as embed from "embed"; - export class Create extends embed.Embed { - constructor(service: service.Service, element: HTMLElement, config: embed.IEmbedConfiguration, phasedRender?: boolean); - /** - * Gets the dataset ID from the first available location: createConfig or embed url. - * - * @returns {string} - */ - getId(): string; - /** - * Validate create report configuration. - */ - validate(config: embed.IEmbedConfigurationBase): models.IError[]; - /** - * Populate config for create - * - * @param {IEmbedConfigurationBase} - * @returns {void} - */ - populateConfig(baseConfig: embed.IEmbedConfigurationBase): void; - /** - * Adds the ability to get datasetId from url. - * (e.g. http://embedded.powerbi.com/appTokenReportEmbed?datasetId=854846ed-2106-4dc2-bc58-eb77533bf2f1). - * - * By extracting the ID we can ensure that the ID is always explicitly provided as part of the create configuration. - * - * @static - * @param {string} url - * @returns {string} - */ - static findIdFromEmbedUrl(url: string): string; + import * as models from 'powerbi-models'; + /** + * Report bookmarks management APIs. + * + * @export + * @interface IBookmarksManager + */ + export interface IBookmarksManager { + getBookmarks(): Promise; + apply(bookmarkName: string): Promise; + play(playMode: models.BookmarksPlayMode): Promise; + capture(): Promise; + applyState(state: string): Promise; } + /** + * Manages report bookmarks. + * + * @export + * @class BookmarksManager + * @implements {IBookmarksManager} + */ + export class BookmarksManager implements IBookmarksManager { + private service; + private config; + private iframe; + constructor(service: service.Service, config: embed.IEmbedConfigurationBase, iframe?: HTMLIFrameElement); + /** + * Gets bookmarks that are defined in the report. + * + * ```javascript + * // Gets bookmarks that are defined in the report + * bookmarksManager.getBookmarks() + * .then(bookmarks => { + * ... + * }); + * ``` + * + * @returns {Promise} + */ + getBookmarks(): Promise; + /** + * Apply bookmark By name. + * + * ```javascript + * bookmarksManager.apply(bookmarkName) + * ``` + * + * @returns {Promise} + */ + apply(bookmarkName: string): Promise; + /** + * Play bookmarks: Enter or Exit bookmarks presentation mode. + * + * ```javascript + * // Enter presentation mode. + * bookmarksManager.play(true) + * ``` + * + * @returns {Promise} + */ + play(playMode: models.BookmarksPlayMode): Promise; + /** + * Capture bookmark from current state. + * + * ```javascript + * bookmarksManager.capture() + * ``` + * + * @returns {Promise} + */ + capture(): Promise; + /** + * Apply bookmark state. + * + * ```javascript + * bookmarksManager.applyState(bookmarkName) + * ``` + * + * @returns {Promise} + */ + applyState(state: string): Promise; + } +} +declare module "config" { + const config: { + version: string; + type: string; + }; + export default config; } declare module "factories" { /** diff --git a/dist/powerbi.js b/dist/powerbi.js index cd74b321..fe373ce8 100644 --- a/dist/powerbi.js +++ b/dist/powerbi.js @@ -57,23 +57,23 @@ return /******/ (function(modules) { // webpackBootstrap var service = __webpack_require__(1); exports.service = service; - var factories = __webpack_require__(14); + var factories = __webpack_require__(15); exports.factories = factories; var models = __webpack_require__(4); exports.models = models; var report_1 = __webpack_require__(5); exports.Report = report_1.Report; - var dashboard_1 = __webpack_require__(10); + var dashboard_1 = __webpack_require__(11); exports.Dashboard = dashboard_1.Dashboard; - var tile_1 = __webpack_require__(11); + var tile_1 = __webpack_require__(12); exports.Tile = tile_1.Tile; var embed_1 = __webpack_require__(2); exports.Embed = embed_1.Embed; var page_1 = __webpack_require__(6); exports.Page = page_1.Page; - var qna_1 = __webpack_require__(12); + var qna_1 = __webpack_require__(13); exports.Qna = qna_1.Qna; - var visual_1 = __webpack_require__(13); + var visual_1 = __webpack_require__(14); exports.Visual = visual_1.Visual; var visualDescriptor_1 = __webpack_require__(7); exports.VisualDescriptor = visualDescriptor_1.VisualDescriptor; @@ -92,12 +92,12 @@ return /******/ (function(modules) { // webpackBootstrap var embed = __webpack_require__(2); var report_1 = __webpack_require__(5); - var create_1 = __webpack_require__(9); - var dashboard_1 = __webpack_require__(10); - var tile_1 = __webpack_require__(11); + var create_1 = __webpack_require__(10); + var dashboard_1 = __webpack_require__(11); + var tile_1 = __webpack_require__(12); var page_1 = __webpack_require__(6); - var qna_1 = __webpack_require__(12); - var visual_1 = __webpack_require__(13); + var qna_1 = __webpack_require__(13); + var visual_1 = __webpack_require__(14); var utils = __webpack_require__(3); /** * The Power BI Service embed component, which is the entry point to embed all other Power BI components into your application @@ -3416,6 +3416,7 @@ return /******/ (function(modules) { // webpackBootstrap var utils = __webpack_require__(3); var page_1 = __webpack_require__(6); var defaults_1 = __webpack_require__(8); + var bookmarksManager_1 = __webpack_require__(9); /** * The Power BI Report embed component * @@ -3447,6 +3448,7 @@ return /******/ (function(modules) { // webpackBootstrap this.loadPath = "/report/load"; this.phasedLoadPath = "/report/prepare"; Array.prototype.push.apply(this.allowedEvents, Report.allowedEvents); + this.bookmarksManager = new bookmarksManager_1.BookmarksManager(service, config, this.iframe); } /** * Adds backwards compatibility for the previous load configuration, which used the reportId query parameter to specify the report ID @@ -3714,7 +3716,7 @@ return /******/ (function(modules) { // webpackBootstrap throw response.body; }); }; - Report.allowedEvents = ["filtersApplied", "pageChanged", "commandTriggered", "swipeStart", "swipeEnd"]; + Report.allowedEvents = ["filtersApplied", "pageChanged", "commandTriggered", "swipeStart", "swipeEnd", "bookmarkApplied"]; Report.reportIdAttribute = 'powerbi-report-id'; Report.filterPaneEnabledAttribute = 'powerbi-settings-filter-pane-enabled'; Report.navContentPaneEnabledAttribute = 'powerbi-settings-nav-content-pane-enabled'; @@ -3974,6 +3976,117 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), /* 9 */ +/***/ (function(module, exports) { + + /** + * Manages report bookmarks. + * + * @export + * @class BookmarksManager + * @implements {IBookmarksManager} + */ + var BookmarksManager = (function () { + function BookmarksManager(service, config, iframe) { + this.service = service; + this.config = config; + this.iframe = iframe; + } + /** + * Gets bookmarks that are defined in the report. + * + * ```javascript + * // Gets bookmarks that are defined in the report + * bookmarksManager.getBookmarks() + * .then(bookmarks => { + * ... + * }); + * ``` + * + * @returns {Promise} + */ + BookmarksManager.prototype.getBookmarks = function () { + return this.service.hpm.get("/report/bookmarks", { uid: this.config.uniqueId }, this.iframe.contentWindow) + .then(function (response) { return response.body; }, function (response) { + throw response.body; + }); + }; + /** + * Apply bookmark By name. + * + * ```javascript + * bookmarksManager.apply(bookmarkName) + * ``` + * + * @returns {Promise} + */ + BookmarksManager.prototype.apply = function (bookmarkName) { + var request = { + name: bookmarkName + }; + return this.service.hpm.post("/report/bookmarks/applyByName", request, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .catch(function (response) { + throw response.body; + }); + }; + /** + * Play bookmarks: Enter or Exit bookmarks presentation mode. + * + * ```javascript + * // Enter presentation mode. + * bookmarksManager.play(true) + * ``` + * + * @returns {Promise} + */ + BookmarksManager.prototype.play = function (playMode) { + var playBookmarkRequest = { + playMode: playMode + }; + return this.service.hpm.post("/report/bookmarks/play", playBookmarkRequest, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .catch(function (response) { + throw response.body; + }); + }; + /** + * Capture bookmark from current state. + * + * ```javascript + * bookmarksManager.capture() + * ``` + * + * @returns {Promise} + */ + BookmarksManager.prototype.capture = function () { + return this.service.hpm.post("/report/bookmarks/capture", null, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .then(function (response) { return response.body; }, function (response) { + throw response.body; + }); + }; + /** + * Apply bookmark state. + * + * ```javascript + * bookmarksManager.applyState(bookmarkName) + * ``` + * + * @returns {Promise} + */ + BookmarksManager.prototype.applyState = function (state) { + var request = { + state: state + }; + return this.service.hpm.post("/report/bookmarks/applyState", request, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .catch(function (response) { + throw response.body; + }); + }; + return BookmarksManager; + }()); + exports.BookmarksManager = BookmarksManager; + + +/***/ }), +/* 10 */ /***/ (function(module, exports, __webpack_require__) { var __extends = (this && this.__extends) || function (d, b) { @@ -4052,7 +4165,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), -/* 10 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { var __extends = (this && this.__extends) || function (d, b) { @@ -4160,7 +4273,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), -/* 11 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { var __extends = (this && this.__extends) || function (d, b) { @@ -4247,7 +4360,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), -/* 12 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { var __extends = (this && this.__extends) || function (d, b) { @@ -4309,7 +4422,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), -/* 13 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { var __extends = (this && this.__extends) || function (d, b) { @@ -4447,13 +4560,13 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), -/* 14 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { - var config_1 = __webpack_require__(15); - var wpmp = __webpack_require__(16); - var hpm = __webpack_require__(17); - var router = __webpack_require__(18); + var config_1 = __webpack_require__(16); + var wpmp = __webpack_require__(17); + var hpm = __webpack_require__(18); + var router = __webpack_require__(19); exports.hpmFactory = function (wpmp, defaultTargetWindow, sdkVersion, sdkType) { if (sdkVersion === void 0) { sdkVersion = config_1.default.version; } if (sdkType === void 0) { sdkType = config_1.default.type; } @@ -4481,7 +4594,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), -/* 15 */ +/* 16 */ /***/ (function(module, exports) { var config = { @@ -4493,10 +4606,10 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }), -/* 16 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { - /*! window-post-message-proxy v0.2.4 | (c) 2016 Microsoft Corporation MIT */ + /*! window-post-message-proxy v0.2.5 | (c) 2016 Microsoft Corporation MIT */ (function webpackUniversalModuleDefinition(root, factory) { if(true) module.exports = factory(); @@ -4551,7 +4664,7 @@ return /******/ (function(modules) { // webpackBootstrap /************************************************************************/ /******/ ([ /* 0 */ - /***/ function(module, exports) { + /***/ (function(module, exports) { "use strict"; var WindowPostMessageProxy = (function () { @@ -4786,14 +4899,14 @@ return /******/ (function(modules) { // webpackBootstrap exports.WindowPostMessageProxy = WindowPostMessageProxy; - /***/ } + /***/ }) /******/ ]) }); ; //# sourceMappingURL=windowPostMessageProxy.js.map /***/ }), -/* 17 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { /*! http-post-message v0.2.3 | (c) 2016 Microsoft Corporation MIT */ @@ -4977,7 +5090,7 @@ return /******/ (function(modules) { // webpackBootstrap //# sourceMappingURL=httpPostMessage.js.map /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { /*! powerbi-router v0.1.5 | (c) 2016 Microsoft Corporation MIT */ diff --git a/dist/powerbi.min.js b/dist/powerbi.min.js index de1eac8b..36ddfb55 100644 --- a/dist/powerbi.min.js +++ b/dist/powerbi.min.js @@ -1,7 +1,7 @@ /*! powerbi-client v2.4.7 | (c) 2016 Microsoft Corporation MIT */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports["powerbi-client"]=e():t["powerbi-client"]=e()}(this,function(){return function(t){function e(a){if(r[a])return r[a].exports;var i=r[a]={exports:{},id:a,loaded:!1};return t[a].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){var a=r(1);e.service=a;var i=r(14);e.factories=i;var o=r(4);e.models=o;var n=r(5);e.Report=n.Report;var l=r(10);e.Dashboard=l.Dashboard;var s=r(11);e.Tile=s.Tile;var d=r(2);e.Embed=d.Embed;var u=r(6);e.Page=u.Page;var p=r(12);e.Qna=p.Qna;var c=r(13);e.Visual=c.Visual;var f=r(7);e.VisualDescriptor=f.VisualDescriptor;var h=new a.Service(i.hpmFactory,i.wpmpFactory,i.routerFactory);window.powerbi=h},function(t,e,r){var a=r(2),i=r(5),o=r(9),n=r(10),l=r(11),s=r(6),d=r(12),u=r(13),p=r(3),c=function(){function t(e,r,a,i){var o=this;void 0===i&&(i={}),this.wpmp=r(i.wpmpName,i.logMessages),this.hpm=e(this.wpmp,null,i.version,i.type),this.router=a(this.wpmp),this.router.post("/reports/:uniqueId/events/:eventName",function(t,e){var r={type:"report",id:t.params.uniqueId,name:t.params.eventName,value:t.body};o.handleEvent(r)}),this.router.post("/reports/:uniqueId/pages/:pageName/events/:eventName",function(t,e){var r={type:"report",id:t.params.uniqueId,name:t.params.eventName,value:t.body};o.handleEvent(r)}),this.router.post("/reports/:uniqueId/pages/:pageName/visuals/:visualName/events/:eventName",function(t,e){var r={type:"report",id:t.params.uniqueId,name:t.params.eventName,value:t.body};o.handleEvent(r)}),this.router.post("/dashboards/:uniqueId/events/:eventName",function(t,e){var r={type:"dashboard",id:t.params.uniqueId,name:t.params.eventName,value:t.body};o.handleEvent(r)}),this.router.post("/tile/:uniqueId/events/:eventName",function(t,e){var r={type:"tile",id:t.params.uniqueId,name:t.params.eventName,value:t.body};o.handleEvent(r)}),this.router.post("/qna/:uniqueId/events/:eventName",function(t,e){var r={type:"qna",id:t.params.uniqueId,name:t.params.eventName,value:t.body};o.handleEvent(r)}),this.embeds=[],this.config=p.assign({},t.defaultConfig,i),this.config.autoEmbedOnContentLoaded&&this.enableAutoEmbed()}return t.prototype.createReport=function(t,e){e.type="create";var r=t,a=new o.Create(this,r,e);return r.powerBiEmbed=a,this.addOrOverwriteEmbed(a,t),a},t.prototype.init=function(t,e){var r=this;void 0===e&&(e=void 0),t=t&&t instanceof HTMLElement?t:document.body;var i=Array.prototype.slice.call(t.querySelectorAll("["+a.Embed.embedUrlAttribute+"]"));return i.map(function(t){return r.embed(t,e)})},t.prototype.embed=function(t,e){return void 0===e&&(e={}),this.embedInternal(t,e)},t.prototype.load=function(t,e){return void 0===e&&(e={}),this.embedInternal(t,e,!0)},t.prototype.embedInternal=function(t,e,r){void 0===e&&(e={});var a,i=t;return a=i.powerBiEmbed?this.embedExisting(i,e,r):this.embedNew(i,e,r)},t.prototype.embedNew=function(e,r,o){var n=r.type||e.getAttribute(a.Embed.typeAttribute);if(!n)throw new Error("Attempted to embed using config "+JSON.stringify(r)+" on element "+e.outerHTML+", but could not determine what type of component to embed. You must specify a type in the configuration or as an attribute such as '"+a.Embed.typeAttribute+'="'+i.Report.type.toLowerCase()+"\"'.");r.type=n;var l=p.find(function(t){return n===t.type.toLowerCase()},t.components);if(!l)throw new Error("Attempted to embed component of type: "+n+" but did not find any matching component. Please verify the type you specified is intended.");var s=new l(this,e,r,o);return e.powerBiEmbed=s,this.addOrOverwriteEmbed(s,e),s},t.prototype.embedExisting=function(t,e,r){var a=p.find(function(e){return e.element===t},this.embeds);if(!a)throw new Error("Attempted to embed using config "+JSON.stringify(e)+" on element "+t.outerHTML+" which already has embedded comopnent associated, but could not find the existing comopnent in the list of active components. This could indicate the embeds list is out of sync with the DOM, or the component is referencing the incorrect HTML element.");if(e.type&&"qna"===e.type.toLowerCase())return this.embedNew(t,e);if("string"==typeof e.type&&e.type!==a.config.type){if("report"===e.type&&"create"===a.config.type){var o=new i.Report(this,t,e,(!1),t.powerBiEmbed.iframe);return o.load(e),t.powerBiEmbed=o,this.addOrOverwriteEmbed(a,t),o}throw new Error("Embedding on an existing element with a different type than the previous embed object is not supported. Attempted to embed using config "+JSON.stringify(e)+" on element "+t.outerHTML+", but the existing element contains an embed of type: "+this.config.type+" which does not match the new type: "+e.type)}return a.load(e,r),a},t.prototype.enableAutoEmbed=function(){var t=this;window.addEventListener("DOMContentLoaded",function(e){return t.init(document.body)},!1)},t.prototype.get=function(t){var e=t;if(!e.powerBiEmbed)throw new Error("You attempted to get an instance of powerbi component associated with element: "+t.outerHTML+" but there was no associated instance.");return e.powerBiEmbed},t.prototype.find=function(t){return p.find(function(e){return e.config.uniqueId===t},this.embeds)},t.prototype.addOrOverwriteEmbed=function(t,e){this.embeds=this.embeds.filter(function(t){return t.element.id!==e.id}),this.embeds.push(t)},t.prototype.reset=function(t){var e=t;if(e.powerBiEmbed){p.remove(function(t){return t===e.powerBiEmbed},this.embeds),delete e.powerBiEmbed;var r=t.querySelector("iframe");r&&(void 0!==r.remove?r.remove():r.parentElement.removeChild(r))}},t.prototype.handleTileEvents=function(t){"tile"===t.type&&this.handleEvent(t)},t.prototype.handleEvent=function(t){var e=p.find(function(e){return e.config.uniqueId===t.id},this.embeds);if(e){var r=t.value;if("pageChanged"===t.name){var a="newPage",i=r[a];if(!i)throw new Error("Page model not found at 'event.value."+a+"'.");r[a]=new s.Page(e,i.name,i.displayName,(!0))}p.raiseCustomEvent(e.element,t.name,r)}},t.prototype.preload=function(t,e){var r=document.createElement("iframe");r.setAttribute("style","display:none;"),r.setAttribute("src",t.embedUrl),r.setAttribute("scrolling","no"),r.setAttribute("allowfullscreen","false");var a=e;return a||(a=document.getElementsByTagName("body")[0]),a.appendChild(r),r.onload=function(){p.raiseCustomEvent(r,"preloaded",{})},r},t.components=[l.Tile,i.Report,n.Dashboard,d.Qna,u.Visual],t.defaultConfig={autoEmbedOnContentLoaded:!1,onError:function(){for(var t=[],e=0;e0?"&":"?";return t+=a+e+"="+r}e.raiseCustomEvent=r,e.findIndex=a,e.find=i,e.remove=o,e.assign=n,e.createRandomString=l,e.addParamToUrl=s},function(t,e,r){/*! powerbi-models v1.0.3 | (c) 2016 Microsoft Corporation MIT */ -!function(e,r){t.exports=r()}(this,function(){return function(t){function e(a){if(r[a])return r[a].exports;var i=r[a]={exports:{},id:a,loaded:!1};return t[a].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){function a(t){return l(t)&&!!t.keys}function i(t){return o(t)===I.Basic&&!!t.keyValues}function o(t){if(t.filterType)return t.filterType;var e=t,r=t;return"string"==typeof e.operator&&Array.isArray(e.values)?I.Basic:"string"==typeof r.logicalOperator&&Array.isArray(r.conditions)?I.Advanced:I.Unknown}function n(t){return void 0!==t.table&&void 0!==t.measure}function l(t){return void 0!==t.table&&void 0!==t.column}function s(t){return void 0!==t.table&&void 0!==t.hierarchy&&void 0!==t.hierarchyLevel}function d(t){var e=t.message;return e||(e=t.path+" is invalid. Not meeting "+t.keyword+" constraint"),{message:e}}function u(t){var r=e.Validators.playBookmarkRequestValidator.validate(t);return r?r.map(d):void 0}function p(t){var r=e.Validators.addBookmarkRequestValidator.validate(t);return r?r.map(d):void 0}function c(t){var r=e.Validators.applyBookmarkByNameRequestValidator.validate(t);return r?r.map(d):void 0}function f(t){var r=e.Validators.applyBookmarkStateRequestValidator.validate(t);return r?r.map(d):void 0}function h(t){var r=e.Validators.settingsValidator.validate(t);return r?r.map(d):void 0}function v(t){var r=e.Validators.customPageSizeValidator.validate(t);return r?r.map(d):void 0}function y(t){var r=e.Validators.extentionValidator.validate(t);return r?r.map(d):void 0}function m(t){var r=e.Validators.reportLoadValidator.validate(t);return r?r.map(d):void 0}function g(t){var r=e.Validators.reportCreateValidator.validate(t);return r?r.map(d):void 0}function V(t){var r=e.Validators.dashboardLoadValidator.validate(t);return r?r.map(d):void 0}function w(t){var r=e.Validators.tileLoadValidator.validate(t);return r?r.map(d):void 0}function b(t){var r=e.Validators.pageValidator.validate(t);return r?r.map(d):void 0}function E(t){var r=e.Validators.filtersValidator.validate(t);return r?r.map(d):void 0}function P(t){var r=e.Validators.saveAsParametersValidator.validate(t);return r?r.map(d):void 0}function O(t){var r=e.Validators.loadQnaValidator.validate(t);return r?r.map(d):void 0}function T(t){var r=e.Validators.qnaInterpretInputDataValidator.validate(t);return r?r.map(d):void 0}function _(t){var r=e.Validators.exportDataRequestValidator.validate(t);return r?r.map(d):void 0}var A=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function a(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(a.prototype=r.prototype,new a)}}();Object.defineProperty(e,"__esModule",{value:!0}),e.Validators=r(1).Validators;var R;!function(t){t[t.Widescreen=0]="Widescreen",t[t.Standard=1]="Standard",t[t.Cortana=2]="Cortana",t[t.Letter=3]="Letter",t[t.Custom=4]="Custom"}(R=e.PageSizeType||(e.PageSizeType={}));var x;!function(t){t[t.FitToPage=0]="FitToPage",t[t.FitToWidth=1]="FitToWidth",t[t.ActualSize=2]="ActualSize"}(x=e.DisplayOption||(e.DisplayOption={}));var S;!function(t){t[t.Visible=0]="Visible",t[t.Hidden=1]="Hidden"}(S=e.VisualContainerDisplayMode||(e.VisualContainerDisplayMode={}));var F;!function(t){t[t.Master=0]="Master",t[t.Custom=1]="Custom",t[t.MobilePortrait=2]="MobilePortrait",t[t.MobileLandscape=3]="MobileLandscape"}(F=e.LayoutType||(e.LayoutType={}));var k;!function(t){t[t.AlwaysVisible=0]="AlwaysVisible",t[t.HiddenInViewMode=1]="HiddenInViewMode"}(k=e.SectionVisibility||(e.SectionVisibility={}));var q;!function(t){t[t.Read=0]="Read",t[t.ReadWrite=1]="ReadWrite",t[t.Copy=2]="Copy",t[t.Create=4]="Create",t[t.All=7]="All"}(q=e.Permissions||(e.Permissions={}));var M;!function(t){t[t.View=0]="View",t[t.Edit=1]="Edit"}(M=e.ViewMode||(e.ViewMode={}));var C;!function(t){t[t.Aad=0]="Aad",t[t.Embed=1]="Embed"}(C=e.TokenType||(e.TokenType={}));var I;!function(t){t[t.Advanced=0]="Advanced",t[t.Basic=1]="Basic",t[t.Unknown=2]="Unknown",t[t.IncludeExclude=3]="IncludeExclude",t[t.RelativeDate=4]="RelativeDate",t[t.TopN=5]="TopN"}(I=e.FilterType||(e.FilterType={}));var j;!function(t){t[t.Days=0]="Days",t[t.Weeks=1]="Weeks",t[t.CalendarWeeks=2]="CalendarWeeks",t[t.Months=3]="Months",t[t.CalendarMonths=4]="CalendarMonths",t[t.Years=5]="Years",t[t.CalendarYears=6]="CalendarYears"}(j=e.RelativeDateFilterTimeUnit||(e.RelativeDateFilterTimeUnit={}));var N;!function(t){t[t.InLast=0]="InLast",t[t.InThis=1]="InThis",t[t.InNext=2]="InNext"}(N=e.RelativeDateOperators||(e.RelativeDateOperators={}));var L=function(){function t(t,e){this.target=t,this.filterType=e}return t.prototype.toJSON=function(){return{$schema:this.schemaUrl,target:this.target,filterType:this.filterType}},t}();e.Filter=L;var U=function(t){function e(r,a,i){var o=t.call(this,r,I.Unknown)||this;return o.message=a,o.notSupportedTypeName=i,o.schemaUrl=e.schemaUrl,o}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.message=this.message,e.notSupportedTypeName=this.notSupportedTypeName,e},e.schemaUrl="http://powerbi.com/product/schema#notSupported",e}(L);e.NotSupportedFilter=U;var D=function(t){function e(r,a,i){var o=t.call(this,r,I.IncludeExclude)||this;return o.values=i,o.isExclude=a,o.schemaUrl=e.schemaUrl,o}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.isExclude=this.isExclude,e.values=this.values,e},e.schemaUrl="http://powerbi.com/product/schema#includeExclude",e}(L);e.IncludeExcludeFilter=D;var W=function(t){function e(r,a,i){var o=t.call(this,r,I.TopN)||this;return o.operator=a,o.itemCount=i,o.schemaUrl=e.schemaUrl,o}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.operator=this.operator,e.itemCount=this.itemCount,e},e.schemaUrl="http://powerbi.com/product/schema#topN",e}(L);e.TopNFilter=W;var B=function(t){function e(r,a,i,o,n){var l=t.call(this,r,I.RelativeDate)||this;return l.operator=a,l.timeUnitsCount=i,l.timeUnitType=o,l.includeToday=n,l.schemaUrl=e.schemaUrl,l}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.operator=this.operator,e.timeUnitsCount=this.timeUnitsCount,e.timeUnitType=this.timeUnitType,e.includeToday=this.includeToday,e},e.schemaUrl="http://powerbi.com/product/schema#relativeDate",e}(L);e.RelativeDateFilter=B;var H=function(t){function e(r,a){for(var i=[],o=2;o0&&!i)throw new Error("You shold pass the values to be filtered for each key. You passed: no values and "+n+" keys");if(0===n&&i&&i.length>0)throw new Error("You passed key values but your target object doesn't contain the keys to be filtered");for(var l=0;l2)throw new Error("AdvancedFilters may not have more than two conditions. You passed: "+i.length);if(1===l.length&&"And"!==a)throw new Error('Logical Operator must be "And" when there is only one condition provided');return n.conditions=l,n}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.logicalOperator=this.logicalOperator,e.conditions=this.conditions,e},e.schemaUrl="http://powerbi.com/product/schema#advanced",e}(L);e.AdvancedFilter=J,e.isFilterKeyColumnsTarget=a,e.isBasicFilterWithKeys=i,e.getFilterType=o,e.isMeasure=n,e.isColumn=l,e.isHierarchy=s;var Y;!function(t){t[t.Interactive=0]="Interactive",t[t.ResultOnly=1]="ResultOnly"}(Y=e.QnaMode||(e.QnaMode={}));var Q;!function(t){t[t.Summarized=0]="Summarized",t[t.Underlying=1]="Underlying"}(Q=e.ExportDataType||(e.ExportDataType={}));var G;!function(t){t[t.Off=0]="Off",t[t.Presentation=1]="Presentation"}(G=e.BookmarksPlayMode||(e.BookmarksPlayMode={})),e.validatePlayBookmarkRequest=u,e.validateAddBookmarkRequest=p,e.validateApplyBookmarkByNameRequest=c,e.validateApplyBookmarkStateRequest=f,e.validateSettings=h,e.validateCustomPageSize=v,e.validateExtension=y,e.validateReportLoad=m,e.validateCreateReport=g,e.validateDashboardLoad=V,e.validateTileLoad=w,e.validatePage=b,e.validateFilter=E,e.validateSaveAsParameters=P,e.validateLoadQnaConfiguration=O,e.validateQnaInterpretInputData=T,e.validateExportDataRequest=_},function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});var a=r(2),i=r(3),o=r(5),n=r(6),l=r(7),s=r(8),d=r(9),u=r(10),p=r(11),c=r(12),f=r(13),h=r(14),v=r(15),y=r(16),m=r(17),g=r(18),V=r(19);e.Validators={advancedFilterTypeValidator:new a.EnumValidator([0]),advancedFilterValidator:new l.AdvancedFilterValidator,anyArrayValidator:new a.ArrayValidator([new d.AnyOfValidator([new a.StringValidator,new a.NumberValidator,new a.BooleanValidator])]),anyFilterValidator:new d.AnyOfValidator([new l.BasicFilterValidator,new l.AdvancedFilterValidator,new l.IncludeExcludeFilterValidator,new l.NotSupportedFilterValidator,new l.RelativeDateFilterValidator,new l.TopNFilterValidator]),anyValueValidator:new d.AnyOfValidator([new a.StringValidator,new a.NumberValidator,new a.BooleanValidator]),basicFilterTypeValidator:new a.EnumValidator([1]),basicFilterValidator:new l.BasicFilterValidator,playBookmarkRequestValidator:new n.PlayBookmarkRequestValidator,addBookmarkRequestValidator:new n.AddBookmarkRequestValidator,applyBookmarkByNameRequestValidator:new n.ApplyBookmarkByNameRequestValidator,applyBookmarkStateRequestValidator:new n.ApplyBookmarkStateRequestValidator,booleanArrayValidator:new a.BooleanArrayValidator,booleanValidator:new a.BooleanValidator,commandExtensionValidator:new i.CommandExtensionValidator,conditionItemValidator:new l.ConditionItemValidator,customLayoutValidator:new g.CustomLayoutValidator,customLayoutDisplayOptionValidator:new a.EnumValidator([0,1,2]),customPageSizeValidator:new h.CustomPageSizeValidator,dashboardLoadValidator:new c.DashboardLoadValidator,displayStateModeValidator:new a.EnumValidator([0,1]),displayStateValidator:new g.DisplayStateValidator,exportDataRequestValidator:new V.ExportDataRequestValidator,extensionPointsValidator:new i.ExtensionPointsValidator,extentionArrayValidator:new a.ArrayValidator([new i.ExtensionValidator]),extentionValidator:new i.ExtensionValidator,fieldRequiredValidator:new s.FieldRequiredValidator,filterColumnTargetValidator:new l.FilterColumnTargetValidator,filterConditionsValidator:new a.ArrayValidator([new l.ConditionItemValidator]),filterHierarchyTargetValidator:new l.FilterHierarchyTargetValidator,filterMeasureTargetValidator:new l.FilterMeasureTargetValidator,filterTargetValidator:new d.AnyOfValidator([new l.FilterColumnTargetValidator,new l.FilterHierarchyTargetValidator,new l.FilterMeasureTargetValidator]),filtersArrayValidator:new a.ArrayValidator([new d.AnyOfValidator([new l.BasicFilterValidator,new l.AdvancedFilterValidator,new l.RelativeDateFilterValidator])]),filtersValidator:new l.FilterValidator,includeExcludeFilterValidator:new l.IncludeExcludeFilterValidator,includeExludeFilterTypeValidator:new a.EnumValidator([3]),layoutTypeValidator:new a.EnumValidator([0,1,2,3]),loadQnaValidator:new v.LoadQnaValidator,menuExtensionValidator:new i.MenuExtensionValidator,notSupportedFilterTypeValidator:new a.EnumValidator([2]),notSupportedFilterValidator:new l.NotSupportedFilterValidator,numberArrayValidator:new a.NumberArrayValidator,numberValidator:new a.NumberValidator,pageLayoutValidator:new m.MapValidator([new a.StringValidator],[new g.VisualLayoutValidator]),pageSizeTypeValidator:new a.EnumValidator([0,1,2,3,4,5]),pageSizeValidator:new h.PageSizeValidator,pageValidator:new h.PageValidator,pageViewFieldValidator:new h.PageViewFieldValidator,pagesLayoutValidator:new m.MapValidator([new a.StringValidator],[new g.PageLayoutValidator]),permissionsValidator:new a.EnumValidator([0,1,2,4,7]),qnaInterpretInputDataValidator:new v.QnaInterpretInputDataValidator,qnaSettingValidator:new v.QnaSettingsValidator,relativeDateFilterOperatorValidator:new a.EnumValidator([0,1,2]),relativeDateFilterTimeUnitTypeValidator:new a.EnumValidator([0,1,2,3,4,5,6]),relativeDateFilterTypeValidator:new a.EnumValidator([4]),relativeDateFilterValidator:new l.RelativeDateFilterValidator,reportCreateValidator:new p.ReportCreateValidator,reportLoadValidator:new u.ReportLoadValidator,saveAsParametersValidator:new y.SaveAsParametersValidator,settingsValidator:new o.SettingsValidator,stringArrayValidator:new a.StringArrayValidator,stringValidator:new a.StringValidator,tileLoadValidator:new f.TileLoadValidator,tokenTypeValidator:new a.EnumValidator([0,1]),topNFilterTypeValidator:new a.EnumValidator([5]),topNFilterValidator:new l.TopNFilterValidator,viewModeValidator:new a.EnumValidator([0,1]),visualLayoutValidator:new g.VisualLayoutValidator}},function(t,e){var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function a(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(a.prototype=r.prototype,new a)}}();Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(){}return t.prototype.validate=function(t,e,r){return null==t?null:"object"!=typeof t||Array.isArray(t)?[{message:void 0!==r?r+" must be an object":"input must be an object",path:e,keyword:"type"}]:null},t}();e.ObjectValidator=a;var i=function(){function t(t){this.itemValidators=t}return t.prototype.validate=function(t,e,r){if(null==t)return null;if(!Array.isArray(t))return[{message:r+" property is invalid",path:(e?e+".":"")+r,keyword:"type"}];for(var a=0;a0?"&":"?";return t+=a+e+"="+r}e.raiseCustomEvent=r,e.findIndex=a,e.find=i,e.remove=o,e.assign=n,e.createRandomString=l,e.addParamToUrl=s},function(t,e,r){/*! powerbi-models v1.0.3 | (c) 2016 Microsoft Corporation MIT */ +!function(e,r){t.exports=r()}(this,function(){return function(t){function e(a){if(r[a])return r[a].exports;var i=r[a]={exports:{},id:a,loaded:!1};return t[a].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){function a(t){return l(t)&&!!t.keys}function i(t){return o(t)===I.Basic&&!!t.keyValues}function o(t){if(t.filterType)return t.filterType;var e=t,r=t;return"string"==typeof e.operator&&Array.isArray(e.values)?I.Basic:"string"==typeof r.logicalOperator&&Array.isArray(r.conditions)?I.Advanced:I.Unknown}function n(t){return void 0!==t.table&&void 0!==t.measure}function l(t){return void 0!==t.table&&void 0!==t.column}function s(t){return void 0!==t.table&&void 0!==t.hierarchy&&void 0!==t.hierarchyLevel}function d(t){var e=t.message;return e||(e=t.path+" is invalid. Not meeting "+t.keyword+" constraint"),{message:e}}function u(t){var r=e.Validators.playBookmarkRequestValidator.validate(t);return r?r.map(d):void 0}function p(t){var r=e.Validators.addBookmarkRequestValidator.validate(t);return r?r.map(d):void 0}function c(t){var r=e.Validators.applyBookmarkByNameRequestValidator.validate(t);return r?r.map(d):void 0}function f(t){var r=e.Validators.applyBookmarkStateRequestValidator.validate(t);return r?r.map(d):void 0}function h(t){var r=e.Validators.settingsValidator.validate(t);return r?r.map(d):void 0}function v(t){var r=e.Validators.customPageSizeValidator.validate(t);return r?r.map(d):void 0}function y(t){var r=e.Validators.extentionValidator.validate(t);return r?r.map(d):void 0}function m(t){var r=e.Validators.reportLoadValidator.validate(t);return r?r.map(d):void 0}function g(t){var r=e.Validators.reportCreateValidator.validate(t);return r?r.map(d):void 0}function V(t){var r=e.Validators.dashboardLoadValidator.validate(t);return r?r.map(d):void 0}function w(t){var r=e.Validators.tileLoadValidator.validate(t);return r?r.map(d):void 0}function b(t){var r=e.Validators.pageValidator.validate(t);return r?r.map(d):void 0}function E(t){var r=e.Validators.filtersValidator.validate(t);return r?r.map(d):void 0}function P(t){var r=e.Validators.saveAsParametersValidator.validate(t);return r?r.map(d):void 0}function O(t){var r=e.Validators.loadQnaValidator.validate(t);return r?r.map(d):void 0}function T(t){var r=e.Validators.qnaInterpretInputDataValidator.validate(t);return r?r.map(d):void 0}function _(t){var r=e.Validators.exportDataRequestValidator.validate(t);return r?r.map(d):void 0}var A=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function a(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(a.prototype=r.prototype,new a)}}();Object.defineProperty(e,"__esModule",{value:!0}),e.Validators=r(1).Validators;var k;!function(t){t[t.Widescreen=0]="Widescreen",t[t.Standard=1]="Standard",t[t.Cortana=2]="Cortana",t[t.Letter=3]="Letter",t[t.Custom=4]="Custom"}(k=e.PageSizeType||(e.PageSizeType={}));var R;!function(t){t[t.FitToPage=0]="FitToPage",t[t.FitToWidth=1]="FitToWidth",t[t.ActualSize=2]="ActualSize"}(R=e.DisplayOption||(e.DisplayOption={}));var S;!function(t){t[t.Visible=0]="Visible",t[t.Hidden=1]="Hidden"}(S=e.VisualContainerDisplayMode||(e.VisualContainerDisplayMode={}));var x;!function(t){t[t.Master=0]="Master",t[t.Custom=1]="Custom",t[t.MobilePortrait=2]="MobilePortrait",t[t.MobileLandscape=3]="MobileLandscape"}(x=e.LayoutType||(e.LayoutType={}));var F;!function(t){t[t.AlwaysVisible=0]="AlwaysVisible",t[t.HiddenInViewMode=1]="HiddenInViewMode"}(F=e.SectionVisibility||(e.SectionVisibility={}));var q;!function(t){t[t.Read=0]="Read",t[t.ReadWrite=1]="ReadWrite",t[t.Copy=2]="Copy",t[t.Create=4]="Create",t[t.All=7]="All"}(q=e.Permissions||(e.Permissions={}));var M;!function(t){t[t.View=0]="View",t[t.Edit=1]="Edit"}(M=e.ViewMode||(e.ViewMode={}));var C;!function(t){t[t.Aad=0]="Aad",t[t.Embed=1]="Embed"}(C=e.TokenType||(e.TokenType={}));var I;!function(t){t[t.Advanced=0]="Advanced",t[t.Basic=1]="Basic",t[t.Unknown=2]="Unknown",t[t.IncludeExclude=3]="IncludeExclude",t[t.RelativeDate=4]="RelativeDate",t[t.TopN=5]="TopN"}(I=e.FilterType||(e.FilterType={}));var j;!function(t){t[t.Days=0]="Days",t[t.Weeks=1]="Weeks",t[t.CalendarWeeks=2]="CalendarWeeks",t[t.Months=3]="Months",t[t.CalendarMonths=4]="CalendarMonths",t[t.Years=5]="Years",t[t.CalendarYears=6]="CalendarYears"}(j=e.RelativeDateFilterTimeUnit||(e.RelativeDateFilterTimeUnit={}));var N;!function(t){t[t.InLast=0]="InLast",t[t.InThis=1]="InThis",t[t.InNext=2]="InNext"}(N=e.RelativeDateOperators||(e.RelativeDateOperators={}));var L=function(){function t(t,e){this.target=t,this.filterType=e}return t.prototype.toJSON=function(){return{$schema:this.schemaUrl,target:this.target,filterType:this.filterType}},t}();e.Filter=L;var U=function(t){function e(r,a,i){var o=t.call(this,r,I.Unknown)||this;return o.message=a,o.notSupportedTypeName=i,o.schemaUrl=e.schemaUrl,o}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.message=this.message,e.notSupportedTypeName=this.notSupportedTypeName,e},e.schemaUrl="http://powerbi.com/product/schema#notSupported",e}(L);e.NotSupportedFilter=U;var D=function(t){function e(r,a,i){var o=t.call(this,r,I.IncludeExclude)||this;return o.values=i,o.isExclude=a,o.schemaUrl=e.schemaUrl,o}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.isExclude=this.isExclude,e.values=this.values,e},e.schemaUrl="http://powerbi.com/product/schema#includeExclude",e}(L);e.IncludeExcludeFilter=D;var W=function(t){function e(r,a,i){var o=t.call(this,r,I.TopN)||this;return o.operator=a,o.itemCount=i,o.schemaUrl=e.schemaUrl,o}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.operator=this.operator,e.itemCount=this.itemCount,e},e.schemaUrl="http://powerbi.com/product/schema#topN",e}(L);e.TopNFilter=W;var B=function(t){function e(r,a,i,o,n){var l=t.call(this,r,I.RelativeDate)||this;return l.operator=a,l.timeUnitsCount=i,l.timeUnitType=o,l.includeToday=n,l.schemaUrl=e.schemaUrl,l}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.operator=this.operator,e.timeUnitsCount=this.timeUnitsCount,e.timeUnitType=this.timeUnitType,e.includeToday=this.includeToday,e},e.schemaUrl="http://powerbi.com/product/schema#relativeDate",e}(L);e.RelativeDateFilter=B;var H=function(t){function e(r,a){for(var i=[],o=2;o0&&!i)throw new Error("You shold pass the values to be filtered for each key. You passed: no values and "+n+" keys");if(0===n&&i&&i.length>0)throw new Error("You passed key values but your target object doesn't contain the keys to be filtered");for(var l=0;l2)throw new Error("AdvancedFilters may not have more than two conditions. You passed: "+i.length);if(1===l.length&&"And"!==a)throw new Error('Logical Operator must be "And" when there is only one condition provided');return n.conditions=l,n}return A(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.logicalOperator=this.logicalOperator,e.conditions=this.conditions,e},e.schemaUrl="http://powerbi.com/product/schema#advanced",e}(L);e.AdvancedFilter=J,e.isFilterKeyColumnsTarget=a,e.isBasicFilterWithKeys=i,e.getFilterType=o,e.isMeasure=n,e.isColumn=l,e.isHierarchy=s;var Y;!function(t){t[t.Interactive=0]="Interactive",t[t.ResultOnly=1]="ResultOnly"}(Y=e.QnaMode||(e.QnaMode={}));var Q;!function(t){t[t.Summarized=0]="Summarized",t[t.Underlying=1]="Underlying"}(Q=e.ExportDataType||(e.ExportDataType={}));var G;!function(t){t[t.Off=0]="Off",t[t.Presentation=1]="Presentation"}(G=e.BookmarksPlayMode||(e.BookmarksPlayMode={})),e.validatePlayBookmarkRequest=u,e.validateAddBookmarkRequest=p,e.validateApplyBookmarkByNameRequest=c,e.validateApplyBookmarkStateRequest=f,e.validateSettings=h,e.validateCustomPageSize=v,e.validateExtension=y,e.validateReportLoad=m,e.validateCreateReport=g,e.validateDashboardLoad=V,e.validateTileLoad=w,e.validatePage=b,e.validateFilter=E,e.validateSaveAsParameters=P,e.validateLoadQnaConfiguration=O,e.validateQnaInterpretInputData=T,e.validateExportDataRequest=_},function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});var a=r(2),i=r(3),o=r(5),n=r(6),l=r(7),s=r(8),d=r(9),u=r(10),p=r(11),c=r(12),f=r(13),h=r(14),v=r(15),y=r(16),m=r(17),g=r(18),V=r(19);e.Validators={advancedFilterTypeValidator:new a.EnumValidator([0]),advancedFilterValidator:new l.AdvancedFilterValidator,anyArrayValidator:new a.ArrayValidator([new d.AnyOfValidator([new a.StringValidator,new a.NumberValidator,new a.BooleanValidator])]),anyFilterValidator:new d.AnyOfValidator([new l.BasicFilterValidator,new l.AdvancedFilterValidator,new l.IncludeExcludeFilterValidator,new l.NotSupportedFilterValidator,new l.RelativeDateFilterValidator,new l.TopNFilterValidator]),anyValueValidator:new d.AnyOfValidator([new a.StringValidator,new a.NumberValidator,new a.BooleanValidator]),basicFilterTypeValidator:new a.EnumValidator([1]),basicFilterValidator:new l.BasicFilterValidator,playBookmarkRequestValidator:new n.PlayBookmarkRequestValidator,addBookmarkRequestValidator:new n.AddBookmarkRequestValidator,applyBookmarkByNameRequestValidator:new n.ApplyBookmarkByNameRequestValidator,applyBookmarkStateRequestValidator:new n.ApplyBookmarkStateRequestValidator,booleanArrayValidator:new a.BooleanArrayValidator,booleanValidator:new a.BooleanValidator,commandExtensionValidator:new i.CommandExtensionValidator,conditionItemValidator:new l.ConditionItemValidator,customLayoutValidator:new g.CustomLayoutValidator,customLayoutDisplayOptionValidator:new a.EnumValidator([0,1,2]),customPageSizeValidator:new h.CustomPageSizeValidator,dashboardLoadValidator:new c.DashboardLoadValidator,displayStateModeValidator:new a.EnumValidator([0,1]),displayStateValidator:new g.DisplayStateValidator,exportDataRequestValidator:new V.ExportDataRequestValidator,extensionPointsValidator:new i.ExtensionPointsValidator,extentionArrayValidator:new a.ArrayValidator([new i.ExtensionValidator]),extentionValidator:new i.ExtensionValidator,fieldRequiredValidator:new s.FieldRequiredValidator,filterColumnTargetValidator:new l.FilterColumnTargetValidator,filterConditionsValidator:new a.ArrayValidator([new l.ConditionItemValidator]),filterHierarchyTargetValidator:new l.FilterHierarchyTargetValidator,filterMeasureTargetValidator:new l.FilterMeasureTargetValidator,filterTargetValidator:new d.AnyOfValidator([new l.FilterColumnTargetValidator,new l.FilterHierarchyTargetValidator,new l.FilterMeasureTargetValidator]),filtersArrayValidator:new a.ArrayValidator([new d.AnyOfValidator([new l.BasicFilterValidator,new l.AdvancedFilterValidator,new l.RelativeDateFilterValidator])]),filtersValidator:new l.FilterValidator,includeExcludeFilterValidator:new l.IncludeExcludeFilterValidator,includeExludeFilterTypeValidator:new a.EnumValidator([3]),layoutTypeValidator:new a.EnumValidator([0,1,2,3]),loadQnaValidator:new v.LoadQnaValidator,menuExtensionValidator:new i.MenuExtensionValidator,notSupportedFilterTypeValidator:new a.EnumValidator([2]),notSupportedFilterValidator:new l.NotSupportedFilterValidator,numberArrayValidator:new a.NumberArrayValidator,numberValidator:new a.NumberValidator,pageLayoutValidator:new m.MapValidator([new a.StringValidator],[new g.VisualLayoutValidator]),pageSizeTypeValidator:new a.EnumValidator([0,1,2,3,4,5]),pageSizeValidator:new h.PageSizeValidator,pageValidator:new h.PageValidator,pageViewFieldValidator:new h.PageViewFieldValidator,pagesLayoutValidator:new m.MapValidator([new a.StringValidator],[new g.PageLayoutValidator]),permissionsValidator:new a.EnumValidator([0,1,2,4,7]),qnaInterpretInputDataValidator:new v.QnaInterpretInputDataValidator,qnaSettingValidator:new v.QnaSettingsValidator,relativeDateFilterOperatorValidator:new a.EnumValidator([0,1,2]),relativeDateFilterTimeUnitTypeValidator:new a.EnumValidator([0,1,2,3,4,5,6]),relativeDateFilterTypeValidator:new a.EnumValidator([4]),relativeDateFilterValidator:new l.RelativeDateFilterValidator,reportCreateValidator:new p.ReportCreateValidator,reportLoadValidator:new u.ReportLoadValidator,saveAsParametersValidator:new y.SaveAsParametersValidator,settingsValidator:new o.SettingsValidator,stringArrayValidator:new a.StringArrayValidator,stringValidator:new a.StringValidator,tileLoadValidator:new f.TileLoadValidator,tokenTypeValidator:new a.EnumValidator([0,1]),topNFilterTypeValidator:new a.EnumValidator([5]),topNFilterValidator:new l.TopNFilterValidator,viewModeValidator:new a.EnumValidator([0,1]),visualLayoutValidator:new g.VisualLayoutValidator}},function(t,e){var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function a(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(a.prototype=r.prototype,new a)}}();Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(){}return t.prototype.validate=function(t,e,r){return null==t?null:"object"!=typeof t||Array.isArray(t)?[{message:void 0!==r?r+" must be an object":"input must be an object",path:e,keyword:"type"}]:null},t}();e.ObjectValidator=a;var i=function(){function t(t){this.itemValidators=t}return t.prototype.validate=function(t,e,r){if(null==t)return null;if(!Array.isArray(t))return[{message:r+" property is invalid",path:(e?e+".":"")+r,keyword:"type"}];for(var a=0;a2&&"[]"===n.slice(l-2)&&(s=!0,n=n.slice(0,l-2),r[n]||(r[n]=[])),i=o[1]?w(o[1]):""),s?r[n].push(i):r[n]=i}return r},recognize:function(t){var e,r,a,i=[this.rootState],o={},n=!1;if(a=t.indexOf("?"),a!==-1){var l=t.substr(a+1,t.length);t=t.substr(0,a),o=this.parseQueryString(l)}for(t=decodeURI(t),"/"!==t.charAt(0)&&(t="/"+t),e=t.length,e>1&&"/"===t.charAt(e-1)&&(t=t.substr(0,e-1),n=!0),r=0;r; + apply(bookmarkName: string): Promise; + play(playMode: models.BookmarksPlayMode): Promise; + + capture(): Promise; + applyState(state: string): Promise; +} + +/** + * Manages report bookmarks. + * + * @export + * @class BookmarksManager + * @implements {IBookmarksManager} + */ +export class BookmarksManager implements IBookmarksManager { + + constructor(private service: service.Service, private config: embed.IEmbedConfigurationBase, private iframe?: HTMLIFrameElement) { + } + + /** + * Gets bookmarks that are defined in the report. + * + * ```javascript + * // Gets bookmarks that are defined in the report + * bookmarksManager.getBookmarks() + * .then(bookmarks => { + * ... + * }); + * ``` + * + * @returns {Promise} + */ + getBookmarks(): Promise { + return this.service.hpm.get(`/report/bookmarks`, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .then(response => response.body, + response => { + throw response.body; + }); + } + + /** + * Apply bookmark By name. + * + * ```javascript + * bookmarksManager.apply(bookmarkName) + * ``` + * + * @returns {Promise} + */ + apply(bookmarkName: string): Promise { + var request: models.IApplyBookmarkByNameRequest = { + name: bookmarkName + }; + + return this.service.hpm.post(`/report/bookmarks/applyByName`, request, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .catch(response => { + throw response.body; + }); + } + + /** + * Play bookmarks: Enter or Exit bookmarks presentation mode. + * + * ```javascript + * // Enter presentation mode. + * bookmarksManager.play(true) + * ``` + * + * @returns {Promise} + */ + play(playMode: models.BookmarksPlayMode): Promise { + var playBookmarkRequest: models.IPlayBookmarkRequest = { + playMode: playMode + }; + + return this.service.hpm.post(`/report/bookmarks/play`, playBookmarkRequest, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .catch(response => { + throw response.body; + }); + } + + /** + * Capture bookmark from current state. + * + * ```javascript + * bookmarksManager.capture() + * ``` + * + * @returns {Promise} + */ + capture(): Promise { + return this.service.hpm.post(`/report/bookmarks/capture`, null, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .then(response => response.body, + response => { + throw response.body; + }); + } + + /** + * Apply bookmark state. + * + * ```javascript + * bookmarksManager.applyState(bookmarkName) + * ``` + * + * @returns {Promise} + */ + applyState(state: string): Promise { + var request: models.IApplyBookmarkStateRequest = { + state: state + }; + + return this.service.hpm.post(`/report/bookmarks/applyState`, request, { uid: this.config.uniqueId }, this.iframe.contentWindow) + .catch(response => { + throw response.body; + }); + } +} diff --git a/src/report.ts b/src/report.ts index 698debde..f610bf1c 100644 --- a/src/report.ts +++ b/src/report.ts @@ -8,10 +8,11 @@ import { IFilterable } from './ifilterable'; import { IPageNode, Page } from './page'; import { Defaults } from './defaults'; import { IReportLoadConfiguration } from 'powerbi-models'; +import { BookmarksManager } from './bookmarksManager'; /** * A Report node within a report hierarchy - * + * * @export * @interface IReportNode */ @@ -23,7 +24,7 @@ export interface IReportNode { /** * The Power BI Report embed component - * + * * @export * @class Report * @extends {embed.Embed} @@ -31,16 +32,18 @@ export interface IReportNode { * @implements {IFilterable} */ export class Report extends embed.Embed implements IReportNode, IFilterable { - static allowedEvents = ["filtersApplied", "pageChanged", "commandTriggered", "swipeStart", "swipeEnd"]; + static allowedEvents = ["filtersApplied", "pageChanged", "commandTriggered", "swipeStart", "swipeEnd", "bookmarkApplied"]; static reportIdAttribute = 'powerbi-report-id'; static filterPaneEnabledAttribute = 'powerbi-settings-filter-pane-enabled'; static navContentPaneEnabledAttribute = 'powerbi-settings-nav-content-pane-enabled'; static typeAttribute = 'powerbi-type'; static type = "Report"; + public bookmarksManager: BookmarksManager; + /** * Creates an instance of a Power BI Report. - * + * * @param {service.Service} service * @param {HTMLElement} element * @param {embed.IEmbedConfiguration} config @@ -60,14 +63,16 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { this.loadPath = "/report/load"; this.phasedLoadPath = "/report/prepare"; Array.prototype.push.apply(this.allowedEvents, Report.allowedEvents); + + this.bookmarksManager = new BookmarksManager(service, config, this.iframe); } /** * Adds backwards compatibility for the previous load configuration, which used the reportId query parameter to specify the report ID * (e.g. http://embedded.powerbi.com/appTokenReportEmbed?reportId=854846ed-2106-4dc2-bc58-eb77533bf2f1). - * + * * By extracting the ID we can ensure that the ID is always explicitly provided as part of the load configuration. - * + * * @static * @param {string} url * @returns {string} @@ -84,20 +89,20 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { return reportId; } - + /** * Render a preloaded report, using phased embedding API - * + * * ```javascript * // Load report * var report = powerbi.load(element, config); - * + * * ... - * + * * // Render report * report.render() * ``` - * + * * @returns {Promise} */ render(config?: IReportLoadConfiguration): Promise { @@ -112,7 +117,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Gets filters that are applied at the report level. - * + * * ```javascript * // Get filters applied at report level * report.getFilters() @@ -120,7 +125,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * ... * }); * ``` - * + * * @returns {Promise} */ getFilters(): Promise { @@ -133,7 +138,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Gets the report ID from the first available location: options, attribute, embed url. - * + * * @returns {string} */ getId(): string { @@ -149,14 +154,14 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Gets the list of pages within the report. - * + * * ```javascript * report.getPages() * .then(pages => { * ... * }); * ``` - * + * * @returns {Promise} */ getPages(): Promise { @@ -173,18 +178,18 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Creates an instance of a Page. - * + * * Normally you would get Page objects by calling `report.getPages()`, but in the case * that the page name is known and you want to perform an action on a page without having to retrieve it * you can create it directly. - * + * * Note: Because you are creating the page manually there is no guarantee that the page actually exists in the report, and subsequent requests could fail. - * + * * ```javascript * const page = report.page('ReportSection1'); * page.setActive(); * ``` - * + * * @param {string} name * @param {string} [displayName] * @param {boolean} [isActive] @@ -209,11 +214,11 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Removes all filters at the report level. - * + * * ```javascript * report.removeFilters(); * ``` - * + * * @returns {Promise} */ removeFilters(): Promise { @@ -222,12 +227,12 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Sets the active page of the report. - * + * * ```javascript * report.setPage("page2") * .catch(error => { ... }); * ``` - * + * * @param {string} pageName * @returns {Promise} */ @@ -246,18 +251,18 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Sets filters at the report level. - * + * * ```javascript * const filters: [ * ... * ]; - * + * * report.setFilters(filters) * .catch(errors => { * ... * }); * ``` - * + * * @param {(models.IFilter[])} filters * @returns {Promise} */ @@ -270,17 +275,17 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Updates visibility settings for the filter pane and the page navigation pane. - * + * * ```javascript * const newSettings = { * navContentPaneEnabled: true, * filterPaneEnabled: false * }; - * + * * report.updateSettings(newSettings) * .catch(error => { ... }); * ``` - * + * * @param {models.ISettings} settings * @returns {Promise} */ @@ -300,7 +305,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Populate config for load config - * + * * @param {IEmbedConfigurationBase} * @returns {void} */ @@ -321,7 +326,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Switch Report view mode. - * + * * @returns {Promise} */ switchMode(viewMode: models.ViewMode): Promise { @@ -337,7 +342,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Refreshes data sources for the report. - * + * * ```javascript * report.refresh(); * ```