@thoughtspot/visual-embed-sdk 1.24.0-dev → 1.24.0-preRender.0

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 (231) hide show
  1. package/cjs/package.json +2 -3
  2. package/cjs/src/embed/app.d.ts +3 -1
  3. package/cjs/src/embed/app.d.ts.map +1 -1
  4. package/cjs/src/embed/app.js +8 -2
  5. package/cjs/src/embed/app.js.map +1 -1
  6. package/cjs/src/embed/base.d.ts +2 -0
  7. package/cjs/src/embed/base.d.ts.map +1 -1
  8. package/cjs/src/embed/base.js +2 -0
  9. package/cjs/src/embed/base.js.map +1 -1
  10. package/cjs/src/embed/liveboard.d.ts +3 -2
  11. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  12. package/cjs/src/embed/liveboard.js +6 -5
  13. package/cjs/src/embed/liveboard.js.map +1 -1
  14. package/cjs/src/embed/sage.d.ts +4 -1
  15. package/cjs/src/embed/sage.d.ts.map +1 -1
  16. package/cjs/src/embed/sage.js +9 -2
  17. package/cjs/src/embed/sage.js.map +1 -1
  18. package/cjs/src/embed/search-bar.d.ts +1 -0
  19. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  20. package/cjs/src/embed/search-bar.js +1 -0
  21. package/cjs/src/embed/search-bar.js.map +1 -1
  22. package/cjs/src/embed/search.d.ts +5 -1
  23. package/cjs/src/embed/search.d.ts.map +1 -1
  24. package/cjs/src/embed/search.js +10 -2
  25. package/cjs/src/embed/search.js.map +1 -1
  26. package/cjs/src/embed/ts-embed.d.ts +9 -3
  27. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  28. package/cjs/src/embed/ts-embed.js +50 -20
  29. package/cjs/src/embed/ts-embed.js.map +1 -1
  30. package/cjs/src/embed/ts-embed.spec.js +47 -0
  31. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  32. package/cjs/src/index.d.ts +3 -2
  33. package/cjs/src/index.d.ts.map +1 -1
  34. package/cjs/src/index.js +3 -1
  35. package/cjs/src/index.js.map +1 -1
  36. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  37. package/cjs/src/mixpanel-service.js +2 -0
  38. package/cjs/src/mixpanel-service.js.map +1 -1
  39. package/cjs/src/mixpanel-service.spec.js +1 -0
  40. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  41. package/cjs/src/react/index.d.ts +5 -1
  42. package/cjs/src/react/index.d.ts.map +1 -1
  43. package/cjs/src/react/index.js +8 -8
  44. package/cjs/src/react/index.js.map +1 -1
  45. package/cjs/src/types.d.ts +46 -18
  46. package/cjs/src/types.d.ts.map +1 -1
  47. package/cjs/src/types.js +7 -13
  48. package/cjs/src/types.js.map +1 -1
  49. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  50. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  51. package/cjs/src/utils/graphql/answerService/answer-queries.js +80 -0
  52. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  53. package/cjs/src/utils/graphql/answerService/answerService.d.ts +61 -0
  54. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  55. package/cjs/src/utils/graphql/answerService/answerService.js +182 -0
  56. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -0
  57. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  58. package/cjs/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  59. package/cjs/src/utils/graphql/answerService/answerService.spec.js +201 -0
  60. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  61. package/cjs/src/utils/graphql/graphql-request.d.ts +15 -0
  62. package/cjs/src/utils/graphql/graphql-request.d.ts.map +1 -0
  63. package/cjs/src/utils/graphql/graphql-request.js +40 -0
  64. package/cjs/src/utils/graphql/graphql-request.js.map +1 -0
  65. package/cjs/src/utils/graphql/sourceService.d.ts +8 -0
  66. package/cjs/src/utils/graphql/sourceService.d.ts.map +1 -0
  67. package/cjs/src/utils/graphql/sourceService.js +69 -0
  68. package/cjs/src/utils/graphql/sourceService.js.map +1 -0
  69. package/cjs/src/utils/graphql/sourceService.spec.d.ts +2 -0
  70. package/cjs/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  71. package/cjs/src/utils/graphql/sourceService.spec.js +12 -0
  72. package/cjs/src/utils/graphql/sourceService.spec.js.map +1 -0
  73. package/cjs/src/utils/processData.d.ts.map +1 -1
  74. package/cjs/src/utils/processData.js +7 -11
  75. package/cjs/src/utils/processData.js.map +1 -1
  76. package/cjs/src/utils/processData.spec.js +13 -17
  77. package/cjs/src/utils/processData.spec.js.map +1 -1
  78. package/cjs/src/utils.d.ts +6 -0
  79. package/cjs/src/utils.d.ts.map +1 -1
  80. package/cjs/src/utils.js +26 -1
  81. package/cjs/src/utils.js.map +1 -1
  82. package/dist/src/embed/app.d.ts +3 -1
  83. package/dist/src/embed/app.d.ts.map +1 -1
  84. package/dist/src/embed/base.d.ts +2 -0
  85. package/dist/src/embed/base.d.ts.map +1 -1
  86. package/dist/src/embed/liveboard.d.ts +3 -2
  87. package/dist/src/embed/liveboard.d.ts.map +1 -1
  88. package/dist/src/embed/sage.d.ts +4 -1
  89. package/dist/src/embed/sage.d.ts.map +1 -1
  90. package/dist/src/embed/search-bar.d.ts +1 -0
  91. package/dist/src/embed/search-bar.d.ts.map +1 -1
  92. package/dist/src/embed/search.d.ts +5 -1
  93. package/dist/src/embed/search.d.ts.map +1 -1
  94. package/dist/src/embed/ts-embed.d.ts +9 -3
  95. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  96. package/dist/src/index.d.ts +3 -2
  97. package/dist/src/index.d.ts.map +1 -1
  98. package/dist/src/mixpanel-service.d.ts.map +1 -1
  99. package/dist/src/react/index.d.ts +5 -1
  100. package/dist/src/react/index.d.ts.map +1 -1
  101. package/dist/src/types.d.ts +46 -18
  102. package/dist/src/types.d.ts.map +1 -1
  103. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  104. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  105. package/dist/src/utils/graphql/answerService/answerService.d.ts +61 -0
  106. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  107. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  108. package/dist/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  109. package/dist/src/utils/graphql/graphql-request.d.ts +15 -0
  110. package/dist/src/utils/graphql/graphql-request.d.ts.map +1 -0
  111. package/dist/src/utils/graphql/sourceService.d.ts +8 -0
  112. package/dist/src/utils/graphql/sourceService.d.ts.map +1 -0
  113. package/dist/src/utils/graphql/sourceService.spec.d.ts +2 -0
  114. package/dist/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  115. package/dist/src/utils/processData.d.ts.map +1 -1
  116. package/dist/src/utils.d.ts +6 -0
  117. package/dist/src/utils.d.ts.map +1 -1
  118. package/dist/tsembed-react.es.js +468 -107
  119. package/dist/tsembed-react.js +471 -106
  120. package/dist/tsembed.es.js +511 -103
  121. package/dist/tsembed.js +511 -102
  122. package/dist/visual-embed-sdk-react-full.d.ts +132 -28
  123. package/dist/visual-embed-sdk-react.d.ts +132 -28
  124. package/dist/visual-embed-sdk.d.ts +127 -27
  125. package/lib/package.json +2 -3
  126. package/lib/src/embed/app.d.ts +3 -1
  127. package/lib/src/embed/app.d.ts.map +1 -1
  128. package/lib/src/embed/app.js +8 -2
  129. package/lib/src/embed/app.js.map +1 -1
  130. package/lib/src/embed/base.d.ts +2 -0
  131. package/lib/src/embed/base.d.ts.map +1 -1
  132. package/lib/src/embed/base.js +2 -0
  133. package/lib/src/embed/base.js.map +1 -1
  134. package/lib/src/embed/liveboard.d.ts +3 -2
  135. package/lib/src/embed/liveboard.d.ts.map +1 -1
  136. package/lib/src/embed/liveboard.js +6 -5
  137. package/lib/src/embed/liveboard.js.map +1 -1
  138. package/lib/src/embed/sage.d.ts +4 -1
  139. package/lib/src/embed/sage.d.ts.map +1 -1
  140. package/lib/src/embed/sage.js +9 -2
  141. package/lib/src/embed/sage.js.map +1 -1
  142. package/lib/src/embed/search-bar.d.ts +1 -0
  143. package/lib/src/embed/search-bar.d.ts.map +1 -1
  144. package/lib/src/embed/search-bar.js +1 -0
  145. package/lib/src/embed/search-bar.js.map +1 -1
  146. package/lib/src/embed/search.d.ts +5 -1
  147. package/lib/src/embed/search.d.ts.map +1 -1
  148. package/lib/src/embed/search.js +10 -2
  149. package/lib/src/embed/search.js.map +1 -1
  150. package/lib/src/embed/ts-embed.d.ts +9 -3
  151. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  152. package/lib/src/embed/ts-embed.js +50 -20
  153. package/lib/src/embed/ts-embed.js.map +1 -1
  154. package/lib/src/embed/ts-embed.spec.js +47 -0
  155. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  156. package/lib/src/index.d.ts +3 -2
  157. package/lib/src/index.d.ts.map +1 -1
  158. package/lib/src/index.js +2 -1
  159. package/lib/src/index.js.map +1 -1
  160. package/lib/src/mixpanel-service.d.ts.map +1 -1
  161. package/lib/src/mixpanel-service.js +2 -0
  162. package/lib/src/mixpanel-service.js.map +1 -1
  163. package/lib/src/mixpanel-service.spec.js +1 -0
  164. package/lib/src/mixpanel-service.spec.js.map +1 -1
  165. package/lib/src/react/index.d.ts +5 -1
  166. package/lib/src/react/index.d.ts.map +1 -1
  167. package/lib/src/react/index.js +7 -7
  168. package/lib/src/react/index.js.map +1 -1
  169. package/lib/src/types.d.ts +46 -18
  170. package/lib/src/types.d.ts.map +1 -1
  171. package/lib/src/types.js +6 -12
  172. package/lib/src/types.js.map +1 -1
  173. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +5 -0
  174. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -0
  175. package/lib/src/utils/graphql/answerService/answer-queries.js +77 -0
  176. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -0
  177. package/lib/src/utils/graphql/answerService/answerService.d.ts +61 -0
  178. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -0
  179. package/lib/src/utils/graphql/answerService/answerService.js +177 -0
  180. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -0
  181. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts +2 -0
  182. package/lib/src/utils/graphql/answerService/answerService.spec.d.ts.map +1 -0
  183. package/lib/src/utils/graphql/answerService/answerService.spec.js +199 -0
  184. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -0
  185. package/lib/src/utils/graphql/graphql-request.d.ts +15 -0
  186. package/lib/src/utils/graphql/graphql-request.d.ts.map +1 -0
  187. package/lib/src/utils/graphql/graphql-request.js +36 -0
  188. package/lib/src/utils/graphql/graphql-request.js.map +1 -0
  189. package/lib/src/utils/graphql/sourceService.d.ts +8 -0
  190. package/lib/src/utils/graphql/sourceService.d.ts.map +1 -0
  191. package/lib/src/utils/graphql/sourceService.js +65 -0
  192. package/lib/src/utils/graphql/sourceService.js.map +1 -0
  193. package/lib/src/utils/graphql/sourceService.spec.d.ts +2 -0
  194. package/lib/src/utils/graphql/sourceService.spec.d.ts.map +1 -0
  195. package/lib/src/utils/graphql/sourceService.spec.js +10 -0
  196. package/lib/src/utils/graphql/sourceService.spec.js.map +1 -0
  197. package/lib/src/utils/processData.d.ts.map +1 -1
  198. package/lib/src/utils/processData.js +8 -12
  199. package/lib/src/utils/processData.js.map +1 -1
  200. package/lib/src/utils/processData.spec.js +14 -18
  201. package/lib/src/utils/processData.spec.js.map +1 -1
  202. package/lib/src/utils.d.ts +6 -0
  203. package/lib/src/utils.d.ts.map +1 -1
  204. package/lib/src/utils.js +23 -0
  205. package/lib/src/utils.js.map +1 -1
  206. package/lib/src/visual-embed-sdk.d.ts +133 -28
  207. package/package.json +2 -3
  208. package/src/embed/app.ts +12 -2
  209. package/src/embed/base.ts +2 -0
  210. package/src/embed/liveboard.ts +7 -5
  211. package/src/embed/sage.ts +13 -2
  212. package/src/embed/search-bar.tsx +2 -0
  213. package/src/embed/search.ts +14 -2
  214. package/src/embed/ts-embed.spec.ts +49 -0
  215. package/src/embed/ts-embed.ts +61 -22
  216. package/src/index.ts +5 -0
  217. package/src/mixpanel-service.spec.ts +1 -0
  218. package/src/mixpanel-service.ts +1 -0
  219. package/src/react/index.tsx +40 -37
  220. package/src/types.ts +50 -19
  221. package/src/utils/graphql/answerService/answer-queries.ts +80 -0
  222. package/src/utils/graphql/answerService/answerService.spec.ts +231 -0
  223. package/src/utils/graphql/answerService/answerService.ts +234 -0
  224. package/src/utils/graphql/graphql-request.ts +45 -0
  225. package/src/utils/graphql/sourceService.spec.ts +10 -0
  226. package/src/utils/graphql/sourceService.ts +71 -0
  227. package/src/utils/processData.spec.ts +15 -25
  228. package/src/utils/processData.ts +13 -15
  229. package/src/utils.ts +25 -0
  230. package/src/utils/answerService.spec.ts +0 -41
  231. package/src/utils/answerService.ts +0 -63
