diff --git a/.eslintrc.js b/.eslintrc.js index 5e6d4467..ebc8387a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,254 +1,255 @@ // TODO: Remove "warn" settings for the rules after resolving them module.exports = { - "env": { - "browser": true, - "node": true - }, - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "webpack.test.tsconfig.json", - "sourceType": "module" - }, - "plugins": [ - "eslint-plugin-jsdoc", - "eslint-plugin-prefer-arrow", - "eslint-plugin-import", - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/adjacent-overload-signatures": "warn", - "@typescript-eslint/array-type": [ - "warn", - { - "default": "array-simple" - } - ], - "@typescript-eslint/await-thenable": "warn", - "@typescript-eslint/ban-ts-comment": "warn", - "@typescript-eslint/ban-types": [ - "warn", - { - "types": { - "Object": { - "message": "Avoid using the `Object` type. Did you mean `object`?" - }, - "Function": { - "message": "Avoid using the `Function` type. Prefer a specific function type, like `() => void`." - }, - "Boolean": { - "message": "Avoid using the `Boolean` type. Did you mean `boolean`?" - }, - "Number": { - "message": "Avoid using the `Number` type. Did you mean `number`?" - }, - "String": { - "message": "Avoid using the `String` type. Did you mean `string`?" - }, - "Symbol": { - "message": "Avoid using the `Symbol` type. Did you mean `symbol`?" - } - } - } - ], - "@typescript-eslint/consistent-type-assertions": "warn", - "@typescript-eslint/consistent-type-definitions": "warn", - "@typescript-eslint/dot-notation": "warn", - "@typescript-eslint/explicit-member-accessibility": [ - "off", - { - "accessibility": "explicit" - } - ], - "@typescript-eslint/explicit-module-boundary-types": "warn", - "@typescript-eslint/indent": [ - "warn", - 2, - { - "FunctionDeclaration": { - "parameters": "first" - }, - "FunctionExpression": { - "parameters": "first" - } - } - ], - "@typescript-eslint/member-delimiter-style": [ - "warn", - { - "multiline": { - "delimiter": "semi", - "requireLast": true - }, - "singleline": { - "delimiter": "semi", - "requireLast": false - } - } - ], - "@typescript-eslint/member-ordering": "warn", - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/no-array-constructor": "warn", - "@typescript-eslint/no-empty-function": "warn", - "@typescript-eslint/no-empty-interface": "warn", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-extra-non-null-assertion": "warn", - "@typescript-eslint/no-extra-semi": "warn", - "@typescript-eslint/no-floating-promises": "warn", - "@typescript-eslint/no-for-in-array": "warn", - "@typescript-eslint/no-implied-eval": "warn", - "@typescript-eslint/no-inferrable-types": "warn", - "@typescript-eslint/no-misused-new": "warn", - "@typescript-eslint/no-misused-promises": "warn", - "@typescript-eslint/no-namespace": "warn", - "@typescript-eslint/no-non-null-asserted-optional-chain": "warn", - "@typescript-eslint/no-non-null-assertion": "warn", - "@typescript-eslint/no-parameter-properties": "off", - "@typescript-eslint/no-this-alias": "warn", - "@typescript-eslint/no-unnecessary-type-assertion": "warn", - "@typescript-eslint/no-unsafe-assignment": "warn", - "@typescript-eslint/no-unsafe-call": "warn", - "@typescript-eslint/no-unsafe-member-access": "warn", - "@typescript-eslint/no-unsafe-return": "warn", - "@typescript-eslint/no-unused-expressions": "warn", - "@typescript-eslint/no-unused-vars": "warn", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/no-var-requires": "warn", - "@typescript-eslint/prefer-as-const": "warn", - "@typescript-eslint/prefer-for-of": "warn", - "@typescript-eslint/prefer-function-type": "warn", - "@typescript-eslint/prefer-namespace-keyword": "warn", - "@typescript-eslint/prefer-regexp-exec": "warn", - "@typescript-eslint/quotes": [ - "off", - { - "avoidEscape": true - } - ], - "@typescript-eslint/require-await": "warn", - "@typescript-eslint/restrict-plus-operands": "warn", - "@typescript-eslint/restrict-template-expressions": "warn", - "@typescript-eslint/semi": [ - "warn", - "always" - ], - "@typescript-eslint/triple-slash-reference": [ - "warn", - { - "path": "always", - "types": "prefer-import", - "lib": "always" - } - ], - "@typescript-eslint/type-annotation-spacing": "warn", - "@typescript-eslint/unbound-method": "warn", - "@typescript-eslint/unified-signatures": "warn", - "arrow-body-style": "warn", - "arrow-parens": [ - "warn", - "always" - ], - "brace-style": [ - "off", - "1tbs" - ], - "comma-dangle": "off", - "complexity": "off", - "constructor-super": "warn", - "curly": "warn", - "eol-last": "warn", - "eqeqeq": [ - "warn", - "smart" - ], - "guard-for-in": "warn", - "id-blacklist": [ - "warn", - "any", - "Number", - "number", - "String", - "string", - "Boolean", - "boolean", - "Undefined", - "undefined" - ], - "id-match": "warn", - "import/order": "warn", - "jsdoc/check-alignment": "warn", - "jsdoc/check-indentation": "warn", - "jsdoc/newline-after-description": "warn", - "max-classes-per-file": [ - "warn", - 1 - ], - "max-len": "off", - "new-parens": "warn", - "no-array-constructor": "off", - "no-bitwise": "warn", - "no-caller": "warn", - "no-cond-assign": "warn", - "no-console": "off", - "no-debugger": "warn", - "no-empty": "warn", - "no-empty-function": "off", - "no-eval": "warn", - "no-extra-semi": "off", - "no-fallthrough": "off", - "no-implied-eval": "off", - "no-invalid-this": "off", - "no-multiple-empty-lines": "warn", - "no-new-wrappers": "warn", - "no-shadow": [ - "warn", - { - "hoist": "all" - } - ], - "no-throw-literal": "warn", - "no-trailing-spaces": "warn", - "no-undef-init": "warn", - "no-underscore-dangle": "warn", - "no-unsafe-finally": "warn", - "no-unused-labels": "warn", - "no-unused-vars": "off", - "no-var": "warn", - "object-shorthand": "warn", - "one-var": [ - "warn", - "never" - ], - "prefer-arrow/prefer-arrow-functions": "warn", - "prefer-const": "warn", - "prefer-rest-params": "warn", - "quote-props": [ - "warn", - "consistent-as-needed" - ], - "radix": "warn", - "require-await": "off", - "space-before-function-paren": [ - "warn", - { - "anonymous": "never", - "asyncArrow": "always", - "named": "never" - } - ], - "spaced-comment": [ - "warn", - "always", - { - "markers": [ - "/" - ] - } - ], - "use-isnan": "warn", - "valid-typeof": "off" - } + "env": { + "browser": true, + "node": true + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "webpack.test.tsconfig.json", + "sourceType": "module" + }, + "plugins": [ + "eslint-plugin-jsdoc", + "eslint-plugin-prefer-arrow", + "eslint-plugin-import", + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/adjacent-overload-signatures": "warn", + "@typescript-eslint/array-type": [ + "warn", + { + "default": "array-simple" + } + ], + "@typescript-eslint/await-thenable": "warn", + "@typescript-eslint/ban-ts-comment": "warn", + "@typescript-eslint/ban-types": [ + "warn", + { + "types": { + "Object": { + "message": "Avoid using the `Object` type. Did you mean `object`?" + }, + "Function": { + "message": "Avoid using the `Function` type. Prefer a specific function type, like `() => void`." + }, + "Boolean": { + "message": "Avoid using the `Boolean` type. Did you mean `boolean`?" + }, + "Number": { + "message": "Avoid using the `Number` type. Did you mean `number`?" + }, + "String": { + "message": "Avoid using the `String` type. Did you mean `string`?" + }, + "Symbol": { + "message": "Avoid using the `Symbol` type. Did you mean `symbol`?" + } + } + } + ], + "@typescript-eslint/consistent-type-assertions": "warn", + "@typescript-eslint/consistent-type-definitions": "warn", + "@typescript-eslint/dot-notation": "warn", + "@typescript-eslint/explicit-member-accessibility": [ + "off", + { + "accessibility": "explicit" + } + ], + "@typescript-eslint/explicit-module-boundary-types": "warn", + "@typescript-eslint/indent": [ + "warn", + 2, + { + "SwitchCase": 1, + "FunctionDeclaration": { + "parameters": "first" + }, + "FunctionExpression": { + "parameters": "first" + } + } + ], + "@typescript-eslint/member-delimiter-style": [ + "warn", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/member-ordering": "warn", + "@typescript-eslint/naming-convention": "warn", + "@typescript-eslint/no-array-constructor": "warn", + "@typescript-eslint/no-empty-function": "warn", + "@typescript-eslint/no-empty-interface": "warn", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-extra-non-null-assertion": "warn", + "@typescript-eslint/no-extra-semi": "warn", + "@typescript-eslint/no-floating-promises": "warn", + "@typescript-eslint/no-for-in-array": "warn", + "@typescript-eslint/no-implied-eval": "warn", + "@typescript-eslint/no-inferrable-types": "warn", + "@typescript-eslint/no-misused-new": "warn", + "@typescript-eslint/no-misused-promises": "warn", + "@typescript-eslint/no-namespace": "warn", + "@typescript-eslint/no-non-null-asserted-optional-chain": "warn", + "@typescript-eslint/no-non-null-assertion": "warn", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-this-alias": "warn", + "@typescript-eslint/no-unnecessary-type-assertion": "warn", + "@typescript-eslint/no-unsafe-assignment": "warn", + "@typescript-eslint/no-unsafe-call": "warn", + "@typescript-eslint/no-unsafe-member-access": "warn", + "@typescript-eslint/no-unsafe-return": "warn", + "@typescript-eslint/no-unused-expressions": "warn", + "@typescript-eslint/no-unused-vars": "warn", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-var-requires": "warn", + "@typescript-eslint/prefer-as-const": "warn", + "@typescript-eslint/prefer-for-of": "warn", + "@typescript-eslint/prefer-function-type": "warn", + "@typescript-eslint/prefer-namespace-keyword": "warn", + "@typescript-eslint/prefer-regexp-exec": "warn", + "@typescript-eslint/quotes": [ + "off", + { + "avoidEscape": true + } + ], + "@typescript-eslint/require-await": "warn", + "@typescript-eslint/restrict-plus-operands": "warn", + "@typescript-eslint/restrict-template-expressions": "warn", + "@typescript-eslint/semi": [ + "warn", + "always" + ], + "@typescript-eslint/triple-slash-reference": [ + "warn", + { + "path": "always", + "types": "prefer-import", + "lib": "always" + } + ], + "@typescript-eslint/type-annotation-spacing": "warn", + "@typescript-eslint/unbound-method": "warn", + "@typescript-eslint/unified-signatures": "warn", + "arrow-body-style": "warn", + "arrow-parens": [ + "warn", + "always" + ], + "brace-style": [ + "off", + "1tbs" + ], + "comma-dangle": "off", + "complexity": "off", + "constructor-super": "warn", + "curly": "warn", + "eol-last": "warn", + "eqeqeq": [ + "warn", + "smart" + ], + "guard-for-in": "warn", + "id-blacklist": [ + "warn", + "any", + "Number", + "number", + "String", + "string", + "Boolean", + "boolean", + "Undefined", + "undefined" + ], + "id-match": "warn", + "import/order": "warn", + "jsdoc/check-alignment": "warn", + "jsdoc/check-indentation": "warn", + "jsdoc/newline-after-description": "warn", + "max-classes-per-file": [ + "warn", + 1 + ], + "max-len": "off", + "new-parens": "warn", + "no-array-constructor": "off", + "no-bitwise": "warn", + "no-caller": "warn", + "no-cond-assign": "warn", + "no-console": "off", + "no-debugger": "warn", + "no-empty": "warn", + "no-empty-function": "off", + "no-eval": "warn", + "no-extra-semi": "off", + "no-fallthrough": "off", + "no-implied-eval": "off", + "no-invalid-this": "off", + "no-multiple-empty-lines": "warn", + "no-new-wrappers": "warn", + "no-shadow": [ + "warn", + { + "hoist": "all" + } + ], + "no-throw-literal": "warn", + "no-trailing-spaces": "warn", + "no-undef-init": "warn", + "no-underscore-dangle": "warn", + "no-unsafe-finally": "warn", + "no-unused-labels": "warn", + "no-unused-vars": "off", + "no-var": "warn", + "object-shorthand": ["warn", "never"], + "one-var": [ + "warn", + "never" + ], + "prefer-arrow/prefer-arrow-functions": "warn", + "prefer-const": "warn", + "prefer-rest-params": "warn", + "quote-props": [ + "warn", + "consistent-as-needed" + ], + "radix": "warn", + "require-await": "off", + "space-before-function-paren": [ + "warn", + { + "anonymous": "never", + "asyncArrow": "always", + "named": "never" + } + ], + "spaced-comment": [ + "warn", + "always", + { + "markers": [ + "/" + ] + } + ], + "use-isnan": "warn", + "valid-typeof": "off" + } }; diff --git a/dist/powerbi-client.d.ts b/dist/powerbi-client.d.ts index 212fba02..cd10f2e6 100644 --- a/dist/powerbi-client.d.ts +++ b/dist/powerbi-client.d.ts @@ -1,4 +1,4 @@ -/*! powerbi-client v2.16.5 | (c) 2016 Microsoft Corporation MIT */ +/*! powerbi-client v2.17.1 | (c) 2016 Microsoft Corporation MIT */ declare module "util" { import { HttpPostMessage } from 'http-post-message'; /** @@ -521,7 +521,7 @@ declare module "embed" { } } declare module "ifilterable" { - import * as models from 'powerbi-models'; + import { FiltersOperations, IFilter } from 'powerbi-models'; import { IHttpPostMessageResponse } from 'http-post-message'; /** * Decorates embed components that support filters @@ -534,29 +534,37 @@ declare module "ifilterable" { /** * Gets the filters currently applied to the object. * - * @returns {(Promise)} + * @returns {(Promise)} */ - getFilters(): Promise; + getFilters(): Promise; /** - * Replaces all filters on the current object with the specified filter values. + * Update the filters for the current instance according to the operation: Add, replace all, replace by target or remove. * - * @param {(models.IFilter[])} filters + * @param {(FiltersOperations)} operation + * @param {(IFilter[])} filters * @returns {Promise>} */ - setFilters(filters: models.IFilter[]): Promise>; + updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise>; /** * Removes all filters from the current object. * * @returns {Promise>} */ removeFilters(): Promise>; + /** + * Replaces all filters on the current object with the specified filter values. + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + setFilters(filters: IFilter[]): Promise>; } } declare module "visualDescriptor" { - import * as models from 'powerbi-models'; + import { ExportDataType, FiltersOperations, ICloneVisualRequest, ICloneVisualResponse, IExportDataResult, IFilter, ISlicerState, ISortByVisualRequest, IVisualLayout } from 'powerbi-models'; + import { IHttpPostMessageResponse } from 'http-post-message'; import { IFilterable } from "ifilterable"; import { IPageNode } from "page"; - import { IHttpPostMessageResponse } from 'http-post-message'; /** * A Visual node within a report hierarchy * @@ -567,7 +575,7 @@ declare module "visualDescriptor" { name: string; title: string; type: string; - layout: models.IVisualLayout; + layout: IVisualLayout; page: IPageNode; } /** @@ -601,7 +609,7 @@ declare module "visualDescriptor" { * * @type {string} */ - layout: models.IVisualLayout; + layout: IVisualLayout; /** * The parent Power BI page that contains this visual * @@ -611,7 +619,7 @@ declare module "visualDescriptor" { /** * @hidden */ - constructor(page: IPageNode, name: string, title: string, type: string, layout: models.IVisualLayout); + constructor(page: IPageNode, name: string, title: string, type: string, layout: IVisualLayout); /** * Gets all visual level filters of the current visual. * @@ -620,9 +628,21 @@ declare module "visualDescriptor" { * .then(filters => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - getFilters(): Promise; + getFilters(): Promise; + /** + * Update the filters for the current visual according to the operation: Add, replace all, replace by target or remove. + * + * ```javascript + * visual.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise>; /** * Removes all filters from the current visual. * @@ -641,23 +661,23 @@ declare module "visualDescriptor" { * .catch(errors => { ... }); * ``` * - * @param {(models.IFilter[])} filters + * @param {(IFilter[])} filters * @returns {Promise>} */ - setFilters(filters: models.IFilter[]): Promise>; + setFilters(filters: IFilter[]): Promise>; /** * Exports Visual data. * Can export up to 30K rows. * @param rows: Optional. Default value is 30K, maximum value is 30K as well. - * @param exportDataType: Optional. Default is models.ExportDataType.Summarized. + * @param exportDataType: Optional. Default is ExportDataType.Summarized. * ```javascript * visual.exportData() * .then(data => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - exportData(exportDataType?: models.ExportDataType, rows?: number): Promise; + exportData(exportDataType?: ExportDataType, rows?: number): Promise; /** * Set slicer state. * Works only for visuals of type slicer. @@ -667,7 +687,7 @@ declare module "visualDescriptor" { * .then(() => { ... }); * ``` */ - setSlicerState(state: models.ISlicerState): Promise>; + setSlicerState(state: ISlicerState): Promise>; /** * Get slicer state. * Works only for visuals of type slicer. @@ -677,15 +697,15 @@ declare module "visualDescriptor" { * .then(state => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - getSlicerState(): Promise; + getSlicerState(): Promise; /** * Clone existing visual to a new instance. * - * @returns {(Promise)} + * @returns {(Promise)} */ - clone(request?: models.ICloneVisualRequest): Promise; + clone(request?: ICloneVisualRequest): Promise; /** * Sort a visual by dataField and direction. * @@ -696,15 +716,15 @@ declare module "visualDescriptor" { * .then(() => { ... }); * ``` */ - sortBy(request: models.ISortByVisualRequest): Promise>; + sortBy(request: ISortByVisualRequest): Promise>; } } declare module "page" { import { IHttpPostMessageResponse } from 'http-post-message'; + import { DisplayOption, FiltersOperations, ICustomPageSize, IFilter, SectionVisibility } from 'powerbi-models'; import { IFilterable } from "ifilterable"; import { IReportNode } from "report"; import { VisualDescriptor } from "visualDescriptor"; - import * as models from 'powerbi-models'; /** * A Page node within a report hierarchy * @@ -753,19 +773,21 @@ declare module "page" { * 0 - Always Visible * 1 - Hidden in View Mode * - * @type {models.SectionVisibility} + * @type {SectionVisibility} */ - visibility: models.SectionVisibility; + visibility: SectionVisibility; /** * Page size as saved in the report. - * @type {models.ICustomPageSize} + * + * @type {ICustomPageSize} */ - defaultSize: models.ICustomPageSize; + defaultSize: ICustomPageSize; /** * Page display options as saved in the report. - * @type {models.ICustomPageSize} + * + * @type {ICustomPageSize} */ - defaultDisplayOption: models.DisplayOption; + defaultDisplayOption: DisplayOption; /** * Creates an instance of a Power BI report page. * @@ -773,10 +795,10 @@ declare module "page" { * @param {string} name * @param {string} [displayName] * @param {boolean} [isActivePage] - * @param {models.SectionVisibility} [visibility] + * @param {SectionVisibility} [visibility] * @hidden */ - constructor(report: IReportNode, name: string, displayName?: string, isActivePage?: boolean, visibility?: models.SectionVisibility, defaultSize?: models.ICustomPageSize, defaultDisplayOption?: models.DisplayOption); + constructor(report: IReportNode, name: string, displayName?: string, isActivePage?: boolean, visibility?: SectionVisibility, defaultSize?: ICustomPageSize, defaultDisplayOption?: DisplayOption); /** * Gets all page level filters within the report. * @@ -785,20 +807,21 @@ declare module "page" { * .then(filters => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - getFilters(): Promise; + getFilters(): Promise; /** - * Delete the page from the report + * Update the filters for the current page according to the operation: Add, replace all, replace by target or remove. * * ```javascript - * // Delete the page from the report - * page.delete(); + * page.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); * ``` * - * @returns {Promise} + * @param {(IFilter[])} filters + * @returns {Promise>} */ - delete(): Promise; + updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise>; /** * Removes all filters from this page of the report. * @@ -810,27 +833,38 @@ declare module "page" { */ removeFilters(): Promise>; /** - * Makes the current page the active page of the report. + * Sets all filters on the current page. * * ```javascript - * page.setActive(); + * page.setFilters(filters) + * .catch(errors => { ... }); * ``` * + * @param {(IFilter[])} filters * @returns {Promise>} */ - setActive(): Promise>; + setFilters(filters: IFilter[]): Promise>; /** - * Sets all filters on the current page. + * Delete the page from the report * * ```javascript - * page.setFilters(filters); - * .catch(errors => { ... }); + * // Delete the page from the report + * page.delete(); + * ``` + * + * @returns {Promise} + */ + delete(): Promise; + /** + * Makes the current page the active page of the report. + * + * ```javascript + * page.setActive(); * ``` * - * @param {(models.IFilter[])} filters * @returns {Promise>} */ - setFilters(filters: models.IFilter[]): Promise>; + setActive(): Promise>; /** * Set displayName to the current page. * @@ -866,14 +900,13 @@ declare module "page" { } } declare module "report" { - import * as service from "service"; - import * as embed from "embed"; - import * as models from 'powerbi-models'; + import { IReportLoadConfiguration, IReportEmbedConfiguration, FiltersOperations, IError, IFilter, IReportTheme, ISettings, SectionVisibility, ViewMode, IEmbedConfiguration, IEmbedConfigurationBase } from 'powerbi-models'; + import { IHttpPostMessageResponse } from 'http-post-message'; + import { IService, Service } from "service"; + import { Embed } from "embed"; import { IFilterable } from "ifilterable"; import { Page } from "page"; - import { IReportLoadConfiguration, IReportEmbedConfiguration } from 'powerbi-models'; import { BookmarksManager } from "bookmarksManager"; - import { IHttpPostMessageResponse } from 'http-post-message'; /** * A Report node within a report hierarchy * @@ -882,19 +915,19 @@ declare module "report" { */ export interface IReportNode { iframe: HTMLIFrameElement; - service: service.IService; - config: embed.IEmbedConfiguration | IReportEmbedConfiguration; + service: IService; + config: IEmbedConfiguration | IReportEmbedConfiguration; } /** * The Power BI Report embed component * * @export * @class Report - * @extends {embed.Embed} + * @extends {Embed} * @implements {IReportNode} * @implements {IFilterable} */ - export class Report extends embed.Embed implements IReportNode, IFilterable { + export class Report extends Embed implements IReportNode, IFilterable { /** @hidden */ static allowedEvents: string[]; /** @hidden */ @@ -911,17 +944,18 @@ declare module "report" { /** * Creates an instance of a Power BI Report. * - * @param {service.Service} service + * @param {Service} service * @param {HTMLElement} element - * @param {embed.IEmbedConfiguration} config + * @param {IEmbedConfiguration} config * @hidden */ - constructor(service: service.Service, element: HTMLElement, baseConfig: embed.IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement); + constructor(service: Service, element: HTMLElement, baseConfig: IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement); /** * 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. + * * @hidden * @static * @param {string} url @@ -943,7 +977,7 @@ declare module "report" { * * @returns {Promise} */ - render(config?: IReportLoadConfiguration | embed.IReportEmbedConfiguration): Promise; + render(config?: IReportLoadConfiguration | IReportEmbedConfiguration): Promise; /** * Add an empty page to the report * @@ -988,9 +1022,49 @@ declare module "report" { * }); * ``` * - * @returns {Promise} + * @returns {Promise} + */ + getFilters(): Promise; + /** + * Update the filters at the report level according to the operation: Add, replace all, replace by target or remove. + * + * ```javascript + * report.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} */ - getFilters(): Promise; + updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise>; + /** + * Removes all filters at the report level. + * + * ```javascript + * report.removeFilters(); + * ``` + * + * @returns {Promise>} + */ + removeFilters(): Promise>; + /** + * Sets filters at the report level. + * + * ```javascript + * const filters: [ + * ... + * ]; + * + * report.setFilters(filters) + * .catch(errors => { + * ... + * }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + setFilters(filters: IFilter[]): Promise>; /** * Gets the report ID from the first available location: options, attribute, embed url. * @@ -1025,21 +1099,11 @@ declare module "report" { * @returns {Page} * @hidden */ - page(name: string, displayName?: string, isActive?: boolean, visibility?: models.SectionVisibility): Page; + page(name: string, displayName?: string, isActive?: boolean, visibility?: SectionVisibility): Page; /** * Prints the active page of the report by invoking `window.print()` on the embed iframe component. */ print(): Promise; - /** - * Removes all filters at the report level. - * - * ```javascript - * report.removeFilters(); - * ``` - * - * @returns {Promise>} - */ - removeFilters(): Promise>; /** * Sets the active page of the report. * @@ -1052,24 +1116,6 @@ declare module "report" { * @returns {Promise>} */ setPage(pageName: string): Promise>; - /** - * Sets filters at the report level. - * - * ```javascript - * const filters: [ - * ... - * ]; - * - * report.setFilters(filters) - * .catch(errors => { - * ... - * }); - * ``` - * - * @param {(models.IFilter[])} filters - * @returns {Promise>} - */ - setFilters(filters: models.IFilter[]): Promise>; /** * Updates visibility settings for the filter pane and the page navigation pane. * @@ -1083,16 +1129,16 @@ declare module "report" { * .catch(error => { ... }); * ``` * - * @param {models.ISettings} settings + * @param {ISettings} settings * @returns {Promise>} */ - updateSettings(settings: models.ISettings): Promise>; + updateSettings(settings: ISettings): Promise>; /** * Validate load configuration. * * @hidden */ - validate(config: embed.IEmbedConfigurationBase): models.IError[]; + validate(config: IEmbedConfigurationBase): IError[]; /** * Handle config changes. * @@ -1109,14 +1155,14 @@ declare module "report" { * * @returns {Promise} */ - switchMode(viewMode: models.ViewMode | string): Promise; + switchMode(viewMode: ViewMode | string): Promise; /** - * Refreshes data sources for the report. - * - * ```javascript - * report.refresh(); - * ``` - */ + * Refreshes data sources for the report. + * + * ```javascript + * report.refresh(); + * ``` + */ refresh(): Promise; /** * checks if the report is saved. @@ -1135,41 +1181,41 @@ declare module "report" { * report.applyTheme(theme); * ``` */ - applyTheme(theme: models.IReportTheme): Promise; + applyTheme(theme: IReportTheme): Promise; /** - * Reset and apply the default theme of the report - * - * ```javascript - * report.resetTheme(); - * ``` - */ + * Reset and apply the default theme of the report + * + * ```javascript + * report.resetTheme(); + * ``` + */ resetTheme(): Promise; /** - * Reset user's filters, slicers, and other data view changes to the default state of the report - * - * ```javascript - * report.resetPersistentFilters(); - * ``` - */ + * Reset user's filters, slicers, and other data view changes to the default state of the report + * + * ```javascript + * report.resetPersistentFilters(); + * ``` + */ resetPersistentFilters(): Promise>; /** - * Save user's filters, slicers, and other data view changes of the report - * - * ```javascript - * report.savePersistentFilters(); - * ``` - */ + * Save user's filters, slicers, and other data view changes of the report + * + * ```javascript + * report.savePersistentFilters(); + * ``` + */ savePersistentFilters(): Promise>; /** - * Returns if there are user's filters, slicers, or other data view changes applied on the report. - * If persistent filters is disable, returns false. - * - * ```javascript - * report.arePersistentFiltersApplied(); - * ``` - * - * @returns {Promise} - */ + * Returns if there are user's filters, slicers, or other data view changes applied on the report. + * If persistent filters is disable, returns false. + * + * ```javascript + * report.arePersistentFiltersApplied(); + * ``` + * + * @returns {Promise} + */ arePersistentFiltersApplied(): Promise; /** * @hidden @@ -1430,14 +1476,12 @@ declare module "qna" { } } declare module "visual" { - import * as service from "service"; - import * as embed from "embed"; - import * as models from 'powerbi-models'; + import { FiltersLevel, FiltersOperations, IEmbedConfigurationBase, IFilter, IReportEmbedConfiguration, IReportLoadConfiguration } from 'powerbi-models'; + import { IHttpPostMessageResponse } from 'http-post-message'; + import { Service } from "service"; import { Report } from "report"; import { Page } from "page"; import { VisualDescriptor } from "visualDescriptor"; - import { IHttpPostMessageResponse } from 'http-post-message'; - import { IReportLoadConfiguration } from 'powerbi-models'; /** * The Power BI Visual embed component * @@ -1456,24 +1500,24 @@ declare module "visual" { /** * Creates an instance of a Power BI Single Visual. * - * @param {service.Service} service + * @param {Service} service * @param {HTMLElement} element - * @param {embed.IEmbedConfiguration} config + * @param {IEmbedConfiguration} config * @hidden */ - constructor(service: service.Service, element: HTMLElement, baseConfig: embed.IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement); + constructor(service: Service, element: HTMLElement, baseConfig: IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement); /** * @hidden */ load(phasedRender?: boolean): Promise; /** - * Gets the list of pages within the report - not supported in visual embed. + * Gets the list of pages within the report - not supported in visual * * @returns {Promise} */ getPages(): Promise; /** - * Sets the active page of the report - not supported in visual embed. + * Sets the active page of the report - not supported in visual * * @param {string} pageName * @returns {Promise>} @@ -1485,7 +1529,7 @@ declare module "visual" { * @hidden * @returns {Promise} */ - render(config?: IReportLoadConfiguration | embed.IReportEmbedConfiguration): Promise; + render(config?: IReportLoadConfiguration | IReportEmbedConfiguration): Promise; /** * Gets the embedded visual descriptor object that contains the visual name, type, etc. * @@ -1508,9 +1552,28 @@ declare module "visual" { * }); * ``` * - * @returns {Promise} + * @returns {Promise} + */ + getFilters(filtersLevel?: FiltersLevel): Promise; + /** + * Updates filters at the filter level. + * Default filter level is visual level. + * + * ```javascript + * const filters: [ + * ... + * ]; + * + * visual.updateFilters(FiltersOperations.Add, filters, filtersLevel) + * .catch(errors => { + * ... + * }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} */ - getFilters(filtersLevel?: models.FiltersLevel): Promise; + updateFilters(operation: FiltersOperations, filters: IFilter[], filtersLevel?: FiltersLevel): Promise>; /** * Sets filters at the filter level. * Default filter level is visual level. @@ -1526,10 +1589,10 @@ declare module "visual" { * }); * ``` * - * @param {(models.IFilter[])} filters + * @param {(IFilter[])} filters * @returns {Promise>} */ - setFilters(filters: models.IFilter[], filtersLevel?: models.FiltersLevel): Promise>; + setFilters(filters: IFilter[], filtersLevel?: FiltersLevel): Promise>; /** * Removes all filters from the current filter level. * Default filter level is visual level. @@ -1540,7 +1603,7 @@ declare module "visual" { * * @returns {Promise>} */ - removeFilters(filtersLevel?: models.FiltersLevel): Promise>; + removeFilters(filtersLevel?: FiltersLevel): Promise>; /** * @hidden */ diff --git a/dist/powerbi.js b/dist/powerbi.js index e8d4f430..76f9d55a 100644 --- a/dist/powerbi.js +++ b/dist/powerbi.js @@ -1,4 +1,4 @@ -/*! powerbi-client v2.16.5 | (c) 2016 Microsoft Corporation MIT */ +/*! powerbi-client v2.17.1 | (c) 2016 Microsoft Corporation MIT */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -288,7 +288,7 @@ return /******/ (function(modules) { // webpackBootstrap /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -/*! powerbi-models v1.7.1 | (c) 2016 Microsoft Corporation MIT */ +/*! powerbi-models v1.8.0 | (c) 2016 Microsoft Corporation MIT */ (function webpackUniversalModuleDefinition(root, factory) { if(true) module.exports = factory(); @@ -398,7 +398,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -exports.validateCustomTheme = exports.validateCommandsSettings = exports.validateVisualSettings = exports.validateVisualHeader = exports.validateExportDataRequest = exports.validateQnaInterpretInputData = exports.validateLoadQnaConfiguration = exports.validateSaveAsParameters = exports.validateFilter = exports.validatePage = exports.validateTileLoad = exports.validateDashboardLoad = exports.validateCreateReport = exports.validateReportLoad = exports.validateMenuGroupExtension = exports.validateExtension = exports.validateCustomPageSize = exports.validateVisualizationsPane = exports.validateSyncSlicersPane = exports.validateSelectionPane = exports.validatePageNavigationPane = exports.validateFieldsPane = exports.validateFiltersPane = exports.validateBookmarksPane = exports.validatePanes = exports.validateSettings = exports.validateCaptureBookmarkRequest = exports.validateApplyBookmarkStateRequest = exports.validateApplyBookmarkByNameRequest = exports.validateAddBookmarkRequest = exports.validatePlayBookmarkRequest = exports.validateSlicerState = exports.validateSlicer = exports.validateVisualSelector = exports.isIExtensionArray = exports.isIExtensions = exports.isGroupedMenuExtension = exports.isFlatMenuExtension = exports.VisualDataRoleKindPreference = exports.VisualDataRoleKind = exports.CommandDisplayOption = exports.SlicerTargetSelector = exports.VisualTypeSelector = exports.VisualSelector = exports.PageSelector = exports.Selector = exports.SortDirection = exports.LegendPosition = exports.TextAlignment = exports.CommonErrorCodes = exports.BookmarksPlayMode = exports.ExportDataType = exports.QnaMode = exports.PageNavigationPosition = exports.isColumnAggr = exports.isHierarchyLevelAggr = exports.isHierarchyLevel = exports.isColumn = exports.isMeasure = exports.getFilterType = exports.isBasicFilterWithKeys = exports.isFilterKeyColumnsTarget = exports.AdvancedFilter = exports.TupleFilter = exports.BasicFilterWithKeys = exports.BasicFilter = exports.RelativeTimeFilter = exports.RelativeDateFilter = exports.TopNFilter = exports.IncludeExcludeFilter = exports.NotSupportedFilter = exports.Filter = exports.RelativeDateOperators = exports.RelativeDateFilterTimeUnit = exports.FilterType = exports.FiltersLevel = exports.MenuLocation = exports.ContrastMode = exports.TokenType = exports.ViewMode = exports.Permissions = exports.SectionVisibility = exports.HyperlinkClickBehavior = exports.LayoutType = exports.VisualContainerDisplayMode = exports.BackgroundType = exports.DisplayOption = exports.PageSizeType = exports.TraceType = void 0; +exports.validateCustomTheme = exports.validateCommandsSettings = exports.validateVisualSettings = exports.validateVisualHeader = exports.validateExportDataRequest = exports.validateQnaInterpretInputData = exports.validateLoadQnaConfiguration = exports.validateSaveAsParameters = exports.validateUpdateFiltersRequest = exports.validateFilter = exports.validatePage = exports.validateTileLoad = exports.validateDashboardLoad = exports.validateCreateReport = exports.validateReportLoad = exports.validateMenuGroupExtension = exports.validateExtension = exports.validateCustomPageSize = exports.validateVisualizationsPane = exports.validateSyncSlicersPane = exports.validateSelectionPane = exports.validatePageNavigationPane = exports.validateFieldsPane = exports.validateFiltersPane = exports.validateBookmarksPane = exports.validatePanes = exports.validateSettings = exports.validateCaptureBookmarkRequest = exports.validateApplyBookmarkStateRequest = exports.validateApplyBookmarkByNameRequest = exports.validateAddBookmarkRequest = exports.validatePlayBookmarkRequest = exports.validateSlicerState = exports.validateSlicer = exports.validateVisualSelector = exports.isIExtensionArray = exports.isIExtensions = exports.isGroupedMenuExtension = exports.isFlatMenuExtension = exports.VisualDataRoleKindPreference = exports.VisualDataRoleKind = exports.CommandDisplayOption = exports.SlicerTargetSelector = exports.VisualTypeSelector = exports.VisualSelector = exports.PageSelector = exports.Selector = exports.SortDirection = exports.LegendPosition = exports.TextAlignment = exports.CommonErrorCodes = exports.BookmarksPlayMode = exports.ExportDataType = exports.QnaMode = exports.PageNavigationPosition = exports.isColumnAggr = exports.isHierarchyLevelAggr = exports.isHierarchyLevel = exports.isColumn = exports.isMeasure = exports.getFilterType = exports.isBasicFilterWithKeys = exports.isFilterKeyColumnsTarget = exports.AdvancedFilter = exports.TupleFilter = exports.BasicFilterWithKeys = exports.BasicFilter = exports.RelativeTimeFilter = exports.RelativeDateFilter = exports.TopNFilter = exports.IncludeExcludeFilter = exports.NotSupportedFilter = exports.Filter = exports.RelativeDateOperators = exports.RelativeDateFilterTimeUnit = exports.FilterType = exports.FiltersLevel = exports.FiltersOperations = exports.MenuLocation = exports.ContrastMode = exports.TokenType = exports.ViewMode = exports.Permissions = exports.SectionVisibility = exports.HyperlinkClickBehavior = exports.LayoutType = exports.VisualContainerDisplayMode = exports.BackgroundType = exports.DisplayOption = exports.PageSizeType = exports.TraceType = void 0; var validator_1 = __webpack_require__(1); var TraceType; (function (TraceType) { @@ -483,6 +483,13 @@ var MenuLocation; MenuLocation[MenuLocation["Bottom"] = 0] = "Bottom"; MenuLocation[MenuLocation["Top"] = 1] = "Top"; })(MenuLocation = exports.MenuLocation || (exports.MenuLocation = {})); +var FiltersOperations; +(function (FiltersOperations) { + FiltersOperations[FiltersOperations["RemoveAll"] = 0] = "RemoveAll"; + FiltersOperations[FiltersOperations["ReplaceAll"] = 1] = "ReplaceAll"; + FiltersOperations[FiltersOperations["Add"] = 2] = "Add"; + FiltersOperations[FiltersOperations["Replace"] = 3] = "Replace"; +})(FiltersOperations = exports.FiltersOperations || (exports.FiltersOperations = {})); var FiltersLevel; (function (FiltersLevel) { FiltersLevel[FiltersLevel["Report"] = 0] = "Report"; @@ -1127,10 +1134,15 @@ function validatePage(input) { } exports.validatePage = validatePage; function validateFilter(input) { - var errors = validator_1.Validators.filtersValidator.validate(input); + var errors = validator_1.Validators.filterValidator.validate(input); return errors ? errors.map(normalizeError) : undefined; } exports.validateFilter = validateFilter; +function validateUpdateFiltersRequest(input) { + var errors = validator_1.Validators.updateFiltersRequestValidator.validate(input); + return errors ? errors.map(normalizeError) : undefined; +} +exports.validateUpdateFiltersRequest = validateUpdateFiltersRequest; function validateSaveAsParameters(input) { var errors = validator_1.Validators.saveAsParametersValidator.validate(input); return errors ? errors.map(normalizeError) : undefined; @@ -1249,12 +1261,16 @@ exports.Validators = { fieldRequiredValidator: new fieldRequiredValidator_1.FieldRequiredValidator(), fieldsPaneValidator: new panesValidator_1.FieldsPaneValidator(), filterColumnTargetValidator: new filtersValidator_1.FilterColumnTargetValidator(), + filterDisplaySettingsValidator: new filtersValidator_1.FilterDisplaySettingsValidator(), filterConditionsValidator: new typeValidator_1.ArrayValidator([new filtersValidator_1.ConditionItemValidator()]), filterHierarchyTargetValidator: new filtersValidator_1.FilterHierarchyTargetValidator(), filterMeasureTargetValidator: new filtersValidator_1.FilterMeasureTargetValidator(), filterTargetValidator: new anyOfValidator_1.AnyOfValidator([new filtersValidator_1.FilterColumnTargetValidator(), new filtersValidator_1.FilterHierarchyTargetValidator(), new filtersValidator_1.FilterMeasureTargetValidator()]), - filtersArrayValidator: new typeValidator_1.ArrayValidator([new anyOfValidator_1.AnyOfValidator([new filtersValidator_1.BasicFilterValidator(), new filtersValidator_1.AdvancedFilterValidator(), new filtersValidator_1.RelativeDateFilterValidator(), new filtersValidator_1.RelativeTimeFilterValidator()])]), - filtersValidator: new filtersValidator_1.FilterValidator(), + filterValidator: new filtersValidator_1.FilterValidator(), + filterTypeValidator: new typeValidator_1.EnumValidator([0, 1, 2, 3, 4, 5, 6, 7]), + filtersArrayValidator: new typeValidator_1.ArrayValidator([new filtersValidator_1.FilterValidator()]), + filtersOperationsUpdateValidator: new typeValidator_1.EnumValidator([1, 2, 3]), + filtersOperationsRemoveAllValidator: new typeValidator_1.EnumValidator([0]), filtersPaneValidator: new panesValidator_1.FiltersPaneValidator(), hyperlinkClickBehaviorValidator: new typeValidator_1.EnumValidator([0, 1, 2]), includeExcludeFilterValidator: new filtersValidator_1.IncludeExcludeFilterValidator(), @@ -1307,6 +1323,7 @@ exports.Validators = { tokenTypeValidator: new typeValidator_1.EnumValidator([0, 1]), topNFilterTypeValidator: new typeValidator_1.EnumValidator([5]), topNFilterValidator: new filtersValidator_1.TopNFilterValidator(), + updateFiltersRequestValidator: new anyOfValidator_1.AnyOfValidator([new filtersValidator_1.UpdateFiltersRequestValidator(), new filtersValidator_1.RemoveFiltersRequestValidator()]), viewModeValidator: new typeValidator_1.EnumValidator([0, 1]), visualCommandSelectorValidator: new anyOfValidator_1.AnyOfValidator([new selectorsValidator_1.VisualSelectorValidator(), new selectorsValidator_1.VisualTypeSelectorValidator()]), visualHeaderSelectorValidator: new anyOfValidator_1.AnyOfValidator([new selectorsValidator_1.VisualSelectorValidator(), new selectorsValidator_1.VisualTypeSelectorValidator()]), @@ -2481,7 +2498,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -exports.ConditionItemValidator = exports.FilterValidator = exports.IncludeExcludeFilterValidator = exports.NotSupportedFilterValidator = exports.TopNFilterValidator = exports.RelativeTimeFilterValidator = exports.RelativeDateFilterValidator = exports.AdvancedFilterValidator = exports.BasicFilterValidator = exports.FilterMeasureTargetValidator = exports.FilterKeyHierarchyTargetValidator = exports.FilterHierarchyTargetValidator = exports.FilterKeyColumnsTargetValidator = exports.FilterColumnTargetValidator = void 0; +exports.ConditionItemValidator = exports.RemoveFiltersRequestValidator = exports.UpdateFiltersRequestValidator = exports.FilterValidator = exports.IncludeExcludeFilterValidator = exports.NotSupportedFilterValidator = exports.TopNFilterValidator = exports.RelativeTimeFilterValidator = exports.RelativeDateFilterValidator = exports.AdvancedFilterValidator = exports.BasicFilterValidator = exports.FilterValidatorBase = exports.FilterDisplaySettingsValidator = exports.FilterMeasureTargetValidator = exports.FilterKeyHierarchyTargetValidator = exports.FilterHierarchyTargetValidator = exports.FilterKeyColumnsTargetValidator = exports.FilterColumnTargetValidator = void 0; var multipleFieldsValidator_1 = __webpack_require__(3); var typeValidator_1 = __webpack_require__(4); var validator_1 = __webpack_require__(1); @@ -2626,12 +2643,45 @@ var FilterMeasureTargetValidator = /** @class */ (function (_super) { return FilterMeasureTargetValidator; }(typeValidator_1.ObjectValidator)); exports.FilterMeasureTargetValidator = FilterMeasureTargetValidator; -var BasicFilterValidator = /** @class */ (function (_super) { - __extends(BasicFilterValidator, _super); - function BasicFilterValidator() { +var FilterDisplaySettingsValidator = /** @class */ (function (_super) { + __extends(FilterDisplaySettingsValidator, _super); + function FilterDisplaySettingsValidator() { return _super !== null && _super.apply(this, arguments) || this; } - BasicFilterValidator.prototype.validate = function (input, path, field) { + FilterDisplaySettingsValidator.prototype.validate = function (input, path, field) { + if (input == null) { + return null; + } + var errors = _super.prototype.validate.call(this, input, path, field); + if (errors) { + return errors; + } + var fields = [ + { + field: "isLockedInViewMode", + validators: [validator_1.Validators.booleanValidator] + }, + { + field: "isHiddenInViewMode", + validators: [validator_1.Validators.booleanValidator] + }, + { + field: "displayName", + validators: [validator_1.Validators.stringValidator] + } + ]; + var multipleFieldsValidator = new multipleFieldsValidator_1.MultipleFieldsValidator(fields); + return multipleFieldsValidator.validate(input, path, field); + }; + return FilterDisplaySettingsValidator; +}(typeValidator_1.ObjectValidator)); +exports.FilterDisplaySettingsValidator = FilterDisplaySettingsValidator; +var FilterValidatorBase = /** @class */ (function (_super) { + __extends(FilterValidatorBase, _super); + function FilterValidatorBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + FilterValidatorBase.prototype.validate = function (input, path, field) { if (input == null) { return null; } @@ -2644,6 +2694,39 @@ var BasicFilterValidator = /** @class */ (function (_super) { field: "target", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filterTargetValidator] }, + { + field: "$schema", + validators: [validator_1.Validators.stringValidator] + }, + { + field: "filterType", + validators: [validator_1.Validators.filterTypeValidator] + }, + { + field: "displaySettings", + validators: [validator_1.Validators.filterDisplaySettingsValidator] + }, + ]; + var multipleFieldsValidator = new multipleFieldsValidator_1.MultipleFieldsValidator(fields); + return multipleFieldsValidator.validate(input, path, field); + }; + return FilterValidatorBase; +}(typeValidator_1.ObjectValidator)); +exports.FilterValidatorBase = FilterValidatorBase; +var BasicFilterValidator = /** @class */ (function (_super) { + __extends(BasicFilterValidator, _super); + function BasicFilterValidator() { + return _super !== null && _super.apply(this, arguments) || this; + } + BasicFilterValidator.prototype.validate = function (input, path, field) { + if (input == null) { + return null; + } + var errors = _super.prototype.validate.call(this, input, path, field); + if (errors) { + return errors; + } + var fields = [ { field: "operator", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.stringValidator] @@ -2665,7 +2748,7 @@ var BasicFilterValidator = /** @class */ (function (_super) { return multipleFieldsValidator.validate(input, path, field); }; return BasicFilterValidator; -}(typeValidator_1.ObjectValidator)); +}(FilterValidatorBase)); exports.BasicFilterValidator = BasicFilterValidator; var AdvancedFilterValidator = /** @class */ (function (_super) { __extends(AdvancedFilterValidator, _super); @@ -2681,10 +2764,6 @@ var AdvancedFilterValidator = /** @class */ (function (_super) { return errors; } var fields = [ - { - field: "target", - validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filterTargetValidator] - }, { field: "logicalOperator", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.stringValidator] @@ -2702,7 +2781,7 @@ var AdvancedFilterValidator = /** @class */ (function (_super) { return multipleFieldsValidator.validate(input, path, field); }; return AdvancedFilterValidator; -}(typeValidator_1.ObjectValidator)); +}(FilterValidatorBase)); exports.AdvancedFilterValidator = AdvancedFilterValidator; var RelativeDateFilterValidator = /** @class */ (function (_super) { __extends(RelativeDateFilterValidator, _super); @@ -2718,10 +2797,6 @@ var RelativeDateFilterValidator = /** @class */ (function (_super) { return errors; } var fields = [ - { - field: "target", - validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filterTargetValidator] - }, { field: "operator", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.relativeDateFilterOperatorValidator] @@ -2747,7 +2822,7 @@ var RelativeDateFilterValidator = /** @class */ (function (_super) { return multipleFieldsValidator.validate(input, path, field); }; return RelativeDateFilterValidator; -}(typeValidator_1.ObjectValidator)); +}(FilterValidatorBase)); exports.RelativeDateFilterValidator = RelativeDateFilterValidator; var RelativeTimeFilterValidator = /** @class */ (function (_super) { __extends(RelativeTimeFilterValidator, _super); @@ -2763,10 +2838,6 @@ var RelativeTimeFilterValidator = /** @class */ (function (_super) { return errors; } var fields = [ - { - field: "target", - validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filterTargetValidator] - }, { field: "operator", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.relativeDateFilterOperatorValidator] @@ -2788,7 +2859,7 @@ var RelativeTimeFilterValidator = /** @class */ (function (_super) { return multipleFieldsValidator.validate(input, path, field); }; return RelativeTimeFilterValidator; -}(typeValidator_1.ObjectValidator)); +}(FilterValidatorBase)); exports.RelativeTimeFilterValidator = RelativeTimeFilterValidator; var TopNFilterValidator = /** @class */ (function (_super) { __extends(TopNFilterValidator, _super); @@ -2804,10 +2875,6 @@ var TopNFilterValidator = /** @class */ (function (_super) { return errors; } var fields = [ - { - field: "target", - validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filterTargetValidator] - }, { field: "operator", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.stringValidator] @@ -2829,7 +2896,7 @@ var TopNFilterValidator = /** @class */ (function (_super) { return multipleFieldsValidator.validate(input, path, field); }; return TopNFilterValidator; -}(typeValidator_1.ObjectValidator)); +}(FilterValidatorBase)); exports.TopNFilterValidator = TopNFilterValidator; var NotSupportedFilterValidator = /** @class */ (function (_super) { __extends(NotSupportedFilterValidator, _super); @@ -2845,10 +2912,6 @@ var NotSupportedFilterValidator = /** @class */ (function (_super) { return errors; } var fields = [ - { - field: "target", - validators: [validator_1.Validators.filterTargetValidator] - }, { field: "message", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.stringValidator] @@ -2866,7 +2929,7 @@ var NotSupportedFilterValidator = /** @class */ (function (_super) { return multipleFieldsValidator.validate(input, path, field); }; return NotSupportedFilterValidator; -}(typeValidator_1.ObjectValidator)); +}(FilterValidatorBase)); exports.NotSupportedFilterValidator = NotSupportedFilterValidator; var IncludeExcludeFilterValidator = /** @class */ (function (_super) { __extends(IncludeExcludeFilterValidator, _super); @@ -2882,10 +2945,6 @@ var IncludeExcludeFilterValidator = /** @class */ (function (_super) { return errors; } var fields = [ - { - field: "target", - validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filterTargetValidator] - }, { field: "isExclude", validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.booleanValidator] @@ -2903,7 +2962,7 @@ var IncludeExcludeFilterValidator = /** @class */ (function (_super) { return multipleFieldsValidator.validate(input, path, field); }; return IncludeExcludeFilterValidator; -}(typeValidator_1.ObjectValidator)); +}(FilterValidatorBase)); exports.IncludeExcludeFilterValidator = IncludeExcludeFilterValidator; var FilterValidator = /** @class */ (function (_super) { __extends(FilterValidator, _super); @@ -2919,6 +2978,56 @@ var FilterValidator = /** @class */ (function (_super) { return FilterValidator; }(typeValidator_1.ObjectValidator)); exports.FilterValidator = FilterValidator; +var UpdateFiltersRequestValidator = /** @class */ (function (_super) { + __extends(UpdateFiltersRequestValidator, _super); + function UpdateFiltersRequestValidator() { + return _super !== null && _super.apply(this, arguments) || this; + } + UpdateFiltersRequestValidator.prototype.validate = function (input, path, field) { + if (input == null) { + return null; + } + var fields = [ + { + field: "filtersOperation", + validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filtersOperationsUpdateValidator] + }, + { + field: "filters", + validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filtersArrayValidator] + } + ]; + var multipleFieldsValidator = new multipleFieldsValidator_1.MultipleFieldsValidator(fields); + return multipleFieldsValidator.validate(input, path, field); + }; + return UpdateFiltersRequestValidator; +}(typeValidator_1.ObjectValidator)); +exports.UpdateFiltersRequestValidator = UpdateFiltersRequestValidator; +var RemoveFiltersRequestValidator = /** @class */ (function (_super) { + __extends(RemoveFiltersRequestValidator, _super); + function RemoveFiltersRequestValidator() { + return _super !== null && _super.apply(this, arguments) || this; + } + RemoveFiltersRequestValidator.prototype.validate = function (input, path, field) { + if (input == null) { + return null; + } + var fields = [ + { + field: "filtersOperation", + validators: [validator_1.Validators.fieldRequiredValidator, validator_1.Validators.filtersOperationsRemoveAllValidator] + }, + { + field: "filters", + validators: [validator_1.Validators.fieldForbiddenValidator, validator_1.Validators.filtersArrayValidator] + } + ]; + var multipleFieldsValidator = new multipleFieldsValidator_1.MultipleFieldsValidator(fields); + return multipleFieldsValidator.validate(input, path, field); + }; + return RemoveFiltersRequestValidator; +}(typeValidator_1.ObjectValidator)); +exports.RemoveFiltersRequestValidator = RemoveFiltersRequestValidator; var ConditionItemValidator = /** @class */ (function (_super) { __extends(ConditionItemValidator, _super); function ConditionItemValidator() { @@ -5864,7 +5973,7 @@ exports.BookmarksManager = BookmarksManager; Object.defineProperty(exports, "__esModule", { value: true }); /** @ignore */ /** */ var config = { - version: '2.16.5', + version: '2.17.1', type: 'js' }; exports.default = config; @@ -6964,10 +7073,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Page = void 0; +var powerbi_models_1 = __webpack_require__(/*! powerbi-models */ "./node_modules/powerbi-models/dist/models.js"); var visualDescriptor_1 = __webpack_require__(/*! ./visualDescriptor */ "./src/visualDescriptor.ts"); -var models = __webpack_require__(/*! powerbi-models */ "./node_modules/powerbi-models/dist/models.js"); -var utils = __webpack_require__(/*! ./util */ "./src/util.ts"); -var errors = __webpack_require__(/*! ./errors */ "./src/errors.ts"); +var util_1 = __webpack_require__(/*! ./util */ "./src/util.ts"); +var errors_1 = __webpack_require__(/*! ./errors */ "./src/errors.ts"); /** * A Power BI report page * @@ -6984,7 +7093,7 @@ var Page = /** @class */ (function () { * @param {string} name * @param {string} [displayName] * @param {boolean} [isActivePage] - * @param {models.SectionVisibility} [visibility] + * @param {SectionVisibility} [visibility] * @hidden */ function Page(report, name, displayName, isActivePage, visibility, defaultSize, defaultDisplayOption) { @@ -7004,7 +7113,7 @@ var Page = /** @class */ (function () { * .then(filters => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ Page.prototype.getFilters = function () { return __awaiter(this, void 0, void 0, function () { @@ -7026,30 +7135,35 @@ var Page = /** @class */ (function () { }); }; /** - * Delete the page from the report + * Update the filters for the current page according to the operation: Add, replace all, replace by target or remove. * * ```javascript - * // Delete the page from the report - * page.delete(); + * page.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); * ``` * - * @returns {Promise} + * @param {(IFilter[])} filters + * @returns {Promise>} */ - Page.prototype.delete = function () { + Page.prototype.updateFilters = function (operation, filters) { return __awaiter(this, void 0, void 0, function () { - var response, response_2; + var updateFiltersRequest, response_2; return __generator(this, function (_a) { switch (_a.label) { case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, this.report.service.hpm.delete("/report/pages/" + this.name, {}, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; + updateFiltersRequest = { + filtersOperation: operation, + filters: filters + }; + _a.label = 1; case 1: - response = _a.sent(); - return [2 /*return*/, response.body]; - case 2: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.report.service.hpm.post("/report/pages/" + this.name + "/filters", updateFiltersRequest, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; + case 2: return [2 /*return*/, _a.sent()]; + case 3: response_2 = _a.sent(); throw response_2.body; - case 3: return [2 /*return*/]; + case 4: return [2 /*return*/]; } }); }); @@ -7067,65 +7181,61 @@ var Page = /** @class */ (function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { - case 0: return [4 /*yield*/, this.setFilters([])]; + case 0: return [4 /*yield*/, this.updateFilters(powerbi_models_1.FiltersOperations.RemoveAll)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** - * Makes the current page the active page of the report. + * Sets all filters on the current page. * * ```javascript - * page.setActive(); + * page.setFilters(filters) + * .catch(errors => { ... }); * ``` * + * @param {(IFilter[])} filters * @returns {Promise>} */ - Page.prototype.setActive = function () { + Page.prototype.setFilters = function (filters) { return __awaiter(this, void 0, void 0, function () { - var page, response_3; + var response_3; return __generator(this, function (_a) { switch (_a.label) { case 0: - page = { - name: this.name, - displayName: null, - isActive: true - }; - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [4 /*yield*/, this.report.service.hpm.put('/report/pages/active', page, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; - case 2: return [2 /*return*/, _a.sent()]; - case 3: + _a.trys.push([0, 2, , 3]); + return [4 /*yield*/, this.report.service.hpm.put("/report/pages/" + this.name + "/filters", filters, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; + case 1: return [2 /*return*/, _a.sent()]; + case 2: response_3 = _a.sent(); throw response_3.body; - case 4: return [2 /*return*/]; + case 3: return [2 /*return*/]; } }); }); }; /** - * Sets all filters on the current page. + * Delete the page from the report * * ```javascript - * page.setFilters(filters); - * .catch(errors => { ... }); + * // Delete the page from the report + * page.delete(); * ``` * - * @param {(models.IFilter[])} filters - * @returns {Promise>} + * @returns {Promise} */ - Page.prototype.setFilters = function (filters) { + Page.prototype.delete = function () { return __awaiter(this, void 0, void 0, function () { - var response_4; + var response, response_4; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, this.report.service.hpm.put("/report/pages/" + this.name + "/filters", filters, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; - case 1: return [2 /*return*/, _a.sent()]; + return [4 /*yield*/, this.report.service.hpm.delete("/report/pages/" + this.name, {}, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; + case 1: + response = _a.sent(); + return [2 /*return*/, response.body]; case 2: response_4 = _a.sent(); throw response_4.body; @@ -7134,6 +7244,39 @@ var Page = /** @class */ (function () { }); }); }; + /** + * Makes the current page the active page of the report. + * + * ```javascript + * page.setActive(); + * ``` + * + * @returns {Promise>} + */ + Page.prototype.setActive = function () { + return __awaiter(this, void 0, void 0, function () { + var page, response_5; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + page = { + name: this.name, + displayName: null, + isActive: true + }; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.report.service.hpm.put('/report/pages/active', page, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; + case 2: return [2 /*return*/, _a.sent()]; + case 3: + response_5 = _a.sent(); + throw response_5.body; + case 4: return [2 /*return*/]; + } + }); + }); + }; /** * Set displayName to the current page. * @@ -7145,7 +7288,7 @@ var Page = /** @class */ (function () { */ Page.prototype.setDisplayName = function (displayName) { return __awaiter(this, void 0, void 0, function () { - var page, response_5; + var page, response_6; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -7159,8 +7302,8 @@ var Page = /** @class */ (function () { return [4 /*yield*/, this.report.service.hpm.put("/report/pages/" + this.name + "/name", page, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow)]; case 2: return [2 /*return*/, _a.sent()]; case 3: - response_5 = _a.sent(); - throw response_5.body; + response_6 = _a.sent(); + throw response_6.body; case 4: return [2 /*return*/]; } }); @@ -7178,13 +7321,13 @@ var Page = /** @class */ (function () { */ Page.prototype.getVisuals = function () { return __awaiter(this, void 0, void 0, function () { - var response, response_6; + var response, response_7; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.report.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.report.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } _a.label = 1; case 1: @@ -7193,12 +7336,10 @@ var Page = /** @class */ (function () { case 2: response = _a.sent(); return [2 /*return*/, response.body - .map(function (visual) { - return new visualDescriptor_1.VisualDescriptor(_this, visual.name, visual.title, visual.type, visual.layout); - })]; + .map(function (visual) { return new visualDescriptor_1.VisualDescriptor(_this, visual.name, visual.title, visual.type, visual.layout); })]; case 3: - response_6 = _a.sent(); - throw response_6.body; + response_7 = _a.sent(); + throw response_7.body; case 4: return [2 /*return*/]; } }); @@ -7216,14 +7357,14 @@ var Page = /** @class */ (function () { */ Page.prototype.hasLayout = function (layoutType) { return __awaiter(this, void 0, void 0, function () { - var layoutTypeEnum, response, response_7; + var layoutTypeEnum, response, response_8; return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.report.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.report.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } - layoutTypeEnum = models.LayoutType[layoutType]; + layoutTypeEnum = powerbi_models_1.LayoutType[layoutType]; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); @@ -7232,8 +7373,8 @@ var Page = /** @class */ (function () { response = _a.sent(); return [2 /*return*/, response.body]; case 3: - response_7 = _a.sent(); - throw response_7.body; + response_8 = _a.sent(); + throw response_8.body; case 4: return [2 /*return*/]; } }); @@ -7496,10 +7637,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Report = void 0; -var embed = __webpack_require__(/*! ./embed */ "./src/embed.ts"); -var models = __webpack_require__(/*! powerbi-models */ "./node_modules/powerbi-models/dist/models.js"); -var utils = __webpack_require__(/*! ./util */ "./src/util.ts"); -var errors = __webpack_require__(/*! ./errors */ "./src/errors.ts"); +var powerbi_models_1 = __webpack_require__(/*! powerbi-models */ "./node_modules/powerbi-models/dist/models.js"); +var embed_1 = __webpack_require__(/*! ./embed */ "./src/embed.ts"); +var util_1 = __webpack_require__(/*! ./util */ "./src/util.ts"); +var errors_1 = __webpack_require__(/*! ./errors */ "./src/errors.ts"); var page_1 = __webpack_require__(/*! ./page */ "./src/page.ts"); var bookmarksManager_1 = __webpack_require__(/*! ./bookmarksManager */ "./src/bookmarksManager.ts"); /** @@ -7507,7 +7648,7 @@ var bookmarksManager_1 = __webpack_require__(/*! ./bookmarksManager */ "./src/bo * * @export * @class Report - * @extends {embed.Embed} + * @extends {Embed} * @implements {IReportNode} * @implements {IFilterable} */ @@ -7516,9 +7657,9 @@ var Report = /** @class */ (function (_super) { /** * Creates an instance of a Power BI Report. * - * @param {service.Service} service + * @param {Service} service * @param {HTMLElement} element - * @param {embed.IEmbedConfiguration} config + * @param {IEmbedConfiguration} config * @hidden */ function Report(service, element, baseConfig, phasedRender, isBootstrap, iframe) { @@ -7536,6 +7677,7 @@ var Report = /** @class */ (function (_super) { * (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. + * * @hidden * @static * @param {string} url @@ -7694,7 +7836,7 @@ var Report = /** @class */ (function (_super) { * }); * ``` * - * @returns {Promise} + * @returns {Promise} */ Report.prototype.getFilters = function () { return __awaiter(this, void 0, void 0, function () { @@ -7702,8 +7844,8 @@ var Report = /** @class */ (function (_super) { return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } _a.label = 1; case 1: @@ -7721,13 +7863,105 @@ var Report = /** @class */ (function (_super) { }); }; /** - * Gets the report ID from the first available location: options, attribute, embed url. + * Update the filters at the report level according to the operation: Add, replace all, replace by target or remove. * - * @returns {string} + * ```javascript + * report.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} */ - Report.prototype.getId = function () { - var config = this.config; - var reportId = config.id || this.element.getAttribute(Report.reportIdAttribute) || Report.findIdFromEmbedUrl(config.embedUrl); + Report.prototype.updateFilters = function (operation, filters) { + return __awaiter(this, void 0, void 0, function () { + var updateFiltersRequest, response_6; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + updateFiltersRequest = { + filtersOperation: operation, + filters: filters + }; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.service.hpm.post("/report/filters", updateFiltersRequest, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; + case 2: return [2 /*return*/, _a.sent()]; + case 3: + response_6 = _a.sent(); + throw response_6.body; + case 4: return [2 /*return*/]; + } + }); + }); + }; + /** + * Removes all filters at the report level. + * + * ```javascript + * report.removeFilters(); + * ``` + * + * @returns {Promise>} + */ + Report.prototype.removeFilters = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; + } + return [2 /*return*/, this.updateFilters(powerbi_models_1.FiltersOperations.RemoveAll)]; + }); + }); + }; + /** + * Sets filters at the report level. + * + * ```javascript + * const filters: [ + * ... + * ]; + * + * report.setFilters(filters) + * .catch(errors => { + * ... + * }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + Report.prototype.setFilters = function (filters) { + return __awaiter(this, void 0, void 0, function () { + var response_7; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; + } + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.service.hpm.put("/report/filters", filters, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; + case 2: return [2 /*return*/, _a.sent()]; + case 3: + response_7 = _a.sent(); + throw response_7.body; + case 4: return [2 /*return*/]; + } + }); + }); + }; + /** + * Gets the report ID from the first available location: options, attribute, embed url. + * + * @returns {string} + */ + Report.prototype.getId = function () { + var config = this.config; + var reportId = config.id || this.element.getAttribute(Report.reportIdAttribute) || Report.findIdFromEmbedUrl(config.embedUrl); if (typeof reportId !== 'string' || reportId.length === 0) { throw new Error("Report id is required, but it was not found. You must provide an id either as part of embed configuration or as attribute '" + Report.reportIdAttribute + "'."); } @@ -7747,13 +7981,13 @@ var Report = /** @class */ (function (_super) { */ Report.prototype.getPages = function () { return __awaiter(this, void 0, void 0, function () { - var response, response_6; + var response, response_8; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } _a.label = 1; case 1: @@ -7762,12 +7996,10 @@ var Report = /** @class */ (function (_super) { case 2: response = _a.sent(); return [2 /*return*/, response.body - .map(function (page) { - return new page_1.Page(_this, page.name, page.displayName, page.isActive, page.visibility, page.defaultSize, page.defaultDisplayOption); - })]; + .map(function (page) { return new page_1.Page(_this, page.name, page.displayName, page.isActive, page.visibility, page.defaultSize, page.defaultDisplayOption); })]; case 3: - response_6 = _a.sent(); - throw response_6.body; + response_8 = _a.sent(); + throw response_8.body; case 4: return [2 /*return*/]; } }); @@ -7796,12 +8028,12 @@ var Report = /** @class */ (function (_super) { */ Report.prototype.print = function () { return __awaiter(this, void 0, void 0, function () { - var response, response_7; + var response, response_9; return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } _a.label = 1; case 1: @@ -7811,36 +8043,13 @@ var Report = /** @class */ (function (_super) { response = _a.sent(); return [2 /*return*/, response.body]; case 3: - response_7 = _a.sent(); - throw response_7.body; + response_9 = _a.sent(); + throw response_9.body; case 4: return [2 /*return*/]; } }); }); }; - /** - * Removes all filters at the report level. - * - * ```javascript - * report.removeFilters(); - * ``` - * - * @returns {Promise>} - */ - Report.prototype.removeFilters = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; - } - return [4 /*yield*/, this.setFilters([])]; - case 1: return [2 /*return*/, _a.sent()]; - } - }); - }); - }; /** * Sets the active page of the report. * @@ -7854,12 +8063,12 @@ var Report = /** @class */ (function (_super) { */ Report.prototype.setPage = function (pageName) { return __awaiter(this, void 0, void 0, function () { - var page, response_8; + var page, response_10; return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } page = { name: pageName, @@ -7872,47 +8081,8 @@ var Report = /** @class */ (function (_super) { return [4 /*yield*/, this.service.hpm.put('/report/pages/active', page, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; case 2: return [2 /*return*/, _a.sent()]; case 3: - response_8 = _a.sent(); - throw response_8.body; - case 4: return [2 /*return*/]; - } - }); - }); - }; - /** - * Sets filters at the report level. - * - * ```javascript - * const filters: [ - * ... - * ]; - * - * report.setFilters(filters) - * .catch(errors => { - * ... - * }); - * ``` - * - * @param {(models.IFilter[])} filters - * @returns {Promise>} - */ - Report.prototype.setFilters = function (filters) { - return __awaiter(this, void 0, void 0, function () { - var response_9; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; - } - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [4 /*yield*/, this.service.hpm.put("/report/filters", filters, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; - case 2: return [2 /*return*/, _a.sent()]; - case 3: - response_9 = _a.sent(); - throw response_9.body; + response_10 = _a.sent(); + throw response_10.body; case 4: return [2 /*return*/]; } }); @@ -7931,17 +8101,17 @@ var Report = /** @class */ (function (_super) { * .catch(error => { ... }); * ``` * - * @param {models.ISettings} settings + * @param {ISettings} settings * @returns {Promise>} */ Report.prototype.updateSettings = function (settings) { return __awaiter(this, void 0, void 0, function () { - var response_10; + var response_11; return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl) && settings.customLayout != null) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl) && settings.customLayout != null) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } _a.label = 1; case 1: @@ -7949,8 +8119,8 @@ var Report = /** @class */ (function (_super) { return [4 /*yield*/, this.service.hpm.patch('/report/settings', settings, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; case 2: return [2 /*return*/, _a.sent()]; case 3: - response_10 = _a.sent(); - throw response_10.body; + response_11 = _a.sent(); + throw response_11.body; case 4: return [2 /*return*/]; } }); @@ -7962,7 +8132,7 @@ var Report = /** @class */ (function (_super) { * @hidden */ Report.prototype.validate = function (config) { - return models.validateReportLoad(config); + return powerbi_models_1.validateReportLoad(config); }; /** * Handle config changes. @@ -7971,8 +8141,9 @@ var Report = /** @class */ (function (_super) { */ Report.prototype.configChanged = function (isBootstrap) { var config = this.config; - if (this.isMobileSettings(config.settings)) - config.embedUrl = utils.addParamToUrl(config.embedUrl, "isMobile", "true"); + if (this.isMobileSettings(config.settings)) { + config.embedUrl = util_1.addParamToUrl(config.embedUrl, "isMobile", "true"); + } // Calculate settings from HTML element attributes if available. var filterPaneEnabledAttribute = this.element.getAttribute(Report.filterPaneEnabledAttribute); var navContentPaneEnabledAttribute = this.element.getAttribute(Report.navContentPaneEnabledAttribute); @@ -7981,7 +8152,7 @@ var Report = /** @class */ (function (_super) { navContentPaneEnabled: (navContentPaneEnabledAttribute == null) ? undefined : (navContentPaneEnabledAttribute !== "false") }; // Set the settings back into the config. - this.config.settings = utils.assign({}, elementAttrSettings, config.settings); + this.config.settings = util_1.assign({}, elementAttrSettings, config.settings); if (isBootstrap) { return; } @@ -8001,7 +8172,7 @@ var Report = /** @class */ (function (_super) { */ Report.prototype.switchMode = function (viewMode) { return __awaiter(this, void 0, void 0, function () { - var newMode, url, response, response_11; + var newMode, url, response, response_12; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -8020,23 +8191,23 @@ var Report = /** @class */ (function (_super) { response = _a.sent(); return [2 /*return*/, response.body]; case 3: - response_11 = _a.sent(); - throw response_11.body; + response_12 = _a.sent(); + throw response_12.body; case 4: return [2 /*return*/]; } }); }); }; /** - * Refreshes data sources for the report. - * - * ```javascript - * report.refresh(); - * ``` - */ + * Refreshes data sources for the report. + * + * ```javascript + * report.refresh(); + * ``` + */ Report.prototype.refresh = function () { return __awaiter(this, void 0, void 0, function () { - var response, response_12; + var response, response_13; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -8046,8 +8217,8 @@ var Report = /** @class */ (function (_super) { response = _a.sent(); return [2 /*return*/, response.body]; case 2: - response_12 = _a.sent(); - throw response_12.body; + response_13 = _a.sent(); + throw response_13.body; case 3: return [2 /*return*/]; } }); @@ -8067,10 +8238,10 @@ var Report = /** @class */ (function (_super) { return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } - return [4 /*yield*/, utils.isSavedInternal(this.service.hpm, this.config.uniqueId, this.iframe.contentWindow)]; + return [4 /*yield*/, util_1.isSavedInternal(this.service.hpm, this.config.uniqueId, this.iframe.contentWindow)]; case 1: return [2 /*return*/, _a.sent()]; } }); @@ -8088,8 +8259,8 @@ var Report = /** @class */ (function (_super) { return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } return [4 /*yield*/, this.applyThemeInternal(theme)]; case 1: return [2 /*return*/, _a.sent()]; @@ -8098,19 +8269,19 @@ var Report = /** @class */ (function (_super) { }); }; /** - * Reset and apply the default theme of the report - * - * ```javascript - * report.resetTheme(); - * ``` - */ + * Reset and apply the default theme of the report + * + * ```javascript + * report.resetTheme(); + * ``` + */ Report.prototype.resetTheme = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: - if (utils.isRDLEmbed(this.config.embedUrl)) { - return [2 /*return*/, Promise.reject(errors.APINotSupportedForRDLError)]; + if (util_1.isRDLEmbed(this.config.embedUrl)) { + return [2 /*return*/, Promise.reject(errors_1.APINotSupportedForRDLError)]; } return [4 /*yield*/, this.applyThemeInternal({})]; case 1: return [2 /*return*/, _a.sent()]; @@ -8119,15 +8290,15 @@ var Report = /** @class */ (function (_super) { }); }; /** - * Reset user's filters, slicers, and other data view changes to the default state of the report - * - * ```javascript - * report.resetPersistentFilters(); - * ``` - */ + * Reset user's filters, slicers, and other data view changes to the default state of the report + * + * ```javascript + * report.resetPersistentFilters(); + * ``` + */ Report.prototype.resetPersistentFilters = function () { return __awaiter(this, void 0, void 0, function () { - var response_13; + var response_14; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -8135,23 +8306,23 @@ var Report = /** @class */ (function (_super) { return [4 /*yield*/, this.service.hpm.delete("/report/userState", null, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; case 1: return [2 /*return*/, _a.sent()]; case 2: - response_13 = _a.sent(); - throw response_13.body; + response_14 = _a.sent(); + throw response_14.body; case 3: return [2 /*return*/]; } }); }); }; /** - * Save user's filters, slicers, and other data view changes of the report - * - * ```javascript - * report.savePersistentFilters(); - * ``` - */ + * Save user's filters, slicers, and other data view changes of the report + * + * ```javascript + * report.savePersistentFilters(); + * ``` + */ Report.prototype.savePersistentFilters = function () { return __awaiter(this, void 0, void 0, function () { - var response_14; + var response_15; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -8159,26 +8330,26 @@ var Report = /** @class */ (function (_super) { return [4 /*yield*/, this.service.hpm.post("/report/userState", null, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; case 1: return [2 /*return*/, _a.sent()]; case 2: - response_14 = _a.sent(); - throw response_14.body; + response_15 = _a.sent(); + throw response_15.body; case 3: return [2 /*return*/]; } }); }); }; /** - * Returns if there are user's filters, slicers, or other data view changes applied on the report. - * If persistent filters is disable, returns false. - * - * ```javascript - * report.arePersistentFiltersApplied(); - * ``` - * - * @returns {Promise} - */ + * Returns if there are user's filters, slicers, or other data view changes applied on the report. + * If persistent filters is disable, returns false. + * + * ```javascript + * report.arePersistentFiltersApplied(); + * ``` + * + * @returns {Promise} + */ Report.prototype.arePersistentFiltersApplied = function () { return __awaiter(this, void 0, void 0, function () { - var response, response_15; + var response, response_16; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -8188,8 +8359,8 @@ var Report = /** @class */ (function (_super) { response = _a.sent(); return [2 /*return*/, response.body]; case 2: - response_15 = _a.sent(); - throw response_15.body; + response_16 = _a.sent(); + throw response_16.body; case 3: return [2 /*return*/]; } }); @@ -8200,7 +8371,7 @@ var Report = /** @class */ (function (_super) { */ Report.prototype.applyThemeInternal = function (theme) { return __awaiter(this, void 0, void 0, function () { - var response, response_16; + var response, response_17; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -8210,8 +8381,8 @@ var Report = /** @class */ (function (_super) { response = _a.sent(); return [2 /*return*/, response.body]; case 2: - response_16 = _a.sent(); - throw response_16.body; + response_17 = _a.sent(); + throw response_17.body; case 3: return [2 /*return*/]; } }); @@ -8223,10 +8394,10 @@ var Report = /** @class */ (function (_super) { Report.prototype.viewModeToString = function (viewMode) { var mode; switch (viewMode) { - case models.ViewMode.Edit: + case powerbi_models_1.ViewMode.Edit: mode = "edit"; break; - case models.ViewMode.View: + case powerbi_models_1.ViewMode.View: mode = "view"; break; } @@ -8236,7 +8407,7 @@ var Report = /** @class */ (function (_super) { * @hidden */ Report.prototype.isMobileSettings = function (settings) { - return settings && (settings.layoutType === models.LayoutType.MobileLandscape || settings.layoutType === models.LayoutType.MobilePortrait); + return settings && (settings.layoutType === powerbi_models_1.LayoutType.MobileLandscape || settings.layoutType === powerbi_models_1.LayoutType.MobilePortrait); }; /** @hidden */ Report.allowedEvents = ["filtersApplied", "pageChanged", "commandTriggered", "swipeStart", "swipeEnd", "bookmarkApplied", "dataHyperlinkClicked", "visualRendered", "visualClicked", "selectionChanged"]; @@ -8251,7 +8422,7 @@ var Report = /** @class */ (function (_super) { /** @hidden */ Report.type = "Report"; return Report; -}(embed.Embed)); +}(embed_1.Embed)); exports.Report = Report; @@ -8603,6 +8774,10 @@ var Service = /** @class */ (function () { if (embedElement.frontLoadHandler) { embedElement.element.removeEventListener('ready', embedElement.frontLoadHandler, false); } + /** Removes all event handlers. */ + embedElement.allowedEvents.forEach(function (eventName) { + embedElement.off(eventName); + }); /** Removes the component from an internal list of components. */ utils.remove(function (x) { return x === powerBiElement.powerBiEmbed; }, this.embeds); /** Deletes a property from the HTML element. */ @@ -9144,7 +9319,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Visual = void 0; -var models = __webpack_require__(/*! powerbi-models */ "./node_modules/powerbi-models/dist/models.js"); +var powerbi_models_1 = __webpack_require__(/*! powerbi-models */ "./node_modules/powerbi-models/dist/models.js"); var report_1 = __webpack_require__(/*! ./report */ "./src/report.ts"); var visualDescriptor_1 = __webpack_require__(/*! ./visualDescriptor */ "./src/visualDescriptor.ts"); /** @@ -9158,9 +9333,9 @@ var Visual = /** @class */ (function (_super) { /** * Creates an instance of a Power BI Single Visual. * - * @param {service.Service} service + * @param {Service} service * @param {HTMLElement} element - * @param {embed.IEmbedConfiguration} config + * @param {IEmbedConfiguration} config * @hidden */ function Visual(service, element, baseConfig, phasedRender, isBootstrap, iframe) { @@ -9185,7 +9360,7 @@ var Visual = /** @class */ (function (_super) { var width = config.width ? config.width : this.iframe.offsetWidth; var height = config.height ? config.height : this.iframe.offsetHeight; var pageSize = { - type: models.PageSizeType.Custom, + type: powerbi_models_1.PageSizeType.Custom, width: width, height: height, }; @@ -9193,14 +9368,14 @@ var Visual = /** @class */ (function (_super) { pagesLayout[config.pageName] = { defaultLayout: { displayState: { - mode: models.VisualContainerDisplayMode.Hidden + mode: powerbi_models_1.VisualContainerDisplayMode.Hidden } }, visualsLayout: {} }; pagesLayout[config.pageName].visualsLayout[config.visualName] = { displayState: { - mode: models.VisualContainerDisplayMode.Visible + mode: powerbi_models_1.VisualContainerDisplayMode.Visible }, x: 1, y: 1, @@ -9211,9 +9386,9 @@ var Visual = /** @class */ (function (_super) { config.settings = config.settings || {}; config.settings.filterPaneEnabled = false; config.settings.navContentPaneEnabled = false; - config.settings.layoutType = models.LayoutType.Custom; + config.settings.layoutType = powerbi_models_1.LayoutType.Custom; config.settings.customLayout = { - displayOption: models.DisplayOption.FitToPage, + displayOption: powerbi_models_1.DisplayOption.FitToPage, pageSize: pageSize, pagesLayout: pagesLayout }; @@ -9221,7 +9396,7 @@ var Visual = /** @class */ (function (_super) { return _super.prototype.load.call(this, phasedRender); }; /** - * Gets the list of pages within the report - not supported in visual embed. + * Gets the list of pages within the report - not supported in visual * * @returns {Promise} */ @@ -9229,7 +9404,7 @@ var Visual = /** @class */ (function (_super) { throw Visual.GetPagesNotSupportedError; }; /** - * Sets the active page of the report - not supported in visual embed. + * Sets the active page of the report - not supported in visual * * @param {string} pageName * @returns {Promise>} @@ -9303,7 +9478,7 @@ var Visual = /** @class */ (function (_super) { * }); * ``` * - * @returns {Promise} + * @returns {Promise} */ Visual.prototype.getFilters = function (filtersLevel) { return __awaiter(this, void 0, void 0, function () { @@ -9327,6 +9502,48 @@ var Visual = /** @class */ (function (_super) { }); }); }; + /** + * Updates filters at the filter level. + * Default filter level is visual level. + * + * ```javascript + * const filters: [ + * ... + * ]; + * + * visual.updateFilters(FiltersOperations.Add, filters, filtersLevel) + * .catch(errors => { + * ... + * }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + Visual.prototype.updateFilters = function (operation, filters, filtersLevel) { + return __awaiter(this, void 0, void 0, function () { + var updateFiltersRequest, url, response_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + updateFiltersRequest = { + filtersOperation: operation, + filters: filters + }; + url = this.getFiltersLevelUrl(filtersLevel); + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.service.hpm.put(url, updateFiltersRequest, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; + case 2: return [2 /*return*/, _a.sent()]; + case 3: + response_3 = _a.sent(); + throw response_3.body; + case 4: return [2 /*return*/]; + } + }); + }); + }; /** * Sets filters at the filter level. * Default filter level is visual level. @@ -9342,12 +9559,12 @@ var Visual = /** @class */ (function (_super) { * }); * ``` * - * @param {(models.IFilter[])} filters + * @param {(IFilter[])} filters * @returns {Promise>} */ Visual.prototype.setFilters = function (filters, filtersLevel) { return __awaiter(this, void 0, void 0, function () { - var url, response_3; + var url, response_4; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -9358,8 +9575,8 @@ var Visual = /** @class */ (function (_super) { return [4 /*yield*/, this.service.hpm.put(url, filters, { uid: this.config.uniqueId }, this.iframe.contentWindow)]; case 2: return [2 /*return*/, _a.sent()]; case 3: - response_3 = _a.sent(); - throw response_3.body; + response_4 = _a.sent(); + throw response_4.body; case 4: return [2 /*return*/]; } }); @@ -9379,7 +9596,7 @@ var Visual = /** @class */ (function (_super) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { - case 0: return [4 /*yield*/, this.setFilters([], filtersLevel)]; + case 0: return [4 /*yield*/, this.updateFilters(powerbi_models_1.FiltersOperations.RemoveAll, undefined, filtersLevel)]; case 1: return [2 /*return*/, _a.sent()]; } }); @@ -9391,9 +9608,9 @@ var Visual = /** @class */ (function (_super) { Visual.prototype.getFiltersLevelUrl = function (filtersLevel) { var config = this.config; switch (filtersLevel) { - case models.FiltersLevel.Report: + case powerbi_models_1.FiltersLevel.Report: return "/report/filters"; - case models.FiltersLevel.Page: + case powerbi_models_1.FiltersLevel.Page: return "/report/pages/" + config.pageName + "/filters"; default: return "/report/pages/" + config.pageName + "/visuals/" + config.visualName + "/filters"; @@ -9419,7 +9636,7 @@ exports.Visual = Visual; !*** ./src/visualDescriptor.ts ***! \*********************************/ /*! no static exports found */ -/***/ (function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -9459,6 +9676,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.VisualDescriptor = void 0; +var powerbi_models_1 = __webpack_require__(/*! powerbi-models */ "./node_modules/powerbi-models/dist/models.js"); /** * A Power BI visual within a page * @@ -9485,7 +9703,7 @@ var VisualDescriptor = /** @class */ (function () { * .then(filters => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ VisualDescriptor.prototype.getFilters = function () { return __awaiter(this, void 0, void 0, function () { @@ -9506,6 +9724,40 @@ var VisualDescriptor = /** @class */ (function () { }); }); }; + /** + * Update the filters for the current visual according to the operation: Add, replace all, replace by target or remove. + * + * ```javascript + * visual.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + VisualDescriptor.prototype.updateFilters = function (operation, filters) { + return __awaiter(this, void 0, void 0, function () { + var updateFiltersRequest, response_2; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + updateFiltersRequest = { + filtersOperation: operation, + filters: filters + }; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, this.page.report.service.hpm.post("/report/pages/" + this.page.name + "/visuals/" + this.name + "/filters", updateFiltersRequest, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow)]; + case 2: return [2 /*return*/, _a.sent()]; + case 3: + response_2 = _a.sent(); + throw response_2.body; + case 4: return [2 /*return*/]; + } + }); + }); + }; /** * Removes all filters from the current visual. * @@ -9519,7 +9771,7 @@ var VisualDescriptor = /** @class */ (function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { - case 0: return [4 /*yield*/, this.setFilters([])]; + case 0: return [4 /*yield*/, this.updateFilters(powerbi_models_1.FiltersOperations.RemoveAll)]; case 1: return [2 /*return*/, _a.sent()]; } }); @@ -9533,12 +9785,12 @@ var VisualDescriptor = /** @class */ (function () { * .catch(errors => { ... }); * ``` * - * @param {(models.IFilter[])} filters + * @param {(IFilter[])} filters * @returns {Promise>} */ VisualDescriptor.prototype.setFilters = function (filters) { return __awaiter(this, void 0, void 0, function () { - var response_2; + var response_3; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -9546,8 +9798,8 @@ var VisualDescriptor = /** @class */ (function () { return [4 /*yield*/, this.page.report.service.hpm.put("/report/pages/" + this.page.name + "/visuals/" + this.name + "/filters", filters, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow)]; case 1: return [2 /*return*/, _a.sent()]; case 2: - response_2 = _a.sent(); - throw response_2.body; + response_3 = _a.sent(); + throw response_3.body; case 3: return [2 /*return*/]; } }); @@ -9557,17 +9809,17 @@ var VisualDescriptor = /** @class */ (function () { * Exports Visual data. * Can export up to 30K rows. * @param rows: Optional. Default value is 30K, maximum value is 30K as well. - * @param exportDataType: Optional. Default is models.ExportDataType.Summarized. + * @param exportDataType: Optional. Default is ExportDataType.Summarized. * ```javascript * visual.exportData() * .then(data => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ VisualDescriptor.prototype.exportData = function (exportDataType, rows) { return __awaiter(this, void 0, void 0, function () { - var exportDataRequestBody, response, response_3; + var exportDataRequestBody, response, response_4; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -9583,8 +9835,8 @@ var VisualDescriptor = /** @class */ (function () { response = _a.sent(); return [2 /*return*/, response.body]; case 3: - response_3 = _a.sent(); - throw response_3.body; + response_4 = _a.sent(); + throw response_4.body; case 4: return [2 /*return*/]; } }); @@ -9601,7 +9853,7 @@ var VisualDescriptor = /** @class */ (function () { */ VisualDescriptor.prototype.setSlicerState = function (state) { return __awaiter(this, void 0, void 0, function () { - var response_4; + var response_5; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -9609,8 +9861,8 @@ var VisualDescriptor = /** @class */ (function () { return [4 /*yield*/, this.page.report.service.hpm.put("/report/pages/" + this.page.name + "/visuals/" + this.name + "/slicer", state, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow)]; case 1: return [2 /*return*/, _a.sent()]; case 2: - response_4 = _a.sent(); - throw response_4.body; + response_5 = _a.sent(); + throw response_5.body; case 3: return [2 /*return*/]; } }); @@ -9625,11 +9877,11 @@ var VisualDescriptor = /** @class */ (function () { * .then(state => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ VisualDescriptor.prototype.getSlicerState = function () { return __awaiter(this, void 0, void 0, function () { - var response, response_5; + var response, response_6; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -9639,8 +9891,8 @@ var VisualDescriptor = /** @class */ (function () { response = _a.sent(); return [2 /*return*/, response.body]; case 2: - response_5 = _a.sent(); - throw response_5.body; + response_6 = _a.sent(); + throw response_6.body; case 3: return [2 /*return*/]; } }); @@ -9649,12 +9901,12 @@ var VisualDescriptor = /** @class */ (function () { /** * Clone existing visual to a new instance. * - * @returns {(Promise)} + * @returns {(Promise)} */ VisualDescriptor.prototype.clone = function (request) { if (request === void 0) { request = {}; } return __awaiter(this, void 0, void 0, function () { - var response, response_6; + var response, response_7; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -9664,8 +9916,8 @@ var VisualDescriptor = /** @class */ (function () { response = _a.sent(); return [2 /*return*/, response.body]; case 2: - response_6 = _a.sent(); - throw response_6.body; + response_7 = _a.sent(); + throw response_7.body; case 3: return [2 /*return*/]; } }); @@ -9683,7 +9935,7 @@ var VisualDescriptor = /** @class */ (function () { */ VisualDescriptor.prototype.sortBy = function (request) { return __awaiter(this, void 0, void 0, function () { - var response_7; + var response_8; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -9691,8 +9943,8 @@ var VisualDescriptor = /** @class */ (function () { return [4 /*yield*/, this.page.report.service.hpm.put("/report/pages/" + this.page.name + "/visuals/" + this.name + "/sortBy", request, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow)]; case 1: return [2 /*return*/, _a.sent()]; case 2: - response_7 = _a.sent(); - throw response_7.body; + response_8 = _a.sent(); + throw response_8.body; case 3: return [2 /*return*/]; } }); diff --git a/dist/powerbi.min.js b/dist/powerbi.min.js index 7c107024..9d57b9c1 100644 --- a/dist/powerbi.min.js +++ b/dist/powerbi.min.js @@ -1,7 +1,7 @@ -/*! powerbi-client v2.16.5 | (c) 2016 Microsoft Corporation MIT */ +/*! powerbi-client v2.17.1 | (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){var e={};function r(a){if(e[a])return e[a].exports;var i=e[a]={i:a,l:!1,exports:{}};return t[a].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)r.d(a,i,function(e){return t[e]}.bind(null,i));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=12)}([function(t,e,r){ -/*! powerbi-models v1.7.1 | (c) 2016 Microsoft Corporation MIT */ -var a;a=function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var i=e[a]={i:a,l:!1,exports:{}};return t[a].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)r.d(a,i,function(e){return t[e]}.bind(null,i));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){var a,i=this&&this.__extends||(a=function(t,e){return(a=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])})(t,e)},function(t,e){function r(){this.constructor=t}a(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.validateCustomTheme=e.validateCommandsSettings=e.validateVisualSettings=e.validateVisualHeader=e.validateExportDataRequest=e.validateQnaInterpretInputData=e.validateLoadQnaConfiguration=e.validateSaveAsParameters=e.validateFilter=e.validatePage=e.validateTileLoad=e.validateDashboardLoad=e.validateCreateReport=e.validateReportLoad=e.validateMenuGroupExtension=e.validateExtension=e.validateCustomPageSize=e.validateVisualizationsPane=e.validateSyncSlicersPane=e.validateSelectionPane=e.validatePageNavigationPane=e.validateFieldsPane=e.validateFiltersPane=e.validateBookmarksPane=e.validatePanes=e.validateSettings=e.validateCaptureBookmarkRequest=e.validateApplyBookmarkStateRequest=e.validateApplyBookmarkByNameRequest=e.validateAddBookmarkRequest=e.validatePlayBookmarkRequest=e.validateSlicerState=e.validateSlicer=e.validateVisualSelector=e.isIExtensionArray=e.isIExtensions=e.isGroupedMenuExtension=e.isFlatMenuExtension=e.VisualDataRoleKindPreference=e.VisualDataRoleKind=e.CommandDisplayOption=e.SlicerTargetSelector=e.VisualTypeSelector=e.VisualSelector=e.PageSelector=e.Selector=e.SortDirection=e.LegendPosition=e.TextAlignment=e.CommonErrorCodes=e.BookmarksPlayMode=e.ExportDataType=e.QnaMode=e.PageNavigationPosition=e.isColumnAggr=e.isHierarchyLevelAggr=e.isHierarchyLevel=e.isColumn=e.isMeasure=e.getFilterType=e.isBasicFilterWithKeys=e.isFilterKeyColumnsTarget=e.AdvancedFilter=e.TupleFilter=e.BasicFilterWithKeys=e.BasicFilter=e.RelativeTimeFilter=e.RelativeDateFilter=e.TopNFilter=e.IncludeExcludeFilter=e.NotSupportedFilter=e.Filter=e.RelativeDateOperators=e.RelativeDateFilterTimeUnit=e.FilterType=e.FiltersLevel=e.MenuLocation=e.ContrastMode=e.TokenType=e.ViewMode=e.Permissions=e.SectionVisibility=e.HyperlinkClickBehavior=e.LayoutType=e.VisualContainerDisplayMode=e.BackgroundType=e.DisplayOption=e.PageSizeType=e.TraceType=void 0;var o,n=r(1);!function(t){t[t.Information=0]="Information",t[t.Verbose=1]="Verbose",t[t.Warning=2]="Warning",t[t.Error=3]="Error",t[t.ExpectedError=4]="ExpectedError",t[t.UnexpectedError=5]="UnexpectedError",t[t.Fatal=6]="Fatal"}(e.TraceType||(e.TraceType={})),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"}(e.PageSizeType||(e.PageSizeType={})),function(t){t[t.FitToPage=0]="FitToPage",t[t.FitToWidth=1]="FitToWidth",t[t.ActualSize=2]="ActualSize"}(e.DisplayOption||(e.DisplayOption={})),function(t){t[t.Default=0]="Default",t[t.Transparent=1]="Transparent"}(e.BackgroundType||(e.BackgroundType={})),function(t){t[t.Visible=0]="Visible",t[t.Hidden=1]="Hidden"}(e.VisualContainerDisplayMode||(e.VisualContainerDisplayMode={})),function(t){t[t.Master=0]="Master",t[t.Custom=1]="Custom",t[t.MobilePortrait=2]="MobilePortrait",t[t.MobileLandscape=3]="MobileLandscape"}(e.LayoutType||(e.LayoutType={})),function(t){t[t.Navigate=0]="Navigate",t[t.NavigateAndRaiseEvent=1]="NavigateAndRaiseEvent",t[t.RaiseEvent=2]="RaiseEvent"}(e.HyperlinkClickBehavior||(e.HyperlinkClickBehavior={})),function(t){t[t.AlwaysVisible=0]="AlwaysVisible",t[t.HiddenInViewMode=1]="HiddenInViewMode"}(e.SectionVisibility||(e.SectionVisibility={})),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"}(e.Permissions||(e.Permissions={})),function(t){t[t.View=0]="View",t[t.Edit=1]="Edit"}(e.ViewMode||(e.ViewMode={})),function(t){t[t.Aad=0]="Aad",t[t.Embed=1]="Embed"}(e.TokenType||(e.TokenType={})),function(t){t[t.None=0]="None",t[t.HighContrast1=1]="HighContrast1",t[t.HighContrast2=2]="HighContrast2",t[t.HighContrastBlack=3]="HighContrastBlack",t[t.HighContrastWhite=4]="HighContrastWhite"}(e.ContrastMode||(e.ContrastMode={})),function(t){t[t.Bottom=0]="Bottom",t[t.Top=1]="Top"}(e.MenuLocation||(e.MenuLocation={})),function(t){t[t.Report=0]="Report",t[t.Page=1]="Page",t[t.Visual=2]="Visual"}(e.FiltersLevel||(e.FiltersLevel={})),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",t[t.Tuple=6]="Tuple",t[t.RelativeTime=7]="RelativeTime"}(o=e.FilterType||(e.FilterType={})),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",t[t.Minutes=7]="Minutes",t[t.Hours=8]="Hours"}(e.RelativeDateFilterTimeUnit||(e.RelativeDateFilterTimeUnit={})),function(t){t[t.InLast=0]="InLast",t[t.InThis=1]="InThis",t[t.InNext=2]="InNext"}(e.RelativeDateOperators||(e.RelativeDateOperators={}));var l=function(){function t(t,e){this.target=t,this.filterType=e}return t.prototype.toJSON=function(){var t={$schema:this.schemaUrl,target:this.target,filterType:this.filterType};return void 0!==this.displaySettings&&(t.displaySettings=this.displaySettings),t},t}();e.Filter=l;var s=function(t){function e(r,a,i){var n=t.call(this,r,o.Unknown)||this;return n.message=a,n.notSupportedTypeName=i,n.schemaUrl=e.schemaUrl,n}return i(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=s;var d=function(t){function e(r,a,i){var n=t.call(this,r,o.IncludeExclude)||this;return n.values=i,n.isExclude=a,n.schemaUrl=e.schemaUrl,n}return i(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 u=function(t){function e(r,a,i,n){var l=t.call(this,r,o.TopN)||this;return l.operator=a,l.itemCount=i,l.schemaUrl=e.schemaUrl,l.orderBy=n,l}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.operator=this.operator,e.itemCount=this.itemCount,e.orderBy=this.orderBy,e},e.schemaUrl="http://powerbi.com/product/schema#topN",e}(l);e.TopNFilter=u;var c=function(t){function e(r,a,i,n,l){var s=t.call(this,r,o.RelativeDate)||this;return s.operator=a,s.timeUnitsCount=i,s.timeUnitType=n,s.includeToday=l,s.schemaUrl=e.schemaUrl,s}return i(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=c;var p=function(t){function e(r,a,i,n){var l=t.call(this,r,o.RelativeTime)||this;return l.operator=a,l.timeUnitsCount=i,l.timeUnitType=n,l.schemaUrl=e.schemaUrl,l}return i(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},e.schemaUrl="http://powerbi.com/product/schema#relativeTime",e}(l);e.RelativeTimeFilter=p;var f=function(t){function e(r,a){for(var i=[],n=2;n0&&!i)throw new Error("You should 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,s=o.keyValues;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 s.conditions=l,s}return i(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);function m(t){if(t.filterType)return t.filterType;var e=t,r=t;return"string"==typeof e.operator&&Array.isArray(e.values)?o.Basic:"string"==typeof r.logicalOperator&&Array.isArray(r.conditions)?o.Advanced:o.Unknown}function V(t){return!(!t.table||!t.column||t.aggregationFunction)}e.AdvancedFilter=y,e.isFilterKeyColumnsTarget=function(t){return V(t)&&!!t.keys},e.isBasicFilterWithKeys=function(t){return m(t)===o.Basic&&!!t.keyValues},e.getFilterType=m,e.isMeasure=function(t){return void 0!==t.table&&void 0!==t.measure},e.isColumn=V,e.isHierarchyLevel=function(t){return!(!(t.table&&t.hierarchy&&t.hierarchyLevel)||t.aggregationFunction)},e.isHierarchyLevelAggr=function(t){return!!(t.table&&t.hierarchy&&t.hierarchyLevel&&t.aggregationFunction)},e.isColumnAggr=function(t){return!!(t.table&&t.column&&t.aggregationFunction)},function(t){t[t.Bottom=0]="Bottom",t[t.Left=1]="Left"}(e.PageNavigationPosition||(e.PageNavigationPosition={})),function(t){t[t.Interactive=0]="Interactive",t[t.ResultOnly=1]="ResultOnly"}(e.QnaMode||(e.QnaMode={})),function(t){t[t.Summarized=0]="Summarized",t[t.Underlying=1]="Underlying"}(e.ExportDataType||(e.ExportDataType={})),function(t){t[t.Off=0]="Off",t[t.Presentation=1]="Presentation"}(e.BookmarksPlayMode||(e.BookmarksPlayMode={})),e.CommonErrorCodes={TokenExpired:"TokenExpired",NotFound:"PowerBIEntityNotFound",InvalidParameters:"Invalid parameters",LoadReportFailed:"LoadReportFailed",NotAuthorized:"PowerBINotAuthorizedException",FailedToLoadModel:"ExplorationContainer_FailedToLoadModel_DefaultDetails"},e.TextAlignment={Left:"left",Center:"center",Right:"right"},e.LegendPosition={Top:"Top",Bottom:"Bottom",Right:"Right",Left:"Left",TopCenter:"TopCenter",BottomCenter:"BottomCenter",RightCenter:"RightCenter",LeftCenter:"LeftCenter"},function(t){t[t.Ascending=1]="Ascending",t[t.Descending=2]="Descending"}(e.SortDirection||(e.SortDirection={}));var g=function(){function t(t){this.$schema=t}return t.prototype.toJSON=function(){return{$schema:this.$schema}},t}();e.Selector=g;var b=function(t){function e(r){var a=t.call(this,e.schemaUrl)||this;return a.pageName=r,a}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.pageName=this.pageName,e},e.schemaUrl="http://powerbi.com/product/schema#pageSelector",e}(g);e.PageSelector=b;var w=function(t){function e(r){var a=t.call(this,e.schemaUrl)||this;return a.visualName=r,a}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.visualName=this.visualName,e},e.schemaUrl="http://powerbi.com/product/schema#visualSelector",e}(g);e.VisualSelector=w;var P=function(t){function e(e){var r=t.call(this,w.schemaUrl)||this;return r.visualType=e,r}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.visualType=this.visualType,e},e.schemaUrl="http://powerbi.com/product/schema#visualTypeSelector",e}(g);e.VisualTypeSelector=P;var _=function(t){function e(e){var r=t.call(this,w.schemaUrl)||this;return r.target=e,r}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.target=this.target,e},e.schemaUrl="http://powerbi.com/product/schema#slicerTargetSelector",e}(g);function S(t){return t&&!!t.groupName}function E(t){return Array.isArray(t)}function O(t){var e=t.message;return e||(e=t.path+" is invalid. Not meeting "+t.keyword+" constraint"),{message:e}}e.SlicerTargetSelector=_,function(t){t[t.Enabled=0]="Enabled",t[t.Disabled=1]="Disabled",t[t.Hidden=2]="Hidden"}(e.CommandDisplayOption||(e.CommandDisplayOption={})),function(t){t[t.Grouping=0]="Grouping",t[t.Measure=1]="Measure",t[t.GroupingOrMeasure=2]="GroupingOrMeasure"}(e.VisualDataRoleKind||(e.VisualDataRoleKind={})),function(t){t[t.Measure=0]="Measure",t[t.Grouping=1]="Grouping"}(e.VisualDataRoleKindPreference||(e.VisualDataRoleKindPreference={})),e.isFlatMenuExtension=function(t){return t&&!S(t)},e.isGroupedMenuExtension=S,e.isIExtensions=function(t){return t&&!E(t)},e.isIExtensionArray=E,e.validateVisualSelector=function(t){var e=n.Validators.visualSelectorValidator.validate(t);return e?e.map(O):void 0},e.validateSlicer=function(t){var e=n.Validators.slicerValidator.validate(t);return e?e.map(O):void 0},e.validateSlicerState=function(t){var e=n.Validators.slicerStateValidator.validate(t);return e?e.map(O):void 0},e.validatePlayBookmarkRequest=function(t){var e=n.Validators.playBookmarkRequestValidator.validate(t);return e?e.map(O):void 0},e.validateAddBookmarkRequest=function(t){var e=n.Validators.addBookmarkRequestValidator.validate(t);return e?e.map(O):void 0},e.validateApplyBookmarkByNameRequest=function(t){var e=n.Validators.applyBookmarkByNameRequestValidator.validate(t);return e?e.map(O):void 0},e.validateApplyBookmarkStateRequest=function(t){var e=n.Validators.applyBookmarkStateRequestValidator.validate(t);return e?e.map(O):void 0},e.validateCaptureBookmarkRequest=function(t){var e=n.Validators.captureBookmarkRequestValidator.validate(t);return e?e.map(O):void 0},e.validateSettings=function(t){var e=n.Validators.settingsValidator.validate(t);return e?e.map(O):void 0},e.validatePanes=function(t){var e=n.Validators.reportPanesValidator.validate(t);return e?e.map(O):void 0},e.validateBookmarksPane=function(t){var e=n.Validators.bookmarksPaneValidator.validate(t);return e?e.map(O):void 0},e.validateFiltersPane=function(t){var e=n.Validators.filtersPaneValidator.validate(t);return e?e.map(O):void 0},e.validateFieldsPane=function(t){var e=n.Validators.fieldsPaneValidator.validate(t);return e?e.map(O):void 0},e.validatePageNavigationPane=function(t){var e=n.Validators.pageNavigationPaneValidator.validate(t);return e?e.map(O):void 0},e.validateSelectionPane=function(t){var e=n.Validators.selectionPaneValidator.validate(t);return e?e.map(O):void 0},e.validateSyncSlicersPane=function(t){var e=n.Validators.syncSlicersPaneValidator.validate(t);return e?e.map(O):void 0},e.validateVisualizationsPane=function(t){var e=n.Validators.visualizationsPaneValidator.validate(t);return e?e.map(O):void 0},e.validateCustomPageSize=function(t){var e=n.Validators.customPageSizeValidator.validate(t);return e?e.map(O):void 0},e.validateExtension=function(t){var e=n.Validators.extensionValidator.validate(t);return e?e.map(O):void 0},e.validateMenuGroupExtension=function(t){var e=n.Validators.menuGroupExtensionValidator.validate(t);return e?e.map(O):void 0},e.validateReportLoad=function(t){var e=n.Validators.reportLoadValidator.validate(t);return e?e.map(O):void 0},e.validateCreateReport=function(t){var e=n.Validators.reportCreateValidator.validate(t);return e?e.map(O):void 0},e.validateDashboardLoad=function(t){var e=n.Validators.dashboardLoadValidator.validate(t);return e?e.map(O):void 0},e.validateTileLoad=function(t){var e=n.Validators.tileLoadValidator.validate(t);return e?e.map(O):void 0},e.validatePage=function(t){var e=n.Validators.pageValidator.validate(t);return e?e.map(O):void 0},e.validateFilter=function(t){var e=n.Validators.filtersValidator.validate(t);return e?e.map(O):void 0},e.validateSaveAsParameters=function(t){var e=n.Validators.saveAsParametersValidator.validate(t);return e?e.map(O):void 0},e.validateLoadQnaConfiguration=function(t){var e=n.Validators.loadQnaValidator.validate(t);return e?e.map(O):void 0},e.validateQnaInterpretInputData=function(t){var e=n.Validators.qnaInterpretInputDataValidator.validate(t);return e?e.map(O):void 0},e.validateExportDataRequest=function(t){var e=n.Validators.exportDataRequestValidator.validate(t);return e?e.map(O):void 0},e.validateVisualHeader=function(t){var e=n.Validators.visualHeaderValidator.validate(t);return e?e.map(O):void 0},e.validateVisualSettings=function(t){var e=n.Validators.visualSettingsValidator.validate(t);return e?e.map(O):void 0},e.validateCommandsSettings=function(t){var e=n.Validators.commandsSettingsValidator.validate(t);return e?e.map(O):void 0},e.validateCustomTheme=function(t){var e=n.Validators.customThemeValidator.validate(t);return e?e.map(O):void 0}},function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Validators=void 0;var a=r(2),i=r(5),o=r(6),n=r(7),l=r(8),s=r(9),d=r(10),u=r(11),c=r(12),p=r(13),f=r(14),h=r(15),v=r(16),y=r(17),m=r(18),V=r(19),g=r(20),b=r(21),w=r(22),P=r(23),_=r(24),S=r(25),E=r(26),O=r(27),T=r(28),k=r(4);e.Validators={addBookmarkRequestValidator:new i.AddBookmarkRequestValidator,advancedFilterTypeValidator:new k.EnumValidator([0]),advancedFilterValidator:new c.AdvancedFilterValidator,anyArrayValidator:new k.ArrayValidator([new S.AnyOfValidator([new k.StringValidator,new k.NumberValidator,new k.BooleanValidator])]),anyFilterValidator:new S.AnyOfValidator([new c.BasicFilterValidator,new c.AdvancedFilterValidator,new c.IncludeExcludeFilterValidator,new c.NotSupportedFilterValidator,new c.RelativeDateFilterValidator,new c.TopNFilterValidator,new c.RelativeTimeFilterValidator]),anyValueValidator:new S.AnyOfValidator([new k.StringValidator,new k.NumberValidator,new k.BooleanValidator]),actionBarValidator:new a.ActionBarValidator,applyBookmarkByNameRequestValidator:new i.ApplyBookmarkByNameRequestValidator,applyBookmarkStateRequestValidator:new i.ApplyBookmarkStateRequestValidator,applyBookmarkValidator:new S.AnyOfValidator([new i.ApplyBookmarkByNameRequestValidator,new i.ApplyBookmarkStateRequestValidator]),backgroundValidator:new k.EnumValidator([0,1]),basicFilterTypeValidator:new k.EnumValidator([1]),basicFilterValidator:new c.BasicFilterValidator,booleanArrayValidator:new k.BooleanArrayValidator,booleanValidator:new k.BooleanValidator,bookmarksPaneValidator:new h.BookmarksPaneValidator,captureBookmarkOptionsValidator:new i.CaptureBookmarkOptionsValidator,captureBookmarkRequestValidator:new i.CaptureBookmarkRequestValidator,commandDisplayOptionValidator:new k.EnumValidator([0,1,2]),commandExtensionSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.VisualTypeSelectorValidator]),commandExtensionArrayValidator:new k.ArrayValidator([new u.CommandExtensionValidator]),commandExtensionValidator:new u.CommandExtensionValidator,commandsSettingsArrayValidator:new k.ArrayValidator([new o.CommandsSettingsValidator]),commandsSettingsValidator:new o.CommandsSettingsValidator,conditionItemValidator:new c.ConditionItemValidator,contrastModeValidator:new k.EnumValidator([0,1,2,3,4]),customLayoutDisplayOptionValidator:new k.EnumValidator([0,1,2]),customLayoutValidator:new p.CustomLayoutValidator,customPageSizeValidator:new f.CustomPageSizeValidator,customThemeValidator:new n.CustomThemeValidator,dashboardLoadValidator:new l.DashboardLoadValidator,datasetBindingValidator:new s.DatasetBindingValidator,displayStateModeValidator:new k.EnumValidator([0,1]),displayStateValidator:new p.DisplayStateValidator,exportDataRequestValidator:new d.ExportDataRequestValidator,extensionArrayValidator:new k.ArrayValidator([new u.ExtensionValidator]),extensionsValidator:new S.AnyOfValidator([new k.ArrayValidator([new u.ExtensionValidator]),new u.ExtensionsValidator]),extensionPointsValidator:new u.ExtensionPointsValidator,extensionValidator:new u.ExtensionValidator,fieldForbiddenValidator:new E.FieldForbiddenValidator,fieldRequiredValidator:new O.FieldRequiredValidator,fieldsPaneValidator:new h.FieldsPaneValidator,filterColumnTargetValidator:new c.FilterColumnTargetValidator,filterConditionsValidator:new k.ArrayValidator([new c.ConditionItemValidator]),filterHierarchyTargetValidator:new c.FilterHierarchyTargetValidator,filterMeasureTargetValidator:new c.FilterMeasureTargetValidator,filterTargetValidator:new S.AnyOfValidator([new c.FilterColumnTargetValidator,new c.FilterHierarchyTargetValidator,new c.FilterMeasureTargetValidator]),filtersArrayValidator:new k.ArrayValidator([new S.AnyOfValidator([new c.BasicFilterValidator,new c.AdvancedFilterValidator,new c.RelativeDateFilterValidator,new c.RelativeTimeFilterValidator])]),filtersValidator:new c.FilterValidator,filtersPaneValidator:new h.FiltersPaneValidator,hyperlinkClickBehaviorValidator:new k.EnumValidator([0,1,2]),includeExcludeFilterValidator:new c.IncludeExcludeFilterValidator,includeExludeFilterTypeValidator:new k.EnumValidator([3]),layoutTypeValidator:new k.EnumValidator([0,1,2,3]),loadQnaValidator:new v.LoadQnaValidator,menuExtensionValidator:new S.AnyOfValidator([new u.FlatMenuExtensionValidator,new u.GroupedMenuExtensionValidator]),menuGroupExtensionArrayValidator:new k.ArrayValidator([new u.MenuGroupExtensionValidator]),menuGroupExtensionValidator:new u.MenuGroupExtensionValidator,menuLocationValidator:new k.EnumValidator([0,1]),notSupportedFilterTypeValidator:new k.EnumValidator([2]),notSupportedFilterValidator:new c.NotSupportedFilterValidator,numberArrayValidator:new k.NumberArrayValidator,numberValidator:new k.NumberValidator,pageLayoutValidator:new T.MapValidator([new k.StringValidator],[new p.VisualLayoutValidator]),pageNavigationPaneValidator:new h.PageNavigationPaneValidator,pageNavigationPositionValidator:new k.EnumValidator([0,1]),pageSizeTypeValidator:new k.EnumValidator([0,1,2,3,4,5]),pageSizeValidator:new f.PageSizeValidator,pageValidator:new f.PageValidator,pageViewFieldValidator:new f.PageViewFieldValidator,pagesLayoutValidator:new T.MapValidator([new k.StringValidator],[new p.PageLayoutValidator]),reportBarsValidator:new a.ReportBarsValidator,reportPanesValidator:new h.ReportPanesValidator,permissionsValidator:new k.EnumValidator([0,1,2,4,7]),playBookmarkRequestValidator:new i.PlayBookmarkRequestValidator,qnaInterpretInputDataValidator:new v.QnaInterpretInputDataValidator,qnaSettingValidator:new v.QnaSettingsValidator,relativeDateFilterOperatorValidator:new k.EnumValidator([0,1,2]),relativeDateFilterTimeUnitTypeValidator:new k.EnumValidator([0,1,2,3,4,5,6]),relativeDateFilterTypeValidator:new k.EnumValidator([4]),relativeDateFilterValidator:new c.RelativeDateFilterValidator,relativeTimeFilterTimeUnitTypeValidator:new k.EnumValidator([7,8]),relativeTimeFilterTypeValidator:new k.EnumValidator([7]),relativeTimeFilterValidator:new c.RelativeTimeFilterValidator,reportCreateValidator:new y.ReportCreateValidator,reportLoadValidator:new m.ReportLoadValidator,saveAsParametersValidator:new V.SaveAsParametersValidator,selectionPaneValidator:new h.SelectionPaneValidator,settingsValidator:new b.SettingsValidator,singleCommandSettingsValidator:new o.SingleCommandSettingsValidator,slicerSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.SlicerTargetSelectorValidator]),slicerStateValidator:new w.SlicerStateValidator,slicerTargetValidator:new S.AnyOfValidator([new c.FilterColumnTargetValidator,new c.FilterHierarchyTargetValidator,new c.FilterMeasureTargetValidator,new c.FilterKeyColumnsTargetValidator,new c.FilterKeyHierarchyTargetValidator]),slicerValidator:new w.SlicerValidator,stringArrayValidator:new k.StringArrayValidator,stringValidator:new k.StringValidator,syncSlicersPaneValidator:new h.SyncSlicersPaneValidator,tileLoadValidator:new P.TileLoadValidator,tokenTypeValidator:new k.EnumValidator([0,1]),topNFilterTypeValidator:new k.EnumValidator([5]),topNFilterValidator:new c.TopNFilterValidator,viewModeValidator:new k.EnumValidator([0,1]),visualCommandSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.VisualTypeSelectorValidator]),visualHeaderSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.VisualTypeSelectorValidator]),visualHeaderSettingsValidator:new _.VisualHeaderSettingsValidator,visualHeaderValidator:new _.VisualHeaderValidator,visualHeadersValidator:new k.ArrayValidator([new _.VisualHeaderValidator]),visualizationsPaneValidator:new h.VisualizationsPaneValidator,visualLayoutValidator:new p.VisualLayoutValidator,visualSelectorValidator:new g.VisualSelectorValidator,visualSettingsValidator:new _.VisualSettingsValidator,visualTypeSelectorValidator:new g.VisualTypeSelectorValidator}},function(t,e,r){var a,i=this&&this.__extends||(a=function(t,e){return(a=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])})(t,e)},function(t,e){function r(){this.constructor=t}a(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.ActionBarValidator=e.ReportBarsValidator=void 0;var o=r(3),n=r(4),l=r(1),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.validate=function(e,r,a){if(null==e)return null;var i=t.prototype.validate.call(this,e,r,a);if(i)return i;var n=[{field:"actionBar",validators:[l.Validators.actionBarValidator]}];return new o.MultipleFieldsValidator(n).validate(e,r,a)},e}(n.ObjectValidator);e.ReportBarsValidator=s;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.validate=function(e,r,a){if(null==e)return null;var i=t.prototype.validate.call(this,e,r,a);if(i)return i;var n=[{field:"visible",validators:[l.Validators.booleanValidator]}];return new o.MultipleFieldsValidator(n).validate(e,r,a)},e}(n.ObjectValidator);e.ActionBarValidator=d},function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MultipleFieldsValidator=void 0;var r=function(){function t(t){this.fieldValidatorsPairs=t}return t.prototype.validate=function(t,e,r){if(!this.fieldValidatorsPairs)return null;for(var a=e?e+"."+r:r,i=0,o=this.fieldValidatorsPairs;i0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?"&":"?";return t+=a+e+"="+r},e.isSavedInternal=function(t,e,i){return r(this,void 0,void 0,(function(){return a(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,t.get("/report/hasUnsavedChanges",{uid:e},i)];case 1:return[2,!r.sent().body];case 2:throw r.sent().body;case 3:return[2]}}))}))},e.isRDLEmbed=function(t){return t.toLowerCase().indexOf("/rdlembed?")>=0},e.autoAuthInEmbedUrl=function(t){return t&&decodeURIComponent(t).toLowerCase().indexOf("autoauth=true")>=0},e.getRandomValue=o,e.getTimeDiffInMilliseconds=function(t,e){return Math.abs(t.getTime()-e.getTime())}},function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.EmbedUrlNotSupported=e.APINotSupportedForRDLError=void 0,e.APINotSupportedForRDLError="This API is currently not supported for RDL reports",e.EmbedUrlNotSupported="Embed URL is invalid for this scenario. Please use Power BI REST APIs to get the valid URL"},function(t,e,r){var a,i=this&&this.__extends||(a=function(t,e){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])})(t,e)},function(t,e){function r(){this.constructor=t}a(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),o=this&&this.__awaiter||function(t,e,r,a){return new(r||(r=Promise))((function(i,o){function n(t){try{s(a.next(t))}catch(t){o(t)}}function l(t){try{s(a.throw(t))}catch(t){o(t)}}function s(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(n,l)}s((a=a.apply(t,e||[])).next())}))},n=this&&this.__generator||function(t,e){var r,a,i,o,n={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function l(o){return function(l){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,a&&(i=2&o[0]?a.return:o[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,o[1])).done)return i;switch(a=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return n.label++,{value:o[1],done:!1};case 5:n.label++,a=o[1],o=[0];continue;case 7:o=n.ops.pop(),n.trys.pop();continue;default:if(!(i=n.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&!i)throw new Error("You should 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,s=o.keyValues;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 s.conditions=l,s}return i(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);function m(t){if(t.filterType)return t.filterType;var e=t,r=t;return"string"==typeof e.operator&&Array.isArray(e.values)?o.Basic:"string"==typeof r.logicalOperator&&Array.isArray(r.conditions)?o.Advanced:o.Unknown}function V(t){return!(!t.table||!t.column||t.aggregationFunction)}e.AdvancedFilter=y,e.isFilterKeyColumnsTarget=function(t){return V(t)&&!!t.keys},e.isBasicFilterWithKeys=function(t){return m(t)===o.Basic&&!!t.keyValues},e.getFilterType=m,e.isMeasure=function(t){return void 0!==t.table&&void 0!==t.measure},e.isColumn=V,e.isHierarchyLevel=function(t){return!(!(t.table&&t.hierarchy&&t.hierarchyLevel)||t.aggregationFunction)},e.isHierarchyLevelAggr=function(t){return!!(t.table&&t.hierarchy&&t.hierarchyLevel&&t.aggregationFunction)},e.isColumnAggr=function(t){return!!(t.table&&t.column&&t.aggregationFunction)},function(t){t[t.Bottom=0]="Bottom",t[t.Left=1]="Left"}(e.PageNavigationPosition||(e.PageNavigationPosition={})),function(t){t[t.Interactive=0]="Interactive",t[t.ResultOnly=1]="ResultOnly"}(e.QnaMode||(e.QnaMode={})),function(t){t[t.Summarized=0]="Summarized",t[t.Underlying=1]="Underlying"}(e.ExportDataType||(e.ExportDataType={})),function(t){t[t.Off=0]="Off",t[t.Presentation=1]="Presentation"}(e.BookmarksPlayMode||(e.BookmarksPlayMode={})),e.CommonErrorCodes={TokenExpired:"TokenExpired",NotFound:"PowerBIEntityNotFound",InvalidParameters:"Invalid parameters",LoadReportFailed:"LoadReportFailed",NotAuthorized:"PowerBINotAuthorizedException",FailedToLoadModel:"ExplorationContainer_FailedToLoadModel_DefaultDetails"},e.TextAlignment={Left:"left",Center:"center",Right:"right"},e.LegendPosition={Top:"Top",Bottom:"Bottom",Right:"Right",Left:"Left",TopCenter:"TopCenter",BottomCenter:"BottomCenter",RightCenter:"RightCenter",LeftCenter:"LeftCenter"},function(t){t[t.Ascending=1]="Ascending",t[t.Descending=2]="Descending"}(e.SortDirection||(e.SortDirection={}));var g=function(){function t(t){this.$schema=t}return t.prototype.toJSON=function(){return{$schema:this.$schema}},t}();e.Selector=g;var b=function(t){function e(r){var a=t.call(this,e.schemaUrl)||this;return a.pageName=r,a}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.pageName=this.pageName,e},e.schemaUrl="http://powerbi.com/product/schema#pageSelector",e}(g);e.PageSelector=b;var w=function(t){function e(r){var a=t.call(this,e.schemaUrl)||this;return a.visualName=r,a}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.visualName=this.visualName,e},e.schemaUrl="http://powerbi.com/product/schema#visualSelector",e}(g);e.VisualSelector=w;var P=function(t){function e(e){var r=t.call(this,w.schemaUrl)||this;return r.visualType=e,r}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.visualType=this.visualType,e},e.schemaUrl="http://powerbi.com/product/schema#visualTypeSelector",e}(g);e.VisualTypeSelector=P;var _=function(t){function e(e){var r=t.call(this,w.schemaUrl)||this;return r.target=e,r}return i(e,t),e.prototype.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.target=this.target,e},e.schemaUrl="http://powerbi.com/product/schema#slicerTargetSelector",e}(g);function S(t){return t&&!!t.groupName}function E(t){return Array.isArray(t)}function O(t){var e=t.message;return e||(e=t.path+" is invalid. Not meeting "+t.keyword+" constraint"),{message:e}}e.SlicerTargetSelector=_,function(t){t[t.Enabled=0]="Enabled",t[t.Disabled=1]="Disabled",t[t.Hidden=2]="Hidden"}(e.CommandDisplayOption||(e.CommandDisplayOption={})),function(t){t[t.Grouping=0]="Grouping",t[t.Measure=1]="Measure",t[t.GroupingOrMeasure=2]="GroupingOrMeasure"}(e.VisualDataRoleKind||(e.VisualDataRoleKind={})),function(t){t[t.Measure=0]="Measure",t[t.Grouping=1]="Grouping"}(e.VisualDataRoleKindPreference||(e.VisualDataRoleKindPreference={})),e.isFlatMenuExtension=function(t){return t&&!S(t)},e.isGroupedMenuExtension=S,e.isIExtensions=function(t){return t&&!E(t)},e.isIExtensionArray=E,e.validateVisualSelector=function(t){var e=n.Validators.visualSelectorValidator.validate(t);return e?e.map(O):void 0},e.validateSlicer=function(t){var e=n.Validators.slicerValidator.validate(t);return e?e.map(O):void 0},e.validateSlicerState=function(t){var e=n.Validators.slicerStateValidator.validate(t);return e?e.map(O):void 0},e.validatePlayBookmarkRequest=function(t){var e=n.Validators.playBookmarkRequestValidator.validate(t);return e?e.map(O):void 0},e.validateAddBookmarkRequest=function(t){var e=n.Validators.addBookmarkRequestValidator.validate(t);return e?e.map(O):void 0},e.validateApplyBookmarkByNameRequest=function(t){var e=n.Validators.applyBookmarkByNameRequestValidator.validate(t);return e?e.map(O):void 0},e.validateApplyBookmarkStateRequest=function(t){var e=n.Validators.applyBookmarkStateRequestValidator.validate(t);return e?e.map(O):void 0},e.validateCaptureBookmarkRequest=function(t){var e=n.Validators.captureBookmarkRequestValidator.validate(t);return e?e.map(O):void 0},e.validateSettings=function(t){var e=n.Validators.settingsValidator.validate(t);return e?e.map(O):void 0},e.validatePanes=function(t){var e=n.Validators.reportPanesValidator.validate(t);return e?e.map(O):void 0},e.validateBookmarksPane=function(t){var e=n.Validators.bookmarksPaneValidator.validate(t);return e?e.map(O):void 0},e.validateFiltersPane=function(t){var e=n.Validators.filtersPaneValidator.validate(t);return e?e.map(O):void 0},e.validateFieldsPane=function(t){var e=n.Validators.fieldsPaneValidator.validate(t);return e?e.map(O):void 0},e.validatePageNavigationPane=function(t){var e=n.Validators.pageNavigationPaneValidator.validate(t);return e?e.map(O):void 0},e.validateSelectionPane=function(t){var e=n.Validators.selectionPaneValidator.validate(t);return e?e.map(O):void 0},e.validateSyncSlicersPane=function(t){var e=n.Validators.syncSlicersPaneValidator.validate(t);return e?e.map(O):void 0},e.validateVisualizationsPane=function(t){var e=n.Validators.visualizationsPaneValidator.validate(t);return e?e.map(O):void 0},e.validateCustomPageSize=function(t){var e=n.Validators.customPageSizeValidator.validate(t);return e?e.map(O):void 0},e.validateExtension=function(t){var e=n.Validators.extensionValidator.validate(t);return e?e.map(O):void 0},e.validateMenuGroupExtension=function(t){var e=n.Validators.menuGroupExtensionValidator.validate(t);return e?e.map(O):void 0},e.validateReportLoad=function(t){var e=n.Validators.reportLoadValidator.validate(t);return e?e.map(O):void 0},e.validateCreateReport=function(t){var e=n.Validators.reportCreateValidator.validate(t);return e?e.map(O):void 0},e.validateDashboardLoad=function(t){var e=n.Validators.dashboardLoadValidator.validate(t);return e?e.map(O):void 0},e.validateTileLoad=function(t){var e=n.Validators.tileLoadValidator.validate(t);return e?e.map(O):void 0},e.validatePage=function(t){var e=n.Validators.pageValidator.validate(t);return e?e.map(O):void 0},e.validateFilter=function(t){var e=n.Validators.filterValidator.validate(t);return e?e.map(O):void 0},e.validateUpdateFiltersRequest=function(t){var e=n.Validators.updateFiltersRequestValidator.validate(t);return e?e.map(O):void 0},e.validateSaveAsParameters=function(t){var e=n.Validators.saveAsParametersValidator.validate(t);return e?e.map(O):void 0},e.validateLoadQnaConfiguration=function(t){var e=n.Validators.loadQnaValidator.validate(t);return e?e.map(O):void 0},e.validateQnaInterpretInputData=function(t){var e=n.Validators.qnaInterpretInputDataValidator.validate(t);return e?e.map(O):void 0},e.validateExportDataRequest=function(t){var e=n.Validators.exportDataRequestValidator.validate(t);return e?e.map(O):void 0},e.validateVisualHeader=function(t){var e=n.Validators.visualHeaderValidator.validate(t);return e?e.map(O):void 0},e.validateVisualSettings=function(t){var e=n.Validators.visualSettingsValidator.validate(t);return e?e.map(O):void 0},e.validateCommandsSettings=function(t){var e=n.Validators.commandsSettingsValidator.validate(t);return e?e.map(O):void 0},e.validateCustomTheme=function(t){var e=n.Validators.customThemeValidator.validate(t);return e?e.map(O):void 0}},function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Validators=void 0;var a=r(2),i=r(5),o=r(6),n=r(7),l=r(8),s=r(9),d=r(10),u=r(11),c=r(12),p=r(13),f=r(14),h=r(15),v=r(16),y=r(17),m=r(18),V=r(19),g=r(20),b=r(21),w=r(22),P=r(23),_=r(24),S=r(25),E=r(26),O=r(27),T=r(28),F=r(4);e.Validators={addBookmarkRequestValidator:new i.AddBookmarkRequestValidator,advancedFilterTypeValidator:new F.EnumValidator([0]),advancedFilterValidator:new c.AdvancedFilterValidator,anyArrayValidator:new F.ArrayValidator([new S.AnyOfValidator([new F.StringValidator,new F.NumberValidator,new F.BooleanValidator])]),anyFilterValidator:new S.AnyOfValidator([new c.BasicFilterValidator,new c.AdvancedFilterValidator,new c.IncludeExcludeFilterValidator,new c.NotSupportedFilterValidator,new c.RelativeDateFilterValidator,new c.TopNFilterValidator,new c.RelativeTimeFilterValidator]),anyValueValidator:new S.AnyOfValidator([new F.StringValidator,new F.NumberValidator,new F.BooleanValidator]),actionBarValidator:new a.ActionBarValidator,applyBookmarkByNameRequestValidator:new i.ApplyBookmarkByNameRequestValidator,applyBookmarkStateRequestValidator:new i.ApplyBookmarkStateRequestValidator,applyBookmarkValidator:new S.AnyOfValidator([new i.ApplyBookmarkByNameRequestValidator,new i.ApplyBookmarkStateRequestValidator]),backgroundValidator:new F.EnumValidator([0,1]),basicFilterTypeValidator:new F.EnumValidator([1]),basicFilterValidator:new c.BasicFilterValidator,booleanArrayValidator:new F.BooleanArrayValidator,booleanValidator:new F.BooleanValidator,bookmarksPaneValidator:new h.BookmarksPaneValidator,captureBookmarkOptionsValidator:new i.CaptureBookmarkOptionsValidator,captureBookmarkRequestValidator:new i.CaptureBookmarkRequestValidator,commandDisplayOptionValidator:new F.EnumValidator([0,1,2]),commandExtensionSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.VisualTypeSelectorValidator]),commandExtensionArrayValidator:new F.ArrayValidator([new u.CommandExtensionValidator]),commandExtensionValidator:new u.CommandExtensionValidator,commandsSettingsArrayValidator:new F.ArrayValidator([new o.CommandsSettingsValidator]),commandsSettingsValidator:new o.CommandsSettingsValidator,conditionItemValidator:new c.ConditionItemValidator,contrastModeValidator:new F.EnumValidator([0,1,2,3,4]),customLayoutDisplayOptionValidator:new F.EnumValidator([0,1,2]),customLayoutValidator:new p.CustomLayoutValidator,customPageSizeValidator:new f.CustomPageSizeValidator,customThemeValidator:new n.CustomThemeValidator,dashboardLoadValidator:new l.DashboardLoadValidator,datasetBindingValidator:new s.DatasetBindingValidator,displayStateModeValidator:new F.EnumValidator([0,1]),displayStateValidator:new p.DisplayStateValidator,exportDataRequestValidator:new d.ExportDataRequestValidator,extensionArrayValidator:new F.ArrayValidator([new u.ExtensionValidator]),extensionsValidator:new S.AnyOfValidator([new F.ArrayValidator([new u.ExtensionValidator]),new u.ExtensionsValidator]),extensionPointsValidator:new u.ExtensionPointsValidator,extensionValidator:new u.ExtensionValidator,fieldForbiddenValidator:new E.FieldForbiddenValidator,fieldRequiredValidator:new O.FieldRequiredValidator,fieldsPaneValidator:new h.FieldsPaneValidator,filterColumnTargetValidator:new c.FilterColumnTargetValidator,filterDisplaySettingsValidator:new c.FilterDisplaySettingsValidator,filterConditionsValidator:new F.ArrayValidator([new c.ConditionItemValidator]),filterHierarchyTargetValidator:new c.FilterHierarchyTargetValidator,filterMeasureTargetValidator:new c.FilterMeasureTargetValidator,filterTargetValidator:new S.AnyOfValidator([new c.FilterColumnTargetValidator,new c.FilterHierarchyTargetValidator,new c.FilterMeasureTargetValidator]),filterValidator:new c.FilterValidator,filterTypeValidator:new F.EnumValidator([0,1,2,3,4,5,6,7]),filtersArrayValidator:new F.ArrayValidator([new c.FilterValidator]),filtersOperationsUpdateValidator:new F.EnumValidator([1,2,3]),filtersOperationsRemoveAllValidator:new F.EnumValidator([0]),filtersPaneValidator:new h.FiltersPaneValidator,hyperlinkClickBehaviorValidator:new F.EnumValidator([0,1,2]),includeExcludeFilterValidator:new c.IncludeExcludeFilterValidator,includeExludeFilterTypeValidator:new F.EnumValidator([3]),layoutTypeValidator:new F.EnumValidator([0,1,2,3]),loadQnaValidator:new v.LoadQnaValidator,menuExtensionValidator:new S.AnyOfValidator([new u.FlatMenuExtensionValidator,new u.GroupedMenuExtensionValidator]),menuGroupExtensionArrayValidator:new F.ArrayValidator([new u.MenuGroupExtensionValidator]),menuGroupExtensionValidator:new u.MenuGroupExtensionValidator,menuLocationValidator:new F.EnumValidator([0,1]),notSupportedFilterTypeValidator:new F.EnumValidator([2]),notSupportedFilterValidator:new c.NotSupportedFilterValidator,numberArrayValidator:new F.NumberArrayValidator,numberValidator:new F.NumberValidator,pageLayoutValidator:new T.MapValidator([new F.StringValidator],[new p.VisualLayoutValidator]),pageNavigationPaneValidator:new h.PageNavigationPaneValidator,pageNavigationPositionValidator:new F.EnumValidator([0,1]),pageSizeTypeValidator:new F.EnumValidator([0,1,2,3,4,5]),pageSizeValidator:new f.PageSizeValidator,pageValidator:new f.PageValidator,pageViewFieldValidator:new f.PageViewFieldValidator,pagesLayoutValidator:new T.MapValidator([new F.StringValidator],[new p.PageLayoutValidator]),reportBarsValidator:new a.ReportBarsValidator,reportPanesValidator:new h.ReportPanesValidator,permissionsValidator:new F.EnumValidator([0,1,2,4,7]),playBookmarkRequestValidator:new i.PlayBookmarkRequestValidator,qnaInterpretInputDataValidator:new v.QnaInterpretInputDataValidator,qnaSettingValidator:new v.QnaSettingsValidator,relativeDateFilterOperatorValidator:new F.EnumValidator([0,1,2]),relativeDateFilterTimeUnitTypeValidator:new F.EnumValidator([0,1,2,3,4,5,6]),relativeDateFilterTypeValidator:new F.EnumValidator([4]),relativeDateFilterValidator:new c.RelativeDateFilterValidator,relativeTimeFilterTimeUnitTypeValidator:new F.EnumValidator([7,8]),relativeTimeFilterTypeValidator:new F.EnumValidator([7]),relativeTimeFilterValidator:new c.RelativeTimeFilterValidator,reportCreateValidator:new y.ReportCreateValidator,reportLoadValidator:new m.ReportLoadValidator,saveAsParametersValidator:new V.SaveAsParametersValidator,selectionPaneValidator:new h.SelectionPaneValidator,settingsValidator:new b.SettingsValidator,singleCommandSettingsValidator:new o.SingleCommandSettingsValidator,slicerSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.SlicerTargetSelectorValidator]),slicerStateValidator:new w.SlicerStateValidator,slicerTargetValidator:new S.AnyOfValidator([new c.FilterColumnTargetValidator,new c.FilterHierarchyTargetValidator,new c.FilterMeasureTargetValidator,new c.FilterKeyColumnsTargetValidator,new c.FilterKeyHierarchyTargetValidator]),slicerValidator:new w.SlicerValidator,stringArrayValidator:new F.StringArrayValidator,stringValidator:new F.StringValidator,syncSlicersPaneValidator:new h.SyncSlicersPaneValidator,tileLoadValidator:new P.TileLoadValidator,tokenTypeValidator:new F.EnumValidator([0,1]),topNFilterTypeValidator:new F.EnumValidator([5]),topNFilterValidator:new c.TopNFilterValidator,updateFiltersRequestValidator:new S.AnyOfValidator([new c.UpdateFiltersRequestValidator,new c.RemoveFiltersRequestValidator]),viewModeValidator:new F.EnumValidator([0,1]),visualCommandSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.VisualTypeSelectorValidator]),visualHeaderSelectorValidator:new S.AnyOfValidator([new g.VisualSelectorValidator,new g.VisualTypeSelectorValidator]),visualHeaderSettingsValidator:new _.VisualHeaderSettingsValidator,visualHeaderValidator:new _.VisualHeaderValidator,visualHeadersValidator:new F.ArrayValidator([new _.VisualHeaderValidator]),visualizationsPaneValidator:new h.VisualizationsPaneValidator,visualLayoutValidator:new p.VisualLayoutValidator,visualSelectorValidator:new g.VisualSelectorValidator,visualSettingsValidator:new _.VisualSettingsValidator,visualTypeSelectorValidator:new g.VisualTypeSelectorValidator}},function(t,e,r){var a,i=this&&this.__extends||(a=function(t,e){return(a=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])})(t,e)},function(t,e){function r(){this.constructor=t}a(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.ActionBarValidator=e.ReportBarsValidator=void 0;var o=r(3),n=r(4),l=r(1),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.validate=function(e,r,a){if(null==e)return null;var i=t.prototype.validate.call(this,e,r,a);if(i)return i;var n=[{field:"actionBar",validators:[l.Validators.actionBarValidator]}];return new o.MultipleFieldsValidator(n).validate(e,r,a)},e}(n.ObjectValidator);e.ReportBarsValidator=s;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e.prototype.validate=function(e,r,a){if(null==e)return null;var i=t.prototype.validate.call(this,e,r,a);if(i)return i;var n=[{field:"visible",validators:[l.Validators.booleanValidator]}];return new o.MultipleFieldsValidator(n).validate(e,r,a)},e}(n.ObjectValidator);e.ActionBarValidator=d},function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.MultipleFieldsValidator=void 0;var r=function(){function t(t){this.fieldValidatorsPairs=t}return t.prototype.validate=function(t,e,r){if(!this.fieldValidatorsPairs)return null;for(var a=e?e+"."+r:r,i=0,o=this.fieldValidatorsPairs;i0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?"&":"?";return t+=a+e+"="+r},e.isSavedInternal=function(t,e,i){return r(this,void 0,void 0,(function(){return a(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,t.get("/report/hasUnsavedChanges",{uid:e},i)];case 1:return[2,!r.sent().body];case 2:throw r.sent().body;case 3:return[2]}}))}))},e.isRDLEmbed=function(t){return t.toLowerCase().indexOf("/rdlembed?")>=0},e.autoAuthInEmbedUrl=function(t){return t&&decodeURIComponent(t).toLowerCase().indexOf("autoauth=true")>=0},e.getRandomValue=o,e.getTimeDiffInMilliseconds=function(t,e){return Math.abs(t.getTime()-e.getTime())}},function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.EmbedUrlNotSupported=e.APINotSupportedForRDLError=void 0,e.APINotSupportedForRDLError="This API is currently not supported for RDL reports",e.EmbedUrlNotSupported="Embed URL is invalid for this scenario. Please use Power BI REST APIs to get the valid URL"},function(t,e,r){var a,i=this&&this.__extends||(a=function(t,e){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])})(t,e)},function(t,e){function r(){this.constructor=t}a(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),o=this&&this.__awaiter||function(t,e,r,a){return new(r||(r=Promise))((function(i,o){function n(t){try{s(a.next(t))}catch(t){o(t)}}function l(t){try{s(a.throw(t))}catch(t){o(t)}}function s(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(n,l)}s((a=a.apply(t,e||[])).next())}))},n=this&&this.__generator||function(t,e){var r,a,i,o,n={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function l(o){return function(l){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,a&&(i=2&o[0]?a.return:o[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,o[1])).done)return i;switch(a=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return n.label++,{value:o[1],done:!1};case 5:n.label++,a=o[1],o=[0];continue;case 7:o=n.ops.pop(),n.trys.pop();continue;default:if(!(i=n.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){n=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1])} + * + * @returns {(Promise)} */ - getFilters(): Promise; + getFilters(): Promise; /** - * Replaces all filters on the current object with the specified filter values. - * - * @param {(models.IFilter[])} filters + * Update the filters for the current instance according to the operation: Add, replace all, replace by target or remove. + * + * @param {(FiltersOperations)} operation + * @param {(IFilter[])} filters * @returns {Promise>} */ - setFilters(filters: models.IFilter[]): Promise>; + updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise>; /** * Removes all filters from the current object. - * + * * @returns {Promise>} */ removeFilters(): Promise>; -} \ No newline at end of file + /** + * Replaces all filters on the current object with the specified filter values. + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + setFilters(filters: IFilter[]): Promise>; +} diff --git a/src/page.ts b/src/page.ts index 89e3cc64..00240aad 100644 --- a/src/page.ts +++ b/src/page.ts @@ -1,10 +1,21 @@ import { IHttpPostMessageResponse } from 'http-post-message'; +import { + DisplayOption, + FiltersOperations, + ICustomPageSize, + IFilter, + IPage, + IUpdateFiltersRequest, + IVisual, + LayoutType, + PageLevelFilters, + SectionVisibility +} from 'powerbi-models'; import { IFilterable } from './ifilterable'; import { IReportNode } from './report'; import { VisualDescriptor } from './visualDescriptor'; -import * as models from 'powerbi-models'; -import * as utils from './util'; -import * as errors from './errors'; +import { isRDLEmbed } from './util'; +import { APINotSupportedForRDLError } from './errors'; /** * A Page node within a report hierarchy @@ -58,21 +69,23 @@ export class Page implements IPageNode, IFilterable { * 0 - Always Visible * 1 - Hidden in View Mode * - * @type {models.SectionVisibility} + * @type {SectionVisibility} */ - visibility: models.SectionVisibility; + visibility: SectionVisibility; /** * Page size as saved in the report. - * @type {models.ICustomPageSize} + * + * @type {ICustomPageSize} */ - defaultSize: models.ICustomPageSize; + defaultSize: ICustomPageSize; /** * Page display options as saved in the report. - * @type {models.ICustomPageSize} + * + * @type {ICustomPageSize} */ - defaultDisplayOption: models.DisplayOption; + defaultDisplayOption: DisplayOption; /** * Creates an instance of a Power BI report page. @@ -81,10 +94,10 @@ export class Page implements IPageNode, IFilterable { * @param {string} name * @param {string} [displayName] * @param {boolean} [isActivePage] - * @param {models.SectionVisibility} [visibility] + * @param {SectionVisibility} [visibility] * @hidden */ - constructor(report: IReportNode, name: string, displayName?: string, isActivePage?: boolean, visibility?: models.SectionVisibility, defaultSize?: models.ICustomPageSize, defaultDisplayOption?: models.DisplayOption) { + constructor(report: IReportNode, name: string, displayName?: string, isActivePage?: boolean, visibility?: SectionVisibility, defaultSize?: ICustomPageSize, defaultDisplayOption?: DisplayOption) { this.report = report; this.name = name; this.displayName = displayName; @@ -102,11 +115,11 @@ export class Page implements IPageNode, IFilterable { * .then(filters => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - async getFilters(): Promise { + async getFilters(): Promise { try { - const response = await this.report.service.hpm.get(`/report/pages/${this.name}/filters`, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); + const response = await this.report.service.hpm.get(`/report/pages/${this.name}/filters`, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); return response.body; } catch (response) { throw response.body; @@ -114,19 +127,24 @@ export class Page implements IPageNode, IFilterable { } /** - * Delete the page from the report + * Update the filters for the current page according to the operation: Add, replace all, replace by target or remove. * * ```javascript - * // Delete the page from the report - * page.delete(); + * page.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); * ``` * - * @returns {Promise} + * @param {(IFilter[])} filters + * @returns {Promise>} */ - async delete(): Promise { + async updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise> { + const updateFiltersRequest: IUpdateFiltersRequest = { + filtersOperation: operation, + filters: filters as PageLevelFilters[] + }; + try { - const response = await this.report.service.hpm.delete(`/report/pages/${this.name}`, { }, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); - return response.body; + return await this.report.service.hpm.post(`/report/pages/${this.name}/filters`, updateFiltersRequest, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); } catch (response) { throw response.body; } @@ -142,46 +160,65 @@ export class Page implements IPageNode, IFilterable { * @returns {Promise>} */ async removeFilters(): Promise> { - return await this.setFilters([]); + return await this.updateFilters(FiltersOperations.RemoveAll); } /** - * Makes the current page the active page of the report. + * Sets all filters on the current page. * * ```javascript - * page.setActive(); + * page.setFilters(filters) + * .catch(errors => { ... }); * ``` * + * @param {(IFilter[])} filters * @returns {Promise>} */ - async setActive(): Promise> { - const page: models.IPage = { - name: this.name, - displayName: null, - isActive: true - }; + async setFilters(filters: IFilter[]): Promise> { + try { + return await this.report.service.hpm.put(`/report/pages/${this.name}/filters`, filters, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); + } catch (response) { + throw response.body; + } + } + /** + * Delete the page from the report + * + * ```javascript + * // Delete the page from the report + * page.delete(); + * ``` + * + * @returns {Promise} + */ + async delete(): Promise { try { - return await this.report.service.hpm.put('/report/pages/active', page, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); + const response = await this.report.service.hpm.delete(`/report/pages/${this.name}`, {}, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); + return response.body; } catch (response) { throw response.body; } } /** - * Sets all filters on the current page. + * Makes the current page the active page of the report. * * ```javascript - * page.setFilters(filters); - * .catch(errors => { ... }); + * page.setActive(); * ``` * - * @param {(models.IFilter[])} filters * @returns {Promise>} */ - async setFilters(filters: models.IFilter[]): Promise> { + async setActive(): Promise> { + const page: IPage = { + name: this.name, + displayName: null, + isActive: true + }; + try { - return await this.report.service.hpm.put(`/report/pages/${this.name}/filters`, filters, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); + return await this.report.service.hpm.put('/report/pages/active', page, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); } catch (response) { throw response.body; } @@ -197,9 +234,9 @@ export class Page implements IPageNode, IFilterable { * @returns {Promise>} */ async setDisplayName(displayName: string): Promise> { - const page: models.IPage = { + const page: IPage = { name: this.name, - displayName, + displayName: displayName, }; try { @@ -220,19 +257,17 @@ export class Page implements IPageNode, IFilterable { * @returns {Promise} */ async getVisuals(): Promise { - if (utils.isRDLEmbed(this.report.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + if (isRDLEmbed(this.report.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } try { - const response = await this.report.service.hpm.get(`/report/pages/${this.name}/visuals`, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); + const response = await this.report.service.hpm.get(`/report/pages/${this.name}/visuals`, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); return response.body - .map(visual => { - return new VisualDescriptor(this, visual.name, visual.title, visual.type, visual.layout); - }); - } catch (response) { - throw response.body; - } + .map(visual => new VisualDescriptor(this, visual.name, visual.title, visual.type, visual.layout)); + } catch (response) { + throw response.body; + } } /** @@ -246,11 +281,11 @@ export class Page implements IPageNode, IFilterable { * @returns {(Promise)} */ async hasLayout(layoutType): Promise { - if (utils.isRDLEmbed(this.report.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + if (isRDLEmbed(this.report.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } - let layoutTypeEnum = models.LayoutType[layoutType]; + const layoutTypeEnum = LayoutType[layoutType]; try { const response = await this.report.service.hpm.get(`/report/pages/${this.name}/layoutTypes/${layoutTypeEnum}`, { uid: this.report.config.uniqueId }, this.report.iframe.contentWindow); return response.body; @@ -258,4 +293,4 @@ export class Page implements IPageNode, IFilterable { throw response.body; } } -} \ No newline at end of file +} diff --git a/src/report.ts b/src/report.ts index 1a3c1a03..63d1dc79 100644 --- a/src/report.ts +++ b/src/report.ts @@ -1,13 +1,29 @@ -import * as service from './service'; -import * as embed from './embed'; -import * as models from 'powerbi-models'; -import * as utils from './util'; -import * as errors from './errors'; +import { + IReportLoadConfiguration, + IReportEmbedConfiguration, + IPage, + FiltersOperations, + IError, + IFilter, + IReportTheme, + ISettings, + IUpdateFiltersRequest, + LayoutType, + SectionVisibility, + validateReportLoad, + ViewMode, + IEmbedConfiguration, + IEmbedConfigurationBase, + ReportLevelFilters +} from 'powerbi-models'; +import { IHttpPostMessageResponse } from 'http-post-message'; +import { IService, Service } from './service'; +import { Embed, IEmbedSettings } from './embed'; +import { addParamToUrl, assign, isRDLEmbed, isSavedInternal } from './util'; +import { APINotSupportedForRDLError } from './errors'; import { IFilterable } from './ifilterable'; import { Page } from './page'; -import { IReportLoadConfiguration, IReportEmbedConfiguration } from 'powerbi-models'; import { BookmarksManager } from './bookmarksManager'; -import { IHttpPostMessageResponse } from 'http-post-message'; /** * A Report node within a report hierarchy @@ -17,8 +33,8 @@ import { IHttpPostMessageResponse } from 'http-post-message'; */ export interface IReportNode { iframe: HTMLIFrameElement; - service: service.IService; - config: embed.IEmbedConfiguration | IReportEmbedConfiguration + service: IService; + config: IEmbedConfiguration | IReportEmbedConfiguration; } /** @@ -26,11 +42,11 @@ export interface IReportNode { * * @export * @class Report - * @extends {embed.Embed} + * @extends {Embed} * @implements {IReportNode} * @implements {IFilterable} */ -export class Report extends embed.Embed implements IReportNode, IFilterable { +export class Report extends Embed implements IReportNode, IFilterable { /** @hidden */ static allowedEvents = ["filtersApplied", "pageChanged", "commandTriggered", "swipeStart", "swipeEnd", "bookmarkApplied", "dataHyperlinkClicked", "visualRendered", "visualClicked", "selectionChanged"]; /** @hidden */ @@ -49,13 +65,13 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Creates an instance of a Power BI Report. * - * @param {service.Service} service + * @param {Service} service * @param {HTMLElement} element - * @param {embed.IEmbedConfiguration} config + * @param {IEmbedConfiguration} config * @hidden */ - constructor(service: service.Service, element: HTMLElement, baseConfig: embed.IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement) { - const config = baseConfig; + constructor(service: Service, element: HTMLElement, baseConfig: IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement) { + const config = baseConfig; super(service, element, config, iframe, phasedRender, isBootstrap); this.loadPath = "/report/load"; this.phasedLoadPath = "/report/prepare"; @@ -69,16 +85,17 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * (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. + * * @hidden * @static * @param {string} url * @returns {string} */ static findIdFromEmbedUrl(url: string): string { - const reportIdRegEx = /reportId="?([^&]+)"?/ + const reportIdRegEx = /reportId="?([^&]+)"?/; const reportIdMatch = url.match(reportIdRegEx); - let reportId; + let reportId: string; if (reportIdMatch) { reportId = reportIdMatch[1]; } @@ -102,7 +119,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * * @returns {Promise} */ - async render(config?: IReportLoadConfiguration | embed.IReportEmbedConfiguration): Promise { + async render(config?: IReportLoadConfiguration | IReportEmbedConfiguration): Promise { try { const response = await this.service.hpm.post(`/report/render`, config, { uid: this.config.uniqueId }, this.iframe.contentWindow); return response.body; @@ -122,13 +139,13 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * @returns {Promise} */ async addPage(displayName?: string): Promise { - var request = { + const request = { displayName: displayName }; try { - const response = await this.service.hpm.post(`/report/addPage`, request, { uid: this.config.uniqueId }, this.iframe.contentWindow); - var page = response.body; + const response = await this.service.hpm.post(`/report/addPage`, request, { uid: this.config.uniqueId }, this.iframe.contentWindow); + const page = response.body; return new Page(this, page.name, page.displayName, page.isActive, page.visibility, page.defaultSize, page.defaultDisplayOption); } catch (response) { throw response.body; @@ -165,9 +182,9 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * @returns {Promise} */ async renamePage(pageName: string, displayName: string): Promise { - const page: models.IPage = { + const page: IPage = { name: pageName, - displayName, + displayName: displayName, }; try { @@ -189,28 +206,98 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * }); * ``` * - * @returns {Promise} + * @returns {Promise} */ - async getFilters(): Promise { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + async getFilters(): Promise { + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } try { - const response = await this.service.hpm.get(`/report/filters`, { uid: this.config.uniqueId }, this.iframe.contentWindow); + const response = await this.service.hpm.get(`/report/filters`, { uid: this.config.uniqueId }, this.iframe.contentWindow); return response.body; } catch (response) { throw response.body; } } + /** + * Update the filters at the report level according to the operation: Add, replace all, replace by target or remove. + * + * ```javascript + * report.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + async updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise> { + const updateFiltersRequest: IUpdateFiltersRequest = { + filtersOperation: operation, + filters: filters as ReportLevelFilters[] + }; + + try { + return await this.service.hpm.post(`/report/filters`, updateFiltersRequest, { uid: this.config.uniqueId }, this.iframe.contentWindow); + } catch (response) { + throw response.body; + } + } + + /** + * Removes all filters at the report level. + * + * ```javascript + * report.removeFilters(); + * ``` + * + * @returns {Promise>} + */ + async removeFilters(): Promise> { + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); + } + + return this.updateFilters(FiltersOperations.RemoveAll); + } + + /** + * Sets filters at the report level. + * + * ```javascript + * const filters: [ + * ... + * ]; + * + * report.setFilters(filters) + * .catch(errors => { + * ... + * }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + async setFilters(filters: IFilter[]): Promise> { + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); + } + + try { + return await this.service.hpm.put(`/report/filters`, filters, { uid: this.config.uniqueId }, this.iframe.contentWindow); + } catch (response) { + throw response.body; + } + } + /** * Gets the report ID from the first available location: options, attribute, embed url. * * @returns {string} */ getId(): string { - let config = this.config; + const config = this.config; const reportId = config.id || this.element.getAttribute(Report.reportIdAttribute) || Report.findIdFromEmbedUrl(config.embedUrl); if (typeof reportId !== 'string' || reportId.length === 0) { @@ -233,16 +320,14 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * @returns {Promise} */ async getPages(): Promise { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } try { - const response = await this.service.hpm.get('/report/pages', { uid: this.config.uniqueId }, this.iframe.contentWindow); + const response = await this.service.hpm.get('/report/pages', { uid: this.config.uniqueId }, this.iframe.contentWindow); return response.body - .map(page => { - return new Page(this, page.name, page.displayName, page.isActive, page.visibility, page.defaultSize, page.defaultDisplayOption); - }); + .map(page => new Page(this, page.name, page.displayName, page.isActive, page.visibility, page.defaultSize, page.defaultDisplayOption)); } catch (response) { throw response.body; } @@ -263,7 +348,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * @returns {Page} * @hidden */ - page(name: string, displayName?: string, isActive?: boolean, visibility?: models.SectionVisibility): Page { + page(name: string, displayName?: string, isActive?: boolean, visibility?: SectionVisibility): Page { return new Page(this, name, displayName, isActive, visibility); } @@ -271,8 +356,8 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * Prints the active page of the report by invoking `window.print()` on the embed iframe component. */ async print(): Promise { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } try { @@ -283,23 +368,6 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { } } - /** - * Removes all filters at the report level. - * - * ```javascript - * report.removeFilters(); - * ``` - * - * @returns {Promise>} - */ - async removeFilters(): Promise> { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); - } - - return await this.setFilters([]); - } - /** * Sets the active page of the report. * @@ -312,11 +380,11 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * @returns {Promise>} */ async setPage(pageName: string): Promise> { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } - const page: models.IPage = { + const page: IPage = { name: pageName, displayName: null, isActive: true @@ -329,35 +397,6 @@ 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>} - */ - async setFilters(filters: models.IFilter[]): Promise> { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); - } - - try { - return await this.service.hpm.put(`/report/filters`, filters, { uid: this.config.uniqueId }, this.iframe.contentWindow); - } catch (response) { - throw response.body; - } - } - /** * Updates visibility settings for the filter pane and the page navigation pane. * @@ -371,12 +410,12 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * .catch(error => { ... }); * ``` * - * @param {models.ISettings} settings + * @param {ISettings} settings * @returns {Promise>} */ - async updateSettings(settings: models.ISettings): Promise> { - if (utils.isRDLEmbed(this.config.embedUrl) && settings.customLayout != null) { - return Promise.reject(errors.APINotSupportedForRDLError); + async updateSettings(settings: ISettings): Promise> { + if (isRDLEmbed(this.config.embedUrl) && settings.customLayout != null) { + return Promise.reject(APINotSupportedForRDLError); } try { @@ -388,11 +427,11 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * Validate load configuration. - * + * * @hidden */ - validate(config: embed.IEmbedConfigurationBase): models.IError[] { - return models.validateReportLoad(config); + validate(config: IEmbedConfigurationBase): IError[] { + return validateReportLoad(config); } /** @@ -401,22 +440,23 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * @returns {void} */ configChanged(isBootstrap: boolean): void { - let config = this.config; + const config = this.config; - if (this.isMobileSettings(config.settings)) - config.embedUrl = utils.addParamToUrl(config.embedUrl, "isMobile", "true"); + if (this.isMobileSettings(config.settings)) { + config.embedUrl = addParamToUrl(config.embedUrl, "isMobile", "true"); + } // Calculate settings from HTML element attributes if available. - let filterPaneEnabledAttribute = this.element.getAttribute(Report.filterPaneEnabledAttribute); - let navContentPaneEnabledAttribute = this.element.getAttribute(Report.navContentPaneEnabledAttribute); + const filterPaneEnabledAttribute = this.element.getAttribute(Report.filterPaneEnabledAttribute); + const navContentPaneEnabledAttribute = this.element.getAttribute(Report.navContentPaneEnabledAttribute); - let elementAttrSettings: embed.IEmbedSettings = { + const elementAttrSettings: IEmbedSettings = { filterPaneEnabled: (filterPaneEnabledAttribute == null) ? undefined : (filterPaneEnabledAttribute !== "false"), navContentPaneEnabled: (navContentPaneEnabledAttribute == null) ? undefined : (navContentPaneEnabledAttribute !== "false") }; // Set the settings back into the config. - this.config.settings = utils.assign({}, elementAttrSettings, config.settings); + this.config.settings = assign({}, elementAttrSettings, config.settings); if (isBootstrap) { return; @@ -438,7 +478,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * * @returns {Promise} */ - async switchMode(viewMode: models.ViewMode | string): Promise { + async switchMode(viewMode: ViewMode | string): Promise { let newMode: string; if (typeof viewMode === "string") { newMode = viewMode; @@ -447,7 +487,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { newMode = this.viewModeToString(viewMode); } - let url = '/report/switchMode/' + newMode; + const url = '/report/switchMode/' + newMode; try { const response = await this.service.hpm.post(url, null, { uid: this.config.uniqueId }, this.iframe.contentWindow); return response.body; @@ -457,12 +497,12 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { } /** - * Refreshes data sources for the report. - * - * ```javascript - * report.refresh(); - * ``` - */ + * Refreshes data sources for the report. + * + * ```javascript + * report.refresh(); + * ``` + */ async refresh(): Promise { try { const response = await this.service.hpm.post('/report/refresh', null, { uid: this.config.uniqueId }, this.iframe.contentWindow); @@ -482,11 +522,11 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * @returns {Promise} */ async isSaved(): Promise { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } - return await utils.isSavedInternal(this.service.hpm, this.config.uniqueId, this.iframe.contentWindow); + return await isSavedInternal(this.service.hpm, this.config.uniqueId, this.iframe.contentWindow); } /** @@ -496,36 +536,36 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { * report.applyTheme(theme); * ``` */ - async applyTheme(theme: models.IReportTheme): Promise { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + async applyTheme(theme: IReportTheme): Promise { + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } return await this.applyThemeInternal(theme); } /** - * Reset and apply the default theme of the report - * - * ```javascript - * report.resetTheme(); - * ``` - */ + * Reset and apply the default theme of the report + * + * ```javascript + * report.resetTheme(); + * ``` + */ async resetTheme(): Promise { - if (utils.isRDLEmbed(this.config.embedUrl)) { - return Promise.reject(errors.APINotSupportedForRDLError); + if (isRDLEmbed(this.config.embedUrl)) { + return Promise.reject(APINotSupportedForRDLError); } - return await this.applyThemeInternal({}); + return await this.applyThemeInternal({}); } /** - * Reset user's filters, slicers, and other data view changes to the default state of the report - * - * ```javascript - * report.resetPersistentFilters(); - * ``` - */ + * Reset user's filters, slicers, and other data view changes to the default state of the report + * + * ```javascript + * report.resetPersistentFilters(); + * ``` + */ async resetPersistentFilters(): Promise> { try { return await this.service.hpm.delete(`/report/userState`, null, { uid: this.config.uniqueId }, this.iframe.contentWindow); @@ -535,12 +575,12 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { } /** - * Save user's filters, slicers, and other data view changes of the report - * - * ```javascript - * report.savePersistentFilters(); - * ``` - */ + * Save user's filters, slicers, and other data view changes of the report + * + * ```javascript + * report.savePersistentFilters(); + * ``` + */ async savePersistentFilters(): Promise> { try { return await this.service.hpm.post(`/report/userState`, null, { uid: this.config.uniqueId }, this.iframe.contentWindow); @@ -550,15 +590,15 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { } /** - * Returns if there are user's filters, slicers, or other data view changes applied on the report. - * If persistent filters is disable, returns false. - * - * ```javascript - * report.arePersistentFiltersApplied(); - * ``` - * - * @returns {Promise} - */ + * Returns if there are user's filters, slicers, or other data view changes applied on the report. + * If persistent filters is disable, returns false. + * + * ```javascript + * report.arePersistentFiltersApplied(); + * ``` + * + * @returns {Promise} + */ async arePersistentFiltersApplied(): Promise { try { const response = await this.service.hpm.get(`/report/isUserStateApplied`, { uid: this.config.uniqueId }, this.iframe.contentWindow); @@ -571,7 +611,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * @hidden */ - private async applyThemeInternal(theme: models.IReportTheme): Promise { + private async applyThemeInternal(theme: IReportTheme): Promise { try { const response = await this.service.hpm.put('/report/theme', theme, { uid: this.config.uniqueId }, this.iframe.contentWindow); return response.body; @@ -583,13 +623,13 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * @hidden */ - private viewModeToString(viewMode: models.ViewMode): string { + private viewModeToString(viewMode: ViewMode): string { let mode: string; switch (viewMode) { - case models.ViewMode.Edit: + case ViewMode.Edit: mode = "edit"; break; - case models.ViewMode.View: + case ViewMode.View: mode = "view"; break; } @@ -600,7 +640,7 @@ export class Report extends embed.Embed implements IReportNode, IFilterable { /** * @hidden */ - private isMobileSettings(settings: embed.IEmbedSettings): boolean { - return settings && (settings.layoutType === models.LayoutType.MobileLandscape || settings.layoutType === models.LayoutType.MobilePortrait); + private isMobileSettings(settings: IEmbedSettings): boolean { + return settings && (settings.layoutType === LayoutType.MobileLandscape || settings.layoutType === LayoutType.MobilePortrait); } } diff --git a/src/service.ts b/src/service.ts index 188f2bc6..f89ca504 100644 --- a/src/service.ts +++ b/src/service.ts @@ -497,6 +497,11 @@ export class Service implements IService { embedElement.element.removeEventListener('ready', embedElement.frontLoadHandler, false); } + /** Removes all event handlers. */ + embedElement.allowedEvents.forEach(eventName => { + embedElement.off(eventName); + }); + /** Removes the component from an internal list of components. */ utils.remove(x => x === powerBiElement.powerBiEmbed, this.embeds); /** Deletes a property from the HTML element. */ diff --git a/src/visual.ts b/src/visual.ts index 13e183fd..3a2e7b73 100644 --- a/src/visual.ts +++ b/src/visual.ts @@ -1,11 +1,29 @@ -import * as service from './service'; -import * as embed from './embed'; -import * as models from 'powerbi-models'; -import { Report } from './report' +import { + DisplayOption, + FiltersLevel, + FiltersOperations, + ICustomPageSize, + IEmbedConfigurationBase, + IError, + IFilter, + IReportEmbedConfiguration, + IReportLoadConfiguration, + IUpdateFiltersRequest, + IVisual, + IVisualEmbedConfiguration, + LayoutType, + PageLevelFilters, + PageSizeType, + PagesLayout, + ReportLevelFilters, + VisualContainerDisplayMode, + VisualLevelFilters +} from 'powerbi-models'; +import { IHttpPostMessageResponse } from 'http-post-message'; +import { Service } from './service'; +import { Report } from './report'; import { Page } from './page'; import { VisualDescriptor } from './visualDescriptor'; -import { IHttpPostMessageResponse } from 'http-post-message'; -import { IReportLoadConfiguration } from 'powerbi-models'; /** * The Power BI Visual embed component @@ -27,12 +45,12 @@ export class Visual extends Report { /** * Creates an instance of a Power BI Single Visual. * - * @param {service.Service} service + * @param {Service} service * @param {HTMLElement} element - * @param {embed.IEmbedConfiguration} config + * @param {IEmbedConfiguration} config * @hidden */ - constructor(service: service.Service, element: HTMLElement, baseConfig: embed.IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement) { + constructor(service: Service, element: HTMLElement, baseConfig: IEmbedConfigurationBase, phasedRender?: boolean, isBootstrap?: boolean, iframe?: HTMLIFrameElement) { super(service, element, baseConfig, phasedRender, isBootstrap, iframe); } @@ -40,7 +58,7 @@ export class Visual extends Report { * @hidden */ load(phasedRender?: boolean): Promise { - var config = this.config; + const config = this.config as IVisualEmbedConfiguration; if (!config.accessToken) { // bootstrap flow. @@ -56,20 +74,20 @@ export class Visual extends Report { } // calculate custom layout settings and override config. - let width = config.width ? config.width : this.iframe.offsetWidth; - let height = config.height ? config.height : this.iframe.offsetHeight; + const width = config.width ? config.width : this.iframe.offsetWidth; + const height = config.height ? config.height : this.iframe.offsetHeight; - const pageSize: models.ICustomPageSize = { - type: models.PageSizeType.Custom, + const pageSize: ICustomPageSize = { + type: PageSizeType.Custom, width: width, height: height, }; - let pagesLayout: models.PagesLayout = {}; + const pagesLayout: PagesLayout = {}; pagesLayout[config.pageName] = { defaultLayout: { displayState: { - mode: models.VisualContainerDisplayMode.Hidden + mode: VisualContainerDisplayMode.Hidden } }, visualsLayout: {} @@ -77,21 +95,21 @@ export class Visual extends Report { pagesLayout[config.pageName].visualsLayout[config.visualName] = { displayState: { - mode: models.VisualContainerDisplayMode.Visible + mode: VisualContainerDisplayMode.Visible }, x: 1, y: 1, z: 1, width: pageSize.width, height: pageSize.height - } + }; config.settings = config.settings || {}; config.settings.filterPaneEnabled = false; config.settings.navContentPaneEnabled = false; - config.settings.layoutType = models.LayoutType.Custom; + config.settings.layoutType = LayoutType.Custom; config.settings.customLayout = { - displayOption: models.DisplayOption.FitToPage, + displayOption: DisplayOption.FitToPage, pageSize: pageSize, pagesLayout: pagesLayout }; @@ -101,7 +119,7 @@ export class Visual extends Report { } /** - * Gets the list of pages within the report - not supported in visual embed. + * Gets the list of pages within the report - not supported in visual * * @returns {Promise} */ @@ -110,7 +128,7 @@ export class Visual extends Report { } /** - * Sets the active page of the report - not supported in visual embed. + * Sets the active page of the report - not supported in visual * * @param {string} pageName * @returns {Promise>} @@ -125,8 +143,8 @@ export class Visual extends Report { * @hidden * @returns {Promise} */ - async render(config?: IReportLoadConfiguration | embed.IReportEmbedConfiguration): Promise { - throw Visual.RenderNotSupportedError + async render(config?: IReportLoadConfiguration | IReportEmbedConfiguration): Promise { + throw Visual.RenderNotSupportedError; } /** @@ -140,16 +158,16 @@ export class Visual extends Report { * @returns {Promise} */ async getVisualDescriptor(): Promise { - const config = this.config; + const config = this.config as IVisualEmbedConfiguration; try { - const response = await this.service.hpm.get(`/report/pages/${config.pageName}/visuals`, { uid: this.config.uniqueId }, this.iframe.contentWindow); + const response = await this.service.hpm.get(`/report/pages/${config.pageName}/visuals`, { uid: this.config.uniqueId }, this.iframe.contentWindow); // Find the embedded visual from visuals of this page // TODO: Use the Array.find method when ES6 is available - const embeddedVisuals = response.body.filter(pageVisual => pageVisual.name === config.visualName); + const embeddedVisuals = response.body.filter((pageVisual) => pageVisual.name === config.visualName); if (embeddedVisuals.length === 0) { - const visualNotFoundError: models.IError = { + const visualNotFoundError: IError = { message: "visualNotFound", detailedMessage: "Visual not found" }; @@ -176,18 +194,50 @@ export class Visual extends Report { * }); * ``` * - * @returns {Promise} + * @returns {Promise} */ - async getFilters(filtersLevel?: models.FiltersLevel): Promise { + async getFilters(filtersLevel?: FiltersLevel): Promise { const url: string = this.getFiltersLevelUrl(filtersLevel); try { - const response = await this.service.hpm.get(url, { uid: this.config.uniqueId }, this.iframe.contentWindow); + const response = await this.service.hpm.get(url, { uid: this.config.uniqueId }, this.iframe.contentWindow); return response.body; } catch (response) { throw response.body; } } + /** + * Updates filters at the filter level. + * Default filter level is visual level. + * + * ```javascript + * const filters: [ + * ... + * ]; + * + * visual.updateFilters(FiltersOperations.Add, filters, filtersLevel) + * .catch(errors => { + * ... + * }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + async updateFilters(operation: FiltersOperations, filters: IFilter[], filtersLevel?: FiltersLevel): Promise> { + const updateFiltersRequest: IUpdateFiltersRequest = { + filtersOperation: operation, + filters: filters as VisualLevelFilters[] | PageLevelFilters[] | ReportLevelFilters[] + }; + + const url: string = this.getFiltersLevelUrl(filtersLevel); + try { + return await this.service.hpm.put(url, updateFiltersRequest, { uid: this.config.uniqueId }, this.iframe.contentWindow); + } catch (response) { + throw response.body; + } + } + /** * Sets filters at the filter level. * Default filter level is visual level. @@ -203,10 +253,10 @@ export class Visual extends Report { * }); * ``` * - * @param {(models.IFilter[])} filters + * @param {(IFilter[])} filters * @returns {Promise>} */ - async setFilters(filters: models.IFilter[], filtersLevel?: models.FiltersLevel): Promise> { + async setFilters(filters: IFilter[], filtersLevel?: FiltersLevel): Promise> { const url: string = this.getFiltersLevelUrl(filtersLevel); try { return await this.service.hpm.put(url, filters, { uid: this.config.uniqueId }, this.iframe.contentWindow); @@ -225,19 +275,19 @@ export class Visual extends Report { * * @returns {Promise>} */ - async removeFilters(filtersLevel?: models.FiltersLevel): Promise> { - return await this.setFilters([], filtersLevel); + async removeFilters(filtersLevel?: FiltersLevel): Promise> { + return await this.updateFilters(FiltersOperations.RemoveAll, undefined, filtersLevel); } /** * @hidden */ - private getFiltersLevelUrl(filtersLevel: models.FiltersLevel): string { - const config = this.config; + private getFiltersLevelUrl(filtersLevel: FiltersLevel): string { + const config = this.config as IVisualEmbedConfiguration; switch (filtersLevel) { - case models.FiltersLevel.Report: + case FiltersLevel.Report: return `/report/filters`; - case models.FiltersLevel.Page: + case FiltersLevel.Page: return `/report/pages/${config.pageName}/filters`; default: return `/report/pages/${config.pageName}/visuals/${config.visualName}/filters`; diff --git a/src/visualDescriptor.ts b/src/visualDescriptor.ts index 29a7be1c..cd401cc3 100644 --- a/src/visualDescriptor.ts +++ b/src/visualDescriptor.ts @@ -1,7 +1,20 @@ -import * as models from 'powerbi-models'; +import { + ExportDataType, + FiltersOperations, + ICloneVisualRequest, + ICloneVisualResponse, + IExportDataRequest, + IExportDataResult, + IFilter, + ISlicerState, + ISortByVisualRequest, + IUpdateFiltersRequest, + IVisualLayout, + VisualLevelFilters +} from 'powerbi-models'; +import { IHttpPostMessageResponse } from 'http-post-message'; import { IFilterable } from './ifilterable'; import { IPageNode } from './page'; -import { IHttpPostMessageResponse } from 'http-post-message'; /** * A Visual node within a report hierarchy @@ -13,7 +26,7 @@ export interface IVisualNode { name: string; title: string; type: string; - layout: models.IVisualLayout; + layout: IVisualLayout; page: IPageNode; } @@ -51,7 +64,7 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * * @type {string} */ - layout: models.IVisualLayout; + layout: IVisualLayout; /** * The parent Power BI page that contains this visual @@ -63,7 +76,7 @@ export class VisualDescriptor implements IVisualNode, IFilterable { /** * @hidden */ - constructor(page: IPageNode, name: string, title: string, type: string, layout: models.IVisualLayout) { + constructor(page: IPageNode, name: string, title: string, type: string, layout: IVisualLayout) { this.name = name; this.title = title; this.type = type; @@ -79,17 +92,41 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * .then(filters => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - async getFilters(): Promise { + async getFilters(): Promise { try { - const response = await this.page.report.service.hpm.get(`/report/pages/${this.page.name}/visuals/${this.name}/filters`, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); + const response = await this.page.report.service.hpm.get(`/report/pages/${this.page.name}/visuals/${this.name}/filters`, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); return response.body; } catch (response) { throw response.body; } } + /** + * Update the filters for the current visual according to the operation: Add, replace all, replace by target or remove. + * + * ```javascript + * visual.updateFilters(FiltersOperations.Add, filters) + * .catch(errors => { ... }); + * ``` + * + * @param {(IFilter[])} filters + * @returns {Promise>} + */ + async updateFilters(operation: FiltersOperations, filters?: IFilter[]): Promise> { + const updateFiltersRequest: IUpdateFiltersRequest = { + filtersOperation: operation, + filters: filters as VisualLevelFilters[] + }; + + try { + return await this.page.report.service.hpm.post(`/report/pages/${this.page.name}/visuals/${this.name}/filters`, updateFiltersRequest, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); + } catch (response) { + throw response.body; + } + } + /** * Removes all filters from the current visual. * @@ -100,7 +137,7 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * @returns {Promise>} */ async removeFilters(): Promise> { - return await this.setFilters([]); + return await this.updateFilters(FiltersOperations.RemoveAll); } /** @@ -111,10 +148,10 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * .catch(errors => { ... }); * ``` * - * @param {(models.IFilter[])} filters + * @param {(IFilter[])} filters * @returns {Promise>} */ - async setFilters(filters: models.IFilter[]): Promise> { + async setFilters(filters: IFilter[]): Promise> { try { return await this.page.report.service.hpm.put(`/report/pages/${this.page.name}/visuals/${this.name}/filters`, filters, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); } catch (response) { @@ -126,22 +163,22 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * Exports Visual data. * Can export up to 30K rows. * @param rows: Optional. Default value is 30K, maximum value is 30K as well. - * @param exportDataType: Optional. Default is models.ExportDataType.Summarized. + * @param exportDataType: Optional. Default is ExportDataType.Summarized. * ```javascript * visual.exportData() * .then(data => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - async exportData(exportDataType?: models.ExportDataType, rows?: number): Promise { - const exportDataRequestBody: models.IExportDataRequest = { + async exportData(exportDataType?: ExportDataType, rows?: number): Promise { + const exportDataRequestBody: IExportDataRequest = { rows: rows, exportDataType: exportDataType }; try { - const response = await this.page.report.service.hpm.post(`/report/pages/${this.page.name}/visuals/${this.name}/exportData`, exportDataRequestBody, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); + const response = await this.page.report.service.hpm.post(`/report/pages/${this.page.name}/visuals/${this.name}/exportData`, exportDataRequestBody, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); return response.body; } catch (response) { throw response.body; @@ -157,7 +194,7 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * .then(() => { ... }); * ``` */ - async setSlicerState(state: models.ISlicerState): Promise> { + async setSlicerState(state: ISlicerState): Promise> { try { return await this.page.report.service.hpm.put(`/report/pages/${this.page.name}/visuals/${this.name}/slicer`, state, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); } catch (response) { @@ -174,11 +211,11 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * .then(state => { ... }); * ``` * - * @returns {(Promise)} + * @returns {(Promise)} */ - async getSlicerState(): Promise { + async getSlicerState(): Promise { try { - const response = await this.page.report.service.hpm.get(`/report/pages/${this.page.name}/visuals/${this.name}/slicer`, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); + const response = await this.page.report.service.hpm.get(`/report/pages/${this.page.name}/visuals/${this.name}/slicer`, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); return response.body; } catch (response) { throw response.body; @@ -188,11 +225,11 @@ export class VisualDescriptor implements IVisualNode, IFilterable { /** * Clone existing visual to a new instance. * - * @returns {(Promise)} + * @returns {(Promise)} */ - async clone(request: models.ICloneVisualRequest = {}): Promise { + async clone(request: ICloneVisualRequest = {}): Promise { try { - const response = await this.page.report.service.hpm.post(`/report/pages/${this.page.name}/visuals/${this.name}/clone`, request, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); + const response = await this.page.report.service.hpm.post(`/report/pages/${this.page.name}/visuals/${this.name}/clone`, request, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); return response.body; } catch (response) { throw response.body; @@ -209,7 +246,7 @@ export class VisualDescriptor implements IVisualNode, IFilterable { * .then(() => { ... }); * ``` */ - async sortBy(request: models.ISortByVisualRequest): Promise> { + async sortBy(request: ISortByVisualRequest): Promise> { try { return await this.page.report.service.hpm.put(`/report/pages/${this.page.name}/visuals/${this.name}/sortBy`, request, { uid: this.page.report.config.uniqueId }, this.page.report.iframe.contentWindow); } catch (response) { diff --git a/test/test.spec.ts b/test/test.spec.ts index c1a14dd3..1c7cfdcb 100644 --- a/test/test.spec.ts +++ b/test/test.spec.ts @@ -3140,14 +3140,14 @@ describe('SDK-to-HPM', function () { describe('getVisualDescriptor', function () { it('embeddedVisual.getVisualDescriptor() sends GET /report/pages/xyz/visuals', function () { // Arrange - + // Act embeddedVisual.getVisualDescriptor(); - + // Assert expect(spyHpm.get).toHaveBeenCalledWith(`/report/pages/ReportSection1/visuals`, { uid: visualUniqueId }, visualFrame.contentWindow); }); - + it('embeddedVisual.getVisualDescriptor() returns promise that rejects with server error if there was error getting visual details', function (done) { // Arrange const testData = { @@ -3157,9 +3157,9 @@ describe('SDK-to-HPM', function () { } } }; - + spyHpm.get.and.returnValue(Promise.reject(testData.expectedError)); - + // Act embeddedVisual.getVisualDescriptor() .catch(error => { @@ -3169,7 +3169,7 @@ describe('SDK-to-HPM', function () { done(); }); }); - + it('embeddedVisual.getVisualDescriptor() returns promise that resolves with visual details', function (done) { // Arrange const fakeVisualDescriptor = new visualDescriptor.VisualDescriptor(page1, visualEmbedConfiguration.visualName, 'title', 'type', {}); @@ -3454,18 +3454,18 @@ describe('SDK-to-HPM', function () { report.removeFilters(); // Assert - expect(spyHpm.put).toHaveBeenCalledWith('/report/filters', [], { uid: uniqueId }, iframe.contentWindow); + expect(spyHpm.post).toHaveBeenCalledWith('/report/filters', { filtersOperation: models.FiltersOperations.RemoveAll, filters: undefined }, { uid: uniqueId }, iframe.contentWindow); }); it('report.removeFilters() returns promise that resolves with null if request is accepted', function (done) { // Arrange - spyHpm.put.and.returnValue(Promise.resolve(null)); + spyHpm.post.and.returnValue(Promise.resolve(null)); // Act report.removeFilters() .then(response => { // Assert - expect(spyHpm.put).toHaveBeenCalledWith('/report/filters', [], { uid: uniqueId }, iframe.contentWindow); + expect(spyHpm.post).toHaveBeenCalledWith('/report/filters', { filtersOperation: models.FiltersOperations.RemoveAll, filters: undefined }, { uid: uniqueId }, iframe.contentWindow); expect(response).toEqual(null); done(); }); @@ -3996,18 +3996,18 @@ describe('SDK-to-HPM', function () { page1.removeFilters(); // Assert - expect(spyHpm.put).toHaveBeenCalledWith(`/report/pages/${page1.name}/filters`, [], { uid: uniqueId }, iframe.contentWindow); + expect(spyHpm.post).toHaveBeenCalledWith(`/report/pages/${page1.name}/filters`, { filtersOperation: models.FiltersOperations.RemoveAll, filters: undefined }, { uid: uniqueId }, iframe.contentWindow); }); it('page.removeFilters() returns promise that resolves with null if request is accepted', function (done) { // Arrange - spyHpm.put.and.returnValue(Promise.resolve(null)); + spyHpm.post.and.returnValue(Promise.resolve(null)); // Act page1.removeFilters() .then(response => { // Assert - expect(spyHpm.put).toHaveBeenCalledWith(`/report/pages/${page1.name}/filters`, [], { uid: uniqueId }, iframe.contentWindow); + expect(spyHpm.post).toHaveBeenCalledWith(`/report/pages/${page1.name}/filters`, { filtersOperation: models.FiltersOperations.RemoveAll, filters: undefined }, { uid: uniqueId }, iframe.contentWindow); expect(response).toEqual(null); done(); }); @@ -4243,7 +4243,7 @@ describe('SDK-to-HPM', function () { visual1.removeFilters(); // Assert - expect(spyHpm.put).toHaveBeenCalledWith(`/report/pages/${page1.name}/visuals/${visual1.name}/filters`, [], { uid: uniqueId }, iframe.contentWindow); + expect(spyHpm.post).toHaveBeenCalledWith(`/report/pages/${page1.name}/visuals/${visual1.name}/filters`, { filtersOperation: models.FiltersOperations.RemoveAll, filters: undefined }, { uid: uniqueId }, iframe.contentWindow); }); it('visual.removeFilters() returns promise that resolves with null if request is accepted', function (done) { @@ -4254,7 +4254,7 @@ describe('SDK-to-HPM', function () { visual1.removeFilters() .then(response => { // Assert - expect(spyHpm.put).toHaveBeenCalledWith(`/report/pages/${page1.name}/visuals/${visual1.name}/filters`, [], { uid: uniqueId }, iframe.contentWindow); + expect(spyHpm.post).toHaveBeenCalledWith(`/report/pages/${page1.name}/visuals/${visual1.name}/filters`, { filtersOperation: models.FiltersOperations.RemoveAll, filters: undefined }, { uid: uniqueId }, iframe.contentWindow); expect(response).toEqual(null); done(); }); @@ -4843,12 +4843,12 @@ describe('SDK-to-MockApp', function () { // Arrange iframeLoaded .then(() => { - spyApp.setFilters.and.returnValue(Promise.resolve(null)); + spyApp.updateFilters.and.returnValue(Promise.resolve(null)); // Act report.removeFilters() .then(response => { // Assert - expect(spyApp.setFilters).toHaveBeenCalled(); + expect(spyApp.updateFilters).toHaveBeenCalledWith(models.FiltersOperations.RemoveAll, undefined); done(); }); }); @@ -5050,12 +5050,12 @@ describe('SDK-to-MockApp', function () { // Arrange iframeLoaded .then(() => { - spyApp.setFilters.and.returnValue(Promise.resolve(null)); + spyApp.updateFilters.and.returnValue(Promise.resolve(null)); // Act page1.removeFilters() .then(response => { // Assert - expect(spyApp.setFilters).toHaveBeenCalled(); + expect(spyApp.updateFilters).toHaveBeenCalledWith(models.FiltersOperations.RemoveAll, undefined); done(); }); }); diff --git a/test/utility/mockApp.ts b/test/utility/mockApp.ts index 0574ce01..0c97e836 100644 --- a/test/utility/mockApp.ts +++ b/test/utility/mockApp.ts @@ -18,6 +18,7 @@ export interface IApp { validateVisual(page: models.IPage, visual: models.IVisual): Promise; // Filters getFilters(): Promise; + updateFilters(operation: models.FiltersOperations, filters: models.IFilter[]): Promise; setFilters(filters: models.IFilter[]): Promise; validateFilter(filter: models.IFilter): Promise; // Other @@ -49,6 +50,7 @@ export const mockAppSpyObj = { validateVisual: jasmine.createSpy("validateVisual").and.returnValue(Promise.resolve(null)), // Filters getFilters: jasmine.createSpy("getFilters").and.returnValue(Promise.resolve(null)), + updateFilters: jasmine.createSpy("updateFilters").and.returnValue(Promise.resolve(null)), setFilters: jasmine.createSpy("setFilters").and.returnValue(Promise.resolve(null)), validateFilter: jasmine.createSpy("validateFilter").and.callFake(models.validateFilter), // Other @@ -65,6 +67,7 @@ export const mockAppSpyObj = { mockAppSpyObj.dashboardLoad.calls.reset(); mockAppSpyObj.validateDashboardLoad.calls.reset(); mockAppSpyObj.reportLoad.calls.reset(); + mockAppSpyObj.render.calls.reset(); mockAppSpyObj.validateReportLoad.calls.reset(); mockAppSpyObj.updateSettings.calls.reset(); mockAppSpyObj.validateSettings.calls.reset(); @@ -73,6 +76,7 @@ export const mockAppSpyObj = { mockAppSpyObj.validatePage.calls.reset(); mockAppSpyObj.validateVisual.calls.reset(); mockAppSpyObj.getFilters.calls.reset(); + mockAppSpyObj.updateFilters.calls.reset(); mockAppSpyObj.setFilters.calls.reset(); mockAppSpyObj.validateFilter.calls.reset(); mockAppSpyObj.print.calls.reset(); diff --git a/test/utility/mockEmbed.ts b/test/utility/mockEmbed.ts index 7c2dadf5..3a5d7c7c 100644 --- a/test/utility/mockEmbed.ts +++ b/test/utility/mockEmbed.ts @@ -40,7 +40,7 @@ export function setupEmbedMockApp(iframeContentWindow: Window, parentWindow: Win /** * Phase 1 */ - + /** * Dashboard Embed */ @@ -58,13 +58,13 @@ export function setupEmbedMockApp(iframeContentWindow: Window, parentWindow: Win }, error => { hpm.post(`/dashboards/${uniqueId}/events/error`, error); }); - + res.send(202); }, error => { res.send(400, error); }); }); - + /** * Create Report */ @@ -208,6 +208,30 @@ export function setupEmbedMockApp(iframeContentWindow: Window, parentWindow: Win }); }); + router.post('/report/filters', (req, res) => { + const uniqueId = req.headers['uid']; + const operation = req.body.filtersOperation + const filters = req.body.filters; + + return Promise.all(filters ? filters.map(filter => app.validateFilter(filter)) : [Promise.resolve(null)]) + .then(() => { + app.updateFilters(operation, filters) + .then(filter => { + const initiator = "sdk"; + hpm.post(`/reports/${uniqueId}/events/filtersApplied`, { + initiator, + filter + }); + }, error => { + hpm.post(`/reports/${uniqueId}/events/error`, error); + }); + + res.send(202); + }, error => { + res.send(400, error); + }); + }); + /** * Phase 3 */ @@ -230,6 +254,36 @@ export function setupEmbedMockApp(iframeContentWindow: Window, parentWindow: Win }); }); + router.post('/report/pages/:pageName/filters', (req, res) => { + const pageName = req.params.pageName; + const uniqueId = req.headers['uid']; + const operation = req.body.filtersOperation + const filters = req.body.filters; + const page: models.IPage = { + name: pageName, + displayName: null + }; + + return app.validatePage(page) + .then(() => Promise.all(filters ? filters.map(filter => app.validateFilter(filter)) : [Promise.resolve(null)])) + .then(() => { + app.updateFilters(operation, filters) + .then(filter => { + const initiator = "sdk"; + hpm.post(`/reports/${uniqueId}/pages/${pageName}/events/filtersApplied`, { + initiator, + filter + }); + }, error => { + hpm.post(`/reports/${uniqueId}/events/error`, error); + }); + + res.send(202); + }, errors => { + res.send(400, errors); + }); + }); + router.put('/report/pages/:pageName/filters', (req, res) => { const pageName = req.params.pageName; const uniqueId = req.headers['uid']; @@ -284,6 +338,42 @@ export function setupEmbedMockApp(iframeContentWindow: Window, parentWindow: Win }); }); + router.post('/report/pages/:pageName/visuals/:visualName/filters', (req, res) => { + const pageName = req.params.pageName; + const visualName = req.params.visualName; + const uniqueId = req.headers['uid']; + const operation = req.body.filtersOperation + const filters = req.body.filters; const page: models.IPage = { + name: pageName, + displayName: null + }; + const visual: models.IVisual = { + name: visualName, + title: 'title', + type: 'type', + layout: {}, + }; + + return app.validateVisual(page, visual) + .then(() => Promise.all(filters ? filters.map(filter => app.validateFilter(filter)) : [Promise.resolve(null)])) + .then(() => { + app.updateFilters(operation, filters) + .then(filter => { + const initiator = "sdk"; + hpm.post(`/reports/${uniqueId}/pages/${pageName}/visuals/${visualName}/events/filtersApplied`, { + initiator, + filter + }); + }, error => { + hpm.post(`/reports/${uniqueId}/events/error`, error); + }); + + res.send(202); + }, errors => { + res.send(400, errors); + }); + }); + router.put('/report/pages/:pageName/visuals/:visualName/filters', (req, res) => { const pageName = req.params.pageName; const visualName = req.params.visualName; @@ -363,7 +453,7 @@ export function setupEmbedMockApp(iframeContentWindow: Window, parentWindow: Win res.send(202); }); - router.post('report/switchMode/Edit', (req, res) => { + router.post('report/switchMode/Edit', (req, res) => { app.switchMode(); res.send(202); });