@thoughtspot/visual-embed-sdk 1.41.0 → 1.41.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +2 -4
  2. package/cjs/package.json +1 -1
  3. package/cjs/src/authToken.d.ts +1 -0
  4. package/cjs/src/authToken.d.ts.map +1 -1
  5. package/cjs/src/authToken.js +13 -3
  6. package/cjs/src/authToken.js.map +1 -1
  7. package/cjs/src/authToken.spec.js +29 -0
  8. package/cjs/src/authToken.spec.js.map +1 -1
  9. package/cjs/src/css-variables.d.ts +2 -1
  10. package/cjs/src/css-variables.d.ts.map +1 -1
  11. package/cjs/src/embed/app.d.ts +16 -0
  12. package/cjs/src/embed/app.d.ts.map +1 -1
  13. package/cjs/src/embed/app.js +4 -1
  14. package/cjs/src/embed/app.js.map +1 -1
  15. package/cjs/src/embed/app.spec.js +10 -0
  16. package/cjs/src/embed/app.spec.js.map +1 -1
  17. package/cjs/src/embed/conversation.d.ts +2 -2
  18. package/cjs/src/embed/liveboard.d.ts +32 -0
  19. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  20. package/cjs/src/embed/liveboard.js +7 -1
  21. package/cjs/src/embed/liveboard.js.map +1 -1
  22. package/cjs/src/embed/liveboard.spec.js +85 -11
  23. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  24. package/cjs/src/embed/sage.spec.js +20 -10
  25. package/cjs/src/embed/sage.spec.js.map +1 -1
  26. package/cjs/src/embed/search.js +1 -1
  27. package/cjs/src/embed/search.js.map +1 -1
  28. package/cjs/src/embed/search.spec.js +10 -10
  29. package/cjs/src/embed/search.spec.js.map +1 -1
  30. package/cjs/src/embed/ts-embed.d.ts +1 -1
  31. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  32. package/cjs/src/embed/ts-embed.js +5 -1
  33. package/cjs/src/embed/ts-embed.js.map +1 -1
  34. package/cjs/src/errors.d.ts +1 -0
  35. package/cjs/src/errors.d.ts.map +1 -1
  36. package/cjs/src/errors.js +1 -0
  37. package/cjs/src/errors.js.map +1 -1
  38. package/cjs/src/react/index.d.ts.map +1 -1
  39. package/cjs/src/react/index.js +2 -1
  40. package/cjs/src/react/index.js.map +1 -1
  41. package/cjs/src/react/index.spec.js +1 -1
  42. package/cjs/src/react/index.spec.js.map +1 -1
  43. package/cjs/src/types.d.ts +29 -5
  44. package/cjs/src/types.d.ts.map +1 -1
  45. package/cjs/src/types.js +25 -1
  46. package/cjs/src/types.js.map +1 -1
  47. package/cjs/src/utils.d.ts +14 -0
  48. package/cjs/src/utils.d.ts.map +1 -1
  49. package/cjs/src/utils.js +22 -1
  50. package/cjs/src/utils.js.map +1 -1
  51. package/cjs/src/utils.spec.js +10 -0
  52. package/cjs/src/utils.spec.js.map +1 -1
  53. package/dist/{index-B_mxAan8.js → index-DQueHwfQ.js} +1 -1
  54. package/dist/src/authToken.d.ts +1 -0
  55. package/dist/src/authToken.d.ts.map +1 -1
  56. package/dist/src/css-variables.d.ts +2 -1
  57. package/dist/src/css-variables.d.ts.map +1 -1
  58. package/dist/src/embed/app.d.ts +16 -0
  59. package/dist/src/embed/app.d.ts.map +1 -1
  60. package/dist/src/embed/conversation.d.ts +2 -2
  61. package/dist/src/embed/liveboard.d.ts +32 -0
  62. package/dist/src/embed/liveboard.d.ts.map +1 -1
  63. package/dist/src/embed/ts-embed.d.ts +1 -1
  64. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  65. package/dist/src/errors.d.ts +1 -0
  66. package/dist/src/errors.d.ts.map +1 -1
  67. package/dist/src/react/index.d.ts.map +1 -1
  68. package/dist/src/types.d.ts +29 -5
  69. package/dist/src/types.d.ts.map +1 -1
  70. package/dist/src/utils.d.ts +14 -0
  71. package/dist/src/utils.d.ts.map +1 -1
  72. package/dist/tsembed-react.es.js +77 -9
  73. package/dist/tsembed-react.js +76 -8
  74. package/dist/tsembed.es.js +75 -8
  75. package/dist/tsembed.js +74 -7
  76. package/dist/visual-embed-sdk-react-full.d.ts +83 -9
  77. package/dist/visual-embed-sdk-react.d.ts +83 -9
  78. package/dist/visual-embed-sdk.d.ts +83 -9
  79. package/lib/package.json +1 -1
  80. package/lib/src/authToken.d.ts +1 -0
  81. package/lib/src/authToken.d.ts.map +1 -1
  82. package/lib/src/authToken.js +11 -2
  83. package/lib/src/authToken.js.map +1 -1
  84. package/lib/src/authToken.spec.js +30 -1
  85. package/lib/src/authToken.spec.js.map +1 -1
  86. package/lib/src/css-variables.d.ts +2 -1
  87. package/lib/src/css-variables.d.ts.map +1 -1
  88. package/lib/src/embed/app.d.ts +16 -0
  89. package/lib/src/embed/app.d.ts.map +1 -1
  90. package/lib/src/embed/app.js +4 -1
  91. package/lib/src/embed/app.js.map +1 -1
  92. package/lib/src/embed/app.spec.js +10 -0
  93. package/lib/src/embed/app.spec.js.map +1 -1
  94. package/lib/src/embed/conversation.d.ts +2 -2
  95. package/lib/src/embed/liveboard.d.ts +32 -0
  96. package/lib/src/embed/liveboard.d.ts.map +1 -1
  97. package/lib/src/embed/liveboard.js +7 -1
  98. package/lib/src/embed/liveboard.js.map +1 -1
  99. package/lib/src/embed/liveboard.spec.js +85 -11
  100. package/lib/src/embed/liveboard.spec.js.map +1 -1
  101. package/lib/src/embed/sage.spec.js +20 -10
  102. package/lib/src/embed/sage.spec.js.map +1 -1
  103. package/lib/src/embed/search.js +1 -1
  104. package/lib/src/embed/search.js.map +1 -1
  105. package/lib/src/embed/search.spec.js +11 -11
  106. package/lib/src/embed/search.spec.js.map +1 -1
  107. package/lib/src/embed/ts-embed.d.ts +1 -1
  108. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  109. package/lib/src/embed/ts-embed.js +5 -1
  110. package/lib/src/embed/ts-embed.js.map +1 -1
  111. package/lib/src/errors.d.ts +1 -0
  112. package/lib/src/errors.d.ts.map +1 -1
  113. package/lib/src/errors.js +1 -0
  114. package/lib/src/errors.js.map +1 -1
  115. package/lib/src/react/index.d.ts.map +1 -1
  116. package/lib/src/react/index.js +2 -1
  117. package/lib/src/react/index.js.map +1 -1
  118. package/lib/src/react/index.spec.js +1 -1
  119. package/lib/src/react/index.spec.js.map +1 -1
  120. package/lib/src/types.d.ts +29 -5
  121. package/lib/src/types.d.ts.map +1 -1
  122. package/lib/src/types.js +25 -1
  123. package/lib/src/types.js.map +1 -1
  124. package/lib/src/utils.d.ts +14 -0
  125. package/lib/src/utils.d.ts.map +1 -1
  126. package/lib/src/utils.js +20 -0
  127. package/lib/src/utils.js.map +1 -1
  128. package/lib/src/utils.spec.js +11 -1
  129. package/lib/src/utils.spec.js.map +1 -1
  130. package/lib/src/visual-embed-sdk.d.ts +83 -9
  131. package/package.json +1 -1
  132. package/src/authToken.spec.ts +48 -1
  133. package/src/authToken.ts +13 -2
  134. package/src/css-variables.ts +2 -1
  135. package/src/embed/app.spec.ts +14 -0
  136. package/src/embed/app.ts +23 -1
  137. package/src/embed/conversation.ts +2 -2
  138. package/src/embed/liveboard.spec.ts +112 -14
  139. package/src/embed/liveboard.ts +65 -23
  140. package/src/embed/sage.spec.ts +24 -10
  141. package/src/embed/search.spec.ts +13 -14
  142. package/src/embed/search.ts +1 -1
  143. package/src/embed/ts-embed.ts +7 -1
  144. package/src/errors.ts +1 -0
  145. package/src/react/index.spec.tsx +1 -1
  146. package/src/react/index.tsx +4 -2
  147. package/src/types.ts +27 -3
  148. package/src/utils.spec.ts +18 -0
  149. package/src/utils.ts +21 -0