@@ -361,6 +361,24 @@
361
361
  return typeof domSelector === 'string' ? document.querySelector(domSelector) : domSelector;
362
362
  }
363
363
  const deepMerge = (target, source) => merge(target, source);
364
+ /**
365
+ *
366
+ * @param obj
367
+ */
368
+ function removeTypename(obj) {
369
+ if (!obj || typeof obj !== 'object')
370
+ return obj;
371
+ // eslint-disable-next-line no-restricted-syntax
372
+ for (const key in obj) {
373
+ if (key === '__typename') {
374
+ delete obj[key];
375
+ }
376
+ else if (typeof obj[key] === 'object') {
377
+ removeTypename(obj[key]);
378
+ }
379
+ }
380
+ return obj;
381
+ }
364
382
  const setStyleProperties = (element, styleProperties) => {
365
383
  if (!element || !styleProperties)
366
384
  return;
@@ -374,6 +392,11 @@
374
392
  styleProperties.forEach((styleProperty) => {
375
393
  element.style.removeProperty(styleProperty);
376
394
  });
395
+ };
396
+ const getOperationNameFromQuery = (query) => {
397
+ const regex = /(?:query|mutation)\s+(\w+)/;
398
+ const matches = query.match(regex);
399
+ return matches === null || matches === void 0 ? void 0 : matches[1];
377
400
  };
378
401
 
379
402
  /**
@@ -626,27 +649,27 @@
626
649
  /**
627
650
  * Search bar
628
651
  */
629
- HomepageModule["Search"] = "search";
652
+ HomepageModule["Search"] = "SEARCH";
630
653
  /**
631
654
  * kPI watchlist module
632
655
  */
633
- HomepageModule["Watchlist"] = "watchlist";
656
+ HomepageModule["Watchlist"] = "WATCHLIST";
634
657
  /**
635
658
  * favorite objects
636
659
  */
637
- HomepageModule["Favorite"] = "favorite";
660
+ HomepageModule["Favorite"] = "FAVORITE";
638
661
  /**
639
662
  * List of answers and liveboards
640
663
  */
641
- HomepageModule["MyLibrary"] = "mylibrary";
664
+ HomepageModule["MyLibrary"] = "MY_LIBRARY";
642
665
  /**
643
666
  * Trending list
644
667
  */
645
- HomepageModule["Trending"] = "trending";
668
+ HomepageModule["Trending"] = "TRENDING";
646
669
  /**
647
670
  * Learning videos
648
671
  */
649
- HomepageModule["Learning"] = "learning";
672
+ HomepageModule["Learning"] = "LEARNING";
650
673
  })(exports.HomepageModule || (exports.HomepageModule = {}));
651
674
  (function (EmbedEvent) {
652
675
  /**
@@ -2719,12 +2742,6 @@
2719
2742
  */
2720
2743
  Action["PersonalisedViewsDropdown"] = "personalisedViewsDropdown";
2721
2744
  })(exports.Action || (exports.Action = {}));
