From 06f1780870412fd919ce441023c96dacbd57e9d7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 11 May 2026 18:03:53 +0530 Subject: [PATCH 01/61] version link update --- src/configs/doc-configs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index 25eeb2d1d..b31f15d4a 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -48,10 +48,10 @@ module.exports = { }, VERSION_DROPDOWN: [ { - label: '26.5.0.cl', + label: '26.4.0.cl', link: ' ', subLabel: 'Cloud (Latest)', - iframeUrl: 'https://developer-docs-26-5-0-cl.vercel.app/docs/', + iframeUrl: 'https://developer-docs-26-4-0-cl.vercel.app/docs/', }, { label: '26.5.0.cl', From f6e5b1e928cb0750d3a3402485c72ced34dd95fd Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 11 May 2026 18:20:30 +0530 Subject: [PATCH 02/61] css update --- src/components/AnnouncementBanner/index.scss | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/AnnouncementBanner/index.scss b/src/components/AnnouncementBanner/index.scss index fdeac7f55..febd9aebb 100644 --- a/src/components/AnnouncementBanner/index.scss +++ b/src/components/AnnouncementBanner/index.scss @@ -12,7 +12,7 @@ .announcementBanner__link { color: #fff; - font-weight: 600; + font-weight: 400; text-decoration: underline; } @@ -37,15 +37,16 @@ } .announcementBanner__content { - font-size: 16px; + font-size: 15px; line-height: 20px; text-align: center; flex: 1 1 auto; - font-weight: 600; + font-weight: 400; } .announcementBanner__link { - font-size: 16px; + font-size: 15px; + font-weight: 400; } .announcementBanner__close { From eee97b5202474b7872b3064e842feee870544a10 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 11 May 2026 18:22:53 +0530 Subject: [PATCH 03/61] note update --- modules/ROOT/pages/full-app-customize.adoc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/full-app-customize.adoc b/modules/ROOT/pages/full-app-customize.adoc index 07366a97a..44d9e2530 100644 --- a/modules/ROOT/pages/full-app-customize.adoc +++ b/modules/ROOT/pages/full-app-customize.adoc @@ -8,11 +8,10 @@ The Visual Embed SDK provides several controls to customize the embedded view, including setting the default landing page, navigation style, visibility of modules and menu items, and more. -[div announcementBlock] --- [IMPORTANT] +==== The classic (V1) experience and V2 experience modes will be deprecated in an upcoming release in 2026. Therefore, ThoughtSpot recommends upgrading the UI experience of your full application embedding to the V3 experience. --- +==== == UI experience modes ThoughtSpot application supports the following UI experience modes: From f88ee8dfb9bd6fa24377f8f2557d48baa33c6cdc Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 11 May 2026 18:35:31 +0530 Subject: [PATCH 04/61] version drop-down --- src/configs/doc-configs.js | 46 +------------------------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index b31f15d4a..73c1e96d1 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -47,56 +47,12 @@ module.exports = { DEV: 'dev', }, VERSION_DROPDOWN: [ - { - label: '26.4.0.cl', - link: ' ', - subLabel: 'Cloud (Latest)', - iframeUrl: 'https://developer-docs-26-4-0-cl.vercel.app/docs/', - }, { label: '26.5.0.cl', link: '26.5.0.cl', - subLabel: 'Coming soon', + subLabel: 'Cloud (Latest)', iframeUrl: 'https://developer-docs-26-5-0-cl.vercel.app/docs/', }, - { - label: '26.3.0.cl', - link: '26.3.0.cl', - subLabel: 'Cloud', - iframeUrl: 'https://developer-docs-26-3-0-cl.vercel.app/docs/', - }, - { - label: '26.2.0.cl', - link: '26.2.0.cl', - subLabel: 'Cloud', - iframeUrl: 'https://developer-docs-26-2-0-cl.vercel.app/docs/', - }, - { - label: '10.15.0.cl', - link: '10.15.0.cl', - subLabel: 'Cloud', - iframeUrl: 'https://developer-docs-10-15-0-cl.vercel.app/docs/', - }, - { - label: '26.3.0.sw', - link: '26.3.0.sw', - subLabel: 'Software (Latest)', - iframeUrl: 'https://visual-embed-sdk-26-3.vercel.app/docs/', - }, - - { - label: '10.10.0.sw', - link: '10.10.0.sw', - subLabel: 'Software', - iframeUrl: 'https://visual-embed-sdk-10-10.vercel.app/docs/', - }, - { - label: '10.1.0.sw', - link: '10.1.0.sw', - subLabel: 'Software', - iframeUrl: 'https://visual-embed-sdk-10-1.vercel.app/docs/', - }, - ], CUSTOM_PAGE_ID: { API_PLAYGROUND: 'restV2-playground', From 86babe52aec4f12f402e69d807e592c4d346fdd1 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 11 May 2026 19:16:03 +0530 Subject: [PATCH 05/61] iframe header fix --- src/components/DevDocTemplate/index.tsx | 30 ++++++++++++++++--------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/components/DevDocTemplate/index.tsx b/src/components/DevDocTemplate/index.tsx index 1999c5141..997eace44 100644 --- a/src/components/DevDocTemplate/index.tsx +++ b/src/components/DevDocTemplate/index.tsx @@ -157,6 +157,12 @@ const DevDocTemplate: FC = (props) => { version.iframeUrl === props?.pageContext?.iframeUrl, ); + // True when loaded inside a VersionIframe (outer shell sets ?_iframe=1). + // Outer shell already renders SecondaryHeader, so suppress ours to avoid duplication. + const isIframeMode = + typeof window !== 'undefined' && + new URLSearchParams(location.search).get('_iframe') === '1'; + const isGQPlayGround = params[TS_PAGE_ID_PARAM] === CUSTOM_PAGE_ID.GQ_PLAYGROUND; const isPlayGround = @@ -717,20 +723,24 @@ const DevDocTemplate: FC = (props) => { : { height: '0px' } } > - + {!isIframeMode && ( + + )}
} style={ - !isPublicSiteOpen - ? { height: 'calc(100lvh - 44px)' } - : { height: 'calc(100lvh - 65px - 44px)' } + isIframeMode + ? { height: '100lvh' } + : !isPublicSiteOpen + ? { height: 'calc(100lvh - 44px)' } + : { height: 'calc(100lvh - 65px - 44px)' } } > {isPlayGround ? ( From d1a77355406017263511fca94279d5820897210f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 11 May 2026 20:13:53 +0530 Subject: [PATCH 06/61] version iframe header --- src/components/DevDocTemplate/index.tsx | 29 +++++++++---------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/components/DevDocTemplate/index.tsx b/src/components/DevDocTemplate/index.tsx index 997eace44..a1e1ad89b 100644 --- a/src/components/DevDocTemplate/index.tsx +++ b/src/components/DevDocTemplate/index.tsx @@ -157,11 +157,6 @@ const DevDocTemplate: FC = (props) => { version.iframeUrl === props?.pageContext?.iframeUrl, ); - // True when loaded inside a VersionIframe (outer shell sets ?_iframe=1). - // Outer shell already renders SecondaryHeader, so suppress ours to avoid duplication. - const isIframeMode = - typeof window !== 'undefined' && - new URLSearchParams(location.search).get('_iframe') === '1'; const isGQPlayGround = params[TS_PAGE_ID_PARAM] === CUSTOM_PAGE_ID.GQ_PLAYGROUND; @@ -723,24 +718,20 @@ const DevDocTemplate: FC = (props) => { : { height: '0px' } } > - {!isIframeMode && ( - - )} +
} style={ - isIframeMode - ? { height: '100lvh' } - : !isPublicSiteOpen - ? { height: 'calc(100lvh - 44px)' } - : { height: 'calc(100lvh - 65px - 44px)' } + !isPublicSiteOpen + ? { height: 'calc(100lvh - 44px)' } + : { height: 'calc(100lvh - 65px - 44px)' } } > {isPlayGround ? ( From da2e53ffb2ba8804a930d26f3eb18d2c2c7a859f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 11 May 2026 20:37:07 +0530 Subject: [PATCH 07/61] version drop-down css fixes --- src/components/Dropdown/index.scss | 156 +++++++++++++++++++++-------- src/components/Dropdown/index.tsx | 48 ++++++--- src/components/Header/index.scss | 67 +------------ 3 files changed, 148 insertions(+), 123 deletions(-) diff --git a/src/components/Dropdown/index.scss b/src/components/Dropdown/index.scss index fd8a2d04b..7add63496 100644 --- a/src/components/Dropdown/index.scss +++ b/src/components/Dropdown/index.scss @@ -2,78 +2,136 @@ .dropdownWrapper { padding: 10px; + .dropdown { - overflow: hidden; - @media screen and (min-width: $tablet-resolution-min) and (max-width: $tablet-resolution-max) { - padding-right: 0px; - margin-right: 0px; - } + overflow: visible; + position: relative; } - .dropdown .dropbtn { + .dropbtn { + display: inline-flex; + align-items: center; + gap: 6px; font-size: 15px; font-weight: 400; border: none; outline: none; color: rgba(255, 255, 255, 0.85); - background-color: inherit; + background-color: transparent; margin-left: 20px; margin-right: 5px; padding: 6px 10px; + cursor: pointer; + font-family: 'Optimo-Plain'; + border-radius: 6px; + transition: background 0.15s ease, color 0.15s ease; + + &:hover { + background: rgba(255, 255, 255, 0.1); + color: #A9E8FF; + } + } + + .arrowDown { + width: 13px; + height: 13px; + margin-left: 2px; + vertical-align: middle; + transition: transform 0.15s ease; + } + + .dropdown:hover .arrowDown { + transform: rotate(180deg); } + /* Panel revealed on hover */ .dropdownContent { display: none; position: absolute; - background-color: #f5f5f5; - border: solid 0.5px #d3d3d3; - min-width: 8rem; - box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); - z-index: 1; - right: 80px; - padding: 10px 0 10px 0; + top: 100%; + right: 0; + left: auto; + padding-top: 6px; + z-index: 200; } - .dropdownContent > div { - float: none; - cursor: pointer; - color: var(--header-link-color); - padding: 8px 16px; - text-decoration: none; + .dropdown:hover .dropdownContent { display: block; - text-align: left; - font-size: $font-size-home; } - .dropdownContent div:hover { - color: var(--secondary-color); + /* Two-column panel — mirrors .header-dropdown-menu-panel */ + .version-panel { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 0; + background: var(--nav-bar-color, #232F43); + border: 1px solid #458; + box-shadow: 0 8px 24px rgba(68, 85, 136, 0.35); + border-radius: 10px; + padding: 6px; + animation: versionDropdownFadeIn 0.15s ease; + white-space: nowrap; } - .dropdown:hover .dropdownContent { - display: block; + .version-section { + flex: 1; + min-width: 140px; } - .arrowDown { - height: 0.8rem; - width: 0.8rem; - vertical-align: middle; - margin-left: 15px; + .version-section-label { + font-size: 10px; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: rgba(255, 255, 255, 0.35); + padding: 8px 12px 3px; } - .subLabel { - font-size: $font-size-small; - font-weight: $font-weight-normal; - padding: 3px 0px; + + .version-col-divider { + width: 1px; + background: rgba(255, 255, 255, 0.08); + align-self: stretch; + margin: 6px 4px; + flex-shrink: 0; } - .hide { - display: none; + + .version-item { + display: flex; + flex-direction: column; + cursor: pointer; + color: rgba(255, 255, 255, 0.8); + border-radius: 6px; + padding: 8px 12px; + transition: background 0.1s ease, color 0.1s ease; + + &:hover { + background: rgba(169, 232, 255, 0.08); + color: #A9E8FF; + + .version-item-sub { color: rgba(169, 232, 255, 0.5); } + } + + &.active { + .version-item-label { color: #A9E8FF; } + } } - .versionLabel { - padding-right: 20px; - cursor: default; - font-size: 15px; - font-weight: 400; - user-select: none; + + .version-item-label { + font-size: 14px; + font-weight: 500; + color: inherit; + line-height: 1.3; + } + + .version-item-sub { + font-size: 11.5px; + color: rgba(255, 255, 255, 0.4); + line-height: 1.3; + margin-top: 1px; + transition: color 0.1s ease; } + .dropdownContainer { display: flex; color: $white; @@ -84,6 +142,7 @@ @media screen and (max-width: $mobile-resolution-max) { .dropdownWrapper { min-width: 6rem; + .dropdownContent { right: 5px; } @@ -94,3 +153,14 @@ } } } + +@keyframes versionDropdownFadeIn { + from { + opacity: 0; + transform: translateY(-4px); + } + to { + opacity: 1; + transform: translateY(0); + } +} diff --git a/src/components/Dropdown/index.tsx b/src/components/Dropdown/index.tsx index c5d46cb67..8673e7926 100644 --- a/src/components/Dropdown/index.tsx +++ b/src/components/Dropdown/index.tsx @@ -95,7 +95,6 @@ const Dropdown = (props: { location: Location; isMobile: boolean }) => { // Handle latest version (empty or space link) if (link === ' ' || link === '') { - // If we're in /docs, stay in /docs for the latest version if (currentPath.startsWith('/docs')) { window?.location?.assign('/docs'); } else { @@ -116,6 +115,26 @@ const Dropdown = (props: { location: Location; isMobile: boolean }) => { } }; + const cloudVersions = options.filter((o) => o.label.endsWith('.cl')); + const swVersions = options.filter((o) => o.label.endsWith('.sw')); + + const renderVersionItem = (d: VersionOption) => { + const isActive = d.label === currentVersion?.label; + return ( +
handelClick(d)} + > + {d.label} + {d.subLabel && ( + {d.subLabel} + )} +
+ ); + }; + return (
@@ -125,20 +144,21 @@ const Dropdown = (props: { location: Location; isMobile: boolean }) => {
- {options.map((d) => { - return ( -
handelClick(d)} - > - {d?.label} -
- {d?.subLabel} +
+
+
Cloud
+ {cloudVersions.map(renderVersionItem)} +
+ {swVersions.length > 0 && ( + <> +
+
+
Software
+ {swVersions.map(renderVersionItem)}
-
- ); - })} + + )} +
diff --git a/src/components/Header/index.scss b/src/components/Header/index.scss index 7a6b4fd57..c8d800792 100644 --- a/src/components/Header/index.scss +++ b/src/components/Header/index.scss @@ -270,7 +270,6 @@ header { padding-right: 20px; margin-right: 5px; - /* ── Version dropdown (legacy Dropdown component) ───────────── */ .dropdownWrapper { padding: 0; @@ -278,73 +277,9 @@ header { align-items: center; } - .dropdown { - position: relative; - overflow: visible; - } - - .dropdown .dropbtn { - display: inline-flex; - align-items: center; - gap: 6px; - padding: 6px 10px; + .dropbtn { margin-left: 0; - color: rgba(255, 255, 255, 0.85); font-size: 16px; - font-weight: 400; - cursor: pointer; - font-family: 'Optimo-Plain'; - border-radius: 6px; - transition: background 0.15s ease, color 0.15s ease; - - &:hover { - background: rgba(255, 255, 255, 0.1); - color: #A9E8FF; - } - } - - .arrowDown { - width: 13px; - height: 13px; - margin-left: 2px; - vertical-align: middle; - transition: transform 0.15s ease; - } - - .dropdown:hover .arrowDown { - transform: rotate(180deg); - } - - .dropdownContent { - right: 0; - left: auto; - background-color: var(--nav-bar-color, #232F43); - border: 1px solid #458; - box-shadow: 0 8px 24px rgba(68, 85, 136, 0.35); - border-radius: 10px; - padding: 6px; - min-width: 160px; - - & > div { - color: rgba(255, 255, 255, 0.8); - border-radius: 6px; - font-size: 14px; - padding: 8px 12px; - transition: background 0.1s ease, color 0.1s ease; - cursor: pointer; - - &:hover { - background: rgba(169, 232, 255, 0.08); - color: #A9E8FF; - } - } - - .subLabel { - font-size: 11.5px; - color: rgba(255, 255, 255, 0.4); - padding: 0; - margin-top: 1px; - } } } } From 334b8afd70cd2ee258d5145201c7aab614ea03a4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 12 May 2026 09:19:34 +0530 Subject: [PATCH 08/61] css fixes --- src/assets/styles/index.scss | 4 ++-- src/assets/styles/variables.scss | 2 +- src/components/LeftSidebar/index.scss | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 6bc712713..ad867b8ed 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -469,7 +469,7 @@ button { justify-content: space-between; margin: 10px; border-radius: 10px; - border: 1px solid var(--search-border-color); + border: 1px solid var(--border-color); &:hover { box-shadow: var(--box-shadow-hover); @@ -625,7 +625,7 @@ button { } .boxAuto { - border: 0.5px solid $disabledcolor; + border: 0.5px solid var(--border-color); height: auto; width: 100%; padding: 0 0 0 2px; diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss index ed68be159..252d5b52d 100644 --- a/src/assets/styles/variables.scss +++ b/src/assets/styles/variables.scss @@ -321,7 +321,7 @@ $tag-color-light: $lightgrey; --note-block-color: #1e2430; --note-border-color: #74daff; --var-important-color: #e22b3d; - --var-important-border-color: #1e2430; + --important-border-color: #30363d; --important-block-color: #1e2430; --var-docmap-nested-color: #8b949e; --sidebar-connector-color: #30363d; diff --git a/src/components/LeftSidebar/index.scss b/src/components/LeftSidebar/index.scss index d976c54aa..f2ee4bc10 100644 --- a/src/components/LeftSidebar/index.scss +++ b/src/components/LeftSidebar/index.scss @@ -93,7 +93,7 @@ .aside { padding: 0 0 0 10px; width: 100%; - border-right: 1px solid var(--search-border-color); + border-right: 1px solid var(--border-color); left: $gutter; height: 100%; overflow-y: auto; From 30a9174db156364181822f112df32c8d8a4857b6 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 12 May 2026 10:26:20 +0530 Subject: [PATCH 09/61] react embed example update --- modules/ROOT/pages/embed-action-ref.adoc | 193 ++++++----- modules/ROOT/pages/embed-ts-react-app.adoc | 370 ++++++++------------- 2 files changed, 237 insertions(+), 326 deletions(-) diff --git a/modules/ROOT/pages/embed-action-ref.adoc b/modules/ROOT/pages/embed-action-ref.adoc index 5fbf06799..3de09b126 100644 --- a/modules/ROOT/pages/embed-action-ref.adoc +++ b/modules/ROOT/pages/embed-action-ref.adoc @@ -20,7 +20,7 @@ The actions associated with the Liveboards are available in the Liveboard header |Action string in SDK | Required SDK library a|Action label in the UI |xref:Action.adoc#_addtofavorites[`Action.AddToFavorites`]| `LiveboardEmbed` + `AppEmbed` | The *Favorites* (star) icon on a Liveboard page. + - Allows adding a Liveboard to the user's favorites list. +Allows adding a Liveboard to the user's favorites list. |xref:Action.adoc#_aihighlights[`Action.AIHighlights`]|`LiveboardEmbed` + `AppEmbed` | The AI highlights button on a Liveboard page. + Displays quick insights on how top metrics changed in your Liveboard. + @@ -41,8 +41,9 @@ a| `LiveboardEmbed` + `AppEmbed` |The filter configuration options in the *Add Filters* modal. + Applies filters and allows configuring filters applied to a visualization on a Liveboard. -|xref:Action.adoc#_addparameter[`Action.AddParameter`]| `SearchBarEmbed` + -`AppEmbed`| The *Add Parameters* option in the top panel of the Liveboard + + +|xref:Action.adoc#_addparameter[`Action.AddParameter`]| `LiveboardEmbed` + +`AppEmbed`| The *Add Parameters* option in the top panel of the Liveboard. + Allows adding parameters to a Liveboard. |xref:Action.adoc#_addtab[`Action.AddTab`]|`LiveboardEmbed` + @@ -53,7 +54,8 @@ Allows adding a new tab to a Liveboard view. See also, xref:LiveboardViewConfig.adoc#_hideirrelevantchipsinliveboardtabs[hideIrrelevantChipsInLiveboardTabs]. |xref:Action.adoc#_disablechipreorder[`Action.DisableChipReorder`]|`LiveboardEmbed` + -`SearchEmbed` `AppEmbed` | Action ID for disabling filter chip reordering on a Liveboard. +`SearchEmbed` + +`AppEmbed` | Action ID for disabling filter chip reordering on a Liveboard. |xref:Action.adoc#_save[`Action.Save`]|`LiveboardEmbed` + `AppEmbed` | *Save* + @@ -69,12 +71,12 @@ Downloads the Liveboard as a PDF file. Presents a fullscreen Liveboard in the slideshow mode. |xref:Action.adoc#_schedule[`Action.Schedule`] xref:Action.adoc#_subscription[`Action.Subscription`]| `LiveboardEmbed` + -`AppEmbed` |**Schedule** + +`AppEmbed` |*Schedule* + Allows scheduling Liveboard notifications. + |xref:Action.adoc#_scheduleslist[`Action.SchedulesList`]| `LiveboardEmbed` + `AppEmbed` | *Manage schedules* + Allows you to manage scheduled Liveboard jobs. -Saves Liveboard modifications. |xref:Action.adoc#_liveboardinfo[`Action.LiveboardInfo`]|`LiveboardEmbed` + `AppEmbed` | *Show Liveboard details* + @@ -87,9 +89,9 @@ Displays information about the Liveboard. |xref:Action.adoc#_verifiedliveboard[`Action.VerifiedLiveboard`]| `LiveboardEmbed` + `AppEmbed` |The Liveboard verified banner text. + Indicates the Liveboard is verified. -See also, xref:LiveboardViewConfig.adoc#_showliveboardverifiedbadge[showLiveboardVerifiedBadge].| +See also, xref:LiveboardViewConfig.adoc#_showliveboardverifiedbadge[showLiveboardVerifiedBadge]. -xref:Action.adoc#_personalisedviewsdropdown[`Action.PersonalisedViewsDropdown`]| `LiveboardEmbed` + +|xref:Action.adoc#_personalisedviewsdropdown[`Action.PersonalisedViewsDropdown`]| `LiveboardEmbed` + `AppEmbed` | The Liveboard personalized views drop-down. + Available if personalized views are saved on the Liveboard. Allows switching between the saved personalized views of a Liveboard. @@ -98,16 +100,14 @@ Allows switching between the saved personalized views of a Liveboard. The *Approve* action visible to Liveboard verifiers. + Marks the Liveboard as approved. |xref:Action.adoc#_synctoslack[`Action.SyncToSlack`]| `LiveboardEmbed` + -`AppEmbed` | The *Sync to Slack* action on Liveboard visualizations. Allows sending data to third-party apps Slack. +`AppEmbed` | The *Sync to Slack* action on Liveboard visualizations. Allows sending data to Slack. |xref:Action.adoc#_synctoteams[`Action.SyncToTeams`]| `LiveboardEmbed` + -`AppEmbed` | The *Sync to Teams* action on Liveboard visualizations. Allows sending data to third-party apps Team. -//|xref:Action.adoc#_unsubscribeschedulehomepage[`Action.UnsubscribeScheduleHomepage`]|`LiveboardEmbed` + -//`AppEmbed` | Action ID to hide or disable the unsubscribe option for Liveboard schedules. +`AppEmbed` | The *Sync to Teams* action on Liveboard visualizations. Allows sending data to Microsoft Teams. |xref:Action.adoc#_tml[`Action.TML`]| `LiveboardEmbed` + -`AppEmbed` |Action ID for the Parent TML action The parent action *TML* must be included to access TML-related options within the cascading menu. -|xref:Action.adoc#_exporttml[`Action.ExportTML`]|`AppEmbed` + -`LiveboardEmbed`| *Export TML* + +`AppEmbed` | Action ID for the parent TML action. The parent action *TML* must be included to access TML-related options within the cascading menu. +|xref:Action.adoc#_exporttml[`Action.ExportTML`]|`LiveboardEmbed` + +`AppEmbed`| *Export TML* + Exports the TML representation of a Liveboard object from ThoughtSpot. The parent action *TML* must be included to access TML-related options within the cascading menu. |xref:Action.adoc#_updatetml[`Action.UpdateTML`]|`LiveboardEmbed` + `AppEmbed` | *Update Liveboard* + @@ -117,7 +117,6 @@ Allows importing the TML representation of a Liveboard object to ThoughtSpot. Th Allows editing the ThoughtSpot Modelling Language (TML) representation of a Liveboard object loaded on the ThoughtSpot server. The parent action *TML* must be included to access TML-related options within the cascading menu. |==== - [#liveboardv2-viz-actions] == Visualizations on a Liveboard The visualizations pinned to a Liveboard have the following types of actions: @@ -134,20 +133,18 @@ The following actions are available for ThoughtSpot visualizations **More** menu |=== |Action string in SDK| Required SDK library|Action label in the UI |xref:Action.adoc#_askai[`Action.AskAi`]| `LiveboardEmbed` + -`AppEmbed` | The Spotter button on a visualization. -Available if Spotter is enabled on your instance. -Allow users to initiate a conversation with Spotter. +`AppEmbed` | The Spotter button on a visualization. + +Available if Spotter is enabled on your instance. + +Allows users to initiate a conversation with Spotter. |xref:Action.adoc#_explore[`Action.Explore`] a| `LiveboardEmbed` + `AppEmbed` |*Explore* + Allows users to explore a visualization. |xref:Action.adoc#_createmonitor[`Action.CreateMonitor`]| `LiveboardEmbed` + `AppEmbed` | Alert icon + Allows you to schedule threshold-based alerts for KPI charts. - |xref:Action.adoc#_pin[`Action.Pin`]|`LiveboardEmbed` + `AppEmbed`|*Pin* + Pins a visualization to a Liveboard. - |xref:Action.adoc#_download[`Action.Download`]|`LiveboardEmbed` + `AppEmbed` a|*Download* + The **Download** menu action to download a visualization as a CSV, PNG, PDF, or XLSX file. + @@ -157,20 +154,20 @@ If you are using Visual Embed SDK version 1.21.0 or later, note the following be * If using `visibleActions` to show or hide actions on a visualization or Answer, include the following action enumerations along with `Action.Download` in the array: + ** `Action.DownloadAsCsv` + -//** `Action.DownloadAsPdf` + +** `Action.DownloadAsPdf` + ** `Action.DownloadAsXlsx` + ** `Action.DownloadAsPng` |xref:Action.adoc#_downloadascsv[`Action.DownloadAsCsv`]|`LiveboardEmbed` + `AppEmbed` |*Download* > *CSV* + Downloads the answer data in the CSV file format. -|xref:Action.adoc#_downloadasxlsx[`Action.DownloadAsXLSX`]|`LiveboardEmbed` + +|xref:Action.adoc#_downloadasxlsx[`Action.DownloadAsXlsx`]|`LiveboardEmbed` + `AppEmbed`| *Download* > *XLSX* + -Downloads the answer data in the XLSX file. -//|xref:Action.adoc#_downloadaspdf[`Action.DownloadAsPdf`]|`LiveboardEmbed` + -//`AppEmbed` |*Download* > *PDF* + -//Downloads the answer data as a PDF file. Available only for tables. +Downloads the answer data in the XLSX file format. +|xref:Action.adoc#_downloadaspdf[`Action.DownloadAsPdf`]|`LiveboardEmbed` + +`AppEmbed` |*Download* > *PDF* + +Downloads the answer data as a PDF file. Available only for tables. |xref:Action.adoc#_downloadaspng[`Action.DownloadAsPng`]|`LiveboardEmbed` + `AppEmbed` |*Download* > *PNG* + Downloads the chart as a PNG file. Available only for charts. @@ -189,6 +186,11 @@ Allows creating a sync to send data to external business apps such as Slack, Sal |xref:Action.adoc#_managepipelines[`Action.ManagePipelines`]|`LiveboardEmbed` + `AppEmbed`| The *Manage pipelines* action in the **More** actions menu. + Allows managing data sync pipelines to external business apps set as sync destinations in ThoughtSpot. +|xref:Action.adoc#_liveboardusers[`Action.LiveboardUsers`]|`LiveboardEmbed` + +`AppEmbed`| The *Viewers* panel inside the *Show Liveboard details* modal. + +Displays the list of users who have access to the Liveboard. + +Use this action ID to hide the viewers panel in the Liveboard details view. + +Available in SDK 1.26.0 and ThoughtSpot 9.7.0.cl or later. |xref:Action.adoc#_answerdelete[`Action.AnswerDelete`] |`LiveboardEmbed` + `AppEmbed`| *Delete* + Deletes the visualization from the Liveboard. @@ -205,20 +207,19 @@ The following actions are available in the contextual menu of visualizations on `AppEmbed` | *Filter* action in the contextual menu on a visualization. + Applies filters across visualizations for brushing and linking data on a Liveboard. |xref:Action.adoc#_removecrossfilter[`Action.RemoveCrossFilter`]| `LiveboardEmbed` + -`AppEmbed` | *Remove filter* option contextual menu on a visualization. + +`AppEmbed` | *Remove filter* option in the contextual menu on a visualization. + Removes the cross-filters applied on a visualization. |xref:Action.adoc#_drilldown[`Action.DrillDown`]|`LiveboardEmbed` + `AppEmbed`|*Drill down* + Allows drilling down on a data point in the visualization to get granular details. - -//|xref:Action.adoc#_drillexclude[`Action.DrillExclude`]|`LiveboardEmbed` + -//`AppEmbed`|*Exclude* + -//Allows you to exclude a specific data point on a search answer. -//|xref:Action.adoc#_drillinclude[`Action.DrillInclude`]|`LiveboardEmbed` + -//`AppEmbed` |*Include* + -//Allows you to include a specific data point on a search answer. +|xref:Action.adoc#_drillexclude[`Action.DrillExclude`]|`LiveboardEmbed` + +`AppEmbed`|*Exclude* + +Allows you to exclude a specific data point on a visualization. +|xref:Action.adoc#_drillinclude[`Action.DrillInclude`]|`LiveboardEmbed` + +`AppEmbed` |*Include* + +Allows you to include a specific data point on a visualization. |xref:Action.adoc#_answerchartswitcher[`Action.AnswerChartSwitcher`]| `LiveboardEmbed` + -`AppEmbed` | Chart switching toggle + +`AppEmbed` | Chart switching toggle. + Allows switching to the table or chart mode when editing a visualization. |xref:Action.adoc#_edittitle[`Action.EditTitle`]|`LiveboardEmbed` + `AppEmbed`|The visualization title edit icon. + @@ -226,12 +227,15 @@ Updates the title of the visualization. |xref:Action.adoc#_movetotab[`Action.MoveToTab`]|`LiveboardEmbed` + `AppEmbed`| The *Move to tab* action on a Liveboard in the edit mode. Allows moving a visualization to a different tab. |xref:Action.adoc#_spotiqanalyze[`Action.SpotIQAnalyze`]|`LiveboardEmbed` + -`AppEmbed`|**SpotIQ analyze** + +`AppEmbed`|*SpotIQ analyze* + Allows you to run SpotIQ analyses. |xref:Action.adoc#_showunderlyingdata[`Action.ShowUnderlyingData`] | `LiveboardEmbed` + `AppEmbed`| *Show underlying data* + Displays detailed information and raw data for a given visualization. +|xref:Action.adoc#_copytoclipboard[`Action.CopyToClipboard`]| `LiveboardEmbed` + +`AppEmbed`|*Copy to clipboard* + +Copies the selected data point. Available as a contextual menu action for table data. |=== == Spotter @@ -242,19 +246,23 @@ The following action IDs are available for the Spotter component: |===== |Action string in SDK| Required SDK library|Action label in the UI |xref:Action.adoc#_previewdataspotter[`Action.PreviewDataSpotter`] | `SpotterEmbed` + -`AppEmbed` |*Preview data* action on the Spotter conversation panel. +`AppEmbed` |*Preview data* action on the Spotter conversation panel. + Shows the underlying data used for Spotter queries. + |xref:Action.adoc#_resetspotterchat[`Action.ResetSpotterChat`] |`SpotterEmbed` + -`AppEmbed` | *Preview data* action on the Spotter conversation panel. -Shows the underlying data used for Spotter queries. +`AppEmbed` | The *Reset* button on the Spotter conversation panel. + +Clears the current Spotter conversation and starts a new session. + |xref:Action.adoc#_editpreviousprompt[`Action.EditPreviousPrompt`] |`SpotterEmbed` + -`AppEmbed` | The edit icon on the Spotter prompt panel. +`AppEmbed` | The edit icon on the Spotter prompt panel. + Allows editing the prompt sent to Spotter. -|xref:xref:Action.adoc#_deletepreviousprompt[`Action.DeletePreviousPrompt`] |`SpotterEmbed` + -`AppEmbed` | The delete icon on the Spotter prompt panel. + +|xref:Action.adoc#_deletepreviousprompt[`Action.DeletePreviousPrompt`] |`SpotterEmbed` + +`AppEmbed` | The delete icon on the Spotter prompt panel. + Allows deleting the prompt sent to Spotter. -|xref:xref:Action.adoc#_spotterfeedback[`Action.SpotterFeedback`] |`SpotterEmbed` + -`AppEmbed` | The Spotter feedback widget in the generated Answer. + +|xref:Action.adoc#_spotterfeedback[`Action.SpotterFeedback`] |`SpotterEmbed` + +`AppEmbed` | The Spotter feedback widget in the generated Answer. + Allows sending feedback about the response received from Spotter. |===== @@ -272,40 +280,40 @@ The following actions are available on saved Answers and the Answers generated b `SageEmbed` + `SearchEmbed` + `SearchBarEmbed` + -`AppEmbed`|The *Choose sources* option in the Search page and Spotter conversation panel. + -Allows selecting data sources to query data. + +`AppEmbed`|The *Choose sources* option in the Search page and Spotter conversation panel. + +Allows selecting data sources to query data. |xref:Action.adoc#_addformula[`Action.AddFormula`]| `SpotterEmbed` + `SageEmbed` + `SearchEmbed` + `SearchBarEmbed` + -`AppEmbed`| *Create formula* option on the data panel of an Answer page + -Allows adding formulas to a search query. + +`AppEmbed`| *Create formula* option on the data panel of an Answer page. + +Allows adding formulas to a search query. |xref:Action.adoc#_addparameter[`Action.AddParameter`]|`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + -`AppEmbed`| *Add Parameters* option in the data panel on a Search page + +`AppEmbed`| *Add Parameters* option in the data panel on a Search page. + Allows adding parameters to an Answer. |xref:Action.adoc#_answerchartswitcher[`Action.AnswerChartSwitcher`]|`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + -`AppEmbed` | Chart toggle icon + +`AppEmbed` | Chart toggle icon. + Allows switching to the table or chart mode. |xref:Action.adoc#_edit[`Action.Edit`]| `SpotterEmbed` + -`AppEmbed` | *Edit* action on charts and tables generated from a Spotter query. -Opens a table or chart in the edit mode. +`AppEmbed` | *Edit* action on charts and tables generated from a Spotter query. + +Opens a table or chart in the edit mode. |xref:Action.adoc#_pin[`Action.Pin`]| `SpotterEmbed` + `SageEmbed` + `SearchEmbed` + -`AppEmbed` | *Pin* action on the visualization generated from a Spotter query. +`AppEmbed` | *Pin* action on the visualization generated from a Spotter query. + Allows adding a visualization generated from Spotter to a Liveboard. |xref:Action.adoc#_save[`Action.Save`]| `SpotterEmbed` + `SageEmbed` + `SearchEmbed` + -`AppEmbed` | *Save* action on the visualization generated from a Spotter query -Saves the visualization generated from Spotter.| -xref:Action.adoc#_sageanswerfeedback[`Action.SageAnswerFeedback`]| `SageEmbed` + -`AppEmbed` | The feedback widget on the Answers generated from a Natural Language Search query. + +`AppEmbed` | *Save* action on the visualization generated from a Spotter query. + +Saves the visualization generated from Spotter. +|xref:Action.adoc#_sageanswerfeedback[`Action.SageAnswerFeedback`]| `SageEmbed` + +`AppEmbed` | The feedback widget on the Answers generated from a Natural Language Search query. + Allows sending feedback about the AI-generated Answer. |xref:Action.adoc#_editsageanswer[`Action.EditSageAnswer`]| `SageEmbed` + `AppEmbed` | Edit action for AI-generated Answer. @@ -324,16 +332,16 @@ Allows you to share an Answer with another user or group. `SageEmbed` + `SearchEmbed` + `AppEmbed` -a|The *Query visualizer* and *Query SQL* buttons in *Query details* on the Answer page + +a|The *Query visualizer* and *Query SQL* buttons in *Query details* on the Answer page. + * The *Query visualizer* button displays the tables and filters used in a search query. + -* The *Query SQL* button displays the SQL statements used in a search query to fetch data. + +* The *Query SQL* button displays the SQL statements used in a search query to fetch data. |xref:Action.adoc#_download[`Action.Download`]|`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + `AppEmbed` a|*Download* + -The **Download** action to download the Answer data +The **Download** action to download the Answer data. If you are using Visual Embed SDK version 1.21.0 or later to embed Liveboard, Search, or full app experience, note the following behavior: + @@ -350,7 +358,8 @@ If you are using Visual Embed SDK version 1.21.0 or later to embed Liveboard, Se `SearchEmbed` + `AppEmbed` |*Download* > *CSV* + Downloads the answer data in the CSV file format. -|xref:Action.adoc#_downloadasxlsx[`Action.DownloadAsXLSX`]|`SpotterEmbed` + + +|xref:Action.adoc#_downloadasxlsx[`Action.DownloadAsXlsx`]|`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + `AppEmbed` | @@ -371,13 +380,13 @@ Downloads the chart as a PNG file. Available only for charts. `SearchEmbed` + `AppEmbed`|*Show underlying data* + Displays detailed information and raw data for a given visualization. Available as a menu action in the *More* menu image:./images/icon-more-10px.png[the more options menu] and the contextual menu. -|xref:Action.adoc#_answerdelete[`Action.AnswerDelete`]| `AppEmbed`|**Delete** + +|xref:Action.adoc#_answerdelete[`Action.AnswerDelete`]| `AppEmbed`|*Delete* + Deletes the answer. |xref:Action.adoc#_synctosheets[`Action.SyncToSheets`]|`SageEmbed` + `SearchEmbed` + `AppEmbed`| The *Sync to sheets* action in the **More** actions menu. + -Allows creating a sync to send data to the Google Sheets app.| -xref:Action.adoc#_synctootherapps[`Action.SyncToOtherApps`] |`SageEmbed` + +Allows creating a sync to send data to the Google Sheets app. +|xref:Action.adoc#_synctootherapps[`Action.SyncToOtherApps`] |`SageEmbed` + `SearchEmbed` + `AppEmbed`| The *Sync to other apps* action in the **More** actions menu. + Allows creating a sync to send data to external business apps such as Slack, Salesforce, and Microsoft Teams. @@ -389,9 +398,9 @@ Allows managing data sync pipelines to external business apps set as sync destin `SageEmbed` + `SearchEmbed` + `AppEmbed` | *Export TML* + -Exports the TML representation of an answer from ThoughtSpot.| +Exports the TML representation of an answer from ThoughtSpot. -xref:Action.adoc#_edittml[`Action.EditTML`]|`AppEmbed` | *Edit TML* + +|xref:Action.adoc#_edittml[`Action.EditTML`]|`AppEmbed` | *Edit TML* + Allows editing the TML representation of the answer object. This action is available on the saved answers page. |xref:Action.adoc#_importtml[`Action.ImportTML`]|`AppEmbed` | *Import TML* + Allows importing the TML representation of an answer into ThoughtSpot. This action is available on the saved answers page. @@ -441,15 +450,14 @@ The SDK provides the following Action enumerations for the contextual menu actio `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` + -| *Aggregate* option in the chart axis or the table column customization menu. +| *Aggregate* option in the chart axis or the table column customization menu. + Provides aggregation options to analyze the data on a chart or table. |xref:Action.adoc#_axismenuconditionalformat[`Action.AxisMenuConditionalFormat`]| `SageEmbed` + `AppEmbed` + `SearchEmbed` + -`LiveboardEmbed` + | *Conditional formatting* menu option + +`LiveboardEmbed` | *Conditional formatting* menu option. + Allows adding rules for conditional formatting of data points on a chart or table. -| -xref:Action.adoc#_axismenuedit[`Action.AxisMenuEdit`]| `SageEmbed` + +|xref:Action.adoc#_axismenuedit[`Action.AxisMenuEdit`]| `SageEmbed` + `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Edit* action in the axis customization menu. + @@ -486,7 +494,7 @@ Removes the data labels from a chart or the column of a table visualization. `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Rename* option in the chart axis or table column customization menu. + -Renames axis label on a chart or the column header on a table +Renames axis label on a chart or the column header on a table. |xref:Action.adoc#_axismenusort[`Action.AxisMenuSort`]|`SageEmbed` + `AppEmbed` + `SearchEmbed` + @@ -512,9 +520,9 @@ The following actions are available on the *Liveboards* page in the full app emb [options='header'] |=== |Action string in SDK| Required SDK library|Action label in the UI -a|xref:Action.adoc#_share[`Action.Share`]|`AppEmbed` +| *Share* + +a|xref:Action.adoc#_share[`Action.Share`]|`AppEmbed` | *Share* + Allows sharing a Liveboard with another user or group. -a|xref:Action.adoc#_remove[`Action.Remove`]|`AppEmbed` +| *Delete* + +a|xref:Action.adoc#_remove[`Action.Remove`]|`AppEmbed` | *Delete* + Allows deleting a Liveboard. a|xref:Action.adoc#_createliveboard[`Action.CreateLiveboard`] a|`AppEmbed`| The *Create Liveboard* action on the Liveboards page. Allows users to create a Liveboard. a|xref:Action.adoc#_managetags[`Action.ManageTags`] a|`AppEmbed`| The *Manage Tags* action on the Liveboards page. @@ -530,12 +538,12 @@ The following actions are available on the *Search* page in the full app embedde [options='header'] |=== |Action string in SDK| Required SDK library|Action label in the UI -|xref:Action.adoc#_adddatapanelobjects[`Action.AddDataPanelObjects`]| `AppEmbed` +|The Add Data Panel Objects action on the data panel v2. Allows to show action menu to add different objects (such as formulas, Parameters) in data panel new experience. -|xref:Action.adoc#_collapsedatapanel[`Action.CollapseDataPanel`]| `AppEmbed` +| The Collapse data panel icon on the Search page. Collapses the data panel view. -|xref:Action.adoc#_addformula[`Action.AddFormula`]| `AppEmbed` +|The *Add* *Formula* action allows adding formulas to an Answer. -|xref:Action.adoc#_addparameter[`Action.AddParameter`]| `AppEmbed` +| The *Add* *Parameter* action allows adding Parameters to an Answer. -|xref:Action.adoc#_addcolumnset[`Action.AddColumnSet`]| `AppEmbed` +| The *Add Column Set* action allows adding column sets to an Answer. -|xref:Action.adoc#_addqueryset[`Action.AddQuerySet`]| `AppEmbed` +| The *Add Query Set* action allows adding query sets to an Answer. +|xref:Action.adoc#_adddatapanelobjects[`Action.AddDataPanelObjects`]| `AppEmbed` |The Add Data Panel Objects action on the data panel v2. Allows showing action menu to add different objects (such as formulas, Parameters) in the data panel new experience. +|xref:Action.adoc#_collapsedatapanel[`Action.CollapseDataPanel`]| `AppEmbed` | The Collapse data panel icon on the Search page. Collapses the data panel view. +|xref:Action.adoc#_addformula[`Action.AddFormula`]| `AppEmbed` |The *Add Formula* action allows adding formulas to an Answer. +|xref:Action.adoc#_addparameter[`Action.AddParameter`]| `AppEmbed` | The *Add Parameter* action allows adding Parameters to an Answer. +|xref:Action.adoc#_addcolumnset[`Action.AddColumnSet`]| `AppEmbed` | The *Add Column Set* action allows adding column sets to an Answer. +|xref:Action.adoc#_addqueryset[`Action.AddQuerySet`]| `AppEmbed` | The *Add Query Set* action allows adding query sets to an Answer. |=== @@ -551,7 +559,8 @@ The following actions are available on the *Answers* page in the full app embedd Allows sharing a saved Answer with another user or group. |xref:Action.adoc#_remove[`Action.Remove`] a|`AppEmbed` | *Delete* + Allows deleting an Answer. -|xref:Action.adoc#_managetags[`Action.ManageTags`] a|`AppEmbed`| The *Manage Tags* action on the Liveboards + +|xref:Action.adoc#_managetags[`Action.ManageTags`] a|`AppEmbed`| The *Manage Tags* action on the Answers page. |=== @@ -564,12 +573,12 @@ The following actions are available on the *Data* page in the full app embedded |Action string in SDK| Required SDK library|Action label in the UI |xref:Action.adoc#_share[`Action.Share`] a|`AppEmbed` | *Share* action on the *Data* > *Home* page. + Allows sharing a Model, Table, or View with another user or group. -|xref:Action.adoc#_remove[`Action.Remove`] a|`AppEmbed` | *Delete* action on the *Data* > *Home* and *Data* > *Connections* pages + +|xref:Action.adoc#_remove[`Action.Remove`] a|`AppEmbed` | *Delete* action on the *Data* > *Home* and *Data* > *Connections* pages. + Allows deleting a Model, Table, or View. -|xref:Action.adoc#_exporttml[`Action.ExportTML`] a| `AppEmbed` | *Export TML* action on the *Data* > *Home* page + +|xref:Action.adoc#_exporttml[`Action.ExportTML`] a| `AppEmbed` | *Export TML* action on the *Data* > *Home* page. + Allows exporting a Model, Table, or View as a TML file. -|xref:Action.adoc#_edittml[`Action.EditTML`] a| `AppEmbed` | *Edit TML* action on the *Data* > *Home* page + -Opens the TML Editor that allows you to modify the TML file of Model, Table, or View. +|xref:Action.adoc#_edittml[`Action.EditTML`] a| `AppEmbed` | *Edit TML* action on the *Data* > *Home* page. + +Opens the TML Editor that allows you to modify the TML file of a Model, Table, or View. |xref:Action.adoc#_importtml[`Action.ImportTML`] a| `AppEmbed` | The *Import TML* menu action imports the TML representation of ThoughtSpot objects. |=== @@ -583,9 +592,10 @@ The following actions are available on the *Home* page in the full app embedded |Action string in SDK| Required SDK library|Action label in the UI a|xref:Action.adoc#_addtowatchlist[`Action.AddToWatchlist`] a| `AppEmbed` | The *Add KPI to Watchlist* action on Home page watchlist. + Adds a KPI chart to the watchlist on the Home page. -a|xref:Action.adoc#_removefromwatchlist[`Action.RemoveFromWatchlist`] a| `AppEmbed` | The *Remove from watchlist* menu action on KPI watchlist. Removes a KPI chart from the watchlist on the Home page. +a|xref:Action.adoc#_removefromwatchlist[`Action.RemoveFromWatchlist`] a| `AppEmbed` | The *Remove from watchlist* menu action on KPI watchlist. + +Removes a KPI chart from the watchlist on the Home page. a|xref:Action.adoc#_organisefavourites[`Action.OrganiseFavourites`] a| `AppEmbed` | The *Organize Favourites* action on Homepage Favorites module. -|xref:Action.adoc#_copylink[`Action.CopyLink`] a|`AppEmbed`|**Copy link** + +|xref:Action.adoc#_copylink[`Action.CopyLink`] a|`AppEmbed`|*Copy link* + Allows users to copy a link from the *Watchlist* on the Homepage. a|xref:Action.adoc#_deleteschedulehomepage[`Action.DeleteScheduleHomepage`] a|`AppEmbed`| The *Delete* action on the Liveboard Schedules page. + Deletes a Liveboard schedule. @@ -593,9 +603,8 @@ a|xref:Action.adoc#_pauseschedulehomepage[`Action.PauseScheduleHomepage`] a|`App Pauses a scheduled Liveboard job. a|xref:Action.adoc#_unsubscribeschedulehomepage[`Action.UnsubscribeScheduleHomepage`] a|`AppEmbed`|*Unsubscribe* option for the alerts on the *Monitor Subscriptions* page. + Unsubscribes from alerts. -a|xref:Action.adoc#_viewschedulerunhomepage[`Action.ViewScheduleRunHomepage`] a|`AppEmbed`|The *View run history* action Liveboard Schedules page. Allows viewing schedule run history. -|xref:Action.adoc#_share[`Action.Share`] a|`AppEmbed` | *Share* option for objects in the library + +a|xref:Action.adoc#_viewschedulerunhomepage[`Action.ViewScheduleRunHomepage`] a|`AppEmbed`|The *View run history* action on the Liveboard Schedules page. + +Allows viewing schedule run history. +|xref:Action.adoc#_share[`Action.Share`] a|`AppEmbed` | *Share* option for objects in the library. + Allows sharing an object with another user. -|=== - - +|=== \ No newline at end of file diff --git a/modules/ROOT/pages/embed-ts-react-app.adoc b/modules/ROOT/pages/embed-ts-react-app.adoc index 3c893b47d..e81a02ab1 100644 --- a/modules/ROOT/pages/embed-ts-react-app.adoc +++ b/modules/ROOT/pages/embed-ts-react-app.adoc @@ -53,11 +53,10 @@ A functional React app may require link:https://reactjs.org/docs/hooks-reference === Verify localhost port setting -By default, React uses Port 3000 as a localhost port. Make sure you add `localhost:3000` as a xref:security-settings.adoc#csp-viz-embed-hosts[CSP visual embed host] in the **Security Settings **page of the **Develop **tab. +By default, React uses Port 3000 as a localhost port. Make sure you add `localhost:3000` as a xref:security-settings.adoc#csp-viz-embed-hosts[CSP visual embed host] in the **Security Settings** page of the **Develop** tab. If you want to use Port 8000 instead, xref:security-settings.adoc#csp-viz-embed-hosts[add it to the CSP allowlist] and update the following script in the `package.json` file in your app directory. - [source,JSON] ---- "scripts": { @@ -71,7 +70,7 @@ If you want to use Port 8000 instead, xref:security-settings.adoc#csp-viz-embed- === Install SDK Install the Visual Embed SDK from NPM. -+ + ---- npm install @thoughtspot/visual-embed-sdk ---- @@ -92,15 +91,16 @@ To embed a ThoughtSpot Liveboard, complete the following steps: === Create a Liveboard component -In your React app project, go to the **Components ** directory and add a new page for Liveboard in your app directory; for example, `liveboard.tsx`. +In your React app project, go to the **Components** directory and add a new page for Liveboard in your app directory; for example, `liveboard.tsx`. . Import the `LiveboardEmbed` component and event libraries: + -[source.Typescript] +[source,TypeScript] ---- import React from "react"; import { Action, + AuthType, init, EmbedEvent, HostEvent, @@ -130,16 +130,16 @@ ts-data-app> npm start === Code sample -The following code sample embeds a Liveboard, disables UI actions such as *Share* and **Delete**, sets specific visualization GUIDs as visible visualizations, and registers event handlers for `Init`,`Load`, `SetVisibleVizs`, `onLiveboardRendered`, and `VizPointDoubleClick`. +The following code sample embeds a Liveboard and registers event handlers for `Load` and `onLiveboardRendered`. On the `onLiveboardRendered` event, it triggers `SetVisibleVizs` to display specific visualizations. [source,TypeScript] ---- -import { init } from '@thoughtspot/visual-embed-sdk'; -import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk/react'; +import { AuthType, init, EmbedEvent, HostEvent, RuntimeFilterOp } from '@thoughtspot/visual-embed-sdk'; +import { LiveboardEmbed, useEmbedRef } from '@thoughtspot/visual-embed-sdk/react'; // If you are using Webpack 4 (which is the default when using create-react-app v4), you would need to import // the React components using the below: -// import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk/lib/src/react'; +// import { LiveboardEmbed, useEmbedRef } from '@thoughtspot/visual-embed-sdk/lib/src/react'; init({ thoughtSpotHost: '<%=tshost%>', @@ -147,8 +147,8 @@ init({ }); const Liveboard = ({liveboardId}) => { - const ref = useEmbedRef(); - //apply runtime filters + const embedRef = useEmbedRef(); + //apply runtime filters const runtimeFilters = [ { columnName: "state", @@ -157,10 +157,10 @@ const Liveboard = ({liveboardId}) => { }, ]; const onLoad = () => { - console.log(EmbedEvent.Load, {}); + console.log(EmbedEvent.Load, {}); }; //Register an event handler to trigger the SetVisibleVizs event when the Liveboard is rendered - const onLiveboardRendered = () => { + const onLiveboardRendered = () => { embedRef.current.trigger(HostEvent.SetVisibleVizs, [ "3f84d633-e325-44b2-be25-c6650e5a49cf", "28b73b4a-1341-4535-ab71-f76b6fe7bf92", @@ -187,38 +187,6 @@ For more information about `LiveboardEmbed` object and properties, see the follo * xref:LiveboardViewConfig.adoc[LiveboardViewConfig] * xref:Action.adoc[Actions] - -//// -+ -The following example includes a `Liveboard` function with a Liveboard ID and registers an event handler for the `Init` and `Load` events. - -+ -[source,TypeScript] ----- -const Liveboard = () => { - //Register event handlers - const onInit = () => { - console.log(EmbedEvent.Init, {}); - }; - const onLoad = () => { - console.log(EmbedEvent.Load, {}); - }; - return ( - - ); -}; ----- -//// - - === Test your app * Load the embedded Liveboard in your app. @@ -229,19 +197,20 @@ image::./images/liveboard-embed-react.png[] == Embed a visualization -To embed a ThoughtSpot Liveboard, complete the following steps: +To embed a ThoughtSpot visualization, complete the following steps: === Create a visualization component -In your React app project, go to the **Components ** folder in your app directory and add a new page for visualization; for example, `viz.tsx`. +In your React app project, go to the **Components** folder in your app directory and add a new page for visualization; for example, `viz.tsx`. . Import the `LiveboardEmbed` component and event libraries: + -[source.Typescript] +[source,TypeScript] ---- import React from "react"; import { Action, + AuthType, init, EmbedEvent, HostEvent, @@ -271,27 +240,26 @@ ts-data-app> npm start ---- === Code sample -The following example includes the `viz` function with the Liveboard and visualization GUIDs and registers event handlers for `Init` and `Load`. +The following example includes the `vizEmbed` function with the Liveboard and visualization GUIDs and registers an event handler for `Load`. [source,TypeScript] ---- -import { init } from '@thoughtspot/visual-embed-sdk'; +import { AuthType, init, EmbedEvent } from '@thoughtspot/visual-embed-sdk'; import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk/react'; // If you are using Webpack 4 (which is the default when using create-react-app v4), you would need to import // the React components using the below: -import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk/lib/src/react'; +// import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk/lib/src/react'; init({ thoughtSpotHost: '<%=tshost%>', authType: AuthType.None, }); -const vizEmbed = ({liveboardId}) => { - const viz = ({ vizId }) => { - // Register event handlers - const onLoad = () => { - console.log(EmbedEvent.Load, {}); - }; + +const VizEmbed = ({ liveboardId, vizId }) => { + // Register event handlers + const onLoad = () => { + console.log(EmbedEvent.Load, {}); }; return ( { }; ---- -For more information about visualization objects and its properties, see the following pages: +For more information about visualization objects and their properties, see the following pages: * xref:LiveboardEmbed.adoc[LiveboardEmbed] * xref:LiveboardViewConfig.adoc[LiveboardViewConfig] @@ -319,69 +287,107 @@ For more information about visualization objects and its properties, see the fol + [.bordered] image::./images/viz-embed-react.png[] -* Check if the registered events are emitted and logged in the console. -//// -=== Visualization embed code sample +== Embed a saved answer + +To embed a ThoughtSpot saved answer in your React app, use the `SearchEmbed` component with the `savedAnswerGuid` property. -The following code sample embeds a visualization with runtime filters applied, disables UI actions such as *Share* and **Pin**, and registers event handlers to log `Init`, `Load`, and custom action events in the console. +=== Create a saved answer component +In your React app project, go to the **Components** folder in your app directory and add a new page for the saved answer; for example, `savedAnswer.tsx`. + +. Import the `SearchEmbed` component and event libraries: ++ [source,TypeScript] ---- -const viz= () => { - //apply runtime filters - const runtimeFilters = [ - { - columnName: "state", - operator: RuntimeFilterOp.EQ, - values: ["michigan"], - }, - ]; - - // Register event handlers +import React from "react"; +import { + Action, + AuthType, + init, + EmbedEvent, +} from "@thoughtspot/visual-embed-sdk"; +import { SearchEmbed, useEmbedRef } from "@thoughtspot/visual-embed-sdk/react"; +---- ++ +If you are using Webpack 4, import the React components as shown in this example: + ++ +[source,TypeScript] +---- +import { SearchEmbed, useEmbedRef } from '@thoughtspot/visual-embed-sdk/lib/src/react'; +---- +. Initialize the SDK and specify the xref:embed-authentication.adoc[authentication method]. +. Add constructor options as props. +.. For Embed events, use the `on` convention. +.. For Host events, use the `trigger(HostEvent.)` method. ++ +For more information, see xref:EmbedEvent.adoc[EmbedEvent] and xref:HostEvent.adoc[HostEvent]. + +. Render the app. ++ +---- +ts-data-app> npm start +---- + +=== Code sample + +The following code sample embeds a saved answer using its GUID and registers event handlers for `Init` and `Load`. + +[source,TypeScript] +---- +import { AuthType, init, EmbedEvent } from "@thoughtspot/visual-embed-sdk"; +import { SearchEmbed } from "@thoughtspot/visual-embed-sdk/react"; + +// If you are using Webpack 4 (which is the default when using create-react-app v4), import +// the React components using the below: +// import { SearchEmbed } from "@thoughtspot/visual-embed-sdk/lib/src/react"; + +init({ + thoughtSpotHost: "<%=tshost%>", + authType: AuthType.None, +}); + +const SavedAnswer = () => { const onInit = () => { console.log(EmbedEvent.Init, {}); }; - const onLoad = () => { console.log(EmbedEvent.Load, {}); }; - - //If a custom action is added, register a custom action event to log data in the console - const onCustomAction = (payload) => { - const data = payload.data; - if (data.id === "insert Custom Action ID here") { - console.log("Custom Action event:", data.embedAnswerData); - } - }; - return ( - ); }; ---- -//// +For more information about `SearchEmbed` objects and attributes, see the following pages: + +* xref:SearchEmbed.adoc[SearchEmbed] +* xref:SearchViewConfig.adoc[SearchViewConfig] +* xref:Action.adoc[Actions] + +=== Test your app + +* Load your application. +* Check if the saved answer is rendered with the chart or table from the saved query. +* Check if the registered events are triggered and logged in the console. == Embed full app -To full ThoughtSpot application, complete the following steps: +To embed the full ThoughtSpot application, complete the following steps: === Create a full app component -In your React app project, go to the **Components ** folder in your app directory and add a new page for full application embed: for example, `fullApp.tsx`. +In your React app project, go to the **Components** folder in your app directory and add a new page for full application embed: for example, `fullApp.tsx`. . Import the `AppEmbed` component and event libraries: + @@ -447,7 +453,7 @@ const FullApp = () => { For a complete list of `AppEmbed` attributes and events, see the following pages: * xref:AppEmbed.adoc[AppEmbed] -* xref:AppViewConfig.adoc[LiveboardViewConfig] +* xref:AppViewConfig.adoc[AppViewConfig] * xref:Action.adoc[Actions] === Test your app @@ -460,41 +466,6 @@ image::./images/full-app-react.png[] * Check if the registered events are emitted. -//// -=== Full app embed code sample - -The following code sample embeds the full application experience, sets the `Liveboards` page as the default home page, disables *Edit* and *Present* actions on Liveboard visualizations, and registers event handlers for `Init`, `Load`, and `RouteChange` events. - -[source,TypeScript] ----- -const FullApp = () => { - // Register event handlers - const onInit = () => { - console.log(EmbedEvent.Init, {}); - }; - const onLoad = () => { - console.log(EmbedEvent.Load, {}); - }; - const onRouteChange = () => { - console.log(EmbedEvent.RouteChange, {}); - }; - return ( - - ); -}; ----- -//// - == Embed Spotter for conversation analytics To embed ThoughtSpot Spotter page with AI search experience and conversation analytics, use the `SpotterEmbed` component. @@ -502,17 +473,16 @@ To embed ThoughtSpot Spotter page with AI search experience and conversation ana In your React app project: -. Go to the **Components ** folder in your app directory and add a page for the embedded search object; for example, `spotter.tsx`. +. Go to the **Components** folder in your app directory and add a page for the embedded search object; for example, `spotter.tsx`. . Import the `SpotterEmbed` component. + [source,TypeScript] ---- -import { AuthType, init, Action } from "@thoughtspot/visual-embed-sdk"; +import { AuthType, init, Action, EmbedEvent } from "@thoughtspot/visual-embed-sdk"; import { SpotterEmbed, - useEmbedRef -} from "@thoughtspot/visual-embed-sdk/react'"; +} from "@thoughtspot/visual-embed-sdk/react"; ---- + If you are using Webpack 4, import the React components as shown in this example: @@ -520,8 +490,7 @@ If you are using Webpack 4, import the React components as shown in this example + [source,TypeScript] ---- -import { SpotterEmbed, - useEmbedRef } from '@thoughtspot/visual-embed-sdk/lib/src/react'; +import { SpotterEmbed } from '@thoughtspot/visual-embed-sdk/lib/src/react'; ---- . Initialize the SDK and specify the xref:embed-authentication.adoc[authentication method]. @@ -538,20 +507,20 @@ ts-data-app> npm start === Code sample The following code sample shows the following attributes and properties: -* A `SpotterEmbed` function with `worksheetId` prop to pass the ID of the data source object such as a Model. + +* A `Spotter` function with `worksheetId` prop to pass the ID of the data source object. ++ [NOTE] ==== Worksheets are deprecated and replaced by Models in ThoughtSpot Cloud 10.12.0.cl and later versions. ==== - * The `searchOptions` property to pass a search query string. -* Event handlers for `init` and `Load` Embed events. +* Event handlers for `Init` and `Load` Embed events. + [source,TypeScript] ---- -import { AuthType, init, Action } from "@thoughtspot/visual-embed-sdk"; -import { SpotterEmbed, useEmbedRef } from "@thoughtspot/visual-embed-sdk/react"; +import { AuthType, init, Action, EmbedEvent } from "@thoughtspot/visual-embed-sdk"; +import { SpotterEmbed } from "@thoughtspot/visual-embed-sdk/react"; // If you are using Webpack 4 (which is the default when using create-react-app v4), you would need to import // the React components using the below: @@ -562,12 +531,13 @@ init({ thoughtSpotHost: "https://your-thoughtspot-host", // Replace with your ThoughtSpot application URL authType: AuthType.None, // Use the appropriate AuthType for your setup }); -const SpotterEmbed = () => { + +const Spotter = () => { // Define search options const searchOptions = { - searchQuery: "sales by region" // Search query to execute + searchQuery: "sales by region", // Search query to execute }; - const worksheetId = "your-worksheet-id", // ID of the data source object (Model) to query data + const worksheetId = "your-worksheet-id"; // ID of the data source object (Model) to query data // Add Event handlers const onInit = () => { @@ -594,7 +564,7 @@ const SpotterEmbed = () => { For more information, see the following pages: -* xref:SpotterEmbedViewConfig.adoc[Spotter view configuration settings] +* xref:SpotterEmbedViewConfig.adoc[SpotterEmbed view configuration settings] * xref:EmbedEvent.adoc[EmbedEvent] * xref:Action.adoc[Actions] @@ -605,8 +575,7 @@ For more information, see the following pages: + [.widthAuto] [.bordered] -image::./images/converseEmbed-with-query.png[Conversation embed] - +image::./images/converseEmbed-with-query.png[Spotter embed] == Embed Spotter Agent in your own app @@ -616,7 +585,7 @@ To embed only the Spotter AI search component without additional features or Spo In your React app project: -. Go to the **Components * folder in your app directory and add a page for the embedded search object; for example, `SpotterAgent.tsx`. +. Go to the **Components** folder in your app directory and add a page for the embedded search object; for example, `SpotterAgent.tsx`. . Import the `SpotterAgentEmbed` component and `useSpotterAgent` React hook. + [source,TypeScript] @@ -682,6 +651,8 @@ ts-data-app> npm start ---- === Code sample + +[source,TypeScript] ---- import React, { useState } from "react"; import { init, AuthType, logout } from "@thoughtspot/visual-embed-sdk"; @@ -797,12 +768,12 @@ The following code sample shows additional attributes and properties: * A `Search` function with a data source ID. * The `searchOptions` property to construct a query string with `[quantity purchased] [region]` keywords and execute the search query. -* Event handlers for `init` and Load` events. +* Event handlers for `Init` and `Load` events. + [source,TypeScript] ---- -import { init } from "@thoughtspot/visual-embed-sdk"; +import { AuthType, init, EmbedEvent } from "@thoughtspot/visual-embed-sdk"; import { SearchEmbed } from "@thoughtspot/visual-embed-sdk/react"; // If you are using Webpack 4 (which is the default when using create-react-app v4), import @@ -831,8 +802,9 @@ const Search = () => { frameParams={{ height: 600, }} - dataSource={["cd252e5c-b552-49a8-821d-3eadaa049cca"]} + dataSource="cd252e5c-b552-49a8-821d-3eadaa049cca" searchOptions={searchOptions} + onInit={onInit} onLoad={onLoad} /> ); @@ -845,51 +817,6 @@ For more information about `SearchEmbed` objects and attributes, see the followi * xref:SearchViewConfig.adoc[SearchViewConfig] * xref:Action.adoc[Actions] -//// -+ -If you want to programmatically change the search query string, you can add a custom function; for example, `changeSearch`. You can assign this function to a button to programmatically update a search query. + -The following example defines the `changeSearch` function and adds an event handler to trigger a host app event when the query changes to `[sales] by [item type]`. - -+ -[source,TypeScript] ----- -const Search = () => { - const embedRef = useEmbedRef(); - // define a search token string to construct a search query - const searchOptions = { - searchTokenString: "[quantity purchased] [region]", - executeSearch: true, - }; - //Add a custom function to update the search query string and trigger an event when the query is changed - const changeSearch = () => { - embedRef.current.trigger(HostEvent.Search, { - searchQuery: "[sales] by [item type]", - dataSource: ["cd252e5c-b552-49a8-821d-3eadaa049cca"], - }); - }; - //add event handlers - const onQueryChanged = () => { - console.log(EmbedEvent.QueryChanged, {}); - }; - return ( -
- - -
- ); -}; ----- -//// - - === Test your app * Load your application. @@ -898,15 +825,6 @@ const Search = () => { [.bordered] image::./images/embed-search-react.png[] -//// -* Change the search query and check if the search tokens are replaced. -+ -[.bordered] -image::./images/search-query-changed.png[] - -* Check the console log to verify if the registered events are emitted. -//// - == Embed a Natural Language Search (Legacy interface) To embed ThoughtSpot Natural Language Search interface, complete the steps listed in the following sections. @@ -915,7 +833,7 @@ To embed ThoughtSpot Natural Language Search interface, complete the steps liste In your React app project: -. Go to the **Components ** folder in your app directory and add a page for the embedded search object; for example, `Sage.tsx`. +. Go to the **Components** folder in your app directory and add a page for the embedded search object; for example, `Sage.tsx`. . Import the `SageEmbed` component and event libraries. + [source,TypeScript] @@ -925,7 +843,7 @@ import { AuthType, init, EmbedEvent, HostEvent } from "@thoughtspot/visual-embed import { SageEmbed, useEmbedRef -} from "@thoughtspot/visual-embed-sdk/react'"; +} from "@thoughtspot/visual-embed-sdk/react"; ---- + If you are using Webpack 4, import the React components as shown in this example: @@ -952,12 +870,12 @@ The following code sample shows additional attributes and properties: * A `Sage` function with a data source ID. * The `searchOptions` property to pass a search query `number of jackets sold today` and execute the query. -* Event handlers for `init` and `Load` embed events. +* Event handlers for `Init` and `Load` embed events. + [source,TypeScript] ---- -import { init, EmbedEvent, HostEvent } from "@thoughtspot/visual-embed-sdk"; +import { AuthType, init, EmbedEvent, HostEvent } from "@thoughtspot/visual-embed-sdk"; import { SageEmbed } from "@thoughtspot/visual-embed-sdk/react"; // If you are using Webpack 4 (which is the default when using create-react-app v4), you would need to import @@ -969,14 +887,15 @@ init({ thoughtSpotHost: "<%=tshost%>", authType: AuthType.None, }); + const Sage = () => { - // Define search options + // It has been moved to a separate const declaration. const searchOptions = { - searchQuery: "number of jackets sold today", // Search query to execute - executeSearch: true, // Execute search immediately - }, - dataSource: "c8684f7f-d8a4-4bc9-b87d-115433c5e458", // Replace with your actual data source + searchQuery: "number of jackets sold today", // Search query to execute + executeSearch: true, // Execute search immediately }; + const dataSource = "c8684f7f-d8a4-4bc9-b87d-115433c5e458"; // Replace with your actual data source GUID + // Add Event handlers const onInit = () => { console.log(EmbedEvent.Init, {}); @@ -989,8 +908,9 @@ const Sage = () => { return ( Date: Tue, 12 May 2026 10:39:32 +0530 Subject: [PATCH 10/61] action ref toc --- modules/ROOT/pages/embed-action-ref.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/embed-action-ref.adoc b/modules/ROOT/pages/embed-action-ref.adoc index 3de09b126..ad39bbca4 100644 --- a/modules/ROOT/pages/embed-action-ref.adoc +++ b/modules/ROOT/pages/embed-action-ref.adoc @@ -1,6 +1,6 @@ = Action IDs in the SDK :toc: true -:toclevels: 2 +:toclevels: 1 :page-title: Actions :page-pageid: actions From 7007c432e6df87e0384a45ccecaddc40d834f3f5 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 12 May 2026 11:02:47 +0530 Subject: [PATCH 11/61] action ref list udpate --- modules/ROOT/pages/embed-action-ref.adoc | 171 +++++++++++++++++------ 1 file changed, 130 insertions(+), 41 deletions(-) diff --git a/modules/ROOT/pages/embed-action-ref.adoc b/modules/ROOT/pages/embed-action-ref.adoc index ad39bbca4..089894a62 100644 --- a/modules/ROOT/pages/embed-action-ref.adoc +++ b/modules/ROOT/pages/embed-action-ref.adoc @@ -22,7 +22,7 @@ The actions associated with the Liveboards are available in the Liveboard header `AppEmbed` | The *Favorites* (star) icon on a Liveboard page. + Allows adding a Liveboard to the user's favorites list. |xref:Action.adoc#_aihighlights[`Action.AIHighlights`]|`LiveboardEmbed` + -`AppEmbed` | The AI highlights button on a Liveboard page. + +`AppEmbed` | The AI highlights button on a Liveboard page. + Displays quick insights on how top metrics changed in your Liveboard. + To enable *AI Highlights*, ensure that the link:https://docs.thoughtspot.com/cloud/latest/time-series-anomaly[KPI anomaly detection, window=_blank] feature is enabled on your instance. |xref:Action.adoc#_share[`Action.Share`]| `LiveboardEmbed` + @@ -41,31 +41,41 @@ a| `LiveboardEmbed` + `AppEmbed` |The filter configuration options in the *Add Filters* modal. + Applies filters and allows configuring filters applied to a visualization on a Liveboard. - |xref:Action.adoc#_addparameter[`Action.AddParameter`]| `LiveboardEmbed` + `AppEmbed`| The *Add Parameters* option in the top panel of the Liveboard. + Allows adding parameters to a Liveboard. - |xref:Action.adoc#_addtab[`Action.AddTab`]|`LiveboardEmbed` + `AppEmbed` | The *Add Tab* action on a Liveboard. + Allows adding a new tab to a Liveboard view. |xref:Action.adoc#_changefiltervisibilityintab[`Action.ChangeFilterVisibilityInTab`]|`LiveboardEmbed` + `AppEmbed` | Action ID to disable or hide the filter visibility on Liveboard tabs. Applicable if link:https://docs.thoughtspot.com/cloud/latest/liveboard-filters#_apply_filters_to_specific_visualizations_or_tabs[the filter visibility on tabs, window=_blank] feature is enabled on your instance. + See also, xref:LiveboardViewConfig.adoc#_hideirrelevantchipsinliveboardtabs[hideIrrelevantChipsInLiveboardTabs]. - |xref:Action.adoc#_disablechipreorder[`Action.DisableChipReorder`]|`LiveboardEmbed` + `SearchEmbed` + `AppEmbed` | Action ID for disabling filter chip reordering on a Liveboard. - |xref:Action.adoc#_save[`Action.Save`]|`LiveboardEmbed` + `AppEmbed` | *Save* + Saves Liveboard modifications. |xref:Action.adoc#_makeacopy[`Action.MakeACopy`] | `LiveboardEmbed` + `AppEmbed`| *Make a copy* + -Creates a copy of the Liveboard. +Creates a copy of the Liveboard. In `LiveboardEmbed`, the *Make a copy* action is not available for visualizations in the embedded Liveboard view. In `AppEmbed`, the action is available on both Liveboards and visualizations. |xref:Action.adoc#_downloadaspdf[`Action.DownloadAsPdf`] | `LiveboardEmbed` + `AppEmbed`|*Download as PDF* + Downloads the Liveboard as a PDF file. +|xref:Action.adoc#_downloadliveboard[`Action.DownloadLiveboard`] | `LiveboardEmbed` + +`AppEmbed` | *Download Liveboard* + +Downloads the entire Liveboard. +|xref:Action.adoc#_downloadliveboardascontinuouspdf[`Action.DownloadLiveboardAsContinuousPDF`] | `LiveboardEmbed` + +`AppEmbed` | *Download Liveboard as Continuous PDF* + +Downloads the entire Liveboard as a continuous PDF file. +|xref:Action.adoc#_downloadliveboardascsv[`Action.DownloadLiveboardAsCsv`] | `LiveboardEmbed` + +`AppEmbed` | *Download Liveboard as CSV* + +Downloads the entire Liveboard as a CSV file. +|xref:Action.adoc#_downloadliveboardasxlsx[`Action.DownloadLiveboardAsXlsx`] | `LiveboardEmbed` + +`AppEmbed` | *Download Liveboard as XLSX* + +Downloads the entire Liveboard as an XLSX file. +|xref:Action.adoc#_coverandfilteroptioninpdf[`Action.CoverAndFilterOptionInPDF`] | `LiveboardEmbed` + +`AppEmbed` | Action ID to hide the checkboxes for including or excluding cover and filter pages in the Liveboard PDF download dialog. |xref:Action.adoc#_present[`Action.Present`]| `LiveboardEmbed` + `AppEmbed` | *Present* + Presents a fullscreen Liveboard in the slideshow mode. @@ -73,37 +83,69 @@ Presents a fullscreen Liveboard in the slideshow mode. xref:Action.adoc#_subscription[`Action.Subscription`]| `LiveboardEmbed` + `AppEmbed` |*Schedule* + Allows scheduling Liveboard notifications. - |xref:Action.adoc#_scheduleslist[`Action.SchedulesList`]| `LiveboardEmbed` + `AppEmbed` | *Manage schedules* + Allows you to manage scheduled Liveboard jobs. - |xref:Action.adoc#_liveboardinfo[`Action.LiveboardInfo`]|`LiveboardEmbed` + `AppEmbed` | *Show Liveboard details* + Displays information about the Liveboard. - +|xref:Action.adoc#_liveboardstylepanel[`Action.LiveboardStylePanel`] | `LiveboardEmbed` + +`AppEmbed` | The *Style panel* on a Liveboard. + +Controls the visibility of the Liveboard style panel. |xref:Action.adoc#_renamemodaltitledescription[`Action.RenameModalTitleDescription`]|`LiveboardEmbed` + `AppEmbed` | The *Rename* menu action on Liveboards. Allows editing the name of the Liveboard. |xref:Action.adoc#_requestverification[`Action.RequestVerification`]|`LiveboardEmbed` + `AppEmbed` | The *Request verification* menu action on Liveboards. Initiates a request for Liveboard verification. |xref:Action.adoc#_verifiedliveboard[`Action.VerifiedLiveboard`]| `LiveboardEmbed` + `AppEmbed` |The Liveboard verified banner text. + -Indicates the Liveboard is verified. +Indicates the Liveboard is verified. + See also, xref:LiveboardViewConfig.adoc#_showliveboardverifiedbadge[showLiveboardVerifiedBadge]. - |xref:Action.adoc#_personalisedviewsdropdown[`Action.PersonalisedViewsDropdown`]| `LiveboardEmbed` + `AppEmbed` | The Liveboard personalized views drop-down. + -Available if personalized views are saved on the Liveboard. +Available if personalized views are saved on the Liveboard. + +Allows switching between the saved personalized views of a Liveboard. + +[NOTE] +==== +This action is deprecated. Use `Action.PersonalizedViewsDropdown` instead. +==== +|xref:Action.adoc#_personalizedviewsdropdown[`Action.PersonalizedViewsDropdown`]| `LiveboardEmbed` + +`AppEmbed` | The Liveboard personalized views drop-down. + Allows switching between the saved personalized views of a Liveboard. |xref:Action.adoc#_markasverified[`Action.MarkAsVerified`] |`LiveboardEmbed` + -`AppEmbed` | -The *Approve* action visible to Liveboard verifiers. + +`AppEmbed` | The *Approve* action visible to Liveboard verifiers. + Marks the Liveboard as approved. +|xref:Action.adoc#_managemonitor[`Action.ManageMonitor`]| `LiveboardEmbed` + +`AppEmbed` | The *Manage Alerts* menu action on KPI visualizations. + +Allows creating, viewing, and editing monitor alerts for a KPI chart. +|xref:Action.adoc#_creategroup[`Action.CreateGroup`]| `LiveboardEmbed` + +`AppEmbed` | The *Create Group* menu action on a Liveboard. + +Allows creating a new visualization group on a Liveboard. +|xref:Action.adoc#_movetogroup[`Action.MoveToGroup`]| `LiveboardEmbed` + +`AppEmbed` | The *Move to Group* menu action on a Liveboard. + +Allows moving a visualization to a different group. +|xref:Action.adoc#_moveoutofgroup[`Action.MoveOutOfGroup`]| `LiveboardEmbed` + +`AppEmbed` | The *Move out of Group* menu action on a Liveboard. + +Allows moving a visualization out of a group. +|xref:Action.adoc#_ungroupliveboardgroup[`Action.UngroupLiveboardGroup`]| `LiveboardEmbed` + +`AppEmbed` | The *Ungroup* menu action on a Liveboard group. + +Allows ungrouping a Liveboard visualization group. +|xref:Action.adoc#_publish[`Action.Publish`]| `LiveboardEmbed` + +`AppEmbed` | The *Publish* action for Liveboards. + +Opens the publishing modal. Acts as a parent action for *Manage Publishing* and *Unpublish* if the object is already published. +|xref:Action.adoc#_managepublishing[`Action.ManagePublishing`]| `LiveboardEmbed` + +`AppEmbed` | The *Manage Publishing* action for Liveboards. + +Opens the publishing modal. Appears as a child action to *Publish* if the object is already published. +|xref:Action.adoc#_unpublish[`Action.Unpublish`]| `LiveboardEmbed` + +`AppEmbed` | The *Unpublish* action for Liveboards. + +Appears as a child action to *Publish* if the object is already published. |xref:Action.adoc#_synctoslack[`Action.SyncToSlack`]| `LiveboardEmbed` + `AppEmbed` | The *Sync to Slack* action on Liveboard visualizations. Allows sending data to Slack. |xref:Action.adoc#_synctoteams[`Action.SyncToTeams`]| `LiveboardEmbed` + `AppEmbed` | The *Sync to Teams* action on Liveboard visualizations. Allows sending data to Microsoft Teams. - +|xref:Action.adoc#_liveboardusers[`Action.LiveboardUsers`]|`LiveboardEmbed` + +`AppEmbed`| The *Viewers* panel inside the *Show Liveboard details* modal. + +Displays the list of users who have access to the Liveboard. + +Use this action ID to hide the viewers panel in the Liveboard details view. |xref:Action.adoc#_tml[`Action.TML`]| `LiveboardEmbed` + `AppEmbed` | Action ID for the parent TML action. The parent action *TML* must be included to access TML-related options within the cascading menu. |xref:Action.adoc#_exporttml[`Action.ExportTML`]|`LiveboardEmbed` + @@ -117,6 +159,7 @@ Allows importing the TML representation of a Liveboard object to ThoughtSpot. Th Allows editing the ThoughtSpot Modelling Language (TML) representation of a Liveboard object loaded on the ThoughtSpot server. The parent action *TML* must be included to access TML-related options within the cascading menu. |==== + [#liveboardv2-viz-actions] == Visualizations on a Liveboard The visualizations pinned to a Liveboard have the following types of actions: @@ -140,8 +183,18 @@ Allows users to initiate a conversation with Spotter. `AppEmbed` |*Explore* + Allows users to explore a visualization. |xref:Action.adoc#_createmonitor[`Action.CreateMonitor`]| `LiveboardEmbed` + -`AppEmbed` | Alert icon + +`AppEmbed` | The *Create alert* icon on KPI charts. + Allows you to schedule threshold-based alerts for KPI charts. +|xref:Action.adoc#_managemonitor[`Action.ManageMonitor`]| `LiveboardEmbed` + +`AppEmbed` | The *Manage Alerts* menu action on KPI visualizations. + +Allows creating, viewing, and editing monitor alerts for a KPI chart. +|xref:Action.adoc#_kpianalysiscta[`Action.KPIAnalysisCTA`]| `LiveboardEmbed` + +`AppEmbed` | The *Analyze* call-to-action button on KPI charts. + +Allows initiating KPI analysis directly from the chart. +|xref:Action.adoc#_enablecontextualchangeanalysis[`Action.EnableContextualChangeAnalysis`]| `LiveboardEmbed` + +`AppEmbed` | Initiates contextual change analysis on KPI charts. +|xref:Action.adoc#_enableiterativechangeanalysis[`Action.EnableIterativeChangeAnalysis`]| `LiveboardEmbed` + +`AppEmbed` | Action ID to hide or disable the Iterative Change Analysis option in the contextual change analysis insight charts context menu. |xref:Action.adoc#_pin[`Action.Pin`]|`LiveboardEmbed` + `AppEmbed`|*Pin* + Pins a visualization to a Liveboard. @@ -189,8 +242,7 @@ Allows managing data sync pipelines to external business apps set as sync destin |xref:Action.adoc#_liveboardusers[`Action.LiveboardUsers`]|`LiveboardEmbed` + `AppEmbed`| The *Viewers* panel inside the *Show Liveboard details* modal. + Displays the list of users who have access to the Liveboard. + -Use this action ID to hide the viewers panel in the Liveboard details view. + -Available in SDK 1.26.0 and ThoughtSpot 9.7.0.cl or later. +Use this action ID to hide the viewers panel in the Liveboard details view. |xref:Action.adoc#_answerdelete[`Action.AnswerDelete`] |`LiveboardEmbed` + `AppEmbed`| *Delete* + Deletes the visualization from the Liveboard. @@ -248,22 +300,56 @@ The following action IDs are available for the Spotter component: |xref:Action.adoc#_previewdataspotter[`Action.PreviewDataSpotter`] | `SpotterEmbed` + `AppEmbed` |*Preview data* action on the Spotter conversation panel. + Shows the underlying data used for Spotter queries. - |xref:Action.adoc#_resetspotterchat[`Action.ResetSpotterChat`] |`SpotterEmbed` + `AppEmbed` | The *Reset* button on the Spotter conversation panel. + Clears the current Spotter conversation and starts a new session. - |xref:Action.adoc#_editpreviousprompt[`Action.EditPreviousPrompt`] |`SpotterEmbed` + `AppEmbed` | The edit icon on the Spotter prompt panel. + Allows editing the prompt sent to Spotter. - |xref:Action.adoc#_deletepreviousprompt[`Action.DeletePreviousPrompt`] |`SpotterEmbed` + `AppEmbed` | The delete icon on the Spotter prompt panel. + Allows deleting the prompt sent to Spotter. - |xref:Action.adoc#_spotterfeedback[`Action.SpotterFeedback`] |`SpotterEmbed` + `AppEmbed` | The Spotter feedback widget in the generated Answer. + Allows sending feedback about the response received from Spotter. +|xref:Action.adoc#_edittokens[`Action.EditTokens`] |`SpotterEmbed` + +`AppEmbed` | Action ID to hide or disable editing tokens generated from Spotter results. +|xref:Action.adoc#_datamodelinstructions[`Action.DataModelInstructions`] |`SpotterEmbed` + +`AppEmbed` | The *Data model instructions* button on the Spotter interface. + +Allows opening the data model instructions modal. +|xref:Action.adoc#_inconversationtraining[`Action.InConversationTraining`] |`SpotterEmbed` + +`AppEmbed` | Action ID to hide or disable the *Add to Coaching* workflow in Spotter conversations. + +The *Add to Coaching* feature allows adding reference questions and business terms to improve Spotter's responses. This feature is GA from ThoughtSpot 26.2.0.cl and enabled by default on embed deployments. +|xref:Action.adoc#_spotterwarningsbanner[`Action.SpotterWarningsBanner`] |`SpotterEmbed` + +`AppEmbed` | Action ID to hide the warnings banner in Spotter results. +|xref:Action.adoc#_spotterwarningsontokens[`Action.SpotterWarningsOnTokens`] |`SpotterEmbed` + +`AppEmbed` | Action ID to hide the warnings border on the knowledge card in Spotter results. +|xref:Action.adoc#_spottertokenquickedit[`Action.SpotterTokenQuickEdit`] |`SpotterEmbed` + +`AppEmbed` | Action ID to disable the click event handler on knowledge cards in Spotter results. +|xref:Action.adoc#_spotternewchat[`Action.SpotterNewChat`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the *New Chat* button in the Spotter past conversations sidebar. +|xref:Action.adoc#_spotterpastchatbanner[`Action.SpotterPastChatBanner`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility of the past conversation banner alert in the Spotter interface. +|xref:Action.adoc#_spottersidebarheader[`Action.SpotterSidebarHeader`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility of the sidebar header (title and toggle button) in the Spotter past conversations sidebar. +|xref:Action.adoc#_spottersidebarfooter[`Action.SpotterSidebarFooter`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility of the sidebar footer (documentation link) in the Spotter past conversations sidebar. +|xref:Action.adoc#_spottersidebartoggle[`Action.SpotterSidebarToggle`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the sidebar toggle/expand button in the Spotter past conversations sidebar. +|xref:Action.adoc#_spotterchatmenu[`Action.SpotterChatMenu`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the conversation edit menu (three-dot menu) in the Spotter past conversations sidebar. +|xref:Action.adoc#_spotterchatrename[`Action.SpotterChatRename`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the *Rename* action in the Spotter conversation edit menu. +|xref:Action.adoc#_spotterchatdelete[`Action.SpotterChatDelete`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the *Delete* action in the Spotter conversation edit menu. +|xref:Action.adoc#_spotterdocs[`Action.SpotterDocs`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the documentation/best practices link in the Spotter sidebar footer. +|xref:Action.adoc#_spotterchatconnectors[`Action.SpotterChatConnectors`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the connectors in the Spotter chat interface. +|xref:Action.adoc#_spotterchatconnectorresources[`Action.SpotterChatConnectorResources`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the connector resources section in the Spotter chat interface. +|xref:Action.adoc#_spotterchatmodeswitcher[`Action.SpotterChatModeSwitcher`] |`SpotterEmbed` + +`AppEmbed` | Controls visibility and disable state of the mode switcher in the Spotter chat interface. |===== For information about the action IDs available for Answers generated from Spotter (`SpotterEmbed`), see xref:embed-action-ref#answer-actions[Answers]. @@ -280,7 +366,7 @@ The following actions are available on saved Answers and the Answers generated b `SageEmbed` + `SearchEmbed` + `SearchBarEmbed` + -`AppEmbed`|The *Choose sources* option in the Search page and Spotter conversation panel. + +`AppEmbed`|The *Choose sources* option in the Search page and Spotter conversation panel. + Allows selecting data sources to query data. |xref:Action.adoc#_addformula[`Action.AddFormula`]| `SpotterEmbed` + `SageEmbed` + @@ -293,7 +379,6 @@ Allows adding formulas to a search query. `SearchEmbed` + `AppEmbed`| *Add Parameters* option in the data panel on a Search page. + Allows adding parameters to an Answer. - |xref:Action.adoc#_answerchartswitcher[`Action.AnswerChartSwitcher`]|`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + @@ -327,7 +412,6 @@ Allows generating SpotIQ analyses. Available as a primary button and contextual `SageEmbed` + `AppEmbed`|*Share* + Allows you to share an Answer with another user or group. - |xref:Action.adoc#_querydetailsbuttons[`Action.QueryDetailsButtons`]| `SpotterEmbed` + `SageEmbed` + `SearchEmbed` + @@ -358,7 +442,6 @@ If you are using Visual Embed SDK version 1.21.0 or later to embed Liveboard, Se `SearchEmbed` + `AppEmbed` |*Download* > *CSV* + Downloads the answer data in the CSV file format. - |xref:Action.adoc#_downloadasxlsx[`Action.DownloadAsXlsx`]|`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + @@ -399,7 +482,6 @@ Allows managing data sync pipelines to external business apps set as sync destin `SearchEmbed` + `AppEmbed` | *Export TML* + Exports the TML representation of an answer from ThoughtSpot. - |xref:Action.adoc#_edittml[`Action.EditTML`]|`AppEmbed` | *Edit TML* + Allows editing the TML representation of the answer object. This action is available on the saved answers page. |xref:Action.adoc#_importtml[`Action.ImportTML`]|`AppEmbed` | *Import TML* + @@ -424,13 +506,11 @@ Allows you to exclude a specific data point when drilling down on an Answer. `SearchEmbed` + `AppEmbed` |*Include* + Allows you to include a specific data point during drill down on an Answer. - |xref:Action.adoc#_drilldown[`Action.DrillDown`]|`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + `AppEmbed` |*Drill down* + Allows you to drill down the data for additional details and granular information. Available as a contextual menu action. - |xref:Action.adoc#_copytoclipboard[`Action.CopyToClipboard`] |`SpotterEmbed` + `SageEmbed` + `SearchEmbed` + @@ -462,19 +542,16 @@ Allows adding rules for conditional formatting of data points on a chart or tabl `SearchEmbed` + `LiveboardEmbed` | *Edit* action in the axis customization menu. + Allows editing the axis name, position, minimum and maximum values and format a column. - |xref:Action.adoc#_axismenufilter[`Action.AxisMenuFilter`] | `SageEmbed` + `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Filter* action in the chart axis or table column customization menu. + Allows adding, editing, or removing filters. - |xref:Action.adoc#_axismenugroup[`Action.AxisMenuGroup`]| `SageEmbed` + `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Group* option in the chart axis or table column customization menu. + Allows grouping data points if the axes use the same unit of measurement and a similar scale. - |xref:Action.adoc#_axismenunumberformat[`Action.AxisMenuNumberFormat`]| `SageEmbed` + `AppEmbed` + `SearchEmbed` + @@ -489,7 +566,6 @@ Allows changing the position of the axis to the left or right side of the chart. `SearchEmbed` + `LiveboardEmbed` | *Remove* in the chart axis or table column customization menu. + Removes the data labels from a chart or the column of a table visualization. - |xref:Action.adoc#_axismenurename[`Action.AxisMenuRename`] | `SageEmbed` + `AppEmbed` + `SearchEmbed` + @@ -509,6 +585,16 @@ Wraps or clips column text on a table. `SearchEmbed` + `LiveboardEmbed` | *Time bucket* option in the chart axis or table column customization menu. + Allows defining time metric for date comparison. +|xref:Action.adoc#_axismenucompare[`Action.AxisMenuCompare`]| `SageEmbed` + +`AppEmbed` + +`SearchEmbed` + +`LiveboardEmbed` | *Compare with* option in the chart axis customization menu. + +Allows comparing data across dimensions or measures. +|xref:Action.adoc#_axismenumerge[`Action.AxisMenuMerge`]| `SageEmbed` + +`AppEmbed` + +`SearchEmbed` + +`LiveboardEmbed` | *Merge with* option in the chart axis customization menu. + +Allows merging data across dimensions or measures. |===== == Full app embed @@ -528,7 +614,6 @@ a|xref:Action.adoc#_createliveboard[`Action.CreateLiveboard`] a|`AppEmbed`| The a|xref:Action.adoc#_managetags[`Action.ManageTags`] a|`AppEmbed`| The *Manage Tags* action on the Liveboards page. |xref:Action.adoc#_exporttml[`Action.ExportTML`] a|`AppEmbed` | *Export TML* + Exports the TML representation of a Liveboard object from ThoughtSpot. - |=== === Search page @@ -538,13 +623,12 @@ The following actions are available on the *Search* page in the full app embedde [options='header'] |=== |Action string in SDK| Required SDK library|Action label in the UI -|xref:Action.adoc#_adddatapanelobjects[`Action.AddDataPanelObjects`]| `AppEmbed` |The Add Data Panel Objects action on the data panel v2. Allows showing action menu to add different objects (such as formulas, Parameters) in the data panel new experience. -|xref:Action.adoc#_collapsedatapanel[`Action.CollapseDataPanel`]| `AppEmbed` | The Collapse data panel icon on the Search page. Collapses the data panel view. +|xref:Action.adoc#_adddatapanelobjects[`Action.AddDataPanelObjects`]| `AppEmbed` |The *Add Data Panel Objects* action on the data panel v2. Allows showing action menu to add different objects (such as formulas, Parameters) in the data panel new experience. +|xref:Action.adoc#_collapsedatapanel[`Action.CollapseDataPanel`]| `AppEmbed` | The *Collapse data panel* icon on the Search page. Collapses the data panel view. |xref:Action.adoc#_addformula[`Action.AddFormula`]| `AppEmbed` |The *Add Formula* action allows adding formulas to an Answer. |xref:Action.adoc#_addparameter[`Action.AddParameter`]| `AppEmbed` | The *Add Parameter* action allows adding Parameters to an Answer. |xref:Action.adoc#_addcolumnset[`Action.AddColumnSet`]| `AppEmbed` | The *Add Column Set* action allows adding column sets to an Answer. |xref:Action.adoc#_addqueryset[`Action.AddQuerySet`]| `AppEmbed` | The *Add Query Set* action allows adding query sets to an Answer. - |=== === Answers page @@ -559,9 +643,7 @@ The following actions are available on the *Answers* page in the full app embedd Allows sharing a saved Answer with another user or group. |xref:Action.adoc#_remove[`Action.Remove`] a|`AppEmbed` | *Delete* + Allows deleting an Answer. - |xref:Action.adoc#_managetags[`Action.ManageTags`] a|`AppEmbed`| The *Manage Tags* action on the Answers page. - |=== === Data Workspace page @@ -573,7 +655,7 @@ The following actions are available on the *Data* page in the full app embedded |Action string in SDK| Required SDK library|Action label in the UI |xref:Action.adoc#_share[`Action.Share`] a|`AppEmbed` | *Share* action on the *Data* > *Home* page. + Allows sharing a Model, Table, or View with another user or group. -|xref:Action.adoc#_remove[`Action.Remove`] a|`AppEmbed` | *Delete* action on the *Data* > *Home* and *Data* > *Connections* pages. + +|xref:Action.adoc#_remove[`Action.Remove`] a|`AppEmbed` | *Delete* action on the *Data* > *Home* and *Data* > *Connections* pages. + Allows deleting a Model, Table, or View. |xref:Action.adoc#_exporttml[`Action.ExportTML`] a| `AppEmbed` | *Export TML* action on the *Data* > *Home* page. + Allows exporting a Model, Table, or View as a TML file. @@ -594,9 +676,16 @@ a|xref:Action.adoc#_addtowatchlist[`Action.AddToWatchlist`] a| `AppEmbed` | The Adds a KPI chart to the watchlist on the Home page. a|xref:Action.adoc#_removefromwatchlist[`Action.RemoveFromWatchlist`] a| `AppEmbed` | The *Remove from watchlist* menu action on KPI watchlist. + Removes a KPI chart from the watchlist on the Home page. -a|xref:Action.adoc#_organisefavourites[`Action.OrganiseFavourites`] a| `AppEmbed` | The *Organize Favourites* action on Homepage Favorites module. +a|xref:Action.adoc#_organisefavourites[`Action.OrganiseFavourites`] a| `AppEmbed` | The *Organize Favourites* action on Homepage Favorites module. + +[NOTE] +==== +This action is deprecated. Use `Action.OrganizeFavorites` instead. +==== +a|xref:Action.adoc#_organizefavorites[`Action.OrganizeFavorites`] a| `AppEmbed` | The *Organize Favorites* action on Homepage Favorites module. |xref:Action.adoc#_copylink[`Action.CopyLink`] a|`AppEmbed`|*Copy link* + Allows users to copy a link from the *Watchlist* on the Homepage. +a|xref:Action.adoc#_editschedulehomepage[`Action.EditScheduleHomepage`] a|`AppEmbed`| The *Edit* action on the *Liveboard Schedules* page. + +Allows editing Liveboard schedules. a|xref:Action.adoc#_deleteschedulehomepage[`Action.DeleteScheduleHomepage`] a|`AppEmbed`| The *Delete* action on the Liveboard Schedules page. + Deletes a Liveboard schedule. a|xref:Action.adoc#_pauseschedulehomepage[`Action.PauseScheduleHomepage`] a|`AppEmbed`| The *Pause* action on the *Liveboard Schedules* page. + From de9fc835027c2e247b200775db8b55ebc49d0c48 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 12 May 2026 11:17:49 +0530 Subject: [PATCH 12/61] sagemebed ref removal --- modules/ROOT/pages/embed-action-ref.adoc | 82 ++++++------------------ 1 file changed, 19 insertions(+), 63 deletions(-) diff --git a/modules/ROOT/pages/embed-action-ref.adoc b/modules/ROOT/pages/embed-action-ref.adoc index 089894a62..43d3e94ed 100644 --- a/modules/ROOT/pages/embed-action-ref.adoc +++ b/modules/ROOT/pages/embed-action-ref.adoc @@ -1,6 +1,6 @@ = Action IDs in the SDK :toc: true -:toclevels: 1 +:toclevels: 2 :page-title: Actions :page-pageid: actions @@ -356,31 +356,27 @@ For information about the action IDs available for Answers generated from Spotte [#answer-actions] == Answers -The following actions are available on saved Answers and the Answers generated by passing a Natural Language Search query, search tokens on the Search Data page, or from a conversation with Spotter. +The following actions are available on saved Answers and the Answers generated by passing a search query on the Search Data page or from a conversation with Spotter. [width="100%" cols="3,3,4"] [options='header'] |===== |Action string in SDK| Required SDK library|Action label in the UI |xref:Action.adoc#_choosedatasources[`Action.ChooseDataSources`]| `SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `SearchBarEmbed` + `AppEmbed`|The *Choose sources* option in the Search page and Spotter conversation panel. + Allows selecting data sources to query data. |xref:Action.adoc#_addformula[`Action.AddFormula`]| `SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `SearchBarEmbed` + `AppEmbed`| *Create formula* option on the data panel of an Answer page. + Allows adding formulas to a search query. |xref:Action.adoc#_addparameter[`Action.AddParameter`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed`| *Add Parameters* option in the data panel on a Search page. + Allows adding parameters to an Answer. |xref:Action.adoc#_answerchartswitcher[`Action.AnswerChartSwitcher`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` | Chart toggle icon. + Allows switching to the table or chart mode. @@ -388,32 +384,20 @@ Allows switching to the table or chart mode. `AppEmbed` | *Edit* action on charts and tables generated from a Spotter query. + Opens a table or chart in the edit mode. |xref:Action.adoc#_pin[`Action.Pin`]| `SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` | *Pin* action on the visualization generated from a Spotter query. + Allows adding a visualization generated from Spotter to a Liveboard. |xref:Action.adoc#_save[`Action.Save`]| `SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` | *Save* action on the visualization generated from a Spotter query. + Saves the visualization generated from Spotter. -|xref:Action.adoc#_sageanswerfeedback[`Action.SageAnswerFeedback`]| `SageEmbed` + -`AppEmbed` | The feedback widget on the Answers generated from a Natural Language Search query. + -Allows sending feedback about the AI-generated Answer. -|xref:Action.adoc#_editsageanswer[`Action.EditSageAnswer`]| `SageEmbed` + -`AppEmbed` | Edit action for AI-generated Answer. -|xref:Action.adoc#_modifysageanswer[`Action.ModifySageAnswer`]| `SageEmbed` + -`AppEmbed` | The *Fix the Answer* option that appears after a user submits negative feedback on the Answer generated from a Natural Language Search query. + -Allows users to fix the Answer in the Search Data page to provide feedback. |xref:Action.adoc#_spotiqanalyze[`Action.SpotIQAnalyze`]|`SearchEmbed` + `AppEmbed`|*SpotIQ analyze* + Allows generating SpotIQ analyses. Available as a primary button and contextual menu action. |xref:Action.adoc#_share[`Action.Share`]|`SearchEmbed` + -`SageEmbed` + `AppEmbed`|*Share* + Allows you to share an Answer with another user or group. |xref:Action.adoc#_querydetailsbuttons[`Action.QueryDetailsButtons`]| `SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` a|The *Query visualizer* and *Query SQL* buttons in *Query details* on the Answer page. + @@ -422,7 +406,6 @@ a|The *Query visualizer* and *Query SQL* buttons in *Query details* on the Answe * The *Query SQL* button displays the SQL statements used in a search query to fetch data. |xref:Action.adoc#_download[`Action.Download`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` a|*Download* + The **Download** action to download the Answer data. @@ -438,47 +421,38 @@ If you are using Visual Embed SDK version 1.21.0 or later to embed Liveboard, Se ** `Action.DownloadAsPng` |xref:Action.adoc#_downloadascsv[`Action.DownloadAsCsv`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` |*Download* > *CSV* + Downloads the answer data in the CSV file format. |xref:Action.adoc#_downloadasxlsx[`Action.DownloadAsXlsx`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` | *Download* > *XLSX* + Downloads the answer data in the XLSX file format. |xref:Action.adoc#_downloadaspdf[`Action.DownloadAsPdf`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` |*Download* > *PDF* + Downloads the answer data as a PDF file. Available only for tables. |xref:Action.adoc#_downloadaspng[`Action.DownloadAsPng`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` |*Download* > *PNG* + Downloads the chart as a PNG file. Available only for charts. |xref:Action.adoc#_showunderlyingdata[`Action.ShowUnderlyingData`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed`|*Show underlying data* + Displays detailed information and raw data for a given visualization. Available as a menu action in the *More* menu image:./images/icon-more-10px.png[the more options menu] and the contextual menu. |xref:Action.adoc#_answerdelete[`Action.AnswerDelete`]| `AppEmbed`|*Delete* + Deletes the answer. -|xref:Action.adoc#_synctosheets[`Action.SyncToSheets`]|`SageEmbed` + -`SearchEmbed` + +|xref:Action.adoc#_synctosheets[`Action.SyncToSheets`]|`SearchEmbed` + `AppEmbed`| The *Sync to sheets* action in the **More** actions menu. + Allows creating a sync to send data to the Google Sheets app. -|xref:Action.adoc#_synctootherapps[`Action.SyncToOtherApps`] |`SageEmbed` + -`SearchEmbed` + +|xref:Action.adoc#_synctootherapps[`Action.SyncToOtherApps`] |`SearchEmbed` + `AppEmbed`| The *Sync to other apps* action in the **More** actions menu. + Allows creating a sync to send data to external business apps such as Slack, Salesforce, and Microsoft Teams. -|xref:Action.adoc#_managepipelines[`Action.ManagePipelines`]|`SageEmbed` + -`SearchEmbed` + +|xref:Action.adoc#_managepipelines[`Action.ManagePipelines`]|`SearchEmbed` + `AppEmbed`| The *Manage pipelines* action in the **More** actions menu. + Allows managing data sync pipelines to external business apps set as sync destinations in ThoughtSpot. |xref:Action.adoc#_exporttml[`Action.ExportTML`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` | *Export TML* + Exports the TML representation of an answer from ThoughtSpot. @@ -497,22 +471,18 @@ The following actions are available in the contextual menu of an Answer: |===== |Action string in SDK| Required SDK library|Action label in the UI |xref:Action.adoc#_drillexclude[`Action.DrillExclude`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed`|*Exclude* + Allows you to exclude a specific data point when drilling down on an Answer. |xref:Action.adoc#_drillinclude[`Action.DrillInclude`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` |*Include* + Allows you to include a specific data point during drill down on an Answer. |xref:Action.adoc#_drilldown[`Action.DrillDown`]|`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed` |*Drill down* + Allows you to drill down the data for additional details and granular information. Available as a contextual menu action. |xref:Action.adoc#_copytoclipboard[`Action.CopyToClipboard`] |`SpotterEmbed` + -`SageEmbed` + `SearchEmbed` + `AppEmbed`|*Copy to clipboard* + Copies the selected data point. Available as a contextual menu action for table data. @@ -526,72 +496,58 @@ The SDK provides the following Action enumerations for the contextual menu actio |===== |Action string in SDK| Required SDK library|Action label in the UI -|xref:Action.adoc#_axismenuaggregate[`Action.AxisMenuAggregate`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenuaggregate[`Action.AxisMenuAggregate`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` + | *Aggregate* option in the chart axis or the table column customization menu. + Provides aggregation options to analyze the data on a chart or table. -|xref:Action.adoc#_axismenuconditionalformat[`Action.AxisMenuConditionalFormat`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenuconditionalformat[`Action.AxisMenuConditionalFormat`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Conditional formatting* menu option. + Allows adding rules for conditional formatting of data points on a chart or table. -|xref:Action.adoc#_axismenuedit[`Action.AxisMenuEdit`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenuedit[`Action.AxisMenuEdit`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Edit* action in the axis customization menu. + Allows editing the axis name, position, minimum and maximum values and format a column. -|xref:Action.adoc#_axismenufilter[`Action.AxisMenuFilter`] | `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenufilter[`Action.AxisMenuFilter`] | `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Filter* action in the chart axis or table column customization menu. + Allows adding, editing, or removing filters. -|xref:Action.adoc#_axismenugroup[`Action.AxisMenuGroup`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenugroup[`Action.AxisMenuGroup`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Group* option in the chart axis or table column customization menu. + Allows grouping data points if the axes use the same unit of measurement and a similar scale. -|xref:Action.adoc#_axismenunumberformat[`Action.AxisMenuNumberFormat`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenunumberformat[`Action.AxisMenuNumberFormat`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed`| *Number format* option to customize the format of the data labels on a chart or table. -|xref:Action.adoc#_axismenuposition[`Action.AxisMenuPosition`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenuposition[`Action.AxisMenuPosition`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Position* option in axis customization menu. + Allows changing the position of the axis to the left or right side of the chart. -|xref:Action.adoc#_axismenuremove[`Action.AxisMenuRemove`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenuremove[`Action.AxisMenuRemove`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Remove* in the chart axis or table column customization menu. + Removes the data labels from a chart or the column of a table visualization. -|xref:Action.adoc#_axismenurename[`Action.AxisMenuRename`] | `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenurename[`Action.AxisMenuRename`] | `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Rename* option in the chart axis or table column customization menu. + Renames axis label on a chart or the column header on a table. -|xref:Action.adoc#_axismenusort[`Action.AxisMenuSort`]|`SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenusort[`Action.AxisMenuSort`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Sort* option to sort the data in the ascending or descending order on a chart or table. -|xref:Action.adoc#_axismenutextwrapping[`Action.AxisMenuTextWrapping`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenutextwrapping[`Action.AxisMenuTextWrapping`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Text wrapping* option on a table visualization. + Wraps or clips column text on a table. -|xref:Action.adoc#_axismenutimebucket[`Action.AxisMenuTimeBucket`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenutimebucket[`Action.AxisMenuTimeBucket`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Time bucket* option in the chart axis or table column customization menu. + Allows defining time metric for date comparison. -|xref:Action.adoc#_axismenucompare[`Action.AxisMenuCompare`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenucompare[`Action.AxisMenuCompare`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Compare with* option in the chart axis customization menu. + Allows comparing data across dimensions or measures. -|xref:Action.adoc#_axismenumerge[`Action.AxisMenuMerge`]| `SageEmbed` + -`AppEmbed` + +|xref:Action.adoc#_axismenumerge[`Action.AxisMenuMerge`]| `AppEmbed` + `SearchEmbed` + `LiveboardEmbed` | *Merge with* option in the chart axis customization menu. + Allows merging data across dimensions or measures. From c1f8e6ab29ddad16b5bb3b3451c3611d8c686dc4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 12 May 2026 14:17:04 +0530 Subject: [PATCH 13/61] sageembed section removal --- modules/ROOT/pages/embed-ts-react-app.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/embed-ts-react-app.adoc b/modules/ROOT/pages/embed-ts-react-app.adoc index e81a02ab1..58eca50d9 100644 --- a/modules/ROOT/pages/embed-ts-react-app.adoc +++ b/modules/ROOT/pages/embed-ts-react-app.adoc @@ -825,7 +825,7 @@ For more information about `SearchEmbed` objects and attributes, see the followi [.bordered] image::./images/embed-search-react.png[] - +//// == Embed a Natural Language Search (Legacy interface) To embed ThoughtSpot Natural Language Search interface, complete the steps listed in the following sections. @@ -934,6 +934,7 @@ For more information about `SageEmbed` objects and attributes, see the following + [.bordered] image::./images/sage-embed.png[] +//// [#react-routes] == Add routes for navigation From 91b8f0241d1f3ea932229936f6cfaedd3967a62e Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 13 May 2026 06:12:12 +0530 Subject: [PATCH 14/61] outdated page deleted --- modules/ROOT/pages/push-data-to-slack.adoc | 177 --------------------- 1 file changed, 177 deletions(-) delete mode 100644 modules/ROOT/pages/push-data-to-slack.adoc diff --git a/modules/ROOT/pages/push-data-to-slack.adoc b/modules/ROOT/pages/push-data-to-slack.adoc deleted file mode 100644 index 273ad8486..000000000 --- a/modules/ROOT/pages/push-data-to-slack.adoc +++ /dev/null @@ -1,177 +0,0 @@ - -= Push data to a Slack workspace[beta betaBackground]^Beta^ -:toc: true - -:page-title: Integrate ThoughtSpot with Slack app -:page-pageid: slack-integration -:page-description: You can connect users to their Slack workspace via app actions and allow them to push insights to a Slack channel - -With most businesses using Slack for communication and team collaboration, business users and analysts may want to deliver insights to their Slack workspace from the ThoughtSpot UI. ThoughtSpot makes it easier for your developers to automate the app integration workflow and enable seamless integration with your business apps. With app actions, users can now connect their Slack workspace with ThoughtSpot and push insights directly to their Slack channels. - - -== Before you begin - -To integrate Slack workspaces with ThoughtSpot, you will need the following: - -* A ThoughtSpot user account with developer or admin privileges to create app actions -* A ThoughtSpot user with a Slack account -* A ThoughtSpot application instance with *New Answer Experience* enabled -* A saved answer or Liveboard visualization - - -== Integration workflow - -The Slack app integration workflow involves the following steps: - -. A developer or admin user creates an app action for Slack in the Developer portal. -+ -This step sets Slack as a destination app. -. A user clicks a Slack app action on a saved answer or Liveboard visualization, and invokes the workflow. - -+ -This step initiates the OAuth workflow to secure data transactions between the source and destination app. -. ThoughtSpot requests access to the users' Slack workspace. -. The user authorizes the request. - -+ -This step creates a pipeline between ThoughtSpot and the destination app for data exchange. -. ThoughtSpot obtains a list of channels from the user's Slack workspace. -. The user selects a channel and clicks **Send now**. -. ThoughtSpot pushes the answer data or insights from the visualization to the specified channel in the specified file format. - - -== Get started - -The Slack app integration procedure involves the following steps: - -. xref:push-data-to-slack.adoc#app-action-slack[Create an app action with Slack as the destination app] -. xref:push-data-to-slack.adoc#initiateActionSlack[Initiate a data push request to Slack] -. xref:push-data-to-slack.adoc#viewInSlack[View insights in your Slack workspace] - -[#app-action-slack] -=== Create an app action with Slack as the destination app - -To create an app action for Slack, complete the following steps: - -. Log in to ThoughtSpot with your admin or developer user credentials. -. Go to *Develop* > *Customizations* > *Custom actions*. -. Click *Create action*. -. Enter a name for the action. For example, __Send to Slack__. -. Select the *App* option and then select **Slack** from the *Select app* drop-down. -+ -Note that the app action ID is generated automatically. - -. To add this action globally to all visualizations and saved answers, select *On by default on all visualizations*. -+ -If you do not select this checkbox, the app action is set as *Local* and is not assigned to any visualization or saved answer. - -+ -[.bordered] -image:./images/app-action-dev.png[App action creation, width=auto] - -+ -. To restrict action availability to specific user groups, click *Show advanced availability settings*, and select the groups. - -. Click *Create action*. - -. To view the custom action you just created, navigate to a visualization or saved answer page. - -+ -include::{path}/global-local-action.adoc[] - - -[#initiateActionSlack] -=== Initiate the app action - -Before you begin, perform the following checks: - -* You have access to a Slack workspace. -* The *New Answer experience* is enabled on your ThoughtSpot application instance. -* The Slack app action is added to a visualization or saved answer on your instance. - -[NOTE] -==== -The Slack app authorization page opens as a pop-up. Make sure your web browser allows pop-ups from the ThoughtSpot application. -==== - -To initiate a data push request to your Slack workspace, complete the following steps: - -. Go to a Liveboard visualization or saved answer page. - -. If you have created an answer from a new query, make sure you save the answer. -+ -If the app action is set as a global action, the action will appear in the **More** menu image:./images/icon-more-10px.png[the more options menu]. If the action is set as a local app action, you must add it to your answer page. - -. Click the action to initiate a data push request. - -+ -[.bordered] -image::./images/initiate-app-action.png[Initiate an app action] - -. In the app authorization pop-up, select your Slack workspace. - -If the ThoughtSpot app is not installed in your Slack workspace:: - -The app authorization page prompts you to install the app. - -* If you have admin rights to your workspace, complete the installation, and then retry the Slack action workflow. - -* If you don't have access rights to install the app in your Slack workspace: -.. Click **Submit** to send a request to your workspace administrator. You can also add a message for your workspace administrator in the request. -+ -Your Slack workspace administrator will receive a Slackbot notification to approve the request. - -.. Close the app authorization pop-up and return to the ThoughtSpot UI. -.. Wait until your request is approved by the Slack workspace administrator. If your request is approved, you will receive a notification via email and Slackbot. -+ -If your request is not approved, the app authorization pop-up displays the *Your request is already submitted* message when you re-initiate the Slack app action. Contact your Slack administrator and ensure that the ThoughtSpot app is installed in your workspace. - -.. After you receive a notification from Slackbot or email about the request approval, re-initiate the data push workflow by clicking the app action in the ThoughtSpot UI. - -+ -If the ThoughtSpot app is installed in your Slack workspace:: -ThoughtSpot requests access to your Slack workspace and opens the app authorization pop-up. -+ -If you are not logged in to Slack workspace, the app authorization page prompts you to sign in. To continue with the integration, sign in with your credentials. - -. To authorize ThoughtSpot to send data, click **Allow**. - -+ -This step is required only if you are using the Slack integration action for the first time or when ThoughtSpot refreshes its OAuth access token. - -. Wait for ThoughtSpot to connect to your workspace and obtain a list of channels. - -+ -If the connection is successful, the app action dialog in the ThoughtSpot UI displays a list of Slack channels. - -+ -[.bordered] -image:./images/send-to-slack.png[Initiate an app action, width=auto] - -. Select a channel from the *Slack channel* drop-down. -+ -You can also search for a channel and then select it. - -. If required, modify the title of the data. -. Specify the text to send in your Slack message. -. Specify if the data must be sent as a PNG file or in the CSV format, or both. -+ - -[NOTE] -==== -ThoughtSpot does not support sending data in the PNG format if a chart or table does not include measures. -==== -. Click **Send now**. - -[#viewInSlack] -=== View insights in your Slack workspace - -To view the insights sent to a Slack channel: - -. Go to your Slack workspace. -. Click the channel to which you have sent the data. -. Verify the data in the CSV and image files. -+ -To view the source app details in your Slack workspace, go to *Apps* in your Slack app. - - From 729eb574b3aecce64632857bbb6f5f53d592ab05 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 13 May 2026 06:59:03 +0530 Subject: [PATCH 15/61] edits --- modules/ROOT/pages/embed-ts-react-app.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/embed-ts-react-app.adoc b/modules/ROOT/pages/embed-ts-react-app.adoc index 58eca50d9..f0bf63313 100644 --- a/modules/ROOT/pages/embed-ts-react-app.adoc +++ b/modules/ROOT/pages/embed-ts-react-app.adoc @@ -290,7 +290,7 @@ image::./images/viz-embed-react.png[] == Embed a saved answer -To embed a ThoughtSpot saved answer in your React app, use the `SearchEmbed` component with the `savedAnswerGuid` property. +To embed a ThoughtSpot saved answer in your React app, use the `SearchEmbed` component with the `answerId` property. === Create a saved answer component @@ -360,7 +360,7 @@ const SavedAnswer = () => { frameParams={{ height: 600, }} - savedAnswerGuid="" + answerId="" hideSearchBar={true} onInit={onInit} onLoad={onLoad} From 06dbcc117f6dcbdaf8a89598393e2c046b802ad6 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 13 May 2026 07:07:16 +0530 Subject: [PATCH 16/61] css edits for search --- src/components/Search/index.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/Search/index.scss b/src/components/Search/index.scss index be0d8fc8e..afb3ae35e 100644 --- a/src/components/Search/index.scss +++ b/src/components/Search/index.scss @@ -43,8 +43,7 @@ height: $height-search-input; padding-left: $padding-left-search-input; font-size: 15px; - color: var(--border-color); - + color: var(--primary-color); font-family: $font-family-doc; padding-bottom: 1px; background: inherit; From abec8d6708726dec79c97dc4156ab7c225c54c39 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 13 May 2026 15:38:21 +0530 Subject: [PATCH 17/61] theme-builder fix and light/dark mode setting for in-product presentation --- src/assets/styles/index.scss | 23 ++++++++++++++++++++++- src/components/DevDocTemplate/index.tsx | 8 ++++++++ src/components/Document/index.tsx | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index ad867b8ed..4b63c8564 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -1106,7 +1106,7 @@ a.anchor { box-shadow: 0 3px 3px #122246; padding: 30px 0 0 40px; - + .header-banner-text { display: flex; flex-direction: column; @@ -1126,6 +1126,27 @@ a.anchor { } } +// In-product presentation only: override banner color to match product sidebar (#232F43). +// Standalone light/dark banner gradient is preserved via var(--header-banner-background) above. +.embedded-mode .header-banner { + background: #232F43; + box-shadow: none; +} + +// Fluid home page cards for both standalone and embedded presentations. +// Using flex shorthand so cards reflow naturally when the viewport or iframe width changes. +.introCard, +.boxHalfWidth { + flex: 1 1 260px; + width: auto; + max-width: 400px; +} + +.boxDiv { + flex: 1 1 220px; + width: auto; +} + .cardHeading { font-size: $font-size-h2; color: var(--primary-color) #1d232f; diff --git a/src/components/DevDocTemplate/index.tsx b/src/components/DevDocTemplate/index.tsx index a1e1ad89b..e3e685497 100644 --- a/src/components/DevDocTemplate/index.tsx +++ b/src/components/DevDocTemplate/index.tsx @@ -103,6 +103,8 @@ const DevDocTemplate: FC = (props) => { }); const [isDarkMode, setDarkMode] = useState(() => { if (typeof window === 'undefined') return false; + // In-product (embedded) presentation always uses light mode — product UI has no theme toggle. + if (!isPublicSite(location.search)) return false; /* themeMode is only written when the user explicitly clicks the toggle. If absent, follow OS preference fresh every load. */ const explicitChoice = localStorage.getItem('themeMode'); @@ -218,6 +220,12 @@ const DevDocTemplate: FC = (props) => { useEffect(() => { if (isBrowser()) { + // In-product (embedded) presentation always uses light mode. + if (!isPublicSiteOpen) { + setDarkMode(false); + setKey('dark'); + return; + } /* Correct SSR mismatch on first hydration */ const explicitChoice = localStorage.getItem('themeMode'); let isDark: boolean; diff --git a/src/components/Document/index.tsx b/src/components/Document/index.tsx index 4f2f32fb3..e77550308 100644 --- a/src/components/Document/index.tsx +++ b/src/components/Document/index.tsx @@ -137,7 +137,7 @@ const Document = (props: { pageid={props.pageid} /> )} - {!isHomePage && ( + {!isHomePage && props.isPublicSiteOpen && (
From af5bd135c8742d93e73bcb0c0ba7236ec04625f2 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 13 May 2026 16:42:59 +0530 Subject: [PATCH 18/61] CI check fix --- .../__snapshots__/index.test.tsx.snap | 62 ------------------- 1 file changed, 62 deletions(-) diff --git a/src/components/Document/__snapshots__/index.test.tsx.snap b/src/components/Document/__snapshots__/index.test.tsx.snap index 7331b4d67..9cd36ba70 100644 --- a/src/components/Document/__snapshots__/index.test.tsx.snap +++ b/src/components/Document/__snapshots__/index.test.tsx.snap @@ -6,68 +6,6 @@ exports[`Document should render correctly if isPublicSiteOpen is false 1`] = ` class="documentWrapper" style="width: 100%;" > -
-
- -
-
Date: Wed, 13 May 2026 17:12:05 +0530 Subject: [PATCH 19/61] copy button issue on code blocks --- src/components/Document/helper.tsx | 26 +++++++++++++------------- src/components/Document/index.scss | 8 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/components/Document/helper.tsx b/src/components/Document/helper.tsx index 86287fb78..e464ff054 100644 --- a/src/components/Document/helper.tsx +++ b/src/components/Document/helper.tsx @@ -53,20 +53,21 @@ export const customizeDocContent = () => { * Restructure code blocks to have a permanent header bar: * lang label (left) · copy button (right) * - * Before:
...
- * After:
- *
- * JS - * - *
- *
...
- *
+ * Covers all listing/literal blocks regardless of [source,lang] annotation. + * For annotated blocks, lang is read from code[data-lang] and the code element + * is used as the copy source. For unannotated blocks, lang is empty and the + * pre element is the copy source. * * Guard against double-processing on re-render. */ - document.querySelectorAll(selectors.codeBlocks).forEach((tag) => { - const pre = tag.parentElement; - if (!pre || pre.parentElement?.classList.contains('code-block-wrapper')) return; + document.querySelectorAll( + '.listingblock>.content>pre, .literalblock>.content>pre', + ).forEach((pre) => { + if (pre.parentElement?.classList.contains('code-block-wrapper')) return; + + const codeEl = pre.querySelector('code[data-lang]'); + const rawLang = codeEl?.getAttribute('data-lang') || ''; + const copySource: HTMLElement = codeEl || pre; /* ── Header bar ── */ const header = document.createElement('div'); @@ -74,7 +75,6 @@ export const customizeDocContent = () => { /* Language label (left) */ const langSpan = document.createElement('span'); - const rawLang = tag.getAttribute('data-lang') || ''; langSpan.classList.add('lang'); langSpan.innerText = rawLang; header.appendChild(langSpan); @@ -89,7 +89,7 @@ export const customizeDocContent = () => { imageElement.innerHTML = getHTMLFromComponent(, 'copyIcon'); buttonElement.appendChild(imageElement); - enableCopyToClipboard(buttonElement, tag as HTMLElement); + enableCopyToClipboard(buttonElement, copySource); header.appendChild(buttonElement); /* ── Wrap pre in code-block-wrapper ── */ diff --git a/src/components/Document/index.scss b/src/components/Document/index.scss index d2ff882e5..44daed6ae 100644 --- a/src/components/Document/index.scss +++ b/src/components/Document/index.scss @@ -189,11 +189,11 @@ /* Light mode: keep code blocks dark for better readability */ #wrapper[data-theme='light'] & { .code-block-wrapper { - border-color: #1e2430; + border-color: #1D232F; .code-block-header { - background: #1e2430; - border: 1px solid #458; + background: #0d1117; + border: 1px solid #30363d; .lang { color: #fff; } .copyButton { @@ -204,7 +204,7 @@ } } pre { - background: #1e2430; + background: #1D232F; color: #cdd9e5; } } From 3181588e6fd69feafa348a39b84f69767780b1a6 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 20 May 2026 13:53:34 +0530 Subject: [PATCH 20/61] auth and answer api --- modules/ROOT/pages/authentication.adoc | 39 +++++++++++++++++++ modules/ROOT/pages/data-report-v2-api.adoc | 37 +++++++++++++++++- modules/ROOT/pages/rest-api-v2-reference.adoc | 9 +++++ modules/ROOT/pages/rest-apiv2-changelog.adoc | 29 ++++++++++++++ 4 files changed, 113 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/authentication.adoc b/modules/ROOT/pages/authentication.adoc index 4d0b69cf0..c2e6535b0 100644 --- a/modules/ROOT/pages/authentication.adoc +++ b/modules/ROOT/pages/authentication.adoc @@ -772,6 +772,45 @@ curl -X POST \ If the API request is successful, ThoughtSpot returns a 204 status code and ends the user session. +== Configuring authentication settings +To enable or disable authentication at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/configure` endpoint. + +=== Request parameters +[width="100%" cols="1,4"] +[options='header'] +|===== +|Parameter|Description +|`auth_type` +|__String__. Type of authentication mechanism to configure. Currently, supports `TRUSTED_AUTH` only. + +|`cluster_preferences` +__Optional__ +|__Nullable__. `ENABLE` or `DISABLE` authentication for the cluster. When enabled, a new token is generated if one does not exist. When disabled, the existing cluster-level access token is revoked. + +|`org_preferences` +__Optional__ +|__Nullable__. `ENABLE` or `DISABLE` authentication for a particular Org. When enabled, a new org-level access token is generated if one does not exist. When disabled, the existing org-level access token is revoked. + +|`org_identifier` + +|===== + +== Search authentication settings +To find the authentication configuration for the specified auth type at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint. + +=== Request parameters +[width="100%" cols="1,4"] +[options='header'] +|===== +|Parameter|Description +|`auth_type` +|__String__. Type of authentication mechanism to configure. Currently, supports `TRUSTED_AUTH` only. + +|`scope` +__Optional__ +|__String__. Select `CLUSTER` to retrieve only cluster-level settings, or `ORG` to retrieve only Org-level settings. If no selection is made, both cluster and Org-level settings are retrieved based on user permissions. +|===== + //// ==== Response codes diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 17daad593..359283c4a 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -481,6 +481,41 @@ curl -X POST \ * HTML rendering is not supported for PDF exports of Answers with tables. ==== + +Contact ThoughtSpot support to enable these additional settings for this API endpoint on your ThoughtSpot instance. + +* `personalised_view_identifier` [beta betaBackground]^Beta^ + +Optional parameter to specify the GUID of the personalised view of the Answer object that you want to download. +* `type` [beta betaBackground]^Beta^ + +Used to distinguish between a saved answer and a pinned answer on a Liveboard. Setting this parameter to `PINNED` allows the API to +accept the guid of a pinned Answer directly as the `metadata_identifier`. When +exporting a `PINNED` answer, all Liveboard-level filters, Runtime Filters, and Column +Security Rules (CSR) are automatically applied to the export output. + +The `png_options` [beta betaBackground]^Beta^ support the following properties: + +[cols="1,1,3"] +|=== +|Property |Type |Description + +|`x_resolution` +|Number +|Width of the exported PNG in pixels. + +Valid range: `600px` to `3840px`. + +|`y_resolution` +|Number +|Height of the exported PNG in pixels. + +Valid range: `600px` to `3840px`. + +|`scaling` +|Integer +|Display scale percentage for objects rendered in the image. Adjusts the relative +size of visual elements without cropping the image. + +Valid range: `80%` to `400%`. +|=== + + [#exportSpotterData] ==== Export data generated from Spotter APIs To export results generated from Spotter APIs such as `/api/rest/2.0/ai/answer/create`, `/api/rest/2.0/ai/agent/converse/sse`, and `/api/rest/2.0/ai/conversation/{conversation_identifier}/converse`, include the session ID and generation number in the `POST` request body. @@ -504,7 +539,7 @@ curl -X POST \ * `session_identifier` refers to session ID returned in the Spotter API response. * `generation_number` indicates the Answer generation number. -* `file_format` specifies the format of the output. You can export the Spotter-generated data as PNG or CSV file. By default, the API exports this data in PNG file format. +* `file_format` specifies the format of the output. You can export the Spotter-generated data as PNG, CSV, XLSX, or PDF file. By default, the API exports this data in PNG file format. ===== API Response diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index 00170609a..7f9a8238b 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -130,6 +130,15 @@ ThoughtSpot Software: __10.0.0.sw or later__ a| +++Try it out +++ + +a| `POST /api/rest/2.0/auth/configure` + +Enables or disables authentication. a| ThoughtSpot Cloud: __26.6.0.cl or later__ + +a| +++Try it out +++ + +a| `POST /api/rest/2.0/auth/search` + +Retrieves the authentication configuration for the specified auth type. a| ThoughtSpot Cloud: __26.6.0.cl or later__ + +a| +++Try it out +++ + |===== -- diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 720af01df..75a48e171 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,6 +8,35 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. +== Version 26.6.0.cl, June 2026 +=== New API endpoints +==== Authentication +The following new endpoints allow searching for the authentication configuration at the cluster or Org level, and also allows enabling and disabling the authentication. Currently, only support trusted authentication. + +* `POST /api/rest/2.0/auth/configure` + +Enables or disables authentication at cluster or Org level for the specified auth type. +* `POST /api/rest/2.0/auth/search` + +Returns the authentication configuration for the specified auth type at cluster and Org level. + +=== Answer report API enhancements [beta betaBackground]^Beta^ + +The `POST /api/rest/2.0/report/answer` endpoint includes the following new request parameters: + +* `personalised_view_identifier` + +Optional parameter to specify the GUID of the personalised view of the Answer object that you want to download. + +* `type` + +Specifies the type of Answer to export. + +In addition to these parameters, you can also define the following properties for PNG downloads: + +* `x_resolution` +* `y_resolution` +* `scaling` + +Contact ThoughtSpot support to enable these settings for PNG downloads on your ThoughtSpot instance. +For more information, see xref:data-report-v2-api.adoc#_answer_report_api[Answer report API documentation]. + == Version 26.5.0.cl, May 2026 === Sync connection metadata attributes From 0805645d975a0e87c24330ffae747c3c0289eac4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Sun, 24 May 2026 22:31:22 +0530 Subject: [PATCH 21/61] SCAL-314103 fix --- modules/ROOT/pages/spottercode-prompt-guide.adoc | 2 +- modules/ROOT/pages/spottercode.adoc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/spottercode-prompt-guide.adoc b/modules/ROOT/pages/spottercode-prompt-guide.adoc index 0b8fd49cb..e9cfa41f0 100644 --- a/modules/ROOT/pages/spottercode-prompt-guide.adoc +++ b/modules/ROOT/pages/spottercode-prompt-guide.adoc @@ -35,7 +35,7 @@ Refer to the prompt examples in the following table for ThoughtSpot embedding us |Vague prompt|Clear prompt |How do I embed ThoughtSpot?| I want to embed full ThoughtSpot application in my app. Use the available tools to get this information and generate the embed code. |I want to use ThoughtSpot in my app.| I want to embed a ThoughtSpot Liveboard in my React application. Use the available tools to get this information and generate the embed code. -|Show me how to use the SDK. | I want to embed ThoughtSpot Spotter Search and AI analytics in my application. Use the 'get-visual-embed-sdk-reference' and 'get-developer-docs-reference' tools to get the information and code samples. +|Show me how to use the SDK. | I want to embed ThoughtSpot Spotter Search and AI analytics in my application. Use the available tools to get the information and code samples. |Give me code for embedding analytics. | Provide an example of embedding the full ThoughtSpot application using AppEmbed. |How do I add Search? | How do I use the SearchEmbed component to embed a search page with a pre-selected data source? a| diff --git a/modules/ROOT/pages/spottercode.adoc b/modules/ROOT/pages/spottercode.adoc index d3647f055..968b3150d 100644 --- a/modules/ROOT/pages/spottercode.adoc +++ b/modules/ROOT/pages/spottercode.adoc @@ -45,8 +45,10 @@ The initial version of SpotterCode supports the following IDEs: == Supported skills SpotterCode provides the following skills to the AI agent on your IDE: +//// * `get-visual-embed-sdk-reference` + A documentation lookup skill that accesses Visual Embed SDK documentation and generates code samples for embedding ThoughtSpot content, including supported embed types, authentication, configuration, customization, event hooks, and code samples. +//// * `get-rest-api-reference` + Provides REST API specifications, endpoints, request/response formats, authentication flows, CRUD operations, and SDKs for TypeScript and Java. From a428355f5b1fa86a1be07221ae0cc1002c9beeb7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 25 May 2026 10:08:54 +0530 Subject: [PATCH 22/61] SCAL-314354 fix --- .../ROOT/pages/spottercode-integration.adoc | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/spottercode-integration.adoc b/modules/ROOT/pages/spottercode-integration.adoc index 386f231c9..4fc9a1104 100644 --- a/modules/ROOT/pages/spottercode-integration.adoc +++ b/modules/ROOT/pages/spottercode-integration.adoc @@ -84,7 +84,23 @@ To add an MCP Server to Visual Studio Code, you can use the Extensions view, the After you add the MCP server URL, the SpotterCode MCP server will be available in the Extensions view. For more information about configuring MCP servers in Visual Studio Code, refer to link:https://code.visualstudio.com/docs/copilot/customization/mcp-servers[Visual Studio Code Documentation, window=_blank]. -== Integrate SpotterCode with Claude Code +== Integrate SpotterCode with Claude + +If your Claude account includes access to Claude AI (web chat), you can add SpotterCode as a remote MCP connector. Connectors added in Claude AI automatically sync to Claude Cowork and Claude Code without any additional configuration. + +For the xref:spottercode-integration.adoc#_for_integration_setup_with_claude_code[Claude Code-only setup], you must manually point Claude Code to the SpotterCode MCP server via CLI. + +=== For integration setup with Claude AI +To add SpotterCode as a custom connector: + +. Go to **Customize** > **Connectors** +. Click the `+` icon and select **Add custom connector**. +. Enter the SpotterCode MCP server URL. +. Click **Add**. + +This configuration will automatically enable SpotterCode in Claude AI chat, Claude Cowork, and Claude Code for users of the Claude account. + +=== For Claude Code-only setup To enable SpotterCode in Claude Code, add the MCP server URL using the following `claude mcp add` command in Claude Code CLI. @@ -93,7 +109,8 @@ To enable SpotterCode in Claude Code, add the MCP server URL using the following claude mcp add --transport http SpotterCode https://spottercode.thoughtspot.app/mcp ---- -If you are using Claude Desktop, you can add the URL directly to the Claude configuration JSON file: +=== For Claude Desktop +If you are using Claude Desktop, add the URL directly to the Claude configuration JSON file: [source,JSON] ---- @@ -106,7 +123,7 @@ If you are using Claude Desktop, you can add the URL directly to the Claude conf } ---- -For more information about adding MCP servers to Claude Code, see link:https://code.claude.com/docs/en/mcp[Claude Code Documentation, window=_blank]. +//For more information about adding MCP servers to Claude Code, see link:https://code.claude.com/docs/en/mcp[Claude Code Documentation, window=_blank]. == Verify the integration From 9be2dbb22bf5bbf5be3330f63f22766076ca60f7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 25 May 2026 21:24:58 +0530 Subject: [PATCH 23/61] claude cowork update --- modules/ROOT/pages/spottercode-integration.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/spottercode-integration.adoc b/modules/ROOT/pages/spottercode-integration.adoc index 4fc9a1104..fde13e6df 100644 --- a/modules/ROOT/pages/spottercode-integration.adoc +++ b/modules/ROOT/pages/spottercode-integration.adoc @@ -86,7 +86,7 @@ After you add the MCP server URL, the SpotterCode MCP server will be available i == Integrate SpotterCode with Claude -If your Claude account includes access to Claude AI (web chat), you can add SpotterCode as a remote MCP connector. Connectors added in Claude AI automatically sync to Claude Cowork and Claude Code without any additional configuration. +If your Claude account includes access to Claude AI (web chat), you can add SpotterCode as a remote MCP connector. Connectors added in Claude AI automatically sync to Claude Code without any additional configuration. For the xref:spottercode-integration.adoc#_for_integration_setup_with_claude_code[Claude Code-only setup], you must manually point Claude Code to the SpotterCode MCP server via CLI. @@ -98,7 +98,7 @@ To add SpotterCode as a custom connector: . Enter the SpotterCode MCP server URL. . Click **Add**. -This configuration will automatically enable SpotterCode in Claude AI chat, Claude Cowork, and Claude Code for users of the Claude account. +This configuration will automatically enable SpotterCode in Claude AI chat and Claude Code for users of the Claude account. === For Claude Code-only setup From d91e0753ccd444a6b3c2b0f5617023d15f202c7f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 26 May 2026 19:04:42 +0530 Subject: [PATCH 24/61] documentation for SCAL-282987 --- modules/ROOT/pages/common/nav.adoc | 1 + modules/ROOT/pages/timezone.adoc | 292 +++++++++++++++++++++++++++++ 2 files changed, 293 insertions(+) create mode 100644 modules/ROOT/pages/timezone.adoc diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index 9b6a374fa..bed83ea01 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -84,6 +84,7 @@ Integration guides ** link:{{navprefix}}/development-and-deployment[Development and deployment] *** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects overview] *** link:{{navprefix}}/variables[Variables] +*** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keyword filtering ^Beta^] *** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] *** link:{{navprefix}}/deploy-with-tml-apis[Deploy with TML APIs] **** link:{{navprefix}}/git-provider-integration[Git provider integration] diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc new file mode 100644 index 000000000..b307cc6bc --- /dev/null +++ b/modules/ROOT/pages/timezone.adoc @@ -0,0 +1,292 @@ += Timezone-aware keyword filtering in embedded apps +:toc: true +:toclevels: 2 + +:page-title: Timezone awareness for embedded analytics +:page-pageid: timezone-aware-filtering +:page-description: Configure per-Org and per-user timezone settings in embedded ThoughtSpot deployments using the Variable API, so that all relative date and time keywords resolve correctly for every user. +:keywords: timezone, ts_user_timezone, Variable API, date keywords, embedded, TSE, Org timezone, user timezone + +[beta betaBackground]#Beta# + +The timezone awareness feature in ThoughtSpot allows configuring a preferred time zone for a user or at the Org level, or both, and using this timezone when generating search results for a user's query. + +== Overview +In deployments where users can span across multiple regions, date and time keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, resolve based on default timezone of the ThoughtSpot instance. Sometimes, this behavior can lead to discrepancies for users in different timezones, especially when generating reports or filtering data for specific periods. For example, for a user in the USA, `yesterday` shows as Sunday, whereas for a user in the APAC region, this could mean Monday, and they may expect data for Monday. + +Timezone customization allows administrators to configure a timezone at the user or Org level. All relative date and time keywords will then resolve to the user’s or Org’s configured timezone, rather than the default timezone on the ThoughtSpot instance. This ensures that search results display consistent and accurate time-based data for every user, regardless of their location. It also allows each Org to maintain its independent timezone configuration, keeping the multi-Org embedded experience accurate and consistent for the users. + +[NOTE] +==== +The timezone awareness feature is currently in Beta and is disabled by default. To enable this feature, contact ThoughtSpot Support. +==== + +=== Timezone resolution + +Administrators can set the timezone preference for a user or an Org using the `ts_user_timezone` system variable. In the 26.5.0.cl and 26.6.0.cl release versions, this variable can be configured only through the Variable REST APIs. + +If `ts_user_timezone` does not have a value assigned at the user or Org level, ThoughtSpot continues to use the cluster's default timezone. + +At query time, ThoughtSpot resolves the correct timezone using the following precedence order: + +[cols="1,2,4", options="header"] +|=== +| Priority | Timezone scope | Description + +| 1 (Highest) +| User-level timezone +| Individual override. Applies to that user only. +A user-level value always takes precedence over the Org default. + +| 2 +| Org-level timezone +| Default for all users in the Org if there is no user-specific override. + +| 3 (Fallback to default behavior) +| Default timezone on the ThoughtSpot instance +| Platform default. If `ts_user_timezone` is not configured at the user or Org level, ThoughtSpot continues to use the default timezone. +|=== + +When a user runs a search or opens a Liveboard, ThoughtSpot evaluates this precedence chain automatically and applies the resolved timezone to all relative date calculations. Existing Models, formulas, or Liveboards do not require any configuration update. + +=== Supported interfaces + +Timezone-aware filtering and display is supported across the following ThoughtSpot interfaces: + +* Search Data +* Spotter +* Charts and Liveboards +* Liveboard Filters +* Liveboard Schedules +* KPI Alerts +* SpotIQ + +[#set-up-timezone-awareness] +== Timezone configuration +Timezone awareness is determined by the built-in system variable, `ts_user_timezone`. This variable is provisioned automatically, but it has no effect until a value is assigned via the Variable API. To set or update the values for the timezone variable via REST APIs, the API user must have the `ADMINISTRATION` privilege and also the `CAN_MANAGE_VARIABLES` role privilege. + +=== Supported strings for timezones + +The timezone values assigned to the `ts_user_timezone` variable must match the link:https://www.iana.org/time-zones[IANA timezone strings^]. Valid values include: + +* `America/New_York` +* `Asia/Kolkata` +* `Europe/London` +* `America/Chicago` +* `Asia/Singapore` + +[IMPORTANT] +==== +UTC offset strings such as `UTC+5:30` or `GMT-8` are not supported. +==== + +=== Supported calendar types +Timezone configuration can be applied to all types of calendar, including standard (Gregorian), fiscal, and custom calendars. + +=== Supported column types +Timezone configuration changes are applicable only to the `Date` and `Date Timestamp` column types in the data. + +=== Assigning a timezone via REST API +To configure timezone preference for an Org, user, or both, use the `/api/rest/2.0/template/variables/{identifier}/update-values` API endpoint. + +Specifying system variable:: +In your API request, specify `ts_user_timezone` as the variable `identifier` and include it as a path parameter. + +Supported operation type:: +To add, replace, remove, or reset the timezone value, administrators can specify the operation type to one of the following values as needed: + +* `ADD` - Adds new values. +* `REMOVE` - Removes the values assigned to the variable. +* `REPLACE` - Replaces the values assigned to the variable. +* `RESET` - Clears the values assigned to the variable for all entities. + +==== Configuring timezone per Org +To configure timezone overrides for an Org, you must specify the Org name or ID and assign a timezone value to the variable in your API request to the `/api/rest/2.0/template/variables/{identifier}/update-values` API endpoint. The value specified for the timezone must be an xref:timezone.adoc#_supported_strings_for_timezones[IANA timezone string]. + +The following example assigns the `America/New_York` timezone for the Org specified in the request: + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/template/variables/ts_user_timezone/update-values' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "variable_assignment": [ + { + "assigned_values": [ + "America/New_York" + ], + "org_identifier": "OrgA" + } + ], + "operation": "ADD" +}' +---- + +=== Configuring user-specific overrides + +To set a different timezone for an individual user, specify the user ID in your API request to the `/api/rest/2.0/template/variables/{identifier}/update-values` endpoint. + +In the following API request example, the user scope is defined in the `principal_type` and `principal_identifier` parameters, and the `Europe/London` string is set as the timezone: + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/template/variables/ts_user_timezone/update-values' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "variable_assignment": [ + { + "assigned_values": [ + "Europe/London" + ], + "principal_type": "USER", + "principal_identifier": "UserA" + } + ], + "operation": "REPLACE" +}' +---- + +==== API response + +If the timezone update operation is successful, ThoughtSpot returns the 204 response code. + +=== Verifying timezone assignment +To verify the values assigned to the timezone variable, send an API request to the `/api/rest/2.0/template/variables/search` API endpoint, with the variable ID as `ts_user_timezone`. + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/template/variables/search' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "record_offset": 0, + "record_size": 10, + "response_content": "METADATA_AND_VALUES", + "variable_details": [ + { + "identifier": "ts_user_timezone" + } + ] +}' +---- + +The API returns a response with the values configured. + +[source,JSON] +---- +[ + { + "id":"8616932c-1c5c-4418-9fb5-4605b172780a", + "name":"ts_user_timezone", + "variable_type":"USER_PROPERTY", + "sensitive":false, + "values":[ + { + "value":"America/New_York", + "value_list":null, + "org_identifier":"Primary", + "principal_type":null, + "principal_identifier":null, + "model_identifier":null, + "priority":null + }, + { + "value":"Europe/London", + "value_list":null, + "org_identifier":"OrgB", + "principal_type":null, + "principal_identifier":null, + "model_identifier":null, + "priority":null + }, + { + "value":"Asia/Kolkata", + "value_list":null, + "org_identifier":"OrgB", + "principal_type":null, + "principal_identifier":null, + "model_identifier":null, + "priority":null + } + ], + "org":{ + "id":0, + "name":"Primary" + } + } +] +---- + +== Specifying timezone in formula and pass-through functions +If your cloud data warehouse (CDW) stores timestamps in a different timezone than the user's timezone, date and datetime keywords and filters must be applied to a derived datetime column created using a pass-through formula. The original UTC column is not used directly. Users with edit access to data model can create a pass-through function to create a derived datetime column and convert source values to the target timezone. + +=== Using `ts_user_timezone` variable in formula (Recommended) + +If the `ts_user_timezone` variable is configured for the Org or user, you can reference it directly inside formulas and pass-through functions to dynamically resolve the timezone to the IANA timezone string assigned to the variable for that Org or user. Using this variable eliminates the need for using hardcoded values. + +The following example shows the formula syntax with the `ts_user_timezone` variable: + +`sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), ts_var (ts_user_timezone),[])` + + +Where: + +* `sql_date_time_op` is the pass-through function for date/datetime operations. +* `"CONVERT_TIMEZONE('UTC', '{0}', {1})"` is the SQL template string. +** `CONVERT_TIMEZONE` is the CDW function signature. This varies per CDW. For example, `CONVERT_TIMEZONE` in Snowflake and `CONVERT_TZ` for MySQL. +** `UTC` indicates source timezone, the original timezone of your timestamp. +** `{0}` is the placeholder for the first argument after the template string. In this example, it will be replaced by the `ts_user_timezone` variable value set for the user. +** `{1}` is placeholder for the date/datetime column. +* `ts_var (ts_user_timezone)` is the variable placeholder for dynamic timezone conversion. +* `[]` is the name of the date/time column for the date/datetime conversion. + + +On query execution, the formula translates to: + +* `CONVERT_TIMEZONE('UTC', 'America/New_York', "{your_datetime_column}")` for the user in the EST timezone, for whom the `ts_user_timezone` variable value is set to `America/New_York`. +* `CONVERT_TIMEZONE('UTC', 'Asia/Kolkata', "{your_datetime_column}")` for the user in the IST timezone, for whom the `ts_user_timezone` variable value is set to `Asia/Kolkata`. + +=== Using hardcoded timezone values in formula +In ThoughtSpot Cloud 26.5.0.cl and earlier release versions, the timezone value was hardcoded in formulas to convert source values to the user's timezone. For example: + +---- +sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), '', []) +---- + +Where: + +* `sql_date_time_op` is the pass-through function for date/datetime operations. +* `"CONVERT_TIMEZONE('UTC', '{0}', {1})"` is the SQL template string. +** `CONVERT_TIMEZONE` is the CDW function signature. This varies per CDW. For example, `CONVERT_TIMEZONE` in Snowflake and `CONVERT_TZ` for MySQL. +** `UTC` indicates source timezone, the original timezone of your timestamp. +** `{0}` is the placeholder for the first argument after the template string. In the above example, it indicates the target timezone and is replaced by a hardcoded timezone string. +** `{1}` is placeholder for the date/datetime column. +* `` represents the hardcoded timezone string. For example, `Asia/Kolkata`. +* `[]` is the date/time column that you want to convert. This will replace the original date/datetime column source. + +On query execution, the formula converts the date/datetime values as per the hardcoded timezone string for the given date/datetime column. + + +== Verify the configuration + +To verify the configuration: + +* Use the Variable API search endpoint (`/api/rest/2.0/template/variables/search`) to retrieve and confirm the values configured for the Org and user. +* Query the date or datetime columns in your data and verify whether the date and time keywords resolve correctly as defined in the `ts_user_timezone` variable. +* Verify whether the SQL pass-through function is applied to the keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, in the data model. +* Switch to another Org which has a different timezone configured, run a search query, and verify the results. +* Verify whether the timezone configured for the user overrides the timezone set for the Org and system default on the ThoughtSpot instance. +* Verify the Liveboard scheduled jobs. Note that the timezone changes will be applied only to the upcoming scheduled job executions. + + +== Additional resources + +* For information about variable APIs, see xref:variables-api.adoc[Variable API reference] documentation and visit the link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fvariable%2Fput-variable-values[REST API Playground]. +* For more information about SQL passthrough functions, see link:https://docs.thoughtspot.com/cloud/26.5.0.cl/formula-reference#passthrough-functions[Formula function reference, window=_blank]. +* https://www.iana.org/time-zones[IANA Time Zone Database^] \ No newline at end of file From 7656129c755a1ff9007c64730e3c4259f8318198 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 26 May 2026 19:16:54 +0530 Subject: [PATCH 25/61] edits --- modules/ROOT/pages/common/nav.adoc | 39 ++++-------------------------- modules/ROOT/pages/timezone.adoc | 35 ++++++++++++--------------- 2 files changed, 21 insertions(+), 53 deletions(-) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index bed83ea01..b8125b984 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -50,14 +50,14 @@ Get started [.sidebar-title] Build and deploy -* link:{{navprefix}}/development-and-deployment[Development and deployment] ** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects] +** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keyword filtering ^Beta^] ** link:{{navprefix}}/variables[Variables] ** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] - -* link:{{navprefix}}/deploy-with-tml-apis[Deploy with TML APIs] -** link:{{navprefix}}/git-provider-integration[Git provider integration] -** link:{{navprefix}}/modify-tml[TML modification] +* link:{{navprefix}}/development-and-deployment[Development and deployment] +** link:{{navprefix}}/deploy-with-tml-apis[Deploy with TML APIs] +*** link:{{navprefix}}/git-provider-integration[Git provider integration] +*** link:{{navprefix}}/modify-tml[TML modification] * link:{{navprefix}}/publish-data-overview[Publish content to Orgs] ** link:{{navprefix}}/publish-to-orgs[Publish objects to Orgs] * link:{{navprefix}}/git-integration[Deploy with GitHub APIs (legacy)] @@ -75,35 +75,6 @@ Multi-tenancy ** link:{{navprefix}}/single-tenant-data-models[Single-tenant data models with Orgs] * link:{{navprefix}}/tse-cluster[Cluster maintenance and upgrade] -[.sidebar-title] -Integration guides - -** link:{{navprefix}}/external-tool-script-integration[Third-party tools and custom scripts] - -* link:{{navprefix}}/development-and-deployment[Deployment and integration] -** link:{{navprefix}}/development-and-deployment[Development and deployment] -*** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects overview] -*** link:{{navprefix}}/variables[Variables] -*** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keyword filtering ^Beta^] -*** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] -*** link:{{navprefix}}/deploy-with-tml-apis[Deploy with TML APIs] -**** link:{{navprefix}}/git-provider-integration[Git provider integration] -**** link:{{navprefix}}/modify-tml[TML modification] -*** link:{{navprefix}}/publish-data-overview[Publish content to Orgs] -**** link:{{navprefix}}/publish-to-orgs[Publish objects to Orgs] -*** link:{{navprefix}}/git-integration[Deploy with GitHub APIs (legacy)] -**** link:{{navprefix}}/git-configuration[Configure GitHub integration] -**** link:{{navprefix}}/git-api[GitHub REST APIs] -**** link:{{navprefix}}/guid-mapping[GUID mapping] - - -** link:{{navprefix}}/multi-tenancy[Multi-tenancy] -*** link:{{navprefix}}/orgs[Multi-tenancy with Orgs] -*** link:{{navprefix}}/multitenancy-within-an-org[Multi-tenancy within an Org] -*** link:{{navprefix}}/single-tenant-data-models[Single-tenant data models with Orgs] -*** link:{{navprefix}}/orgs-api-op[Org administration] -** link:{{navprefix}}/tse-cluster[Cluster maintenance and upgrade] - * Integration with external tools ** link:{{navprefix}}/external-tool-script-integration[External tools and scripts] ** link:{{navprefix}}/pendo-integration[Pendo integration with embed] diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index b307cc6bc..027f7b0d4 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -1,4 +1,4 @@ -= Timezone-aware keyword filtering in embedded apps += Timezone-aware keyword filtering :toc: true :toclevels: 2 @@ -12,7 +12,7 @@ The timezone awareness feature in ThoughtSpot allows configuring a preferred time zone for a user or at the Org level, or both, and using this timezone when generating search results for a user's query. == Overview -In deployments where users can span across multiple regions, date and time keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, resolve based on default timezone of the ThoughtSpot instance. Sometimes, this behavior can lead to discrepancies for users in different timezones, especially when generating reports or filtering data for specific periods. For example, for a user in the USA, `yesterday` shows as Sunday, whereas for a user in the APAC region, this could mean Monday, and they may expect data for Monday. +In embedded deployments where users can span across multiple regions, date and time keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, resolve based on default timezone of the ThoughtSpot instance. Sometimes, this behavior can lead to discrepancies for users in different timezones, especially when generating reports or filtering data for specific periods. For example, for a user in the USA, `yesterday` shows as Sunday, whereas for a user in the APAC region, this could mean Monday, and they may expect data for Monday. Timezone customization allows administrators to configure a timezone at the user or Org level. All relative date and time keywords will then resolve to the user’s or Org’s configured timezone, rather than the default timezone on the ThoughtSpot instance. This ensures that search results display consistent and accurate time-based data for every user, regardless of their location. It also allows each Org to maintain its independent timezone configuration, keeping the multi-Org embedded experience accurate and consistent for the users. @@ -29,25 +29,22 @@ If `ts_user_timezone` does not have a value assigned at the user or Org level, T At query time, ThoughtSpot resolves the correct timezone using the following precedence order: -[cols="1,2,4", options="header"] +[cols="2,4", options="header"] |=== -| Priority | Timezone scope | Description +|Timezone scope | Description -| 1 (Highest) | User-level timezone | Individual override. Applies to that user only. -A user-level value always takes precedence over the Org default. +A user-level value always takes precedence over the Org default and has the highest priority. -| 2 | Org-level timezone -| Default for all users in the Org if there is no user-specific override. +| Default for all users in the Org if there is no user-specific override. An Org-level override takes precedence over the system default. -| 3 (Fallback to default behavior) | Default timezone on the ThoughtSpot instance -| Platform default. If `ts_user_timezone` is not configured at the user or Org level, ThoughtSpot continues to use the default timezone. +| Platform default. If `ts_user_timezone` is not configured at the user or Org level, ThoughtSpot uses the default timezone. |=== -When a user runs a search or opens a Liveboard, ThoughtSpot evaluates this precedence chain automatically and applies the resolved timezone to all relative date calculations. Existing Models, formulas, or Liveboards do not require any configuration update. +When a user runs a search query or opens a Liveboard, ThoughtSpot evaluates this precedence chain automatically and applies the resolved timezone to all relative date calculations. === Supported interfaces @@ -223,12 +220,12 @@ The API returns a response with the values configured. ] ---- -== Specifying timezone in formula and pass-through functions -If your cloud data warehouse (CDW) stores timestamps in a different timezone than the user's timezone, date and datetime keywords and filters must be applied to a derived datetime column created using a pass-through formula. The original UTC column is not used directly. Users with edit access to data model can create a pass-through function to create a derived datetime column and convert source values to the target timezone. +== Specifying timezone in formula and passthrough functions +If your cloud data warehouse (CDW) stores timestamps in a different timezone than the user's timezone, date and datetime keywords and filters must be applied to a derived datetime column created using a passthrough formula. The original UTC column is not used directly. Users with edit access to data model can create a passthrough function to create a derived datetime column and convert source values to the target timezone. -=== Using `ts_user_timezone` variable in formula (Recommended) +=== Using timezone variable in formula -If the `ts_user_timezone` variable is configured for the Org or user, you can reference it directly inside formulas and pass-through functions to dynamically resolve the timezone to the IANA timezone string assigned to the variable for that Org or user. Using this variable eliminates the need for using hardcoded values. +If the `ts_user_timezone` variable is configured for the Org or user, you can reference it directly inside formulas and passthrough functions to dynamically resolve the timezone to the IANA timezone string assigned to the variable for that Org or user. Using this variable eliminates the need for using hardcoded values. The following example shows the formula syntax with the `ts_user_timezone` variable: @@ -237,7 +234,7 @@ The following example shows the formula syntax with the `ts_user_timezone` varia Where: -* `sql_date_time_op` is the pass-through function for date/datetime operations. +* `sql_date_time_op` is the passthrough function for date/datetime operations. * `"CONVERT_TIMEZONE('UTC', '{0}', {1})"` is the SQL template string. ** `CONVERT_TIMEZONE` is the CDW function signature. This varies per CDW. For example, `CONVERT_TIMEZONE` in Snowflake and `CONVERT_TZ` for MySQL. ** `UTC` indicates source timezone, the original timezone of your timestamp. @@ -261,7 +258,7 @@ sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), '', [< Where: -* `sql_date_time_op` is the pass-through function for date/datetime operations. +* `sql_date_time_op` is the passthrough function for date/datetime operations. * `"CONVERT_TIMEZONE('UTC', '{0}', {1})"` is the SQL template string. ** `CONVERT_TIMEZONE` is the CDW function signature. This varies per CDW. For example, `CONVERT_TIMEZONE` in Snowflake and `CONVERT_TZ` for MySQL. ** `UTC` indicates source timezone, the original timezone of your timestamp. @@ -279,7 +276,7 @@ To verify the configuration: * Use the Variable API search endpoint (`/api/rest/2.0/template/variables/search`) to retrieve and confirm the values configured for the Org and user. * Query the date or datetime columns in your data and verify whether the date and time keywords resolve correctly as defined in the `ts_user_timezone` variable. -* Verify whether the SQL pass-through function is applied to the keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, in the data model. +* Verify whether the SQL passthrough function is applied to the keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, in the data model. * Switch to another Org which has a different timezone configured, run a search query, and verify the results. * Verify whether the timezone configured for the user overrides the timezone set for the Org and system default on the ThoughtSpot instance. * Verify the Liveboard scheduled jobs. Note that the timezone changes will be applied only to the upcoming scheduled job executions. @@ -289,4 +286,4 @@ To verify the configuration: * For information about variable APIs, see xref:variables-api.adoc[Variable API reference] documentation and visit the link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fvariable%2Fput-variable-values[REST API Playground]. * For more information about SQL passthrough functions, see link:https://docs.thoughtspot.com/cloud/26.5.0.cl/formula-reference#passthrough-functions[Formula function reference, window=_blank]. -* https://www.iana.org/time-zones[IANA Time Zone Database^] \ No newline at end of file +* For information about the IANA timezone strings, refer to link:https://www.iana.org/time-zones[IANA Timezone Database^] \ No newline at end of file From 9ba5f999c9d29b1a86aad3bffaadd78b6bc7238a Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 26 May 2026 20:23:26 +0530 Subject: [PATCH 26/61] edits --- modules/ROOT/pages/timezone.adoc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index 027f7b0d4..c2c2e441d 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -12,9 +12,9 @@ The timezone awareness feature in ThoughtSpot allows configuring a preferred time zone for a user or at the Org level, or both, and using this timezone when generating search results for a user's query. == Overview -In embedded deployments where users can span across multiple regions, date and time keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, resolve based on default timezone of the ThoughtSpot instance. Sometimes, this behavior can lead to discrepancies for users in different timezones, especially when generating reports or filtering data for specific periods. For example, for a user in the USA, `yesterday` shows as Sunday, whereas for a user in the APAC region, this could mean Monday, and they may expect data for Monday. +In embedded deployments where users can span across multiple regions, date and time keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, resolve based on the default timezone of the ThoughtSpot instance. Sometimes, this can cause discrepancies for users in different timezones, especially when generating reports or filtering data for specific periods. For example, a user in the USA sees `today` as Sunday, whereas for a user in the APAC region, this could mean Monday, and they may expect data for Monday. -Timezone customization allows administrators to configure a timezone at the user or Org level. All relative date and time keywords will then resolve to the user’s or Org’s configured timezone, rather than the default timezone on the ThoughtSpot instance. This ensures that search results display consistent and accurate time-based data for every user, regardless of their location. It also allows each Org to maintain its independent timezone configuration, keeping the multi-Org embedded experience accurate and consistent for the users. +Timezone customization allows administrators to configure a timezone at the user or Org level, or both. When configured, all relative date and time keywords will resolve according to the user’s or Org’s configured timezone, rather than the default timezone on the ThoughtSpot system. This ensures that search results and reports display consistent and accurate time-based data for every user, regardless of their location. Using this feature, each Org can maintain its own independent timezone configuration, ensuring that the multi-Org embedded experience remains accurate and consistent for all users. [NOTE] ==== @@ -193,6 +193,15 @@ The API returns a response with the values configured. "model_identifier":null, "priority":null }, + { + "value":"Asia/Kolkata", + "value_list":null, + "org_identifier":"Primary", + "principal_type":"USER", + "principal_identifier":"UserA", + "model_identifier":null, + "priority":null + } { "value":"Europe/London", "value_list":null, @@ -206,8 +215,8 @@ The API returns a response with the values configured. "value":"Asia/Kolkata", "value_list":null, "org_identifier":"OrgB", - "principal_type":null, - "principal_identifier":null, + "principal_type":"USER", + "principal_identifier":"UserB", "model_identifier":null, "priority":null } From b9a15a43b592e49321de1698e920266b9e72f0cf Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 27 May 2026 11:41:41 +0530 Subject: [PATCH 27/61] review comments --- modules/ROOT/pages/timezone.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index c2c2e441d..23da287e7 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -64,7 +64,7 @@ Timezone awareness is determined by the built-in system variable, `ts_user_timez === Supported strings for timezones -The timezone values assigned to the `ts_user_timezone` variable must match the link:https://www.iana.org/time-zones[IANA timezone strings^]. Valid values include: +The timezone values assigned to the `ts_user_timezone` variable must match the link:https://www.iana.org/time-zones[IANA timezone strings^]. For example: * `America/New_York` * `Asia/Kolkata` @@ -81,7 +81,7 @@ UTC offset strings such as `UTC+5:30` or `GMT-8` are not supported. Timezone configuration can be applied to all types of calendar, including standard (Gregorian), fiscal, and custom calendars. === Supported column types -Timezone configuration changes are applicable only to the `Date` and `Date Timestamp` column types in the data. +Timezone configuration and variable assignment are applicable only to the columns with the `DATE` or `DATE_TIME` data type. === Assigning a timezone via REST API To configure timezone preference for an Org, user, or both, use the `/api/rest/2.0/template/variables/{identifier}/update-values` API endpoint. From c50f9c203226e685d6d1f05641b2e14ddd8e8fe1 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 27 May 2026 13:28:39 +0530 Subject: [PATCH 28/61] what's new and timezone feature update --- modules/ROOT/pages/common/nav.adoc | 2 +- modules/ROOT/pages/timezone.adoc | 4 ++-- modules/ROOT/pages/whats-new.adoc | 25 ++++++++++++++++++++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index b8125b984..50fedfbd3 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -51,7 +51,7 @@ Get started Build and deploy ** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects] -** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keyword filtering ^Beta^] +** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters ^BETA] ** link:{{navprefix}}/variables[Variables] ** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] * link:{{navprefix}}/development-and-deployment[Development and deployment] diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index 23da287e7..1401b706e 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -1,4 +1,4 @@ -= Timezone-aware keyword filtering += Timezone-aware keywords and filters :toc: true :toclevels: 2 @@ -295,4 +295,4 @@ To verify the configuration: * For information about variable APIs, see xref:variables-api.adoc[Variable API reference] documentation and visit the link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fvariable%2Fput-variable-values[REST API Playground]. * For more information about SQL passthrough functions, see link:https://docs.thoughtspot.com/cloud/26.5.0.cl/formula-reference#passthrough-functions[Formula function reference, window=_blank]. -* For information about the IANA timezone strings, refer to link:https://www.iana.org/time-zones[IANA Timezone Database^] \ No newline at end of file +* For information about the IANA timezone strings, refer to link:https://www.iana.org/time-zones[IANA Timezone Database^]. \ No newline at end of file diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 1ee092727..16b9eed09 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -69,12 +69,31 @@ Embedded Liveboards support advanced controls KPI chart customization. For more --- -=== Per‑org and per‑user timezone control via variables [beta betaBackground]^Beta^ +[discrete] +==== Per-org and per-user timezone control via variables [beta betaBackground]^Beta^ + +You can centrally control timezone behavior per org and per user in embedded deployments using the new template variable `ts_user_timezone` and Variable APIs. + +For multi-org and multi-tenant environments, each tenant org and user can be configured independently, guaranteeing isolation and consistency of time-based analytics across regions. Administrators can reference the timezone variable in formulas to render and filter timestamp data correctly for each embedded user, without separate content per region. + +--- + +[discrete] +==== Timezone-aware keyword filtering [beta betaBackground]^Beta^ +ThoughtSpot now supports resolving relative date and time keywords, such as `today`, `yesterday`, and `last 7 days`, using a configurable per-user or per-Org timezone, instead of the system default timezone on a ThoughtSpot instance. This feature eliminates timezone-based inconsistencies in multi-region embedded deployments and removes the need for custom workarounds. It also allows you to: + +* Assign a timezone for an Org using the Variable API. +* Override the timezone for individual users without affecting anyone else in the Org. +* Reference the active timezone directly in passthrough formulas using `ts_var(ts_user_timezone)`, so the query results update automatically when the timezone changes. +* Ensure that timezone-aware filtering is applied consistently across search results, Spotter responses, Liveboard filters, Liveboard scheduled jobs, KPI Alerts, and SpotIQ analysis. -You can centrally control timezone behavior per org and per user in embedded deployments using the new template variable `ts_user_timezone` and variable APIs. +[NOTE] +==== +The timezone awareness feature is in Beta and disabled by default. To enable this feature, contact ThoughtSpot Support. +==== -For multi‑org and multi‑tenant environment, each tenant org and user can be configured independently, guaranteeing isolation and consistency of time‑based analytics across regions. Administrators can reference the timezone variable in formulas to render and filter timestamp data correctly for each embedded user, without separate content per region. +--- [discrete] ==== Visual Embed SDK From 0b5dd01fbf30ae7dd9427f550e7a7420250a1a8f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 27 May 2026 13:36:49 +0530 Subject: [PATCH 29/61] nav fix --- modules/ROOT/pages/common/nav.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index 50fedfbd3..49e2944d8 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -51,7 +51,7 @@ Get started Build and deploy ** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects] -** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters ^BETA] +** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters ^BETA^] ** link:{{navprefix}}/variables[Variables] ** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] * link:{{navprefix}}/development-and-deployment[Development and deployment] From 7a1fa9fd429e9da10f42f1bb9ea5ca96d7c87c81 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 13 May 2026 14:33:27 +0530 Subject: [PATCH 30/61] template addition --- modules/ROOT/pages/3rd-party-script.adoc | 72 ------------------------ modules/_templates/concept.adoc | 32 +++++++++++ modules/_templates/procedure.adoc | 46 +++++++++++++++ modules/_templates/reference.adoc | 36 ++++++++++++ modules/_templates/release-notes.adoc | 29 ++++++++++ 5 files changed, 143 insertions(+), 72 deletions(-) delete mode 100644 modules/ROOT/pages/3rd-party-script.adoc create mode 100644 modules/_templates/concept.adoc create mode 100644 modules/_templates/procedure.adoc create mode 100644 modules/_templates/reference.adoc create mode 100644 modules/_templates/release-notes.adoc diff --git a/modules/ROOT/pages/3rd-party-script.adoc b/modules/ROOT/pages/3rd-party-script.adoc deleted file mode 100644 index a978ada50..000000000 --- a/modules/ROOT/pages/3rd-party-script.adoc +++ /dev/null @@ -1,72 +0,0 @@ -= External tools and script integration -:toc: true -:toclevels: 2 - -:page-title: Integrate external tools and allow scripts -:page-pageid: external-tool-script-integration -:page-description: Security settings for embedding - -ThoughtSpot supports integrating third-party apps such as Mixpanel, Pendo, LogRocket, and more in your embed. If you are using third-party tools to track usage, trace, log, or onboard your application users, you can seamlessly integrate these tools with ThoughtSpot embed and add custom JavaScript. This feature is disabled by default on ThoughtSpot instances. To enable this feature, contact ThoughtSpot Support. - -[IMPORTANT] -==== -While ThoughtSpot allows the injection of custom JavaScript, it is important to be aware of the associated security risks, particularly Cross-Site Scripting (XSS). XSS is a vulnerability that can enable malicious actors to inject and execute unauthorized scripts within a trusted environment. This can lead to data breaches, unauthorized access to user sessions, and compromised system integrity. ThoughtSpot strongly recommends reviewing security guidelines before activating this feature in your instances and exercising caution when integrating third-party tools into your embedded application. -==== - -== Security considerations - -Before requesting ThoughtSpot Support to enable this feature on your instance, do the following: - -* Review the security risks associated with custom-hosted scripts and understand the potential consequences of XSS attacks. -* Implement security controls and measures to validate hosted scripts and mitigate potential vulnerabilities. - -== Feature enablement - -Enabling third-party tools on embed involves two steps: - -. Request for feature activation and provide the script details to ThoughtSpot Support -. Adding the script sources to the CSP allowlist - -=== Request for feature enablement - -Create a ThoughtSpot Support ticket to enable the feature on your instance. In your request, specify the domain URLs that will host the scripts in your embedding environment. - -Wait for ThoughtSpot Support to validate and approve, and then add the domain that hosts the script to the CSP allowlist on your instance. This step will ensure that only the trusted and vetted domains are allowed to run scripts in your application environment. - -=== Add script source to CSP allowlist -After the script hosting URL is approved and configured by ThoughtSpot Support, you must add the JavaScript hosting domain to the CSP allowlist. This step requires administration privileges, so make sure you log in to ThoughtSpot with your administrator credentials. - -. In your ThoughtSpot application, navigate to *Develop* > *Customizations* > *Security Settings*. -. If your instance has the Orgs feature enabled, ensure that you are in the *All Orgs* context. -. On the *Security Settings* page, click *Edit* and turn on the *CSP script-src domains* toggle switch. -+ -[.widthAuto] -[.bordered] -image::./images/csp-script-domain.png[CSS script-src domain] -. Add the script hosting domain. -. Click *Save changes*. - -[NOTE] -==== -* The *CSP script-src domains* section is visible to users with administrative privileges only if the third-party integration feature is enabled on your instance. -* The *CSP script-src domains* cannot be enabled and configured at the Org level. When configured, this setting will apply to all the Orgs configured on your instance. -==== - -=== Allow Websocket endpoints -If your tool uses WebSockets, add the tool’s `wss://` endpoint to the CSP and CORS allowlists in ThoughtSpot. This enables secure WebSocket connections from an embedded ThoughtSpot page to the tool's WebSocket endpoint without being blocked by the browser’s Content Security Policy. - -Only hosts explicitly listed with `wss://` are permitted. You can add `wss://` URL in the **Develop** > **Security Settings** page. - -== Passing variables to the hosted script - -To pass variables to the customer's hosted script, Visual Embed SDK provides the `customVariablesForThirdPartyTools` parameter. The `customVariablesForThirdPartyTools` is an object containing the variables that you wish to pass to the customer’s hosted JavaScript. These may include private information such as credentials or keys. The hosted JavaScript will access these variables via the `window.tsEmbed` object. - -Developers can define this parameter in the **init()** function as shown in the following example. Once initialized, the JavaScript will run after the authentication is successfully completed in the ThoughtSpot Embed App. - -[source,JavaScript] ----- -init({ - //... - customVariablesForThirdPartyTools: { cloud: "123Basic" } -}); ----- diff --git a/modules/_templates/concept.adoc b/modules/_templates/concept.adoc new file mode 100644 index 000000000..9ed7514fc --- /dev/null +++ b/modules/_templates/concept.adoc @@ -0,0 +1,32 @@ += +:toc: true +:toclevels: 1 +:page-pageid: +:page-type: concept +:page-role: +:product-version: +:jira-ref: +// author: +// last-reviewed: + +// 1-2 sentence lead: what this concept is and why it matters. + +== How works + +// Explanation. Use diagrams (image::) where spatial relationships matter. +// Avoid procedure steps here — link to procedure pages instead. + +== Key components + +// Optional. Use a definition list for named parts: +Component name:: +Description of what it does. + +== Limitations and constraints + +// Known limitations, version-specific behaviour, or edge cases. +// TODO: verify with engineering + +== Related information + +* xref::/page.adoc[Link text] diff --git a/modules/_templates/procedure.adoc b/modules/_templates/procedure.adoc new file mode 100644 index 000000000..11a91ab2c --- /dev/null +++ b/modules/_templates/procedure.adoc @@ -0,0 +1,46 @@ += +:toc: true +:toclevels: 1 +:page-pageid: +:page-type: procedure +:page-role: +:product-version: +:jira-ref: +// author: +// last-reviewed: + +== Overview + +// 1-2 sentences: what this procedure accomplishes and who it is for. +// TODO: verify with engineering + +== Before you begin + +// Prerequisites as a list. Use "You must" or "You need" for each. +* +* + +== Procedure + +. Step one. Include the exact command or UI action. ++ +[source,bash] +---- +# example command here +---- + +. Step two. + +. Step three. + +== Result + +// What the user should see or be able to do after completing the procedure. + +== Next steps + +// Optional. Link to related procedures or concepts. + +== Related information + +* xref::/page.adoc[Link text] diff --git a/modules/_templates/reference.adoc b/modules/_templates/reference.adoc new file mode 100644 index 000000000..0a68ee866 --- /dev/null +++ b/modules/_templates/reference.adoc @@ -0,0 +1,36 @@ += +:toc: true +:toclevels: 1 +:page-pageid: +:page-type: reference +:page-role: +:product-version: +:jira-ref: +// author: +// last-reviewed: + +// Brief description of what this reference covers. + +[cols="1,1,1,3", options="header"] +|=== +|Parameter |Type |Required |Description + +|`param_name` +|string +|Yes +|Description of what this parameter does. Default: none. + +|=== + +== Example + +[source,json] +---- +{ + "param_name": "value" +} +---- + +== Related information + +* xref::/page.adoc[Link text] diff --git a/modules/_templates/release-notes.adoc b/modules/_templates/release-notes.adoc new file mode 100644 index 000000000..1f2366142 --- /dev/null +++ b/modules/_templates/release-notes.adoc @@ -0,0 +1,29 @@ += Release Notes: +:page-type: release-note +:page-role: +:product-version: +:jira-ref: + +== New features + +=== + +// One sentence describing what it does and who benefits. +// TODO: link to full feature documentation once published. + +== Improvements + +* Brief description. () + +== Bug fixes + +* Brief description of what was broken and what was fixed. () + +== Known issues + +* Description of the issue and any workaround. + +== Upgrade notes + +// Required only if this version includes breaking changes or migration steps. +// TODO: verify with engineering \ No newline at end of file From cc7efc4522559bacc0a0eb71da114da4a4d8b842 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 13 May 2026 23:43:20 +0530 Subject: [PATCH 31/61] edits --- modules/_templates/concept.adoc | 107 +++++++++++++-- modules/_templates/procedure.adoc | 133 +++++++++++++++++-- modules/_templates/reference.adoc | 183 ++++++++++++++++++++++++-- modules/_templates/release-notes.adoc | 111 ++++++++++++++-- 4 files changed, 490 insertions(+), 44 deletions(-) diff --git a/modules/_templates/concept.adoc b/modules/_templates/concept.adoc index 9ed7514fc..d21cac891 100644 --- a/modules/_templates/concept.adoc +++ b/modules/_templates/concept.adoc @@ -1,32 +1,121 @@ = :toc: true :toclevels: 1 -:page-pageid: + +:page-title: +:page-description: <One sentence: what this page covers and why it matters to the reader.> +:page-pageid: <Add a unique ID for this page, e.g. "embed-sdk-concepts". Required for developer documentation.> +:keywords: <comma-separated terms for search indexing, e.g. "authentication, SSO, SAML, login"> :page-type: concept :page-role: :product-version: <version> :jira-ref: <DOC-XXXX> + // author: // last-reviewed: -// 1-2 sentence lead: what this concept is and why it matters. +// REQUIRED: 1-2 sentence lead — what this concept is and why it matters to developers or administrators. + +//// +TEMPLATE GUIDE +============== +How to use this template: + 1. Copy this file from modules/_templates/concept.adoc. + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "embed-sso-overview.adoc"). + 3. Place the file in modules/ROOT/pages/. + 4. If this page will be included as a partial inside another page (via include::), + remove all front-matter attributes — partials do not need them. + +Use this template for pages that explain WHAT something is or HOW it works. +Do NOT include step-by-step instructions here — link to a procedure page instead. + +Section labels: + REQUIRED — must be present on every page of this type + RECOMMENDED — include unless there is a clear reason not to + OPTIONAL — include only when relevant to the topic + +Style elements you can use: + Admonitions : [NOTE], [TIP], [IMPORTANT], [WARNING], [CAUTION] + Images : image::<path>[alt text] + Tables : [cols="...", options="header"] |=== ... |=== + Code blocks : [source,JavaScript] ---- ... ---- + Inline badge : [beta betaBackground]^Beta^ + Version badge: [.version-badge.new]#New# [.version-badge.deprecated]#Deprecated# + [.version-badge.breaking]#Breaking# [.version-badge.fixed]#Fixed# +//// == How <concept> works -// Explanation. Use diagrams (image::) where spatial relationships matter. -// Avoid procedure steps here — link to procedure pages instead. +// REQUIRED. +// Explain the concept clearly. Avoid procedure steps — link to procedure pages instead. +// Use plain language; define acronyms on first use. +// +// Add a diagram or screenshot if spatial relationships or architecture matter: +// image::./images/<diagram-filename>.png[Alt text describing the diagram] +// +// Example: +// image::./images/embed-architecture.png[ThoughtSpot embedded architecture overview showing the SDK, REST API, and host application layers] +// +// Use admonitions to highlight key information: +// [NOTE] +// ==== +// Text for a general note or clarification. +// ==== +// +// [IMPORTANT] +// ==== +// Text for a critical constraint the reader must know before using this feature. +// ==== == Key components -// Optional. Use a definition list for named parts: -Component name:: +// OPTIONAL. +// Use a definition list for named parts or actors in the system: + +Component A:: +Description of what it does and its role in the system. + +Component B:: Description of what it does. +// OPTIONAL: Add a comparison matrix when the concept involves multiple options or variants +// that readers commonly need to choose between: +// +// [cols="1,1,1,1", options="header"] +// |=== +// |Option |Best for |Authentication |Notes +// |REST API v2 |New integrations |Bearer token |Recommended +// |REST API v1 |Legacy systems |Basic auth |Migrate to v2 when possible +// |Visual Embed SDK |Embedded UI |Trusted auth |TypeScript support +// |=== + == Limitations and constraints -// Known limitations, version-specific behaviour, or edge cases. -// TODO: verify with engineering +// RECOMMENDED. +// List known limitations, version-specific behaviour, or edge cases the reader should know. +// Use admonitions for critical constraints: +// +// [IMPORTANT] +// ==== +// This feature requires ThoughtSpot Cloud <version> or later. +// ==== +// +// [NOTE] +// ==== +// Behaviour changed in <version>. If you are on an earlier version, see xref:...[] +// ==== +// +// [WARNING] +// ==== +// Enabling this setting affects all users in the org. Confirm with your administrator before proceeding. +// ==== + +* == Related information -* xref:<component>:<module>/page.adoc[Link text] +// REQUIRED. +// Link to related concept, procedure, and reference pages. +// "Related information" is the standard heading — do not use "Additional resources" or "See also". + +* xref:<module>/page.adoc[Link text] diff --git a/modules/_templates/procedure.adoc b/modules/_templates/procedure.adoc index 11a91ab2c..597a571b2 100644 --- a/modules/_templates/procedure.adoc +++ b/modules/_templates/procedure.adoc @@ -1,46 +1,151 @@ = <Title: Verb + Object, e.g. "Configure Single Sign-On"> :toc: true :toclevels: 1 -:page-pageid: + +:page-title: <Title — must match the = Title above> +:page-description: <One sentence: what this procedure does and who it is for.> +:page-pageid: <Add a unique ID for this page, e.g. "embed-sdk-concepts". Required for developer documentation.> :page-type: procedure +:keywords: <comma-separated terms for search indexing, e.g. "configure, SSO, SAML, setup"> :page-role: :product-version: <version> :jira-ref: <DOC-XXXX> // author: // last-reviewed: +//// +TEMPLATE GUIDE +============== +How to use this template: + 1. Copy this file from modules/_templates/procedure.adoc. + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "configure-saml-sso.adoc"). + 3. Place the file in modules/ROOT/pages/. + 4. If this page will be included as a partial inside another page (via include::), + remove all front-matter attributes — partials do not need them. + +Use this template for pages that describe HOW TO DO something — a sequence of steps +the reader must follow to achieve a specific outcome. +Do NOT explain background theory here — link to a concept page for that. + +Section labels: + REQUIRED — must be present on every page of this type + RECOMMENDED — include unless there is a clear reason not to + OPTIONAL — include only when relevant to the topic + +Code samples: + SDK procedures : JavaScript or TypeScript code sample is REQUIRED. + REST API procedures: cURL code sample is REQUIRED. JSON request/response is REQUIRED. + UI-only procedures : screenshots are RECOMMENDED (use image:: after the relevant step). + +Style elements you can use: + Admonitions : [NOTE], [TIP], [IMPORTANT], [WARNING], [CAUTION] + Images : image::<path>[alt text] + Code blocks : [source,JavaScript] / [source,TypeScript] / [source,cURL] / [source,JSON] + Inline badge : [beta betaBackground]^Beta^ + Version badge: [.version-badge.new]#New# [.version-badge.deprecated]#Deprecated# + [.version-badge.breaking]#Breaking# +//// + == Overview -// 1-2 sentences: what this procedure accomplishes and who it is for. -// TODO: verify with engineering +// REQUIRED: 1-2 sentences — what this procedure accomplishes and who it is for. +// Mention the product area and the role of the reader (developer, administrator, etc.). +// TODO: verify scope with engineering +// +// OPTIONAL: Add a workflow diagram or screenshot of the starting UI state if it helps +// the reader orient themselves before starting: +// image::./images/<workflow-diagram>.png[Workflow overview diagram] == Before you begin -// Prerequisites as a list. Use "You must" or "You need" for each. -* -* +// REQUIRED if there are prerequisites. Use "You must" or "You need" for each item. +// Remove this section only if there are genuinely no prerequisites. + +* You must have <role or permission, e.g. "Developer or Administrator privilege">. +* You need access to <system or resource, e.g. "a ThoughtSpot Cloud instance with the Embed feature enabled">. +* <Any additional prerequisite.> == Procedure -. Step one. Include the exact command or UI action. +// REQUIRED. Use numbered steps. Each step must describe exactly one action. +// Include the exact command, UI label, menu path, or code for each step. +// Add a `+` continuation after a step to attach a code block or image to it. + +. Step one. Describe the exact UI action or navigation path. ++ +// OPTIONAL: Screenshot showing the UI state after this step: +// image::./images/<step1-screenshot>.png[Description of what to see after step 1] + +. Step two. For SDK procedures, provide a complete, runnable code sample — REQUIRED. + -[source,bash] +[source,JavaScript] ---- -# example command here +import { LiveboardEmbed, AuthType, init } from '@thoughtspot/visual-embed-sdk'; + +init({ + thoughtSpotHost: 'https://<your-instance>.thoughtspot.cloud', + authType: AuthType.TrustedAuthToken, + username: '<username>', + getAuthToken: () => getTokenFromYourServer(), +}); + +const embed = new LiveboardEmbed('#embed-container', { + liveboardId: '<liveboard-GUID>', +}); +embed.render(); ---- ++ +[NOTE] +==== +Replace `<your-instance>` with your ThoughtSpot Cloud hostname and `<liveboard-GUID>` with the ID of the Liveboard you want to embed. +==== -. Step two. +. Step three. For REST API procedures, provide a cURL request — REQUIRED. ++ +[source,cURL] +---- +curl -X POST \ + 'https://<your-instance>.thoughtspot.cloud/api/rest/2.0/<endpoint>' \ + -H 'Authorization: Bearer <token>' \ + -H 'Content-Type: application/json' \ + -d '{ + "param": "value" + }' +---- ++ +// OPTIONAL: Show the expected JSON response inline: +// [source,JSON] +// ---- +// { +// "field": "value" +// } +// ---- -. Step three. +// OPTIONAL: Add a WARNING or NOTE for common pitfalls at the end of the procedure. +// [WARNING] +// ==== +// If you see <error>, verify that <condition> before retrying. +// ==== == Result -// What the user should see or be able to do after completing the procedure. +// REQUIRED. Describe what the user should see or be able to do after completing the procedure. +// Be specific — name the UI element, API response, or behaviour that confirms success. +// +// OPTIONAL: Screenshot of the expected result: +// image::./images/<result-screenshot>.png[Expected result after completing the procedure] == Next steps -// Optional. Link to related procedures or concepts. +// OPTIONAL. Link to the next logical task or a related procedure. + +* xref:<module>/next-procedure.adoc[Next task name] == Related information -* xref:<component>:<module>/page.adoc[Link text] +// REQUIRED. +// Link to related concept and reference pages. +// "Related information" is the standard heading — do not use "Additional resources" or "See also". + +* xref:<module>/concept-page.adoc[Related concept] +* xref:<module>/reference-page.adoc[API reference] diff --git a/modules/_templates/reference.adoc b/modules/_templates/reference.adoc index 0a68ee866..8dfdec29c 100644 --- a/modules/_templates/reference.adoc +++ b/modules/_templates/reference.adoc @@ -1,15 +1,96 @@ -= <Title: Noun phrase, e.g. "API Endpoint Reference"> += <Title: Noun phrase, e.g. "Liveboard report API reference"> :toc: true -:toclevels: 1 +:toclevels: 1 <-- adjust if you have many sections, but 1-2 levels is usually sufficient for reference pages> + +:page-title: <Title — must match the = Title above> +:page-description: <One sentence: what this reference documents and who uses it.> +:keywords: <comma-separated terms for search indexing, e.g. "REST API, parameters, endpoints, reference"> :page-pageid: :page-type: reference :page-role: :product-version: <version> :jira-ref: <DOC-XXXX> // author: -// last-reviewed: +// last-updated: + +//// +TEMPLATE GUIDE +============== +How to use this template: + 1. Copy this file from modules/_templates/reference.adoc. + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "rest-api-auth-reference.adoc"). + 3. Place the file in modules/ROOT/pages/. + 4. If this page will be included as a partial inside another page (via include::), + remove all front-matter attributes — partials do not need them. + +Use this template for pages that document parameters, properties, endpoints, request /response worklows, classes, enumerations, or configuration options — reference material a reader looks up, not reads start-to-finish. + +Section labels: + REQUIRED — must be present on every page of this type + RECOMMENDED — include unless there is a clear reason not to + OPTIONAL — include only when relevant to the topic + +Code samples: + SDK reference : JavaScript or TypeScript example is REQUIRED. + REST API reference : cURL request + JSON response are REQUIRED. + Resource URL, Request parameters, Example request, + Example response, and Response codes are all REQUIRED + for each endpoint documented on this page. + +Style elements you can use: + Tables : [cols="...", options="header"] |=== ... |=== + Code blocks : [source,JavaScript] / [source,TypeScript] / [source,cURL] / [source,JSON] + Admonitions : [NOTE], [TIP], [IMPORTANT], [WARNING] + Inline badge : [beta betaBackground]^Beta^, [earlyAccess eaBackground]#Early Access# + Version badge: [.version-badge.new]#New# [.version-badge.deprecated]#Deprecated# + [.version-badge.breaking]#Breaking# +//// + +// REQUIRED: 1-2 sentences describing what this reference covers — the API, SDK class, +// endpoint group, or configuration object — and the primary use case. + +// OPTIONAL: Comparison matrix — use when documenting multiple methods, endpoints, or +// authentication options that readers commonly need to choose between: +// +// [cols="1,1,1,1", options="header"] +// |=== +// |Method |Auth type |Rate limit |Notes +// |REST API v2 |Bearer token |1000/min |Recommended for new integrations +// |REST API v1 |Basic auth |500/min |Legacy; migrate to v2 when possible +// |Visual Embed SDK |Trusted auth |N/A |TypeScript support; browser only +// |=== + +== Supported operations + +// OPTIONAL for REST API reference pages that cover multiple endpoints. +// List the endpoints or operations covered on this page. +// Use an include directive if the list is generated: +// include::{path}/<api>-list.adoc[] + +=== Required permissions + +// RECOMMENDED: State the role or permission required to call these APIs. -// Brief description of what this reference covers. + +// ───────────────────────────────────────────────────────────────────────────── +// ENDPOINT / ATTRIBUTE BLOCK +// Repeat this block for each endpoint or configuration property. +// ───────────────────────────────────────────────────────────────────────────── + +== <Operation or property name> + +// REQUIRED: One sentence describing what this endpoint or property does. + +=== Resource URL + +// REQUIRED for REST API reference. Use a literal block (no syntax highlighting). +---- +POST /api/rest/2.0/<endpoint-path> +---- + +=== Request parameters + +// REQUIRED. Document every parameter. Use "None" if there are no parameters. [cols="1,1,1,3", options="header"] |=== @@ -20,17 +101,103 @@ |Yes |Description of what this parameter does. Default: none. +|`optional_param` +|boolean +|No +|Optional flag. Default: `false`. + |=== -== Example +// OPTIONAL: Version-specific notes — use inline badges to flag changes per parameter: +// [.version-badge.new]#New in vX.X# `new_param` — added in this version; description. +// [.version-badge.deprecated]#Deprecated# `old_param` — deprecated in vX.X; use `new_param` instead. +// [.version-badge.breaking]#Breaking# `changed_param` — behaviour changed in vX.X. + +=== Example request + +// REQUIRED. Provide a complete, working example. +// For SDK reference: -[source,json] +[source,JavaScript] +---- +import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk'; + +const embed = new LiveboardEmbed('#embed-container', { + liveboardId: '<liveboard-GUID>', + // Optional parameters: + fullHeight: true, + disabledActions: [], +}); +embed.render(); +---- + +// For REST API reference — provide a cURL example: + +[source,cURL] +---- +curl -X POST \ + 'https://<your-instance>.thoughtspot.cloud/api/rest/2.0/<endpoint>' \ + -H 'Authorization: Bearer <token>' \ + -H 'Content-Type: application/json' \ + -d '{ + "param_name": "value", + "optional_param": false + }' +---- + +=== Example response + +// REQUIRED for REST API reference. + +[source,JSON] ---- { - "param_name": "value" + "field": "value", + "nested": { + "key": "value" + } } ---- +=== Response codes + +// REQUIRED for REST API reference. + +[cols="1,1,3", options="header"] +|=== +|Code |Status |Description + +|200 +|Success +|Request completed. Returns the response object described above. + +|400 +|Bad request +|Invalid parameters. Verify required fields and data types. + +|401 +|Unauthorized +|Authentication failed. Check your bearer token or API credentials. + +|403 +|Forbidden +|Insufficient permissions. Verify the user role required for this operation. + +|500 +|Internal server error +|Contact ThoughtSpot Support if the error persists. + +|=== + +// ───────────────────────────────────────────────────────────────────────────── +// END ENDPOINT / ATTRIBUTE BLOCK — copy the block above for additional endpoints +// ───────────────────────────────────────────────────────────────────────────── + == Related information -* xref:<component>:<module>/page.adoc[Link text] +// REQUIRED. +// Link to related how-to and concept pages. +// "Related information" is the standard heading — do not use "Additional resources" or "See also". + +* xref:<module>/procedure-page.adoc[How to <use this API>] +* xref:<module>/concept-page.adoc[Related concept] diff --git a/modules/_templates/release-notes.adoc b/modules/_templates/release-notes.adoc index 1f2366142..a9379d3e0 100644 --- a/modules/_templates/release-notes.adoc +++ b/modules/_templates/release-notes.adoc @@ -1,29 +1,114 @@ -= Release Notes: <Product> <Version> += Release notes: <Product> <Version or Month Year> +:toc: true +:toclevels: 1 +:page-title: <Title — must match the = Title above> +:page-description: <One sentence: summary of what is new or changed in this release.> +:keywords: <comma-separated terms for search indexing, e.g. "release notes, changelog, new features, ThoughtSpot Cloud"> :page-type: release-note :page-role: :product-version: <version> :jira-ref: <DOC-XXXX> -== New features +//// +TEMPLATE GUIDE +============== +How to use this template: + 1. Copy this file from modules/_templates/release-notes.adoc. + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "release-notes-26-5.adoc"). + 3. Place the file in modules/ROOT/pages/. + 4. If this page will be included as a partial inside another page (via include::), + remove all front-matter attributes — partials do not need them. -=== <Feature name> +Use this template for release note pages (What's New, changelogs, version history). +Base format: tabular layout modelled on the existing What's New and changelog pages. -// One sentence describing what it does and who benefits. -// TODO: link to full feature documentation once published. +Section labels: + REQUIRED — must be present on every release note page + RECOMMENDED — include unless there is a clear reason not to + OPTIONAL — include only when relevant to this release -== Improvements +Tags (column cell — use in the first column of the change table): + [tag greenBackground]#NEW FEATURE# + [tag greenBackground]#IMPROVEMENT# + [tag redBackground]#DEPRECATED# + [tag redBackground]#BUG FIX# -* Brief description. (<JIRA-REF>) +Inline badges (append after a feature name or inside a description): + [beta betaBackground]^Beta^ — feature is in Beta + [.version-badge.new]#New# — new in this version + [.version-badge.breaking]#Breaking# — breaking change + [.version-badge.deprecated]#Deprecated# — item is deprecated + [.version-badge.fixed]#Fixed# — bug fix -== Bug fixes +Format notes: + - Use [discrete] before ==== headings inside table cells to suppress TOC entries. + - Separate entries within the same cell with a horizontal rule: --- + - Each JIRA reference appears in parentheses at the end: (DOC-XXXX) + - Use `*` bold for version labels and metadata lines inside cells. + - Link to full documentation using xref once the target page is published. +//// -* Brief description of what was broken and what was fixed. (<JIRA-REF>) +// REQUIRED: One sentence stating the release scope and any critical headline. +This release includes updates to <product area, e.g. "the Visual Embed SDK and REST API v2.0">. -== Known issues +// REQUIRED: Release metadata block. +**Release version**: ThoughtSpot Cloud <X.X.X.cl> + +*Upgrade notes*: <None. / ⚠️ Describe any breaking changes; link to Upgrade notes section.> + +*Recommended SDK versions*: Visual Embed SDK v<X.XX.X> and later + +// REQUIRED: Change table. +// Each row = one change category. Repeat rows as needed. +// The first column holds the tag; the second holds all entries for that category. + +[width="100%" cols="1,4"] +|==== + +// ── NEW FEATURES ────────────────────────────────────────────────────────────── +|[tag greenBackground]#NEW FEATURE# a| + +[discrete] +==== <Feature name> [beta betaBackground]^Beta^ + +// REQUIRED: One sentence describing what it does and who benefits. +// TODO: replace the placeholder link once the documentation page is published. +// xref:<page>.adoc[<Feature name>] +Description of the new feature and its benefit to developers or administrators. + +--- + +[discrete] +==== <Second new feature name> + +Description of the second new feature. + +// ── IMPROVEMENTS ────────────────────────────────────────────────────────────── +|[tag greenBackground]#IMPROVEMENT# a| -* Description of the issue and any workaround. +* Brief description of the improvement. (DOC-XXXX) +* Brief description of another improvement. (DOC-XXXX) +// ── DEPRECATIONS ────────────────────────────────────────────────────────────── +|[tag redBackground]#DEPRECATED# a| + +* `<deprecated_item>` — deprecated in this release. Use `<replacement>` instead. (DOC-XXXX) + +// ── BUG FIXES ───────────────────────────────────────────────────────────────── +|[tag redBackground]#BUG FIX# a| + +* Brief description of what was broken and what was fixed. (DOC-XXXX) +* Brief description of another bug fix. (DOC-XXXX) + +|==== + +// REQUIRED only when this release includes breaking changes or migration steps. == Upgrade notes -// Required only if this version includes breaking changes or migration steps. -// TODO: verify with engineering \ No newline at end of file +// Document breaking changes, configuration updates, or migration steps required. +// Reference specific API endpoints, SDK methods, or config keys by name. +// TODO: verify all migration steps with engineering before publishing. + +== Known issues + +// OPTIONAL but recommended. Describe open issues in this release and any workaround. + +* Description of the known issue. Workaround: <steps or link>. (DOC-XXXX) From 3104a639448593706dcd4a1c137ad047eefaa99c Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Wed, 20 May 2026 11:14:22 +0530 Subject: [PATCH 32/61] vale style checks --- .github/workflows/vale.yml | 31 +++ .gitignore | 5 + .vale-ci.ini | 22 ++ .vale.ini | 137 +++++++++++ .../config/vocabularies/ts-vocab/accept.txt | 153 ++++++++++++ .../config/vocabularies/ts-vocab/reject.txt | 29 +++ .vale/styles/ts-docs/Abbreviations.yml | 74 ++++++ .vale/styles/ts-docs/Ampersands.yml | 13 + .vale/styles/ts-docs/AsciiDocSyntax.yml | 53 ++++ .vale/styles/ts-docs/DoNotUseTerms.yml | 71 ++++++ .vale/styles/ts-docs/Headings.yml | 117 +++++++++ .vale/styles/ts-docs/LinkText.yml | 17 ++ .vale/styles/ts-docs/PreCommitChecks.yml | 54 +++++ .vale/styles/ts-docs/RepeatedWords.yml | 17 ++ .vale/styles/ts-docs/SentenceLength.yml | 11 + .vale/styles/ts-docs/SmartQuotes.yml | 16 ++ .vale/styles/ts-docs/WordList.yml | 212 ++++++++++++++++ .valeignore | 24 ++ modules/ROOT/pages/authentication.adoc | 6 +- modules/ROOT/pages/variables.adoc | 1 + modules/_templates/best-practices.adoc | 79 ++++++ modules/_templates/concept.adoc | 12 +- modules/_templates/faqs.adoc | 64 +++++ modules/_templates/procedure.adoc | 14 +- modules/_templates/quickstart.adoc | 113 +++++++++ modules/_templates/reference.adoc | 13 +- modules/_templates/release-notes.adoc | 8 +- modules/_templates/troubleshooting.adoc | 90 +++++++ modules/_templates/tutorial.adoc | 229 ++++++++++++++++++ 29 files changed, 1659 insertions(+), 26 deletions(-) create mode 100644 .github/workflows/vale.yml create mode 100644 .vale-ci.ini create mode 100644 .vale.ini create mode 100644 .vale/styles/config/vocabularies/ts-vocab/accept.txt create mode 100644 .vale/styles/config/vocabularies/ts-vocab/reject.txt create mode 100644 .vale/styles/ts-docs/Abbreviations.yml create mode 100644 .vale/styles/ts-docs/Ampersands.yml create mode 100644 .vale/styles/ts-docs/AsciiDocSyntax.yml create mode 100644 .vale/styles/ts-docs/DoNotUseTerms.yml create mode 100644 .vale/styles/ts-docs/Headings.yml create mode 100644 .vale/styles/ts-docs/LinkText.yml create mode 100644 .vale/styles/ts-docs/PreCommitChecks.yml create mode 100644 .vale/styles/ts-docs/RepeatedWords.yml create mode 100644 .vale/styles/ts-docs/SentenceLength.yml create mode 100644 .vale/styles/ts-docs/SmartQuotes.yml create mode 100644 .vale/styles/ts-docs/WordList.yml create mode 100644 .valeignore create mode 100644 modules/_templates/best-practices.adoc create mode 100644 modules/_templates/faqs.adoc create mode 100644 modules/_templates/quickstart.adoc create mode 100644 modules/_templates/troubleshooting.adoc create mode 100644 modules/_templates/tutorial.adoc diff --git a/.github/workflows/vale.yml b/.github/workflows/vale.yml new file mode 100644 index 000000000..b469a474d --- /dev/null +++ b/.github/workflows/vale.yml @@ -0,0 +1,31 @@ +name: Vale + +on: + pull_request: + branches: + - main + - release + +jobs: + vale: + name: Lint prose (ts-docs) + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Run Vale + uses: errata-ai/vale-action@v2 + with: + # CI config: ts-docs rules only, error level gate. + # Does not run vale sync — no package downloads needed. + config: .vale-ci.ini + # Check only files changed in this PR. + files: changed + # Fail the build on errors (merge conflict markers, + # unfilled placeholders). Warnings are reported but + # do not block the PR. + fail_on_error: true + reporter: github-pr-review + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index d07bcc884..5dc82b830 100644 --- a/.gitignore +++ b/.gitignore @@ -106,6 +106,11 @@ docs/public/ # TernJS port file .tern-port +# Vale prose linter — downloaded packages (committed: ts-docs style + ts-vocab) +# Run `vale sync` after cloning to download these. +.vale/styles/Google/ +.vale/styles/Microsoft/ + # Code editors or IDEs .vscode/ diff --git a/.vale-ci.ini b/.vale-ci.ini new file mode 100644 index 000000000..15c17fbb5 --- /dev/null +++ b/.vale-ci.ini @@ -0,0 +1,22 @@ +# ============================================================= +# .vale-ci.ini — CI-only Vale configuration +# ============================================================= +# Used exclusively by the GitHub Actions vale.yml workflow. +# Runs only the committed ts-docs style; does NOT require +# `vale sync` (no Google / Microsoft packages are downloaded). +# +# Gate: MinAlertLevel = error — only hard errors fail the build. +# ts-docs rules at error level: +# - PreCommitChecks (merge conflict markers, unfilled placeholders) +# ============================================================= + +StylesPath = .vale/styles +MinAlertLevel = error +Vocab = ts-vocab + +[*.{adoc,asciidoc}] +BasedOnStyles = ts-docs + +# Preserve the same AsciiDoc comment and inline-span exclusions as .vale.ini +TokenIgnores = (\/\/.+), (\[(?:\.version-badge[^\]]*|tag [^\]]*|earlyAccess [^\]]*|beta [^\]]*)\][#^][^#^]+[#^]), (\[(NOTE|TIP|WARNING|IMPORTANT|CAUTION|DANGER)\]) +BlockIgnores = (?s)(\/{4}[\s\S]*?\/{4}) diff --git a/.vale.ini b/.vale.ini new file mode 100644 index 000000000..b0d8d04c0 --- /dev/null +++ b/.vale.ini @@ -0,0 +1,137 @@ +# ============================================================= +# .vale.ini — ThoughtSpot Developer Docs +# ============================================================= +# SETUP (one-time, after cloning): +# vale sync +# This downloads Google and Microsoft into .vale/styles/ (gitignored). +# The ts-docs custom style and ts-vocab vocabulary are committed to the repo. +# +# USAGE: +# vale path/to/file.adoc +# vale modules/ROOT/pages/ +# +# INTELLIJ IDEA: +# Settings > Tools > Vale > Config: point to this file. +# The AsciiDoc plugin picks up Vale alerts inline. +# ============================================================= + +StylesPath = .vale/styles + +# suggestion = show everything (noisy, good for authoring) +# warning = hide suggestions, show warnings + errors (recommended for review) +# error = show only blocking errors (good for CI gates) +MinAlertLevel = suggestion + +# ---- Packages (downloaded by `vale sync`, then gitignored) -- +Packages = Google, Microsoft + +# ---- Shared vocabulary -------------------------------------- +# Files: .vale/styles/config/vocabularies/ts-vocab/accept.txt +# reject.txt +Vocab = ts-vocab + +# ============================================================= +# Catch-all: disable Vale on every file type not listed below. +# This prevents IDE plugins from running checks on .yml, .json, +# .js, and other non-prose files even when .valeignore is ignored. +# ============================================================= +[*] +BasedOnStyles = + +# ============================================================= +# AsciiDoc files (authored content only) +# Generated pages and node_modules are excluded via .valeignore +# ============================================================= +[*.{adoc,asciidoc}] +BasedOnStyles = Google, Microsoft, ts-docs + +# ---- Comment exclusions ------------------------------------- +# AsciiDoc single-line comments (// text) are ignored. +# AsciiDoc block comments (////...////) are ignored. +# EXCEPTION: comments inside ---- code blocks are part of code +# content and are preserved by Asciidoctor — they are not +# matched by these patterns and continue to be checked. +# Inline role spans are also stripped before style rules run so that +# capitalization checks do not fire on fixed labels: +# [.version-badge.*]#New# [.version-badge.*]#Breaking# +# [tag *]#NEW FEATURE# [tag *]#DEPRECATED# +# [earlyAccess *]#Early Access# [beta *]^Beta^ +# [NOTE] [WARNING] [IMPORTANT] [TIP] [CAUTION] +TokenIgnores = (\/\/.+), (\[(?:\.version-badge[^\]]*|tag [^\]]*|earlyAccess [^\]]*|beta [^\]]*)\][#^][^#^]+[#^]), (\[(NOTE|TIP|WARNING|IMPORTANT|CAUTION|DANGER)\]) +BlockIgnores = (?s)(\/{4}[\s\S]*?\/{4}) + +# ---- Rule overrides ----------------------------------------- +# Tuned based on audit of alerts against ThoughtSpot developer docs. + +# Vocabulary: managed by ts-vocab; disable built-in Microsoft vocab. +Microsoft.Vocab = NO + +# Headings: sentence case enforced by ts-docs.Headings. +Google.Headings = NO +Microsoft.Headings = NO +Microsoft.HeadingPunctuation = NO +Microsoft.HeadingAcronyms = NO + +# Passive voice: sometimes necessary in reference docs. +Microsoft.Passive = NO +Google.Passive = suggestion + +# Contractions: avoid in formal developer docs. +Microsoft.Contractions = NO + +# List-item punctuation: technical lists often don't end with periods. +Microsoft.Periods = NO + +# Oxford comma: required. +Google.OxfordComma = error + +# URLs: Antora/AsciiDoc handles link formatting; these rules add noise. +Microsoft.GeneralURL = NO +Microsoft.URLFormat = NO + +# Sentence length: covered by ts-docs.SentenceLength. +Microsoft.SentenceLength = NO + +# Parentheses and optional plurals: too noisy for technical API docs. +Google.Parens = NO +Google.OptionalPlurals = NO + +# Google WordList: contains Google-internal product name substitutions +# (for example, Cloud → "Google Cloud Platform") that conflict with +# ThoughtSpot product names. Applicable entries are maintained in +# ts-docs/WordList.yml instead. +Google.WordList = NO + +# Date format: downgraded from error — docs use various date formats +# depending on context (API responses, UI labels, prose). +Microsoft.DateFormat = suggestion +Google.DateFormat = suggestion + +# Colon capitalisation: flags proper nouns and product names after colons. +# Cannot be tuned without rewriting the rule. +Google.Colons = NO +Microsoft.HeadingColons = NO + +# Semicolons: "Use semicolons judiciously" is not actionable feedback. +Google.Semicolons = NO +Microsoft.Semicolon = NO + +# Dotted abbreviations: error-level rule flagging U.S.A.-style patterns. +# Writers are aware of this convention; same check was intentionally +# excluded from ts-docs styles. +Google.Periods = NO + +# Avoided terms: relevant token (and so on) absorbed into ts-docs.DoNotUseTerms. +# Remaining tokens are Microsoft-specific or legitimate in ThoughtSpot docs. +Microsoft.Avoid = NO + +# Wordy phrases: applicable substitutions absorbed into ts-docs.WordList. +# Rule suppressed to avoid duplicate alerts. +Microsoft.Wordiness = NO + +# ============================================================= +# Markdown files +# ============================================================= +[*.{md,markdown}] +BasedOnStyles = Google, Microsoft, ts-docs + diff --git a/.vale/styles/config/vocabularies/ts-vocab/accept.txt b/.vale/styles/config/vocabularies/ts-vocab/accept.txt new file mode 100644 index 000000000..9d49499c0 --- /dev/null +++ b/.vale/styles/config/vocabularies/ts-vocab/accept.txt @@ -0,0 +1,153 @@ +# ts-vocab/accept.txt +# Terms Vale's spell-check should accept as correctly spelled. +# One entry per line. Regex is supported. +# Add product names, SDK identifiers, and technical terms here +# rather than suppressing spell-check globally. + +# ------------------------------------------------------- +# THOUGHTSPOT PRODUCT AND PLATFORM NAMES +# Prose form - correctly capitalised brand name +# ------------------------------------------------------- +ThoughtSpot +ThoughtSpot Cloud +ThoughtSpot Embedded +Visual Embed SDK +REST API v2 +REST API Playground +ThoughtSpotSDK +ThoughtSpotRestApi +ThoughtSpotDeliveryRole + +# ------------------------------------------------------- +# THOUGHTSPOT LOWERCASE / CODE-CONTEXT VARIANTS +# These appear legitimately in URLs, config parameters, +# variable names, and code - accepted here so the spell +# checker does not flag them. +# ------------------------------------------------------- +thoughtspot +thoughtSpotHost +thoughtSpotUrl +thoughtspot\.cloud +tsconfig +tsEmbedSDK + +# ------------------------------------------------------- +# SPOTTER / AI PRODUCT NAMES +# ------------------------------------------------------- +Spotter +SpotterAgent +SpotterCode +SpotterDocs +SpotterEmbed +SpotterAgentEmbed +SpotterAgentEmbedConfig +SpotterAgentEmbedViewConfig +SpotterChatConnectors +SpotterChatConnectorResources +SpotterChatDelete +SpotterChatMenu +SpotterChatModeSwitcher +SpotterChatRename +SpotterChatViewConfig +SpotterConversationDeleted +SpotterConversationRenamed +SpotterConversationSelected +SpotterCSS +SpotterEmbedViewConfig +SpotterFeedback +SpotterInit +SpotterMessage +SpotterNewChat +SpotterPastChatBanner +SpotterQueryTriggered +SpotterSearch +SpotterSidebarFooter +SpotterSidebarHeader +SpotterSidebarToggle +SpotterSidebarViewConfig +SpotterTokenQuickEdit +SpotterWarningsBanner +SpotterWarningsOnTokens +ConversationEmbed + +# ------------------------------------------------------- +# EMBED SDK COMPONENT NAMES +# ------------------------------------------------------- +AppEmbed +LiveboardEmbed +LiveboardEmbedController +LiveboardEmbedView +SearchEmbed +SearchBarEmbed +SpotterAgentEmbed +PreRenderedLiveboardEmbed +TsEmbedSDK +SwiftEmbedSDK +TSEmbedConfig +EmbedConfig +visual-embed-sdk + +# ------------------------------------------------------- +# LIVEBOARD AND DATA TYPES +# ------------------------------------------------------- +Liveboard +Liveboards +LiveboardActionData +LiveboardConfigStyle +LiveboardContextActionData +LiveboardController +LiveboardData +LiveboardInfo +LiveboardPureStyle +LiveboardRendered +LiveboardScheduleData +LiveboardSchedules +LiveboardStyle +LiveboardStyleConfig +LiveboardStylePanel +LiveboardUsers +LiveboardView +LiveboardViewConfig + +# ------------------------------------------------------- +# AUTH AND CONFIG TYPES +# ------------------------------------------------------- +AuthType +TrustedAuthToken +TrustedAuthTokenCookieless +TrustedAuthCookieless +EmbedEvent +HostEvent +RuntimeFilter +RuntimeSort +OAuthRedirectWindowType +ConnectionType + +# ------------------------------------------------------- +# PLATFORM AND FEATURE TERMS +# ------------------------------------------------------- +SpotApps +SpotDev +spotdev +TML +GUID +Antora +TSCLI +tscli + +# Worksheet is deprecated in prose (WordList.yml flags it). +# Retained here so the spell checker does not flag the term +# in code blocks or SDK parameter contexts (e.g. worksheetId). +Worksheet +Worksheets +worksheetId +worksheetIds + +# ------------------------------------------------------- +# INTEGRATION AND CLOUD +# ------------------------------------------------------- +Snowflake +Databricks +Salesforce +Vercel +Pendo diff --git a/.vale/styles/config/vocabularies/ts-vocab/reject.txt b/.vale/styles/config/vocabularies/ts-vocab/reject.txt new file mode 100644 index 000000000..0b2a6e00f --- /dev/null +++ b/.vale/styles/config/vocabularies/ts-vocab/reject.txt @@ -0,0 +1,29 @@ +# ts-vocab/reject.txt +# Plain English terms that are wrong in ALL contexts (prose, headings). +# Vale flags any match as a spelling error. +# One entry per line. Regex is supported. +# +# SCOPE NOTE: reject.txt runs through the spell checker. +# Code blocks are excluded by Vale's Asciidoctor parser, but +# inline code and attribute values may still be checked. +# For deprecated SDK class names, use WordList.yml (tokens:) +# which is strictly prose-scoped. +# +# Use this file only for plain English words that are ALWAYS +# wrong in authored prose, regardless of context. + +# ------------------------------------------------------- +# DEPRECATED PRODUCT / FEATURE NAMES +# "pinboard" and "pinboards" are plain English words that +# should always be replaced with Liveboard in prose. +# Word boundaries prevent matching PinboardEmbed etc. +# ------------------------------------------------------- +\bpinboard\b +\bpinboards\b +\bPinboard\b +\bPinboards\b + +# ------------------------------------------------------- +# ADD DEPRECATED OR BANNED TERMS BELOW +# ------------------------------------------------------- +# OldProductName diff --git a/.vale/styles/ts-docs/Abbreviations.yml b/.vale/styles/ts-docs/Abbreviations.yml new file mode 100644 index 000000000..ee7753ea4 --- /dev/null +++ b/.vale/styles/ts-docs/Abbreviations.yml @@ -0,0 +1,74 @@ +# ts-docs/Abbreviations.yml +# Flags acronyms used without a definition earlier on the same page. +# Expected format on first use: Full Name (ACRONYM) +# Example: "Representational State Transfer (REST)" +# +# How it works: +# For each bare acronym (first pattern), Vale checks whether the +# spelled-out form with the acronym in parentheses (second pattern) +# has appeared before it in the document. If not, it flags that use. +# Once a definition is added, all subsequent bare uses are cleared. +# scope: text means the entire file is the unit of comparison. +extends: conditional +message: "Define '%s' on first use: spell it out as 'Full Name (ABBR)'." +level: warning +ignorecase: false +# Bare acronym - three or more consecutive uppercase letters, optional plural s +first: '\b([A-Z]{3,}s?)\b' +# Spelled-out form followed by the acronym in parentheses +# e.g. "Representational State Transfer (REST)" +second: '(?:[A-Za-z][A-Za-z]* ){1,}\(([A-Z]{3,})\)' +scope: text + +exceptions: + # Include well-known acronyms and abbreviations that need not be defined in technical documentation + # If the documentation is intended for non-technical audience, define these on first use + # Add THOUGHTSPOT and product-specific acronyms/abbreviations that need not be expanded/defined. + - AI + - API + - APIs + - AWS + - BI + - CD + - CDN + - CI + - CLI + - CSS + - CSV + - DOM + - ETL + - FAQ + - GA + - GCP + - GUID + - HTML + - HTTP + - HTTPS + - IDE + - JSON + - JWT + - LLM + - MFA + - OAuth + - PDF + - PNG + - REST + - SAML + - SDK + - SQL + - SSH + - SSL + - SpotIQ + - SSO + - TLS + - URI + - URL + - URLs + - UI + - UX + - XLSX + - XML + - YAML + + # Add acronyms below + # - XYZ diff --git a/.vale/styles/ts-docs/Ampersands.yml b/.vale/styles/ts-docs/Ampersands.yml new file mode 100644 index 000000000..e9a606b9f --- /dev/null +++ b/.vale/styles/ts-docs/Ampersands.yml @@ -0,0 +1,13 @@ +# ts-docs/Ampersands.yml +# Flags ampersands used in place of "and" in prose. +# ThoughtSpot style: spell out "and" in full. +# Exception: ampersands are allowed in formal names and +# common abbreviations (Q&A, R&D, P&L) where no spaces +# surround the symbol - those forms are not matched here. +extends: existence +message: "Spell out 'and' in full. Use '&' only in formal names (e.g. Q&A, R&D)." +level: warning +tokens: + # Matches & surrounded by spaces - the prose "and" usage. + # Does NOT match Q&A, R&D, or other no-space abbreviations. + - '\s&\s' diff --git a/.vale/styles/ts-docs/AsciiDocSyntax.yml b/.vale/styles/ts-docs/AsciiDocSyntax.yml new file mode 100644 index 000000000..698a46446 --- /dev/null +++ b/.vale/styles/ts-docs/AsciiDocSyntax.yml @@ -0,0 +1,53 @@ +# ts-docs/AsciiDocSyntax.yml +# Flags AsciiDoc markup and convention issues that cause rendering +# problems in Antora or break accessibility and link integrity. +# All patterns run on raw source text before Vale strips markup. +# +# Checks: +# - Unresolved attribute references {attr-name} +# - Bare or malformed URL macros +# - Missing blank line before list items +# - Source blocks without a language tag +# - Image macros with empty alt text (accessibility) +# - Xref and hyperlink convention violations (Antora) +extends: existence +message: "AsciiDoc markup or convention issue: '%s'. Check formatting." +level: warning +raw: + # ---- Attribute references -------------------------------- + # Unresolved attribute references (common in Antora content). + # Matches {attr-name} that is NOT followed by a + continuation. + - '\{[a-z][a-z0-9-]+\}(?!\+)' + + # ---- URL macros ------------------------------------------ + # Bare URLs without a link macro - render literally in some outputs. + # Matches http(s)://... followed by an unclosed bracket. + - 'https?://\S+\[(?!\])' + + # ---- List formatting ------------------------------------- + # Missing blank line before a list item - common cause of list + # items rendering as plain text instead of a list. + - '^[*-]\s' + + # ---- Source blocks --------------------------------------- + # Source block without a language tag produces unhighlighted output. + # Use [source,language], e.g. [source,javascript] or [source,bash]. + - '^\[source\]$' + - '^\[source,\s*\]$' + + # ---- Image alt text (accessibility) ---------------------- + # Image macros with empty alt text break screen readers (WCAG 2.1 AA). + # FAIL: image::diagram.png[] PASS: image::diagram.png[API flow diagram] + # FAIL: image:icon.png[] PASS: image:icon.png[Settings icon] + - 'image::[^\[]+\[\s*\]' + - 'image:[^:][^\[]+\[\s*\]' + + # ---- Xref and hyperlink conventions (Antora) ------------- + # Double-bracket cross-reference: Antora recommends xref: syntax. + - '<<[a-zA-Z_][^>]*>>' + # xref: macro with empty display text — readers need descriptive text. + - 'xref:[^\[]+\[\s*\]' + # link: macro for an internal .adoc file — use xref: instead. + - 'link:[^\[]*\.adoc\[' + # External link macro with empty display text. + - 'link:https?://[^\[]+\[\s*\]' diff --git a/.vale/styles/ts-docs/DoNotUseTerms.yml b/.vale/styles/ts-docs/DoNotUseTerms.yml new file mode 100644 index 000000000..08e2c3673 --- /dev/null +++ b/.vale/styles/ts-docs/DoNotUseTerms.yml @@ -0,0 +1,71 @@ +# ts-docs/DoNotUseTerms.yml +# Flags phrases and words that add no meaning, violate the ThoughtSpot +# developer docs style guide, or are inappropriate in technical writing. +# Renamed from BannedPhrases.yml; expanded with IBM/RedHat-sourced additions. +extends: existence +message: "Avoid '%s' in technical documentation. Rewrite the sentence." +link: '' +level: warning +ignorecase: true +tokens: + # ---- Filler / hedge words -------------------------------- + - 'simply' + # Excludes "just-in-time" and "just in time" (legitimate technical phrases). + - 'just(?![ -]in[ -]time)' + - '\beasy\b' + - '\beast\b' + - 'easily' + - 'trivial' + - 'obviously' + - 'of course' + - 'clearly' + - 'basically' + - 'essentially' + - 'actually' + - '\bvery\b' + - '\bquite\b' + - '\breally\b' + + # ---- Vague time / marketing language -------------------- + - '\bsoon\b' + - 'new and improved' + - 'state of the art' + - 'cutting[- ]edge' + - 'best in class' + - 'world[- ]class' + - 'industry[- ]leading' + - 'best of breed' + + # ---- Redundant meta-commentary -------------------------- + - 'as mentioned (above|previously|earlier)' + - 'as stated (above|previously|earlier)' + - 'needless to say' + - 'it goes without saying' + - 'it should be noted' + - 'it is important to note' + + # ---- "Please" in technical writing ---------------------- + # Technical docs use imperative voice; "please" is informal. + - '\bplease\b' + + # ---- Ambiguous constructions (IBM/RedHat) --------------- + # and/or: rewrite as "a and b", "a or b", or "a, b, or both". + - 'and/or' + # "respectively" forces readers to mentally match items across lists; + # rewrite as explicit pairings instead. + - '\brespectively\b' + + # ---- Vague enumerations (Microsoft.Avoid) --------------- + # "and so on" is vague — list all items explicitly or use "such as". + - 'and so on' + + # ---- Placeholder jargon --------------------------------- + # foo/fubar are developer in-jokes; use descriptive variable names. + - '\bfoo\b' + - '\bfubar\b' + + # ---- ThoughtSpot-specific banned phrases ---------------- + # Add deprecated product names, old slogans, or phrases + # prohibited by legal or brand guidelines. + # - 'OldBrandName' + # - 'deprecated-feature' diff --git a/.vale/styles/ts-docs/Headings.yml b/.vale/styles/ts-docs/Headings.yml new file mode 100644 index 000000000..fcda57cf0 --- /dev/null +++ b/.vale/styles/ts-docs/Headings.yml @@ -0,0 +1,117 @@ +# ts-docs/Headings.yml +# Enforces sentence-case headings (capitalise only the first word +# and proper nouns). Follows Google and Red Hat conventions. +extends: capitalization +message: "'%s' should use sentence case — capitalise only the first word and noun phrases." +level: warning +scope: heading +match: $sentence +# Add every proper noun, product name, acronym, and brand term +# that should remain capitalised mid-heading. +exceptions: + # ------------------------------------------------------- + # STANDARD TECHNICAL ACRONYMS + # ------------------------------------------------------- + - API + - APIs + - CLI + - UI + - UX + - URL + - URLs + - URI + - HTTP + - HTTPS + - REST + - YAML + - JSON + - XML + - HTML + - CSS + - SQL + - SSH + - TLS + - SSL + - OAuth + - JWT + - SDK + - IDE + - CI + - CD + - AWS + - GCP + - Azure + - Linux + - macOS + - Windows + - GitHub + - GitLab + - Docker + - Kubernetes + + # ------------------------------------------------------- + # THOUGHTSPOT PRODUCT AND BRAND NAMES + # ------------------------------------------------------- + - ThoughtSpot + - Spotter + - SpotterAgent + - SpotterCode + - SpotterDocs + - SpotApps + - SpotDev + + # Embed SDK component names + - AppEmbed + - LiveboardEmbed + - SearchEmbed + - SearchBarEmbed + - SpotterEmbed + - SpotterAgentEmbed + - ConversationEmbed + - PreRenderedLiveboardEmbed + + # Product feature nouns + - Liveboard + - Liveboards + - Worksheet + - Worksheets + - TML + - GUID + + # Auth and security terms + - TrustedAuthToken + - TrustedAuthTokenCookieless + - AuthType + - SAML + - SSO + - CORS + - RBAC + - ABAC + - RLS + - CRUD + + # Languages and frameworks + - JavaScript + - TypeScript + - React + - Antora + + # Additional acronyms + - CSV + - PDF + - JWT + + # Cloud and integration partners + - Salesforce + - Snowflake + - Databricks + - Google + - Microsoft + - Slack + - Vercel + - Pendo + + # ------------------------------------------------------- + # ADD YOUR OWN PROPER NOUNS BELOW + # Format: - TermToKeepCapitalised + # ------------------------------------------------------- diff --git a/.vale/styles/ts-docs/LinkText.yml b/.vale/styles/ts-docs/LinkText.yml new file mode 100644 index 000000000..bccbb8329 --- /dev/null +++ b/.vale/styles/ts-docs/LinkText.yml @@ -0,0 +1,17 @@ +# ts-docs/LinkText.yml +# Flags non-descriptive link text that violates accessibility +# and ThoughtSpot style guidelines. +# Rule: linked text must tell the reader what they are clicking on. +# Do not link more than three to four words. +extends: existence +message: "Avoid '%s' as link text. Use words that tell the reader what they are clicking on." +level: warning +ignorecase: true +tokens: + - 'click here' + - 'click this link' + - 'click here to' + - 'read more' + - 'learn more' + - 'here\.' + - 'this link' diff --git a/.vale/styles/ts-docs/PreCommitChecks.yml b/.vale/styles/ts-docs/PreCommitChecks.yml new file mode 100644 index 000000000..0a4800da1 --- /dev/null +++ b/.vale/styles/ts-docs/PreCommitChecks.yml @@ -0,0 +1,54 @@ +# ts-docs/PreCommitChecks.yml +# Flags content that must be removed or replaced before committing. +# Covers unfilled template tokens and Git merge conflict markers. +# Applied to raw source (raw:) so tokens in AsciiDoc attributes +# and headers are also caught. +extends: existence +message: "Pre-commit issue: '%s' — remove or replace before committing." +level: error +nonword: true +raw: + # ---- Standard template tokens --------------------------- + - '<version>' + - '<Title' + - '<slug>' + - 'DOC-XXXX' + - 'JIRA-REF' + - 'ENG-XXXX' + - 'your-style-guide-url' + + # ---- In-template TODO comments -------------------------- + - 'TODO: verify with engineering' + - 'TODO: verify scope with engineering' + - 'TODO: add screenshot' + - 'TODO: confirm with' + + # ---- ThoughtSpot template tokens ------------------------ + # Tokens used in modules/_templates/*.adoc that must be + # replaced before a page is published. + - '<Title: ' + - '<Title —' + - '<One sentence:' + - '<Add a unique ID' + - '<comma-separated terms' + - '<version>' + - '<DOC-XXXX>' + - '<role or permission' + - '<system or resource' + - '<file-name>' + - 'your-instance' + - 'liveboard-GUID' + - '<your-instance>' + - '<liveboard-GUID>' + - '<username>' + - '<token>' + - '<endpoint>' + + # ---- Add your own template placeholder patterns --------- + # - '<YOUR-TOKEN>' + + # ---- Git merge conflict markers ------------------------- + # These must never appear in committed or published content. + - '^<{7}\s.*$' + - '^={7}$' + - '^>{7}\s.*$' diff --git a/.vale/styles/ts-docs/RepeatedWords.yml b/.vale/styles/ts-docs/RepeatedWords.yml new file mode 100644 index 000000000..1752ad930 --- /dev/null +++ b/.vale/styles/ts-docs/RepeatedWords.yml @@ -0,0 +1,17 @@ +# ts-docs/RepeatedWords.yml +# Flags consecutive repeated words, e.g. "the the" or "and and". +# Ported from RedHat.RepeatedWords. +extends: repetition +message: "'%s' is repeated. Remove the duplicate." +level: warning +ignorecase: false +alpha: true +action: + name: edit + params: + - regex + - '(\w+)(\s\w+)' + - "$1" +tokens: + - '[^\s\.]+' + - '[^\s]+' diff --git a/.vale/styles/ts-docs/SentenceLength.yml b/.vale/styles/ts-docs/SentenceLength.yml new file mode 100644 index 000000000..36a32392c --- /dev/null +++ b/.vale/styles/ts-docs/SentenceLength.yml @@ -0,0 +1,11 @@ +# ts-docs/SentenceLength.yml +# Flags sentences in paragraph prose that exceed 30 words. +# Code blocks, headings, lists, and other non-prose content +# are ignored automatically by Vale's AsciiDoc parser. +# Raise max if the rule is too noisy for your content. +extends: occurrence +message: "Long sentence (%d words). Aim for 30 or fewer." +level: suggestion +scope: sentence +max: 30 +token: '\b\w+' diff --git a/.vale/styles/ts-docs/SmartQuotes.yml b/.vale/styles/ts-docs/SmartQuotes.yml new file mode 100644 index 000000000..4ebbf970b --- /dev/null +++ b/.vale/styles/ts-docs/SmartQuotes.yml @@ -0,0 +1,16 @@ +# ts-docs/SmartQuotes.yml +# Flags curly/smart quotation marks in raw AsciiDoc source. +# AsciiDoc source should use straight ASCII quotes; the renderer +# applies typographic quotes as needed. Curly quotes in source +# can cause rendering issues and encoding problems. +# Ported from RedHat.SmartQuotes. +extends: substitution +message: "Do not use curly/smart quotation marks. Use straight ASCII quotes instead of '%s'." +level: warning +nonword: true +scope: raw +action: + name: replace +swap: + '\u2018|\u2019': "'" + '\u201C|\u201D|\u201F|\u2033|\u2036': '"' diff --git a/.vale/styles/ts-docs/WordList.yml b/.vale/styles/ts-docs/WordList.yml new file mode 100644 index 000000000..defae7967 --- /dev/null +++ b/.vale/styles/ts-docs/WordList.yml @@ -0,0 +1,212 @@ +# ts-docs/WordList.yml +# Adapted from github.com/splunk/vale-splunk-style-guide +# Flags variant or deprecated terms and suggests the preferred form. +extends: substitution +message: "Use '%s' instead of '%s'." +level: warning +ignorecase: false +action: + name: replace +swap: + # ------------------------------------------------------- + # UI INTERACTION TERMS + # ------------------------------------------------------- + 'click on': click + 'hit': press + 'depress': press + 'check out': see + + # ------------------------------------------------------- + # DIRECTIONAL REFERENCES + # Replace spatial directions with relative document refs + # ------------------------------------------------------- + 'above': the previous section + 'below': the following section + + # ------------------------------------------------------- + # WORDY PHRASES - replace with concise alternatives + # ------------------------------------------------------- + 'in order to': to + 'due to the fact that': because + 'at this point in time': now + 'at present': now + 'basic steps': steps + 'be sure to': make sure + 'in the event that': if + 'prior to': before + 'subsequent to': after + 'with regard to': about + 'with respect to': about + 'as per': per + 'a number of': several|many + + # ------------------------------------------------------- + # TECHNICAL TERM CONSISTENCY + # ------------------------------------------------------- + 'boolean': Boolean + 'can not': cannot + 'checkbox': check box + 'carriage return': line break + 'utilize': use + 'utilization': usage + 'leverage': use + 'functionality': features + 'performant': high-performance + + # ------------------------------------------------------- + # INCLUSIVE LANGUAGE + # ------------------------------------------------------- + 'whitelist': allowlist + 'blacklist': blocklist + 'master branch': main branch + 'dummy': placeholder|stub + 'sanity check': confidence check|smoke test + + # ------------------------------------------------------- + # THOUGHTSPOT PRODUCT-SPECIFIC TERMS + # Applies to prose text only - code blocks, URLs, and + # parameter/variable names are excluded by Vale's + # AsciiDoc parser before these rules run. + # ------------------------------------------------------- + + # Deprecated plain-English feature names (prose only) + 'pinboard': Liveboard + 'Pinboard': Liveboard + 'sage embed': Spotter embed + 'sage search': natural language search + 'Ask sage': Ask AI + + # Worksheet deprecated - replaced by Model. + # Word boundaries ensure worksheetId and other SDK parameter + # names in code are never matched - only bare prose words fire. + # Context guide: + # UI element reference -> Model (capitalized) + # Descriptive prose -> model or data model (lowercase) + '\bworksheet\b': model + '\bWorksheet\b': Model + '\bworksheets\b': models + '\bWorksheets\b': Models + + + # Deprecated SDK class names referenced in prose + # (e.g. "Use SageEmbed to..." in a migration guide) + 'SageEmbed': SpotterEmbed + 'SageEmbedQuery': SpotterEmbed + 'PinboardEmbed': LiveboardEmbed + 'PinboardEmbedViewConfig': LiveboardViewConfig + + # ------------------------------------------------------- + # THOUGHTSPOT WRITING CONVENTIONS + # Source: ThoughtSpot style guide + # ------------------------------------------------------- + + # Brand abbreviations - always write the full name in external content + '\bTS\b': ThoughtSpot + '\bTSE\b': ThoughtSpot Embedded + + # All-caps variant — incorrect casing, suggest correct brand name + '\bTHOUGHTSPOT\b': ThoughtSpot + + # Deprecated product name - replaced by ThoughtSpot Embedded + '\bThoughtSpot Everywhere\b': ThoughtSpot Embedded + + # Acronym style - no periods (use AI not A.I.) + 'A\.I\.': AI + 'B\.I\.': BI + + # Compound word and hyphenation conventions + 'dropdown': drop-down + 'drop down': drop-down + '[Ee]-mail': email + '[Ee]-book': ebook + 'front line': frontline + 'front-line': frontline + 'white paper': whitepaper + + # ThoughtSpot product and feature naming + 'liveboards': Liveboards + 'live analytics': Live Analytics + 'data lakehouse': lakehouse + '[Rr]eal-time insights': Instant insights + 'zero to search': zero-to-search + + # Use low-code, not no-code + 'no-code': low-code + + # ------------------------------------------------------- + # PLAIN ALTERNATIVES (from IBM/RedHat SimpleWords) + # Prefer plain alternatives in technical writing. + # ------------------------------------------------------- + 'commence': begin + 'initiate': start|begin + 'numerous': many + 'a lot of': many|much + + # ------------------------------------------------------- + # WORDY PHRASES (from Microsoft.Wordiness) + # ------------------------------------------------------- + 'has the ability to': can + 'has the capacity to': can + 'whether or not': whether + 'despite the fact that': although + 'because of the fact that': because + 'successfully complete': complete + 'take into account': consider + 'in lieu of': instead of + 'make reference to': refer to + 'made reference to': referred to + 'with the exception of': except for + 'except when': unless + 'not in a position to': unable + 'in many cases': often + 'in most cases': usually + 'a (?:large)? majority of': most + 'a myriad of': myriad + 'any and all': all + 'at all times': always + 'at a later date': later + 'continue on': continue + 'during the period of': during + 'during the time that': while + 'establish connectivity': connect + 'for the duration of': during + 'in an effort to': to + 'in between': between + 'in spite of the fact that': although + 'pertaining to': about + 'until such time as': until + + # ------------------------------------------------------- + # TERMS ADOPTED FROM GOOGLE DEVELOPER STYLE GUIDE + # Google.WordList is suppressed in .vale.ini; applicable + # entries are maintained here instead. + # Excluded: Google-specific product names (Cloud, Container + # Engine, Developers Console), Android/mobile-only terms, + # and entries already covered above. + # ------------------------------------------------------- + + # Auth and security + '(?:OAuth ?2|Oauth)': OAuth 2.0 + 'authN': authentication + 'authZ': authorization + 'SHA1': SHA-1 + 'sign into': sign in to + + # Capitalization and spelling + '(?:WiFi|wifi)': Wi-Fi + 'HTTPs': HTTPS + '\burl\b': URL + 'synch': sync + 'k8s': Kubernetes + + # Technical writing conventions + 'data are': data is + 'file name': filename + 'a\.k\.a|aka': or|also known as + 'vs\.': versus + 'approx\.': approximately + 'autoupdate': automatically update + + # UI actions + 'un(?:check|select)': clear + '(?:kill|terminate|abort)': stop|exit|cancel|end diff --git a/.valeignore b/.valeignore new file mode 100644 index 000000000..b92abd6c5 --- /dev/null +++ b/.valeignore @@ -0,0 +1,24 @@ +# Vale ignore patterns — syntax mirrors .gitignore +# Paths matched here are skipped entirely by `vale`. + +# Build output and dependencies +node_modules/ +public/ +.cache/ +dist/ +lib/ +coverage/ + +# Auto-generated TypeDoc pages — not authored prose +modules/ROOT/pages/generated/ + +# Legacy / deprecated embed pages (kept for reference, not linted) +# Uncomment if you want to suppress alerts on legacy pages: +# modules/ROOT/pages/embed-pinboard.adoc +# modules/ROOT/pages/pinboard-export-api.adoc + +# Vale style packages and config — not authored prose +.vale/styles/Google/ +.vale/styles/Microsoft/ +.vale/styles/ts-docs/ +.vale/styles/config/ diff --git a/modules/ROOT/pages/authentication.adoc b/modules/ROOT/pages/authentication.adoc index 4d0b69cf0..f84f56343 100644 --- a/modules/ROOT/pages/authentication.adoc +++ b/modules/ROOT/pages/authentication.adoc @@ -117,7 +117,7 @@ To get an access token that grants full access to ThoughtSpot, send a `POST` req |`org_id` + __Optional__|__Integer__. If the Orgs feature is enabled on your instance, specify the ID of the Org for which you want to generate the authentication token. If no value is specified, the token is generated for the Primary Org (Org 0). |`validity_time_in_sec` + -__Optional__|__Integer__. Token validity duration in seconds. By default, the token is valid for 5 minutes. You can set the token expiry duration to a higher value. API requests with an expired or invalid token result in an error. In such cases, REST clients must obtain a new token from ThoughtSpot and use it in their subsequent API calls. +__Optional__ |__Integer__. Token validity duration in seconds. By default, the token is valid for 5 minutes. You can set the token expiry duration to a higher value. API requests with an expired or invalid token result in an error. In such cases, REST clients must obtain a new token from ThoughtSpot and use it in their subsequent API calls. || |===== @@ -245,9 +245,9 @@ To get a token that grants read-only access to a ThoughtSpot metadata object, se |__String__. GUID of the ThoughtSpot object. The token obtained from this API request grants `read-only` access to the specified object. |`org_id` + -__Optional__|__Integer__. If the Orgs feature is enabled on your instance, specify the ID of the Org for which you want to generate the authentication token. If no value is specified, the token is generated for the Primary Org (Org 0). +__Optional__ |__Integer__. If the Orgs feature is enabled on your instance, specify the ID of the Org for which you want to generate the authentication token. If no value is specified, the token is generated for the Primary Org (Org 0). |`validity_time_in_sec` + -__Optional__|__Integer__. Token validity duration in seconds. By default, the token is valid for 5 minutes. +__Optional__ |__Integer__. Token validity duration in seconds. By default, the token is valid for 5 minutes. |===== ===== Example request diff --git a/modules/ROOT/pages/variables.adoc b/modules/ROOT/pages/variables.adoc index a5d4ce38b..f58cb6dd6 100644 --- a/modules/ROOT/pages/variables.adoc +++ b/modules/ROOT/pages/variables.adoc @@ -8,6 +8,7 @@ Variables allow you to substitute values for specific properties of a metadata object and enable dynamic data propagation across Orgs in ThoughtSpot. Using variables, you can parameterize the properties of data connections, table references, and formulas per Org without changing the underlying data or creating duplicate objects. Variable values are assigned at runtime to ensure that customized configuration is available to users of different Orgs in ThoughtSpot. + == Overview ThoughtSpot provides predefined system variables such as `ts_username` and `ts_groups`, which can be used in formulas for data security. Additionally, you can configure variables programmatically via REST APIs, and later use these variables for the following purposes: diff --git a/modules/_templates/best-practices.adoc b/modules/_templates/best-practices.adoc new file mode 100644 index 000000000..ab2544792 --- /dev/null +++ b/modules/_templates/best-practices.adoc @@ -0,0 +1,79 @@ += <Title: "Best Practices for <noun phrase>"> +:toc: true +:toclevels: 1 + +:page-pageid: +:keywords: <comma-separated terms. For example, "configure auth", "SSO", "SAML"> +:page-type: best-practices +:page-role: +:product-version: <version> +:jira-ref: <DOC-XXXX> +// last-reviewed: <Optional> + +// 1-2 sentences: what this page covers, who it is for, and what +// following these practices helps them achieve. + +== Overview + +// Optional. Provide context for why these practices matter +// what problems they prevent or what outcomes they enable. +// Keep to 2-3 sentences. Link to concept pages for deeper background. + +== Recommended practices +// Include a list the best practices, dos and don'ts. + +// * <Do not set the token expiration key to ...> +// * <Ensure the API token is saved in a secure place.> + +// If a best practice or recommendation requires its own section, use the format in the following sections.> + +=== <Practice title: short imperative phrase, "Refresh API keys regularly"> + +// Lead with the recommendation as a direct statement: +// "Refresh your API keys every 90 days." +// +// Then explain: +// - Why: the risk or benefit this practice addresses +// - How: the steps or configuration required +// - When: any conditions or exceptions that apply + +// TODO: verify recommendation with engineering + +[source,bash] +---- +# Example command or configuration snippet if applicable +---- + +// NOTE: <Optional note that helps the reader apply this practice more effectively.> + +=== <Practice title> + +// Lead with the recommendation. +// Explain why, how, and when. + +== What to avoid + +// Optional but high value. Describe common mistakes or patterns. +// Use WARNING admonitions for practices that risk data loss or security issues. + +//WARNING: <Describe a practice that risks data loss, security exposure,or system instability. State the consequence clearly.> + +// Alternative: use a simple list for lower-severity anti-patterns. + +// Optional but high value. Describe common mistakes, patterns, dos and don'ts. + +// * <Do not set the token expiration key to less than 10 minutes>, <state the reason/impact and preferred alternative>. +// * <Do not ....> <state the reason/impact and preferred alternative>. + +// Use admonitions to highlight important information. + +//// +[WARNING] +=== +<Describe a practice that risks data loss, security exposure,or system instability. State the consequence clearly.> +==== +//// + +== Related information + +// * xref:<file-name>.adoc[Link text] <Add additional info or subtext if required. diff --git a/modules/_templates/concept.adoc b/modules/_templates/concept.adoc index d21cac891..9b143ec75 100644 --- a/modules/_templates/concept.adoc +++ b/modules/_templates/concept.adoc @@ -4,8 +4,8 @@ :page-title: <Title — must match the = Title above> :page-description: <One sentence: what this page covers and why it matters to the reader.> -:page-pageid: <Add a unique ID for this page, e.g. "embed-sdk-concepts". Required for developer documentation.> -:keywords: <comma-separated terms for search indexing, e.g. "authentication, SSO, SAML, login"> +:page-pageid: <Add a unique ID for this page, for example, "embed-sdk-concepts". Required for developer documentation.> +:keywords: <comma-separated terms for search indexing, for example, "authentication, SSO, SAML, login"> :page-type: concept :page-role: :product-version: <version> @@ -21,7 +21,7 @@ TEMPLATE GUIDE ============== How to use this template: 1. Copy this file from modules/_templates/concept.adoc. - 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "embed-sso-overview.adoc"). + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, for example, "embed-sso-overview.adoc"). 3. Place the file in modules/ROOT/pages/. 4. If this page will be included as a partial inside another page (via include::), remove all front-matter attributes — partials do not need them. @@ -92,7 +92,7 @@ Description of what it does. == Limitations and constraints // RECOMMENDED. -// List known limitations, version-specific behaviour, or edge cases the reader should know. +// List known limitations, version-specific behavior, or edge cases the reader should know. // Use admonitions for critical constraints: // // [IMPORTANT] @@ -102,7 +102,7 @@ Description of what it does. // // [NOTE] // ==== -// Behaviour changed in <version>. If you are on an earlier version, see xref:...[] +// Behavior changed in <version>. If you are on an earlier version, see xref:...[] // ==== // // [WARNING] @@ -110,7 +110,7 @@ Description of what it does. // Enabling this setting affects all users in the org. Confirm with your administrator before proceeding. // ==== -* +* <Known limitation or constraint.> == Related information diff --git a/modules/_templates/faqs.adoc b/modules/_templates/faqs.adoc new file mode 100644 index 000000000..a22c03184 --- /dev/null +++ b/modules/_templates/faqs.adoc @@ -0,0 +1,64 @@ += <Title: Noun phrase, for example, "Frequently Asked Questions: Authentication"> +:toc: true +:toclevels: 1 +:page-pageid: +:page-type: faq +:page-role: +:product-version: <version> +:jira-ref: <DOC-XXXX> +// author: +// last-reviewed: + +// 1-2 sentences: what topic area these FAQs cover and who they are for. +// Note: write each question as users would ask it — this improves +// both findability and GEO citation rates. + +== General + +=== <Question written as a user would ask it, for example, "What authentication methods are supported?"> + +// Answer directly in the first sentence. Provide detail after. +// If the answer requires steps, use a numbered list. +// If the answer links to a full page, link to it and summarize here. + +// TODO: verify answer with engineering + +--- + +=== <Question> + +// Answer. + +== <Topic group, for example, "Installation"> + +=== <Question> + +// Answer. + +--- + +=== <Question> + +// Answer. + +== <Topic group, for example, "Configuration"> + +=== <Question> + +// Answer. + +--- + +=== <Question> + +// Answer. + +== <Topic group, for example, "Billing and licensing"> + +=== <Question> + +// Answer. + +== Related information + +* xref:<component>:<module>/page.adoc[Link text] diff --git a/modules/_templates/procedure.adoc b/modules/_templates/procedure.adoc index 597a571b2..bdda044df 100644 --- a/modules/_templates/procedure.adoc +++ b/modules/_templates/procedure.adoc @@ -1,12 +1,12 @@ -= <Title: Verb + Object, e.g. "Configure Single Sign-On"> += <Title: Verb + Object, for example, "Configure Single Sign-On"> :toc: true :toclevels: 1 :page-title: <Title — must match the = Title above> :page-description: <One sentence: what this procedure does and who it is for.> -:page-pageid: <Add a unique ID for this page, e.g. "embed-sdk-concepts". Required for developer documentation.> +:page-pageid: <Add a unique ID for this page, for example, "embed-sdk-concepts". Required for developer documentation.> :page-type: procedure -:keywords: <comma-separated terms for search indexing, e.g. "configure, SSO, SAML, setup"> +:keywords: <comma-separated terms for search indexing, for example, "configure, SSO, SAML, setup"> :page-role: :product-version: <version> :jira-ref: <DOC-XXXX> @@ -18,7 +18,7 @@ TEMPLATE GUIDE ============== How to use this template: 1. Copy this file from modules/_templates/procedure.adoc. - 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "configure-saml-sso.adoc"). + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, for example, "configure-saml-sso.adoc"). 3. Place the file in modules/ROOT/pages/. 4. If this page will be included as a partial inside another page (via include::), remove all front-matter attributes — partials do not need them. @@ -61,8 +61,8 @@ Style elements you can use: // REQUIRED if there are prerequisites. Use "You must" or "You need" for each item. // Remove this section only if there are genuinely no prerequisites. -* You must have <role or permission, e.g. "Developer or Administrator privilege">. -* You need access to <system or resource, e.g. "a ThoughtSpot Cloud instance with the Embed feature enabled">. +* You must have <role or permission, for example, "Developer or Administrator privilege">. +* You need access to <system or resource, for example, "a ThoughtSpot Cloud instance with the Embed feature enabled">. * <Any additional prerequisite.> == Procedure @@ -130,7 +130,7 @@ curl -X POST \ == Result // REQUIRED. Describe what the user should see or be able to do after completing the procedure. -// Be specific — name the UI element, API response, or behaviour that confirms success. +// Be specific — name the UI element, API response, or behavior that confirms success. // // OPTIONAL: Screenshot of the expected result: // image::./images/<result-screenshot>.png[Expected result after completing the procedure] diff --git a/modules/_templates/quickstart.adoc b/modules/_templates/quickstart.adoc new file mode 100644 index 000000000..44de8de34 --- /dev/null +++ b/modules/_templates/quickstart.adoc @@ -0,0 +1,113 @@ += Get Started with <Product or Feature Name> +:toc: true +:toclevels: 1 +:page-pageid: +:page-type: quickstart +:page-role: +:product-version: <version> +:jira-ref: <DOC-XXXX> +// author: +// last-reviewed: + +// 1-2 sentences: what the user will have running or achieved by the +// end of this page, and roughly how long it takes. +// Example: "This guide walks you through installing and configuring +// <Product> for the first time. Estimated time: 15 minutes." + +== Before you begin + +// List everything the user must have in place before starting. +// Be specific — vague prerequisites are the most common cause of +// support requests on getting-started content. + +Ensure you have the following before proceeding: + +* *Operating system*: <supported OS and minimum version> +* *<Dependency>*: version <X.X> or later. See xref:<component>:<module>/page.adoc[Install <Dependency>]. +* *Permissions*: <describe required access level or role> +* *Network access*: <describe any firewall, port, or connectivity requirements> +// TODO: verify prerequisites with engineering + +== Step 1: <First milestone, for example, "Install <Product>"> + +// Keep each step focused on a single milestone the user can verify. +// Use a numbered list for the actions within each step. + +. Action one. ++ +[source,bash] +---- +# example command +---- + +. Action two. + +. Verify the installation was successful: ++ +[source,bash] +---- +# verification command +---- ++ +Expected output: ++ +---- +<expected output here> +---- + +== Step 2: <Second milestone, for example, "Configure your environment"> + +. Action one. ++ +[source,bash] +---- +# example command or configuration snippet +---- + +. Action two. + +// TODO: verify configuration steps with engineering + +== Step 3: <Third milestone, for example, "Run your first <action>"> + +. Action one. +. Action two. ++ +[source,bash] +---- +# example command +---- + +. Verify the result: ++ +---- +<expected output here> +---- + +== Next steps + +// Tell the user what to do now that they have a working setup. +// Link to tutorials, deeper configuration guides, or key concepts. + +Now that you have <Product> running, you can: + +* xref:<component>:<module>/page.adoc[<Next logical task>] +* xref:<component>:<module>/page.adoc[<Explore a key feature>] +* xref:<component>:<module>/page.adoc[<Understand a core concept>] + +== Troubleshooting + +// Optional. Cover the 2-3 most common issues users hit during setup. +// Link to the full troubleshooting page if one exists. + +If you encounter issues during setup, see +xref:<component>:<module>/troubleshooting.adoc[Troubleshoot <Product> installation]. + +Common issues: + +* *<Symptom>*: <one-line cause and fix>. +* *<Symptom>*: <one-line cause and fix>. + +== Related information + +* xref:<component>:<module>/page.adoc[Link text] diff --git a/modules/_templates/reference.adoc b/modules/_templates/reference.adoc index 8dfdec29c..a1b1ab16c 100644 --- a/modules/_templates/reference.adoc +++ b/modules/_templates/reference.adoc @@ -1,10 +1,11 @@ -= <Title: Noun phrase, e.g. "Liveboard report API reference"> += <Title: Noun phrase, for example, "Liveboard report API reference"> :toc: true -:toclevels: 1 <-- adjust if you have many sections, but 1-2 levels is usually sufficient for reference pages> +:toclevels: 1 +// Adjust toclevels if you have many sections, but 1-2 levels is usually sufficient for reference pages. :page-title: <Title — must match the = Title above> :page-description: <One sentence: what this reference documents and who uses it.> -:keywords: <comma-separated terms for search indexing, e.g. "REST API, parameters, endpoints, reference"> +:keywords: <comma-separated terms for search indexing, for example, "REST API, parameters, endpoints, reference"> :page-pageid: :page-type: reference :page-role: @@ -18,12 +19,12 @@ TEMPLATE GUIDE ============== How to use this template: 1. Copy this file from modules/_templates/reference.adoc. - 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "rest-api-auth-reference.adoc"). + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, for example, "rest-api-auth-reference.adoc"). 3. Place the file in modules/ROOT/pages/. 4. If this page will be included as a partial inside another page (via include::), remove all front-matter attributes — partials do not need them. -Use this template for pages that document parameters, properties, endpoints, request /response worklows, classes, enumerations, or configuration options — reference material a reader looks up, not reads start-to-finish. +Use this template for pages that document parameters, properties, endpoints, request/response workflows, classes, enumerations, or configuration options — reference material a reader looks up, not reads start-to-finish. Section labels: REQUIRED — must be present on every page of this type @@ -111,7 +112,7 @@ POST /api/rest/2.0/<endpoint-path> // OPTIONAL: Version-specific notes — use inline badges to flag changes per parameter: // [.version-badge.new]#New in vX.X# `new_param` — added in this version; description. // [.version-badge.deprecated]#Deprecated# `old_param` — deprecated in vX.X; use `new_param` instead. -// [.version-badge.breaking]#Breaking# `changed_param` — behaviour changed in vX.X. +// [.version-badge.breaking]#Breaking# `changed_param` — behavior changed in vX.X. === Example request diff --git a/modules/_templates/release-notes.adoc b/modules/_templates/release-notes.adoc index a9379d3e0..80a092a0d 100644 --- a/modules/_templates/release-notes.adoc +++ b/modules/_templates/release-notes.adoc @@ -3,7 +3,7 @@ :toclevels: 1 :page-title: <Title — must match the = Title above> :page-description: <One sentence: summary of what is new or changed in this release.> -:keywords: <comma-separated terms for search indexing, e.g. "release notes, changelog, new features, ThoughtSpot Cloud"> +:keywords: <comma-separated terms for search indexing, for example, "release notes, changelog, new features"> :page-type: release-note :page-role: :product-version: <version> @@ -14,7 +14,7 @@ TEMPLATE GUIDE ============== How to use this template: 1. Copy this file from modules/_templates/release-notes.adoc. - 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, e.g. "release-notes-26-5.adoc"). + 2. Rename the copy to <file-name>.adoc (lowercase, hyphen-separated, for example, "release-notes-26-5.adoc"). 3. Place the file in modules/ROOT/pages/. 4. If this page will be included as a partial inside another page (via include::), remove all front-matter attributes — partials do not need them. @@ -49,10 +49,10 @@ Format notes: //// // REQUIRED: One sentence stating the release scope and any critical headline. -This release includes updates to <product area, e.g. "the Visual Embed SDK and REST API v2.0">. +This release includes updates to <product area, for example, "the Visual Embed SDK and embed APIs">. // REQUIRED: Release metadata block. -**Release version**: ThoughtSpot Cloud <X.X.X.cl> + +*Release version*: ThoughtSpot Cloud <version> + *Upgrade notes*: <None. / ⚠️ Describe any breaking changes; link to Upgrade notes section.> + *Recommended SDK versions*: Visual Embed SDK v<X.XX.X> and later diff --git a/modules/_templates/troubleshooting.adoc b/modules/_templates/troubleshooting.adoc new file mode 100644 index 000000000..6ec2b685b --- /dev/null +++ b/modules/_templates/troubleshooting.adoc @@ -0,0 +1,90 @@ += <Title: Noun phrase describing the problem area, for example, "Troubleshoot Authentication Errors"> +:toc: true +:toclevels: 1 +:page-pageid: +:page-type: troubleshooting +:page-role: +:product-version: <version> +:jira-ref: <DOC-XXXX> +// author: +// last-reviewed: + +// 1-2 sentences: what issues this page helps resolve and who it is for. + +== General troubleshooting steps + +// Optional. Steps to try before attempting issue-specific fixes. +// Remove this section if all issues have distinct, unrelated causes. + +. Check that you are running the correct version. See xref:<component>:<module>/page.adoc[Supported versions]. +. Review the logs for error messages. Log files are located at `<log-path>`. +. // TODO: verify general steps with engineering + +== Issues + +=== <Issue title: brief description of the symptom, for example, "Connection times out after login"> + +==== Symptom + +// Describe exactly what the user sees: error message text, UI behavior, +// or unexpected output. Use a literal block for exact error messages. + +---- +<exact error message or log output here> +---- + +==== Cause + +// Explain why this happens. If the cause is unknown, write: +// "The cause of this issue has not been determined." +// TODO: verify cause with engineering + +==== Solution + +. Step one. +. Step two. +. Step three. + +// If there are multiple solutions, use separate numbered lists with +// a lead-in sentence for each: "If <condition>, try the following:" + +==== Verification + +// Optional. Describe what the user should see to confirm the issue is resolved. + +--- + +=== <Issue title> + +==== Symptom + +---- +<exact error message or log output here> +---- + +==== Cause + +// TODO: verify cause with engineering + +==== Solution + +. Step one. +. Step two. + +==== Verification + +// Optional. + +== Collect diagnostic information + +// Optional but recommended. Describe how to gather logs, traces, +// or system information to share with support. + +[source,bash] +---- +# Example command to collect diagnostic output +---- + +== Related information + +* xref:<component>:<module>/page.adoc[Link text] diff --git a/modules/_templates/tutorial.adoc b/modules/_templates/tutorial.adoc new file mode 100644 index 000000000..a1d011266 --- /dev/null +++ b/modules/_templates/tutorial.adoc @@ -0,0 +1,229 @@ += <Title: Action-oriented phrase describing what the user builds, +for example, "Build a Real-Time Dashboard Using the <Product> API"> +:toc: true +:toclevels: 1 +:page-pageid: +:page-type: tutorial +:page-role: +:product-version: <version> +:jira-ref: <DOC-XXXX> +// author: +// last-reviewed: + +// 2-3 sentences covering: +// - What the user will build or accomplish +// - What they will learn along the way +// - Estimated time to complete +// Example: "In this tutorial, you build a <thing> using <Product>. +// You learn how to <skill 1>, <skill 2>, and <skill 3>. +// Estimated time: 30 minutes." + +== Learning objectives + +// List what the user will be able to do after completing this tutorial. +// Use "After completing this tutorial, you will be able to:" as the lead. +// Write each objective as a verb phrase. + +After completing this tutorial, you will be able to: + +* <Verb phrase, for example, "Configure a <Product> connection using OAuth 2.0"> +* <Verb phrase> +* <Verb phrase> + +== Before you begin + +// List prerequisites with enough specificity that the user can +// self-qualify before investing time in the tutorial. + +* *Experience level*: <for example, "Familiarity with REST APIs and JSON"> +* *<Tool or dependency>*: version <X.X> or later installed and configured. + See xref:<component>:<module>/page.adoc[Install <Tool>]. +* *<Account or access>*: <describe what is needed and how to obtain it> +* *Completed*: xref:<component>:<module>/quickstart.adoc[Get Started with <Product>] +// TODO: verify prerequisites with engineering + +== Overview + +// Optional but recommended for tutorials over 20 minutes. +// Briefly describe the architecture, workflow, or scenario the +// user is working through, so they understand the big picture +// before diving into steps. A diagram (image::) works well here. + +In this tutorial, you: + +. <High-level phase 1, for example, "Set up the project structure"> +. <High-level phase 2, for example, "Configure authentication"> +. <High-level phase 3, for example, "Implement the core logic"> +. <High-level phase 4, for example, "Test and verify the result"> + +== Part 1: <Phase title, for example, "Set up the project"> + +// Tutorials are longer than procedures. Use H2 parts to divide +// the work into phases the user can pause and resume between. +// Each part should produce a verifiable intermediate result. + +<Context sentence: explain what this part accomplishes and why +it comes first.> + +. Action one. ++ +[source,bash] +---- +# example command +---- + +. Action two. ++ +[source,<language>] +---- +// example code +---- + +. Action three. + +=== Checkpoint + +// End each part with a checkpoint so the user can verify their +// work before continuing. A failed checkpoint at part 2 is much +// easier to recover from than discovering an error at part 5. + +Verify that <expected state>: + +[source,bash] +---- +# verification command +---- + +Expected output: + +---- +<expected output> +---- + +If you see <unexpected output>, see <<troubleshooting>> at the end +of this tutorial. + +== Part 2: <Phase title> + +<Context sentence.> + +. Action one. ++ +[source,<language>] +---- +// example code +---- + +. Action two. + +. Action three. ++ +[source,<language>] +---- +// example code +---- + +=== Checkpoint + +Verify that <expected state>: + +[source,bash] +---- +# verification command +---- + +// TODO: verify steps and expected output with engineering + +== Part 3: <Phase title> + +<Context sentence.> + +. Action one. +. Action two. +. Action three. + +=== Checkpoint + +Verify that <expected state>: + +[source,bash] +---- +# verification command +---- + +== Part 4: <Phase title> + +<Context sentence.> + +. Action one. +. Action two. +. Action three. + +=== Checkpoint + +Verify that <expected state>: + +[source,bash] +---- +# verification command +---- + +== Summary + +// Briefly recap what the user built and what they learned. +// Reinforce the learning objectives from the top of the page. + +In this tutorial, you: + +* <Past-tense summary of what was built or configured> +* <Past-tense summary of a key skill practiced> +* <Past-tense summary of a key concept applied> + +== Clean up + +// Optional but important for tutorials involving cloud resources, +// paid services, or system changes the user may want to reverse. + +To remove the resources created in this tutorial: + +. Step one. +. Step two. ++ +[source,bash] +---- +# cleanup command +---- + +== Next steps + +// Point the user toward the logical next tutorial, a deeper +// feature guide, or the full reference documentation. + +* xref:<component>:<module>/page.adoc[<Next tutorial in the series>] +* xref:<component>:<module>/page.adoc[<Deeper feature guide>] +* xref:<component>:<module>/page.adoc[<Related best practices>] + +[#troubleshooting] +== Troubleshooting + +// Cover issues specific to this tutorial — configuration mistakes, +// environment differences, and common errors at checkpoint steps. + +[cols="1,2", options="header"] +|=== +|Symptom |Solution + +|<Error message or unexpected behavior> +|<Cause and fix> + +|<Error message or unexpected behavior> +|<Cause and fix> + +|=== + +For general troubleshooting, see +xref:<component>:<module>/troubleshooting.adoc[Troubleshoot <Product>]. + +== Related information + +* xref:<component>:<module>/page.adoc[Link text] From 9891f6b2c1c68deb89450a8e79c00687e5dd383e Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Wed, 27 May 2026 00:25:20 +0530 Subject: [PATCH 33/61] templates --- modules/_templates/best-practices.adoc | 10 +- modules/_templates/concept.adoc | 47 ++--- modules/_templates/faqs.adoc | 29 ++- modules/_templates/procedure.adoc | 70 +++----- modules/_templates/quickstart.adoc | 51 +++--- modules/_templates/reference.adoc | 59 ++---- modules/_templates/release-notes.adoc | 22 +-- modules/_templates/troubleshooting.adoc | 9 +- modules/_templates/tutorial.adoc | 229 ------------------------ 9 files changed, 121 insertions(+), 405 deletions(-) delete mode 100644 modules/_templates/tutorial.adoc diff --git a/modules/_templates/best-practices.adoc b/modules/_templates/best-practices.adoc index ab2544792..7229db838 100644 --- a/modules/_templates/best-practices.adoc +++ b/modules/_templates/best-practices.adoc @@ -1,13 +1,15 @@ = <Title: "Best Practices for <noun phrase>"> :toc: true :toclevels: 1 +// Adjust toclevels if you have many sections, but 1-2 levels is usually sufficient for reference pages. -:page-pageid: +:page-title: <Title text for the page> +:page-pageid: <Required attribute for ThoughtSpot Embedded and developer documentation. The page ID must be unique. For example, "spotter-embed-best-practices"> :keywords: <comma-separated terms. For example, "configure auth", "SSO", "SAML"> :page-type: best-practices -:page-role: +:page-role: <Optional> :product-version: <version> -:jira-ref: <DOC-XXXX> +:jira-ref: <SCAL-XXXXXX> // last-reviewed: <Optional> // 1-2 sentences: what this page covers, who it is for, and what @@ -53,7 +55,7 @@ == What to avoid -// Optional but high value. Describe common mistakes or patterns. +// Optional but adds value. Describe common mistakes or patterns. // Use WARNING admonitions for practices that risk data loss or security issues. //WARNING: <Describe a practice that risks data loss, security exposure,or system instability. State the consequence clearly.> diff --git a/modules/_templates/concept.adoc b/modules/_templates/concept.adoc index 9b143ec75..6995cea60 100644 --- a/modules/_templates/concept.adoc +++ b/modules/_templates/concept.adoc @@ -1,20 +1,16 @@ = <Title: Noun phrase describing the concept> :toc: true :toclevels: 1 +// Adjust toclevels if you have many sections, but 1-2 levels is usually sufficient for reference pages. -:page-title: <Title — must match the = Title above> +:page-title: <Title text for the page> :page-description: <One sentence: what this page covers and why it matters to the reader.> -:page-pageid: <Add a unique ID for this page, for example, "embed-sdk-concepts". Required for developer documentation.> +:page-pageid: <Required attribute for ThoughtSpot Embedded and developer documentation. The page ID must be unique. For example, "spotter-embed-overview"> :keywords: <comma-separated terms for search indexing, for example, "authentication, SSO, SAML, login"> -:page-type: concept -:page-role: +:page-role: <Optional> :product-version: <version> -:jira-ref: <DOC-XXXX> - -// author: -// last-reviewed: - -// REQUIRED: 1-2 sentence lead — what this concept is and why it matters to developers or administrators. +:jira-ref: <SCAL-XXXXXX> +// last-reviewed: <Optional> //// TEMPLATE GUIDE @@ -42,21 +38,29 @@ Style elements you can use: Inline badge : [beta betaBackground]^Beta^ Version badge: [.version-badge.new]#New# [.version-badge.deprecated]#Deprecated# [.version-badge.breaking]#Breaking# [.version-badge.fixed]#Fixed# +============== //// + +// REQUIRED: a lead sentence for the article with 1-2 sentences. For example, explain what the feature is and why it matters to users. + +== Overview + +<Intro text> + == How <concept> works // REQUIRED. -// Explain the concept clearly. Avoid procedure steps — link to procedure pages instead. +// Explain the concept clearly. Avoid procedure steps. Link to procedure pages instead. // Use plain language; define acronyms on first use. // // Add a diagram or screenshot if spatial relationships or architecture matter: -// image::./images/<diagram-filename>.png[Alt text describing the diagram] -// -// Example: -// image::./images/embed-architecture.png[ThoughtSpot embedded architecture overview showing the SDK, REST API, and host application layers] +// Use the following format for images: +// image::./images/<diagram-filename>.png[Alt text describing the diagram] +// For example, image::./images/mcp-architecture.png[ThoughtSpot MCP Server architecture] // // Use admonitions to highlight key information: + // [NOTE] // ==== // Text for a general note or clarification. @@ -93,6 +97,8 @@ Description of what it does. // RECOMMENDED. // List known limitations, version-specific behavior, or edge cases the reader should know. +* <Known limitation or constraint.> + // Use admonitions for critical constraints: // // [IMPORTANT] @@ -110,12 +116,9 @@ Description of what it does. // Enabling this setting affects all users in the org. Confirm with your administrator before proceeding. // ==== -* <Known limitation or constraint.> - -== Related information +== Additional resources -// REQUIRED. -// Link to related concept, procedure, and reference pages. -// "Related information" is the standard heading — do not use "Additional resources" or "See also". +// REQUIRED. Include links to related concepts, procedures, and reference pages. -* xref:<module>/page.adoc[Link text] +//* xref:page.adoc[Link text]. +//* link:<URL>[Link text, window=_blank] diff --git a/modules/_templates/faqs.adoc b/modules/_templates/faqs.adoc index a22c03184..c5a1803f7 100644 --- a/modules/_templates/faqs.adoc +++ b/modules/_templates/faqs.adoc @@ -1,19 +1,23 @@ = <Title: Noun phrase, for example, "Frequently Asked Questions: Authentication"> :toc: true :toclevels: 1 -:page-pageid: + + +:page-title: <Title text for the page> +:page-description: <One sentence: what this page covers and why it matters to the reader.> +:page-pageid: <Required attribute for ThoughtSpot Embedded and developer documentation. The page ID must be unique. For example, "embed-faqs"> +:keywords: <comma-separated terms for search indexing, for example, "authentication, SSO, SAML, login"> :page-type: faq -:page-role: +:page-role: <Optional> :product-version: <version> -:jira-ref: <DOC-XXXX> -// author: -// last-reviewed: +:jira-ref: <SCAL-XXXXXX> +// last-reviewed: <Optional> // 1-2 sentences: what topic area these FAQs cover and who they are for. // Note: write each question as users would ask it — this improves // both findability and GEO citation rates. -== General +== <Information category. For example, Embed authentication> === <Question written as a user would ask it, for example, "What authentication methods are supported?"> @@ -21,10 +25,6 @@ // If the answer requires steps, use a numbered list. // If the answer links to a full page, link to it and summarize here. -// TODO: verify answer with engineering - ---- - === <Question> // Answer. @@ -35,8 +35,6 @@ // Answer. ---- - === <Question> // Answer. @@ -47,8 +45,6 @@ // Answer. ---- - === <Question> // Answer. @@ -61,4 +57,7 @@ == Related information -* xref:<component>:<module>/page.adoc[Link text] +// Optional. Include links to related concepts, procedures, and reference pages. + +//* xref:page.adoc[Link text]. +//* link:<URL>[Link text, window=_blank] diff --git a/modules/_templates/procedure.adoc b/modules/_templates/procedure.adoc index bdda044df..f75e0f255 100644 --- a/modules/_templates/procedure.adoc +++ b/modules/_templates/procedure.adoc @@ -1,16 +1,16 @@ = <Title: Verb + Object, for example, "Configure Single Sign-On"> :toc: true :toclevels: 1 +// Adjust toclevels if you have many sections, but 1-2 levels is usually sufficient for reference pages. -:page-title: <Title — must match the = Title above> +:page-title: <Title text for the page> :page-description: <One sentence: what this procedure does and who it is for.> -:page-pageid: <Add a unique ID for this page, for example, "embed-sdk-concepts". Required for developer documentation.> +:page-pageid: <Required attribute for ThoughtSpot Embedded and developer documentation. Add a unique ID for this page, for example, "embed-sdk-concepts".> :page-type: procedure :keywords: <comma-separated terms for search indexing, for example, "configure, SSO, SAML, setup"> :page-role: :product-version: <version> -:jira-ref: <DOC-XXXX> -// author: +:jira-ref: <SCAL-XXXXXX> // last-reviewed: //// @@ -44,28 +44,28 @@ Style elements you can use: Inline badge : [beta betaBackground]^Beta^ Version badge: [.version-badge.new]#New# [.version-badge.deprecated]#Deprecated# [.version-badge.breaking]#Breaking# + +============== //// == Overview // REQUIRED: 1-2 sentences — what this procedure accomplishes and who it is for. -// Mention the product area and the role of the reader (developer, administrator, etc.). -// TODO: verify scope with engineering -// -// OPTIONAL: Add a workflow diagram or screenshot of the starting UI state if it helps -// the reader orient themselves before starting: -// image::./images/<workflow-diagram>.png[Workflow overview diagram] +// Mention the product area and the intended audience (developer, administrator, etc.). + +// OPTIONAL: Add a workflow diagram or screenshot of the starting state if required. + == Before you begin // REQUIRED if there are prerequisites. Use "You must" or "You need" for each item. // Remove this section only if there are genuinely no prerequisites. -* You must have <role or permission, for example, "Developer or Administrator privilege">. +* You must have <role or group privilege> to <perform the intended action>. * You need access to <system or resource, for example, "a ThoughtSpot Cloud instance with the Embed feature enabled">. -* <Any additional prerequisite.> +* <Any additional prerequisite>. -== Procedure +== <Procedure. Use gerund or action verbs. For example, Configuring variables> // REQUIRED. Use numbered steps. Each step must describe exactly one action. // Include the exact command, UI label, menu path, or code for each step. @@ -75,33 +75,15 @@ Style elements you can use: + // OPTIONAL: Screenshot showing the UI state after this step: // image::./images/<step1-screenshot>.png[Description of what to see after step 1] +// For SDK procedures, a code sample is REQUIRED. Use the following format for code samples: -. Step two. For SDK procedures, provide a complete, runnable code sample — REQUIRED. -+ [source,JavaScript] ---- -import { LiveboardEmbed, AuthType, init } from '@thoughtspot/visual-embed-sdk'; - -init({ - thoughtSpotHost: 'https://<your-instance>.thoughtspot.cloud', - authType: AuthType.TrustedAuthToken, - username: '<username>', - getAuthToken: () => getTokenFromYourServer(), -}); - -const embed = new LiveboardEmbed('#embed-container', { - liveboardId: '<liveboard-GUID>', -}); -embed.render(); +<code sample> ---- -+ -[NOTE] -==== -Replace `<your-instance>` with your ThoughtSpot Cloud hostname and `<liveboard-GUID>` with the ID of the Liveboard you want to embed. -==== -. Step three. For REST API procedures, provide a cURL request — REQUIRED. -+ +// For REST API procedures, document the required parameters and provide request and response example. + [source,cURL] ---- curl -X POST \ @@ -112,7 +94,7 @@ curl -X POST \ "param": "value" }' ---- -+ + // OPTIONAL: Show the expected JSON response inline: // [source,JSON] // ---- @@ -130,22 +112,18 @@ curl -X POST \ == Result // REQUIRED. Describe what the user should see or be able to do after completing the procedure. -// Be specific — name the UI element, API response, or behavior that confirms success. -// +// Be specific. Specify the name the UI element, API response, or behavior that confirms success. // OPTIONAL: Screenshot of the expected result: -// image::./images/<result-screenshot>.png[Expected result after completing the procedure] == Next steps // OPTIONAL. Link to the next logical task or a related procedure. +// * xref:next-procedure.adoc[Next task name] -* xref:<module>/next-procedure.adoc[Next task name] -== Related information +== Additional resources -// REQUIRED. -// Link to related concept and reference pages. -// "Related information" is the standard heading — do not use "Additional resources" or "See also". +// REQUIRED. Include links to related concepts, procedures, and reference pages. -* xref:<module>/concept-page.adoc[Related concept] -* xref:<module>/reference-page.adoc[API reference] +//* xref:page.adoc[Link text]. +//* link:<URL>[Link text, window=_blank] diff --git a/modules/_templates/quickstart.adoc b/modules/_templates/quickstart.adoc index 44de8de34..a9cc206f9 100644 --- a/modules/_templates/quickstart.adoc +++ b/modules/_templates/quickstart.adoc @@ -1,34 +1,27 @@ = Get Started with <Product or Feature Name> :toc: true :toclevels: 1 -:page-pageid: +// Adjust toclevels if you have many sections, but 1-2 levels is usually sufficient for reference pages. + +:page-title: <Title text for the page> +:page-description: <One sentence: the purpose of quickstart guide does and who it is for.> +:page-pageid: <Required attribute for ThoughtSpot Embedded and developer documentation. Add a unique ID for this page. For example, "embedding-quickstart".> :page-type: quickstart :page-role: :product-version: <version> -:jira-ref: <DOC-XXXX> -// author: +:jira-ref: <SCAL-XXXXXX> // last-reviewed: -// 1-2 sentences: what the user will have running or achieved by the -// end of this page, and roughly how long it takes. -// Example: "This guide walks you through installing and configuring -// <Product> for the first time. Estimated time: 15 minutes." +// Intro text with 1-2 sentences: what the user will have running or achieved by the +// end of this page. +// Example: "This guide walks you through configuring MCP Server in a chatbot" == Before you begin // List everything the user must have in place before starting. -// Be specific — vague prerequisites are the most common cause of -// support requests on getting-started content. - -Ensure you have the following before proceeding: -* *Operating system*: <supported OS and minimum version> -* *<Dependency>*: version <X.X> or later. See xref:<component>:<module>/page.adoc[Install <Dependency>]. -* *Permissions*: <describe required access level or role> -* *Network access*: <describe any firewall, port, or connectivity requirements> -// TODO: verify prerequisites with engineering -== Step 1: <First milestone, for example, "Install <Product>"> +== Step 1: <First milestone, for example, "Add MCP Server"> // Keep each step focused on a single milestone the user can verify. // Use a numbered list for the actions within each step. @@ -66,7 +59,6 @@ Expected output: . Action two. -// TODO: verify configuration steps with engineering == Step 3: <Third milestone, for example, "Run your first <action>"> @@ -89,25 +81,24 @@ Expected output: // Tell the user what to do now that they have a working setup. // Link to tutorials, deeper configuration guides, or key concepts. -Now that you have <Product> running, you can: +Now that you have <feature> running, you can: -* xref:<component>:<module>/page.adoc[<Next logical task>] -* xref:<component>:<module>/page.adoc[<Explore a key feature>] -* xref:<component>:<module>/page.adoc[<Understand a core concept>] +* xref:page.adoc[<Next logical task>] +* xref:page1.adoc[<Explore a key feature>] +* xref:page2.adoc[<Understand a core concept>] == Troubleshooting // Optional. Cover the 2-3 most common issues users hit during setup. -// Link to the full troubleshooting page if one exists. -If you encounter issues during setup, see -xref:<component>:<module>/troubleshooting.adoc[Troubleshoot <Product> installation]. +* *<Issue*: <state the issue, cause, and fix/workaround>. +* *<Issue*: <state the issue, cause, and fix/workaround>. -Common issues: +// Link to the full troubleshooting page if one exists. -* *<Symptom>*: <one-line cause and fix>. -* *<Symptom>*: <one-line cause and fix>. +== Additional resources -== Related information +// REQUIRED. Include links to related concepts, procedures, and reference pages. -* xref:<component>:<module>/page.adoc[Link text] +//* xref:page.adoc[Link text]. +//* link:<URL>[Link text, window=_blank] diff --git a/modules/_templates/reference.adoc b/modules/_templates/reference.adoc index a1b1ab16c..0f6195c42 100644 --- a/modules/_templates/reference.adoc +++ b/modules/_templates/reference.adoc @@ -3,16 +3,15 @@ :toclevels: 1 // Adjust toclevels if you have many sections, but 1-2 levels is usually sufficient for reference pages. -:page-title: <Title — must match the = Title above> -:page-description: <One sentence: what this reference documents and who uses it.> -:keywords: <comma-separated terms for search indexing, for example, "REST API, parameters, endpoints, reference"> -:page-pageid: +:page-title: <Title text for the page> +:page-description: <State the purpose and brief summary of the contents of the reference document> +:keywords: <comma-separated terms for search indexing, for example, "REST API endpoint, parameters"> +:page-pageid: <Required attribute for ThoughtSpot Embedded and developer documentation. Add a unique ID for this page. For example, "Variable API reference".> :page-type: reference -:page-role: +:page-role: <Optional> :product-version: <version> -:jira-ref: <DOC-XXXX> -// author: -// last-updated: +:jira-ref: <SCAL-XXXXXX> +// last-reviewed: <Optional> //// TEMPLATE GUIDE @@ -160,45 +159,13 @@ curl -X POST \ } ---- -=== Response codes +=== API response Response codes -// REQUIRED for REST API reference. - -[cols="1,1,3", options="header"] -|=== -|Code |Status |Description - -|200 -|Success -|Request completed. Returns the response object described above. - -|400 -|Bad request -|Invalid parameters. Verify required fields and data types. - -|401 -|Unauthorized -|Authentication failed. Check your bearer token or API credentials. - -|403 -|Forbidden -|Insufficient permissions. Verify the user role required for this operation. - -|500 -|Internal server error -|Contact ThoughtSpot Support if the error persists. - -|=== - -// ───────────────────────────────────────────────────────────────────────────── -// END ENDPOINT / ATTRIBUTE BLOCK — copy the block above for additional endpoints -// ───────────────────────────────────────────────────────────────────────────── +// REQUIRED for REST API reference. Specify API response and include additional details as needed. -== Related information +== Additional resources -// REQUIRED. -// Link to related how-to and concept pages. -// "Related information" is the standard heading — do not use "Additional resources" or "See also". +// REQUIRED. Include links to related concepts, procedures, and reference pages. -* xref:<module>/procedure-page.adoc[How to <use this API>] -* xref:<module>/concept-page.adoc[Related concept] +//* xref:page.adoc[Link text]. +//* link:<URL>[Link text, window=_blank] \ No newline at end of file diff --git a/modules/_templates/release-notes.adoc b/modules/_templates/release-notes.adoc index 80a092a0d..12f494c90 100644 --- a/modules/_templates/release-notes.adoc +++ b/modules/_templates/release-notes.adoc @@ -1,13 +1,14 @@ = Release notes: <Product> <Version or Month Year> :toc: true :toclevels: 1 -:page-title: <Title — must match the = Title above> +:page-title: <Title text for the page> :page-description: <One sentence: summary of what is new or changed in this release.> :keywords: <comma-separated terms for search indexing, for example, "release notes, changelog, new features"> :page-type: release-note :page-role: :product-version: <version> -:jira-ref: <DOC-XXXX> +:jira-ref: <SCAL-XXXXXX> +// last-reviewed: <Optional> //// TEMPLATE GUIDE @@ -29,7 +30,7 @@ Section labels: Tags (column cell — use in the first column of the change table): [tag greenBackground]#NEW FEATURE# - [tag greenBackground]#IMPROVEMENT# + [tag greenBackground]#ENHANCEMENTT# [tag redBackground]#DEPRECATED# [tag redBackground]#BUG FIX# @@ -43,7 +44,7 @@ Inline badges (append after a feature name or inside a description): Format notes: - Use [discrete] before ==== headings inside table cells to suppress TOC entries. - Separate entries within the same cell with a horizontal rule: --- - - Each JIRA reference appears in parentheses at the end: (DOC-XXXX) + - Each JIRA reference appears in parentheses at the end: (SCAL-XXXXXX) - Use `*` bold for version labels and metadata lines inside cells. - Link to full documentation using xref once the target page is published. //// @@ -84,19 +85,19 @@ Description of the second new feature. // ── IMPROVEMENTS ────────────────────────────────────────────────────────────── |[tag greenBackground]#IMPROVEMENT# a| -* Brief description of the improvement. (DOC-XXXX) -* Brief description of another improvement. (DOC-XXXX) +* Brief description of the improvement. (SCAL-XXXXXX) +* Brief description of another improvement. (SCAL-XXXXXX) // ── DEPRECATIONS ────────────────────────────────────────────────────────────── |[tag redBackground]#DEPRECATED# a| -* `<deprecated_item>` — deprecated in this release. Use `<replacement>` instead. (DOC-XXXX) +* `<deprecated_item>` — deprecated in this release. Use `<replacement>` instead. (SCAL-XXXXXX) // ── BUG FIXES ───────────────────────────────────────────────────────────────── |[tag redBackground]#BUG FIX# a| -* Brief description of what was broken and what was fixed. (DOC-XXXX) -* Brief description of another bug fix. (DOC-XXXX) +* Brief description of what was broken and what was fixed. (SCAL-XXXXXX) +* Brief description of another bug fix. (SCAL-XXXXXX) |==== @@ -105,10 +106,9 @@ Description of the second new feature. // Document breaking changes, configuration updates, or migration steps required. // Reference specific API endpoints, SDK methods, or config keys by name. -// TODO: verify all migration steps with engineering before publishing. == Known issues // OPTIONAL but recommended. Describe open issues in this release and any workaround. -* Description of the known issue. Workaround: <steps or link>. (DOC-XXXX) +* Description of the known issue. Workaround: <steps or link>. (SCAL-XXXXXX) diff --git a/modules/_templates/troubleshooting.adoc b/modules/_templates/troubleshooting.adoc index 6ec2b685b..227b7ab84 100644 --- a/modules/_templates/troubleshooting.adoc +++ b/modules/_templates/troubleshooting.adoc @@ -1,6 +1,8 @@ = <Title: Noun phrase describing the problem area, for example, "Troubleshoot Authentication Errors"> :toc: true :toclevels: 1 + +<Title text for the page> :page-pageid: :page-type: troubleshooting :page-role: @@ -85,6 +87,9 @@ # Example command to collect diagnostic output ---- -== Related information +== Additional resources + +// REQUIRED. Include links to related concepts, procedures, and reference pages. -* xref:<component>:<module>/page.adoc[Link text] +//* xref:page.adoc[Link text]. +//* link:<URL>[Link text, window=_bl \ No newline at end of file diff --git a/modules/_templates/tutorial.adoc b/modules/_templates/tutorial.adoc deleted file mode 100644 index a1d011266..000000000 --- a/modules/_templates/tutorial.adoc +++ /dev/null @@ -1,229 +0,0 @@ -= <Title: Action-oriented phrase describing what the user builds, -for example, "Build a Real-Time Dashboard Using the <Product> API"> -:toc: true -:toclevels: 1 -:page-pageid: -:page-type: tutorial -:page-role: -:product-version: <version> -:jira-ref: <DOC-XXXX> -// author: -// last-reviewed: - -// 2-3 sentences covering: -// - What the user will build or accomplish -// - What they will learn along the way -// - Estimated time to complete -// Example: "In this tutorial, you build a <thing> using <Product>. -// You learn how to <skill 1>, <skill 2>, and <skill 3>. -// Estimated time: 30 minutes." - -== Learning objectives - -// List what the user will be able to do after completing this tutorial. -// Use "After completing this tutorial, you will be able to:" as the lead. -// Write each objective as a verb phrase. - -After completing this tutorial, you will be able to: - -* <Verb phrase, for example, "Configure a <Product> connection using OAuth 2.0"> -* <Verb phrase> -* <Verb phrase> - -== Before you begin - -// List prerequisites with enough specificity that the user can -// self-qualify before investing time in the tutorial. - -* *Experience level*: <for example, "Familiarity with REST APIs and JSON"> -* *<Tool or dependency>*: version <X.X> or later installed and configured. - See xref:<component>:<module>/page.adoc[Install <Tool>]. -* *<Account or access>*: <describe what is needed and how to obtain it> -* *Completed*: xref:<component>:<module>/quickstart.adoc[Get Started with <Product>] -// TODO: verify prerequisites with engineering - -== Overview - -// Optional but recommended for tutorials over 20 minutes. -// Briefly describe the architecture, workflow, or scenario the -// user is working through, so they understand the big picture -// before diving into steps. A diagram (image::) works well here. - -In this tutorial, you: - -. <High-level phase 1, for example, "Set up the project structure"> -. <High-level phase 2, for example, "Configure authentication"> -. <High-level phase 3, for example, "Implement the core logic"> -. <High-level phase 4, for example, "Test and verify the result"> - -== Part 1: <Phase title, for example, "Set up the project"> - -// Tutorials are longer than procedures. Use H2 parts to divide -// the work into phases the user can pause and resume between. -// Each part should produce a verifiable intermediate result. - -<Context sentence: explain what this part accomplishes and why -it comes first.> - -. Action one. -+ -[source,bash] ----- -# example command ----- - -. Action two. -+ -[source,<language>] ----- -// example code ----- - -. Action three. - -=== Checkpoint - -// End each part with a checkpoint so the user can verify their -// work before continuing. A failed checkpoint at part 2 is much -// easier to recover from than discovering an error at part 5. - -Verify that <expected state>: - -[source,bash] ----- -# verification command ----- - -Expected output: - ----- -<expected output> ----- - -If you see <unexpected output>, see <<troubleshooting>> at the end -of this tutorial. - -== Part 2: <Phase title> - -<Context sentence.> - -. Action one. -+ -[source,<language>] ----- -// example code ----- - -. Action two. - -. Action three. -+ -[source,<language>] ----- -// example code ----- - -=== Checkpoint - -Verify that <expected state>: - -[source,bash] ----- -# verification command ----- - -// TODO: verify steps and expected output with engineering - -== Part 3: <Phase title> - -<Context sentence.> - -. Action one. -. Action two. -. Action three. - -=== Checkpoint - -Verify that <expected state>: - -[source,bash] ----- -# verification command ----- - -== Part 4: <Phase title> - -<Context sentence.> - -. Action one. -. Action two. -. Action three. - -=== Checkpoint - -Verify that <expected state>: - -[source,bash] ----- -# verification command ----- - -== Summary - -// Briefly recap what the user built and what they learned. -// Reinforce the learning objectives from the top of the page. - -In this tutorial, you: - -* <Past-tense summary of what was built or configured> -* <Past-tense summary of a key skill practiced> -* <Past-tense summary of a key concept applied> - -== Clean up - -// Optional but important for tutorials involving cloud resources, -// paid services, or system changes the user may want to reverse. - -To remove the resources created in this tutorial: - -. Step one. -. Step two. -+ -[source,bash] ----- -# cleanup command ----- - -== Next steps - -// Point the user toward the logical next tutorial, a deeper -// feature guide, or the full reference documentation. - -* xref:<component>:<module>/page.adoc[<Next tutorial in the series>] -* xref:<component>:<module>/page.adoc[<Deeper feature guide>] -* xref:<component>:<module>/page.adoc[<Related best practices>] - -[#troubleshooting] -== Troubleshooting - -// Cover issues specific to this tutorial — configuration mistakes, -// environment differences, and common errors at checkpoint steps. - -[cols="1,2", options="header"] -|=== -|Symptom |Solution - -|<Error message or unexpected behavior> -|<Cause and fix> - -|<Error message or unexpected behavior> -|<Cause and fix> - -|=== - -For general troubleshooting, see -xref:<component>:<module>/troubleshooting.adoc[Troubleshoot <Product>]. - -== Related information - -* xref:<component>:<module>/page.adoc[Link text] From ea42735352704cc47e4908cfd8257d28338415ec Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Wed, 27 May 2026 16:13:22 +0530 Subject: [PATCH 34/61] whats new --- modules/ROOT/pages/whats-new.adoc | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 16b9eed09..4f19db00b 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -1,4 +1,4 @@ -= What’s new += What's new :toc: true :toclevels: 1 @@ -23,6 +23,25 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ +== June 2026 + +**Release version**: ThoughtSpot Cloud 26.6.0.cl + +*Upgrade notes*: + +*Recommended SDK versions*: Visual Embed SDK v1.49.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|===== +a| +[.cl-label] +*Version 26.6.0.cl* + +a| + +[discrete] +==== <feature title> + +|===== + == May 2026 @@ -39,6 +58,7 @@ a| a| + [discrete] ==== Liveboard downloads From e5a5bfeb0179813df6ccd437f9e396b9424f0606 Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Thu, 28 May 2026 09:22:02 +0530 Subject: [PATCH 35/61] added Collection share APIs --- modules/ROOT/pages/collections.adoc | 140 +++++++++++++++++++ modules/ROOT/pages/data-report-v2-api.adoc | 2 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 73 ++++++++-- 3 files changed, 205 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/collections.adoc b/modules/ROOT/pages/collections.adoc index d1638447d..a028490b6 100644 --- a/modules/ROOT/pages/collections.adoc +++ b/modules/ROOT/pages/collections.adoc @@ -235,6 +235,146 @@ curl -X POST \ If the API request is successful, the objects in the Collection are replaced with the objects in this API request. +== Share a Collection +[NOTE] +==== +Collections sharing via the security API is available from ThoughtSpot Cloud 26.6.0.cl. +==== + +To share a Collection with a user or group, send a `POST` request to the `POST /api/rest/2.0/security/metadata/share` endpoint with `metadata_type` set to `COLLECTION`. + +Collections support dual permissions that let you set independent access levels for the Collection and the objects within it. + +=== Permission fields + +[width="100%", cols="1,1,3"] +[options='header'] +|===== +|Field|Applies to|Description + +|`share_mode`|Collection |Controls access to the Collection itself — view, edit, or delete the Collection. +Accepted values: `READ_ONLY`, `MODIFY`, `NO_ACCESS`. + +|`content_share_mode`|Collection content|Controls access to the objects within the Collection — Liveboards, Answers, Models, and nested Collections. +Accepted values: `READ_ONLY`, `MODIFY`, `NO_ACCESS`. + +Only applicable when `metadata_type` is `COLLECTION`. If omitted, defaults to `READ_ONLY` (or `NO_ACCESS` when `share_mode` is `NO_ACCESS`). +|===== + +=== Permission scenarios + +[width="100%", cols="1,1,1,2"] +[options='header'] +|===== +|Role|`share_mode`|`content_share_mode`|What the principal can do + +|`MODIFY`|`MODIFY`|Full control — manage the Collection and edit its contents +|`MODIFY`|`READ_ONLY`|Manage the Collection structure but cannot edit objects within it +|`READ_ONLY`|`MODIFY`|Edit objects within the Collection but cannot change the Collection itself +|`READ_ONLY`|`READ_ONLY`|View the Collection and its contents only +|===== + +=== Share a Collection (read-only) + +To share a Collection with a user in read-only mode, send the following request: + +[source,CURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/security/metadata/share' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "metadata_type": "COLLECTION", + "metadata_identifiers": ["Sales reports"], + "permissions": [ + { + "principal": { + "type": "USER", + "identifier": "name@example.com" + }, + "share_mode": "READ_ONLY" + } + ], + "notification": { + "message": "I have shared the Sales reports collection with you.", + "notify_on_share": true + } +}' +---- + +If the request is successful, the API returns the HTTP `204 No Content` status code. + +=== Share a Collection with dual permissions + +To give a user different levels of access to the Collection and its contents, set both `share_mode` and `content_share_mode`. + +[source,CURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/security/metadata/share' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "metadata_type": "COLLECTION", + "metadata_identifiers": ["Marketing Analytics"], + "permissions": [ + { + "principal": { + "type": "USER", + "identifier": "name@example.com" + }, + "share_mode": "MODIFY", + "content_share_mode": "READ_ONLY" + }, + { + "principal": { + "type": "USER_GROUP", + "identifier": "Marketing Team" + }, + "share_mode": "READ_ONLY", + "content_share_mode": "READ_ONLY" + } + ], + "notification": { + "message": "Sharing the Marketing Analytics collection with your team.", + "notify_on_share": true + } +}' +---- + +If the request is successful, the API returns the HTTP `204 No Content` status code. + +=== Remove Collection access + +To remove a user's access to a Collection, set `share_mode` to `NO_ACCESS`: + +[source,CURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/security/metadata/share' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "metadata_type": "COLLECTION", + "metadata_identifiers": ["Confidential Reports"], + "permissions": [ + { + "principal": { + "type": "USER", + "identifier": "former-member@example.com" + }, + "share_mode": "NO_ACCESS" + } + ] +}' +---- + +If the request is successful, the API returns the HTTP `204 No Content` status code. + == Delete a Collection To remove an existing Collection, send a `POST` request to the `POST /api/rest/2.0/collections/delete` API endpoint. diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 359283c4a..e6db29204 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -482,7 +482,7 @@ curl -X POST \ ==== -Contact ThoughtSpot support to enable these additional settings for this API endpoint on your ThoughtSpot instance. +Contact ThoughtSpot support to enable these enhanced settings for this API endpoint on your ThoughtSpot instance: * `personalised_view_identifier` [beta betaBackground]^Beta^ + Optional parameter to specify the GUID of the personalised view of the Answer object that you want to download. diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 75a48e171..e47381ef4 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -20,23 +20,78 @@ Returns the authentication configuration for the specified auth type at cluster === Answer report API enhancements [beta betaBackground]^Beta^ -The `POST /api/rest/2.0/report/answer` endpoint includes the following new request parameters: +The `POST /api/rest/2.0/report/answer` API endpoint introduces the following enhancements: -* `personalised_view_identifier` + -Optional parameter to specify the GUID of the personalised view of the Answer object that you want to download. +Pinned Answer export:: +// SOURCE: SCAL-236681, SCAL-306548 +You can now export a pinned Answer directly from a Liveboard using the Answer report API. +To export a pinned Answer, specify the `viz_guid` parameter in your API request. +Exports from this endpoint inherently respect Liveboard-level filters, Runtime Filters, and JWT token context. ++ +To export a specific personalized view of a pinned Answer, include the `personalised_view_identifier` parameter. +// TODO: verify with engineering — confirm exact parameter name casing and accepted value type (GUID, name, or both) for `personalised_view_identifier` -* `type` + -Specifies the type of Answer to export. +Spotter Answer export:: +// SOURCE: SCAL-236681, SCAL-306548 +XLSX and PDF export formats are now supported for Spotter (conversational) Answers. -In addition to these parameters, you can also define the following properties for PNG downloads: +// TODO: verify with engineering — confirm if any limitations apply for chart-type Spotter Answers vs table-type Answers + +Custom PNG dimensions:: +// SOURCE: SCAL-236681, SCAL-306548 +PNG exports now support custom dimensions via the following new parameters: ++ +* `x_resolution` — Sets the export width in pixels. Valid range: 600–3840 px. +* `y_resolution` — Sets the export height in pixels. Valid range: 600–3840 px. ++ +// TODO: verify with engineering — confirm whether `x_resolution` and `y_resolution` are top-level request body parameters or nested inside a `png_options` object + +Display scaling:: +// SOURCE: SCAL-236681, SCAL-306548 +// TODO: verify with engineering — confirm the exact parameter name for the scaling percentage (for example, `scaling`, `scale_factor`, or `scaling_percent`) +A new scaling parameter allows you to adjust the relative size of visual elements in PNG exports without cropping. +Valid range: 80–400%. -* `x_resolution` -* `y_resolution` -* `scaling` +Automatic file naming:: +// SOURCE: SCAL-236681, SCAL-306548 +The API now automatically names exported files based on the Answer title and appends the correct file extension (`.png`, `.pdf`, `.csv`, or `.xlsx`). +// TODO: verify with engineering — confirm whether a caller-supplied filename overrides the automatic name Contact ThoughtSpot support to enable these settings for PNG downloads on your ThoughtSpot instance. For more information, see xref:data-report-v2-api.adoc#_answer_report_api[Answer report API documentation]. +=== Connection deactivate and activate API [beta betaBackground]^Beta^ + +// SOURCE: SCAL-294844, SCAL-294845, SCAL-278132 +// TODO: verify with engineering — confirm the exact endpoint paths for deactivate and activate operations +ThoughtSpot introduces REST API v2.0 endpoints to programmatically deactivate and activate data connections: + +// TODO: verify with engineering — confirm endpoint paths, for example: +// `POST /api/rest/2.0/connections/{connection_identifier}/deactivate` +// `POST /api/rest/2.0/connections/{connection_identifier}/activate` +* `POST /api/rest/2.0/connections/{connection_identifier}/deactivate` + +Deactivates the specified connection. +* `POST /api/rest/2.0/connections/{connection_identifier}/activate` + +Activates a previously deactivated connection. + + +//// +Deactivating a connection prevents all user-initiated queries and skips scheduled background jobs such as Sage indexing and row count statistics. +Activating a connection immediately restores query access and resumes scheduled jobs on their defined schedules. + +Required access: Administrator or Connection Owner. +//// + +For more information, see xref:connections-deactivate.adoc[Deactivate and activate connections]. +// TODO: verify with engineering — confirm target doc page xref name once page is created + +=== Share metadata API: Collections support [beta betaBackground]^Beta^ + +The `POST /api/rest/2.0/security/metadata/share` endpoint now supports sharing Collections. + +To share a Collection, set `metadata_type` to `COLLECTION` in the request body. +For more information, see xref:collections.adoc#share-collection[Share a Collection]. + == Version 26.5.0.cl, May 2026 === Sync connection metadata attributes From 54d656fdab768babf761b3f69b01d59312e9b86b Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Thu, 28 May 2026 13:51:43 +0530 Subject: [PATCH 36/61] 26.6.0.cl edits --- modules/ROOT/pages/api-changelog.adoc | 68 +- modules/ROOT/pages/charting-skills-embed.adoc | 614 ++++++++++++++++++ modules/ROOT/pages/rest-api-v2-reference.adoc | 24 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 23 + modules/ROOT/pages/spotter-agent-apis.adoc | 56 ++ .../pages/spotter-agent-instructions.adoc | 139 ++++ modules/ROOT/pages/spotter-apis.adoc | 3 +- 7 files changed, 920 insertions(+), 7 deletions(-) create mode 100644 modules/ROOT/pages/charting-skills-embed.adoc create mode 100644 modules/ROOT/pages/spotter-agent-instructions.adoc diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 1a1338efd..6676e24b8 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -8,18 +8,82 @@ This changelog lists only the changes introduced in the Visual Embed SDK. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. +== Version 1.49.x, June 2026 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== Visual overrides for charts and tables +The SDK introduces the `visualOverrides` parameter to allow host applications to customize chart and table visualization properties at embed time. + +* *Parameter*: `visualOverrides` + +* *Type*: `VisualizationOverrides` + +* *Supported embeds*: `AppEmbed`, `SearchEmbed` + +The `VisualizationOverrides` type accepts two optional sub-objects: + +`chart`:: +A `ChartOverrides` object to customize chart properties such as legend visibility, position, and column colors. + +`table`:: +A `TableOverrides` object to customize table display properties. + +|[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== New charts library + +The SDK introduces the `newChartsLibrary` parameter to enable the new Muze charting library for embedded Liveboards and full application embedding. + +* *Parameter*: `newChartsLibrary` + +* *Type*: `boolean` + +* *Default*: `false` + +* *Supported embeds*: `AppEmbed`, `LiveboardEmbed` + +|[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== Liveboard browser cache refresh + +The SDK introduces the following event IDs and action ID to support programmatic and user-triggered browser cache refresh for the Liveboard ChartViz containers. These APIs require `enableLiveboardDataCache` to be enabled in your embed configuration. + +Events:: + +* `EmbedEvent.RefreshLiveboardBrowserCache` + +Emitted when a user clicks the *Refresh* button in the Liveboard header to clear the browser cache. The event payload includes `{ liveboardId: string }`. + +* `HostEvent.RefreshLiveboardBrowserCache` + +Allows the host app to programmatically trigger a browser cache refresh for all ChartViz containers on the embedded Liveboard. + +New action ID:: + +* `Action.RefreshLiveboardBrowserCache` + +Action ID to control the visibility of the *Refresh* button that clears the browser cache and fetches new data for Liveboard ChartViz containers. + +|[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== Spotter file upload +The SDK introduces configuration parameters in `SpotterChatViewConfig` to enable and control file uploads in the embedded Spotter chat interface. + +New parameters in `SpotterChatViewConfig`:: + +* `spotterFileUploadEnabled` + +When set to `true`, enables the file upload feature in the Spotter chat panel. + +* `spotterFileUploadFileTypes` + +Restricts the file types allowed for upload in the Spotter chat panel. Accepts a `SpotterFileUploadFileTypes` object. +|==== + + == Version 1.48.x, May 2026 [width="100%" cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| [discrete] ===== Liveboard embedding - The SDK includes the following new features and enhancements in Liveboard embedding. Continuous Liveboard layout in PDF downloads [beta betaBackground]^Beta^:: - When set to `true`, the `isContinuousLiveboardPDFEnabled` enables the Liveboard tab to render on a single page that matches the exact UI layout you see in ThoughtSpot. This update addresses the issue where visualizations for PDF downloads were split across multiple A4 pages regardless of how they appear on screen. This feature is in beta and can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true`. New events and action IDs;; diff --git a/modules/ROOT/pages/charting-skills-embed.adoc b/modules/ROOT/pages/charting-skills-embed.adoc new file mode 100644 index 000000000..93660e005 --- /dev/null +++ b/modules/ROOT/pages/charting-skills-embed.adoc @@ -0,0 +1,614 @@ +// SOURCE: SCAL-306327, SCAL-311138, SCAL-252716 +// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit + + += Chart configuration overrides in embedded deployments +:toc: left +:toclevels: 3 +:sectnums: +:description: Learn how to use chart configuration overrides to control the initial visual state of charts, tables, and KPI visualizations in ThoughtSpot Embedded deployments. + +ThoughtSpot Embedded lets you control the initial visual state of charts, tables, and KPI visualizations programmatically, without requiring your end users to manually configure them. +Using the `visualOverrides` object, embed developers can specify default chart settings, such as colors, data labels, number formatting, legend behavior, axis properties, table themes, and more, when a visualization loads. + +[NOTE] +==== +Chart configuration overrides are available in ThoughtSpot release 26.7.0.cl and later. + +Supported visualization libraries in Phase 1: Highcharts (charts), AG Grid (tables), and DevXtreme (pivot tables). + +Muze native chart support is planned for a future release. +==== + +// TODO: verify with engineering — confirm exact Visual Embed SDK method/property name used to pass +// `visualOverrides` for SearchEmbed or SageEmbed in the TSE integration flow. + +== Overview + +// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit +// SOURCE: SCAL-299430 + +Previously, embed customers had no way to specify chart type or initial chart settings when +pre-seeding a search-data or Sage embed. End users were required to enter edit mode and manually +adjust charts after an answer was generated. This was a significant barrier for use cases such as: + +* Enabling column summaries by default in every rendered table +* Applying a brand color palette to all charts +* Showing data labels on all new answers +* Setting a default table theme (zebra-striped, outlined, or row-based) + +Chart configuration overrides solve this by exposing a `visualOverrides` object that you pass at +load time. The overrides are applied with the highest priority—they take precedence over any +previously saved chart state. If a user manually changes a setting, the override for that property +is cleared, ensuring user intent is always respected. + +=== How overrides work + +// SOURCE: Design Doc https://docs.google.com/document/d/1-L4cQiAtH0TGXUUP_3g68GeMKf_uWMn11PTXfNOVFs0/edit +// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit + +Overrides fall into two categories: + +Visualization-level overrides:: Applied via the `visualOverrides` object on the front end. +Affects settings like legend visibility, data labels, axis ranges, colors, gridlines, and +conditional formatting. + +Column-level overrides:: Applied on the backend at answer-generation time. Affects number +formatting, headline visibility, and sort order. These are resolved server-side when Spotter or +the embed session calls the `UpdateVisualOverrides` API. + +[IMPORTANT] +==== +`visualOverrides` always takes precedence over any saved `vizProp` state: + +`visualOverrides` > `vizProp` (stored chart state) + +Once a user manually changes a setting that was originally set by an override, the override for +that specific property is cleared and the user's choice is preserved. All other overrides remain +active. +==== + +== Supported settings + +// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit +// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit + +The following 16 settings are available in Phase 1 for all supported chart libraries: + +[cols="1,2,3",options="header"] +|=== +|Setting |Scope |Notes + +|Colors +|Per-column color and legend series colors +|Applies to Highcharts and BYOC charts. Pass hex codes per `columnId`. + +|Number formatting +|Type, decimals, units, currency +|Applied on the backend. Column-level formatting; axis formatting is handled automatically. + +|Show or hide axis +|Axis name and axis labels (boolean per axis) +|Visualization-level override. + +|Axis scales and domains +|Min and max values per axis +|Visualization-level override. + +|Regression lines +|Boolean (enabled or disabled) +|Visualization-level override. + +|Show or hide data labels +|All labels or per-column +|To show all labels, set `allLabels: true`. + +|Filter data labels +|Column-level, with operator and value +|Supported operators: `Greater than`, `Less than`, `Equal to`, `Greater than or equal to`, +`Less than or equal to`. + +|Show or hide legend +|Boolean +|Visualization-level override. + +|Legend position +|`BOTTOM_LEGEND`, `LEFT_LEGEND`, `RIGHT_LEGEND`, `TOP_LEGEND` +|Visualization-level override. + +|Display summary (column summaries) +|Per-column or all columns +|Table-specific. Applied on the backend. + +|Table theme and content density +|Theme: `OUTLINE`, `ROW`, `ZEBRA`; Density: `COMPACT`, `REGULAR` +|Table-specific. Visualization-level override. + +|KPI comparison period +|Enum: comparison period type +|KPI chart-specific. Visualization-level override. + +|Sort type +|`Alphanumeric` or `Custom` +|Applied on the backend. + +|Show or hide gridlines +|Per axis (boolean) +|Visualization-level override. + +|Conditional formatting +|Column-level, gradient colors, operator and value +|Visualization-level override. + +|Pivot table totals and subtotals +|Row totals, column totals, row subtotals, column subtotals +|Pivot-specific. Visualization-level override. +|=== + +[NOTE] +==== +Axis configuration overrides—controlling field placement (x-axis, y-axis, slice-by-color) and +axis type (shared, dual, combined)—are planned for a future phase and are not available in +Phase 1. +==== + +== visualOverrides schema reference + +// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit + +The `visualOverrides` object is included in the visualization object returned by the ThoughtSpot +API. The schema differs by visualization type. Use the `__typename` discriminator to identify +which schema applies. + +// TODO: verify with engineering — confirm whether `visualOverrides` is passed directly via the +// Visual Embed SDK configuration object (for example, as a SearchEmbed option), or whether it +// must be applied via a separate REST API or GraphQL call post-session-creation. + +=== Chart visualization (ChartVisualOverrides) + +[source,typescript] +---- +visualOverrides: { + __typename: "ChartVisualOverrides", + + // Default color palette applied across the chart + defaults: { + colorPalette: { + colors: string[]; // Array of hex color codes, e.g. ["#FF0000", "#00FF00"] + }, + }, + + overrides: { + + // Legend configuration + legendProperties: { + showLegend: boolean, + position: LegendPositionOptions, // "BOTTOM_LEGEND" | "LEFT_LEGEND" | + // "RIGHT_LEGEND" | "TOP_LEGEND" + legendDataColors: SeriesColor[], // Per-attribute-value legend colors + }, + + // Data label configuration + dataLabelProperties: { + allLabels: boolean, // Show labels for all columns + stackLabelsProperties: { + isVisible: boolean, + }, + columnDataLabelProperties: [ + { + columnId: string, // GUID of the column + properties: { + isVisible: boolean, + filter: { + value: number, + operator: FilterOperator, // See FilterOperator enum + } | null, + }, + }, + ], + }, + + // Display-level properties + displayProperties: { + kpiDisplayProperties: { + customCompare: TupleType, // KPI comparison period enum value + }, + summariesState: { + showRowTotals: boolean, + showColumnTotals: boolean, + showRowGrandTotals: boolean, + showColumnGrandTotals: boolean, + }, + regressionLineProperties: { + enabled: boolean, + }, + gridLineProperties: { + xGridlineEnabled: boolean, + yGridlineEnabled: boolean, + }, + }, + + // Per-axis configuration + axisProperties: [ + { + columnId: string, // Column GUID identifying this axis + linkedColumns: string[], // Column GUIDs sharing this axis + properties: { + isNameVisible: boolean, + isLabelVisible: boolean, + yAxisRange: { + min: number | null, + max: number | null, + }, + isGridLineEnabled: boolean | null, + }, + }, + ], + + // Per-column visual configuration + columnProperties: [ + { + columnId: string, + properties: { + color: string, // Hex code, e.g. "#ababab" + conditionalFormatting: { + rows: ConditionalMetric[], + // TODO: verify with engineering — full ConditionalMetric schema + }, + }, + }, + ], + }, +} +---- + +=== Table visualization (TableVisualOverrides) + +[source,typescript] +---- +visualOverrides: { + __typename: "TableVisualOverrides", + + overrides: { + + // Per-column table settings + columnProperties: [ + { + columnId: string, + columnProperty: { + wrapColumnText: boolean, + isHidden: boolean, + conditionalFormatting: { + rows: ConditionalMetric[], + // TODO: verify with engineering — full ConditionalMetric schema + }, + }, + }, + ], + + // Table display settings + displayProperties: { + tableTheme: TableTheme, // "OUTLINE" | "ROW" | "ZEBRA" + tableContentDensity: TableContentDensity,// "COMPACT" | "REGULAR" + }, + }, +} +---- + +=== KPI visualization (HeadlineVisualOverrides) + +[source,typescript] +---- +visualOverrides: { + __typename: "HeadlineVisualOverrides", + + overrides: { + columnProperty: { + conditionalFormatting: { + rows: ConditionalMetric[], + // TODO: verify with engineering — full ConditionalMetric schema + }, + summariesNumberFormatConfig: FormatConfig, + // TODO: verify with engineering — full FormatConfig schema + }, + }, +} +---- + +=== Enum reference + +// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit + +[source,typescript] +---- +enum LegendPositionOptions { + BottomLegend = 'BOTTOM_LEGEND', + LeftLegend = 'LEFT_LEGEND', + RightLegend = 'RIGHT_LEGEND', + TopLegend = 'TOP_LEGEND', +} + +enum TableTheme { + Outline = 'OUTLINE', + Row = 'ROW', + Zebra = 'ZEBRA', +} + +enum TableContentDensity { + Compact = 'COMPACT', + Regular = 'REGULAR', +} + +enum FilterOperator { + LessThan = 'Less than', + GreaterThan = 'Greater than', + LessThanOrEqualTo = 'Less than or equal to', + GreaterThanOrEqualTo = 'Greater than or equal to', + EqualTo = 'Equal to', +} + +enum TupleType { + Current = 'CURRENT', + PrevDay = 'PREV_DAY', + PrevHour = 'PREV_HOUR', + PrevWeek = 'PREV_WEEK', + PrevMonth = 'PREV_MONTH', + PrevQuarter = 'PREV_QUARTER', + PrevYear = 'PREV_YEAR', + PrevAvailable = 'PREV_AVAILABLE', + LastAvailable = 'LAST_AVAILABLE', + Custom = 'CUSTOM', + ChartAggregatedVal = 'CHART_AGGREGATED_VAL', + PreviousChartAggregatedVal = 'PREVIOUS_CHART_AGGREGATED_VAL', + SinglePointKpiCurrent = 'SINGLE_POINT_KPI_CURRENT', + SinglePointKpiPrevious = 'SINGLE_POINT_KPI_PREVIOUS', +} +---- + +== Usage examples + +// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit +// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit + +The following examples show representative `visualOverrides` configurations for common embed +use cases. + +// TODO: verify with engineering — replace the placeholder comments below with the confirmed +// Visual Embed SDK API for setting visualOverrides on SearchEmbed or SageEmbed (for example, +// as a top-level init parameter, embed option, or separate method call). + +=== Apply a brand color palette to all charts + +Use the `defaults.colorPalette` property to apply a fixed color sequence to all measures in the +chart. Colors are applied in order. + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: { + colorPalette: { + colors: ["#1A73E8", "#E84235", "#FBBC04", "#34A853"], + }, + }, + overrides: {}, +}; + +// TODO: verify with engineering — confirm SDK usage pattern +// Pass visualOverrides via the Visual Embed SDK configuration +---- + +=== Enable data labels on all columns by default + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: {}, + overrides: { + dataLabelProperties: { + allLabels: true, + }, + }, +}; +---- + +=== Show only data labels above a threshold value + +Show data labels only where revenue exceeds $1,000,000. Provide the `columnId` of the measure +column. + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: {}, + overrides: { + dataLabelProperties: { + allLabels: false, + columnDataLabelProperties: [ + { + columnId: "<revenue-column-guid>", + properties: { + isVisible: true, + filter: { + value: 1000000, + operator: "Greater than", + }, + }, + }, + ], + }, + }, +}; +---- + +=== Set legend position and assign per-series colors + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: {}, + overrides: { + legendProperties: { + showLegend: true, + position: "RIGHT_LEGEND", + legendDataColors: [ + { dataValue: "North", color: "#1A73E8" }, + { dataValue: "South", color: "#E84235" }, + { dataValue: "East", color: "#FBBC04" }, + { dataValue: "West", color: "#34A853" }, + ], + }, + }, +}; +---- + +=== Enable a regression line + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: {}, + overrides: { + displayProperties: { + regressionLineProperties: { + enabled: true, + }, + }, + }, +}; +---- + +=== Set axis range (min and max) + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: {}, + overrides: { + axisProperties: [ + { + columnId: "<revenue-column-guid>", + linkedColumns: ["<revenue-column-guid>"], + properties: { + isNameVisible: true, + isLabelVisible: true, + yAxisRange: { + min: 0, + max: 5000000, + }, + isGridLineEnabled: true, + }, + }, + ], + }, +}; +---- + +=== Set table theme and content density + +[source,typescript] +---- +const visualOverrides = { + __typename: "TableVisualOverrides", + overrides: { + displayProperties: { + tableTheme: "ZEBRA", + tableContentDensity: "COMPACT", + }, + }, +}; +---- + +=== Enable pivot table totals and subtotals + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: {}, + overrides: { + displayProperties: { + summariesState: { + showRowTotals: true, + showColumnTotals: true, + showRowGrandTotals: true, + showColumnGrandTotals: false, + }, + }, + }, +}; +---- + +=== Set KPI comparison period + +[source,typescript] +---- +const visualOverrides = { + __typename: "ChartVisualOverrides", + defaults: {}, + overrides: { + displayProperties: { + kpiDisplayProperties: { + customCompare: "PREV_MONTH", + }, + }, + }, +}; +---- + +== Override precedence and user behavior + +// SOURCE: Design Doc https://docs.google.com/document/d/1-L4cQiAtH0TGXUUP_3g68GeMKf_uWMn11PTXfNOVFs0/edit +// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit + +Understanding how `visualOverrides` interact with saved chart state and user actions is important +for building predictable embedded experiences. + +[cols="1,2",options="header"] +|=== +|Scenario |Behavior + +|Override set, no saved chart state +|The override value is applied. The chart renders with the override settings. + +|Override set, saved chart state exists +|The override always wins. `visualOverrides` takes precedence over any value in `vizProp`. + +|User changes a setting that was overridden +|The override for that specific property is cleared. The user's manually applied value is +respected. Other overrides remain active. + +|Follow-up query in Spotter (context retained) +|Overrides are re-sent in the follow-up if the overridden property is not yet in `vizProp`, +or if an existing `vizProp` value needs to be overridden. + +|Visualization is persisted (saved to Liveboard) +|The override is resolved into `vizProp` and persisted. On reload, the chart renders from +`vizProp`, not from `visualOverrides`. +|=== + +== Limitations + +// SOURCE: SCAL-299430 +// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit + +* *Muze and BYOC charts:* Native override support for Muze charts is not available in Phase 1. +Color overrides route through `updateCustomVisualProps` for BYOC charts. +* *Axis configuration overrides:* Field placement controls (x-axis, y-axis, slice-by-color, +shared axis, dual axis) are not available in Phase 1. They are planned for a future release. +* *Excel export:* When a Liveboard is exported as XLSX and some visualizations have not been +rendered (lazy-loaded), overrides are applied at export time in the Excel exporter for +conditional formatting and other applicable properties. +* *Text formatting:* Axis label, data-label, and tooltip text formatting are deferred from +Phase 1 due to cross-library inconsistencies. + +== Related resources + +* xref:embed-search.adoc[Embed ThoughtSpot search] +// TODO: verify with engineering — add correct xref to Spotter embed page once confirmed +* xref:visual-embed-sdk.adoc[Visual Embed SDK reference] +* xref:chart-types.adoc[Supported chart types] +* link:https://developers.thoughtspot.com/[ThoughtSpot Developer Portal] diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index 00170609a..b05d178a9 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -31,10 +31,10 @@ Creates a conversation session with ThoughtSpot Spotter |ThoughtSpot Cloud: __10.4.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fcreate-conversation" id="preview-in-playground" >Try it out</a>+++ -//a|`POST /api/rest/2.0/ai/data-source-suggestions` + -//Gets data source recommendations for a given query. -//|ThoughtSpot Cloud: __10.15.0.cl or later__ + -//|+++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fget-data-source-suggestions" id="preview-in-playground" >Try it out</a>+++ +a|`POST /api/rest/2.0/ai/data-source-suggestions` + +Gets data source recommendations for a given query. +|ThoughtSpot Cloud: __26.2.0.cl or later__ + +|+++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fget-data-source-suggestions" id="preview-in-playground" >Try it out</a>+++ a|`POST /api/rest/2.0/ai/relevant-questions/` + Breaks down a user submitted query into relevant questions @@ -61,6 +61,22 @@ Allows sending a query to an ongoing conversation session with Spotter agent and |ThoughtSpot Cloud: __10.15.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fsend-agent-message" id="preview-in-playground" >Try it out</a>+++ +a|`PUT /api/rest/2.0/ai/agent/instructions/set` + +Sets custom instructions for the Spotter agent. +|ThoughtSpot Cloud: __26.6.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fset-agent-instructions" id="preview-in-playground" >Try it out</a>+++ + +a|`GET /api/rest/2.0/ai/agent/instructions/get` + +Retrieves the custom instructions currently configured for the Spotter agent. +|ThoughtSpot Cloud: __26.6.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fget-agent-instructions" id="preview-in-playground" >Try it out</a>+++ + +a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + +Stops an in-progress Spotter agent response for a given conversation session. +|ThoughtSpot Cloud: __26.6.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fstop-agent-response" id="preview-in-playground" >Try it out</a>+++ + + a|`POST /api/rest/2.0/ai/instructions/set` + Sets NL instructions on a data model. |ThoughtSpot Cloud: __10.15.0.cl or later__ + diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 720af01df..99954a5e8 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,6 +8,29 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. +== Version 26.6.0.cl, June 2026 + +// TODO: verify with engineering — confirm calendar month for 26.6.0.cl release + +=== Spotter agent instructions APIs + +The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. + +* `PUT /api/rest/2.0/ai/agent/instructions/set` + +Sets behavioral instructions for the Spotter agent. Use this endpoint to define persistent guidance that Spotter applies when responding to queries in a conversation session. + +* `GET /api/rest/2.0/ai/agent/instructions/get` + +Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. + +For more information, see xref:spotter-agent-instructions.adoc[Spotter agent instructions APIs]. + +=== Stop in-progress agent response + +* `POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + +Stops a Spotter agent response that is currently in progress for a given conversation session. + +For more information, see xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[Stop an in-progress agent response]. + == Version 26.5.0.cl, May 2026 === Sync connection metadata attributes diff --git a/modules/ROOT/pages/spotter-agent-apis.adoc b/modules/ROOT/pages/spotter-agent-apis.adoc index 3eb4a5680..99360adad 100644 --- a/modules/ROOT/pages/spotter-agent-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-apis.adoc @@ -49,6 +49,10 @@ a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/send/strea xref:spotter-agent-apis.adoc#_send_a_query_to_agent_and_get_streaming_responses[Sends one or more natural language messages] to an existing Spotter agent conversation and returns the response as a real-time Server-Sent Events (SSE) stream. __Replaces /api/rest/2.0/ai/agent/{conversation_identifier}/converse__. +a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` [.version-badge.new]#New# + +xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[Stops an in-progress Spotter agent response] for a given conversation session. The conversation session remains active after the response stops. + +__Available on ThoughtSpot Cloud instances from 26.6.0.cl onwards.__ + a| `POST /api/rest/2.0/ai/data-source-suggestions` [beta betaBackground]^Beta^ + xref:spotter-agent-apis.adoc#_get_data_source_suggestions[Returns a list of relevant data sources], such as Models, based on a query and thus helping users and agents choose the most appropriate data source for analytics. + __Available on ThoughtSpot Cloud instances from 10.15.0.cl onwards__. @@ -1034,6 +1038,58 @@ data: { } ---- +[#_stop_an_in_progress_agent_response] +== Stop an in-progress agent response + +The `/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` API endpoint stops a Spotter agent response that is currently in progress for a given conversation session. + +Use this endpoint when you want to cancel a long-running Spotter response before it completes. +The conversation session remains active after you stop a response, so you can send a new query to the same session immediately. + +// TODO: verify with engineering — confirm whether stopping a streaming response emits a final SSE event (for example, agent-interrupt) or closes the stream silently + +=== Request parameters + +[width="100%", cols="2,2,4"] +[options='header'] +|===== +|Parameter|Type| Description +|`conversation_identifier`|Path parameter|__String__. Required. The identifier of the active conversation session. Use the value returned by the xref:spotter-agent-apis.adoc#_create_a_conversation_session_with_spotter_agent[create conversation] API endpoint. +|===== + +This endpoint does not require a request body. + +=== Example request + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' +---- + +=== Example response + +If the API request is successful, ThoughtSpot stops the in-progress response and returns an HTTP `200` status. + +// TODO: verify with engineering — confirm exact success response body +[source,JSON] +---- +{} +---- + +If the conversation session is not found or has expired, the API returns an error: + +[source,JSON] +---- +{ + "error_code": "CONVERSATION_NOT_FOUND", + "message": "The specified conversation session does not exist or has expired." +} +---- + [#process_results] == Process results generated from a conversation session To export or download the Answer data generated by the Spotter APIs, use the xref:data-report-v2-api.adoc#exportSpotterData[Answer report] API. diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc new file mode 100644 index 000000000..4e045de21 --- /dev/null +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -0,0 +1,139 @@ += Spotter agent instructions APIs +:toc: true +:toclevels: 2 + +:page-title: Spotter agent instructions APIs +:page-pageid: spotter-agent-instructions +:page-description: Use the Spotter agent instructions APIs to set and retrieve persistent behavioral guidance for the Spotter agent in a conversation session. + +// SOURCE: spotter-apis.adoc — privilege pattern +Administrators and developers can configure persistent behavioral instructions for the Spotter agent using the agent instructions APIs. These instructions guide how Spotter responds within a conversation context. For example, to focus on specific business domains, enforce response formats, or apply analytical constraints. + +Unlike xref:spotter-nl-instructions.adoc[NL coaching instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. + +[NOTE] +==== +// TODO: verify with engineering — confirm the exact privilege required: CAN_USE_SPOTTER, administrator, or a dedicated agent-instructions privilege +To use the agent instructions APIs, you need `CAN_USE_SPOTTER` privilege and valid authentication. +==== + +== Supported API endpoints + +[width="100%", cols="1"] +|===== +a|`PUT /api/rest/2.0/ai/agent/instructions/set` [.version-badge.new]#New# + +xref:spotter-agent-instructions.adoc#_set_agent_instructions[Sets behavioral instructions] for the Spotter agent. + +__Available on ThoughtSpot Cloud instances from 26.6.0.cl onwards.__ + +a|`GET /api/rest/2.0/ai/agent/instructions/get` [.version-badge.new]#New# + +xref:spotter-agent-instructions.adoc#_get_agent_instructions[Retrieves the behavioral instructions] currently configured for the Spotter agent. + +__Available on ThoughtSpot Cloud instances from 26.6.0.cl onwards.__ +|===== + +== Set agent instructions + +The `PUT /api/rest/2.0/ai/agent/instructions/set` API endpoint sets behavioral instructions for the Spotter agent. +Use this endpoint to define persistent guidance that Spotter applies when responding to queries. +Instructions persist until you overwrite or remove them by sending a new `PUT` request. + +// TODO: verify with engineering — confirm the scope of instructions: global, per-user, or per-conversation +// TODO: verify with engineering — confirm maximum character length for the `instructions` field + +=== Request parameters + +[width="100%", cols="2,4"] +[options='header'] +|===== +|Parameter| Description +|`instructions` a|__String__. Required. +The behavioral instruction text to apply to the Spotter agent. +Use natural language to define how Spotter should respond. For example: + +* `"Always respond in English."` +* `"Focus on revenue and margin metrics. Avoid referencing raw row counts unless the user asks."` +* `"When a time period is not specified, default to the current fiscal quarter."` + +// TODO: verify with engineering — confirm whether any additional request body parameters are accepted (for example, a scope or context identifier) +|===== + +=== Example request + +[source,cURL] +---- +curl -X PUT \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/instructions/set' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "instructions": "Always respond in English. Focus on revenue and margin metrics. When a time period is not specified, default to the current fiscal quarter." +}' +---- + +=== Example response + +If the API request is successful, ThoughtSpot returns an HTTP `200` response. + +// TODO: verify with engineering — confirm exact success response body (empty object or a structured confirmation) +[source,JSON] +---- +{} +---- + +If the request fails, ThoughtSpot returns an error code and message. The following example shows an authorization error: + +[source,JSON] +---- +{ + "error_code": "UNAUTHORIZED", + "message": "You do not have permission to set agent instructions." +} +---- + +== Get agent instructions + +The `GET /api/rest/2.0/ai/agent/instructions/get` API endpoint retrieves the behavioral instructions currently configured for the Spotter agent. + +// TODO: verify with engineering — confirm whether GET accepts any query parameters (for example, a conversation identifier or scope filter) + +=== Request parameters + +This endpoint does not require a request body or query parameters. + +=== Example request + +[source,cURL] +---- +curl -X GET \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/instructions/get' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' +---- + +=== Example response + +If the API request is successful and instructions are configured, ThoughtSpot returns the current instructions in the response body. + +[source,JSON] +---- +{ + "instructions": "Always respond in English. Focus on revenue and margin metrics. When a time period is not specified, default to the current fiscal quarter." +} +---- + +If no instructions are configured, ThoughtSpot returns an empty value for the `instructions` field. + +// TODO: verify with engineering — confirm whether the response returns null, an empty string (""), or omits the field entirely when no instructions are set +[source,JSON] +---- +{ + "instructions": "" +} +---- + +== Related resources + +* For information about coaching Spotter at the data model level, see xref:spotter-nl-instructions.adoc[Spotter coaching APIs]. +* For information about Spotter agent conversation workflows, see xref:spotter-agent-apis.adoc[AI APIs (Spotter Agent and Spotter 3)]. +* Visit the +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fset-agent-instructions" id="preview-in-playground">REST API v2.0 Playground</a>+++ to test the set agent instructions endpoint. +* Visit the +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fget-agent-instructions" id="preview-in-playground">REST API v2.0 Playground</a>+++ to test the get agent instructions endpoint. diff --git a/modules/ROOT/pages/spotter-apis.adoc b/modules/ROOT/pages/spotter-apis.adoc index f4ee15d71..4f697f30c 100644 --- a/modules/ROOT/pages/spotter-apis.adoc +++ b/modules/ROOT/pages/spotter-apis.adoc @@ -27,13 +27,14 @@ For information about supported API operations, see the following pages: * xref:spotter-classic-apis.adoc[APIs for Spotter classic workflow] * xref:spotter-agent-apis.adoc[APIs for Spotter agent workflows] * xref:spotter-nl-instructions.adoc[APIs for Spotter coaching and NL instructions] +* xref:spotter-agent-instructions.adoc[APIs for Spotter agent instructions] == Locale settings for API requests When using the xref:spotter-classic-apis.adoc#_generate_a_single_answer[Single Answer] and xref:spotter-classic-apis.adoc#_send_a_query_to_a_conversation_session[Send message] APIs, the locale used for API requests depends on your application's locale settings: * If your application is set to "Use browser language", the API will use this locale to generate responses. To override this setting, you must explicitly include the desired locale code in the `Accept-Language` header of your API request. To ensure consistent localization, set the `Accept-Language` header in your API requests when relying on browser language detection, or configure the locale explicitly in the user profile settings in ThoughtSpot. -* If you have set a specific locale in your ThoughtSpot instance or user profile, the API will use this locale to generate responses, overriding the browser or OS locale. +* If you have set a specific locale in your ThoughtSpot instance or user profile, the API uses this locale to generate responses, overriding the browser or OS locale. == Per-user API rate limits From cdda0d4439877e927cbdb1e2f59863a97f78d63e Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Mon, 1 Jun 2026 08:53:29 +0530 Subject: [PATCH 37/61] draft for review --- modules/ROOT/pages/data-report-v2-api.adoc | 16 +++---- modules/ROOT/pages/rest-api-v2-reference.adoc | 9 ++++ modules/ROOT/pages/rest-apiv2-changelog.adoc | 43 ++++++++----------- 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index e6db29204..ddda5b829 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -459,7 +459,7 @@ To download Answer data via `/api/rest/2.0/report/answer` API, you need at least In the request body, specify the GUID or name of the Answer object as `metadata_identifier`. -You can download the Answer data in the `CSV`, `XLSX`, `PNG`, and `PDF` format. The default `file_format` is `CSV`. +#The API supports exporting saved Answers, pinned Answers from a Liveboard, and Spotter-generated Answers. You can download Answer data in `CSV`, `XLSX`, `PNG`, and `PDF` format. The default `file_format` is `CSV`.# ==== Example @@ -477,22 +477,22 @@ curl -X POST \ [NOTE] ==== -* The downloadable file returned in API response file is extensionless. You need to rename the downloaded file by typing in the relevant extension. +* #Exported files are automatically named after the Answer title, with the file extension appended based on the selected format.# * HTML rendering is not supported for PDF exports of Answers with tables. ==== -Contact ThoughtSpot support to enable these enhanced settings for this API endpoint on your ThoughtSpot instance: +#Contact ThoughtSpot support to enable these enhanced settings for this API endpoint on your ThoughtSpot instance:# -* `personalised_view_identifier` [beta betaBackground]^Beta^ + -Optional parameter to specify the GUID of the personalised view of the Answer object that you want to download. -* `type` [beta betaBackground]^Beta^ + +* #`personalised_view_identifier` [beta betaBackground]^Beta^ + +Optional parameter to specify the GUID of the personalised view of the Answer object that you want to download.# +* #`type` [beta betaBackground]^Beta^ + Used to distinguish between a saved answer and a pinned answer on a Liveboard. Setting this parameter to `PINNED` allows the API to accept the guid of a pinned Answer directly as the `metadata_identifier`. When exporting a `PINNED` answer, all Liveboard-level filters, Runtime Filters, and Column -Security Rules (CSR) are automatically applied to the export output. +Security Rules (CSR) are automatically applied to the export output.# -The `png_options` [beta betaBackground]^Beta^ support the following properties: +#The `png_options` [beta betaBackground]^Beta^ support the following properties:# [cols="1,1,3"] |=== diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index 7f9a8238b..859a5b417 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -246,6 +246,15 @@ Downloads connection metadata differences between Cloud Data Warehouse and Thoug ThoughtSpot Software: __10.0.0.sw or later__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fconnections%2Fdownload-connection-metadata-changes" id="preview-in-playground">Try it out </a>+++ + +a| `POST /api/rest/2.0/auth/configure` + +Enables or disables authentication. a| ThoughtSpot Cloud: __26.6.0.cl or later__ + +a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fauthentication%2Fconfigure-auth-settings" id="preview-in-playground">Try it out </a>+++ + +a| `POST /api/rest/2.0/auth/search` + +Retrieves the authentication configuration for the specified auth type. a| ThoughtSpot Cloud: __26.6.0.cl or later__ + +a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fauthentication%2Fsearch-auth-settings" id="preview-in-playground">Try it out </a>+++ + |===== -- == Connection Configuration diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index e47381ef4..a20bea2e7 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -18,6 +18,25 @@ Enables or disables authentication at cluster or Org level for the specified aut * `POST /api/rest/2.0/auth/search` + Returns the authentication configuration for the specified auth type at cluster and Org level. +==== Connection deactivate and activate API [beta betaBackground]^Beta^ + +// SOURCE: SCAL-294844, SCAL-294845, SCAL-278132 +// TODO: verify with engineering — confirm the exact endpoint paths for deactivate and activate operations +ThoughtSpot introduces REST API v2.0 endpoints to programmatically deactivate and activate data connections: + +// TODO: verify with engineering — confirm endpoint paths, for example: +// `POST /api/rest/2.0/connections/{connection_identifier}/deactivate` +// `POST /api/rest/2.0/connections/{connection_identifier}/activate` +* POST /api/rest/2.0/connections/{connection_identifier}/status + +Deactivates or activates a connection. + +//// +Deactivating a connection prevents all user-initiated queries and skips scheduled background jobs such as Sage indexing and row count statistics. +Activating a connection immediately restores query access and resumes scheduled jobs on their defined schedules. + +Required access: Administrator or Connection Owner. +//// + === Answer report API enhancements [beta betaBackground]^Beta^ The `POST /api/rest/2.0/report/answer` API endpoint introduces the following enhancements: @@ -60,30 +79,6 @@ The API now automatically names exported files based on the Answer title and app Contact ThoughtSpot support to enable these settings for PNG downloads on your ThoughtSpot instance. For more information, see xref:data-report-v2-api.adoc#_answer_report_api[Answer report API documentation]. -=== Connection deactivate and activate API [beta betaBackground]^Beta^ - -// SOURCE: SCAL-294844, SCAL-294845, SCAL-278132 -// TODO: verify with engineering — confirm the exact endpoint paths for deactivate and activate operations -ThoughtSpot introduces REST API v2.0 endpoints to programmatically deactivate and activate data connections: - -// TODO: verify with engineering — confirm endpoint paths, for example: -// `POST /api/rest/2.0/connections/{connection_identifier}/deactivate` -// `POST /api/rest/2.0/connections/{connection_identifier}/activate` -* `POST /api/rest/2.0/connections/{connection_identifier}/deactivate` + -Deactivates the specified connection. -* `POST /api/rest/2.0/connections/{connection_identifier}/activate` + -Activates a previously deactivated connection. - - -//// -Deactivating a connection prevents all user-initiated queries and skips scheduled background jobs such as Sage indexing and row count statistics. -Activating a connection immediately restores query access and resumes scheduled jobs on their defined schedules. - -Required access: Administrator or Connection Owner. -//// - -For more information, see xref:connections-deactivate.adoc[Deactivate and activate connections]. -// TODO: verify with engineering — confirm target doc page xref name once page is created === Share metadata API: Collections support [beta betaBackground]^Beta^ From fed0d7f9f8fdaac846bb590434579de632a262bf Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Mon, 1 Jun 2026 14:55:21 +0530 Subject: [PATCH 38/61] Siddhant's feedback --- modules/ROOT/pages/data-report-v2-api.adoc | 21 ++++++++++---------- modules/ROOT/pages/rest-apiv2-changelog.adoc | 8 ++++---- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index ddda5b829..196c8361d 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -459,7 +459,7 @@ To download Answer data via `/api/rest/2.0/report/answer` API, you need at least In the request body, specify the GUID or name of the Answer object as `metadata_identifier`. -#The API supports exporting saved Answers, pinned Answers from a Liveboard, and Spotter-generated Answers. You can download Answer data in `CSV`, `XLSX`, `PNG`, and `PDF` format. The default `file_format` is `CSV`.# +The API supports exporting saved Answers, pinned Answers from a Liveboard, and Spotter-generated Answers. You can download Answer data in `CSV`, `XLSX`, `PNG`, and `PDF` format. The default `file_format` is `CSV`. ==== Example @@ -477,22 +477,22 @@ curl -X POST \ [NOTE] ==== -* #Exported files are automatically named after the Answer title, with the file extension appended based on the selected format.# +* Exported files are automatically named after the Answer title, with the file extension appended based on the selected format. * HTML rendering is not supported for PDF exports of Answers with tables. ==== -#Contact ThoughtSpot support to enable these enhanced settings for this API endpoint on your ThoughtSpot instance:# +Contact ThoughtSpot support to enable these enhanced settings for this API endpoint on your ThoughtSpot instance: -* #`personalised_view_identifier` [beta betaBackground]^Beta^ + -Optional parameter to specify the GUID of the personalised view of the Answer object that you want to download.# -* #`type` [beta betaBackground]^Beta^ + +* `personalised_view_identifier` [earlyAccess eaBackground]#Early Access# + +Optional parameter to specify the GUID of the personalised view of the `PINNED` Answer object that you want to download. +* `type` [earlyAccess eaBackground]#Early Access# + Used to distinguish between a saved answer and a pinned answer on a Liveboard. Setting this parameter to `PINNED` allows the API to accept the guid of a pinned Answer directly as the `metadata_identifier`. When -exporting a `PINNED` answer, all Liveboard-level filters, Runtime Filters, and Column -Security Rules (CSR) are automatically applied to the export output.# +exporting an Answer, all Liveboard-level filters, Runtime Filters, and Column +Security Rules (CSR) are automatically applied to the export output. -#The `png_options` [beta betaBackground]^Beta^ support the following properties:# +The `png_options` [earlyAccess eaBackground]#Early Access# support the following properties: [cols="1,1,3"] |=== @@ -512,9 +512,10 @@ Valid range: `600px` to `3840px`. |Integer |Display scale percentage for objects rendered in the image. Adjusts the relative size of visual elements without cropping the image. + -Valid range: `80%` to `400%`. +Valid range: `80%` to `500%`. |=== +You can now export the PNG of any Answer in any aspect ratio and any scaling or zoom level. Just configure, scale, and export exactly what you need. [#exportSpotterData] ==== Export data generated from Spotter APIs diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index a20bea2e7..a764ac797 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -37,7 +37,7 @@ Activating a connection immediately restores query access and resumes scheduled Required access: Administrator or Connection Owner. //// -=== Answer report API enhancements [beta betaBackground]^Beta^ +=== Answer report API enhancements [earlyAccess eaBackground]#Early Access# The `POST /api/rest/2.0/report/answer` API endpoint introduces the following enhancements: @@ -45,7 +45,7 @@ Pinned Answer export:: // SOURCE: SCAL-236681, SCAL-306548 You can now export a pinned Answer directly from a Liveboard using the Answer report API. To export a pinned Answer, specify the `viz_guid` parameter in your API request. -Exports from this endpoint inherently respect Liveboard-level filters, Runtime Filters, and JWT token context. +Exports from this endpoint inherently respect Liveboard-level filters, Runtime Filters, Column security rules, and JWT token context. + To export a specific personalized view of a pinned Answer, include the `personalised_view_identifier` parameter. // TODO: verify with engineering — confirm exact parameter name casing and accepted value type (GUID, name, or both) for `personalised_view_identifier` @@ -68,8 +68,8 @@ PNG exports now support custom dimensions via the following new parameters: Display scaling:: // SOURCE: SCAL-236681, SCAL-306548 // TODO: verify with engineering — confirm the exact parameter name for the scaling percentage (for example, `scaling`, `scale_factor`, or `scaling_percent`) -A new scaling parameter allows you to adjust the relative size of visual elements in PNG exports without cropping. -Valid range: 80–400%. +A new `scaling` parameter allows you to adjust the relative size of visual elements in PNG exports without cropping. +Valid range: 80–500%. Automatic file naming:: // SOURCE: SCAL-236681, SCAL-306548 From 58189c9c0471d8af87f64a3dce31bfd116ed7ff5 Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Mon, 1 Jun 2026 21:10:34 +0530 Subject: [PATCH 39/61] trusted auth edits --- modules/ROOT/pages/authentication.adoc | 5 +++-- modules/ROOT/pages/security-settings.adoc | 11 ++++++++--- modules/ROOT/pages/trusted-auth-secret-key.adoc | 6 ++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/modules/ROOT/pages/authentication.adoc b/modules/ROOT/pages/authentication.adoc index c2e6535b0..222bfabf5 100644 --- a/modules/ROOT/pages/authentication.adoc +++ b/modules/ROOT/pages/authentication.adoc @@ -772,7 +772,8 @@ curl -X POST \ If the API request is successful, ThoughtSpot returns a 204 status code and ends the user session. -== Configuring authentication settings + +== #Configuring authentication settings# To enable or disable authentication at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/configure` endpoint. === Request parameters @@ -795,7 +796,7 @@ __Optional__ |===== -== Search authentication settings +== #Search authentication settings# To find the authentication configuration for the specified auth type at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint. === Request parameters diff --git a/modules/ROOT/pages/security-settings.adoc b/modules/ROOT/pages/security-settings.adoc index 80a485d06..4be9493f4 100644 --- a/modules/ROOT/pages/security-settings.adoc +++ b/modules/ROOT/pages/security-settings.adoc @@ -492,10 +492,15 @@ curl -X POST \ ---- === Trusted authentication -See xref:trusted-authentication.adoc[Trusted authentication] and xref:_secret_key_management[Secret key management]. +#To enable or disable trusted authentication at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/configure` endpoint.# + +#To find the trusted authentication configuration for the specified auth type at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint.# + +#For more information on the trusted authentication configuration through APIs, see xref:authentication.adoc[Configuring authentication settings].# + +See xref:trusted-authentication.adoc[Trusted authentication] and xref:_secret_key_management[Secret key management] for other related information. + -[NOTE] -Trusted authentication is not supported through the REST APIs v2. == Retrieve security settings You can retrieve the security settings for your ThoughtSpot instance by sending a `POST` request to `POST /api/rest/2.0/system/security-settings/search` API endpoint. diff --git a/modules/ROOT/pages/trusted-auth-secret-key.adoc b/modules/ROOT/pages/trusted-auth-secret-key.adoc index 9071fc5e8..7bb3f5a82 100644 --- a/modules/ROOT/pages/trusted-auth-secret-key.adoc +++ b/modules/ROOT/pages/trusted-auth-secret-key.adoc @@ -6,7 +6,8 @@ :page-pageid: trusted-auth-secret-key :page-description: You can configure support for token-based authentication service on ThoughtSpot. -== secret key overview +[#secret-key-overview] +== Secret key overview The `secret_key` allows calling the ThoughtSpot *token request* REST APIs to generate a token for *any user*. Requests with the `secret_key` do not require any type of user login or admin permissions and the `secret_key` is equivalent to an admin-level login for the token request REST APIs. @@ -31,7 +32,8 @@ To generate a secret key: If the per-Org secret key feature is not enabled on your instance and if you want to generate a separate secret key for each Org, contact ThoughtSpot Support. ThoughtSpot also allows you to generate a secret key at the primary Org (Org 0) level and use it to obtain an authentication token for a user. . Go to *Develop* > *Customizations* > *Security settings*. . Click *Edit*. -. To enable trusted authentication, turn on the *Trusted authentication* toggle. +. To enable trusted authentication, turn on the *Trusted authentication* toggle. #To enable Trusted authentication programmatically, send a `POST` request to the `POST /api/rest/2.0/auth/configure` endpoint endpoint. For more information, see xref:authentication.adoc[Configuring authentication settings].# + . To copy the secret key, click *Edit* again, navigate to *Trusted authentication*, and then click the copy to clipboard icon. + The following example shows a ThoughtSpot-generated secret key string. From 713ccfb97144199a6c8b5f31a2bf20025b3bc477 Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Tue, 2 Jun 2026 12:05:47 +0530 Subject: [PATCH 40/61] trusted auth Shashi's feedback --- modules/ROOT/pages/authentication.adoc | 152 +++++++++++------- modules/ROOT/pages/rest-api-v2-reference.adoc | 10 +- .../ROOT/pages/trusted-auth-secret-key.adoc | 6 +- modules/ROOT/pages/whats-new.adoc | 6 + 4 files changed, 111 insertions(+), 63 deletions(-) diff --git a/modules/ROOT/pages/authentication.adoc b/modules/ROOT/pages/authentication.adoc index 222bfabf5..ddd7cc401 100644 --- a/modules/ROOT/pages/authentication.adoc +++ b/modules/ROOT/pages/authentication.adoc @@ -87,13 +87,105 @@ Once the security rules are set, they are fixed for at least that user's session ||| |=== +[#_enable_trusted] +=== Configure trusted authentication +To generate an access token, Trusted authentication must be enabled on your ThoughtSpot instance. +You can enable Trusted authentication through the ThoughtSpot UI or the REST API v2. + +*Through the ThoughtSpot UI* + +The administrator must enable xref:trusted-auth-secret-key.adoc[Trusted authentication] on the +*Develop* > *Customizations* > *Security settings* page. + +*Through the REST API v2* + +Before enabling Trusted authentication through the REST API v2, check your existing +authentication configuration. +To retrieve the current authentication configuration for a specific authentication type at the +cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint. + +==== Request parameters +[width="100%" cols="1,4"] +[options='header'] +|===== +|Parameter|Description +|`auth_type` +|__String__. Type of authentication mechanism to configure. Currently, supports `TRUSTED_AUTH` only. + +|`scope` +__Optional__ +|__String__. Select `CLUSTER` to retrieve only cluster-level settings, or `ORG` to retrieve only Org-level settings. If no selection is made, both cluster and Org-level settings are retrieved based on user permissions. +|===== + +==== API request + +.cURL +[source, cURL] +---- +curl -X POST \ +--url 'https://{ThoughtSpot-host}/api/rest/2.0/auth/search' \ +-H 'Accept: application/json' \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer {AUTH_TOKEN}' + { + "auth_type": "TRUSTED_AUTH" + }' +---- + + +If Trusted authentication is not enabled, you can enable or disable it at the cluster or Org level by sending a request to the `POST /api/rest/2.0/auth/configure` endpoint. + + +=== Request parameters +[width="100%" cols="1,4"] +[options='header'] +|===== +|Parameter|Description +|`auth_type` +|__String__. Type of authentication mechanism to configure. Currently, supports `TRUSTED_AUTH` only. + +|`cluster_preferences` +__Optional__ +|__Nullable__. `ENABLE` or `DISABLE` authentication for the cluster. When enabled, a new token is generated if one does not exist. When disabled, the existing cluster-level access token is revoked. + +|`org_preferences` +__Optional__ +|__Nullable__. `ENABLE` or `DISABLE` authentication for a particular Org. When enabled, a new org-level access token is generated if one does not exist. When disabled, the existing org-level access token is revoked. + +|`org_identifier` + +|===== + +==== API request + +.cURL +[source, cURL] +---- +curl -X POST \ +--url 'https://{ThoughtSpot-host}/api/rest/2.0/auth/configure' \ +-H 'Content-Type: application/json' \ +-H 'Authorization: Bearer {AUTH_TOKEN} + '{ + "auth_type": "TRUSTED_AUTH", + "org_preferences": [ + { + "org_identifier": "Test", + "auth_status": "ENABLED" + } + ] + }' +---- + +If the API request is successful, ThoughtSpot returns a 204 status code. + + [#_generate_a_full_access_token] === Generating a full access token To generate a full access token, send a `POST` request to the `/api/rest/2.0/auth/token/full` API endpoint with the required attributes. You can generate a token by providing a `username` and `password`, or by using a `secret_key`. -To generate a `secret_key`, the administrator must enable xref:trusted-auth-secret-key.adoc[trusted authentication] on the **Develop** > **Customizations** > **Security Settings** page. +To generate a `secret_key`, the administrator must enable xref:trusted-auth-secret-key.adoc[trusted authentication] on the **Develop** > **Customizations** > **Security Settings** page or through the APIs. After ThoughtSpot issues an authentication token, the user must include the token in the `Authorization` header of their subsequent API requests. @@ -161,7 +253,7 @@ If the API request is successful, ThoughtSpot returns the authentication token t ==== API request with username and secret key To obtain an authentication token for a user, include `username` and `secret_key` in the API request. In a trusted authentication implementation, you can request tokens on behalf of users who require access to the ThoughtSpot content embedded in a third-party application. -To request a token on behalf of another user, you need administrator privileges and a `secret key` that allows you to securely pass the authentication details of an embedded application user. The `secret key` is generated xref:trusted-auth-secret-key.adoc#trusted-auth-enable[when trusted authentication is enabled on a ThoughtSpot instance]. +To request a token on behalf of another user, you need administrator privileges and a `secret_key` that allows you to securely pass the authentication details of an embedded application user. The `secret_key` is generated xref:trusted-auth-secret-key.adoc#trusted-auth-enable[when trusted authentication is enabled on a ThoughtSpot instance]. To get a trusted authentication token that grants full access to ThoughtSpot, send a `POST` request with `username`, `secret_key`, and other attributes to the `/api/rest/2.0/auth/token/full` endpoint: @@ -172,7 +264,7 @@ To get a trusted authentication token that grants full access to ThoughtSpot, se |`username` |__String__. Username of the ThoughtSpot user. If the user is not available in ThoughtSpot, you can set the `auto_create` parameter to `true` to create a user just-in-time (JIT). |`secret_key` -|__String__. The secret key string generated for your ThoughtSpot instance. The secret key is created xref:trusted-auth-secret-key.adoc#trusted-auth-enable[when trusted authentication is enabled] on your instance. +|__String__. The `secret_key` string generated for your ThoughtSpot instance. The `secret_key` is created xref:trusted-auth-secret-key.adoc#trusted-auth-enable[when trusted authentication is enabled] on your instance. |`validity_time_in_sec` + __Optional__|__Integer__. Token expiry duration in seconds. The default duration is 300 seconds. You can set the token expiry duration to a higher value. API requests with an expired or invalid token result in an error. In such cases, REST clients must obtain a new token from ThoughtSpot and use it in their subsequent API calls. |`org_id` + @@ -187,7 +279,7 @@ The following example shows the request body with `username` and `secret_key`: [source,cURL] ---- curl -X POST \ - --url 'https://stage-grapes-champagne.thoughtspotstaging.cloud/api/rest/2.0/auth/token/full' \ + --url 'https://{ThoughtSpot-Host}api/rest/2.0/auth/token/full' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ --data-raw '{ @@ -298,7 +390,7 @@ To get a token that grants `read-only` access to a specific metadata object, sen |__String__. Username of the ThoughtSpot user. If the user is not available in ThoughtSpot, you can set the `auto_create` parameter to `true` to create a user just-in-time (JIT). |`secret_key` -|__String__. The secret key string generated for your ThoughtSpot instance. The secret key is created xref:trusted-auth-secret-key.adoc#trusted-auth-enable[when trusted authentication is enabled] on your instance. +|__String__. The `secret_key` string generated for your ThoughtSpot instance. The `secret_key` is created xref:trusted-auth-secret-key.adoc#trusted-auth-enable[when trusted authentication is enabled] on your instance. |`object_id` |__String__. GUID of the ThoughtSpot object. @@ -542,7 +634,7 @@ For cookie-based authentication, make an API call to the `/api/rest/2.0/auth/ses |__String__. The password of the user account. |`org_identifier` -|__String__. Name or ID of the Org. If no Org ID is specified, the user will be logged into the Org context of their previous session. +|__String__. Name or ID of the Org. If no Org ID is specified, the user is logged into the Org context of their previous session. |`remember_me` __Optional__ @@ -773,52 +865,4 @@ curl -X POST \ If the API request is successful, ThoughtSpot returns a 204 status code and ends the user session. -== #Configuring authentication settings# -To enable or disable authentication at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/configure` endpoint. - -=== Request parameters -[width="100%" cols="1,4"] -[options='header'] -|===== -|Parameter|Description -|`auth_type` -|__String__. Type of authentication mechanism to configure. Currently, supports `TRUSTED_AUTH` only. - -|`cluster_preferences` -__Optional__ -|__Nullable__. `ENABLE` or `DISABLE` authentication for the cluster. When enabled, a new token is generated if one does not exist. When disabled, the existing cluster-level access token is revoked. - -|`org_preferences` -__Optional__ -|__Nullable__. `ENABLE` or `DISABLE` authentication for a particular Org. When enabled, a new org-level access token is generated if one does not exist. When disabled, the existing org-level access token is revoked. - -|`org_identifier` -|===== - -== #Search authentication settings# -To find the authentication configuration for the specified auth type at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint. - -=== Request parameters -[width="100%" cols="1,4"] -[options='header'] -|===== -|Parameter|Description -|`auth_type` -|__String__. Type of authentication mechanism to configure. Currently, supports `TRUSTED_AUTH` only. - -|`scope` -__Optional__ -|__String__. Select `CLUSTER` to retrieve only cluster-level settings, or `ORG` to retrieve only Org-level settings. If no selection is made, both cluster and Org-level settings are retrieved based on user permissions. -|===== - -//// -==== Response codes - -[options="header", cols="2,4"] -|=== -|HTTP status code|Description -|**204**|The user is logged out of ThoughtSpot -|**500**|Failed operation -|=== -//// diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index 859a5b417..209f323d7 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -247,13 +247,9 @@ ThoughtSpot Software: __10.0.0.sw or later__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fconnections%2Fdownload-connection-metadata-changes" id="preview-in-playground">Try it out </a>+++ -a| `POST /api/rest/2.0/auth/configure` + -Enables or disables authentication. a| ThoughtSpot Cloud: __26.6.0.cl or later__ + -a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fauthentication%2Fconfigure-auth-settings" id="preview-in-playground">Try it out </a>+++ - -a| `POST /api/rest/2.0/auth/search` + -Retrieves the authentication configuration for the specified auth type. a| ThoughtSpot Cloud: __26.6.0.cl or later__ + -a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fauthentication%2Fsearch-auth-settings" id="preview-in-playground">Try it out </a>+++ +a| `POST /api/rest/2.0/connections/{connection_identifier}/status` + +Deactivates or activates a connection. a| ThoughtSpot Cloud: __26.6.0.cl or later__ + +a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fconnections%2Fupdate-connection-status" id="preview-in-playground">Try it out </a>+++ |===== -- diff --git a/modules/ROOT/pages/trusted-auth-secret-key.adoc b/modules/ROOT/pages/trusted-auth-secret-key.adoc index 7bb3f5a82..eabccd6d6 100644 --- a/modules/ROOT/pages/trusted-auth-secret-key.adoc +++ b/modules/ROOT/pages/trusted-auth-secret-key.adoc @@ -32,8 +32,7 @@ To generate a secret key: If the per-Org secret key feature is not enabled on your instance and if you want to generate a separate secret key for each Org, contact ThoughtSpot Support. ThoughtSpot also allows you to generate a secret key at the primary Org (Org 0) level and use it to obtain an authentication token for a user. . Go to *Develop* > *Customizations* > *Security settings*. . Click *Edit*. -. To enable trusted authentication, turn on the *Trusted authentication* toggle. #To enable Trusted authentication programmatically, send a `POST` request to the `POST /api/rest/2.0/auth/configure` endpoint endpoint. For more information, see xref:authentication.adoc[Configuring authentication settings].# - +. To enable trusted authentication, turn on the *Trusted authentication* toggle. . To copy the secret key, click *Edit* again, navigate to *Trusted authentication*, and then click the copy to clipboard icon. + The following example shows a ThoughtSpot-generated secret key string. @@ -46,6 +45,9 @@ This key is required for making API calls to get a token for ThoughtSpot users. . Store the key in a secure location. . Click *Save Changes*. +[NOTE] +#To enable Trusted authentication programmatically, send a `POST` request to the `POST /api/rest/2.0/auth/configure` endpoint. For more information, see xref:authentication.adoc[Configuring authentication settings].# + == Request a new secret key Requesting a new `secret_key` simply involves disabling and re-enabling trusted authentication. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 1ee092727..c00cbc1dc 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,6 +23,12 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ +== June 2026 + +[discrete] +==== REST API v2 +This release introduces new API endpoints for Connections and trusted authentication, and modifications to the Answer report and sharing metadata APIs. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +|===== == May 2026 From a90f24dca1de1c33e5703e91105e7f7c3c0b47ea Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Tue, 2 Jun 2026 12:09:08 +0530 Subject: [PATCH 41/61] trusted auth edits --- modules/ROOT/pages/authentication.adoc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/authentication.adoc b/modules/ROOT/pages/authentication.adoc index ddd7cc401..7d3652ef9 100644 --- a/modules/ROOT/pages/authentication.adoc +++ b/modules/ROOT/pages/authentication.adoc @@ -88,9 +88,9 @@ Once the security rules are set, they are fixed for at least that user's session |=== [#_enable_trusted] -=== Configure trusted authentication -To generate an access token, Trusted authentication must be enabled on your ThoughtSpot instance. -You can enable Trusted authentication through the ThoughtSpot UI or the REST API v2. +=== #Configure trusted authentication# +To generate an access token, trusted authentication must be enabled on your ThoughtSpot instance. +You can enable trusted authentication through the ThoughtSpot UI or the REST API v2. *Through the ThoughtSpot UI* @@ -99,9 +99,9 @@ The administrator must enable xref:trusted-auth-secret-key.adoc[Trusted authenti *Through the REST API v2* -Before enabling Trusted authentication through the REST API v2, check your existing +Before enabling trusted authentication through the REST API v2, check your existing authentication configuration. -To retrieve the current authentication configuration for a specific authentication type at the +To retrieve the current authentication configuration at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint. ==== Request parameters @@ -133,7 +133,7 @@ curl -X POST \ ---- -If Trusted authentication is not enabled, you can enable or disable it at the cluster or Org level by sending a request to the `POST /api/rest/2.0/auth/configure` endpoint. +If trusted authentication is not enabled, you can enable or disable it at the cluster or Org level by sending a request to the `POST /api/rest/2.0/auth/configure` endpoint. === Request parameters From 3b018e25baa12cc81c574460d95a5e69d327ba54 Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Tue, 2 Jun 2026 14:08:22 +0530 Subject: [PATCH 42/61] Added deprecation note --- modules/ROOT/pages/deprecated-features.adoc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/ROOT/pages/deprecated-features.adoc b/modules/ROOT/pages/deprecated-features.adoc index 06089a22d..a828236e0 100644 --- a/modules/ROOT/pages/deprecated-features.adoc +++ b/modules/ROOT/pages/deprecated-features.adoc @@ -14,6 +14,8 @@ As ThoughtSpot applications evolve, some existing features will be deprecated an [options='header'] |===== |Feature|Impacted interface and release versions|Deprecation date |End of Support / removal from the product +a|xref:deprecated-features.adoc#everynmins[*Send every N minutes* frequency in Liveboard schedules] +|ThoughtSpot Cloud 26.8.0.cl and later | August 2026 | - a|xref:deprecated-features.adoc#hostEventv1[HostEvent v1 framework] |ThoughtSpot Cloud 26.10.0.cl and later | October 2026 | March 2027 a|xref:deprecated-features.adoc#v1-v2-exp-fullApp-embed[V1 and V2 UI experience in full application embedding]|ThoughtSpot Cloud 26.8.0.cl and later | February 2026 | August 2026 @@ -87,6 +89,19 @@ a|xref:deprecated-features.adoc#_deprecated_parameter_in_rest_api_v2_0_authentic |||| |===== +[#everynmins] +== *Send every N minutes* frequency in Liveboard Schedules +The `POST /api/rest/2.0/schedules/create` API endpoint no longer accepts `minute` as a valid `frequency` value for sub-hourly schedule intervals. + +Impact on your instance:: +Starting ThoughtSpot 26.8.0.cl, all existing Liveboard schedules set to *every N minutes* will be automatically changed to *every 1 hour*. +This change cannot be undone. Review your existing schedules and update them to an hourly or daily frequency before upgrading. + +Recommended action:: +Do not create Liveboard schedules with sub-hourly frequencies. +If you need to send a report immediately, use the *Send now* option in Liveboard schedules. +For any assistance, contact ThoughtSpot Support. + [#hostEventv1] == HostEvent v1 framework in Visual Embed SDK The HostEvent v1 framework will be deprecated in the ThoughtSpot Cloud 26.10.0.cl release version. The default behavior of host events and application workflows with the HostEvent v1 framework will be replaced with the HostEvent v2 framework. From aea6efa648c32314e6de96ab5512010e7c5d5c90 Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Tue, 2 Jun 2026 14:26:34 +0530 Subject: [PATCH 43/61] Added deprecation note --- modules/ROOT/pages/deprecated-features.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/deprecated-features.adoc b/modules/ROOT/pages/deprecated-features.adoc index a828236e0..ac0cc2601 100644 --- a/modules/ROOT/pages/deprecated-features.adoc +++ b/modules/ROOT/pages/deprecated-features.adoc @@ -14,7 +14,7 @@ As ThoughtSpot applications evolve, some existing features will be deprecated an [options='header'] |===== |Feature|Impacted interface and release versions|Deprecation date |End of Support / removal from the product -a|xref:deprecated-features.adoc#everynmins[*Send every N minutes* frequency in Liveboard schedules] +a|xref:deprecated-features.adoc#everynmins[Minute-level schedule frequency] |ThoughtSpot Cloud 26.8.0.cl and later | August 2026 | - a|xref:deprecated-features.adoc#hostEventv1[HostEvent v1 framework] |ThoughtSpot Cloud 26.10.0.cl and later | October 2026 | March 2027 @@ -90,7 +90,7 @@ a|xref:deprecated-features.adoc#_deprecated_parameter_in_rest_api_v2_0_authentic |===== [#everynmins] -== *Send every N minutes* frequency in Liveboard Schedules +== Minute-level schedule frequency The `POST /api/rest/2.0/schedules/create` API endpoint no longer accepts `minute` as a valid `frequency` value for sub-hourly schedule intervals. Impact on your instance:: From 9a4790df673f2fc0c382c92fce3de124d66c56ee Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Wed, 3 Jun 2026 10:27:00 +0530 Subject: [PATCH 44/61] edited the deprecation note --- modules/ROOT/pages/deprecated-features.adoc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/deprecated-features.adoc b/modules/ROOT/pages/deprecated-features.adoc index ac0cc2601..67d8a7fcc 100644 --- a/modules/ROOT/pages/deprecated-features.adoc +++ b/modules/ROOT/pages/deprecated-features.adoc @@ -91,16 +91,14 @@ a|xref:deprecated-features.adoc#_deprecated_parameter_in_rest_api_v2_0_authentic [#everynmins] == Minute-level schedule frequency -The `POST /api/rest/2.0/schedules/create` API endpoint no longer accepts `minute` as a valid `frequency` value for sub-hourly schedule intervals. +The `POST /api/rest/2.0/schedules/create` API endpoint no longer accepts `minute` as a valid `frequency` value for schedule intervals. Impact on your instance:: -Starting ThoughtSpot 26.8.0.cl, all existing Liveboard schedules set to *every N minutes* will be automatically changed to *every 1 hour*. -This change cannot be undone. Review your existing schedules and update them to an hourly or daily frequency before upgrading. +Starting ThoughtSpot 26.8.0.cl, all existing Liveboard schedules set to `minute` as the frequency will be automatically changed to an hourly frequency. Recommended action:: -Do not create Liveboard schedules with sub-hourly frequencies. -If you need to send a report immediately, use the *Send now* option in Liveboard schedules. -For any assistance, contact ThoughtSpot Support. +Before upgrading, review your existing Liveboard schedules. +If your workflows require sub-hourly frequencies after this change takes effect, contact ThoughtSpot Support. Beyond reinstating the `minute` frequency, ThoughtSpot will not provide ongoing maintenance for that frequency. [#hostEventv1] == HostEvent v1 framework in Visual Embed SDK From b9bd3903b856e54b53ee9d0a95ffe608cbaf9ba6 Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Wed, 3 Jun 2026 11:43:18 +0530 Subject: [PATCH 45/61] edited the deprecation note --- modules/ROOT/pages/deprecated-features.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deprecated-features.adoc b/modules/ROOT/pages/deprecated-features.adoc index 67d8a7fcc..480e99dc8 100644 --- a/modules/ROOT/pages/deprecated-features.adoc +++ b/modules/ROOT/pages/deprecated-features.adoc @@ -91,7 +91,7 @@ a|xref:deprecated-features.adoc#_deprecated_parameter_in_rest_api_v2_0_authentic [#everynmins] == Minute-level schedule frequency -The `POST /api/rest/2.0/schedules/create` API endpoint no longer accepts `minute` as a valid `frequency` value for schedule intervals. +The `POST /api/rest/2.0/schedules/create` and `POST /api/rest/2.0/schedules/{schedule_identifier}/update` API endpoint no longer accept `minute` as a valid `frequency` value for schedule intervals. Impact on your instance:: Starting ThoughtSpot 26.8.0.cl, all existing Liveboard schedules set to `minute` as the frequency will be automatically changed to an hourly frequency. From f713e077e1be2337261021212ef323c412eae9d5 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Wed, 3 Jun 2026 22:24:11 +0530 Subject: [PATCH 46/61] charting skills --- modules/ROOT/pages/charting-skills-embed.adoc | 998 ++++++++---------- modules/ROOT/pages/common/nav-embedding.adoc | 1 + 2 files changed, 438 insertions(+), 561 deletions(-) diff --git a/modules/ROOT/pages/charting-skills-embed.adoc b/modules/ROOT/pages/charting-skills-embed.adoc index 93660e005..f4e8494e4 100644 --- a/modules/ROOT/pages/charting-skills-embed.adoc +++ b/modules/ROOT/pages/charting-skills-embed.adoc @@ -1,595 +1,471 @@ -// SOURCE: SCAL-306327, SCAL-311138, SCAL-252716 -// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit - - -= Chart configuration overrides in embedded deployments += Configuring visualization overrides :toc: left :toclevels: 3 -:sectnums: -:description: Learn how to use chart configuration overrides to control the initial visual state of charts, tables, and KPI visualizations in ThoughtSpot Embedded deployments. - -ThoughtSpot Embedded lets you control the initial visual state of charts, tables, and KPI visualizations programmatically, without requiring your end users to manually configure them. -Using the `visualOverrides` object, embed developers can specify default chart settings, such as colors, data labels, number formatting, legend behavior, axis properties, table themes, and more, when a visualization loads. -[NOTE] -==== -Chart configuration overrides are available in ThoughtSpot release 26.7.0.cl and later. + -Supported visualization libraries in Phase 1: Highcharts (charts), AG Grid (tables), and DevXtreme (pivot tables). + -Muze native chart support is planned for a future release. -==== +:page-title: VisualizationOverrides +:page-pageid: visualization-overrides +:page-description: Visualization overrides to customize chart and table rendering in embedded ThoughtSpot experience. -// TODO: verify with engineering — confirm exact Visual Embed SDK method/property name used to pass -// `visualOverrides` for SearchEmbed or SageEmbed in the TSE integration flow. +The Visual Embed SDK allows you to apply visual styling overrides programmatically to the charts and tables generated from Search data queries in an embedded app. == Overview +The visualization overrides feature allows developers to pre-define the chart and table settings for their embedding application users and apply these overrides at load time. This eliminates the need for embedding application users manually adjusting charts and tables in the edit mode. -// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit -// SOURCE: SCAL-299430 - -Previously, embed customers had no way to specify chart type or initial chart settings when -pre-seeding a search-data or Sage embed. End users were required to enter edit mode and manually -adjust charts after an answer was generated. This was a significant barrier for use cases such as: - -* Enabling column summaries by default in every rendered table -* Applying a brand color palette to all charts -* Showing data labels on all new answers -* Setting a default table theme (zebra-striped, outlined, or row-based) +Using the `visualOverrides` object, embed application developers can preset the following properties in the new answers retrieved from a search data query: -Chart configuration overrides solve this by exposing a `visualOverrides` object that you pass at -load time. The overrides are applied with the highest priority—they take precedence over any -previously saved chart state. If a user manually changes a setting, the override for that property -is cleared, ensuring user intent is always respected. +* Chart properties, such as the legend position, data labels, axis ranges, column colors, conditional formatting, and grid lines +* table properties, including column visibility, text wrap, content density, and summary configuration -=== How overrides work +== Configuring visual overrides -// SOURCE: Design Doc https://docs.google.com/document/d/1-L4cQiAtH0TGXUUP_3g68GeMKf_uWMn11PTXfNOVFs0/edit -// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit +The `visualOverrides` object in the `VisualizationOverrides` interface lets you apply styling overrides to charts and tables generated in the embedded ThoughtSpot Search interface. These overrides can be categorized as: -Overrides fall into two categories: +* Visualization-level overrides that affect settings such as legend visibility, data labels, axis ranges, colors, gridlines, and conditional formatting on a chart. +* column-level overrides applied such as number formatting, headline visibility, and sort order in a table. -Visualization-level overrides:: Applied via the `visualOverrides` object on the front end. -Affects settings like legend visibility, data labels, axis ranges, colors, gridlines, and -conditional formatting. +Within `visualOverrides`, the chart and table settings can be applied in the `chart` and `table` objects. -Column-level overrides:: Applied on the backend at answer-generation time. Affects number -formatting, headline visibility, and sort order. These are resolved server-side when Spotter or -the embed session calls the `UpdateVisualOverrides` API. +Make sure to import the required components and enumeration objects: -[IMPORTANT] -==== -`visualOverrides` always takes precedence over any saved `vizProp` state: - -`visualOverrides` > `vizProp` (stored chart state) - -Once a user manually changes a setting that was originally set by an override, the override for -that specific property is cleared and the user's choice is preserved. All other overrides remain -active. -==== - -== Supported settings +[source,JavaScript] +---- +import { + init, // Core SDK initialization function. + AuthType, // for authentication type selection. + SearchEmbed, // Embeds the ThoughtSpot Search page into a host application. + ConditionalFormattingOperator, // Enum for conditional formatting comparison operators. + DataLabelFilterOperator, // Enum for data label filter operators. + ConditionalFormattingComparisonType, // Enum for conditional formatting comparison. + BackgroundFormatType, // Enum for the background fill type in conditional formatting rules. + TableTheme, // Enum for the visual theme of embedded tables. + TableContentDensity, // Enum for the row height and padding density of embedded tables. + LegendPosition, // Enum for the position of the chart legend. +} from "@thoughtspot/visual-embed-sdk"; +---- -// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit -// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit +=== Chart override settings -The following 16 settings are available in Phase 1 for all supported chart libraries: +For chart overrides, use the top-level object `chart` object and configure the following properties as needed: -[cols="1,2,3",options="header"] +[cols="2,5a"] |=== -|Setting |Scope |Notes - -|Colors -|Per-column color and legend series colors -|Applies to Highcharts and BYOC charts. Pass hex codes per `columnId`. - -|Number formatting -|Type, decimals, units, currency -|Applied on the backend. Column-level formatting; axis formatting is handled automatically. - -|Show or hide axis -|Axis name and axis labels (boolean per axis) -|Visualization-level override. - -|Axis scales and domains -|Min and max values per axis -|Visualization-level override. - -|Regression lines -|Boolean (enabled or disabled) -|Visualization-level override. - -|Show or hide data labels -|All labels or per-column -|To show all labels, set `allLabels: true`. - -|Filter data labels -|Column-level, with operator and value -|Supported operators: `Greater than`, `Less than`, `Equal to`, `Greater than or equal to`, -`Less than or equal to`. - -|Show or hide legend -|Boolean -|Visualization-level override. - -|Legend position -|`BOTTOM_LEGEND`, `LEFT_LEGEND`, `RIGHT_LEGEND`, `TOP_LEGEND` -|Visualization-level override. - -|Display summary (column summaries) -|Per-column or all columns -|Table-specific. Applied on the backend. - -|Table theme and content density -|Theme: `OUTLINE`, `ROW`, `ZEBRA`; Density: `COMPACT`, `REGULAR` -|Table-specific. Visualization-level override. - -|KPI comparison period -|Enum: comparison period type -|KPI chart-specific. Visualization-level override. - -|Sort type -|`Alphanumeric` or `Custom` -|Applied on the backend. - -|Show or hide gridlines -|Per axis (boolean) -|Visualization-level override. - -|Conditional formatting -|Column-level, gradient colors, operator and value -|Visualization-level override. - -|Pivot table totals and subtotals -|Row totals, column totals, row subtotals, column subtotals -|Pivot-specific. Visualization-level override. +|Property | Description + +|`legend` __Optional__ +|Object properties for setting visibility, position, and color palette of a legend. + +|`show` __Optional__ +|__Boolean__. Shows or hides the chart legend. + +|`position` __Optional__ +|__String__. Position of the legend relative to the chart. Valid values include: + +* `LegendPosition.Top` to position the legend above the chart. + +* `LegendPosition.Bottom` to positions the legend below the chart. + +* `LegendPosition.Left` to positions the legend to the left of the chart. + +* `LegendPosition.Right` to positions the legend to the right of the chart. + +|`colorPalette` __Optional__ +|Custom color palette properties for the legend. Overrides the default color sequence applied by ThoughtSpot. To customize color, specify the hex code in the `color` parameter. + +.5+|`dataLabel` __Optional__ +a|Data label visibility settings, including per-column label filters. + +a|`allLabels` + +__Boolean__. When `true`, shows data labels on all data points across all series. + +a| `stackLabels` + +__Boolean__. When `true`, shows cumulative total labels on stacked chart segments. + +a| `columnDataLabel` + +__Boolean__. Per-column data label visibility and filter threshold settings. For column data labels, you can define the following properties: + + +* `name`: __String__. Required parameter. Column name to apply the data label configuration to. + +* `visible`: __Boolean__. Optional parameter. Shows or hides data labels for this column. + +* `filter`: Optional parameter. Sets a filter threshold. When set, the labels are displayed only for data points that meet the filter condition. Define the following attributes to set a filter: + +a|For `filter`, include the following attributes: + + +* `value`: __Integer__. Threshold value for the filter comparison. + +* `operator`: __String__. Comparison operator for the threshold filter. Valid values for this attribute are: +** `DataLabelFilterOperator.GreaterThan` - Shows the label when value > threshold. + +** `DataLabelFilterOperator.LessThan` - shows the label when value < threshold. + +** `DataLabelFilterOperator.GreaterThanOrEqualTo` - shows the label when value ≥ threshold +** `DataLabelFilterOperator.LessThanOrEqualTo` - shows the label when value ≤ threshold. + +** `DataLabelFilterOperator.EqualTo` - shows the label when value = threshold. + +** `DataLabelFilterOperator.NotEqualTo` - shows the label when value is not equal to the threshold. + +.4+|`display` __Optional__ +|Object for chart display settings. +a|`summaries`+ +Row and column totals and grand totals. Applies to cross-tab (pivot) charts. Enable or disable the following settings as needed: + +* `showRowTotals`: __Boolean__. Shows a totals cell at the end of each row. +* `showColumnTotals`: __Boolean__. Shows a totals cell at the bottom of each column. +* `showRowGrandTotals`: __Boolean__. Shows a grand total row summarizing all rows. +* `showColumnGrandTotals`: __Boolean__. Shows a grand total column summarizing all columns. + +|`regressionLine` + +__Boolean__. When `true`, overlays a statistical regression (trend) line on the chart. + +a|`gridLine` + +__Optional__. Shows or hides grid lines on the chart. Specify the following attributes: + +* `x`: __Boolean__. When `true`, shows vertical grid lines along the x-axis. +* `y`: __Boolean__. When `true`, shows horizontal grid lines along the y-axis. + +.5+|`axis` __Optional__. a|Per-axis configurations. Each entry controls one axis group, identified by its linked columns. + +| `linkedColumns` + +__Array of strings__. Column names bound to this axis configuration. +| `showName` + +__Boolean__. Shows or hides the axis name label. +| `showLabelValue` + +__Boolean__. Shows or hides the value labels along the axis. +a| `yAxisRange` + +Sets the y-axis range to a specific minimum and maximum value. Use to enforce a consistent scale across embed instances. Valid values include: + +* `min`: __Integer__. Minimum value of the y-axis domain. +* `max`: __Integer__. Maximum value of the y-axis domain. + +.4+|`columns` +a|Per-column overrides: series color and conditional formatting rules. Include the following attributes: + +| `name` + +__String__. Column name to apply overrides to. + +| `color` + +__String__. Default series color for this column as a hex string. For example, `#1A73E8`. +a| `Conditional formatting` + +Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:charting-skills-embed.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. + +| `updateMaskPaths` | +__Array of strings__. Field mask for partial updates. Specifies which fields to apply when updating an existing visualization. Pass an empty array `[]` to apply all provided fields. +|| |=== -[NOTE] -==== -Axis configuration overrides—controlling field placement (x-axis, y-axis, slice-by-color) and -axis type (shared, dual, combined)—are planned for a future phase and are not available in -Phase 1. -==== +=== Table overrides +If the answers are in the table format, use the `table` object and define apply the following attributes: -== visualOverrides schema reference - -// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit +[cols="2,5a"] +|=== +|Property | Description +.3+| `columns` +a| Per-column overrides: visibility, text wrapping, and conditional formatting. +| `name` + +__String__. Column name to apply overrides to. +|`wrapText` + +__Boolean__. When `true`, wraps long cell content across multiple lines. When `false`, clips content to a single line. +| `show` + +__Boolean__. Show or hide the column in the table. +|`Conditional formatting` + +Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:charting-skills-embed.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. + +3+| `display` +a|Table-level display settings: theme and content density. + +a|`tableTheme` + +__String__. Visual theme for the table. Controls row borders, alternating row colors, and cell styling. Valid values are: + +* `TableTheme.Outline` to render the table with outer border and column header borders only. + +* `TableTheme.Row` to render the table with horizontal row dividers. + +* `TableTheme.Zebra` to render the table with alternating row background colors. + +a|`table.display.tableContentDensity` + +__String__. Row height and padding density of the table. + +Accepted values: + +`TableContentDensity.Regular` for standard row height with default padding. + +`TableContentDensity.Compact` for reduced row height and padding; displays more rows in the same vertical space. + +.3+|`displaySummaryConfig` |Controls whether column summary rows (totals and aggregations) are shown, with per-column exceptions. + +|`showAllSummaries` |__Boolean__. When `true`, shows summary rows (totals and aggregations) for all columns. Individual columns can be excluded using `columnVisibility`. +|`columnVisibility` a|__Boolean__. Shows or hides the summaries for the specified string in the `columnId`. + + +* `visible`. __Boolean__. Shows or hides the summary for this column. +* `columnId`. __String__. Column ID to control summary visibility for. + +|| +|=== -The `visualOverrides` object is included in the visualization object returned by the ThoughtSpot -API. The schema differs by visualization type. Use the `__typename` discriminator to identify -which schema applies. +=== Conditional formatting overrides +The conditional formatting properties can be configured in both chart and table override settings in the `columns` object. -// TODO: verify with engineering — confirm whether `visualOverrides` is passed directly via the -// Visual Embed SDK configuration object (for example, as a SearchEmbed option), or whether it -// must be applied via a separate REST API or GraphQL call post-session-creation. +[cols="2,5a"] +|=== +|Property | Description +.4+a| `Conditional formatting` + +Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. + +a|`operator`. + +__String__. Required parameter. Comparison operator that triggers the formatting rule. Valid values are: + +* `ConditionalFormattingOperator.Is` to set the exact cell value. + +* `ConditionalFormattingOperator.IsNot` to exclude a cell value. + +* `ConditionalFormattingOperator.Contains` to set cell value to a specified string. + +* `ConditionalFormattingOperator.DoesNotContain` to cell value does not contain the specified string. + +* `ConditionalFormattingOperator.StartsWith` to set a specific starting string for the cell value. + +* `ConditionalFormattingOperator.EndsWith` to set a cell value that ends with the specified string. + +* `ConditionalFormattingOperator.GreaterThan` to set a cell value greater than the specified value. + +* `ConditionalFormattingOperator.LessThan` to cell value is less than the specified value. + +* `ConditionalFormattingOperator.GreaterThanEqualTo` to cell value is greater than or equal to the specified value. + +* `ConditionalFormattingOperator.LessThanEqualTo` to cell value is less than or equal to the specified value. + +* `ConditionalFormattingOperator.EqualTo` to set a cell value that is equal to the specified value. + +* `ConditionalFormattingOperator.NotEqualTo` to set a cell value that is not exactly equal to the specified value. + +* `ConditionalFormattingOperator.IsBetween` to set a cell value that is between the defined range of values of values. + +* `ConditionalFormattingOperator.IsNull` to set a null value. + +* `ConditionalFormattingOperator.IsNotNull` to set a value that is not null. + +| `value` + +__String__. Literal value to compare against within a range of 0 to 1000000. Used when `comparisonType` is set as `ConditionalFormattingComparisonType.ValueBased` and the operator is set as `ConditionalFormattingOperator.IsBetween`. +| `comparisonType` + +__String__. Determines what the `operator` compares against. Valid values are: + +* `ConditionalFormattingComparisonType.ValueBased` to compare the column value against a literal string in `value`. + +* `ConditionalFormattingComparisonType.ColumnBased` to compares the column value against another column specified in `columnToCompare`. + +* `columnToCompare`: __String__. Column name to compare against (right-hand side). Used when `comparisonType` is `ConditionalFormattingComparisonType.ColumnBased`. +* `ConditionalFormattingComparisonType.ParameterBased` to compare the column value against a ThoughtSpot parameter specified in `comparisonParameterId`. +* `comparisonParameterId`: __String__. Parameter ID to compare against. Used when `comparisonType` is `ConditionalFormattingComparisonType.ParameterBased`. + +| `plotAsBand` + +__Boolean__. When `true`, draws a reference band across the chart area instead of coloring individual data points. + +| `isHighlightRow` + +__Boolean__. When `true`, applies the formatting to the entire table row instead of just the individual cell. + +| `lhsColumnId` + +__String__. The column whose value is evaluated against the rule (left-hand side of the comparison). +| `fontProperties` + +Text styling applied to the cell when the condition is met. Specify the following attributes: + +* `color`: __String__. Text color as a hex string. For example, `#ffffff`. +* `bold`: __Boolean__. When `true`, renders the text in bold. +* `italic`: __Boolean__. When `true`, renders the text in italic. +* `strikeThrough`: __Boolean__. When `true`, renders the text with a strikethrough. +* `underline`: __Boolean__. When `true`, renders the text with an underline. +* `backgroundFormatType`: __String__. Type of background fill to apply when the condition is met. Specify one of the following attributes: +** `BackgroundFormatType.Solid` to apply a flat solid fill color. Requires `solidBackgroundAttrs`. In the `solidBackgroundAttrs`, you can specify the fill color in the `color` attribute. +** `BackgroundFormatType.Gradient` to applies a gradient fill. Requires `gradientBackgroundAttrs`. In the `GradientBackgroundAttrs`: + +*** Specify an array of the Array of hex color strings defining the gradient stops in `colors`. +*** Specify the midpoint position of the gradient with a value range between 0 and 100. +*** Specify the numeric range values that map to the gradient color stops in `backgroundFormatRange`. +*** To scale the gradient range to the data minimum and maximum values, set `isAutoScaled` to `true`. +|| +|=== -=== Chart visualization (ChartVisualOverrides) +== Code sample +The following example shows the chart and table override settings for the new Answers generated from the embedded Search interface: -[source,typescript] +[source,JavaScript] ---- -visualOverrides: { - __typename: "ChartVisualOverrides", - - // Default color palette applied across the chart - defaults: { - colorPalette: { - colors: string[]; // Array of hex color codes, e.g. ["#FF0000", "#00FF00"] - }, - }, - - overrides: { - - // Legend configuration - legendProperties: { - showLegend: boolean, - position: LegendPositionOptions, // "BOTTOM_LEGEND" | "LEFT_LEGEND" | - // "RIGHT_LEGEND" | "TOP_LEGEND" - legendDataColors: SeriesColor[], // Per-attribute-value legend colors - }, - - // Data label configuration - dataLabelProperties: { - allLabels: boolean, // Show labels for all columns - stackLabelsProperties: { - isVisible: boolean, - }, - columnDataLabelProperties: [ - { - columnId: string, // GUID of the column - properties: { - isVisible: boolean, - filter: { - value: number, - operator: FilterOperator, // See FilterOperator enum - } | null, - }, - }, - ], - }, - - // Display-level properties - displayProperties: { - kpiDisplayProperties: { - customCompare: TupleType, // KPI comparison period enum value - }, - summariesState: { - showRowTotals: boolean, - showColumnTotals: boolean, - showRowGrandTotals: boolean, - showColumnGrandTotals: boolean, - }, - regressionLineProperties: { - enabled: boolean, - }, - gridLineProperties: { - xGridlineEnabled: boolean, - yGridlineEnabled: boolean, - }, +import { + init, // Core SDK initialization function. + AuthType, // for authentication type selection. + SearchEmbed, // Embeds the ThoughtSpot Search page into a host application. + ConditionalFormattingOperator, // Enum for conditional formatting comparison operators. + DataLabelFilterOperator, // Enum for data label filter operators. + ConditionalFormattingComparisonType, // Enum for conditional formatting comparison. + BackgroundFormatType, // Enum for the background fill type in conditional formatting rules. + TableTheme, // Enum for the visual theme of embedded tables. + TableContentDensity, // Enum for the row height and padding density of embedded tables. + LegendPosition, // Enum for the position of the chart legend. +} from "@thoughtspot/visual-embed-sdk"; + +init({ + thoughtSpotHost: '<ThoughtSpot Host>', // Replace with your application URL + authType: AuthType.None, +}); + +const embed = new SearchEmbed('#tsEmbed', { + frameParams: { + width: '100%', + height: '100%', }, + dataSource: "<data-source-id>", // Replace with your application URL + visualOverrides: { + chart: { + // Show or hide the chart legend, and set its position. + legend: { + show: true, + position: LegendPosition.Bottom, + }, + // Data labels to show on chart series. + dataLabel: { + // Show labels on all data points across all series. + allLabels: true, + // Show cumulative total labels on stacked chart segments. + stackLabels: true, + // Per-column label visibility and optional value filters. + // Use filters to suppress labels below or above a threshold. + columnDataLabel: [{ + name: 'Ship Mode', + visible: true, + // Only show the data label when the value is greater than 0 + filter: { + value: 0, + operator: DataLabelFilterOperator.GreaterThan + }, + }, + { + name: 'Discount', + // Hide data labels for this column entirely. + visible: false, + // No filter applied + filter: null, //label is hidden regardless of value. + }, + ], + }, + // chart display settings. + display: { + // Controls row/column summary rows on crosstab (pivot) charts. + summaries: { + showRowTotals: true, // Show totals at the end of each row. + showColumnTotals: false, // Hide totals at the bottom of each column. + showRowGrandTotals: true, // Show the grand total row. + showColumnGrandTotals: true, // Show the grand total column. + }, + // Show a statistical regression (trend) line on the chart. + regressionLine: true, + // Show or hide horizontal and vertical grid lines. + gridLine: { + x: true, // Show vertical grid lines (x-axis). + y: true, // Show horizontal grid lines (y-axis). + }, + }, - // Per-axis configuration - axisProperties: [ - { - columnId: string, // Column GUID identifying this axis - linkedColumns: string[], // Column GUIDs sharing this axis - properties: { - isNameVisible: boolean, - isLabelVisible: boolean, - yAxisRange: { - min: number | null, - max: number | null, - }, - isGridLineEnabled: boolean | null, - }, - }, - ], - - // Per-column visual configuration - columnProperties: [ - { - columnId: string, - properties: { - color: string, // Hex code, e.g. "#ababab" - conditionalFormatting: { - rows: ConditionalMetric[], - // TODO: verify with engineering — full ConditionalMetric schema - }, - }, - }, - ], - }, -} ----- - -=== Table visualization (TableVisualOverrides) - -[source,typescript] ----- -visualOverrides: { - __typename: "TableVisualOverrides", - - overrides: { - - // Per-column table settings - columnProperties: [ - { - columnId: string, - columnProperty: { - wrapColumnText: boolean, - isHidden: boolean, - conditionalFormatting: { - rows: ConditionalMetric[], - // TODO: verify with engineering — full ConditionalMetric schema - }, + // Each entry in this array configures one axis group. columns listed in "linkedColumns" share the same axis settings. + axis: [{ + // Columns bound to this axis configuration. + linkedColumns: ['Total Discount', 'Ship Mode'], + + // Show the axis name label. + showName: true, + + // Show tick mark value labels along the axis. + showLabelValue: true, + + // Fix the y-axis domain to a specific minimum/maximum range. + // Useful for enforcing a consistent scale across embed instances. + yAxisRange: { + min: 0, + max: 100, + }, + }, ], + // Per-column series color and conditional formatting rules. + columns: [{ + name: 'Total Discount', + // Default series color for this column (hex string). + color: '#ababab', + // Applies visual formatting rules to data points that meet the specified conditions. Each entry in rows[] is one rule. + conditionalFormatting: { + rows: [{ + // Trigger this rule when the cell value is greater than 3300. + operator: ConditionalFormattingOperator.GreaterThan, + value: '3300', + // When true, draws a reference band across the chart instead of coloring individual data points. + plotAsBand: true, + // Compare the column value against a literal value. + comparisonType: `ConditionalFormattingComparisonType.ValueBased`, + // The column whose value is evaluated against the rule. + lhsColumnId: 'Total Discount', + // Applied to cell text when the condition is met. + fontProperties: { + color: '#ffffff', // White text. + bold: true, + italic: false, + strikeThrough: false, + underline: false, + }, + // Use a solid fill color or a gradient fill. + backgroundFormatType: BackgroundFormatType.Solid + solidBackgroundAttrs: { + color: '#2E75F0', // Blue background when condition is met. + }, + + // For gradient fill, set "BackgroundFormatType.Gradient". + // backgroundFormatType: BackgroundFormatType.Gradient, + // gradientBackgroundAttrs: { + // colors: ['#000000', '#ffffff'], + // }, + }, ], + }, + }, ], + + // Field mask for partial updates. An empty array applies all provided fields. + updateMaskPaths: [], }, - }, - ], - - // Table display settings - displayProperties: { - tableTheme: TableTheme, // "OUTLINE" | "ROW" | "ZEBRA" - tableContentDensity: TableContentDensity,// "COMPACT" | "REGULAR" - }, - }, -} ----- - -=== KPI visualization (HeadlineVisualOverrides) - -[source,typescript] ----- -visualOverrides: { - __typename: "HeadlineVisualOverrides", - - overrides: { - columnProperty: { - conditionalFormatting: { - rows: ConditionalMetric[], - // TODO: verify with engineering — full ConditionalMetric schema - }, - summariesNumberFormatConfig: FormatConfig, - // TODO: verify with engineering — full FormatConfig schema - }, - }, -} ----- - -=== Enum reference - -// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit - -[source,typescript] ----- -enum LegendPositionOptions { - BottomLegend = 'BOTTOM_LEGEND', - LeftLegend = 'LEFT_LEGEND', - RightLegend = 'RIGHT_LEGEND', - TopLegend = 'TOP_LEGEND', -} - -enum TableTheme { - Outline = 'OUTLINE', - Row = 'ROW', - Zebra = 'ZEBRA', -} - -enum TableContentDensity { - Compact = 'COMPACT', - Regular = 'REGULAR', -} - -enum FilterOperator { - LessThan = 'Less than', - GreaterThan = 'Greater than', - LessThanOrEqualTo = 'Less than or equal to', - GreaterThanOrEqualTo = 'Greater than or equal to', - EqualTo = 'Equal to', -} - -enum TupleType { - Current = 'CURRENT', - PrevDay = 'PREV_DAY', - PrevHour = 'PREV_HOUR', - PrevWeek = 'PREV_WEEK', - PrevMonth = 'PREV_MONTH', - PrevQuarter = 'PREV_QUARTER', - PrevYear = 'PREV_YEAR', - PrevAvailable = 'PREV_AVAILABLE', - LastAvailable = 'LAST_AVAILABLE', - Custom = 'CUSTOM', - ChartAggregatedVal = 'CHART_AGGREGATED_VAL', - PreviousChartAggregatedVal = 'PREVIOUS_CHART_AGGREGATED_VAL', - SinglePointKpiCurrent = 'SINGLE_POINT_KPI_CURRENT', - SinglePointKpiPrevious = 'SINGLE_POINT_KPI_PREVIOUS', -} ----- - -== Usage examples - -// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit -// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit - -The following examples show representative `visualOverrides` configurations for common embed -use cases. - -// TODO: verify with engineering — replace the placeholder comments below with the confirmed -// Visual Embed SDK API for setting visualOverrides on SearchEmbed or SageEmbed (for example, -// as a top-level init parameter, embed option, or separate method call). - -=== Apply a brand color palette to all charts - -Use the `defaults.colorPalette` property to apply a fixed color sequence to all measures in the -chart. Colors are applied in order. - -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: { - colorPalette: { - colors: ["#1A73E8", "#E84235", "#FBBC04", "#34A853"], - }, - }, - overrides: {}, -}; - -// TODO: verify with engineering — confirm SDK usage pattern -// Pass visualOverrides via the Visual Embed SDK configuration ----- - -=== Enable data labels on all columns by default - -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: {}, - overrides: { - dataLabelProperties: { - allLabels: true, - }, - }, -}; ----- - -=== Show only data labels above a threshold value - -Show data labels only where revenue exceeds $1,000,000. Provide the `columnId` of the measure -column. - -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: {}, - overrides: { - dataLabelProperties: { - allLabels: false, - columnDataLabelProperties: [ - { - columnId: "<revenue-column-guid>", - properties: { - isVisible: true, - filter: { - value: 1000000, - operator: "Greater than", + table: { + // Per-column overrides for visibility, text wrapping, and conditional formatting. + columns: [{ + name: "Total Discount", // Column name + wrapText: true, // wrap long content across multiple lines + show: true, + // Conditional formatting rules to cells in this column. + conditionalFormatting: { + rows: [{ + // Trigger rule based on the cell value. Compares the column value against the literal string in `value`. + operator: ConditionalFormattingOperator.GreaterThan, + value: "3300", + // For value range-based matching condition, use `ConditionalFormattingOperator.IsBetween` and `rangeValues` + // operator: ConditionalFormattingOperator.IsBetween ('IS_BETWEEN'). + // rangeValues: { min: 0, max: 1000000 }, + // Apply e formatting to the entire table row instead of just the individual cell. + isHighlightRow: false, + comparisonType: ConditionalFormattingComparisonType.ValueBased, + // The column whose value is evaluated against the rule (left-hand side). + lhsColumnId: "Total Discount", + // Text styling applied to the cell when the condition is met. + fontProperties: { + color: "#ffffff", // White text. + bold: true, + italic: false, + strikeThrough: false, + underline: false, + }, + + // Use solid or gradient fill color for background styling + backgroundFormatType: BackgroundFormatType.Solid + solidBackgroundAttrs: { + color: "#2E75F0", //Solid fill color applied when the condition is met. + }, + }, ], + }, + }, + + // second column with no conditional formatting. + { + name: "Ship Mode", + wrapText: false, + show: true, + }, + ], + // Table-level display settings. + display: { + // Set the row height and padding density of the table. + tableContentDensity: TableContentDensity.Compact, // Use TableContentDensity.Regular for standard row height. + }, + displaySummaryConfig: { + // Show summary rows for all columns by default. + showAllSummaries: true, + // Per-column exceptions to showAllSummaries. + columnVisibility: [{ + columnId: "Total Discount", + visible: false + }, + { + columnId: "Total Extended Price", + visible: false + }, + ], }, - }, - }, - ], - }, - }, -}; ----- - -=== Set legend position and assign per-series colors - -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: {}, - overrides: { - legendProperties: { - showLegend: true, - position: "RIGHT_LEGEND", - legendDataColors: [ - { dataValue: "North", color: "#1A73E8" }, - { dataValue: "South", color: "#E84235" }, - { dataValue: "East", color: "#FBBC04" }, - { dataValue: "West", color: "#34A853" }, - ], - }, - }, -}; ----- - -=== Enable a regression line - -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: {}, - overrides: { - displayProperties: { - regressionLineProperties: { - enabled: true, - }, - }, - }, -}; ----- -=== Set axis range (min and max) + // Field mask for partial updates. An empty array applies all provided fields. + updateMaskPaths: [], -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: {}, - overrides: { - axisProperties: [ - { - columnId: "<revenue-column-guid>", - linkedColumns: ["<revenue-column-guid>"], - properties: { - isNameVisible: true, - isLabelVisible: true, - yAxisRange: { - min: 0, - max: 5000000, - }, - isGridLineEnabled: true, }, - }, - ], - }, -}; ----- - -=== Set table theme and content density - -[source,typescript] ----- -const visualOverrides = { - __typename: "TableVisualOverrides", - overrides: { - displayProperties: { - tableTheme: "ZEBRA", - tableContentDensity: "COMPACT", }, - }, -}; ----- - -=== Enable pivot table totals and subtotals +}); -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: {}, - overrides: { - displayProperties: { - summariesState: { - showRowTotals: true, - showColumnTotals: true, - showRowGrandTotals: true, - showColumnGrandTotals: false, - }, - }, - }, -}; +embed.render(); ---- -=== Set KPI comparison period - -[source,typescript] ----- -const visualOverrides = { - __typename: "ChartVisualOverrides", - defaults: {}, - overrides: { - displayProperties: { - kpiDisplayProperties: { - customCompare: "PREV_MONTH", - }, - }, - }, -}; ----- - -== Override precedence and user behavior - -// SOURCE: Design Doc https://docs.google.com/document/d/1-L4cQiAtH0TGXUUP_3g68GeMKf_uWMn11PTXfNOVFs0/edit -// SOURCE: Schema reference https://docs.google.com/document/d/1z0U4nNRNcOOJ7Aj-SeyEUkOMHAN52w2yPBz1S-cfTP8/edit - -Understanding how `visualOverrides` interact with saved chart state and user actions is important -for building predictable embedded experiences. - -[cols="1,2",options="header"] -|=== -|Scenario |Behavior - -|Override set, no saved chart state -|The override value is applied. The chart renders with the override settings. - -|Override set, saved chart state exists -|The override always wins. `visualOverrides` takes precedence over any value in `vizProp`. - -|User changes a setting that was overridden -|The override for that specific property is cleared. The user's manually applied value is -respected. Other overrides remain active. - -|Follow-up query in Spotter (context retained) -|Overrides are re-sent in the follow-up if the overridden property is not yet in `vizProp`, -or if an existing `vizProp` value needs to be overridden. - -|Visualization is persisted (saved to Liveboard) -|The override is resolved into `vizProp` and persisted. On reload, the chart renders from -`vizProp`, not from `visualOverrides`. -|=== - == Limitations // SOURCE: SCAL-299430 @@ -605,10 +481,10 @@ conditional formatting and other applicable properties. * *Text formatting:* Axis label, data-label, and tooltip text formatting are deferred from Phase 1 due to cross-library inconsistencies. -== Related resources +== Additional references + +* xref:embed-search.adoc[Embed Search page] +* xref:full-embed.adoc[Embed full application] +* xref:SearchViewConfig.adoc[SearchViewConfig] +* xref:AppViewConfig.adoc[AppViewConfig] -* xref:embed-search.adoc[Embed ThoughtSpot search] -// TODO: verify with engineering — add correct xref to Spotter embed page once confirmed -* xref:visual-embed-sdk.adoc[Visual Embed SDK reference] -* xref:chart-types.adoc[Supported chart types] -* link:https://developers.thoughtspot.com/[ThoughtSpot Developer Portal] diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index 5632e6cbd..c5a64bbb4 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -23,6 +23,7 @@ Embed ThoughtSpot in a web app * Embed token-based Search ** link:{{navprefix}}/search-embed[Embed Search] ** link:{{navprefix}}/embed-searchbar[Embed search bar] +** link:{{navprefix}}/visualization-overrides[Visualization overrides] * link:{{navprefix}}/react-app-embed[Embed with React components] [.sidebar-title] From 877442c3a1c3570d38d43bac94420b3cdef7d6fb Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Mon, 8 Jun 2026 10:23:26 +0530 Subject: [PATCH 47/61] deleted TO DO from changelog --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index a764ac797..00e71053a 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -21,21 +21,12 @@ Returns the authentication configuration for the specified auth type at cluster ==== Connection deactivate and activate API [beta betaBackground]^Beta^ // SOURCE: SCAL-294844, SCAL-294845, SCAL-278132 -// TODO: verify with engineering — confirm the exact endpoint paths for deactivate and activate operations + ThoughtSpot introduces REST API v2.0 endpoints to programmatically deactivate and activate data connections: -// TODO: verify with engineering — confirm endpoint paths, for example: -// `POST /api/rest/2.0/connections/{connection_identifier}/deactivate` -// `POST /api/rest/2.0/connections/{connection_identifier}/activate` * POST /api/rest/2.0/connections/{connection_identifier}/status + Deactivates or activates a connection. -//// -Deactivating a connection prevents all user-initiated queries and skips scheduled background jobs such as Sage indexing and row count statistics. -Activating a connection immediately restores query access and resumes scheduled jobs on their defined schedules. - -Required access: Administrator or Connection Owner. -//// === Answer report API enhancements [earlyAccess eaBackground]#Early Access# @@ -48,33 +39,26 @@ To export a pinned Answer, specify the `viz_guid` parameter in your API request. Exports from this endpoint inherently respect Liveboard-level filters, Runtime Filters, Column security rules, and JWT token context. + To export a specific personalized view of a pinned Answer, include the `personalised_view_identifier` parameter. -// TODO: verify with engineering — confirm exact parameter name casing and accepted value type (GUID, name, or both) for `personalised_view_identifier` Spotter Answer export:: // SOURCE: SCAL-236681, SCAL-306548 XLSX and PDF export formats are now supported for Spotter (conversational) Answers. -// TODO: verify with engineering — confirm if any limitations apply for chart-type Spotter Answers vs table-type Answers - Custom PNG dimensions:: // SOURCE: SCAL-236681, SCAL-306548 PNG exports now support custom dimensions via the following new parameters: + * `x_resolution` — Sets the export width in pixels. Valid range: 600–3840 px. * `y_resolution` — Sets the export height in pixels. Valid range: 600–3840 px. -+ -// TODO: verify with engineering — confirm whether `x_resolution` and `y_resolution` are top-level request body parameters or nested inside a `png_options` object Display scaling:: // SOURCE: SCAL-236681, SCAL-306548 -// TODO: verify with engineering — confirm the exact parameter name for the scaling percentage (for example, `scaling`, `scale_factor`, or `scaling_percent`) A new `scaling` parameter allows you to adjust the relative size of visual elements in PNG exports without cropping. Valid range: 80–500%. Automatic file naming:: // SOURCE: SCAL-236681, SCAL-306548 The API now automatically names exported files based on the Answer title and appends the correct file extension (`.png`, `.pdf`, `.csv`, or `.xlsx`). -// TODO: verify with engineering — confirm whether a caller-supplied filename overrides the automatic name Contact ThoughtSpot support to enable these settings for PNG downloads on your ThoughtSpot instance. For more information, see xref:data-report-v2-api.adoc#_answer_report_api[Answer report API documentation]. From 268fe02b7ae2a470c18f08737518da1e4648e5e4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Mon, 8 Jun 2026 14:28:06 +0530 Subject: [PATCH 48/61] edits --- modules/ROOT/pages/api-changelog.adoc | 45 ++++++++--------- .../ROOT/pages/customize-nav-full-embed.adoc | 3 ++ modules/ROOT/pages/embed-ai-analytics.adoc | 39 ++++++++++----- modules/ROOT/pages/embed-pinboard.adoc | 10 +++- modules/ROOT/pages/embed-spotter-agent.adoc | 7 +-- modules/ROOT/pages/embed-spotter.adoc | 44 ++++++++++++++++- modules/ROOT/pages/rest-api-java-sdk.adoc | 4 +- .../ROOT/pages/rest-api-sdk-typescript.adoc | 2 + modules/ROOT/pages/rest-api-v2-reference.adoc | 1 - modules/ROOT/pages/rest-apiv2-changelog.adoc | 6 +-- modules/ROOT/pages/spotter-agent-apis.adoc | 12 +---- .../pages/spotter-agent-instructions.adoc | 29 +++++------ modules/ROOT/pages/spotter-apis.adoc | 1 - .../ROOT/pages/spotter-nl-instructions.adoc | 2 +- ...g-skills-embed.adoc => viz-overrides.adoc} | 27 +++++----- modules/ROOT/pages/whats-new.adoc | 49 ++++++++++++++++++- src/configs/doc-configs.js | 12 ++--- 17 files changed, 189 insertions(+), 104 deletions(-) rename modules/ROOT/pages/{charting-skills-embed.adoc => viz-overrides.adoc} (93%) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 6676e24b8..9ff6d4eb5 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -15,30 +15,27 @@ This changelog lists only the changes introduced in the Visual Embed SDK. For in |[tag greenBackground]#NEW FEATURE# a| [discrete] ===== Visual overrides for charts and tables -The SDK introduces the `visualOverrides` parameter to allow host applications to customize chart and table visualization properties at embed time. +The SDK introduces the `visualOverrides` object in `SearchViewConfig` and +`AppViewConfig`, enabling embed developers to apply chart and table display +customizations to the new answers from an embedded Search data interface at initialization time. -* *Parameter*: `visualOverrides` + -* *Type*: `VisualizationOverrides` + -* *Supported embeds*: `AppEmbed`, `SearchEmbed` +The `visualOverrides` object provides the following customization controls to modify the chart and table display: -The `VisualizationOverrides` type accepts two optional sub-objects: +* `legend`: control legend visibility, position, and color palette of charts. +* `dataLabel` attribute for data labels and per-column label filters. +* `display` attributes for such as regression line overlay and grid line visibility in charts and table themes and content density in tables. +* `axis` property for axis name and label visibility and fixed y-axis range. +* `columns` property for per-column series color and conditional formatting rules. +* `updateMaskPaths` property for partial updates +* `columns` property for column visibility, text wrapping, conditional formatting, and column summary in tables. -`chart`:: -A `ChartOverrides` object to customize chart properties such as legend visibility, position, and column colors. +For more information, see xref:viz-overrides.adoc[Visualization overrides]. -`table`:: -A `TableOverrides` object to customize table display properties. +//|[tag greenBackground]#NEW FEATURE# a| +//[discrete] +//===== New charts library -|[tag greenBackground]#NEW FEATURE# a| -[discrete] -===== New charts library - -The SDK introduces the `newChartsLibrary` parameter to enable the new Muze charting library for embedded Liveboards and full application embedding. - -* *Parameter*: `newChartsLibrary` + -* *Type*: `boolean` + -* *Default*: `false` + -* *Supported embeds*: `AppEmbed`, `LiveboardEmbed` +//The SDK introduces the `newChartsLibrary` parameter to enable the new Muze charting library in Liveboard and full application embedding. |[tag greenBackground]#NEW FEATURE# a| [discrete] @@ -49,10 +46,10 @@ The SDK introduces the following event IDs and action ID to support programmatic Events:: * `EmbedEvent.RefreshLiveboardBrowserCache` + -Emitted when a user clicks the *Refresh* button in the Liveboard header to clear the browser cache. The event payload includes `{ liveboardId: string }`. +Emitted when a user clicks the *Refresh* button in the Liveboard header to clear the browser cache. * `HostEvent.RefreshLiveboardBrowserCache` + -Allows the host app to programmatically trigger a browser cache refresh for all ChartViz containers on the embedded Liveboard. +Allows the host application to programmatically trigger a browser cache refresh for all visualization containers on the embedded Liveboard. New action ID:: @@ -62,9 +59,7 @@ Action ID to control the visibility of the *Refresh* button that clears the brow |[tag greenBackground]#NEW FEATURE# a| [discrete] ===== Spotter file upload -The SDK introduces configuration parameters in `SpotterChatViewConfig` to enable and control file uploads in the embedded Spotter chat interface. - -New parameters in `SpotterChatViewConfig`:: +The SDK introduces the following configuration parameters in `SpotterChatViewConfig` to enable and control file uploads in the embedded Spotter chat interface. * `spotterFileUploadEnabled` + When set to `true`, enables the file upload feature in the Spotter chat panel. @@ -139,7 +134,7 @@ Note the following changes: EmbedEvent:: * `EmbedEvent.Subscribed` + -The SDK introduces the `EmbedEvent.Subscribed` to emit an event when a HostEvent listener is registered. You can use this event to safely dispatch host events during the initial load without race conditions. +The SDK introduces the `EmbedEvent.Subscribed` to emit an event when a HostEvent listener is registered. You can use this event to dispatch host events during the initial load without race conditions. This is particularly useful for Spotter, where host events such as `HostEvent.ResetSpotterConversation` may be triggered immediately after load. * `EmbedEvent.Error` + The `EmbedEvent.Error` now fires on HostEvent payload validation failures. * `EmbedEvent.ChangePersonalizedView` + diff --git a/modules/ROOT/pages/customize-nav-full-embed.adoc b/modules/ROOT/pages/customize-nav-full-embed.adoc index e7012e98b..c93072eea 100644 --- a/modules/ROOT/pages/customize-nav-full-embed.adoc +++ b/modules/ROOT/pages/customize-nav-full-embed.adoc @@ -125,6 +125,9 @@ const embed = new AppEmbed("#embed", { }); ---- +== Command palette availability in embed +In ThoughtSpot application, users can open the link:https://docs.thoughtspot.com/cloud/latest/thoughtspot-homepage#command-palette[command palette] by pressing kbd:[Cmd+K] on macOS or kbd:[Ctrl+K] on Windows to quickly navigate to objects and perform actions. However, when you embed ThoughtSpot, this feature is disabled and embedded pages include only the standard object search experience. + == Customize the left navigation panel on the home page In the V2 and V3 experience modes, the left navigation panel on the *Insights* > *Home* page includes menu items such as *Answers*, *Liveboards*, *SpotIQ Analysis*, *Monitor Subscriptions*, and more. You can hide this navigation panel by setting the `hideHomepageLeftNav` property to `true` in the SDK. Note that this attribute hides the left navigation only on the home page. diff --git a/modules/ROOT/pages/embed-ai-analytics.adoc b/modules/ROOT/pages/embed-ai-analytics.adoc index b247ed0df..6d52bf60b 100644 --- a/modules/ROOT/pages/embed-ai-analytics.adoc +++ b/modules/ROOT/pages/embed-ai-analytics.adoc @@ -14,7 +14,7 @@ ThoughtSpot supports three experience modes: Spotter Classic, Spotter Agent (Spo [options="header"] |==== |Version| Supported features -|Spotter 3 [tag purpleBackground]#Early Access# +|Spotter 3 a| Spotter 3 is the latest and most advanced version of Spotter. **Key features and user experience**: + @@ -123,7 +123,7 @@ The updated chat interface that provides a more intuitive and interactive analyt [tag redBackground tick]#x# Spotter 2 + [tag redBackground tick]#x# Spotter Classic -**Feature status**: Early Access. Available by default on instances that have Spotter 3 enabled. + +**Feature status**: Available by default on instances that have Spotter 3 enabled. + **Required settings**: Spotter 3 must be enabled at the instance level. + @@ -140,7 +140,7 @@ The thinking and reasoning UX in Spotter conversations shows step-by-step reason [tag greenBackground tick]#✓# Spotter 2 + [tag redBackground tick]#x# Spotter Classic + -**Feature status**: Early Access. Enabled by default on instances with Spotter 2 or Spotter 3 enabled. +**Feature status**: Enabled by default on instances with Spotter 2 or Spotter 3 enabled. **Required settings**: Spotter 2 or Spotter 3 experience must be enabled at the instance level. + **Embed SDK component**: Use `SpotterEmbed`. + @@ -204,7 +204,7 @@ Ability to function as a data-aware analyst, derive context data model, and perf [tag redBackground tick]#x# Spotter 2 + [tag redBackground tick]#x# Spotter Classic -**Feature status**: Early Access. Enabled by default if Spotter 3 is enabled on the instance. +**Feature status**: Enabled by default if Spotter 3 is enabled on the instance. **Required settings**: Spotter 3 experience must be enabled on the instance. @@ -221,7 +221,7 @@ Ability to ask questions to automatically generate explanations and identify key [tag greenBackground tick]#✓# Spotter 2 + [tag redBackground tick]#x# Spotter Classic -**Feature status**: Early Access. Disabled by default. +**Feature status**: Disabled by default. **Required settings**: Spotter 2 or Spotter 3 experience must be enabled on the instance. @@ -239,7 +239,7 @@ Automatic data source discovery and model selection by Spotter. [tag redBackground tick]#x# Spotter 2 + [tag redBackground tick]#x# Spotter Classic -**Feature status**: Early Access. Disabled by default. +**Feature status**: Disabled by default. **Required settings**: Spotter 3 experience and the *Auto-mode* feature must be enabled at the instance level. + @@ -247,6 +247,7 @@ Automatic data source discovery and model selection by Spotter. **Default state in embed**: Disabled by default. To enable this feature, set the `worksheetId` attribute to `auto_mode` in the SDK. When the Auto mode is enabled, the *Preview data* option in the conversation panel is hidden. + |link:https://docs.thoughtspot.com/cloud/latest/spotter-conversation-history[Chat history, window=_blank] + Saves Spotter conversations and allows reloading chat history with past conversations. @@ -256,30 +257,42 @@ Saves Spotter conversations and allows reloading chat history with past conversa [tag redBackground tick]#x# Spotter 2 + [tag redBackground tick]#x# Spotter Classic -**Feature status**: Early Access. Enabled by default if Spotter 3 is enabled on the instance. +**Feature status**: Enabled by default if Spotter 3 is enabled on the instance. **Required settings**: Spotter 3 experience and the *Chat history* feature must be enabled at the instance level. + **Embed SDK component**: Use `SpotterEmbed`. + -**Default state in embed**: Disabled by default. To enable this feature in the embed mode, set `enablePastConversationsSidebar` to `true` in the SDK. +**Default state in embed**: Disabled by default. To enable chat history, use `enablePastConversationsSidebar` within the `spotterSidebarConfig` object. + + +[NOTE] +==== +The standalone `enablePastConversationsSidebar` property on `SpotterEmbedViewConfig` is deprecated from Visual Embed SDK v1.47.0. Use `enablePastConversationsSidebar` within the `spotterSidebarConfig` object instead. When both are defined, the `spotterSidebarConfig` value takes precedence. +==== |link:https://docs.thoughtspot.com/cloud/latest/spotter-connectors-use[Third-party connectors and MCP tools, window=_blank] + Third-party tools and services that Spotter can connect to and interact with via Model Context Protocol (MCP). +|MCP connector controls in Spotter chat interface + -|**Supported Spotter version**: + +Action IDs to show or hide the MCP connector panel, connector resources section, and chat mode switcher in the embedded Spotter 3 interface. +|**Supported Spotter version**: + [tag greenBackground tick]#✓# Spotter 3 + [tag redBackground tick]#x# Spotter 2 + [tag redBackground tick]#x# Spotter Classic -**Feature status**: Early Access. Enabled by default if Spotter 3 is enabled on the instance. +**Feature status**: Available from SDK v1.48.0 and ThoughtSpot Cloud 26.5.0.cl. + -**Required settings**: Spotter 3 experience and Spotter connectors feature must be enabled on the instance. For connectors to be available in the embed mode, ThoughtSpot administrators must configure Spotter connectors. +**Required settings**: Spotter 3 must be enabled at the instance level. + -**Embed SDK component**: Use `SpotterEmbed`. + +**Embed SDK component**: Use `SpotterEmbed` + + +**Default state in embed**: Visible by default. Use the following action IDs to control visibility: + +* `Action.SpotterChatConnectorResources` +* `Action.SpotterChatConnectors` +* `Action.SpotterChatModeSwitcher` -**Default state in embed**: Visible by default if the `updatedSpotterChatPrompt` attribute is set to `true`. We do not recommend using this feature in your production environment. You can hide this option using the CSS selectors. For more information, see xref:embed-spotter.adoc#_mcp_connectors_and_resource_selection_icon[MCP connectors in Spotter embedding]. || |==== diff --git a/modules/ROOT/pages/embed-pinboard.adoc b/modules/ROOT/pages/embed-pinboard.adoc index d8a246b78..3213fcfab 100644 --- a/modules/ROOT/pages/embed-pinboard.adoc +++ b/modules/ROOT/pages/embed-pinboard.adoc @@ -255,11 +255,13 @@ For more information and examples, see xref:filters_overview.adoc[Filter types a Embedding application users can download Liveboards in the PDF, XLSX, and CSV formats. If the `isContinuousLiveboardPDFEnabled` is set to `true`, users can download the PDF with a continuous layout as seen in the UI, with each tab on a single page. When this parameter is set to `false`, users can download the Liveboard PDF in the A4 format with a paginated view. + [NOTE] ==== -Starting with the 26.5.0.cl and Visual Embed SDK version 1.48.x, the new multi-format download experience is available on embedded Liveboards and can be enabled using the `isContinuousLiveboardPDFEnabled` and `isLiveboardXLSXCSVDownloadEnabled` parameters. The `Download` action in the Liveboard's more options menu is controlled by `Action.DownloadLiveboard` instead of `Action.Download` and `Action.DownloadAsPdf`. +Starting with the 26.5.0.cl and Visual Embed SDK version 1.48.x, the new multi-format download experience is available on embedded Liveboards and can be enabled using the `isContinuousLiveboardPDFEnabled` and `isLiveboardXLSXCSVDownloadEnabled` parameters. The `Download` action in the Liveboard's more options menu is controlled by `Action.DownloadLiveboard` instead of `Action.Download` and `Action.DownloadAsPdf`. `Action.DownloadAsPdf` remains valid for controlling PDF download on individual visualizations (chart and table tiles) within a Liveboard. ==== + === Download actions and behavior [width=100%, cols="2,2,4"] @@ -285,6 +287,10 @@ a|`Action.DownloadLiveboardAsXlsx` - action ID to show or hide the XLSX option i a| `isLiveboardXLSXCSVDownloadEnabled` + Enables the XLSX and CSV download options in the Download modal. a|`Action.DownloadLiveboardAsCsv` - action ID to show, hide, or disable the CSV option in the **Download** modal. + +| PDF cover and filter pages +| None. UI options in PDF modal only. +a| Use `Action.CoverAndFilterOptionInPDF` to hide the checkboxes for including or excluding cover and filter pages in the Liveboard PDF download dialog. |===== === Example @@ -340,7 +346,7 @@ Use the HostEvent IDs to trigger download actions on an embedded Liveboard. * `HostEvent.DownloadLiveboardAsContinuousPDF` + To open the **Download** modal with the continuous PDF download option selected. * `HostEvent.DownloadAsPdf` + -To trigger the standard PDF (A4) download action. +To trigger the standard PDF (A4) download action. To download a specific Liveboard visualization, specify the GUID of visualization in the `vizId` key. * `HostEvent.DownloadAsXlsx` + To open the **Download** modal with the XLSX option selected when the `isLiveboardXLSXCSVDownloadEnabled` is enabled in the embed view. * `HostEvent.DownloadAsCsv` + diff --git a/modules/ROOT/pages/embed-spotter-agent.adoc b/modules/ROOT/pages/embed-spotter-agent.adoc index 3dbd95cf8..aeaeb8ffc 100644 --- a/modules/ROOT/pages/embed-spotter-agent.adoc +++ b/modules/ROOT/pages/embed-spotter-agent.adoc @@ -13,7 +13,7 @@ Spotter Agent is an embeddable AI analyst component from ThoughtSpot that enable Before you begin, check the following: * You have a ThoughtSpot instance with Spotter Agent enabled. -* You have access to the latest version of the Visual Embed SDK or at least v1.33.1. +* You have access to the latest version of the Visual Embed SDK v1.33.1 or later. * Your host application domain is added to ThoughtSpot CSP and CORS allowlists. == Import the SDK package @@ -62,9 +62,9 @@ init({ }); ---- -== Create an instance of the SpotterEmbed object +== Create an instance of the SpotterAgentEmbed object -Create an instance of the `SpotterEmbed` object and specify the data source ID. Optionally, you can specify the search query string to generate a chart or table at load time. +Create an instance of the `SpotterAgentEmbed` object and specify the data source ID. Optionally, the search query string to generate a chart or table at load time. [source,JavaScript] ---- @@ -77,6 +77,7 @@ const spotterAgentEmbed = new SpotterAgentEmbed(document.getElementById('ts-embe }); ---- + == Customization controls for the embed view (Optional) The embed package for Spotter includes the additional configuration flags to customize the Spotter Agent. Spotter Agent includes only the AI search experience with the Search bar by default. The interface design and styling is controlled by your host app. However, the SDK provides a few controls to customize search experience and app interactions. diff --git a/modules/ROOT/pages/embed-spotter.adoc b/modules/ROOT/pages/embed-spotter.adoc index d9221e1f8..e570489d9 100644 --- a/modules/ROOT/pages/embed-spotter.adoc +++ b/modules/ROOT/pages/embed-spotter.adoc @@ -14,7 +14,7 @@ To embed Spotter, you need the following access and setup: * Access to a ThoughtSpot instance with the Spotter feature. If you want a specific version of Spotter enabled, work with your ThoughtSpot administrator to enable the xref:embed-ai-analytics.adoc#_feature_status_and_availability_in_embed_mode[required features and settings] on your instance. * Your host application domain is added to xref:security-settings.adoc[ThoughtSpot CSP and CORS allowlists]. -* Your application project has access to the xref:api-changelog.adoc[latest version of the Visual Embed SDK]. + +* Your application project has access to the xref:api-changelog.adoc[latest version of the Visual Embed SDK]. [NOTE] ==== @@ -121,6 +121,18 @@ spotterEmbed.on(EmbedEvent.Init, showLoader); // Show loader when initialization spotterEmbed.on(EmbedEvent.Load, hideLoader); // Hide loader when embed is fully loaded ---- + +[source,JavaScript] +---- +// Use EmbedEvent.Subscribed to safely trigger a HostEvent on initial load +spotterEmbed.on(EmbedEvent.Subscribed, (eventData) => { + if (eventData.data.hostEventType === 'ResetSpotterConversation') { + spotterEmbed.trigger(HostEvent.ResetSpotterConversation); + } +}); +---- + + To trigger actions on the embedded interface, use the xref:HostEvent.adoc[Host events]. The following example shows the host event to reset a Spotter conversation session: @@ -232,6 +244,34 @@ The standalone `enablePastConversationsSidebar` attribute is deprecated in v1.47 ==== +==== Chat history panel + +To enable and customize the chat history sidebar, configure the chat history properties in the `spotterSidebarConfig` object: + +[source,JavaScript] +---- +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + // ... + worksheetId: '<%=datasourceGUID%>', + spotterSidebarConfig: { + enablePastConversationsSidebar: true, // Enable the chat history sidebar + spotterSidebarDefaultExpanded: true, // Expand the sidebar by default + spotterSidebarTitle: 'Chat History', // Custom sidebar header text + spotterNewChatButtonTitle: 'New Conversation', // Custom label for the New chat button + spotterChatRenameLabel: 'Rename session', // Custom label for the Rename action + spotterChatDeleteLabel: 'Delete session', // Custom label for the Delete action + spotterConversationsBatchSize: 20, // Conversations fetched per batch (default: 30) + spotterDocumentationUrl: 'https://your-help-center-url', // Custom best practices link + }, +}); +---- + +[NOTE] +==== +The standalone `enablePastConversationsSidebar` property on `SpotterEmbedViewConfig` is deprecated from Visual Embed SDK v1.47.0. Use the `enablePastConversationsSidebar` property within the `spotterSidebarConfig` object instead. When both properties are defined, the value in `spotterSidebarConfig` takes precedence. +==== + + ==== MCP connectors and resource selection icon A connector is an external MCP server or tool, such as Google Drive, Slack, Notion, Confluence, or Jira, which can be used as a data source in Spotter sessions. ThoughtSpot administrators can configure connectors to enable Spotter users to include both structured and unstructured data in their conversation sessions. @@ -365,7 +405,7 @@ import { } from '@thoughtspot/visual-embed-sdk'; spotterChatConfig: { - //Hide the default logo and label on tool response cards in Spotter chat UI + // Hide the default logo and label on tool response cards in Spotter chat UI hideToolResponseCardBranding: true, // Set a custom label to display as the branding on tool response cards toolResponseCardBrandingLabel: 'CompanyName', diff --git a/modules/ROOT/pages/rest-api-java-sdk.adoc b/modules/ROOT/pages/rest-api-java-sdk.adoc index 3fa7aa2e9..9042d1d51 100644 --- a/modules/ROOT/pages/rest-api-java-sdk.adoc +++ b/modules/ROOT/pages/rest-api-java-sdk.adoc @@ -216,7 +216,7 @@ public class Example { Make a test API call to test the integration and verify the response. -In this example, we'll use the `CreateUserRequest` object to create a user. +This example uses the `CreateUserRequest` object to create a user. [source, Java] ---- @@ -281,6 +281,8 @@ Note the recommendation of Java SDK: [options='header'] |==== |ThoughtSpot release version|Supported SDK version +a|ThoughtSpot Cloud: 26.6.0.cl | v2.25.0 or later +a|ThoughtSpot Cloud: 26.5.0.cl | v2.24.0 or later a|ThoughtSpot Cloud: 26.4.0.cl | v2.23.0 or later a|ThoughtSpot Cloud: 26.3.0.cl | v2.22.0 or later a|ThoughtSpot Cloud: 26.2.0.cl | v2.21.0 or later diff --git a/modules/ROOT/pages/rest-api-sdk-typescript.adoc b/modules/ROOT/pages/rest-api-sdk-typescript.adoc index e37f8da4b..ccb55b8ca 100644 --- a/modules/ROOT/pages/rest-api-sdk-typescript.adoc +++ b/modules/ROOT/pages/rest-api-sdk-typescript.adoc @@ -203,6 +203,8 @@ Note the version recommendations for your ThoughtSpot instances: [options='header'] |==== |ThoughtSpot release version|Recommended SDK version +a|ThoughtSpot Cloud: 26.6.0.cl | v2.25.0 or later +a|ThoughtSpot Cloud: 26.5.0.cl | v2.24.0 or later a|ThoughtSpot Cloud: 26.4.0.cl | v2.23.0 or later a|ThoughtSpot Cloud: 26.3.0.cl | v2.22.0 or later a|ThoughtSpot Cloud: 26.2.0.cl | v2.21.0 or later diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index b05d178a9..f59251b9c 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -76,7 +76,6 @@ Stops an in-progress Spotter agent response for a given conversation session. |ThoughtSpot Cloud: __26.6.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fstop-agent-response" id="preview-in-playground" >Try it out</a>+++ - a|`POST /api/rest/2.0/ai/instructions/set` + Sets NL instructions on a data model. |ThoughtSpot Cloud: __10.15.0.cl or later__ + diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 99954a5e8..028cbb292 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -10,9 +10,7 @@ This changelog lists the features and enhancements introduced in REST API v2.0. == Version 26.6.0.cl, June 2026 -// TODO: verify with engineering — confirm calendar month for 26.6.0.cl release - -=== Spotter agent instructions APIs +=== Spotter Agent instructions APIs The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. @@ -22,7 +20,7 @@ Sets behavioral instructions for the Spotter agent. Use this endpoint to define * `GET /api/rest/2.0/ai/agent/instructions/get` + Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. -For more information, see xref:spotter-agent-instructions.adoc[Spotter agent instructions APIs]. +For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. === Stop in-progress agent response diff --git a/modules/ROOT/pages/spotter-agent-apis.adoc b/modules/ROOT/pages/spotter-agent-apis.adoc index 99360adad..4b07695db 100644 --- a/modules/ROOT/pages/spotter-agent-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-apis.adoc @@ -1,4 +1,4 @@ -= AI APIs (Spotter Agent and Spotter 3) += Spotter Agent AIs :toc: true :toclevels: 2 @@ -1046,8 +1046,6 @@ The `/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response Use this endpoint when you want to cancel a long-running Spotter response before it completes. The conversation session remains active after you stop a response, so you can send a new query to the same session immediately. -// TODO: verify with engineering — confirm whether stopping a streaming response emits a final SSE event (for example, agent-interrupt) or closes the stream silently - === Request parameters [width="100%", cols="2,2,4"] @@ -1072,13 +1070,7 @@ curl -X POST \ === Example response -If the API request is successful, ThoughtSpot stops the in-progress response and returns an HTTP `200` status. - -// TODO: verify with engineering — confirm exact success response body -[source,JSON] ----- -{} ----- +If the API request is successful, ThoughtSpot stops the in-progress response and returns an 204 response code. If the conversation session is not found or has expired, the API returns an error: diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc index 4e045de21..09b16adc5 100644 --- a/modules/ROOT/pages/spotter-agent-instructions.adoc +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -1,19 +1,17 @@ -= Spotter agent instructions APIs += Spotter AI Agent instructions API :toc: true :toclevels: 2 -:page-title: Spotter agent instructions APIs +:page-title: Spotter Agent instructions APIs :page-pageid: spotter-agent-instructions :page-description: Use the Spotter agent instructions APIs to set and retrieve persistent behavioral guidance for the Spotter agent in a conversation session. -// SOURCE: spotter-apis.adoc — privilege pattern Administrators and developers can configure persistent behavioral instructions for the Spotter agent using the agent instructions APIs. These instructions guide how Spotter responds within a conversation context. For example, to focus on specific business domains, enforce response formats, or apply analytical constraints. Unlike xref:spotter-nl-instructions.adoc[NL coaching instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. [NOTE] ==== -// TODO: verify with engineering — confirm the exact privilege required: CAN_USE_SPOTTER, administrator, or a dedicated agent-instructions privilege To use the agent instructions APIs, you need `CAN_USE_SPOTTER` privilege and valid authentication. ==== @@ -36,9 +34,6 @@ The `PUT /api/rest/2.0/ai/agent/instructions/set` API endpoint sets behavioral i Use this endpoint to define persistent guidance that Spotter applies when responding to queries. Instructions persist until you overwrite or remove them by sending a new `PUT` request. -// TODO: verify with engineering — confirm the scope of instructions: global, per-user, or per-conversation -// TODO: verify with engineering — confirm maximum character length for the `instructions` field - === Request parameters [width="100%", cols="2,4"] @@ -53,7 +48,6 @@ Use natural language to define how Spotter should respond. For example: * `"Focus on revenue and margin metrics. Avoid referencing raw row counts unless the user asks."` * `"When a time period is not specified, default to the current fiscal quarter."` -// TODO: verify with engineering — confirm whether any additional request body parameters are accepted (for example, a scope or context identifier) |===== === Example request @@ -72,15 +66,17 @@ curl -X PUT \ === Example response -If the API request is successful, ThoughtSpot returns an HTTP `200` response. +If the API request is successful, ThoughtSpot returns an HTTP `200` response with the following agent instruction properties: -// TODO: verify with engineering — confirm exact success response body (empty object or a structured confirmation) -[source,JSON] ----- -{} ----- +If the request is successful, the response includes the saved AgentInstructions record: + +* `id`: unique identifier of the record +* `instructions`: the saved instructions text +* `created_at`: ISO timestamp when the instructions were first created +* `updated_at`: ISO timestamp of this update +* `last_updated_by`: user ID of the admin who performed this update -If the request fails, ThoughtSpot returns an error code and message. The following example shows an authorization error: +If the request fails, ThoughtSpot returns an error code and message. For example, if the REST client doesn't have the permission to set agent instructions, the following example shows an authorization error: [source,JSON] ---- @@ -94,8 +90,6 @@ If the request fails, ThoughtSpot returns an error code and message. The followi The `GET /api/rest/2.0/ai/agent/instructions/get` API endpoint retrieves the behavioral instructions currently configured for the Spotter agent. -// TODO: verify with engineering — confirm whether GET accepts any query parameters (for example, a conversation identifier or scope filter) - === Request parameters This endpoint does not require a request body or query parameters. @@ -123,7 +117,6 @@ If the API request is successful and instructions are configured, ThoughtSpot re If no instructions are configured, ThoughtSpot returns an empty value for the `instructions` field. -// TODO: verify with engineering — confirm whether the response returns null, an empty string (""), or omits the field entirely when no instructions are set [source,JSON] ---- { diff --git a/modules/ROOT/pages/spotter-apis.adoc b/modules/ROOT/pages/spotter-apis.adoc index 4f697f30c..88aab5c4a 100644 --- a/modules/ROOT/pages/spotter-apis.adoc +++ b/modules/ROOT/pages/spotter-apis.adoc @@ -13,7 +13,6 @@ The key capabilities of the Spotter APIs include the following: * Initiating and managing conversational sessions * Processing natural-language queries and interpreting user intent * Generating analytical responses, insights, and visualizations -//* Recommending relevant datasets or data sources * Decomposing complex user queries Spotter manages conversation sessions, context tracking, and response generation for user-submitted queries. The Spotter APIs are designed for use in Spotter-driven analytics and also for agentic interactions within an orchestrated agent framework. diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index 4a278c469..54c9a2de4 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -1,4 +1,4 @@ -= Spotter coaching APIs += Spotter instructions API :toc: true :toclevels: 2 diff --git a/modules/ROOT/pages/charting-skills-embed.adoc b/modules/ROOT/pages/viz-overrides.adoc similarity index 93% rename from modules/ROOT/pages/charting-skills-embed.adoc rename to modules/ROOT/pages/viz-overrides.adoc index f4e8494e4..c4218f0ec 100644 --- a/modules/ROOT/pages/charting-skills-embed.adoc +++ b/modules/ROOT/pages/viz-overrides.adoc @@ -14,7 +14,7 @@ The visualization overrides feature allows developers to pre-define the chart an Using the `visualOverrides` object, embed application developers can preset the following properties in the new answers retrieved from a search data query: * Chart properties, such as the legend position, data labels, axis ranges, column colors, conditional formatting, and grid lines -* table properties, including column visibility, text wrap, content density, and summary configuration +* Table properties, including column visibility, text wrap, content density, and summary configuration == Configuring visual overrides @@ -134,7 +134,7 @@ __String__. Column name to apply overrides to. + | `color` + __String__. Default series color for this column as a hex string. For example, `#1A73E8`. a| `Conditional formatting` + -Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:charting-skills-embed.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. +Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:viz-overrides.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. | `updateMaskPaths` | __Array of strings__. Field mask for partial updates. Specifies which fields to apply when updating an existing visualization. Pass an empty array `[]` to apply all provided fields. @@ -156,7 +156,7 @@ __Boolean__. When `true`, wraps long cell content across multiple lines. When `f | `show` + __Boolean__. Show or hide the column in the table. |`Conditional formatting` + -Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:charting-skills-embed.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. +Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:viz-overrides.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. 3+| `display` a|Table-level display settings: theme and content density. @@ -468,18 +468,15 @@ embed.render(); == Limitations -// SOURCE: SCAL-299430 -// SOURCE: PRD https://docs.google.com/document/d/1BQwTMZ2oeYe05Ca3wAuQrt4ATpZnVyGbfMuXV1sRdYc/edit - -* *Muze and BYOC charts:* Native override support for Muze charts is not available in Phase 1. -Color overrides route through `updateCustomVisualProps` for BYOC charts. -* *Axis configuration overrides:* Field placement controls (x-axis, y-axis, slice-by-color, -shared axis, dual axis) are not available in Phase 1. They are planned for a future release. -* *Excel export:* When a Liveboard is exported as XLSX and some visualizations have not been -rendered (lazy-loaded), overrides are applied at export time in the Excel exporter for -conditional formatting and other applicable properties. -* *Text formatting:* Axis label, data-label, and tooltip text formatting are deferred from -Phase 1 due to cross-library inconsistencies. +* Visual overrides cannot be applied to the existing saved answers or an answer with a modified search query. The overrides applied only to the new answers generated from the Search data interface. +* Visual overrides are not supported in Liveboard and Spotter embedding. +* Visual overrides do not control which fields are placed on the x-axis, y-axis, or slice-by-color. +It also does not control whether measures share a single axis or are placed on dual axes. +* Legend colors use a positional color palette and per-value mapping. Colors are applied in sequence to legend items in the order they appear in the chart. The overrides may not result in the exact legend item-to-color mapping by attribute value. +* Overrides cannot be modified via HostEvents. To change overrides after the component has rendered, create a new embed with the updated configuration. ThoughtSpot recommends testing the overrides on a development or test environment before applying them on production instances. +* Overrides do not create undo and redo history entries. Applying `visualOverrides` does not add entries to the answer's undo and redo history. Embedding application users cannot undo a visual override through the ThoughtSpot UI. +* Overrides do not trigger answer re-execution. Setting `visualOverrides` does not re-run the underlying query. Overrides are merged into the existing visualization configuration +after the answer is loaded, with no performance impact on query execution. == Additional references diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 4f19db00b..6b8e93e93 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -26,7 +26,7 @@ This page lists new features, enhancements, and deprecated functionality introdu == June 2026 **Release version**: ThoughtSpot Cloud 26.6.0.cl + -*Upgrade notes*: + +*Upgrade notes*: No breaking changes. + *Recommended SDK versions*: Visual Embed SDK v1.49.0 and later [.cl-table, cols="2,4", frame=none, grid=none] @@ -36,9 +36,54 @@ a| *Version 26.6.0.cl* a| +[discrete] +==== Chart and table overrides [.version-badge.new]#New# +You can now apply visualization overrides to charts and tables generated from a search query in ThoughtSpot search and full application embedding. The `visualOverrides` property in `SearchViewConfig` and `AppViewConfig` allows developers to apply at the embed initialization time: + +* Chart overrides + +Control legend visibility and position, data label display and per-column filter +thresholds, regression lines, grid lines, axis range and label settings, series +colors, and conditional formatting rules including font and background styling. +* Table overrides + +Control column visibility, text wrapping, row height and padding density, table +theme, and column summary visibility with per-column exceptions. + +For more information, see xref:viz-overrides.adoc[Configuring visualization overrides]. + +--- + +[discrete] +==== Spotter AI and embedding enhancements [.version-badge.new]#New# + +This release introduces the following enhancements for Spotter AI workflows and embedded Spotter applications. + +* Spotter embedding: + +Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. +* Spotter AI APIs: + +** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. +** New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. + +--- + +[discrete] +==== Developer page enhancements +The **Develop** page in the ThoughtSpot UI has been updated with the following enhancements: + +* The **Custom actions** list page now shows the code-based custom actions configured using the Visual Embed SDK. +* Removal of REST API v1 + +The legacy REST Playground v1 has been removed from the left navigation. This change does not affect your current integrations with v1 REST API. ThoughtSpot recommends that you update your integration workflows to use REST API v2. For more information, see xref:rest-api-v1v2-comparison.adoc[REST API v1 to v2 migration]. +* Removal of GraphQl playgrounds + +The menu link to the GraphQL playground has been removed from the UI. [discrete] -==== <feature title> +==== Visual Embed SDK +The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] +==== REST API v2 +This release introduces new Spotter API endpoints and modifications to the agent conversation APIs, and deprecates legacy agent endpoints. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. |===== diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index 73c1e96d1..54c9adcf5 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -22,8 +22,8 @@ module.exports = { // 'https://developers.thoughtspot.com/docs/26.3.0.cl?pageid=whats-new' // - GA: ' /docs/whats-new' //linkHref: '/docs/whats-new', - linkHref: '/docs/26.5.0.cl?pageid=whats-new', - linkText: 'Version 26.5.0.cl', + linkHref: '/docs/26.6.0.cl?pageid=whats-new', + linkText: 'Version 26.6.0.cl', openInNewTab: true, }, TYPE_DOC_PREFIX: 'typedoc', @@ -48,10 +48,10 @@ module.exports = { }, VERSION_DROPDOWN: [ { - label: '26.5.0.cl', - link: '26.5.0.cl', - subLabel: 'Cloud (Latest)', - iframeUrl: 'https://developer-docs-26-5-0-cl.vercel.app/docs/', + label: '26.6.0.cl', + link: '26.6.0.cl', + subLabel: 'Cloud (Now available)', + iframeUrl: 'https://developer-docs-26-6-0-cl.vercel.app/docs', }, ], CUSTOM_PAGE_ID: { From 12e1642ece7e72e90e33eacb4baa6980ce6f11b4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Wed, 27 May 2026 18:21:56 +0530 Subject: [PATCH 49/61] edits --- modules/ROOT/pages/timezone.adoc | 78 ++++++++++++++++--------------- modules/ROOT/pages/whats-new.adoc | 7 +-- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index 1401b706e..6c41c2209 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -2,19 +2,25 @@ :toc: true :toclevels: 2 -:page-title: Timezone awareness for embedded analytics +:page-title: Timezone-aware keywords and filters :page-pageid: timezone-aware-filtering :page-description: Configure per-Org and per-user timezone settings in embedded ThoughtSpot deployments using the Variable API, so that all relative date and time keywords resolve correctly for every user. :keywords: timezone, ts_user_timezone, Variable API, date keywords, embedded, TSE, Org timezone, user timezone [beta betaBackground]#Beta# -The timezone awareness feature in ThoughtSpot allows configuring a preferred time zone for a user or at the Org level, or both, and using this timezone when generating search results for a user's query. +The timezone awareness feature in ThoughtSpot allows you to configure a preferred timezone for a user or at the Org level, or both, and apply this timezone when generating search results for a user's query. == Overview In embedded deployments where users can span across multiple regions, date and time keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, resolve based on the default timezone of the ThoughtSpot instance. Sometimes, this can cause discrepancies for users in different timezones, especially when generating reports or filtering data for specific periods. For example, a user in the USA sees `today` as Sunday, whereas for a user in the APAC region, this could mean Monday, and they may expect data for Monday. -Timezone customization allows administrators to configure a timezone at the user or Org level, or both. When configured, all relative date and time keywords will resolve according to the user’s or Org’s configured timezone, rather than the default timezone on the ThoughtSpot system. This ensures that search results and reports display consistent and accurate time-based data for every user, regardless of their location. Using this feature, each Org can maintain its own independent timezone configuration, ensuring that the multi-Org embedded experience remains accurate and consistent for all users. +The timezone awareness feature eliminates timezone-based inconsistencies in multi-region embedded deployments and removes the need for custom workarounds. Using this feature, you can: + +* Assign a timezone for an Org using the Variable API. Each Org can maintain its own independent timezone configuration, ensuring that the multi-Org embedded experience remains accurate and consistent for all users. +* Override the timezone for individual users without affecting anyone else in the Org. +* Reference the timezone in passthrough formulas using `ts_var(ts_user_timezone)`, so the query results update automatically when the timezone changes. +* Ensure that timezone-aware filtering is applied consistently across search results, Spotter responses, Liveboard filters, Liveboard scheduled jobs, KPI Alerts, and SpotIQ analysis. + [NOTE] ==== @@ -23,15 +29,13 @@ The timezone awareness feature is currently in Beta and is disabled by default. === Timezone resolution -Administrators can set the timezone preference for a user or an Org using the `ts_user_timezone` system variable. In the 26.5.0.cl and 26.6.0.cl release versions, this variable can be configured only through the Variable REST APIs. - -If `ts_user_timezone` does not have a value assigned at the user or Org level, ThoughtSpot continues to use the cluster's default timezone. +Administrators can set the timezone preference for a user or an Org using the `ts_user_timezone` system variable. If `ts_user_timezone` does not have a value assigned at the user or Org level, ThoughtSpot continues to use the cluster's default timezone. At query time, ThoughtSpot resolves the correct timezone using the following precedence order: [cols="2,4", options="header"] |=== -|Timezone scope | Description +| Timezone scope | Description | User-level timezone | Individual override. Applies to that user only. @@ -48,19 +52,19 @@ When a user runs a search query or opens a Liveboard, ThoughtSpot evaluates this === Supported interfaces -Timezone-aware filtering and display is supported across the following ThoughtSpot interfaces: +Timezone-aware filtering and display are supported across the following ThoughtSpot interfaces: * Search Data * Spotter * Charts and Liveboards -* Liveboard Filters -* Liveboard Schedules -* KPI Alerts +* Liveboard filters +* Liveboard schedules +* KPI alerts * SpotIQ [#set-up-timezone-awareness] == Timezone configuration -Timezone awareness is determined by the built-in system variable, `ts_user_timezone`. This variable is provisioned automatically, but it has no effect until a value is assigned via the Variable API. To set or update the values for the timezone variable via REST APIs, the API user must have the `ADMINISTRATION` privilege and also the `CAN_MANAGE_VARIABLES` role privilege. +Timezone awareness is determined by the built-in system variable, `ts_user_timezone`. This variable is provisioned automatically, but it has no effect until a value is assigned via the Variable API. To set or update the values for the timezone variable via REST APIs, the API user must have the `ADMINISTRATION` privilege and the `CAN_MANAGE_VARIABLES` role privilege. === Supported strings for timezones @@ -78,22 +82,22 @@ UTC offset strings such as `UTC+5:30` or `GMT-8` are not supported. ==== === Supported calendar types -Timezone configuration can be applied to all types of calendar, including standard (Gregorian), fiscal, and custom calendars. +Timezone configuration can be applied to all calendar types, including standard (Gregorian), fiscal, and custom calendars. === Supported column types -Timezone configuration and variable assignment are applicable only to the columns with the `DATE` or `DATE_TIME` data type. +Timezone configuration and variable assignment are applicable only to columns with the `DATE` or `DATE_TIME` data type. === Assigning a timezone via REST API -To configure timezone preference for an Org, user, or both, use the `/api/rest/2.0/template/variables/{identifier}/update-values` API endpoint. +To configure a timezone preference for an Org, user, or both, use the `/api/rest/2.0/template/variables/{identifier}/update-values` API endpoint. -Specifying system variable:: +Specifying the system variable:: In your API request, specify `ts_user_timezone` as the variable `identifier` and include it as a path parameter. Supported operation type:: To add, replace, remove, or reset the timezone value, administrators can specify the operation type to one of the following values as needed: * `ADD` - Adds new values. -* `REMOVE` - Removes the values assigned to the variable. +* `REMOVE` - Removes the values assigned to the variable. * `REPLACE` - Replaces the values assigned to the variable. * `RESET` - Clears the values assigned to the variable for all entities. @@ -121,7 +125,7 @@ curl -X POST \ }' ---- -=== Configuring user-specific overrides +==== Configuring user-specific overrides To set a different timezone for an individual user, specify the user ID in your API request to the `/api/rest/2.0/template/variables/{identifier}/update-values` endpoint. @@ -201,7 +205,7 @@ The API returns a response with the values configured. "principal_identifier":"UserA", "model_identifier":null, "priority":null - } + }, { "value":"Europe/London", "value_list":null, @@ -229,16 +233,16 @@ The API returns a response with the values configured. ] ---- -== Specifying timezone in formula and passthrough functions -If your cloud data warehouse (CDW) stores timestamps in a different timezone than the user's timezone, date and datetime keywords and filters must be applied to a derived datetime column created using a passthrough formula. The original UTC column is not used directly. Users with edit access to data model can create a passthrough function to create a derived datetime column and convert source values to the target timezone. +== Specifying timezone in formulas and passthrough functions +If your cloud data warehouse (CDW) stores timestamps in a different timezone than the user's timezone, date and datetime keywords and filters must be applied to a derived datetime column created using a passthrough formula. The original UTC column is not used directly. Users with edit access to the data model can create a passthrough function to create a derived datetime column and convert source values to the target timezone. -=== Using timezone variable in formula +=== Using the timezone variable in formulas -If the `ts_user_timezone` variable is configured for the Org or user, you can reference it directly inside formulas and passthrough functions to dynamically resolve the timezone to the IANA timezone string assigned to the variable for that Org or user. Using this variable eliminates the need for using hardcoded values. +If the `ts_user_timezone` variable is configured for the Org or user, you can reference it directly inside formulas and passthrough functions to dynamically resolve the timezone to the IANA timezone string assigned to the variable for that Org or user. Using this variable eliminates the need for hardcoded values. The following example shows the formula syntax with the `ts_user_timezone` variable: -`sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), ts_var (ts_user_timezone),[<your_datetime_column>])` +`sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), ts_var (ts_user_timezone), [<your_datetime_column>])` Where: @@ -246,9 +250,9 @@ Where: * `sql_date_time_op` is the passthrough function for date/datetime operations. * `"CONVERT_TIMEZONE('UTC', '{0}', {1})"` is the SQL template string. ** `CONVERT_TIMEZONE` is the CDW function signature. This varies per CDW. For example, `CONVERT_TIMEZONE` in Snowflake and `CONVERT_TZ` for MySQL. -** `UTC` indicates source timezone, the original timezone of your timestamp. +** `UTC` indicates the source timezone, the original timezone of your timestamp. ** `{0}` is the placeholder for the first argument after the template string. In this example, it will be replaced by the `ts_user_timezone` variable value set for the user. -** `{1}` is placeholder for the date/datetime column. +** `{1}` is the placeholder for the date/datetime column. * `ts_var (ts_user_timezone)` is the variable placeholder for dynamic timezone conversion. * `[<your_datetime_column>]` is the name of the date/time column for the date/datetime conversion. @@ -258,8 +262,8 @@ On query execution, the formula translates to: * `CONVERT_TIMEZONE('UTC', 'America/New_York', "{your_datetime_column}")` for the user in the EST timezone, for whom the `ts_user_timezone` variable value is set to `America/New_York`. * `CONVERT_TIMEZONE('UTC', 'Asia/Kolkata', "{your_datetime_column}")` for the user in the IST timezone, for whom the `ts_user_timezone` variable value is set to `Asia/Kolkata`. -=== Using hardcoded timezone values in formula -In ThoughtSpot Cloud 26.5.0.cl and earlier release versions, the timezone value was hardcoded in formulas to convert source values to the user's timezone. For example: +=== Using hardcoded timezone values in formulas +In ThoughtSpot Cloud 26.5.0.cl and earlier release versions, the timezone value was hardcoded in formulas to convert source values to the user's timezone. For example: ---- sql_date_time_op ("CONVERT_TIMEZONE ('UTC', {0}, {1}"), '<time-zone-string>', [<your_datetime_column>]) @@ -270,29 +274,29 @@ Where: * `sql_date_time_op` is the passthrough function for date/datetime operations. * `"CONVERT_TIMEZONE('UTC', '{0}', {1})"` is the SQL template string. ** `CONVERT_TIMEZONE` is the CDW function signature. This varies per CDW. For example, `CONVERT_TIMEZONE` in Snowflake and `CONVERT_TZ` for MySQL. -** `UTC` indicates source timezone, the original timezone of your timestamp. -** `{0}` is the placeholder for the first argument after the template string. In the above example, it indicates the target timezone and is replaced by a hardcoded timezone string. -** `{1}` is placeholder for the date/datetime column. +** `UTC` indicates the source timezone, the original timezone of your timestamp. +** `{0}` is the placeholder for the first argument after the template string. In this example, it indicates the target timezone and is replaced by a hardcoded timezone string. +** `{1}` is the placeholder for the date/datetime column. * `<time-zone-string>` represents the hardcoded timezone string. For example, `Asia/Kolkata`. * `[<your_datetime_column>]` is the date/time column that you want to convert. This will replace the original date/datetime column source. -On query execution, the formula converts the date/datetime values as per the hardcoded timezone string for the given date/datetime column. +On query execution, the formula converts the date/datetime values according to the hardcoded timezone string for the given date/datetime column. -== Verify the configuration +== Verifying the configuration To verify the configuration: * Use the Variable API search endpoint (`/api/rest/2.0/template/variables/search`) to retrieve and confirm the values configured for the Org and user. * Query the date or datetime columns in your data and verify whether the date and time keywords resolve correctly as defined in the `ts_user_timezone` variable. * Verify whether the SQL passthrough function is applied to the keyword filters, such as `today`, `yesterday`, `last 7 days`, and `month-to-date`, in the data model. -* Switch to another Org which has a different timezone configured, run a search query, and verify the results. +* Switch to another Org that has a different timezone configured, run a search query, and verify the results. * Verify whether the timezone configured for the user overrides the timezone set for the Org and system default on the ThoughtSpot instance. * Verify the Liveboard scheduled jobs. Note that the timezone changes will be applied only to the upcoming scheduled job executions. == Additional resources -* For information about variable APIs, see xref:variables-api.adoc[Variable API reference] documentation and visit the link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fvariable%2Fput-variable-values[REST API Playground]. -* For more information about SQL passthrough functions, see link:https://docs.thoughtspot.com/cloud/26.5.0.cl/formula-reference#passthrough-functions[Formula function reference, window=_blank]. -* For information about the IANA timezone strings, refer to link:https://www.iana.org/time-zones[IANA Timezone Database^]. \ No newline at end of file +* For information about variable APIs, see xref:variables-api.adoc[Variable API reference] and visit the link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fvariable%2Fput-variable-values[REST API Playground]. +* For more information about SQL passthrough functions, see link:https://docs.thoughtspot.com/cloud/latest/formula-reference#passthrough-functions[Formula function reference^]. +* For information about the IANA timezone strings, see link:https://www.iana.org/time-zones[IANA Timezone Database^]. \ No newline at end of file diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 6b8e93e93..fd7c64262 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -145,12 +145,9 @@ For multi-org and multi-tenant environments, each tenant org and user can be con [discrete] ==== Timezone-aware keyword filtering [beta betaBackground]^Beta^ -ThoughtSpot now supports resolving relative date and time keywords, such as `today`, `yesterday`, and `last 7 days`, using a configurable per-user or per-Org timezone, instead of the system default timezone on a ThoughtSpot instance. This feature eliminates timezone-based inconsistencies in multi-region embedded deployments and removes the need for custom workarounds. It also allows you to: +ThoughtSpot now supports resolving relative date and time keywords, such as `today`, `yesterday`, and `last 7 days`, using a configurable per-user or per-Org timezone, instead of the system default timezone on a ThoughtSpot instance. This feature eliminates timezone-based inconsistencies in multi-region embedded deployments and removes the need for custom workarounds. -* Assign a timezone for an Org using the Variable API. -* Override the timezone for individual users without affecting anyone else in the Org. -* Reference the active timezone directly in passthrough formulas using `ts_var(ts_user_timezone)`, so the query results update automatically when the timezone changes. -* Ensure that timezone-aware filtering is applied consistently across search results, Spotter responses, Liveboard filters, Liveboard scheduled jobs, KPI Alerts, and SpotIQ analysis. +For more information, see xref:timezone.adoc[Timezone-aware keywords and filters]. [NOTE] ==== From 8395007d10f209bc9667b503ccdff3223dba8fb0 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Mon, 8 Jun 2026 15:32:40 +0530 Subject: [PATCH 50/61] formatting fixes --- modules/ROOT/pages/viz-overrides.adoc | 77 +++++++++++++-------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/modules/ROOT/pages/viz-overrides.adoc b/modules/ROOT/pages/viz-overrides.adoc index c4218f0ec..373e4ac73 100644 --- a/modules/ROOT/pages/viz-overrides.adoc +++ b/modules/ROOT/pages/viz-overrides.adoc @@ -9,7 +9,7 @@ The Visual Embed SDK allows you to apply visual styling overrides programmatically to the charts and tables generated from Search data queries in an embedded app. == Overview -The visualization overrides feature allows developers to pre-define the chart and table settings for their embedding application users and apply these overrides at load time. This eliminates the need for embedding application users manually adjusting charts and tables in the edit mode. +The visualization overrides feature allows developers to pre-define the chart and table settings for their embedding application users and apply these overrides at load time. This eliminates the need for embedding application users to manually adjust charts and tables in the edit mode. Using the `visualOverrides` object, embed application developers can preset the following properties in the new answers retrieved from a search data query: @@ -21,7 +21,7 @@ Using the `visualOverrides` object, embed application developers can preset the The `visualOverrides` object in the `VisualizationOverrides` interface lets you apply styling overrides to charts and tables generated in the embedded ThoughtSpot Search interface. These overrides can be categorized as: * Visualization-level overrides that affect settings such as legend visibility, data labels, axis ranges, colors, gridlines, and conditional formatting on a chart. -* column-level overrides applied such as number formatting, headline visibility, and sort order in a table. +* Column-level overrides applied such as number formatting, headline visibility, and sort order in a table. Within `visualOverrides`, the chart and table settings can be applied in the `chart` and `table` objects. @@ -45,7 +45,7 @@ import { === Chart override settings -For chart overrides, use the top-level object `chart` object and configure the following properties as needed: +For chart overrides, use the top-level `chart` object and configure the following properties as needed: [cols="2,5a"] |=== @@ -60,10 +60,10 @@ For chart overrides, use the top-level object `chart` object and configure the f |`position` __Optional__ |__String__. Position of the legend relative to the chart. Valid values include: -* `LegendPosition.Top` to position the legend above the chart. + -* `LegendPosition.Bottom` to positions the legend below the chart. + -* `LegendPosition.Left` to positions the legend to the left of the chart. + -* `LegendPosition.Right` to positions the legend to the right of the chart. +* `LegendPosition.Top` to position the legend at the top of the chart. + +* `LegendPosition.Bottom` to position the legend at the bottom of the chart. + +* `LegendPosition.Left` to position the legend at the left of the chart. + +* `LegendPosition.Right` to position the legend at the right of the chart. |`colorPalette` __Optional__ |Custom color palette properties for the legend. Overrides the default color sequence applied by ThoughtSpot. To customize color, specify the hex code in the `color` parameter. @@ -87,15 +87,15 @@ a|For `filter`, include the following attributes: + * `value`: __Integer__. Threshold value for the filter comparison. + * `operator`: __String__. Comparison operator for the threshold filter. Valid values for this attribute are: ** `DataLabelFilterOperator.GreaterThan` - Shows the label when value > threshold. + -** `DataLabelFilterOperator.LessThan` - shows the label when value < threshold. + -** `DataLabelFilterOperator.GreaterThanOrEqualTo` - shows the label when value ≥ threshold -** `DataLabelFilterOperator.LessThanOrEqualTo` - shows the label when value ≤ threshold. + -** `DataLabelFilterOperator.EqualTo` - shows the label when value = threshold. + -** `DataLabelFilterOperator.NotEqualTo` - shows the label when value is not equal to the threshold. +** `DataLabelFilterOperator.LessThan` - Shows the label when value < threshold. + +** `DataLabelFilterOperator.GreaterThanOrEqualTo` - Shows the label when value ≥ threshold. + +** `DataLabelFilterOperator.LessThanOrEqualTo` - Shows the label when value ≤ threshold. + +** `DataLabelFilterOperator.EqualTo` - Shows the label when value = threshold. + +** `DataLabelFilterOperator.NotEqualTo` - Shows the label when value is not equal to the threshold. .4+|`display` __Optional__ |Object for chart display settings. -a|`summaries`+ +a|`summaries` + Row and column totals and grand totals. Applies to cross-tab (pivot) charts. Enable or disable the following settings as needed: * `showRowTotals`: __Boolean__. Shows a totals cell at the end of each row. @@ -133,8 +133,8 @@ a|Per-column overrides: series color and conditional formatting rules. Include t __String__. Column name to apply overrides to. + | `color` + __String__. Default series color for this column as a hex string. For example, `#1A73E8`. -a| `Conditional formatting` + -Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:viz-overrides.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. +a| `conditionalFormatting` + +Conditional formatting rules applied to data points in this column. Specify the following properties as needed. To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:viz-overrides.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. | `updateMaskPaths` | __Array of strings__. Field mask for partial updates. Specifies which fields to apply when updating an existing visualization. Pass an empty array `[]` to apply all provided fields. @@ -142,7 +142,7 @@ __Array of strings__. Field mask for partial updates. Specifies which fields to |=== === Table overrides -If the answers are in the table format, use the `table` object and define apply the following attributes: +If the answers are in the table format, use the `table` object and define the following attributes: [cols="2,5a"] |=== @@ -156,7 +156,7 @@ __Boolean__. When `true`, wraps long cell content across multiple lines. When `f | `show` + __Boolean__. Show or hide the column in the table. |`Conditional formatting` + -Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:viz-overrides.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. +Conditional formatting rules applied to data points in this column. Specify the following properties as needed. To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. For more information, see xref:viz-overrides.adoc#_conditional_formatting_overrides[Conditional formatting overrides]. 3+| `display` a|Table-level display settings: theme and content density. @@ -168,7 +168,7 @@ __String__. Visual theme for the table. Controls row borders, alternating row co * `TableTheme.Row` to render the table with horizontal row dividers. + * `TableTheme.Zebra` to render the table with alternating row background colors. -a|`table.display.tableContentDensity` + +a|`tableContentDensity` + __String__. Row height and padding density of the table. + Accepted values: + `TableContentDensity.Regular` for standard row height with default padding. + @@ -191,8 +191,8 @@ The conditional formatting properties can be configured in both chart and table [cols="2,5a"] |=== |Property | Description -.4+a| `Conditional formatting` + -Conditional formatting rules applied to data points in this column. Specify the following properties as needed: To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. +.8+a| `conditionalFormatting` | +Conditional formatting rules applied to data points in this column. Specify the following properties as needed. To apply conditional formatting, set an array of rules in the `rows` object. Each rule is evaluated independently; the first matching rule is applied. a|`operator`. + __String__. Required parameter. Comparison operator that triggers the formatting rule. Valid values are: @@ -200,22 +200,22 @@ __String__. Required parameter. Comparison operator that triggers the formatting * `ConditionalFormattingOperator.Is` to set the exact cell value. + * `ConditionalFormattingOperator.IsNot` to exclude a cell value. + * `ConditionalFormattingOperator.Contains` to set cell value to a specified string. + -* `ConditionalFormattingOperator.DoesNotContain` to cell value does not contain the specified string. + +* `ConditionalFormattingOperator.DoesNotContain` to set a cell value that does not contain the specified string. + * `ConditionalFormattingOperator.StartsWith` to set a specific starting string for the cell value. + * `ConditionalFormattingOperator.EndsWith` to set a cell value that ends with the specified string. + * `ConditionalFormattingOperator.GreaterThan` to set a cell value greater than the specified value. + -* `ConditionalFormattingOperator.LessThan` to cell value is less than the specified value. + -* `ConditionalFormattingOperator.GreaterThanEqualTo` to cell value is greater than or equal to the specified value. + -* `ConditionalFormattingOperator.LessThanEqualTo` to cell value is less than or equal to the specified value. + +* `ConditionalFormattingOperator.LessThan` to set a cell value that is less than the specified value. + +* `ConditionalFormattingOperator.GreaterThanEqualTo` to set a cell value that is greater than or equal to the specified value. + +* `ConditionalFormattingOperator.LessThanEqualTo` to set a cell value that is less than or equal to the specified value. + * `ConditionalFormattingOperator.EqualTo` to set a cell value that is equal to the specified value. + * `ConditionalFormattingOperator.NotEqualTo` to set a cell value that is not exactly equal to the specified value. + -* `ConditionalFormattingOperator.IsBetween` to set a cell value that is between the defined range of values of values. + +* `ConditionalFormattingOperator.IsBetween` to set a cell value that is between the defined range of values. + * `ConditionalFormattingOperator.IsNull` to set a null value. + * `ConditionalFormattingOperator.IsNotNull` to set a value that is not null. -| `value` + +a| `value` + __String__. Literal value to compare against within a range of 0 to 1000000. Used when `comparisonType` is set as `ConditionalFormattingComparisonType.ValueBased` and the operator is set as `ConditionalFormattingOperator.IsBetween`. -| `comparisonType` + +a| `comparisonType` + __String__. Determines what the `operator` compares against. Valid values are: * `ConditionalFormattingComparisonType.ValueBased` to compare the column value against a literal string in `value`. + @@ -227,12 +227,12 @@ __String__. Determines what the `operator` compares against. Valid values are: | `plotAsBand` + __Boolean__. When `true`, draws a reference band across the chart area instead of coloring individual data points. -| `isHighlightRow` + +a| `isHighlightRow` + __Boolean__. When `true`, applies the formatting to the entire table row instead of just the individual cell. -| `lhsColumnId` + +a| `lhsColumnId` + __String__. The column whose value is evaluated against the rule (left-hand side of the comparison). -| `fontProperties` + +a| `fontProperties` + Text styling applied to the cell when the condition is met. Specify the following attributes: * `color`: __String__. Text color as a hex string. For example, `#ffffff`. @@ -242,8 +242,8 @@ Text styling applied to the cell when the condition is met. Specify the followin * `underline`: __Boolean__. When `true`, renders the text with an underline. * `backgroundFormatType`: __String__. Type of background fill to apply when the condition is met. Specify one of the following attributes: ** `BackgroundFormatType.Solid` to apply a flat solid fill color. Requires `solidBackgroundAttrs`. In the `solidBackgroundAttrs`, you can specify the fill color in the `color` attribute. -** `BackgroundFormatType.Gradient` to applies a gradient fill. Requires `gradientBackgroundAttrs`. In the `GradientBackgroundAttrs`: + -*** Specify an array of the Array of hex color strings defining the gradient stops in `colors`. +** `BackgroundFormatType.Gradient` to apply a gradient fill. Requires `gradientBackgroundAttrs`. In the `GradientBackgroundAttrs`: + +*** Specify an array of hex color strings defining the gradient stops in `colors`. *** Specify the midpoint position of the gradient with a value range between 0 and 100. *** Specify the numeric range values that map to the gradient color stops in `backgroundFormatRange`. *** To scale the gradient range to the data minimum and maximum values, set `isAutoScaled` to `true`. @@ -362,7 +362,7 @@ const embed = new SearchEmbed('#tsEmbed', { // When true, draws a reference band across the chart instead of coloring individual data points. plotAsBand: true, // Compare the column value against a literal value. - comparisonType: `ConditionalFormattingComparisonType.ValueBased`, + comparisonType: ConditionalFormattingComparisonType.ValueBased, // The column whose value is evaluated against the rule. lhsColumnId: 'Total Discount', // Applied to cell text when the condition is met. @@ -374,7 +374,7 @@ const embed = new SearchEmbed('#tsEmbed', { underline: false, }, // Use a solid fill color or a gradient fill. - backgroundFormatType: BackgroundFormatType.Solid + backgroundFormatType: BackgroundFormatType.Solid, solidBackgroundAttrs: { color: '#2E75F0', // Blue background when condition is met. }, @@ -406,7 +406,7 @@ const embed = new SearchEmbed('#tsEmbed', { // For value range-based matching condition, use `ConditionalFormattingOperator.IsBetween` and `rangeValues` // operator: ConditionalFormattingOperator.IsBetween ('IS_BETWEEN'). // rangeValues: { min: 0, max: 1000000 }, - // Apply e formatting to the entire table row instead of just the individual cell. + // Apply formatting to the entire table row instead of just the individual cell. isHighlightRow: false, comparisonType: ConditionalFormattingComparisonType.ValueBased, // The column whose value is evaluated against the rule (left-hand side). @@ -421,7 +421,7 @@ const embed = new SearchEmbed('#tsEmbed', { }, // Use solid or gradient fill color for background styling - backgroundFormatType: BackgroundFormatType.Solid + backgroundFormatType: BackgroundFormatType.Solid, solidBackgroundAttrs: { color: "#2E75F0", //Solid fill color applied when the condition is met. }, @@ -468,10 +468,9 @@ embed.render(); == Limitations -* Visual overrides cannot be applied to the existing saved answers or an answer with a modified search query. The overrides applied only to the new answers generated from the Search data interface. +* Visual overrides cannot be applied to the existing saved answers or an answer with a modified search query. The overrides apply only to the new answers generated from the Search data interface. * Visual overrides are not supported in Liveboard and Spotter embedding. -* Visual overrides do not control which fields are placed on the x-axis, y-axis, or slice-by-color. -It also does not control whether measures share a single axis or are placed on dual axes. +* Visual overrides do not control which fields are placed on the x-axis, y-axis, or slice-by-color. They also do not control whether measures share a single axis or are placed on dual axes. * Legend colors use a positional color palette and per-value mapping. Colors are applied in sequence to legend items in the order they appear in the chart. The overrides may not result in the exact legend item-to-color mapping by attribute value. * Overrides cannot be modified via HostEvents. To change overrides after the component has rendered, create a new embed with the updated configuration. ThoughtSpot recommends testing the overrides on a development or test environment before applying them on production instances. * Overrides do not create undo and redo history entries. Applying `visualOverrides` does not add entries to the answer's undo and redo history. Embedding application users cannot undo a visual override through the ThoughtSpot UI. From b7e69028a3c666a51e6d56a07b49059a65c09064 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 01:17:24 +0530 Subject: [PATCH 51/61] Spotter mcp server updates --- .../ROOT/pages/ai-integration-options.adoc | 8 ++-- modules/ROOT/pages/common/nav-mcp-server.adoc | 6 +-- modules/ROOT/pages/common/nav.adoc | 2 +- modules/ROOT/pages/home.adoc | 4 +- .../pages/mcp-connect-custom-chatbot.adoc | 18 ++++---- modules/ROOT/pages/mcp-integration.adoc | 28 ++++++------ modules/ROOT/pages/mcp-server-changelog.adoc | 14 +++--- .../pages/mcp-server-client-connection.adoc | 8 ++-- modules/ROOT/pages/mcp-server-spotter3.adoc | 2 +- .../ROOT/pages/mcp-tool-reference-guide.adoc | 2 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 44 +++++++++---------- .../ROOT/pages/spottercode-integration.adoc | 2 +- modules/ROOT/pages/whats-new.adoc | 6 +-- 13 files changed, 70 insertions(+), 74 deletions(-) diff --git a/modules/ROOT/pages/ai-integration-options.adoc b/modules/ROOT/pages/ai-integration-options.adoc index ec760fd73..dfa4d3837 100644 --- a/modules/ROOT/pages/ai-integration-options.adoc +++ b/modules/ROOT/pages/ai-integration-options.adoc @@ -21,16 +21,16 @@ The primary ways to integrate ThoughtSpot analytics and AI into your environment All options allow using your existing ThoughtSpot data models, Liveboards, Answers, row-level and column-level security, and governance. The main differences are where the UI or conversation layer exists and who orchestrates the analytics workflow. ==== -=== ThoughtSpot MCP Server +=== ThoughtSpot Spotter MCP Server -ThoughtSpot xref:mcp-integration.adoc[MCP Server] exposes governed analytics as MCP tools and resources to AI agents and clients. The MCP Server can be integrated with your MCP client, agent, LLM, or application UI, allowing your users to explore ThoughtSpot's agentic capabilities within the context of your application. +ThoughtSpot xref:mcp-integration.adoc[Spotter MCP Server] exposes governed analytics as MCP tools and resources to AI agents and clients. Spotter MCP Server can be integrated with your MCP client, agent, LLM, or application UI, allowing your users to explore ThoughtSpot's agentic capabilities within the context of your application. -ThoughtSpot recommends using the MCP Server in these scenarios: +ThoughtSpot recommends using Spotter MCP Server in these scenarios: * When you want to plug ThoughtSpot into AI agents and clients that already support MCP, such as Claude, ChatGPT, Gemini, IDEs, and custom MCP clients. * If you are building your own MCP-based chatbot or application, and want to call ThoughtSpot MCP tools behind a custom web experience. -For more information, see the xref:mcp-integration.adoc[MCP Server] documentation. +For more information, see the xref:mcp-integration.adoc[Spotter MCP Server] documentation. === Embedding Spotter in your app diff --git a/modules/ROOT/pages/common/nav-mcp-server.adoc b/modules/ROOT/pages/common/nav-mcp-server.adoc index d40f131d7..8b6bf8870 100644 --- a/modules/ROOT/pages/common/nav-mcp-server.adoc +++ b/modules/ROOT/pages/common/nav-mcp-server.adoc @@ -1,6 +1,6 @@ :page-pageid: nav-mcp-server -:page-description: MCP Server navigation +:page-description: Spotter MCP Server navigation [navSection] @@ -27,6 +27,6 @@ Related SDK components * [.typedoc-Interface]#link:{{navprefix}}/Interface_AutoMCPFrameRendererViewConfig[AutoMCPFrameRendererViewConfig]# [.sidebar-title] -MCP Server release notes +Spotter MCP Server release notes -* link:{{navprefix}}/mcp-server-changelog[MCP Server changelog] +* link:{{navprefix}}/mcp-server-changelog[Spotter MCP Server changelog] diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index 49e2944d8..88d62e537 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -12,7 +12,7 @@ Release notes and changelogs ** link:{{navprefix}}/embed-sdk-changelog[Visual Embed SDK changelog] ** link:{{navprefix}}/mobile-sdk-changelog[Mobile Embed SDK changelog] ** link:{{navprefix}}/rest-v2-changelog[REST API v2 changelog] -** link:{{navprefix}}/mcp-server-changelog[MCP Server changelog] +** link:{{navprefix}}/mcp-server-changelog[Spotter MCP Server changelog] * link:{{navprefix}}/deprecated-features[Deprecation announcements] [.sidebar-title] diff --git a/modules/ROOT/pages/home.adoc b/modules/ROOT/pages/home.adoc index 6e1d31b51..59849dca6 100644 --- a/modules/ROOT/pages/home.adoc +++ b/modules/ROOT/pages/home.adoc @@ -141,8 +141,8 @@ </div> <div class="col-md-4 flex"> <div class="boxDiv"><div> - <h5>MCP Server</h5> - <p>Integrate ThoughtSpot analytics into any AI-native application and custom chatbot using ThoughtSpot MCP Server. </p> + <h5>Spotter MCP Server</h5> + <p>Integrate ThoughtSpot analytics into any AI-native application and custom chatbot using ThoughtSpot Spotter MCP Server. </p> <!-- <img src="../doc-images/images/full-app.png" alt="Embed full ThoughtSpot app"> --></div><div> diff --git a/modules/ROOT/pages/mcp-connect-custom-chatbot.adoc b/modules/ROOT/pages/mcp-connect-custom-chatbot.adoc index 9f24f78e6..2b78d3cf7 100644 --- a/modules/ROOT/pages/mcp-connect-custom-chatbot.adoc +++ b/modules/ROOT/pages/mcp-connect-custom-chatbot.adoc @@ -1,12 +1,12 @@ -= Integrating MCP Server in a custom application or chatbot += Integrating Spotter MCP Server in a custom application or chatbot :toc: true :toclevels: 3 -:page-title: Integrating MCP Server in a custom application or chatbot +:page-title: Integrating Spotter MCP Server in a custom application or chatbot :page-pageid: custom-chatbot-integration-mcp -:page-description: Learn how to build custom applications and chatbots that use ThoughtSpot MCP Server. +:page-description: Learn how to build custom applications and chatbots that use ThoughtSpot Spotter Spotter MCP Server. -If you are building a chatbot client with your own agent and orchestration logic, you can use the MCP Server to call MCP tools behind a custom web experience and integrate it with other systems or services as needed. +If you are building a chatbot client with your own agent and orchestration logic, you can use the Spotter MCP Server to call MCP tools behind a custom web experience and integrate it with other systems or services as needed. When integrated, the agent in your custom application can: @@ -18,7 +18,7 @@ When integrated, the agent in your custom application can: Before you begin, review the following prerequisites: * Node.js version 22 or later is installed and available in your environment. -* Ensure that your setup has access to a ThoughtSpot application instance with 10.11.0.cl or a later release. For MCP Server with Spotter 3 capabilities, ensure that your ThoughtSpot instance is 26.2.0.cl or later. +* Ensure that your setup has access to a ThoughtSpot application instance with 10.11.0.cl or a later release. For Spotter MCP Server with Spotter 3 capabilities, ensure that your ThoughtSpot instance is 26.2.0.cl or later. * Ensure that the users have the necessary permissions to view data from relevant models and tables in ThoughtSpot. Existing RLS/CLS rules on tables are enforced automatically in data source responses. To create charts or Liveboards from a conversation session, data download and content creation privileges are required. == Authenticating users @@ -30,7 +30,7 @@ In a typical trusted authentication flow, your backend service calls the `/api/r The token generated for the user session is used as a bearer token when your backend calls ThoughtSpot APIs or when it brokers MCP tool calls. == Connecting clients -If your custom chatbot implementation uses Claude, OpenAI, or Gemini LLM APIs to call MCP tools, ensure that your MCP Server endpoint, authentication token, and ThoughtSpot host are included in the API request. +If your custom chatbot implementation uses Claude, OpenAI, or Gemini LLM APIs to call MCP tools, ensure that your Spotter MCP Server endpoint, authentication token, and ThoughtSpot host are included in the API request. When integrating with apps using custom workflows, ThoughtSpot recommends using the MCP server URL with the date-based `api-version` parameter. This allows you to pin a specific version and avoid introducing unintended changes to custom workflows that rely on tool responses. @@ -104,14 +104,14 @@ curl https://api.openai.com/v1/responses \ In the above example, the API call includes the following parameters: * MCP as the tool type. -* ThoughtSpot MCP Server URL. Replace `YYYY-MM-DD` in the URL with an actual date string. +* ThoughtSpot Spotter MCP Server URL. Replace `YYYY-MM-DD` in the URL with an actual date string. * Authentication token and ThoughtSpot host URL. The OpenAI LLM uses the configured MCP Server, sends the provided headers on each MCP tool call, and gets the requested data from your ThoughtSpot instance under that token's identity. === Gemini API -If your application is the MCP host and Gemini is the LLM provider, use the following code example to connect Gemini to the ThoughtSpot MCP Server. +If your application is the MCP host and Gemini is the LLM provider, use the following code example to connect Gemini to the ThoughtSpot Spotter MCP Server. [source,typescript] ---- @@ -157,7 +157,7 @@ await mcpClient.close(); The above example: -* Creates an MCP client and connects it to the ThoughtSpot MCP Server using `StreamableHTTPClientTransport`. Ensure that you replace `YYYY-MM-DD` in the URL with an actual date string. +* Creates an MCP client and connects it to the ThoughtSpot Spotter MCP Server using `StreamableHTTPClientTransport`. Ensure that you replace `YYYY-MM-DD` in the URL with an actual date string. * Sends the required headers with the authentication token and ThoughtSpot host URL in MCP requests. * Wraps the MCP client as a tool and passes it into `GoogleGenAI` so Gemini can call ThoughtSpot tools as part of answering a user's query. diff --git a/modules/ROOT/pages/mcp-integration.adoc b/modules/ROOT/pages/mcp-integration.adoc index 82424a00e..ecdcfb6ef 100644 --- a/modules/ROOT/pages/mcp-integration.adoc +++ b/modules/ROOT/pages/mcp-integration.adoc @@ -1,15 +1,15 @@ -= ThoughtSpot MCP Server += ThoughtSpot Spotter MCP Server :toc: true :toclevels: 3 :page-title: MCP integration :page-pageid: mcp-integration -:page-description: Learn what ThoughtSpot MCP Server is, when to use it, and how it fits into your AI and analytics architecture. +:page-description: Learn what ThoughtSpot Spotter MCP Server is, when to use it, and how it fits into your AI and analytics architecture. -ThoughtSpot’s Model Context Protocol (MCP) Server enables integration of ThoughtSpot analytics into any AI-native application, custom chatbot, or LLM platform that supports MCP. Instead of rebuilding analytics logic yourself, you connect an LLM/AI agent to the ThoughtSpot MCP Server. +ThoughtSpot’s Model Context Protocol (MCP) Server enables integration of ThoughtSpot analytics into any AI-native application, custom chatbot, or LLM platform that supports MCP. Instead of rebuilding analytics logic yourself, you connect an LLM/AI agent to the ThoughtSpot Spotter MCP Server. == Overview -ThoughtSpot MCP Server exposes ThoughtSpot analytics as tools and resources that MCP-compatible agents can discover and use. When integrated, the MCP Server provides your AI agent or LLM with the following capabilities: +ThoughtSpot Spotter MCP Server exposes ThoughtSpot analytics as tools and resources that MCP-compatible agents can discover and use. When integrated, the MCP Server provides your AI agent or LLM with the following capabilities: * Automatic discovery of ThoughtSpot MCP tools * Natural language queries and responses @@ -17,7 +17,7 @@ ThoughtSpot MCP Server exposes ThoughtSpot analytics as tools and resources that * Generating embeddable visualizations === Supported integrations -ThoughtSpot MCP Server supports two primary integration options: +ThoughtSpot Spotter MCP Server supports two primary integration options: [cols="2,6", options="header"] |=== @@ -30,7 +30,7 @@ ThoughtSpot MCP Server supports two primary integration options: If your application already has an AI chat interface or agentic experience, you can quickly add analytics to your existing setup without custom development. |xref:mcp-connect-custom-chatbot.adoc[Custom chatbot integration] -|If you are building your own MCP-based chatbot or application with custom orchestration logic or LLM, you can integrate the ThoughtSpot MCP Server to call ThoughtSpot tools behind your own web experience. +|If you are building your own MCP-based chatbot or application with custom orchestration logic or LLM, you can integrate the ThoughtSpot Spotter MCP Server to call ThoughtSpot tools behind your own web experience. **When to use**: Use this option if your organization requires a custom conversation flow, backend orchestration, and a tailored analytics experience for your users. @@ -38,8 +38,8 @@ Use this option if your organization requires a custom conversation flow, backen Regardless of integration mode, ThoughtSpot’s semantic layer, data context, and security features ensure trusted and governed analytics for all users. -=== MCP Server license -ThoughtSpot MCP Server is available as an add-on with the following link:https://www.thoughtspot.com/pricing[license plans]: +=== Spotter MCP Server license +ThoughtSpot Spotter MCP Server is available as an add-on with the following link:https://www.thoughtspot.com/pricing[license plans]: * ThoughtSpot Enterprise Edition * ThoughtSpot Embedded @@ -47,7 +47,7 @@ ThoughtSpot MCP Server is available as an add-on with the following link:https:/ To learn more about subscription options, contact your ThoughtSpot sales representative. == Core components and roles -The MCP Server integration and orchestration layers include the following core components: +The Spotter MCP Server integration and orchestration layers include the following core components: [width="100%" cols="2,6"] [options='header'] @@ -57,9 +57,9 @@ The MCP Server integration and orchestration layers include the following core c |**Host application** | The AI platform or AI-native app that renders chat, responses, and charts, and manages user-facing conversation. For example, Claude AI web app, Claude Desktop, ChatGPT, OpenAI-based integrations, Gemini-based agents, custom web applications, or internal tools. |**MCP client** -a|The MCP client discovers available tools, manages the MCP connection to the server, and passes tool calls between the LLM and the MCP Server. +a|The MCP client discovers available tools, manages the MCP connection to the server, and passes tool calls between the LLM and the Spotter MCP Server. -|**ThoughtSpot MCP Server** a| +|**ThoughtSpot Spotter MCP Server** a| The remote MCP server hosted by ThoughtSpot. - Acts as a gateway between the MCP client and ThoughtSpot. @@ -74,7 +74,7 @@ The remote MCP server hosted by ThoughtSpot. - In integrations using the MCP Server with Spotter 3 support, it provides additional capabilities such as advanced analytics, reasoning, forecasting, automatic data source selection, and deep research. |=== -The following figure illustrates the interaction between the user, agent, and MCP Server: +The following figure illustrates the interaction between the user, agent, and Spotter MCP Server: [.widthAuto] image::./images/agents-mcp-server-arch.png[MCP integration] @@ -145,7 +145,7 @@ Creates a dashboard from `answer_id` values collected from the session update ty == MCP Server URL -ThoughtSpot MCP Server now uses date-based API versioning in the URL. New versions are identified using the `?api-version=YYYY-MM-DD` parameter, which you can append to the MCP Server URL to pin your integration to a specific version. Each new version may introduce tool changes, enhancements, or bug fixes. +ThoughtSpot Spotter MCP Server now uses date-based API versioning in the URL. New versions are identified using the `?api-version=YYYY-MM-DD` parameter, which you can append to the MCP Server URL to pin your integration to a specific version. Each new version may introduce tool changes, enhancements, or bug fixes. When you set the `api-version` to a specific date string, the server returns the version released on the specified date. If no new version of MCP Server is released on the date specified in the URL, the server returns the closest earlier version. For example, if you request `?api-version=2026-06-01` and no new version has been released since `2026-05-01`, the server returns the 2026-05-01 version. This means your integration continues to work without breaking, and you only need to update your pinned date if you want to opt in for a newer version. @@ -179,7 +179,7 @@ ThoughtSpot recommends migrating your existing MCP Server integration setup to t ==== == Next steps -* To learn how to connect existing MCP-aware tools such as Claude, ChatGPT, and Gemini, see the xref:mcp-server-client-connection.adoc[Connecting MCP clients to ThoughtSpot MCP Server] documentation. +* To learn how to connect existing MCP-aware tools such as Claude, ChatGPT, and Gemini, see the xref:mcp-server-client-connection.adoc[Connecting MCP clients to ThoughtSpot Spotter MCP Server] documentation. * To learn how to integrate MCP Server with a custom chatbot or application, see the xref:mcp-connect-custom-chatbot.adoc[Integrating MCP Server in a custom chatbot] documentation. == Additional resources diff --git a/modules/ROOT/pages/mcp-server-changelog.adoc b/modules/ROOT/pages/mcp-server-changelog.adoc index ce53f8fe9..28b2d30c9 100644 --- a/modules/ROOT/pages/mcp-server-changelog.adoc +++ b/modules/ROOT/pages/mcp-server-changelog.adoc @@ -1,13 +1,13 @@ -= ThoughtSpot MCP Server changelog += ThoughtSpot Spotter MCP Server changelog :toc: true :toclevels: 2 -:page-title: MCP Server Changelog +:page-title: Spotter MCP Server Changelog :page-pageid: mcp-server-changelog -:page-description: Release history for the ThoughtSpot MCP Server, including new tools, breaking changes, deprecations, and bug fixes. +:page-description: Release history for the ThoughtSpot Spotter MCP Server, including new tools, breaking changes, deprecations, and bug fixes. :keywords: MCP Server, changelog, release notes, api-version, breaking changes, deprecation -This changelog lists the new features, enhancements, and other changes introduced in the released versions of the ThoughtSpot MCP Server. For information about MCP Server integration, see the xref:mcp-integration.adoc[MCP Server integration guide]. +This changelog lists the new features, enhancements, and other changes introduced in the released versions of the ThoughtSpot Spotter MCP Server. For information about Spotter MCP Server integration, see the xref:mcp-integration.adoc[MCP Server integration guide]. // ============================================================ // VERSION TEMPLATE — copy this block for each new release @@ -40,14 +40,14 @@ a| [discrete] ==== Support for Spotter 3 -ThoughtSpot MCP Server now supports Spotter 3, enabling advanced analytics, forecasting, multi-step reasoning, and deep research. The new MCP tools support real-time streaming, session-based conversations, richer interactions, and direct embedding of visualizations in MCP-aware apps. + +ThoughtSpot Spotter MCP Server now supports Spotter 3, enabling advanced analytics, forecasting, multi-step reasoning, and deep research. The new MCP tools support real-time streaming, session-based conversations, richer interactions, and direct embedding of visualizations in MCP-aware apps. + For more information, see xref:mcp-server-spotter3.adoc[MCP Server with Spotter 3]. --- [discrete] ==== MCP Server URL changes and API versioning [.version-badge.breaking]#Breaking# -MCP Server URLs now support date-based versioning, defined using the `?api-version=YYYY-MM-DD` parameter. Ensure that you update the xref:mcp-integration.adoc#_mcp_server_url[MCP Server URL] in your integrations as needed. +Spotter MCP Server URLs now support date-based versioning, defined using the `?api-version=YYYY-MM-DD` parameter. Ensure that you update the xref:mcp-integration.adoc#_mcp_server_url[MCP Server URL] in your integrations as needed. [NOTE] ==== @@ -86,7 +86,7 @@ a| [discrete] ==== MCP tools, processing model, and answer retrieval -Supports the following MCP tools released in the initial version of ThoughtSpot MCP Server. +Supports the following MCP tools released in the initial version of ThoughtSpot Spotter MCP Server. * `ping`: Tests connectivity and authentication. * `getDataSourceSuggestions`: Returns available data source suggestions diff --git a/modules/ROOT/pages/mcp-server-client-connection.adoc b/modules/ROOT/pages/mcp-server-client-connection.adoc index 748c30855..f9fd4b39a 100644 --- a/modules/ROOT/pages/mcp-server-client-connection.adoc +++ b/modules/ROOT/pages/mcp-server-client-connection.adoc @@ -4,13 +4,13 @@ :page-title: Connecting MCP Server to MCP clients :page-pageid: connect-mcp-server-to-clients -:page-description: Learn how to connect Claude, ChatGPT, Gemini, and other MCP-aware clients to ThoughtSpot MCP Server with minimal configuration. +:page-description: Learn how to connect Claude, ChatGPT, Gemini, and other MCP-aware clients to ThoughtSpot Spotter MCP Server with minimal configuration. If your application already has an AI-native experience or supports MCP-aware agents and LLMs, you can integrate ThoughtSpot analytics directly into your app's agentic experience by connecting the MCP Server to your client. In this plug-and-play integration, your application's chat interface and LLM orchestrate conversation sessions. The MCP Server exposes ThoughtSpot's analytics capabilities as tools, which your agent or LLM can invoke as needed. This approach allows you to bring ThoughtSpot analytics into your own AI-native experience and use it as a data and analytics provider through the MCP Server, while your system controls user interaction and orchestration logic. -When your MCP client is connected to the ThoughtSpot MCP Server, the AI agent/LLM can: +When your MCP client is connected to the ThoughtSpot Spotter MCP Server, the AI agent/LLM can: * Automatically discover ThoughtSpot MCP tools. * Call the MCP tools to determine the data context and answer data questions. @@ -99,9 +99,9 @@ In a plug-and-play integration, the most common way to authenticate users is thr === OAuth flow In a typical OAuth flow: -* The ThoughtSpot MCP Server is configured as a connector/tool in the MCP client. +* The ThoughtSpot Spotter MCP Server is configured as a connector/tool in the MCP client. * When the user connects, the client redirects the user to ThoughtSpot to sign in. -* After successful login, the client stores the issued OAuth tokens and includes them with each MCP tool call to the ThoughtSpot MCP Server, which then calls ThoughtSpot on behalf of that user. +* After successful login, the client stores the issued OAuth tokens and includes them with each MCP tool call to the ThoughtSpot Spotter MCP Server, which then calls ThoughtSpot on behalf of that user. === OAuth client registration OAuth clients can be registered in one of the following ways: diff --git a/modules/ROOT/pages/mcp-server-spotter3.adoc b/modules/ROOT/pages/mcp-server-spotter3.adoc index aaa0ae0d7..56d5ee302 100644 --- a/modules/ROOT/pages/mcp-server-spotter3.adoc +++ b/modules/ROOT/pages/mcp-server-spotter3.adoc @@ -6,7 +6,7 @@ :page-pageid: mcp-server-spotter3 :page-description: Learn about the MCP Server with Spotter 3 capabilities, including advanced analytics, streaming responses, and session-based conversations. -ThoughtSpot MCP Server supports link:https://docs.thoughtspot.com/cloud/latest/spotter-versions[Spotter 3, window=_blank], which enables advanced analytics, forecasting, multi-step reasoning and analysis, and deep research capabilities. +ThoughtSpot Spotter MCP Server supports link:https://docs.thoughtspot.com/cloud/latest/spotter-versions[Spotter 3, window=_blank], which enables advanced analytics, forecasting, multi-step reasoning and analysis, and deep research capabilities. The MCP Server with Spotter 3 introduces new MCP tools, real-time streaming responses, session-based conversations, and richer interactions. [cols="2,4,4", options="header"] diff --git a/modules/ROOT/pages/mcp-tool-reference-guide.adoc b/modules/ROOT/pages/mcp-tool-reference-guide.adoc index c9fb5b1dc..9708121bc 100644 --- a/modules/ROOT/pages/mcp-tool-reference-guide.adoc +++ b/modules/ROOT/pages/mcp-tool-reference-guide.adoc @@ -6,7 +6,7 @@ :page-pageid: mcp-tool-reference :page-description: Refer to this guide to learn which MCP tools are supported, input parameters used for tool calls, and the response format. -ThoughtSpot MCP Server provides specialized tools that enable the AI agent in your application to access ThoughtSpot analytics. This page lists all supported MCP tools and describes how to call these tools and analyze responses. Refer to the following sections for more information: +ThoughtSpot Spotter MCP Server provides specialized tools that enable the AI agent in your application to access ThoughtSpot analytics. This page lists all supported MCP tools and describes how to call these tools and analyze responses. Refer to the following sections for more information: * xref:mcp-tool-reference-spotter3.adoc[MCP Server version with Spotter 3] [.version-badge.new]#New# * xref:mcp-tool-reference-legacy.adoc[MCP Server with legacy tools] diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 02f51c17f..22f230d97 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -9,7 +9,28 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. == Version 26.6.0.cl, June 2026 -=== New API endpoints + +=== Spotter AI APIs + +Agent instructions APIs:: +The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. + +* `PUT /api/rest/2.0/ai/agent/instructions/set` + +Sets behavioral instructions for the Spotter agent. Use this endpoint to define persistent guidance that Spotter applies when responding to queries in a conversation session. + +* `GET /api/rest/2.0/ai/agent/instructions/get` + +Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. + ++ +For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. + +Stop in-progress agent response:: + +* `POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + +Stops a Spotter agent response that is currently in progress for a given conversation session. + +For more information, see xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[Stop an in-progress agent response]. + ==== Authentication The following new endpoints allow searching for the authentication configuration at the cluster or Org level, and also allows enabling and disabling the authentication. Currently, only support trusted authentication. @@ -27,7 +48,6 @@ ThoughtSpot introduces REST API v2.0 endpoints to programmatically deactivate an * POST /api/rest/2.0/connections/{connection_identifier}/status + Deactivates or activates a connection. - === Answer report API enhancements [earlyAccess eaBackground]#Early Access# The `POST /api/rest/2.0/report/answer` API endpoint introduces the following enhancements: @@ -63,7 +83,6 @@ The API now automatically names exported files based on the Answer title and app Contact ThoughtSpot support to enable these settings for PNG downloads on your ThoughtSpot instance. For more information, see xref:data-report-v2-api.adoc#_answer_report_api[Answer report API documentation]. - === Share metadata API: Collections support [beta betaBackground]^Beta^ The `POST /api/rest/2.0/security/metadata/share` endpoint now supports sharing Collections. @@ -71,25 +90,6 @@ The `POST /api/rest/2.0/security/metadata/share` endpoint now supports sharing C To share a Collection, set `metadata_type` to `COLLECTION` in the request body. For more information, see xref:collections.adoc#share-collection[Share a Collection]. -=== Spotter Agent instructions APIs - -The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. - -* `PUT /api/rest/2.0/ai/agent/instructions/set` + -Sets behavioral instructions for the Spotter agent. Use this endpoint to define persistent guidance that Spotter applies when responding to queries in a conversation session. - -* `GET /api/rest/2.0/ai/agent/instructions/get` + -Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. - -For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. - -=== Stop in-progress agent response - -* `POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + -Stops a Spotter agent response that is currently in progress for a given conversation session. - -For more information, see xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[Stop an in-progress agent response]. - == Version 26.5.0.cl, May 2026 === Sync connection metadata attributes diff --git a/modules/ROOT/pages/spottercode-integration.adoc b/modules/ROOT/pages/spottercode-integration.adoc index fde13e6df..c572c7f4c 100644 --- a/modules/ROOT/pages/spottercode-integration.adoc +++ b/modules/ROOT/pages/spottercode-integration.adoc @@ -68,7 +68,7 @@ For information about configuring MCP servers in Cursor, refer to the link:https Although you can configure the MCP server in Visual Studio Code, to start a chat session with the AI agent, you'll need GitHub Copilot or a similar extension. -To add an MCP Server to Visual Studio Code, you can use the Extensions view, the `MCP: Add Server` command via command palette, or directly edit the `mcp.json` file in your workspace configuration. +To add the Spotter MCP Server to Visual Studio Code, you can use the Extensions view, the `MCP: Add Server` command via command palette, or directly edit the `mcp.json` file in your workspace configuration. [source,JSON] ---- diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 714a4abe9..4d56810e0 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -25,10 +25,6 @@ This page lists new features, enhancements, and deprecated functionality introdu == June 2026 -[discrete] -==== REST API v2 -This release introduces new API endpoints for Connections and trusted authentication, and modifications to the Answer report and sharing metadata APIs. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. -|===== **Release version**: ThoughtSpot Cloud 26.6.0.cl + *Upgrade notes*: No breaking changes. + *Recommended SDK versions*: Visual Embed SDK v1.49.0 and later @@ -87,7 +83,7 @@ The Visual Embed SDK version 1.49.0 includes several new features and enhancemen [discrete] ==== REST API v2 -This release introduces new Spotter API endpoints and modifications to the agent conversation APIs, and deprecates legacy agent endpoints. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. |===== From 7e1431e19882997294795b60aadedb0f53a6b7d0 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 07:37:14 +0530 Subject: [PATCH 52/61] SCAL-316129 fixes --- modules/ROOT/pages/common/nav-mcp-server.adoc | 6 +- modules/ROOT/pages/mcp-integration.adoc | 5 +- .../pages/mcp-server-client-connection.adoc | 40 ++++++- modules/ROOT/pages/mcp-server-legacy.adoc | 8 +- .../ROOT/pages/mcp-tool-reference-legacy.adoc | 3 - .../pages/mcp-tool-reference-spotter3.adoc | 113 +++++++++++++----- 6 files changed, 127 insertions(+), 48 deletions(-) diff --git a/modules/ROOT/pages/common/nav-mcp-server.adoc b/modules/ROOT/pages/common/nav-mcp-server.adoc index 8b6bf8870..f1e6d4822 100644 --- a/modules/ROOT/pages/common/nav-mcp-server.adoc +++ b/modules/ROOT/pages/common/nav-mcp-server.adoc @@ -5,12 +5,12 @@ [navSection] [.sidebar-title] -ThoughtSpot MCP server +ThoughtSpot Spotter MCP Server * link:{{navprefix}}/mcp-integration[Overview] ** link:{{navprefix}}/mcp-server-spotter3[MCP Server with Spotter 3] ** link:{{navprefix}}/mcp-server-legacy[Legacy MCP Server architecture and tools] -* link:{{navprefix}}/connect-mcp-server-to-clients[Connecting MCP Server to MCP clients] +* link:{{navprefix}}/connect-mcp-server-to-clients[Connecting MCP Server to clients] * link:{{navprefix}}/custom-chatbot-integration-mcp[Integrating MCP Server in a custom app] [.sidebar-title] @@ -18,7 +18,7 @@ MCP tools reference * link:{{navprefix}}/mcp-tool-reference[Overview] * link:{{navprefix}}/mcp-tool-reference-spotter3[MCP tool reference (Spotter 3)] -* link:{{navprefix}}/mcp-tool-reference-spotter3[MCP tool reference (legacy version)] +* link:{{navprefix}}/mcp-tool-reference-legacy[MCP tool reference (legacy version)] [.sidebar-title] Related SDK components diff --git a/modules/ROOT/pages/mcp-integration.adoc b/modules/ROOT/pages/mcp-integration.adoc index ecdcfb6ef..f95b1147f 100644 --- a/modules/ROOT/pages/mcp-integration.adoc +++ b/modules/ROOT/pages/mcp-integration.adoc @@ -24,7 +24,7 @@ ThoughtSpot Spotter MCP Server supports two primary integration options: | Integration option | Description | xref:mcp-server-client-connection.adoc[Plug-and-play clients] -|This integration works with agents or LLMs that natively support MCP, such as Claude, OpenAI, Gemini, or custom MCP clients. It allows your AI agent to call tools directly and leverage ThoughtSpot’s governed analytics, business semantic layer, data context, and row-level/object-level security, without the need to build your analytics logic. +|This integration works with agents or LLMs that natively support MCP, such as Claude, ChatGPT, Gemini, or custom MCP clients. It allows your AI agent to call tools directly and leverage ThoughtSpot’s governed analytics, business semantic layer, data context, and row-level/object-level security, without the need to build your analytics logic. **When to use**: If your application already has an AI chat interface or agentic experience, you can quickly add analytics to your existing setup without custom development. @@ -49,8 +49,7 @@ To learn more about subscription options, contact your ThoughtSpot sales represe == Core components and roles The Spotter MCP Server integration and orchestration layers include the following core components: -[width="100%" cols="2,6"] -[options='header'] +[cols="2,6", options="header"] |=== |Component|Role diff --git a/modules/ROOT/pages/mcp-server-client-connection.adoc b/modules/ROOT/pages/mcp-server-client-connection.adoc index f9fd4b39a..e23efaa30 100644 --- a/modules/ROOT/pages/mcp-server-client-connection.adoc +++ b/modules/ROOT/pages/mcp-server-client-connection.adoc @@ -1,4 +1,4 @@ -= Connecting MCP Server to MCP clients += Connecting MCP Server to clients :toc: true :toclevels: 3 @@ -6,7 +6,7 @@ :page-pageid: connect-mcp-server-to-clients :page-description: Learn how to connect Claude, ChatGPT, Gemini, and other MCP-aware clients to ThoughtSpot Spotter MCP Server with minimal configuration. -If your application already has an AI-native experience or supports MCP-aware agents and LLMs, you can integrate ThoughtSpot analytics directly into your app's agentic experience by connecting the MCP Server to your client. +If your application already has an AI-native experience or supports MCP-aware agents and LLMs, you can integrate ThoughtSpot analytics directly into your app's agentic experience by connecting the ThoughtSpot Spotter MCP Server to your client. In this plug-and-play integration, your application's chat interface and LLM orchestrate conversation sessions. The MCP Server exposes ThoughtSpot's analytics capabilities as tools, which your agent or LLM can invoke as needed. This approach allows you to bring ThoughtSpot analytics into your own AI-native experience and use it as a data and analytics provider through the MCP Server, while your system controls user interaction and orchestration logic. @@ -31,6 +31,19 @@ Before you begin, review the following prerequisites: * Ensure that your setup has access to a ThoughtSpot application instance with 10.11.0.cl or a later release. For MCP Server with Spotter 3 capabilities, ensure that your ThoughtSpot instance is 26.2.0.cl or later. * Ensure that the users have the necessary permissions to view data from relevant models and tables in ThoughtSpot. Existing RLS/CLS rules on tables are enforced automatically in data source responses. To create charts or Liveboards from a conversation session, data download and content creation privileges are required. +== Using ThoughtSpot Spotter with ChatGPT and Claude +The ThoughtSpot Spotter MCP Server is available directly from the ChatGPT and Claude marketplaces. If you want to use ThoughtSpot Spotter with ChatGPT or Claude, you can install it directly from these marketplaces instead of manually configuring it. + +Installation differs by platform: + +ChatGPT:: +ThoughtSpot Spotter is available as an App in the ChatGPT App Store. Search for *ThoughtSpot Spotter* in the ChatGPT App Store and follow ChatGPT's installation instructions. + +Claude:: +ThoughtSpot Spotter is available as a Connector in Claude's Connectors marketplace. Search for *ThoughtSpot Spotter* in Claude's Connectors marketplace and follow Claude's installation instructions. + +Once installed, you can use ThoughtSpot Spotter to query your ThoughtSpot instance directly within ChatGPT or Claude. + === Connecting clients that support remote MCP servers To connect a client that supports remote MCP servers natively, add the MCP Server endpoint to your client's configuration settings. @@ -136,6 +149,29 @@ If user authentication fails, or if the server returns HTTP 500, 401, or 403 sta * Check whether the user session has expired. Log in to your ThoughtSpot application to start a new session. * Verify whether the user has the necessary privileges to view data or create content. +== Switching between Orgs + +If you have access to multiple ThoughtSpot Orgs, the ThoughtSpot Spotter MCP Server defaults to the last Org you were logged into. To switch to a different Org, switch to the Org in ThoughtSpot and re-authenticate with your MCP client. + +To switch Orgs: + +. Log in to your ThoughtSpot instance. +. Select the Org you want to work with using the *Org switcher* in the top navigation bar, next to the help icon. For example, Org A. +. Return to your MCP client and authenticate with your ThoughtSpot credentials. +The MCP Server connects to the Org you selected for all subsequent requests. + +To switch to a different Org later: + +. Log out of ThoughtSpot. +. Log in to your ThoughtSpot instance. +. Select the new Org using the *Org switcher*. For example, Org B. +. Return to your MCP client and re-authenticate with your ThoughtSpot credentials. + +[NOTE] +==== +You must repeat this process each time you want to change Orgs. Currently, the ThoughtSpot Spotter MCP Server cannot switch Orgs mid-session without re-authentication. +==== + == Additional resources * For information about the MCP Server features and architecture, see xref:mcp-integration.adoc[MCP Server integration]. * To view the MCP Server code, go to the link:https://github.com/thoughtspot/mcp-server[MCP Server GitHub repository, window=_blank]. \ No newline at end of file diff --git a/modules/ROOT/pages/mcp-server-legacy.adoc b/modules/ROOT/pages/mcp-server-legacy.adoc index d10e0fbfd..ce7974a1c 100644 --- a/modules/ROOT/pages/mcp-server-legacy.adoc +++ b/modules/ROOT/pages/mcp-server-legacy.adoc @@ -4,9 +4,9 @@ :page-title: Legacy MCP Server architecture and tools :page-pageid: mcp-server-legacy -:page-description: Learn about the legacy MCP Server architecture and how it fits into your AI and analytics architecture. +:page-description: Learn about the legacy Spotter MCP Server architecture and how it fits into your AI and analytics architecture. -The legacy MCP server setup uses synchronous architecture. It does not support advanced analytics, session context retention, automatic data source selection, streaming responses, and the full answer is always returned inline. All context and data source management must be handled by the client on every request. +The legacy ThoughtSpot Spotter Model Context Protocol (MCP) Server setup uses synchronous architecture. It does not support advanced analytics, session context retention, automatic data source selection, streaming responses, and the full answer is always returned inline. All context and data source management must be handled by the client on every request. Functional capabilities:: Limited capabilities for complex analysis and context integration. @@ -28,7 +28,7 @@ Every follow-up call requires the prior context to be manually included, as the image::./images/mcp-architecture-legacy.png[MCP architecture legacy] == Tool calls and workflow processing -The workflow in the legacy MCP Server setup typically includes the following stages: +The workflow in the legacy Spotter MCP Server setup typically includes the following stages: . *User asks a question* + A user sends a query in the chat interface to get data. For example, `What were the total sales of Jackets and Bags in the Northeast last year?` + @@ -51,7 +51,7 @@ For each suggested or chosen question, the agent calls `getAnswer`. ThoughtSpot To save answers from the conversation sessions in a ThoughtSpot Liveboard, the agent extracts the `question`, `session_identifier`, and `generation_number` from each `getAnswer` response and calls `createLiveboard`. + ThoughtSpot creates a persistent Liveboard from the session's answers and returns identifiers and a `frame_url` for the Liveboard. -In the legacy MCP Server setup, to ask a follow-up question, the agent calls the `getRelevantQuestions` again, because the server doesn't retain context. For follow-up questions, the agent must pass the context explicitly via `additionalContext`. +In the legacy Spotter MCP Server setup, to ask a follow-up question, the agent calls `getRelevantQuestions` again, because the server doesn't retain context. For follow-up questions, the agent must pass the context explicitly via `additionalContext`. For more information about the tool calls, input parameters, and response output, see xref:mcp-tool-reference-guide.adoc#_legacy_mcp_server_setup[MCP tool reference guide]. diff --git a/modules/ROOT/pages/mcp-tool-reference-legacy.adoc b/modules/ROOT/pages/mcp-tool-reference-legacy.adoc index f2a98be63..dc764fc25 100644 --- a/modules/ROOT/pages/mcp-tool-reference-legacy.adoc +++ b/modules/ROOT/pages/mcp-tool-reference-legacy.adoc @@ -168,6 +168,3 @@ Key fields are: * `name`: Name of the Liveboard. * `frame_url`: URL that can be embedded to display the Liveboard. - - - diff --git a/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc b/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc index 997c9905b..509fb4d6b 100644 --- a/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc +++ b/modules/ROOT/pages/mcp-tool-reference-spotter3.adoc @@ -6,8 +6,20 @@ :page-pageid: mcp-tool-reference-spotter3 :page-description: Refer to this guide to learn which MCP tools are supported, input parameters used for tool calls, and the response format. -The new ThoughtSpot MCP integration exposes a session-based workflow for running natural language analytics queries against your ThoughtSpot data sources. The pattern is always: **create a session** → **send a message** → **poll for updates**. - +The ThoughtSpot Spotter Model Context Protocol (MCP) Server integration exposes a session-based workflow for running natural language analytics queries against your ThoughtSpot data sources. The pattern is always: **create a session** → **send a message** → **poll for updates**. + +* <<create_analysis_session,create_analysis_session>> + +Start an analytical session. +* <<send_session_message,send_session_message>> + +Send a natural language question or follow-up. +* <<get_session_updates,get_session_updates>> + +Poll for streamed responses. +* <<create_dashboard,create_dashboard>> + +Create a Liveboard from session answers. +* <<check_connectivity,check_connectivity>> + +Verify that the MCP Server is reachable. + +[#create_analysis_session] == create_analysis_session Start an analytical session with ThoughtSpot's analytics agent. This is the required first step before sending any questions. @@ -43,7 +55,7 @@ call_mcp_tool( [source,json] ---- { -"analytical_session_id": "session-guid-abc123" + "analytical_session_id": "session-guid-abc123" } ---- @@ -51,6 +63,7 @@ call_mcp_tool( * Always capture the returned `analytical_session_id`. It is required for all subsequent calls. +[#send_session_message] == send_session_message Send a natural language analytical question or follow-up to an existing session. The agent processes requests asynchronously, so this tool does not return the answer directly; use `get_session_updates` to retrieve the response. @@ -114,8 +127,8 @@ call_mcp_tool( * To ask a follow-up question, reuse the same `analytical_session_id`. There is no need to create a new session. ==== +[#get_session_updates] == get_session_updates - Poll for the latest response from a ThoughtSpot analytics session. Call this repeatedly after `send_session_message` until `is_done` is `true`. **Important**: A single call to `get_session_updates` will rarely contain the full response. Spotter streams its work incrementally, including intermediate thinking steps, across multiple polling calls. You must accumulate updates from every poll and combine them to get the complete picture. @@ -153,10 +166,10 @@ Poll returning intermediate updates with the "is_thinking" response: "is_done": false, "session_updates": [ { - "is_thinking":true, - "type":"text_chunk", - "text":"Let me look at your sales data by region...", - }, + "is_thinking": true, + "type": "text-chunk", + "text": "Let me look at your sales data by region..." + } ] } ---- @@ -166,27 +179,27 @@ Poll returning final updates: [source,json] ---- { - "is_done": true, - "session_updates":[ - { - "is_thinking":false, - "type":"text-chunk", - "text":"Data broken down by region..." - }, - { - "is_thinking":false, - "type":"text", - "text":"I'm interpreting 'last quarter' as Q4 2025 (October–December), based on a fiscal year starting in April." - }, - { - "is_thinking":false, - "type":"answer", - "answer_title":"Total Sales by Region — Q4 2025", - "answer_query":"total sales by region last quarter", - "iframe_url":"https://your-instance.thoughtspot.cloud/embed/...", - "answer_id":"answer-guid-xyz789" - } - ] + "is_done": true, + "session_updates": [ + { + "is_thinking": false, + "type": "text-chunk", + "text": "Data broken down by region..." + }, + { + "is_thinking": false, + "type": "text", + "text": "I'm interpreting 'last quarter' as Q4 2025 (October–December), based on a fiscal year starting in April." + }, + { + "is_thinking": false, + "type": "answer", + "answer_title": "Total Sales by Region — Q4 2025", + "answer_query": "total sales by region last quarter", + "iframe_url": "https://your-instance.thoughtspot.cloud/embed/...", + "answer_id": "answer-guid-xyz789" + } + ] } ---- @@ -202,7 +215,7 @@ A typical response sequence might look like: . Intermediate conclusions: partial results or contextual notes before the final answer. . The final answer: one or more `answer` updates containing the visualization title, the underlying query, and the embeddable iframe URL. -This means a complete response might span between 5–20+ `get_session_updates` calls and contain many `session_update` objects before `is_done` becomes `true`. All of this content — the thinking, the narration, and the final answer — should be accumulated and presented together to give the user the full picture. +This means a complete response might span 5–20+ `get_session_updates` calls and contain many `session_update` objects before `is_done` becomes `true`. All of this content — the thinking, the narration, and the final answer — should be accumulated and presented together to give the user the full picture. === Type definition: session_update @@ -221,9 +234,8 @@ Each item in the `session_updates` list is a `session_update` object. The `type` |`iframe_url`|__String__|An embeddable URL for rendering the answer as an interactive visualization. Present only when `type` is `"answer"`. Use this to display a live chart or table if your environment supports iframes. |==== - +[#create_dashboard] == create_dashboard - Create a ThoughtSpot dashboard from answers generated in an analysis session. * Call this only after `get_session_updates` returns `is_done: true`, because you need the `answer_id` values from completed answer updates. @@ -298,7 +310,7 @@ dashboard = call_mcp_tool( [cols="2,4", options="header"] |==== -|*Field*|*Description* +|Field|Description |`dashboard_id`|The unique identifier of the created dashboard. |`dashboard_url`|A link to the newly created dashboard in ThoughtSpot. @@ -362,6 +374,41 @@ The following features are not supported directly. However, you can use the *Mak * Show underlying data, view query SQL or query visualizer * SpotIQ analysis +[#check_connectivity] +== check_connectivity +Runs a basic health check to verify that the ThoughtSpot Spotter MCP Server is reachable and responding. Use this tool to confirm your connection before starting an analytical session. + +[NOTE] +==== +`check_connectivity` is the Spotter 3 equivalent of the `ping` tool in the legacy MCP version. +==== + +=== Example call + +[div tabbed-code] +-- +[source,javascript] +---- +const result = await callMCPTool("check_connectivity", {}); +---- + +[source,python] +---- +call_mcp_tool("check_connectivity", {}) +---- +-- + +=== Response + +[source,json] +---- +{ + "success": true +} +---- + +* `success`: Returns `true` if the Spotter MCP Server is reachable and operational. + == Additional resources * For a chat client example, see link:https://github.com/thoughtspot/developer-examples/tree/main/mcp/python-react-agent-simple-ui[Python Agent with Simple React UI, window=_blank]. From a0a025e6b4af49a573384200adcdb5325a276066 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 08:19:26 +0530 Subject: [PATCH 53/61] Claude cowork update --- .../ROOT/pages/spottercode-integration.adoc | 81 ++++++++++--------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/modules/ROOT/pages/spottercode-integration.adoc b/modules/ROOT/pages/spottercode-integration.adoc index c572c7f4c..31209817e 100644 --- a/modules/ROOT/pages/spottercode-integration.adoc +++ b/modules/ROOT/pages/spottercode-integration.adoc @@ -6,12 +6,12 @@ :page-pageid: integrate-SpotterCode :page-description: This document provides a comprehensive, step-by-step approach to integrating SpotterCode with your development environment -Connecting your IDE to ThoughtSpot's SpotterCode is easy. All you need is the SpotterCode MCP Server URL. This guide will walk you through the process of adding SpotterCode to your IDE. +This guide walks you through the process of adding SpotterCode to your IDE. == Before you begin * Ensure that your IDE is AI-native and supports chat sessions with AI models. -* Ensure that you have the necessary permissions to configure MCP servers on your IDE. +* Ensure that you have the necessary permissions to configure Model Context Protocol (MCP) servers in your IDE. * Ensure that the latest version of Node.js is installed in your environment. This is required for building embedding code with the SDK. * Ensure that you have access to a ThoughtSpot instance and can view the objects and resources that you want to embed or access via the REST API. @@ -25,14 +25,14 @@ Via Cursor Marketplace:: SpotterCode is available as an official plugin in the link:https://cursor.com/marketplace/thoughtspot[Cursor Marketplace, window=_blank]. To install SpotterCode from the Cursor Marketplace: . Go to link:https://cursor.com/marketplace/thoughtspot[Cursor Marketplace, window=_blank]. . Ensure that you are signed in, and then click **Add to Cursor** -> **Add Plugin**. -. To view it in your Cursor, click *View in Editor*. +. To view the plugin in Cursor, click *View in Editor*. Via installation link:: . Copy the following link and open it in Cursor: + + `cursor://anysphere.cursor-deeplink/mcp/install?name=SpotterCode&config=eyJ1cmwiOiJodHRwczovL3Nwb3R0ZXJjb2RlLnRob3VnaHRzcG90LmFwcC9tY3AifQ==` + -. On clicking this link, Cursor opens the MCP server installation page to add SpotterCode. +. Cursor opens the MCP server installation page to add SpotterCode. . Click **Install**. //// @@ -41,7 +41,7 @@ Via installation link:: image:./images/spottercode-cursor-url.png[SpotterCode MCP Server installation in Cursor] //// -=== Using mcp.json file +=== Using the mcp.json file Cursor also allows you to integrate SpotterCode by adding the MCP server URL in the `mcp.json` file. To add the URL: @@ -58,58 +58,37 @@ Cursor also allows you to integrate SpotterCode by adding the MCP server URL in } } ---- -. Click *Save* and close the `mcp.json` file. This will install the SpotterCode MCP server and tools for the AI models on Cursor to execute. +. Click *Save* and close the `mcp.json` file. This installs the SpotterCode MCP server and makes its tools available for AI models in Cursor. For information about configuring MCP servers in Cursor, refer to the link:https://cursor.com/docs/context/mcp[Cursor Documentation, window=_blank]. - -== Integrate SpotterCode with Visual Studio Code - -Although you can configure the MCP server in Visual Studio Code, to start a chat session with the AI agent, you'll need GitHub Copilot or a similar extension. - -To add the Spotter MCP Server to Visual Studio Code, you can use the Extensions view, the `MCP: Add Server` command via command palette, or directly edit the `mcp.json` file in your workspace configuration. - -[source,JSON] ----- -{ - "servers": { - "SpotterCode": { - "url": "https://spottercode.thoughtspot.app/mcp", - "type": "http" - } - } -} ----- - -After you add the MCP server URL, the SpotterCode MCP server will be available in the Extensions view. For more information about configuring MCP servers in Visual Studio Code, refer to link:https://code.visualstudio.com/docs/copilot/customization/mcp-servers[Visual Studio Code Documentation, window=_blank]. - == Integrate SpotterCode with Claude If your Claude account includes access to Claude AI (web chat), you can add SpotterCode as a remote MCP connector. Connectors added in Claude AI automatically sync to Claude Code without any additional configuration. -For the xref:spottercode-integration.adoc#_for_integration_setup_with_claude_code[Claude Code-only setup], you must manually point Claude Code to the SpotterCode MCP server via CLI. +For the xref:spottercode-integration.adoc#_claude_code_only_setup[Claude Code-only setup], you must manually point Claude Code to the SpotterCode MCP server via CLI. -=== For integration setup with Claude AI +=== Claude AI integration To add SpotterCode as a custom connector: . Go to **Customize** > **Connectors** . Click the `+` icon and select **Add custom connector**. -. Enter the SpotterCode MCP server URL. +. Enter the SpotterCode MCP server URL: `https://spottercode.thoughtspot.app/mcp`. . Click **Add**. -This configuration will automatically enable SpotterCode in Claude AI chat and Claude Code for users of the Claude account. +This configuration automatically enables SpotterCode in Claude AI chat and Claude Code for users of the Claude account. -=== For Claude Code-only setup +=== Claude Code-only setup -To enable SpotterCode in Claude Code, add the MCP server URL using the following `claude mcp add` command in Claude Code CLI. +To enable SpotterCode in Claude Code, add the MCP server URL using the following `claude mcp add` command in the Claude Code CLI. [source,Bash] ---- claude mcp add --transport http SpotterCode https://spottercode.thoughtspot.app/mcp ---- -=== For Claude Desktop +=== Claude Desktop integration If you are using Claude Desktop, add the URL directly to the Claude configuration JSON file: [source,JSON] @@ -123,8 +102,38 @@ If you are using Claude Desktop, add the URL directly to the Claude configuratio } ---- +=== Claude Cowork integration +If you are using Claude Cowork with Claude AI or Claude Desktop, verify whether the SpotterCode MCP connector is enabled for Claude Cowork. If it's not enabled, add the SpotterCode MCP server: + +. Open Claude Cowork either in Claude AI or Claude Desktop app. +. Navigate to **Settings** > **Connectors** > **Customize**. +. If SpotterCode is already available in your organization's list of connectors, select the SpotterCode connector. If it's not available: +.. Click the `+` icon and select **Add custom connector**. +.. Add the SpotterCode MCP server URL: `\https://spottercode.thoughtspot.app/mcp`. + //For more information about adding MCP servers to Claude Code, see link:https://code.claude.com/docs/en/mcp[Claude Code Documentation, window=_blank]. + +== Integrate SpotterCode with Visual Studio Code + +Although you can configure the MCP server in Visual Studio Code, to start a chat session with the AI agent, you'll need GitHub Copilot or a similar extension. + +To add the SpotterCode MCP Server to Visual Studio Code, use the Extensions view or the `MCP: Add Server` command via the Command Palette. Alternatively, directly edit the `mcp.json` file in your workspace configuration. + +[source,JSON] +---- +{ + "servers": { + "SpotterCode": { + "url": "https://spottercode.thoughtspot.app/mcp", + "type": "http" + } + } +} +---- + +After you add the MCP server URL, the SpotterCode MCP server is available in the Extensions view. For more information about configuring MCP servers in Visual Studio Code, refer to link:https://code.visualstudio.com/docs/copilot/customization/mcp-servers[Visual Studio Code Documentation, window=_blank]. + == Verify the integration To verify the integration: @@ -135,7 +144,7 @@ If the integration is successful, you'll see SpotterCode in the MCP servers list . Verify the available SpotterCode skills. + -For example, Cursor shows the MCP skills of MCP connectors in the **Tools & MCP** page. Check if the xref:spottercode.adoc#_supported_skills[SpotterCode MCP skills] are listed under SpotterCode. As you hover over each skill, you can view the description and input schema used for agentic interactions. You can also disable the MCP skills that you don't want the AI model to use. +For example, Cursor shows the skills of MCP connectors in the **Tools and MCP** page. Check if the xref:spottercode.adoc#_supported_skills[SpotterCode MCP skills] appear under SpotterCode. As you hover over each skill, you can view the description and input schema used for agentic interactions. You can also disable the MCP skills that you don't want the AI model to use. + [div videoContainer] @@ -152,7 +161,7 @@ In the following example, a chat session with Cursor AI is initiated with the pr video::./images/cursor-chat-session.mp4[width=100%,options="autoplay,loop"] -- -. Verify that the AI Agent is able to discover SpotterCode skills and is using these skills to generate a response. +. Verify that the AI agent is able to discover SpotterCode skills and is using these skills to generate a response. . Review the response returned for your prompt and verify the results. + The following example shows how Cursor AI scaffolds the embed code using the SpotterCode skills. Notice that the AI agent identifies and lists the minimum configuration settings, such as the ThoughtSpot host URL, Liveboard ID, and authentication attributes, required to complete the embedding. From 041aa1ff933610b73057642f52e439b0f6ce7864 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 10:30:28 +0530 Subject: [PATCH 54/61] v1 deprecation update --- modules/ROOT/pages/rest-api-getstarted.adoc | 6 + modules/ROOT/pages/rest-api-reference.adoc | 10 +- .../ROOT/pages/rest-api-v1v2-comparison.adoc | 148 +++--------------- 3 files changed, 36 insertions(+), 128 deletions(-) diff --git a/modules/ROOT/pages/rest-api-getstarted.adoc b/modules/ROOT/pages/rest-api-getstarted.adoc index 387fd1981..ec4857c80 100644 --- a/modules/ROOT/pages/rest-api-getstarted.adoc +++ b/modules/ROOT/pages/rest-api-getstarted.adoc @@ -6,6 +6,12 @@ :page-pageid: rest-api-getstarted :page-description: Get started with REST API to access, create, and manage ThoughtSpot resources programmatically. +[IMPORTANT] +==== +The REST API v1 framework has been deprecated and replaced by REST API v2 endpoints. +Existing integrations that use REST API v1 endpoints will continue to function without disruption. However, ThoughtSpot strongly recommends updating your integrations to use REST API v2 endpoints and workflows. For more information about REST API v2 endpoints, see xref:rest-api-v2-reference.adoc[REST API v2 Reference]. +==== + Before you start using REST APIs, perform the following checks: * Your client application domain is added as a xref:security-settings.adoc[Cross-Origin Resource Sharing (CORS) host] in the ThoughtSpot Developer portal. diff --git a/modules/ROOT/pages/rest-api-reference.adoc b/modules/ROOT/pages/rest-api-reference.adoc index f01593889..47ae5f42a 100644 --- a/modules/ROOT/pages/rest-api-reference.adoc +++ b/modules/ROOT/pages/rest-api-reference.adoc @@ -5,12 +5,12 @@ :page-pageid: rest-api-reference :page-description: REST API Reference +[IMPORTANT] +==== +The REST API v1 framework has been deprecated and replaced by REST API v2 endpoints. +Existing integrations that use REST API v1 endpoints will continue to function without disruption. However, ThoughtSpot strongly recommends updating your integrations to use REST API v2 endpoints and workflows. For more information about REST API v2 endpoints, see xref:rest-api-v2-reference.adoc[REST API v2 Reference]. +==== -[div announcementBlock] --- -Starting from the ThoughtSpot Cloud ts8.nov.cl and ThoughtSpot Software 8.4.1.sw releases, pinboards are rebranded as *Liveboards* in ThoughtSpot UI, documentation, and learning resources. -Note that the `pinboard` and `PINBOARD_ANSWER_BOOK` terminology in REST API v1 endpoint URLs, request and response workflows are not rebranded. --- == Orgs management diff --git a/modules/ROOT/pages/rest-api-v1v2-comparison.adoc b/modules/ROOT/pages/rest-api-v1v2-comparison.adoc index 942e17375..5b3352167 100644 --- a/modules/ROOT/pages/rest-api-v1v2-comparison.adoc +++ b/modules/ROOT/pages/rest-api-v1v2-comparison.adoc @@ -2,12 +2,16 @@ :toc: true :toclevels: 1 - :page-title: Difference between REST API v1 and v2.0 :page-pageid: v1v2-comparison :page-description: Difference between REST API v1 and v2.0 -Both v1 and v2 REST API frameworks allow you to access, retrieve, create, and manage ThoughtSpot objects and resources. REST API v2.0 is a new framework that expands the core API functionality with additional features and improved user experience. +[IMPORTANT] +==== +The REST API v1 framework has been deprecated and replaced by REST API v2 endpoints. The REST API v1 Playground link has also been removed from the **Develop** page in the ThoughtSpot UI in 26.6.0.cl and later versions. Existing integrations that use REST API v1 endpoints will continue to function without disruption. However, ThoughtSpot strongly recommends updating your integrations to use REST API v2 endpoints and workflows. For more information about REST API v2 endpoints, see xref:rest-api-v2-reference.adoc[REST API v2 Reference]. +==== + +Both REST API v1 and REST API v2.0 let you access, retrieve, create, and manage ThoughtSpot objects and resources programmatically. However, the REST API v2.0 framework offers standardized request and response structures, bearer token authentication, and richer capabilities. This document lists the differences between the two versions. == Feature comparison [div tableContainer tableStyle1] @@ -15,12 +19,12 @@ Both v1 and v2 REST API frameworks allow you to access, retrieve, create, and ma [width="100%" cols="4,^5,^5"] [options='header'] |===== -|Feature|REST API v1| REST API v2.0 +|Feature|REST API v1|REST API v2.0 |API Playground|Go to *Develop* > *REST API* > *REST API v1 Playground*. REST API v1 endpoints can be accessed via Swagger API explorer. + -| Go to *Develop* > *REST API* > *REST API v2.0 Playground*. -|Playground access|Requires admin or developer privilege + +|Go to *Develop* > *REST API* > *REST API v2.0 Playground*. +|Playground access|Requires admin or developer privilege |Requires admin or developer privilege |Downloadable code samples| [tag greyBackground tick]#–# | [tag greenBackground tick]#✓# |API documentation| [tag greenBackground tick]#✓# xref:rest-api-reference.adoc[Developer Documentation] a| @@ -32,135 +36,31 @@ REST API v1 endpoints can be accessed via Swagger API explorer. + [tag greenBackground tick]#✓# Trusted authentication -a| [tag greenBackground tick]#✓# Basic authentication + +a|[tag greenBackground tick]#✓# Basic authentication + -[tag greenBackground tick]#✓# Bearer token authentication + +[tag greenBackground tick]#✓# Bearer token authentication + [tag greenBackground tick]#✓# Trusted authentication +[tag greenBackground tick]#✓# JWT for ABAC + |Request and Response structure| Not fully standardized |Standardized -|API services a| See xref:rest-api-v1v2-comparison.adoc##apiOps[Supported API operations] -a| See xref:rest-api-v1v2-comparison.adoc##apiOps[Supported API operations] +|API services a| See xref:rest-api-reference.adoc[Supported REST API v1 operations] +a| See xref:rest-api-v2-reference.adoc[Supported REST API v2 operations] +|Resource URL a| -Resource URL a| *Base URI* + `\https://{your-thoughtspot-hostname}/callosum/v1/` + *Resource path* + `tspublic/v1/{resource-group}/{resource}/` -|*Base URI* + +a| +*Base URI* + `\https://{your-thoughtspot-hostname}/` + *Resource path* + `/api/rest/2.0/{resource-group}/{resource}` -|==== --- - - -[#apiOps] - -//// -== Supported API operations -[div tableContainer] --- -[width="100%" cols="5,4,4"] -[options='header'] -|===== -|API service|REST API v1| REST API v2.0 -a|*Admin services* + -API endpoints for cluster-level administration | [tag greenBackground tick]#✓# Available a| [tag greenBackground tick]#✓# Available + - -__Available under *system* __ + -__Includes query APIs only__ - -|*Authentication* + -API endpoints for user login, authentication, and session management a|[tag greenBackground tick]#✓# Available + - -__The login, authentication, token generation, and logout services are available under **session**__. -|[tag greenBackground tick]#✓# Available + - -|*Data APIs* + -Data query APIs for searching data from a data source and querying a Liveboard and its visualization data.|[tag greenBackground tick]#✓# Available|[tag greenBackground tick]#✓# Available - -|*Connection and live query services* -API endpoints for CRUD operations of data connection objects |[tag greenBackground tick]#✓# Available| [tag greenBackground tick]#✓# - -|*Database services* + -Data management API services for databases such as Falcon + - -__Applicable to ThoughtSpot Software deployments only__ |[tag greenBackground tick]#✓# Available| [tag greyBackground tick]#–# - -|*Dependency services* + -API endpoints for querying dependent object details. |[tag greenBackground tick]#✓# Available| [tag greenBackground tick]#✓# Available + - -__Available as part of metadata API operations__. - -|*Groups* + -API endpoints for group administration and management|[tag greenBackground tick]#✓# Available| [tag greenBackground tick]#✓# Available - -|*Liveboard export* + -API for downloading Liveboard and visualizations data as PDF| -[tag greenBackground tick]#✓# Available| [tag greenBackground tick]#✓# Available + - -__This API service is available under *report*.__ - -|*Logs* + -API for audit logs + -__Applicable to ThoughtSpot Cloud deployments only__ |[tag greenBackground tick]#✓# Available| [tag greenBackground tick]#✓# Available - -|*Materialization services* + -API endpoint for refreshing a materialized view. + - -__Applicable to ThoughtSpot Software deployments only__ |[tag greenBackground tick]#✓# Available| [tag greyBackground tick]#–# - -|*Metadata services* + - -API for querying metadata objects, assigning tags, setting favorites, and importing and exporting TML objects|[tag greenBackground tick]#✓# Available + - -__The metadata API service does not support fetching SQL query information from Answer and Liveboard objects__|[tag greenBackground tick]#✓# Available + - -__Supports fetching SQL query information from Answer and Liveboard objects + -__Includes API services for importing and exporting TML representation of metadata objects such as Liveboard, Worksheets, and Answers__ - -|*Orgs* + -API endpoints for Org administration and management | [tag greenBackground tick]#✓# Available |[tag greenBackground tick]#✓# Available - -|*Reports* + -API endpoints for downloading Liveboards and Answers in PDF, PNG, XLS, or CSV format.| [tag greenBackground tick]#✓# Available + - -__The Answer download API service is not available__ |[tag greenBackground tick]#✓# Available - -|*Session* + -API endpoints for user login, authentication token generation, default Liveboard assignment, and user logout.| [tag greenBackground tick]#✓# Available |[tag greenBackground tick]#✓# Available + - -__The login, authentication, token generation, and logout services are available as *session* resource and are listed under the *Authentication* category in the Playground__. - -|*Security* + -API endpoints for sharing objects and assigning permissions. |[tag greenBackground tick]#✓# Available|[tag greenBackground tick]#✓# Available - -|*System* + -API endpoints for querying system information a|[tag greenBackground tick]#✓# Available + - -__The system administration API operations are available as **Admin services**__|[tag greenBackground tick]#✓# Available - -|*TML* + -API endpoints for importing and exporting TML representation of metadata objects|[tag greenBackground tick]#✓# Available|[tag greenBackground tick]#✓# Available + - -__The import and export metadata API service is available under *metadata*__. - -|*User* + -API endpoints for user administration and management |[tag greenBackground tick]#✓# Available|[tag greenBackground tick]#✓# Available - -|*Version control* + -API endpoints for Git integration and version control |[tag greyBackground tick]#–# Not Available -|[tag greenBackground tick]#✓# Available - -|*Schedules* + -API endpoints to schedule and manage Liveboard jobs. |[tag greyBackground tick]#–# Not Available -|[tag greenBackground tick]#✓# Available - |===== -- -//// == Request methods [div tableContainer] @@ -183,6 +83,7 @@ In REST API v2.0 framework, most of the API operations require you to use the `P For some API operations, such as querying system information or session information, you can use the `GET` method. |===== -- + == Object types and naming convention The following table lists the metadata object types and subtypes supported in REST API v1 and REST API v2.0: @@ -228,24 +129,25 @@ a| Metadata object types in REST API v2.0: * `LOGICAL_COLUMN` for a column of any data object such as tables, worksheets, or views. * `LOGICAL_RELATIONSHIP` for table and worksheet joins -__Querying metadata objects by subtypes is not supported in the current release__. +_Querying metadata objects by subtypes is not supported in the current release_. |===== -- + == Request and response structure In REST API v2.0, the API endpoints let you pass several request parameters in a single API call. User and group administration and metadata query APIs support several distinct operations. -The following example shows the REST API v1 and v2 endpoints available for user administration and provisioning: +The following example shows the REST API v1 and v2.0 endpoints available for user administration and provisioning: [.widthAuto] [.bordered] -image::./images/v1-v2-comparison.png[REST API v1 and v2 comparison,link="./doc-images/images/v1-v2-comparison.png"] +image::./images/v1-v2-comparison.png[REST API v1 and v2 comparison,link="./images/v1-v2-comparison.png"] Although the REST API v2.0 has fewer endpoints, it supports all user administration and CRUD operations that were available with REST API v1. === Request body -The following example shows the API v1 and v2 request body for user creation operation: +The following example shows the REST API v1 and v2.0 request body for the user creation operation: REST API v1:: @@ -277,7 +179,7 @@ curl -X POST \ "name": "UserB", "display_name": "User B", "password": "123Cloud!", - "email": "UserA@example.com", + "email": "UserB@example.com", "account_type": "LOCAL_USER", "account_status": "ACTIVE", "group_identifiers": [ From 9c43c8e65a66c40913430418a0e159db1582b512 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 10:47:26 +0530 Subject: [PATCH 55/61] SCAL-314877 --- modules/ROOT/pages/prerender.adoc | 47 +++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/modules/ROOT/pages/prerender.adoc b/modules/ROOT/pages/prerender.adoc index 32b4035d5..0ae27e681 100644 --- a/modules/ROOT/pages/prerender.adoc +++ b/modules/ROOT/pages/prerender.adoc @@ -217,6 +217,53 @@ embed.render(); This approach is more efficient than the previous one, but it does not load the Liveboard data and metadata until the end user actually navigates to the analytics page. So users might see a loading state for a few seconds before the Liveboard is loaded. +=== Pre-render with full-height App embed + +If you are using `AppEmbed` with the `fullHeight` attribute set to `true`, you can also use pre-rendering to eliminate the initial loading delay. Starting with Visual Embed SDK 1.49.x, the pre-render logic correctly accounts for the height already computed by `fullHeight` so that the embed placeholder and the pre-render overlay remain in sync when you call `showPreRender()`. In the earlier versions, calling `showPreRender()` after `fullHeight` resized the wrapper could collapse the embed to zero height because the placeholder element had no height at the time `syncPreRenderStyle()` ran. + +==== How it works + +When `showPreRender()` is called and `fullHeight` is enabled, the SDK: + +. Reads the current `height` already applied to the `preRenderWrapper` by the `fullHeight` resize handler. +. Seeds that height into the in-flow placeholder element (`insertedDomEl`) before calling `syncPreRenderStyle()`. +. Ensures the overlay aligns correctly with the host element. + +This behavior is automatic. No configuration changes are required. Existing code that sets both `preRenderId` and `fullHeight: true` benefits from this fix automatically after upgrading to the v1.49.x SDK version. + +==== Implementation + +[source,JavaScript] +---- +import { init, AppEmbed, AuthType } from '@thoughtspot/visual-embed-sdk'; + +init({ + thoughtSpotHost: '<your-thoughtspot-host>', + authType: AuthType.SAMLRedirect, +}); + +// Pre-render the AppEmbed with fullHeight enabled. +const preRenderedApp = new AppEmbed('#pre-render-target', { + preRenderId: 'full-app-prerender', + fullHeight: true, +}); + +preRenderedApp.preRender(); + +// When the user navigates to the analytics page, attach the pre-rendered embed to the host element. +const app = new AppEmbed('#ts-embed', { + preRenderId: 'full-app-prerender', + fullHeight: true, +}); + +app.showPreRender(); +---- + +[NOTE] +==== +The `fullHeight` attribute causes the Liveboard container to resize dynamically to match the Liveboard height, which triggers multiple data warehouse queries simultaneously. For Liveboards with many visualizations, consider enabling `lazyLoadingForFullHeight` to load visualizations incrementally as users scroll. +==== + === Pre-render on demand From ebb327810ef285dd193152962cd0b75d2dd3ba87 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 11:37:03 +0530 Subject: [PATCH 56/61] typo checks --- modules/ROOT/pages/3rd-party-script.adoc | 72 +++++++++++++++++++ modules/ROOT/pages/api-changelog.adoc | 19 ++++- modules/ROOT/pages/api-intercept.adoc | 2 +- .../ROOT/pages/customize-nav-full-embed.adoc | 2 +- .../ROOT/pages/metadata-parameterization.adoc | 2 +- modules/ROOT/pages/orgs.adoc | 2 +- modules/ROOT/pages/prerender.adoc | 2 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 2 +- modules/ROOT/pages/tml.adoc | 4 +- modules/ROOT/pages/whats-new.adoc | 8 ++- 10 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 modules/ROOT/pages/3rd-party-script.adoc diff --git a/modules/ROOT/pages/3rd-party-script.adoc b/modules/ROOT/pages/3rd-party-script.adoc new file mode 100644 index 000000000..a978ada50 --- /dev/null +++ b/modules/ROOT/pages/3rd-party-script.adoc @@ -0,0 +1,72 @@ += External tools and script integration +:toc: true +:toclevels: 2 + +:page-title: Integrate external tools and allow scripts +:page-pageid: external-tool-script-integration +:page-description: Security settings for embedding + +ThoughtSpot supports integrating third-party apps such as Mixpanel, Pendo, LogRocket, and more in your embed. If you are using third-party tools to track usage, trace, log, or onboard your application users, you can seamlessly integrate these tools with ThoughtSpot embed and add custom JavaScript. This feature is disabled by default on ThoughtSpot instances. To enable this feature, contact ThoughtSpot Support. + +[IMPORTANT] +==== +While ThoughtSpot allows the injection of custom JavaScript, it is important to be aware of the associated security risks, particularly Cross-Site Scripting (XSS). XSS is a vulnerability that can enable malicious actors to inject and execute unauthorized scripts within a trusted environment. This can lead to data breaches, unauthorized access to user sessions, and compromised system integrity. ThoughtSpot strongly recommends reviewing security guidelines before activating this feature in your instances and exercising caution when integrating third-party tools into your embedded application. +==== + +== Security considerations + +Before requesting ThoughtSpot Support to enable this feature on your instance, do the following: + +* Review the security risks associated with custom-hosted scripts and understand the potential consequences of XSS attacks. +* Implement security controls and measures to validate hosted scripts and mitigate potential vulnerabilities. + +== Feature enablement + +Enabling third-party tools on embed involves two steps: + +. Request for feature activation and provide the script details to ThoughtSpot Support +. Adding the script sources to the CSP allowlist + +=== Request for feature enablement + +Create a ThoughtSpot Support ticket to enable the feature on your instance. In your request, specify the domain URLs that will host the scripts in your embedding environment. + +Wait for ThoughtSpot Support to validate and approve, and then add the domain that hosts the script to the CSP allowlist on your instance. This step will ensure that only the trusted and vetted domains are allowed to run scripts in your application environment. + +=== Add script source to CSP allowlist +After the script hosting URL is approved and configured by ThoughtSpot Support, you must add the JavaScript hosting domain to the CSP allowlist. This step requires administration privileges, so make sure you log in to ThoughtSpot with your administrator credentials. + +. In your ThoughtSpot application, navigate to *Develop* > *Customizations* > *Security Settings*. +. If your instance has the Orgs feature enabled, ensure that you are in the *All Orgs* context. +. On the *Security Settings* page, click *Edit* and turn on the *CSP script-src domains* toggle switch. ++ +[.widthAuto] +[.bordered] +image::./images/csp-script-domain.png[CSS script-src domain] +. Add the script hosting domain. +. Click *Save changes*. + +[NOTE] +==== +* The *CSP script-src domains* section is visible to users with administrative privileges only if the third-party integration feature is enabled on your instance. +* The *CSP script-src domains* cannot be enabled and configured at the Org level. When configured, this setting will apply to all the Orgs configured on your instance. +==== + +=== Allow Websocket endpoints +If your tool uses WebSockets, add the tool’s `wss://` endpoint to the CSP and CORS allowlists in ThoughtSpot. This enables secure WebSocket connections from an embedded ThoughtSpot page to the tool's WebSocket endpoint without being blocked by the browser’s Content Security Policy. + +Only hosts explicitly listed with `wss://` are permitted. You can add `wss://<host>` URL in the **Develop** > **Security Settings** page. + +== Passing variables to the hosted script + +To pass variables to the customer's hosted script, Visual Embed SDK provides the `customVariablesForThirdPartyTools` parameter. The `customVariablesForThirdPartyTools` is an object containing the variables that you wish to pass to the customer’s hosted JavaScript. These may include private information such as credentials or keys. The hosted JavaScript will access these variables via the `window.tsEmbed` object. + +Developers can define this parameter in the **init()** function as shown in the following example. Once initialized, the JavaScript will run after the authentication is successfully completed in the ThoughtSpot Embed App. + +[source,JavaScript] +---- +init({ + //... + customVariablesForThirdPartyTools: { cloud: "123Basic" } +}); +---- diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 9ff6d4eb5..6639c55e3 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -66,6 +66,23 @@ When set to `true`, enables the file upload feature in the Spotter chat panel. * `spotterFileUploadFileTypes` + Restricts the file types allowed for upload in the Spotter chat panel. Accepts a `SpotterFileUploadFileTypes` object. + +|[tag yellowBackground]#FIXED# a| +[discrete] +===== Pre-rendering with `fullHeight` in `AppEmbed` +The SDK now seeds the placeholder with the height already applied to the `preRenderWrapper` by the `fullHeight` resize handler before `syncPreRenderStyle()` runs. This ensures the overlay is correctly positioned and sized for the full-height layout. + +In the earlier versions, using `AppEmbed` with both `preRenderId` and `fullHeight: true` caused the embed to collapse when `showPreRender()` was called. + +Affected configuration:: +* `preRenderId`: Activates pre-rendering for the embed instance +* `fullHeight`: Dynamically resizes the embed iframe to match the Liveboard height + +Action required:: +None. Upgrading to the SDK version 1.49.x automatically updates your existing configuration that use the `preRenderId` with the `fullHeight: true` setting. + +For more information, see xref:prerender.adoc#_pre_render_with_full_height_app_embed[Pre-rendering with fullHeight]. + |==== @@ -429,7 +446,7 @@ The Visual Embed SDK now supports runtime overrides in Spotter embed. * To apply runtime Parameters, use the `runtimeParameters` object. |[tag greenBackground]#NEW FEATURE# a|*PNG images in Liveboard schedule notifications* + -To enable embedding PNG images of Liveboards in scheduled job notifications sent to subscribers, the SDK provides the `isPNGInScheduledEmailsEnabled` boolean parameter. When set to true, scheduled emails will include a PNG image of the Liveboard. +To enable embedding PNG images of Liveboards in scheduled job notifications sent to subscribers, the SDK provides the `isPNGInScheduledEmailsEnabled` boolean parameter. When set to true, scheduled emails will include a PNG image of the Liveboard. The SDK also provides the following action IDs: diff --git a/modules/ROOT/pages/api-intercept.adoc b/modules/ROOT/pages/api-intercept.adoc index 85153b063..7ec334347 100644 --- a/modules/ROOT/pages/api-intercept.adoc +++ b/modules/ROOT/pages/api-intercept.adoc @@ -78,7 +78,7 @@ embed.on(EmbedEvent.OnBeforeGetVizDataIntercept, == Intercept specific requests or all API calls -The API intercept feature lets you intercept API calls made by the embedded application, modify or block requests, and provide custom responses before they are sent to the backend. +The API intercept feature lets you intercept API calls made by the embedded application, modify or block requests, and provide custom responses before they are sent to the backend. To intercept API requests from specific URLs, specify one of the following values in the `interceptUrls` array: diff --git a/modules/ROOT/pages/customize-nav-full-embed.adoc b/modules/ROOT/pages/customize-nav-full-embed.adoc index c93072eea..29b2e42cd 100644 --- a/modules/ROOT/pages/customize-nav-full-embed.adoc +++ b/modules/ROOT/pages/customize-nav-full-embed.adoc @@ -4,7 +4,7 @@ :page-title: Customize navigation panels :page-pageid: customize-nav-controls -:page-description: Customize the the navigation panel and menu items in full application embedding using the settings in the Visual Embed SDK +:page-description: Customize the navigation panel and menu items in full application embedding using the settings in the Visual Embed SDK You can customize the navigation experience and the visibility of navigation menu elements using the Visual Embed SDK. diff --git a/modules/ROOT/pages/metadata-parameterization.adoc b/modules/ROOT/pages/metadata-parameterization.adoc index 603d17164..f8d9b9e0f 100644 --- a/modules/ROOT/pages/metadata-parameterization.adoc +++ b/modules/ROOT/pages/metadata-parameterization.adoc @@ -12,7 +12,7 @@ Metadata parameterization with variables allows administrators to reuse and prop == Before you begin -* Ensure that that xref:variables.adoc[variables are available] on your instance. You can use the xref:variables.adoc#_get_details_of_variables[variable search API] to get a list of variables. +* Ensure that xref:variables.adoc[variables are available] on your instance. You can use the xref:variables.adoc#_get_details_of_variables[variable search API] to get a list of variables. * Ensure that you have edit access to the Connections and Tables to which you want to assign variables. == How to parameterize objects diff --git a/modules/ROOT/pages/orgs.adoc b/modules/ROOT/pages/orgs.adoc index 79fe7ce9b..d83d63f0b 100644 --- a/modules/ROOT/pages/orgs.adoc +++ b/modules/ROOT/pages/orgs.adoc @@ -331,7 +331,7 @@ The following conditions apply to OIDC authentication on a multi-tenant setup: ** If the user does not exist in ThoughtSpot, the user is assigned to the Orgs sent in the OIDC assertion if *Auto create user (JIT)* is enabled. ** If the user is already created in ThoughtSpot and assigned to Orgs and the OIDC assertion has different Org names, the user is assigned to only the Orgs sent in the OIDC assertion. For example, if a user belongs to Org A and Org B and the OIDC assertion includes Org C and Org D, the user is assigned to Org C and Org D and removed from Org A and Org B. * If the Org objects are not configured on ThoughtSpot, the Orgs mapping with OIDC authentication process returns an error. -* If the Orgs mapping with OIDC authentication is not enabled on ThoughtSpot, and Org objects are not configured, the user is assigned to the default Org (Primary Org). +* If the Orgs mapping with OIDC authentication is not enabled on ThoughtSpot, and Org objects are not configured, the user is assigned to the default Org (Primary Org). //// * OIDC per Org configuration is not supported. diff --git a/modules/ROOT/pages/prerender.adoc b/modules/ROOT/pages/prerender.adoc index 0ae27e681..b6b6b071a 100644 --- a/modules/ROOT/pages/prerender.adoc +++ b/modules/ROOT/pages/prerender.adoc @@ -219,7 +219,7 @@ This approach is more efficient than the previous one, but it does not load the === Pre-render with full-height App embed -If you are using `AppEmbed` with the `fullHeight` attribute set to `true`, you can also use pre-rendering to eliminate the initial loading delay. Starting with Visual Embed SDK 1.49.x, the pre-render logic correctly accounts for the height already computed by `fullHeight` so that the embed placeholder and the pre-render overlay remain in sync when you call `showPreRender()`. In the earlier versions, calling `showPreRender()` after `fullHeight` resized the wrapper could collapse the embed to zero height because the placeholder element had no height at the time `syncPreRenderStyle()` ran. +If you are using `AppEmbed` with the `fullHeight` attribute set to `true`, you can also use pre-rendering to eliminate the initial loading delay. Starting with Visual Embed SDK 1.49.x, the pre-render logic correctly accounts for the height already computed by `fullHeight` so that the embed placeholder and the pre-render overlay remain in sync when you call `showPreRender()`. In the earlier versions, calling `showPreRender()` after `fullHeight` resized the wrapper could collapse the embed to zero height because the placeholder element had no height at the time `syncPreRenderStyle()` ran. ==== How it works diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 22f230d97..6d51daa2e 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -520,7 +520,7 @@ The search metadata (`/api/rest/2.0/metadata/search`) API includes the following * The `liveboard_reponse_version` parameter. It allows you to specify the xref:rest-api-v2-metadata-search.adoc#_response_format_for_liveboards[response format for Liveboard objects]. * The `subtypes` attribute to specify the sub-type for the `LOGICAL_TABLE` metadata type. The `LOGICAL_TABLE` type allows to fetch objects such as Tables, Models, and Views. The `subtypes` parameter allows you to filter API response by specifying subcategories of the object type. -* The `include_only_published_objects` attribute to specify whether the search should should include xref:publish-api.adoc[published objects]. +* The `include_only_published_objects` attribute to specify whether the search should include xref:publish-api.adoc[published objects]. === System API diff --git a/modules/ROOT/pages/tml.adoc b/modules/ROOT/pages/tml.adoc index 8757ec3b8..b971e964a 100644 --- a/modules/ROOT/pages/tml.adoc +++ b/modules/ROOT/pages/tml.adoc @@ -379,7 +379,7 @@ When set to `true`, exports the guid of the object. This flag will work only whe * `include_obj_id` + When set to `true`, exports the object ID of the object. This flag will work only when the object ID feature is enabled. Contact ThoughtSpot Support to enable the feature. * `export_with_associated_feedbacks` + -When set to `true`, exports the the TML of an object along with all feedback, such as Spotter or Sage feedback, associated with that object. No feedback file will be exported if there are no feedback entries associated with the object +When set to `true`, exports the TML of an object along with all feedback, such as Spotter or Sage feedback, associated with that object. No feedback file will be exported if there are no feedback entries associated with the object * `export_column_security_rules` [beta betaBackground]^Beta^ + When set to `true`, exports the column-level security rules defined on the object. Contact ThoughtSpot Support to enable the feature. * `export_with_column_aliases` [beta betaBackground]^Beta^ + @@ -426,7 +426,7 @@ For example, `"guid: a162289a-c1ab-427e-9985-8fb5f7c7e539\nliveboard:\n name: L . Paste the YAML output copied from the export TML API response into a text editor. . Remove the quotation marks, update the TML, and ensure that the YAML is properly formatted: + `guid: a162289a-c1ab-427e-9985-8fb5f7c7e539\nliveboard:\n name: Liveboard 1\n` -. When +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fmetadata%2Fimport-metadata-tml">importing TML in the Playground</a>+++, do not paste the YAML directly into the `metadata_tmls` input field. Instead, use the JSON editor to add the the YAML. +. When +++<a href="{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fmetadata%2Fimport-metadata-tml">importing TML in the Playground</a>+++, do not paste the YAML directly into the `metadata_tmls` input field. Instead, use the JSON editor to add the YAML. . To open the JSON editor, click *View JSON*. + In the JSON preview, you'll see the following code: + diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 4d56810e0..6320f0913 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -72,7 +72,7 @@ The **Develop** page in the ThoughtSpot UI has been updated with the following e * The **Custom actions** list page now shows the code-based custom actions configured using the Visual Embed SDK. * Removal of REST API v1 + The legacy REST Playground v1 has been removed from the left navigation. This change does not affect your current integrations with v1 REST API. ThoughtSpot recommends that you update your integration workflows to use REST API v2. For more information, see xref:rest-api-v1v2-comparison.adoc[REST API v1 to v2 migration]. -* Removal of GraphQl playgrounds + +* Removal of GraphQL playgrounds + The menu link to the GraphQL playground has been removed from the UI. [discrete] @@ -111,7 +111,7 @@ Continuous Liveboard PDF export [beta betaBackground]^Beta^:: In PDF downloads, Liveboard tabs can now be rendered in a single page matching the UI layout. This feature can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true` in the SDK. Setting this flag to `false` returns to the paginated PDF view. Liveboard download in XLSX and CSV formats:: -Embedded Liveboards can now be downloaded in the PDF, XLlX and CSV file formats. To enable this feature, ensure that the `isLiveboardXLSXCSVDownloadEnabled` parameter is set to `true`. +Embedded Liveboards can now be downloaded in the PDF, XLSX and CSV file formats. To enable this feature, ensure that the `isLiveboardXLSXCSVDownloadEnabled` parameter is set to `true`. Excel exports for pivot tables:: Pivot table visualizations can now be exported to Excel format. @@ -548,6 +548,10 @@ The SDKs for embedding ThoughtSpot components in mobile apps are now Generally A [discrete] ==== Visual Embed SDK For information about the new features and enhancements introduced in Visual Embed SDK version 1.44.0, see xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] ==== Custom calendar APIs --- From d86840641cdef58c990a9d1b7a1f2ae826d448d5 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 11:42:17 +0530 Subject: [PATCH 57/61] edits --- modules/ROOT/pages/api-changelog.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 6639c55e3..310d672cf 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -67,18 +67,18 @@ When set to `true`, enables the file upload feature in the Spotter chat panel. * `spotterFileUploadFileTypes` + Restricts the file types allowed for upload in the Spotter chat panel. Accepts a `SpotterFileUploadFileTypes` object. -|[tag yellowBackground]#FIXED# a| +|[tag greenBackground]#ENHANCEMENT# a| [discrete] ===== Pre-rendering with `fullHeight` in `AppEmbed` The SDK now seeds the placeholder with the height already applied to the `preRenderWrapper` by the `fullHeight` resize handler before `syncPreRenderStyle()` runs. This ensures the overlay is correctly positioned and sized for the full-height layout. In the earlier versions, using `AppEmbed` with both `preRenderId` and `fullHeight: true` caused the embed to collapse when `showPreRender()` was called. -Affected configuration:: +**Affected configuration**: + * `preRenderId`: Activates pre-rendering for the embed instance * `fullHeight`: Dynamically resizes the embed iframe to match the Liveboard height -Action required:: +**Action required**: + None. Upgrading to the SDK version 1.49.x automatically updates your existing configuration that use the `preRenderId` with the `fullHeight: true` setting. For more information, see xref:prerender.adoc#_pre_render_with_full_height_app_embed[Pre-rendering with fullHeight]. From 77d1282e20bd049604185134f5a69ea75ed22d29 Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Tue, 9 Jun 2026 12:55:02 +0530 Subject: [PATCH 58/61] removed yellow highlights --- modules/ROOT/pages/authentication.adoc | 2 +- modules/ROOT/pages/security-settings.adoc | 6 +++--- modules/ROOT/pages/trusted-auth-secret-key.adoc | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/authentication.adoc b/modules/ROOT/pages/authentication.adoc index 0451995f3..eb70d5729 100644 --- a/modules/ROOT/pages/authentication.adoc +++ b/modules/ROOT/pages/authentication.adoc @@ -88,7 +88,7 @@ Once the security rules are set, they are fixed for at least that user's session |=== [#_enable_trusted] -=== #Configure trusted authentication# +=== Configure trusted authentication To generate an access token, trusted authentication must be enabled on your ThoughtSpot instance. You can enable trusted authentication through the ThoughtSpot UI or the REST API v2. diff --git a/modules/ROOT/pages/security-settings.adoc b/modules/ROOT/pages/security-settings.adoc index 4be9493f4..01b02b423 100644 --- a/modules/ROOT/pages/security-settings.adoc +++ b/modules/ROOT/pages/security-settings.adoc @@ -492,11 +492,11 @@ curl -X POST \ ---- === Trusted authentication -#To enable or disable trusted authentication at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/configure` endpoint.# +To enable or disable trusted authentication at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/configure` endpoint. -#To find the trusted authentication configuration for the specified auth type at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint.# +To find the trusted authentication configuration for the specified auth type at the cluster or Org level, send a request to the `POST /api/rest/2.0/auth/search` endpoint. -#For more information on the trusted authentication configuration through APIs, see xref:authentication.adoc[Configuring authentication settings].# +For more information on the trusted authentication configuration through APIs, see xref:authentication.adoc[Configuring authentication settings]. See xref:trusted-authentication.adoc[Trusted authentication] and xref:_secret_key_management[Secret key management] for other related information. diff --git a/modules/ROOT/pages/trusted-auth-secret-key.adoc b/modules/ROOT/pages/trusted-auth-secret-key.adoc index eabccd6d6..526c981e6 100644 --- a/modules/ROOT/pages/trusted-auth-secret-key.adoc +++ b/modules/ROOT/pages/trusted-auth-secret-key.adoc @@ -46,7 +46,7 @@ This key is required for making API calls to get a token for ThoughtSpot users. . Click *Save Changes*. [NOTE] -#To enable Trusted authentication programmatically, send a `POST` request to the `POST /api/rest/2.0/auth/configure` endpoint. For more information, see xref:authentication.adoc[Configuring authentication settings].# +To enable Trusted authentication programmatically, send a `POST` request to the `POST /api/rest/2.0/auth/configure` endpoint. For more information, see xref:authentication.adoc[Configuring authentication settings]. == Request a new secret key Requesting a new `secret_key` simply involves disabling and re-enabling trusted authentication. From 6f4b4585afd00d518eeba2bf6ebb4896bedd72cf Mon Sep 17 00:00:00 2001 From: Rani Gangwar <rani.gangwar@thoughtspot.com> Date: Tue, 9 Jun 2026 12:59:56 +0530 Subject: [PATCH 59/61] format typo --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 6d51daa2e..14048387b 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -45,7 +45,7 @@ Returns the authentication configuration for the specified auth type at cluster ThoughtSpot introduces REST API v2.0 endpoints to programmatically deactivate and activate data connections: -* POST /api/rest/2.0/connections/{connection_identifier}/status + +* `POST /api/rest/2.0/connections/{connection_identifier}/status` + Deactivates or activates a connection. === Answer report API enhancements [earlyAccess eaBackground]#Early Access# From 4c112b7496cbbc0387fe60ff8bd2f7c87b9abe1a Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 13:47:05 +0530 Subject: [PATCH 60/61] typo fixes --- modules/ROOT/pages/api-changelog.adoc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 310d672cf..da1f14df2 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -67,7 +67,7 @@ When set to `true`, enables the file upload feature in the Spotter chat panel. * `spotterFileUploadFileTypes` + Restricts the file types allowed for upload in the Spotter chat panel. Accepts a `SpotterFileUploadFileTypes` object. -|[tag greenBackground]#ENHANCEMENT# a| +|[tag greenBackground]#ENHANCEMENT# a| [discrete] ===== Pre-rendering with `fullHeight` in `AppEmbed` The SDK now seeds the placeholder with the height already applied to the `preRenderWrapper` by the `fullHeight` resize handler before `syncPreRenderStyle()` runs. This ensures the overlay is correctly positioned and sized for the full-height layout. @@ -75,7 +75,8 @@ The SDK now seeds the placeholder with the height already applied to the `preRen In the earlier versions, using `AppEmbed` with both `preRenderId` and `fullHeight: true` caused the embed to collapse when `showPreRender()` was called. **Affected configuration**: + -* `preRenderId`: Activates pre-rendering for the embed instance + +* `preRenderId`: Activates pre-rendering for the embed instance + * `fullHeight`: Dynamically resizes the embed iframe to match the Liveboard height **Action required**: + From 13b27695cffe18d16fc9df9f1dec71d7497d8a30 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <shashikala.subramanya@thoughtspot.com> Date: Tue, 9 Jun 2026 15:10:29 +0530 Subject: [PATCH 61/61] remove prender updates --- modules/ROOT/pages/api-changelog.adoc | 18 ---------- modules/ROOT/pages/prerender.adoc | 48 --------------------------- 2 files changed, 66 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index da1f14df2..ddadf6e40 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -66,24 +66,6 @@ When set to `true`, enables the file upload feature in the Spotter chat panel. * `spotterFileUploadFileTypes` + Restricts the file types allowed for upload in the Spotter chat panel. Accepts a `SpotterFileUploadFileTypes` object. - -|[tag greenBackground]#ENHANCEMENT# a| -[discrete] -===== Pre-rendering with `fullHeight` in `AppEmbed` -The SDK now seeds the placeholder with the height already applied to the `preRenderWrapper` by the `fullHeight` resize handler before `syncPreRenderStyle()` runs. This ensures the overlay is correctly positioned and sized for the full-height layout. - -In the earlier versions, using `AppEmbed` with both `preRenderId` and `fullHeight: true` caused the embed to collapse when `showPreRender()` was called. - -**Affected configuration**: + - -* `preRenderId`: Activates pre-rendering for the embed instance + -* `fullHeight`: Dynamically resizes the embed iframe to match the Liveboard height - -**Action required**: + -None. Upgrading to the SDK version 1.49.x automatically updates your existing configuration that use the `preRenderId` with the `fullHeight: true` setting. - -For more information, see xref:prerender.adoc#_pre_render_with_full_height_app_embed[Pre-rendering with fullHeight]. - |==== diff --git a/modules/ROOT/pages/prerender.adoc b/modules/ROOT/pages/prerender.adoc index b6b6b071a..bff01953b 100644 --- a/modules/ROOT/pages/prerender.adoc +++ b/modules/ROOT/pages/prerender.adoc @@ -217,54 +217,6 @@ embed.render(); This approach is more efficient than the previous one, but it does not load the Liveboard data and metadata until the end user actually navigates to the analytics page. So users might see a loading state for a few seconds before the Liveboard is loaded. -=== Pre-render with full-height App embed - -If you are using `AppEmbed` with the `fullHeight` attribute set to `true`, you can also use pre-rendering to eliminate the initial loading delay. Starting with Visual Embed SDK 1.49.x, the pre-render logic correctly accounts for the height already computed by `fullHeight` so that the embed placeholder and the pre-render overlay remain in sync when you call `showPreRender()`. In the earlier versions, calling `showPreRender()` after `fullHeight` resized the wrapper could collapse the embed to zero height because the placeholder element had no height at the time `syncPreRenderStyle()` ran. - -==== How it works - -When `showPreRender()` is called and `fullHeight` is enabled, the SDK: - -. Reads the current `height` already applied to the `preRenderWrapper` by the `fullHeight` resize handler. -. Seeds that height into the in-flow placeholder element (`insertedDomEl`) before calling `syncPreRenderStyle()`. -. Ensures the overlay aligns correctly with the host element. - -This behavior is automatic. No configuration changes are required. Existing code that sets both `preRenderId` and `fullHeight: true` benefits from this fix automatically after upgrading to the v1.49.x SDK version. - -==== Implementation - -[source,JavaScript] ----- -import { init, AppEmbed, AuthType } from '@thoughtspot/visual-embed-sdk'; - -init({ - thoughtSpotHost: '<your-thoughtspot-host>', - authType: AuthType.SAMLRedirect, -}); - -// Pre-render the AppEmbed with fullHeight enabled. -const preRenderedApp = new AppEmbed('#pre-render-target', { - preRenderId: 'full-app-prerender', - fullHeight: true, -}); - -preRenderedApp.preRender(); - -// When the user navigates to the analytics page, attach the pre-rendered embed to the host element. -const app = new AppEmbed('#ts-embed', { - preRenderId: 'full-app-prerender', - fullHeight: true, -}); - -app.showPreRender(); ----- - -[NOTE] -==== -The `fullHeight` attribute causes the Liveboard container to resize dynamically to match the Liveboard height, which triggers multiple data warehouse queries simultaneously. For Liveboards with many visualizations, consider enabling `lazyLoadingForFullHeight` to load visualizations incrementally as users scroll. -==== - - === Pre-render on demand If you do not want your host app to fetch any ThoughtSpot resources during its initial load, this approach is ideal.