@@ -6,9 +6,7 @@ import {
6
6
  } from './search';
7
7
  import * as authInstance from '../auth';
8
8
  import { init } from '../index';
9
- import {
10
- Action, AuthType, EmbedEvent, RuntimeFilterOp,
11
- } from '../types';
9
+ import { Action, AuthType, EmbedEvent, RuntimeFilterOp } from '../types';
12
10
  import {
13
11
  executeAfterWait,
14
12
  getDocumentBody,
@@ -58,7 +56,7 @@ describe('Search embed tests', () => {
58
56
  await executeAfterWait(() => {
59
57
  expectUrlMatchesWithParams(
60
58
  getIFrameSrc(),
61
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&enableDataPanelV2=false&dataSourceMode=expand&useLastSelectedSources=false${prefixParams}#/embed/answer`,
59
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&enableDataPanelV2=true&dataSourceMode=expand&useLastSelectedSources=false${prefixParams}#/embed/answer`,
62
60
  );
63
61
  });
64
62
  });
@@ -444,7 +442,7 @@ describe('Search embed tests', () => {
444
442
  await executeAfterWait(() => {
445
443
  expectUrlMatchesWithParams(
446
444
  getIFrameSrc(),
447
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=true${prefixParams}#/embed/saved-answer/${answerId}`,
445
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=true${prefixParams}#/embed/saved-answer/${answerId}`,
448
446
  );
449
447
  });
450
448
  });
@@ -459,7 +457,7 @@ describe('Search embed tests', () => {
459
457
  await executeAfterWait(() => {
460
458
  expectUrlMatchesWithParams(
461
459
  getIFrameSrc(),
462
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSources=[%22data-source-1%22]&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
460
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSources=[%22data-source-1%22]&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
463
461
  );
464
462
  });
465
463
  });
@@ -474,7 +472,7 @@ describe('Search embed tests', () => {
474
472
  await executeAfterWait(() => {
475
473
  expectUrlMatchesWithParams(
476
474
  getIFrameSrc(),
477
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSources=[%22data-source-1%22]&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
475
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSources=[%22data-source-1%22]&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
478
476
  );
479
477
  });
480
478
  });
@@ -505,7 +503,7 @@ describe('Search embed tests', () => {
505
503
  await executeAfterWait(() => {
506
504
  expectUrlMatchesWithParams(
507
505
  getIFrameSrc(),
508
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false&hideSearchBar=true${prefixParams}#/embed/saved-answer/${answerId}`,
506
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false&hideSearchBar=true${prefixParams}#/embed/saved-answer/${answerId}`,
509
507
  );
510
508
  });
511
509
  });
@@ -528,13 +526,14 @@ describe('Search embed tests', () => {
528
526
  const searchEmbed = new SearchEmbed(getRootEl(), {
529
527
  ...defaultViewConfig,
530
528
  // eslint-disable-next-line max-len
531
- dataPanelCustomGroupsAccordionInitialState: DataPanelCustomColumnGroupsAccordionState.EXPAND_FIRST,
529
+ dataPanelCustomGroupsAccordionInitialState:
530
+ DataPanelCustomColumnGroupsAccordionState.EXPAND_FIRST,
532
531
  });
533
532
  searchEmbed.render();
534
533
  await executeAfterWait(() => {
535
534
  expectUrlMatchesWithParams(
536
535
  getIFrameSrc(),
537
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false&dataPanelCustomGroupsAccordionInitialState=EXPAND_FIRST${prefixParams}#/embed/saved-answer/${answerId}`,
536
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false&dataPanelCustomGroupsAccordionInitialState=EXPAND_FIRST${prefixParams}#/embed/saved-answer/${answerId}`,
538
537
  );
539
538
  });
540
539
  });
@@ -566,7 +565,7 @@ describe('Search embed tests', () => {
566
565
  await executeAfterWait(() => {
567
566
  expectUrlMatchesWithParams(
568
567
  getIFrameSrc(),
569
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
568
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
570
569
  );
571
570
  });
572
571
 
@@ -612,7 +611,7 @@ describe('Search embed tests', () => {
612
611
  await executeAfterWait(() => {
613
612
  expectUrlMatchesWithParams(
614
613
  getIFrameSrc(),
615
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&executeSearch=true&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
614
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&executeSearch=true&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false${prefixParams}#/embed/saved-answer/${answerId}`,
616
615
  );
617
616
  });
618
617
 
@@ -640,7 +639,7 @@ describe('Search embed tests', () => {
640
639
  await executeAfterWait(() => {
641
640
  expectUrlMatchesWithParams(
642
641
  getIFrameSrc(),
643
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false&searchTokenString=[commit date][revenue]${prefixParams}#/embed/saved-answer/${answerId}`,
642
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false&searchTokenString=[commit date][revenue]${prefixParams}#/embed/saved-answer/${answerId}`,
644
643
  );
645
644
  });
646
645
  });
@@ -660,7 +659,7 @@ describe('Search embed tests', () => {
660
659
  await executeAfterWait(() => {
661
660
  expectUrlMatchesWithParams(
662
661
  getIFrameSrc(),
663
- `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=false&useLastSelectedSources=false&searchTokenString=[commit date][revenue]${prefixParams}#/embed/saved-answer/${answerId}`,
662
+ `http://${thoughtSpotHost}/v2/?${defaultParamsWithHiddenActions}&dataSourceMode=expand&enableDataPanelV2=true&useLastSelectedSources=false&searchTokenString=[commit date][revenue]${prefixParams}#/embed/saved-answer/${answerId}`,
664
663
  );
665
664
  });
666
665
 
@@ -392,7 +392,7 @@ export class SearchEmbed extends TsEmbed {
392
392
  dataSources,
393
393
  excludeRuntimeFiltersfromURL,
394
394
  hideSearchBar,
395
- dataPanelV2 = false,
395
+ dataPanelV2 = true,
396
396
  useLastSelectedSources = false,
397
397
  runtimeParameters,
398
398
  collapseSearchBarInitially = false,
@@ -1279,13 +1279,19 @@ export class TsEmbed {
1279
1279
  * Creates the preRender shell
1280
1280
  * @param showPreRenderByDefault - Show the preRender after render, hidden by default
1281
1281
  */
1282
- public async preRender(showPreRenderByDefault = false): Promise<TsEmbed> {
1282
+ public async preRender(showPreRenderByDefault = false, replaceExistingPreRender = false): Promise<TsEmbed> {
1283
1283
  if (!this.viewConfig.preRenderId) {
1284
1284
  logger.error(ERROR_MESSAGE.PRERENDER_ID_MISSING);
1285
1285
  return this;
1286
1286
  }
1287
1287
  this.isPreRendered = true;
1288
1288
  this.showPreRenderByDefault = showPreRenderByDefault;
1289
+
1290
+ const isAlreadyRendered = this.connectPreRendered();
1291
+ if (isAlreadyRendered && !replaceExistingPreRender) {
1292
+ return this;
1293
+ }
1294
+
1289
1295
  return this.handleRenderForPrerender();
1290
1296
  }
1291
1297
 
package/src/errors.ts CHANGED
@@ -10,6 +10,7 @@ export const ERROR_MESSAGE = {
10
10
  SDK_NOT_INITIALIZED: 'SDK not initialized',
11
11
  SESSION_INFO_FAILED: 'Failed to get session information',
12
12
  INVALID_TOKEN_ERROR: 'Received invalid token from getAuthToken callback or authToken endpoint.',
13
+ INVALID_TOKEN_TYPE_ERROR: 'Expected getAuthToken to return a string, but received a {invalidType}.',
13
14
  MIXPANEL_TOKEN_NOT_FOUND: 'Mixpanel token not found in session info',
14
15
  PRERENDER_ID_MISSING: 'PreRender ID is required for preRender',
15
16
  SYNC_STYLE_CALLED_BEFORE_RENDER: 'PreRender should be called before using syncPreRenderStyle',
@@ -56,7 +56,7 @@ describe('React Components', () => {
56
56
  ),
57
57
  ).toBe(true);
58
58
  expect(getIFrameSrc(container)).toBe(
59
- `http://${thoughtSpotHost}/?embedApp=true&hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&preAuthCache=true&overrideConsoleLogs=true&clientLogLevel=ERROR&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true&collapseSearchBarInitially=true&enableCustomColumnGroups=false&dataPanelCustomGroupsAccordionInitialState=EXPAND_ALL#/embed/answer`,
59
+ `http://${thoughtSpotHost}/?embedApp=true&hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&preAuthCache=true&overrideConsoleLogs=true&clientLogLevel=ERROR&enableDataPanelV2=true&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true&collapseSearchBarInitially=true&enableCustomColumnGroups=false&dataPanelCustomGroupsAccordionInitialState=EXPAND_ALL#/embed/answer`,
60
60
  );
61
61
  });
62
62
 
@@ -94,10 +94,12 @@ const componentFactory = <T extends typeof TsEmbed, U extends EmbedProps, V exte
94
94
  };
95
95
  }, [viewConfig, listeners]);
96
96
 
97
+ const preRenderStyles = isPreRenderedComponent ? { display: 'none' } : {};
98
+
97
99
  return viewConfig.insertAsSibling ? (
98
- <span data-testid="tsEmbed" ref={ref} style={{ position: 'absolute' }}></span>
100
+ <span data-testid="tsEmbed" ref={ref} style={{ position: 'absolute', ...preRenderStyles }}></span>
99
101
  ) : (
100
- <div data-testid="tsEmbed" ref={ref} style={style} className={`ts-embed-container ${className}`}></div>
102
+ <div data-testid="tsEmbed" ref={ref} style={{ ...style, ...preRenderStyles }} className={`ts-embed-container ${className}`}></div>
101
103
  );
102
104
  },
103
105
  );
package/src/types.ts CHANGED
@@ -1281,8 +1281,8 @@ export interface SearchLiveboardCommonViewConfig {
1281
1281
  * Flag to control Data panel experience
1282
1282
  *
1283
1283
  * Supported embed types: `SageEmbed`, `AppEmbed`, `SearchBarEmbed`, `LiveboardEmbed`, `SearchEmbed`
1284
- * @default false
1285
- * @version SDK: 1.34.0 | ThoughtSpot Cloud: 10.3.0.cl
1284
+ * @default true
1285
+ * @version SDK: 1.43.0 | ThoughtSpot Cloud: 10.14.0.cl
1286
1286
  * @example
1287
1287
  * ```js
1288
1288
  * // Replace <EmbedComponent> with embed component name. For example, SageEmbed, AppEmbed, or SearchBarEmbed
@@ -3823,7 +3823,7 @@ export enum HostEvent {
3823
3823
  * column: "Date",
3824
3824
  * oper: 'EQ',
3825
3825
  * values: ["2023-07-31"],
3826
- * types: "EXACT_DATE"
3826
+ * type: "EXACT_DATE"
3827
3827
  * }]
3828
3828
  * });
3829
3829
  * ```
@@ -4317,6 +4317,7 @@ export enum Param {
4317
4317
  IsLazyLoadingForEmbedEnabled = 'isLazyLoadingForEmbedEnabled',
4318
4318
  RootMarginForLazyLoad = 'rootMarginForLazyLoad',
4319
4319
  LiveboardXLSXCSVDownload = 'isLiveboardXLSXCSVDownloadEnabled',
4320
+ isPNGInScheduledEmailsEnabled = 'isPNGInScheduledEmailsEnabled',
4320
4321
  }
4321
4322
 
4322
4323
  /**
@@ -5616,6 +5617,29 @@ export enum Action {
5616
5617
  * @version SDK: 1.41.0 | ThoughtSpot Cloud: 10.13.0.cl
5617
5618
  */
5618
5619
  SpotterTokenQuickEdit = 'SpotterTokenQuickEdit',
5620
+ /**
5621
+ * The **PNG screenshot in email** option in the schedule email dialog.
5622
+ * Includes a PNG screenshot in the notification email body.
5623
+ * @example
5624
+ * ```js
5625
+ * disabledActions: [Action.PngScreenshotInEmail]
5626
+ * ```
5627
+ * ```
5628
+ * @version SDK: 1.42.0 | ThoughtSpot Cloud: 10.14.0.cl
5629
+ */
5630
+ PngScreenshotInEmail = 'pngScreenshotInEmail',
5631
+ /**
5632
+ * The **Remove attachment** action in the schedule email dialog.
5633
+ * Removes an attachment from the email configuration.
5634
+ * @example
5635
+ * ```js
5636
+ * disabledActions: [Action.RemoveAttachment]
5637
+ * ```
5638
+ * ```
5639
+ * ```
5640
+ * @version SDK: 1.42.0 | ThoughtSpot Cloud: 10.14.0.cl
5641
+ */
5642
+ RemoveAttachment = 'removeAttachment',
5619
5643
  }
5620
5644
 
5621
5645
  export interface AnswerServiceType {
package/src/utils.spec.ts CHANGED
@@ -18,6 +18,7 @@ import {
18
18
  getTypeFromValue,
19
19
  arrayIncludesString,
20
20
  calculateVisibleElementData,
21
+ formatTemplate,
21
22
  } from './utils';
22
23
  import { RuntimeFilterOp } from './types';
23
24
  import { logger } from './utils/logger';
@@ -718,3 +719,20 @@ describe('calculateVisibleElementData', () => {
718
719
  });
719
720
  });
720
721
  });
722
+
723
+ describe('formatTemplate', () => {
724
+ it('should replace placeholders with provided values', () => {
725
+ expect(
726
+ formatTemplate('Hello {name}, you are {age} years old', { name: 'John', age: 30 }),
727
+ ).toBe('Hello John, you are 30 years old');
728
+ expect(
729
+ formatTemplate('Expected {type}, but received {actual}', {
730
+ type: 'string',
731
+ actual: 'number',
732
+ }),
733
+ ).toBe('Expected string, but received number');
734
+ expect(
735
+ formatTemplate('Hello {name}, you are {age} years old', { name: 'John' }),
736
+ ).toBe('Hello John, you are {age} years old');
737
+ });
738
+ });
package/src/utils.ts CHANGED
@@ -499,3 +499,24 @@ export const calculateVisibleElementData = (element: HTMLElement) => {
499
499
 
500
500
  return data;
501
501
  }
502
+
503
+ /**
504
+ * Replaces placeholders in a template string with provided values.
505
+ * Placeholders should be in the format {key}.
506
+ * @param template - The template string with placeholders
507
+ * @param values - An object containing key-value pairs to replace placeholders
508
+ * @returns The template string with placeholders replaced
509
+ * @example
510
+ * formatTemplate('Hello {name}, you are {age} years old', { name: 'John', age: 30 })
511
+ * // Returns: 'Hello John, you are 30 years old'
512
+ *
513
+ * formatTemplate('Expected {type}, but received {actual}', { type: 'string', actual: 'number' })
514
+ * // Returns: 'Expected string, but received number'
515
+ */
516
+ export const formatTemplate = (template: string, values: Record<string, any>): string => {
517
+ // This regex /\{(\w+)\}/g finds all placeholders in the format {word}
518
+ // and captures the word inside the braces for replacement.
519
+ return template.replace(/\{(\w+)\}/g, (match, key) => {
520
+ return values[key] !== undefined ? String(values[key]) : match;
521
+ });
522
+ };