2722
- // eslint-disable-next-line no-shadow
2723
- var OperationType;
2724
- (function (OperationType) {
2725
- OperationType["GetChartWithData"] = "GetChartWithData";
2726
- OperationType["GetTableWithHeadlineData"] = "GetTableWithHeadlineData";
2727
- })(OperationType || (OperationType = {}));
2728
2745
  var PrefetchFeatures;
2729
2746
  (function (PrefetchFeatures) {
2730
2747
  PrefetchFeatures["FullApp"] = "FullApp";
@@ -8840,6 +8857,7 @@
8840
8857
  * @param sessionInfo
8841
8858
  */
8842
8859
  function initMixpanel(sessionInfo) {
8860
+ var _a;
8843
8861
  if (!sessionInfo || !sessionInfo.mixpanelToken) {
8844
8862
  return;
8845
8863
  }
@@ -8857,6 +8875,7 @@
8857
8875
  clusterId: sessionInfo.clusterId,
8858
8876
  clusterName: sessionInfo.clusterName,
8859
8877
  releaseVersion: sessionInfo.releaseVersion,
8878
+ hostAppUrl: ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.host) || '',
8860
8879
  });
8861
8880
  isMixpanelInitialized = true;
8862
8881
  emptyQueue();
@@ -10118,58 +10137,351 @@
10118
10137
 
10119
10138
  /**
10120
10139
  *
10121
- * @param session
10122
- * @param query
10123
- * @param operation
10140
+ * @param root0
10141
+ * @param root0.query
10142
+ * @param root0.variables
10143
+ * @param root0.thoughtSpotHost
10144
+ * @param root0.isCompositeQuery
10145
+ */
10146
+ async function graphqlQuery({ query, variables, thoughtSpotHost, isCompositeQuery = false, }) {
10147
+ const operationName = getOperationNameFromQuery(query);
10148
+ try {
10149
+ const response = await fetch(`${thoughtSpotHost}/prism/?op=${operationName}`, {
10150
+ method: 'POST',
10151
+ headers: {
10152
+ 'content-type': 'application/json;charset=UTF-8',
10153
+ 'x-requested-by': 'ThoughtSpot',
10154
+ accept: '*/*',
10155
+ 'accept-language': 'en-us',
10156
+ },
10157
+ body: JSON.stringify({
10158
+ operationName,
10159
+ query,
10160
+ variables,
10161
+ }),
10162
+ credentials: 'include',
10163
+ });
10164
+ const result = await response.json();
10165
+ const dataValues = Object.values(result.data);
10166
+ return (isCompositeQuery) ? result.data : dataValues[0];
10167
+ }
10168
+ catch (error) {
10169
+ return error;
10170
+ }
10171
+ }
10172
+
10173
+ const getSourceDetailQuery = `
10174
+ query GetSourceDetail($ids: [GUID!]!) {
10175
+ getSourceDetailById(ids: $ids, type: LOGICAL_TABLE) {
10176
+ id
10177
+ name
10178
+ description
10179
+ authorName
10180
+ authorDisplayName
10181
+ isExternal
10182
+ type
10183
+ created
10184
+ modified
10185
+ columns {
10186
+ id
10187
+ name
10188
+ author
10189
+ authorDisplayName
10190
+ description
10191
+ dataType
10192
+ type
10193
+ modified
10194
+ ownerName
10195
+ owner
10196
+ dataRecency
10197
+ sources {
10198
+ tableId
10199
+ tableName
10200
+ columnId
10201
+ columnName
10202
+ __typename
10203
+ }
10204
+ synonyms
10205
+ cohortAnswerId
10206
+ __typename
10207
+ }
10208
+ relationships
10209
+ destinationRelationships
10210
+ dataSourceId
10211
+ __typename
10212
+ }
10213
+ }
10214
+ `;
10215
+ const sourceDetailCache = new Map();
10216
+ /**
10217
+ *
10124
10218
  * @param thoughtSpotHost
10219
+ * @param sourceId
10125
10220
  */
10126
- function getAnswerServiceInstance(session, query, operation, thoughtSpotHost) {
10127
- let variable;
10128
- const fetchQuery = async (variables) => {
10129
- try {
10130
- const response = await fetch(`${thoughtSpotHost}/prism/?op=${operation}`, {
10131
- method: 'POST',
10132
- headers: {
10133
- 'content-type': 'application/json;charset=UTF-8',
10134
- 'x-requested-by': 'ThoughtSpot',
10135
- accept: '*/*',
10136
- 'accept-language': 'en-us',
10137
- },
10138
- body: JSON.stringify({
10139
- operationName: operation,
10140
- query,
10141
- variables,
10142
- }),
10143
- credentials: 'include',
10144
- });
10145
- const result = await response.json();
10146
- return result.data;
10221
+ async function getSourceDetail(thoughtSpotHost, sourceId) {
10222
+ if (sourceDetailCache.has(sourceId)) {
10223
+ return sourceDetailCache.get(sourceId);
10224
+ }
10225
+ const details = await graphqlQuery({
10226
+ query: getSourceDetailQuery,
10227
+ variables: {
10228
+ ids: [sourceId],
10229
+ },
10230
+ thoughtSpotHost,
10231
+ });
10232
+ const souceDetails = details[0];
10233
+ sourceDetailCache.set(sourceId, souceDetails);
10234
+ return souceDetails;
10235
+ }
10236
+
10237
+ const bachSessionId = `
10238
+ id {
10239
+ sessionId
10240
+ genNo
10241
+ acSession {
10242
+ sessionId
10243
+ genNo
10244
+ }
10245
+ }
10246
+ `;
10247
+ const getUnaggregatedAnswerSession = `
10248
+ mutation GetUnAggregatedAnswerSession($session: BachSessionIdInput!, $columns: [UserPointSelectionInput!]!) {
10249
+ Answer__getUnaggregatedAnswer(session: $session, columns: $columns) {
10250
+ ${bachSessionId}
10251
+ answer {
10252
+ visualizations {
10253
+ ... on TableViz {
10254
+ columns {
10255
+ column {
10256
+ id
10257
+ name
10258
+ referencedColumns {
10259
+ guid
10260
+ displayName
10261
+ }
10262
+ }
10263
+ }
10264
+ }
10265
+ }
10266
+ }
10267
+ }
10268
+ }
10269
+ `;
10270
+ const removeColumns = `
10271
+ mutation RemoveColumns($session: BachSessionIdInput!, $logicalColumnIds: [GUID!], $columnIds: [GUID!]) {
10272
+ Answer__removeColumns(
10273
+ session: $session
10274
+ logicalColumnIds: $logicalColumnIds
10275
+ columnIds: $columnIds
10276
+ ) {
10277
+ ${bachSessionId}
10278
+ }
10279
+ }
10280
+ `;
10281
+ const addColumns = `
10282
+ mutation AddColumns($session: BachSessionIdInput!, $columns: [AnswerColumnInfo!]!) {
10283
+ Answer__addColumn(session: $session, columns: $columns) {
10284
+ ${bachSessionId}
10285
+ }
10286
+ }
10287
+ `;
10288
+ const getAnswerData = `
10289
+ query GetTableWithHeadlineData($session: BachSessionIdInput!, $deadline: Int!, $dataPaginationParams: DataPaginationParamsInput!) {
10290
+ getAnswer(session: $session) {
10291
+ ${bachSessionId}
10292
+ answer {
10293
+ id
10294
+ visualizations {
10295
+ id
10296
+ ... on TableViz {
10297
+ columns {
10298
+ column {
10299
+ id
10300
+ name
10301
+ type
10302
+ aggregationType
10303
+ dataType
10304
+ }
10305
+ }
10306
+ data(deadline: $deadline, pagination: $dataPaginationParams)
10307
+ }
10308
+ }
10309
+ }
10310
+ }
10311
+ }
10312
+ `;
10313
+
10314
+ // eslint-disable-next-line no-shadow
10315
+ var OperationType;
10316
+ (function (OperationType) {
10317
+ OperationType["GetChartWithData"] = "GetChartWithData";
10318
+ OperationType["GetTableWithHeadlineData"] = "GetTableWithHeadlineData";
10319
+ })(OperationType || (OperationType = {}));
10320
+ /**
10321
+ * Class representing the answer service provided with the
10322
+ * custom action payload. This service could be used to run
10323
+ * graphql queries in the context of the answer on which the
10324
+ * custom action was triggered.
10325
+ *
10326
+ * @example
10327
+ * ```js
10328
+ * embed.on(EmbedEvent.CustomAction, e => {
10329
+ * const underlying = await e.answerService.getUnderlyingDataForPoint([
10330
+ * 'col name 1'
10331
+ * ]);
10332
+ * const data = await underlying.fetchData(0, 100);
10333
+ * })
10334
+ * ```
10335
+ * @version
10336
+ * ThoughtSpot: 9.9.0.cl / SDK: 1.25.0
10337
+ */
10338
+ class AnswerService {
10339
+ constructor(session, answer, thoughtSpotHost, selectedPoints) {
10340
+ this.session = session;
10341
+ this.answer = answer;
10342
+ this.thoughtSpotHost = thoughtSpotHost;
10343
+ this.selectedPoints = selectedPoints;
10344
+ this.session = removeTypename(session);
10345
+ }
10346
+ async getSourceDetail() {
10347
+ const sourceId = this.answer.sources[0].header.guid;
10348
+ return getSourceDetail(this.thoughtSpotHost, sourceId);
10349
+ }
10350
+ async removeColumns(columnIds) {
10351
+ return this.executeQuery(removeColumns, {
10352
+ logicalColumnIds: columnIds,
10353
+ });
10354
+ }
10355
+ async addColumns(columnIds) {
10356
+ return this.executeQuery(addColumns, {
10357
+ columns: columnIds.map((colId) => ({ logicalColumnId: colId })),
10358
+ });
10359
+ }
10360
+ async fetchData(offset = 0, size = 1000) {
10361
+ const { answer } = await this.executeQuery(getAnswerData, {
10362
+ deadline: 0,
10363
+ dataPaginationParams: {
10364
+ isClientPaginated: true,
10365
+ offset,
10366
+ size,
10367
+ },
10368
+ });
10369
+ const { columns, data } = answer.visualizations[0];
10370
+ return {
10371
+ columns,
10372
+ data,
10373
+ };
10374
+ }
10375
+ /**
10376
+ *
10377
+ * @param userLocale
10378
+ * @param omitInfo Omit the download Info on top of the CSV
10379
+ * @returns Response
10380
+ */
10381
+ async fetchCSVBlob(userLocale = 'en-us', omitInfo = false) {
10382
+ if (omitInfo) {
10383
+ console.warn('omitInfo not supported yet.');
10147
10384
  }
10148
- catch (error) {
10149
- return error;
10385
+ const fetchUrl = `${this.thoughtSpotHost}/prism/download/answer/csv?sessionId=${this.session.sessionId}&genNo=${this.session.genNo}&userLocale=${userLocale}&exportFileName=data&omitInfo=${omitInfo}`;
10386
+ return fetch(fetchUrl, {
10387
+ credentials: 'include',
10388
+ });
10389
+ }
10390
+ async getUnderlyingDataForPoint(outputColumnNames, selectedPoints) {
10391
+ if (!selectedPoints && !this.selectedPoints) {
10392
+ throw new Error('Needs to be triggered in context of a point');
10150
10393
  }
10151
- };
10152
- const fetchData = (offset, batchSize) => {
10153
- if (operation === OperationType.GetChartWithData) {
10154
- variable = { batchSize, offset: offset * batchSize };
10394
+ if (!selectedPoints) {
10395
+ selectedPoints = getSelectedPointsForUnderlyingDataQuery(this.selectedPoints);
10396
+ }
10397
+ const sourceDetail = await this.getSourceDetail();
10398
+ const ouputColumnGuids = getGuidsFromColumnNames(sourceDetail, outputColumnNames);
10399
+ const unAggAnswer = await graphqlQuery({
10400
+ query: getUnaggregatedAnswerSession,
10401
+ variables: {
10402
+ session: this.session,
10403
+ columns: selectedPoints,
10404
+ },
10405
+ thoughtSpotHost: this.thoughtSpotHost,
10406
+ });
10407
+ const unaggAnswerSession = new AnswerService(unAggAnswer.id, unAggAnswer.answer, this.thoughtSpotHost);
10408
+ const currentColumns = new Set(unAggAnswer.answer.visualizations[0].columns
10409
+ .map((c) => c.column.referencedColumns[0].guid));
10410
+ const columnsToAdd = [...ouputColumnGuids].filter((col) => !currentColumns.has(col));
10411
+ if (columnsToAdd.length) {
10412
+ await unaggAnswerSession.addColumns(columnsToAdd);
10413
+ }
10414
+ const columnsToRemove = [...currentColumns].filter((col) => !ouputColumnGuids.has(col));
10415
+ if (columnsToRemove.length) {
10416
+ await unaggAnswerSession.removeColumns(columnsToRemove);
10417
+ }
10418
+ return unaggAnswerSession;
10419
+ }
10420
+ async executeQuery(query, variables) {
10421
+ const data = await graphqlQuery({
10422
+ query,
10423
+ variables: {
10424
+ session: this.session,
10425
+ ...variables,
10426
+ },
10427
+ thoughtSpotHost: this.thoughtSpotHost,
10428
+ isCompositeQuery: false,
10429
+ });
10430
+ this.session = deepMerge(this.session, (data === null || data === void 0 ? void 0 : data.id) || {});
10431
+ return data;
10432
+ }
10433
+ getSession() {
10434
+ return this.session;
10435
+ }
10436
+ }
10437
+ /**
10438
+ *
10439
+ * @param sourceDetail
10440
+ * @param colNames
10441
+ */
10442
+ function getGuidsFromColumnNames(sourceDetail, colNames) {
10443
+ const cols = sourceDetail.columns.reduce((colSet, col) => {
10444
+ colSet[col.name] = col;
10445
+ return colSet;
10446
+ }, {});
10447
+ return new Set(colNames.map((colName) => {
10448
+ const col = cols[colName];
10449
+ return col.id;
10450
+ }));
10451
+ }
10452
+ /**
10453
+ *
10454
+ * @param selectedPoints
10455
+ */
10456
+ function getSelectedPointsForUnderlyingDataQuery(selectedPoints) {
10457
+ const underlyingDataPoint = [];
10458
+ /**
10459
+ *
10460
+ * @param colVal
10461
+ */
10462
+ function addPointFromColVal(colVal) {
10463
+ const dataType = colVal.column.dataType;
10464
+ const id = colVal.column.id;
10465
+ let dataValue;
10466
+ if (dataType === 'DATE') {
10467
+ dataValue = [{
10468
+ epochRange: {
10469
+ startEpoch: colVal.value,
10470
+ },
10471
+ }];
10155
10472
  }
10156
10473
  else {
10157
- variable = {
10158
- dataPaginationParams: {
10159
- isClientPaginated: true,
10160
- offset: offset * batchSize,
10161
- size: batchSize,
10162
- },
10163
- };
10474
+ dataValue = [{ value: colVal.value }];
10164
10475
  }
10165
- return fetchQuery({
10166
- session,
10167
- ...variable,
10476
+ underlyingDataPoint.push({
10477
+ columnId: colVal.column.id,
10478
+ dataValue,
10168
10479
  });
10169
- };
10170
- return {
10171
- fetchData,
10172
- };
10480
+ }
10481
+ selectedPoints.forEach((p) => {
10482
+ p.selectedAttributes.forEach(addPointFromColVal);
10483
+ });
10484
+ return underlyingDataPoint;
10173
10485
  }
10174
10486
 
10175
10487
  /**
@@ -10178,16 +10490,12 @@
10178
10490
  * @param thoughtSpotHost
10179
10491
  */
10180
10492
  function processCustomAction(e, thoughtSpotHost) {
10181
- var _a;
10182
- if ([OperationType.GetChartWithData, OperationType.GetTableWithHeadlineData].includes((_a = e.data) === null || _a === void 0 ? void 0 : _a.operation)) {
10183
- const { session, query, operation } = e.data;
10184
- const answerService = getAnswerServiceInstance(session, query, operation, thoughtSpotHost);
10185
- return {
10186
- ...e,
10187
- answerService,
10188
- };
10189
- }
10190
- return e;
10493
+ const { session, embedAnswerData, contextMenuPoints } = e.data;
10494
+ const answerService = new AnswerService(session, embedAnswerData, thoughtSpotHost, contextMenuPoints === null || contextMenuPoints === void 0 ? void 0 : contextMenuPoints.selectedPoints);
10495
+ return {
10496
+ ...e,
10497
+ answerService,
10498
+ };
10191
10499
  }
10192
10500
  /**
10193
10501
  *
@@ -10332,7 +10640,7 @@
10332
10640
  });
10333
10641
  }
10334
10642
 
10335
- var name="@thoughtspot/visual-embed-sdk";var version="1.24.0-dev";var description="ThoughtSpot Embed SDK";var module="lib/src/index.js";var main="dist/tsembed.js";var types="lib/src/index.d.ts";var files=["dist/**","lib/**","src/**","cjs/**"];var exports$1={".":{"import":"./lib/src/index.js",require:"./cjs/src/index.js",types:"./lib/src/index.d.ts"},"./react":{"import":"./lib/src/react/all-types-export.js",require:"./cjs/src/react/all-types-export.js",types:"./lib/src/react/all-types-export.d.ts"},"./lib/src/react":{"import":"./lib/src/react/all-types-export.js",require:"./cjs/src/react/all-types-export.js",types:"./lib/src/react/all-types-export.d.ts"}};var typesVersions={"*":{react:["./lib/src/react/all-types-export.d.ts"]}};var scripts={lint:"eslint 'src/**'","lint:fix":"eslint 'src/**/*.*' --fix",tsc:"tsc -p . --incremental false; tsc -p . --incremental false --module commonjs --outDir cjs",start:"gatsby develop","build:gatsby":"npm run clean:gatsby && gatsby build --prefix-paths","build:gatsby:noprefix":"npm run clean:gatsby && gatsby build","serve:gatsby":"gatsby serve","clean:gatsby":"gatsby clean","build-and-publish":"npm run build:gatsby && npm run publish","bundle-dts-file":"dts-bundle --name @thoughtspot/visual-embed-sdk --out visual-embed-sdk.d.ts --main lib/src/index.d.ts","bundle-dts":"dts-bundle --name ../../dist/visual-embed-sdk --main lib/src/index.d.ts --outputAsModuleFolder=true","bundle-dts-react":"dts-bundle --name ../../../dist/visual-embed-sdk-react --main lib/src/react/index.d.ts --outputAsModuleFolder=true","bundle-dts-react-full":"dts-bundle --name ../../../dist/visual-embed-sdk-react-full --main lib/src/react/all-types-export.d.ts --outputAsModuleFolder=true",build:"rollup -c",watch:"rollup -cw","docs-cmd":"node scripts/gatsby-commands.js",docgen:"typedoc --tsconfig tsconfig.json --theme typedoc-theme","test-sdk":"jest -c jest.config.sdk.js --runInBand","test-docs":"jest -c jest.config.docs.js",test:"npm run test-sdk && npm run test-docs",posttest:"cat ./coverage/sdk/lcov.info | coveralls","is-publish-allowed":"node scripts/is-publish-allowed.js",prepublishOnly:"npm run tsc && npm run bundle-dts-file && npm run bundle-dts && npm run bundle-dts-react && npm run bundle-dts-react-full && npm run build","check-size":"npm run build && size-limit","publish-dev":"npm publish --tag dev","publish-prod":"npm publish --tag latest"};var peerDependencies={react:"> 16.8.0","react-dom":"> 16.8.0"};var dependencies={algoliasearch:"^4.10.5",classnames:"^2.3.1",dompurify:"^2.3.4","eslint-plugin-comment-length":"^0.9.2","eslint-plugin-jsdoc":"^40.1.0",eventemitter3:"^4.0.7","gatsby-plugin-vercel":"^1.0.3","html-react-parser":"^1.4.12",lodash:"^4.17.21","mixpanel-browser":"^2.45.0","ts-deepmerge":"^6.0.2",tslib:"^2.5.3","use-deep-compare-effect":"^1.8.1"};var devDependencies={"@mdx-js/mdx":"^1.6.22","@mdx-js/react":"^1.6.22","@react-icons/all-files":"^4.1.0","@rollup/plugin-commonjs":"^18.0.0","@rollup/plugin-json":"^4.1.0","@rollup/plugin-node-resolve":"^11.2.1","@rollup/plugin-replace":"^5.0.2","@size-limit/preset-big-lib":"^8.2.6","@testing-library/dom":"^7.31.0","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^11.2.7","@testing-library/user-event":"^13.1.8","@types/jest":"^22.2.3","@types/mixpanel-browser":"^2.35.6","@types/react-test-renderer":"^17.0.1","@typescript-eslint/eslint-plugin":"^4.6.0","@typescript-eslint/parser":"^4.6.0",asciidoctor:"^2.2.1","babel-jest":"^26.6.3","babel-preset-gatsby":"^1.10.0","command-line-args":"^5.1.1",coveralls:"^3.1.0","current-git-branch":"^1.1.0","dts-bundle":"^0.7.3",eslint:"^7.12.1","eslint-config-airbnb-base":"^14.2.0","eslint-config-prettier":"^6.15.0","eslint-import-resolver-typescript":"^2.3.0","eslint-plugin-import":"^2.22.1","eslint-plugin-prettier":"^3.1.4","eslint-plugin-react-hooks":"^4.2.0","fs-extra":"^10.0.0",gatsby:"3.13.1","gatsby-plugin-algolia":"^0.22.2","gatsby-plugin-catch-links":"^3.1.0","gatsby-plugin-env-variables":"^2.1.0","gatsby-plugin-intl":"^0.3.3","gatsby-plugin-manifest":"^3.2.0","gatsby-plugin-output":"^0.1.3","gatsby-plugin-sass":"6.7.0","gatsby-plugin-sitemap":"^4.10.0","gatsby-source-filesystem":"3.1.0","gatsby-transformer-asciidoc":"2.1.0","gatsby-transformer-rehype":"2.0.0","gh-pages":"^3.1.0","highlight.js":"^10.6.0","html-to-text":"^8.0.0","identity-obj-proxy":"^3.0.0","istanbul-merge":"^1.1.1",jest:"^26.6.3","jest-puppeteer":"^4.4.0",jsdom:"^17.0.0","node-sass":"^8.0.0",prettier:"2.1.2",puppeteer:"^7.0.1",react:"^16.14.0","react-dom":"^16.14.0","react-resizable":"^1.11.0","react-resize-detector":"^6.6.0","react-test-renderer":"^17.0.2","react-use-flexsearch":"^0.1.1",rollup:"2.30.0","rollup-plugin-typescript2":"0.27.3","ts-jest":"^26.5.5","ts-loader":"8.0.4",typedoc:"0.21.6","typedoc-plugin-toc-group":"thoughtspot/typedoc-plugin-toc-group",typescript:"^4.9.4","url-search-params-polyfill":"^8.1.0",util:"^0.12.4"};var author="ThoughtSpot";var email="support@thoughtspot.com";var license="ThoughtSpot Development Tools End User License Agreement";var directories={lib:"lib"};var repository={type:"git",url:"git+https://github.com/thoughtspot/visual-embed-sdk.git"};var publishConfig={registry:"https://registry.npmjs.org"};var keywords=["thoughtspot","everywhere","embed","sdk","analytics"];var bugs={url:"https://github.com/thoughtspot/visual-embed-sdk/issues"};var homepage="https://github.com/thoughtspot/visual-embed-sdk#readme";var globals={window:{}};var pkgInfo = {name:name,version:version,description:description,module:module,main:main,types:types,files:files,exports:exports$1,typesVersions:typesVersions,"size-limit":[{path:"dist/tsembed.js",limit:"40 kB"}],scripts:scripts,peerDependencies:peerDependencies,dependencies:dependencies,devDependencies:devDependencies,author:author,email:email,license:license,directories:directories,repository:repository,publishConfig:publishConfig,keywords:keywords,bugs:bugs,homepage:homepage,globals:globals};
10643
+ var name="@thoughtspot/visual-embed-sdk";var version="1.24.0-preRender.0";var description="ThoughtSpot Embed SDK";var module="lib/src/index.js";var main="dist/tsembed.js";var types="lib/src/index.d.ts";var files=["dist/**","lib/**","src/**","cjs/**"];var exports$1={".":{"import":"./lib/src/index.js",require:"./cjs/src/index.js",types:"./lib/src/index.d.ts"},"./react":{"import":"./lib/src/react/all-types-export.js",require:"./cjs/src/react/all-types-export.js",types:"./lib/src/react/all-types-export.d.ts"},"./lib/src/react":{"import":"./lib/src/react/all-types-export.js",require:"./cjs/src/react/all-types-export.js",types:"./lib/src/react/all-types-export.d.ts"}};var typesVersions={"*":{react:["./lib/src/react/all-types-export.d.ts"]}};var scripts={lint:"eslint 'src/**'","lint:fix":"eslint 'src/**/*.*' --fix",tsc:"tsc -p . --incremental false; tsc -p . --incremental false --module commonjs --outDir cjs",start:"gatsby develop","build:gatsby":"npm run clean:gatsby && gatsby build --prefix-paths","build:gatsby:noprefix":"npm run clean:gatsby && gatsby build","serve:gatsby":"gatsby serve","clean:gatsby":"gatsby clean","build-and-publish":"npm run build:gatsby && npm run publish","bundle-dts-file":"dts-bundle --name @thoughtspot/visual-embed-sdk --out visual-embed-sdk.d.ts --main lib/src/index.d.ts","bundle-dts":"dts-bundle --name ../../dist/visual-embed-sdk --main lib/src/index.d.ts --outputAsModuleFolder=true","bundle-dts-react":"dts-bundle --name ../../../dist/visual-embed-sdk-react --main lib/src/react/index.d.ts --outputAsModuleFolder=true","bundle-dts-react-full":"dts-bundle --name ../../../dist/visual-embed-sdk-react-full --main lib/src/react/all-types-export.d.ts --outputAsModuleFolder=true",build:"rollup -c",watch:"rollup -cw","docs-cmd":"node scripts/gatsby-commands.js",docgen:"typedoc --tsconfig tsconfig.json --theme typedoc-theme","test-sdk":"jest -c jest.config.sdk.js --runInBand","test-docs":"jest -c jest.config.docs.js",test:"npm run test-sdk && npm run test-docs",posttest:"cat ./coverage/sdk/lcov.info | coveralls","is-publish-allowed":"node scripts/is-publish-allowed.js",prepublishOnly:"npm run tsc && npm run bundle-dts-file && npm run bundle-dts && npm run bundle-dts-react && npm run bundle-dts-react-full && npm run build","check-size":"npm run build && size-limit","publish-dev":"npm publish --tag dev","publish-prod":"npm publish --tag latest"};var peerDependencies={react:"> 16.8.0","react-dom":"> 16.8.0"};var dependencies={algoliasearch:"^4.10.5",classnames:"^2.3.1",dompurify:"^2.3.4","eslint-plugin-comment-length":"^0.9.2","eslint-plugin-jsdoc":"^40.1.0",eventemitter3:"^4.0.7","gatsby-plugin-vercel":"^1.0.3","html-react-parser":"^1.4.12",lodash:"^4.17.21","mixpanel-browser":"^2.45.0","ts-deepmerge":"^6.0.2",tslib:"^2.5.3","use-deep-compare-effect":"^1.8.1"};var devDependencies={"@mdx-js/mdx":"^1.6.22","@mdx-js/react":"^1.6.22","@react-icons/all-files":"^4.1.0","@rollup/plugin-commonjs":"^18.0.0","@rollup/plugin-json":"^4.1.0","@rollup/plugin-node-resolve":"^11.2.1","@rollup/plugin-replace":"^5.0.2","@size-limit/preset-big-lib":"^8.2.6","@testing-library/dom":"^7.31.0","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^11.2.7","@testing-library/user-event":"^13.1.8","@types/jest":"^22.2.3","@types/mixpanel-browser":"^2.35.6","@types/react-test-renderer":"^17.0.1","@typescript-eslint/eslint-plugin":"^4.6.0","@typescript-eslint/parser":"^4.6.0",asciidoctor:"^2.2.1","babel-jest":"^26.6.3","babel-preset-gatsby":"^1.10.0","command-line-args":"^5.1.1",coveralls:"^3.1.0","current-git-branch":"^1.1.0","dts-bundle":"^0.7.3",eslint:"^7.12.1","eslint-config-airbnb-base":"^14.2.0","eslint-config-prettier":"^6.15.0","eslint-import-resolver-typescript":"^2.3.0","eslint-plugin-import":"^2.22.1","eslint-plugin-prettier":"^3.1.4","eslint-plugin-react-hooks":"^4.2.0","fs-extra":"^10.0.0",gatsby:"3.13.1","gatsby-plugin-algolia":"^0.22.2","gatsby-plugin-catch-links":"^3.1.0","gatsby-plugin-env-variables":"^2.1.0","gatsby-plugin-intl":"^0.3.3","gatsby-plugin-manifest":"^3.2.0","gatsby-plugin-output":"^0.1.3","gatsby-plugin-sass":"6.7.0","gatsby-plugin-sitemap":"^4.10.0","gatsby-source-filesystem":"3.1.0","gatsby-transformer-asciidoc":"2.1.0","gatsby-transformer-rehype":"2.0.0","gh-pages":"^3.1.0","highlight.js":"^10.6.0","html-to-text":"^8.0.0","identity-obj-proxy":"^3.0.0","istanbul-merge":"^1.1.1",jest:"^26.6.3","jest-fetch-mock":"^3.0.3",jsdom:"^17.0.0","node-sass":"^8.0.0",prettier:"2.1.2",react:"^16.14.0","react-dom":"^16.14.0","react-resizable":"^1.11.0","react-resize-detector":"^6.6.0","react-test-renderer":"^17.0.2","react-use-flexsearch":"^0.1.1",rollup:"2.30.0","rollup-plugin-typescript2":"0.27.3","ts-jest":"^26.5.5","ts-loader":"8.0.4",typedoc:"0.21.6","typedoc-plugin-toc-group":"thoughtspot/typedoc-plugin-toc-group",typescript:"^4.9.4","url-search-params-polyfill":"^8.1.0",util:"^0.12.4"};var author="ThoughtSpot";var email="support@thoughtspot.com";var license="ThoughtSpot Development Tools End User License Agreement";var directories={lib:"lib"};var repository={type:"git",url:"git+https://github.com/thoughtspot/visual-embed-sdk.git"};var publishConfig={registry:"https://registry.npmjs.org"};var keywords=["thoughtspot","everywhere","embed","sdk","analytics"];var bugs={url:"https://github.com/thoughtspot/visual-embed-sdk/issues"};var homepage="https://github.com/thoughtspot/visual-embed-sdk#readme";var globals={window:{}};var pkgInfo = {name:name,version:version,description:description,module:module,main:main,types:types,files:files,exports:exports$1,typesVersions:typesVersions,"size-limit":[{path:"dist/tsembed.js",limit:"40 kB"}],scripts:scripts,peerDependencies:peerDependencies,dependencies:dependencies,devDependencies:devDependencies,author:author,email:email,license:license,directories:directories,repository:repository,publishConfig:publishConfig,keywords:keywords,bugs:bugs,homepage:homepage,globals:globals};
10336
10644
 
10337
10645
  /**
10338
10646
  * Copyright (c) 2022
@@ -10364,6 +10672,7 @@
10364
10672
  class TsEmbed {
10365
10673
  constructor(domSelector, viewConfig) {
10366
10674
  this.isAppInitialized = false;
10675
+ this.embedComponentType = 'TsEmbed';
10367
10676
  /**
10368
10677
  * Should we encode URL Query Params using base64 encoding which thoughtspot
10369
10678
  * will generate for embedding. This provides additional security to
@@ -10373,6 +10682,7 @@
10373
10682
  */
10374
10683
  this.shouldEncodeUrlQueryParams = false;
10375
10684
  this.defaultHiddenActions = [exports.Action.ReportError];
10685
+ this.subscribedListeners = {};
10376
10686
  /**
10377
10687
  * Send Custom style as part of payload of APP_INIT
10378
10688
  *
@@ -10395,6 +10705,7 @@
10395
10705
  ? getRuntimeFilters(this.viewConfig.runtimeFilters)
10396
10706
  : null,
10397
10707
  hiddenHomepageModules: this.viewConfig.hiddenHomepageModules || [],
10708
+ reorderedHomepageModules: this.viewConfig.reorderedHomepageModules || [],
10398
10709
  hostConfig: this.embedConfig.hostConfig,
10399
10710
  hiddenHomeLeftNavItems: ((_a = this.viewConfig) === null || _a === void 0 ? void 0 : _a.hiddenHomeLeftNavItems)
10400
10711
  ? (_b = this.viewConfig) === null || _b === void 0 ? void 0 : _b.hiddenHomeLeftNavItems
@@ -10444,6 +10755,7 @@
10444
10755
  this.registerAppInit();
10445
10756
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
10446
10757
  ...viewConfig,
10758
+ embedComponentType: this.embedComponentType,
10447
10759
  });
10448
10760
  }
10449
10761
  /**
@@ -10512,23 +10824,36 @@
10512
10824
  * and executes the registered callbacks accordingly.
10513
10825
  */
10514
10826
  subscribeToEvents() {
10515
- window.addEventListener('message', (event) => {
10827
+ const messageEventListener = (event) => {
10516
10828
  const eventType = this.getEventType(event);
10517
10829
  const eventPort = this.getEventPort(event);
10518
10830
  const eventData = this.formatEventData(event, eventType);
10519
10831
  if (event.source === this.iFrame.contentWindow) {
10520
10832
  this.executeCallbacks(eventType, processEventData(eventType, eventData, this.thoughtSpotHost, this.el), eventPort);
10521
10833
  }
10522
- });
10523
- window.addEventListener('online', (e) => {
10834
+ };
10835
+ window.addEventListener('message', messageEventListener);
10836
+ const onlineEventListener = (e) => {
10524
10837
  this.trigger(exports.HostEvent.Reload);
10525
- });
10526
- window.addEventListener('offline', (e) => {
10838
+ };
10839
+ window.addEventListener('online', onlineEventListener);
10840
+ const offlineEventListener = (e) => {
10527
10841
  const offlineWarning = 'Network not Detected. Embed is offline. Please reconnect and refresh';
10528
10842
  this.executeCallbacks(exports.EmbedEvent.Error, {
10529
10843
  offlineWarning,
10530
10844
  });
10531
10845
  console.warn(offlineWarning);
10846
+ };
10847
+ window.addEventListener('offline', offlineEventListener);
10848
+ this.subscribedListeners = {
10849
+ message: messageEventListener,
10850
+ online: onlineEventListener,
10851
+ offline: offlineEventListener,
10852
+ };
10853
+ }
10854
+ unsubscribeToEvents() {
10855
+ Object.keys(this.subscribedListeners).forEach((key) => {
10856
+ window.removeEventListener(key, this.subscribedListeners[key]);
10532
10857
  });
10533
10858
  }
10534
10859
  /**
@@ -10706,8 +11031,10 @@
10706
11031
  *
10707
11032
  * @param url
10708
11033
  * @param frameOptions
11034
+ * @param showPreRender
11035
+ * @param showPreRenderByDefault
10709
11036
  */
10710
- async renderIFrame(url) {
11037
+ async renderIFrame(url, showPreRenderByDefault = false) {
10711
11038
  if (this.isError) {
10712
11039
  return null;
10713
11040
  }
@@ -10756,6 +11083,9 @@
10756
11083
  });
10757
11084
  if (this.isPreRendered) {
10758
11085
  this.insertIntoDOMForPreRender(this.iFrame);
11086
+ if (showPreRenderByDefault) {
11087
+ this.showPreRender();
11088
+ }
10759
11089
  }
10760
11090
  else {
10761
11091
  this.insertIntoDOM(this.iFrame);
@@ -10794,11 +11124,10 @@
10794
11124
  throw new Error('Pre render id is required');
10795
11125
  }
10796
11126
  const preRenderIds = this.getPreRenderIds();
10797
- const stalePreRenderWrapper = document.getElementById(preRenderIds.wrapper);
10798
- if (stalePreRenderWrapper) {
10799
- console.log('Found stale wrapper , removing');
10800
- stalePreRenderWrapper.remove();
10801
- }
11127
+ [preRenderIds.wrapper, preRenderIds.shield, preRenderIds.child]
11128
+ .map((id) => document.getElementById(id))
11129
+ .filter((element) => element)
11130
+ .forEach((existingElement) => existingElement.remove());
10802
11131
  const preRenderWrapper = document.createElement('div');
10803
11132
  preRenderWrapper.id = preRenderIds.wrapper;
10804
11133
  setStyleProperties(preRenderWrapper, { position: 'absolute', width: '100vw', height: '100vh' });
@@ -10813,7 +11142,7 @@
10813
11142
  this.preRenderChild = child;
10814
11143
  return preRenderWrapper;
10815
11144
  }
10816
- isPreRenderAvailable() {
11145
+ connectPreRendered() {
10817
11146
  const preRenderIds = this.getPreRenderIds();
10818
11147
  this.preRenderWrapper = this.preRenderWrapper
10819
11148
  || document.getElementById(preRenderIds.wrapper);
@@ -10821,6 +11150,10 @@
10821
11150
  || document.getElementById(preRenderIds.shield);
10822
11151
  this.preRenderChild = this.preRenderChild
10823
11152
  || document.getElementById(preRenderIds.child);
11153
+ this.iFrame = this.preRenderChild;
11154
+ return this.isPreRenderAvailable();
11155
+ }
11156
+ isPreRenderAvailable() {
10824
11157
  return !!this.preRenderWrapper && !!this.preRenderShield
10825
11158
  && !!this.preRenderChild;
10826
11159
  }
@@ -10863,18 +11196,23 @@
10863
11196
  top: '0',
10864
11197
  left: '0',
10865
11198
  });
11199
+ this.unsubscribeToEvents();
10866
11200
  }
10867
11201
  showPreRender() {
10868
11202
  if (!this.isPreRenderAvailable()) {
10869
- // if the Embed component is nor preRendered , Render it now and
10870
- // show it (hide is defalt behaviour)
10871
- console.log('No preRender found, creating new ');
10872
- this.render();
10873
- return;
11203
+ const isAvailable = this.connectPreRendered();
11204
+ if (!isAvailable) {
11205
+ // if the Embed component is nor preRendered , Render it now and
11206
+ // show it (hide is defalt behaviour)
11207
+ console.log('No preRender found, creating new ');
11208
+ this.preRender(true);
11209
+ return;
11210
+ }
10874
11211
  }
10875
11212
  this.syncPreRenderStyle();
10876
11213
  removeStyleProperties(this.preRenderWrapper, ['z-index', 'opacity', 'pointer-events']);
10877
11214
  setStyleProperties(this.preRenderShield, { zIndex: '-1' });
11215
+ this.subscribeToEvents();
10878
11216
  }
10879
11217
  syncPreRenderStyle() {
10880
11218
  if (!this.el) {
@@ -11102,7 +11440,7 @@
11102
11440
  /**
11103
11441
  * Creates the preRender shell
11104
11442
  */
11105
- preRender() {
11443
+ preRender(showPreRenderByDefault = false) {
11106
11444
  this.isPreRendered = true;
11107
11445
  return this;
11108
11446
  }
@@ -11179,8 +11517,8 @@
11179
11517
  *
11180
11518
  * @param iframeSrc
11181
11519
  */
11182
- renderV1Embed(iframeSrc) {
11183
- return this.renderIFrame(iframeSrc);
11520
+ renderV1Embed(iframeSrc, showPreRenderByDefault = false) {
11521
+ return this.renderIFrame(iframeSrc, showPreRenderByDefault);
11184
11522
  }
11185
11523
  getRootIframeSrc() {
11186
11524
  const queryParams = this.getEmbedParams();
@@ -11226,6 +11564,7 @@
11226
11564
  class SearchBarEmbed extends TsEmbed {
11227
11565
  constructor(domSelector, viewConfig) {
11228
11566
  super(domSelector);
11567
+ this.embedComponentType = 'SearchBarEmbed';
11229
11568
  this.viewConfig = viewConfig;
11230
11569
  }
11231
11570
  /**
@@ -11304,6 +11643,7 @@
11304
11643
  // eslint-disable-next-line no-useless-constructor
11305
11644
  constructor(domSelector, viewConfig) {
11306
11645
  super(domSelector, viewConfig);
11646
+ this.embedComponentType = 'SageEmbed';
11307
11647
  }
11308
11648
  /**
11309
11649
  * Constructs a map of parameters to be passed on to the
@@ -11355,12 +11695,18 @@
11355
11695
  /**
11356
11696
  * Render the embedded ThoughtSpot Sage
11357
11697
  *
11698
+ * @param showPreRenderByDefault
11358
11699
  * @returns {SageEmbed} Eureka/Sage embed
11359
11700
  */
11360
- render() {
11701
+ render(showPreRenderByDefault = false) {
11361
11702
  super.render();
11362
11703
  const src = this.getIFrameSrc();
11363
- this.renderV1Embed(src);
11704
+ this.renderV1Embed(src, showPreRenderByDefault);
11705
+ return this;
11706
+ }
11707
+ preRender(showPreRenderByDefault = false) {
11708
+ super.preRender(showPreRenderByDefault);
11709
+ this.render(showPreRenderByDefault);
11364
11710
  return this;
11365
11711
  }
11366
11712
  }
@@ -11388,6 +11734,7 @@
11388
11734
  class SearchEmbed extends TsEmbed {
11389
11735
  constructor(domSelector, viewConfig) {
11390
11736
  super(domSelector);
11737
+ this.embedComponentType = 'SearchEmbed';
11391
11738
  this.viewConfig = viewConfig;
11392
11739
  }
11393
11740
  /**
@@ -11468,12 +11815,14 @@
11468
11815
  }
11469
11816
  /**
11470
11817
  * Render the embedded ThoughtSpot search
11818
+ *
11819
+ * @param showPreRenderByDefault
11471
11820
  */
11472
- render() {
11821
+ render(showPreRenderByDefault = false) {
11473
11822
  super.render();
11474
11823
  const { answerId } = this.viewConfig;
11475
11824
  const src = this.getIFrameSrc(answerId);
11476
- this.renderIFrame(src);
11825
+ this.renderIFrame(src, showPreRenderByDefault);
11477
11826
  getAuthPromise().then(() => {
11478
11827
  if (checkReleaseVersionInBeta(getReleaseVersion(), getEmbedConfig().suppressSearchEmbedBetaWarning)) {
11479
11828
  alert(ERROR_MESSAGE.SEARCHEMBED_BETA_WRANING_MESSAGE);
@@ -11481,6 +11830,11 @@
11481
11830
  });
11482
11831
  return this;
11483
11832
  }
11833
+ preRender(showPreRenderByDefault = false) {
11834
+ super.preRender(showPreRenderByDefault);
11835
+ this.render(showPreRenderByDefault);
11836
+ return this;
11837
+ }
11484
11838
  }
11485
11839
 
11486
11840
  /**
@@ -11533,6 +11887,7 @@
11533
11887
  constructor(domSelector, viewConfig) {
11534
11888
  super(domSelector, viewConfig);
11535
11889
  this.defaultHeight = '100%';
11890
+ this.embedComponentType = 'AppEmbed';
11536
11891
  /**
11537
11892
  * Set the iframe height as per the computed height received
11538
11893
  * from the ThoughtSpot app.
@@ -11684,10 +12039,15 @@
11684
12039
  * @param renderOptions An object containing the page ID
11685
12040
  * to be embedded.
11686
12041
  */
11687
- render() {
12042
+ render(showPreRenderByDefault = false) {
11688
12043
  super.render();
11689
12044
  const src = this.getIFrameSrc();
11690
- this.renderV1Embed(src);
12045
+ this.renderV1Embed(src, showPreRenderByDefault);
12046
+ return this;
12047
+ }
12048
+ preRender(showPreRenderByDefault = false) {
12049
+ super.preRender(showPreRenderByDefault);
12050
+ this.render(showPreRenderByDefault);
11691
12051
  return this;
11692
12052
  }
11693
12053
  }
@@ -11722,6 +12082,7 @@
11722
12082
  constructor(domSelector, viewConfig) {
11723
12083
  super(domSelector, viewConfig);
11724
12084
  this.defaultHeight = 500;
12085
+ this.embedComponentType = 'LiveboardEmbed';
11725
12086
  /**
11726
12087
  * Set the iframe height as per the computed height received
11727
12088
  * from the ThoughtSpot app.
@@ -11843,15 +12204,15 @@
11843
12204
  * @param renderOptions An object specifying the Liveboard ID,
11844
12205
  * visualization ID and the runtime filters.
11845
12206
  */
11846
- render() {
12207
+ render(showPreRenderByDefault = false) {
11847
12208
  super.render();
11848
12209
  const src = this.getIFrameSrc();
11849
- this.renderV1Embed(src);
12210
+ this.renderV1Embed(src, showPreRenderByDefault);
11850
12211
  return this;
11851
12212
  }
11852
- preRender() {
11853
- super.preRender();
11854
- this.render();
12213
+ preRender(showPreRenderByDefault = false) {
12214
+ super.preRender(showPreRenderByDefault);
12215
+ this.render(showPreRenderByDefault);
11855
12216
  return this;
11856
12217
  }
11857
12218
  navigateToLiveboard(liveboardId, vizId, activeTabId) {
@@ -11896,9 +12257,7 @@
11896
12257
  const tsEmbed = new EmbedConstructor(ref.current, deepMerge({
11897
12258
  insertAsSibling: viewConfig.insertAsSibling,
11898
12259
  frameParams: {
11899
- class: viewConfig.insertAsSibling
11900
- ? className || ''
11901
- : '',
12260
+ class: viewConfig.insertAsSibling ? className || '' : '',
11902
12261
  },
11903
12262
  }, viewConfig));
11904
12263
  Object.keys(listeners).forEach((eventName) => {
@@ -11926,9 +12285,7 @@
11926
12285
  }
11927
12286
  };
11928
12287
  }, [viewConfig, listeners]);
11929
- return ((viewConfig.insertAsSibling)
11930
- ? React__default['default'].createElement("span", { "data-testid": "tsEmbed", ref: ref, style: { position: 'absolute' } })
11931
- : React__default['default'].createElement("div", { "data-testid": "tsEmbed", ref: ref, className: className }));
12288
+ return viewConfig.insertAsSibling ? (React__default['default'].createElement("span", { "data-testid": "tsEmbed", ref: ref, style: { position: 'absolute' } })) : (React__default['default'].createElement("div", { "data-testid": "tsEmbed", ref: ref, className: className }));
11932
12289
  });
11933
12290
  /**
11934
12291
  * React component for Search Embed.
@@ -11959,6 +12316,7 @@
11959
12316
  * ```
11960
12317
  */
11961
12318
  const AppEmbed$1 = componentFactory(AppEmbed);
12319
+ const PreRenderedAppEmbed = componentFactory(AppEmbed, true);
11962
12320
  /**
11963
12321
  * React component for Liveboard embed.
11964
12322
  *
@@ -11976,6 +12334,8 @@
11976
12334
  */
11977
12335
  const LiveboardEmbed$1 = componentFactory(LiveboardEmbed);
11978
12336
  const PinboardEmbed = LiveboardEmbed$1;
12337
+ const PreRenderedLiveboardEmbed = componentFactory(LiveboardEmbed, true);
12338
+ const PreRenderedPinboardEmbed = PreRenderedLiveboardEmbed;
11979
12339
  /**
11980
12340
  * React component for Search bar embed.
11981
12341
  *
@@ -11990,6 +12350,7 @@
11990
12350
  * ```
11991
12351
  */
11992
12352
  const SearchBarEmbed$1 = componentFactory(SearchBarEmbed);
12353
+ const PreRenderedSearchBarEmbed = componentFactory(SearchBarEmbed, true);
11993
12354
  /**
11994
12355
  * React component for LLM based search Sage embed.
11995
12356
  *
@@ -12004,6 +12365,7 @@
12004
12365
  * ```
12005
12366
  */
12006
12367
  const SageEmbed$1 = componentFactory(SageEmbed);
12368
+ const PreRenderedSageEmbed = componentFactory(SageEmbed, true);
12007
12369
  /**
12008
12370
  * Get a reference to the embed component to trigger events on the component.
12009
12371
  *
@@ -12023,13 +12385,16 @@
12023
12385
  */
12024
12386
  function useEmbedRef() {
12025
12387
  return React__default['default'].useRef(null);
12026
- }
12027
- const PreRenderedLiveboardEmbed = componentFactory(LiveboardEmbed, true);
12388
+ }
12028
12389
 
12029
12390
  exports.AppEmbed = AppEmbed$1;
12030
12391
  exports.LiveboardEmbed = LiveboardEmbed$1;
12031
12392
  exports.PinboardEmbed = PinboardEmbed;
12393
+ exports.PreRenderedAppEmbed = PreRenderedAppEmbed;
12032
12394
  exports.PreRenderedLiveboardEmbed = PreRenderedLiveboardEmbed;
12395
+ exports.PreRenderedPinboardEmbed = PreRenderedPinboardEmbed;
12396
+ exports.PreRenderedSageEmbed = PreRenderedSageEmbed;
12397
+ exports.PreRenderedSearchBarEmbed = PreRenderedSearchBarEmbed;
12033
12398
  exports.SageEmbed = SageEmbed$1;
12034
12399
  exports.SearchBarEmbed = SearchBarEmbed$1;
12035
12400
  exports.SearchEmbed = SearchEmbed$1;